Browse Source

Merge branch 'master' into travis-ci

master
Miłosz Sieradzki 11 years ago
parent
commit
c03acc0f44
  1. 2
      res/layout/advanced_settings.xml
  2. 7
      res/values-de/strings.xml
  3. 25
      src/acr/browser/lightning/AdBlock.java
  4. 229
      src/acr/browser/lightning/AdvancedSettingsActivity.java
  5. 6
      src/acr/browser/lightning/BookmarkPageVariables.java
  6. 671
      src/acr/browser/lightning/BrowserActivity.java
  7. 1
      src/acr/browser/lightning/BrowserController.java
  8. 1
      src/acr/browser/lightning/ClickHandler.java
  9. 24
      src/acr/browser/lightning/Constants.java
  10. 33
      src/acr/browser/lightning/DatabaseHandler.java
  11. 368
      src/acr/browser/lightning/DownloadHandler.java
  12. 109
      src/acr/browser/lightning/FetchMimeUrlType.java
  13. 107
      src/acr/browser/lightning/FetchUrlMimeType.java
  14. 21
      src/acr/browser/lightning/HistoryItem.java
  15. 6
      src/acr/browser/lightning/HistoryPageVariables.java
  16. 1
      src/acr/browser/lightning/HomepageVariables.java
  17. 4
      src/acr/browser/lightning/IncognitoActivity.java
  18. 19
      src/acr/browser/lightning/IntentUtils.java
  19. 19
      src/acr/browser/lightning/LicenseActivity.java
  20. 19
      src/acr/browser/lightning/LightningDownloadListener.java
  21. 347
      src/acr/browser/lightning/LightningView.java
  22. 4
      src/acr/browser/lightning/MainActivity.java
  23. 32
      src/acr/browser/lightning/PreferenceConstants.java
  24. 156
      src/acr/browser/lightning/ReplacingInputStream.java
  25. 94
      src/acr/browser/lightning/SearchAdapter.java
  26. 393
      src/acr/browser/lightning/SettingsActivity.java
  27. 9
      src/acr/browser/lightning/SettingsController.java
  28. 2
      src/acr/browser/lightning/SpaceTokenizer.java
  29. 39
      src/acr/browser/lightning/Utils.java
  30. 310
      src/acr/browser/lightning/WebAddress.java

2
res/layout/advanced_settings.xml

@ -625,8 +625,6 @@
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:paddingLeft="10dp" android:paddingLeft="10dp"
android:paddingRight="30dp" android:paddingRight="30dp"
android:text="@string/google_suggestions" android:text="@string/google_suggestions"

7
res/values-de/strings.xml

@ -158,6 +158,13 @@
<string name="powered_by_google">Unterstützt durch Google</string> <string name="powered_by_google">Unterstützt durch Google</string>
<string name="title_adblock">Werbeblocker</string> <string name="title_adblock">Werbeblocker</string>
<string name="message_adblock">Der Werbeblocker ist nur in Lightning Browser+ verfügbar und kann im Google Play Store gekauft werden!</string> <string name="message_adblock">Der Werbeblocker ist nur in Lightning Browser+ verfügbar und kann im Google Play Store gekauft werden!</string>
<string name="enable_orbot">Orbot aktivieren</string>
<string name="use_tor_prompt">Orbot ist installiert. Soll Tor verwendet werden?</string>
<string name="install_orbot">Um Tor verwenden zu können, muss Orbot installiert sein!</string>
<string name="yes">Ja</string>
<string name="no">Nein</string>
<string name="clear_cookies_exit">Cookies beim Beenden löschen</string>
<string name="clear_history_exit">Verlauf beim Beenden löschen</string>
<string name="folder_default">Standard</string> <string name="folder_default">Standard</string>
<string name="folder_custom">Andere</string> <string name="folder_custom">Andere</string>
</resources> </resources>

25
src/acr/browser/lightning/AdBlock.java

@ -1,28 +1,28 @@
package acr.browser.lightning; package acr.browser.lightning;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.AssetManager;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.SortedMap;
import java.util.TreeMap; import java.util.TreeMap;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.AssetManager;
public class AdBlock { public class AdBlock {
private static TreeMap<String, Integer> mAdBlockMap = null; private static SortedMap<String, Integer> mAdBlockMap =
new TreeMap<String, Integer>(String.CASE_INSENSITIVE_ORDER);
private SharedPreferences mPreferences; private SharedPreferences mPreferences;
private boolean mBlockAds = false;
private boolean mBlockAds;
public AdBlock(Context context) { public AdBlock(Context context) {
if (mAdBlockMap == null) {
mAdBlockMap = new TreeMap<String, Integer>(
String.CASE_INSENSITIVE_ORDER);
}
if (mAdBlockMap.isEmpty()) { if (mAdBlockMap.isEmpty()) {
fillSearchTree(context); fillSearchTree(context);
} }
@ -66,7 +66,7 @@ public class AdBlock {
if (!mBlockAds) { if (!mBlockAds) {
return false; return false;
} }
String domain = ""; String domain;
try { try {
domain = getDomainName(url); domain = getDomainName(url);
} catch (URISyntaxException e) { } catch (URISyntaxException e) {
@ -77,7 +77,7 @@ public class AdBlock {
} }
private static String getDomainName(String url) throws URISyntaxException { private static String getDomainName(String url) throws URISyntaxException {
int index = url.indexOf("/", 8); int index = url.indexOf('/', 8);
if (index != -1) { if (index != -1) {
url = url.substring(0, index); url = url.substring(0, index);
} }
@ -88,5 +88,4 @@ public class AdBlock {
} }
return domain.startsWith("www.") ? domain.substring(4) : domain; return domain.startsWith("www.") ? domain.substring(4) : domain;
} }
} }

229
src/acr/browser/lightning/AdvancedSettingsActivity.java

@ -3,27 +3,22 @@
*/ */
package acr.browser.lightning; package acr.browser.lightning;
import java.io.File; import android.app.ActionBar;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.Browser;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.database.Cursor; 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.MenuItem;
import android.view.View; import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.webkit.CookieManager; import android.view.WindowManager;
import android.webkit.CookieSyncManager; import android.webkit.*;
import android.webkit.WebIconDatabase;
import android.webkit.WebView;
import android.webkit.WebViewDatabase;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.CompoundButton; import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.CompoundButton.OnCheckedChangeListener;
@ -34,34 +29,44 @@ public class AdvancedSettingsActivity extends Activity {
// mPreferences variables // mPreferences variables
private static final int API = android.os.Build.VERSION.SDK_INT; private static final int API = android.os.Build.VERSION.SDK_INT;
private static SharedPreferences mPreferences;
private static SharedPreferences.Editor mEditPrefs; private SharedPreferences mPreferences;
private static RelativeLayout r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11,
r12, r13, r14, r15, rIncognitoCookies, rClearCache, private SharedPreferences.Editor mEditPrefs;
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; cb11, cbIncognitoCookies, cbSearchSuggestions, cbClearHistoryExit, cbClearCookiesExit;
private static Context mContext;
private Context mContext;
private boolean mSystemBrowser; private boolean mSystemBrowser;
private Handler messageHandler; private Handler messageHandler;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.advanced_settings); 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); mPreferences = getSharedPreferences(PreferenceConstants.PREFERENCES, 0);
if (mPreferences.getBoolean(PreferenceConstants.HIDE_STATUS_BAR, false)) { if (mPreferences.getBoolean(PreferenceConstants.HIDE_STATUS_BAR, false)) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN); WindowManager.LayoutParams.FLAG_FULLSCREEN);
} }
// TODO WARNING: SharedPreferences.edit() without a corresponding commit() or apply() call
mEditPrefs = mPreferences.edit(); mEditPrefs = mPreferences.edit();
mSystemBrowser = mPreferences.getBoolean( mSystemBrowser = mPreferences.getBoolean(
PreferenceConstants.SYSTEM_BROWSER_PRESENT, false); PreferenceConstants.SYSTEM_BROWSER_PRESENT, false);
mContext = this; mContext = this;
initialize(); initialize();
} }
@Override @Override
@ -70,7 +75,11 @@ public class AdvancedSettingsActivity extends Activity {
return true; 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); r1 = (RelativeLayout) findViewById(R.id.r1);
r2 = (RelativeLayout) findViewById(R.id.r2); r2 = (RelativeLayout) findViewById(R.id.r2);
@ -194,30 +203,29 @@ public class AdvancedSettingsActivity extends Activity {
messageHandler = new MessageHandler(); messageHandler = new MessageHandler();
} }
static class MessageHandler extends Handler { private class MessageHandler extends Handler {
@Override @Override
public void handleMessage(Message msg) { public void handleMessage(Message msg) {
switch (msg.what) { switch (msg.what) {
case 1: case 1:
Utils.showToast( Utils.showToast(
mContext, mContext,
mContext.getResources().getString( mContext.getResources().getString(
R.string.message_clear_history)); R.string.message_clear_history));
break; break;
case 2: case 2:
Utils.showToast( Utils.showToast(
mContext, mContext,
mContext.getResources().getString( mContext.getResources().getString(
R.string.message_cookies_cleared)); R.string.message_cookies_cleared));
break; break;
} }
super.handleMessage(msg); super.handleMessage(msg);
} }
} }
static void cb1(CheckBox view) { private void cb1(CheckBox view) {
view.setOnCheckedChangeListener(new OnCheckedChangeListener() { view.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override @Override
@ -231,7 +239,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void cb2(CheckBox view) { private void cb2(CheckBox view) {
view.setOnCheckedChangeListener(new OnCheckedChangeListener() { view.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override @Override
@ -245,7 +253,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void cbClearHistoryExit(CheckBox view) { private void cbClearHistoryExit(CheckBox view) {
view.setOnCheckedChangeListener(new OnCheckedChangeListener() { view.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override @Override
@ -258,7 +266,8 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void cbClearCookiesExit(CheckBox view) {
private void cbClearCookiesExit(CheckBox view) {
view.setOnCheckedChangeListener(new OnCheckedChangeListener() { view.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override @Override
@ -272,7 +281,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void cb3(CheckBox view) { private void cb3(CheckBox view) {
view.setOnCheckedChangeListener(new OnCheckedChangeListener() { view.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override @Override
@ -286,7 +295,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void cb4(CheckBox view) { private void cb4(CheckBox view) {
view.setOnCheckedChangeListener(new OnCheckedChangeListener() { view.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override @Override
@ -299,7 +308,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void cb5(CheckBox view) { private void cb5(CheckBox view) {
view.setOnCheckedChangeListener(new OnCheckedChangeListener() { view.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override @Override
@ -313,7 +322,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void cb6(CheckBox view) { private void cb6(CheckBox view) {
view.setOnCheckedChangeListener(new OnCheckedChangeListener() { view.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override @Override
@ -326,7 +335,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void cb7(CheckBox view) { private void cb7(CheckBox view) {
view.setOnCheckedChangeListener(new OnCheckedChangeListener() { view.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override @Override
@ -339,7 +348,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void cb8(CheckBox view) { private void cb8(CheckBox view) {
view.setOnCheckedChangeListener(new OnCheckedChangeListener() { view.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override @Override
@ -353,7 +362,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void cb9(CheckBox view) { private void cb9(CheckBox view) {
view.setOnCheckedChangeListener(new OnCheckedChangeListener() { view.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override @Override
@ -367,7 +376,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void cb10(CheckBox view) { private void cb10(CheckBox view) {
view.setOnCheckedChangeListener(new OnCheckedChangeListener() { view.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override @Override
@ -381,7 +390,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void cb11(CheckBox view) { private void cb11(CheckBox view) {
view.setOnCheckedChangeListener(new OnCheckedChangeListener() { view.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override @Override
@ -395,7 +404,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void cbIncognitoCookies(CheckBox view) { private void cbIncognitoCookies(CheckBox view) {
view.setOnCheckedChangeListener(new OnCheckedChangeListener() { view.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override @Override
@ -409,8 +418,8 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void cbSearchSuggestions(CheckBox view){ private void cbSearchSuggestions(CheckBox view) {
view.setOnCheckedChangeListener(new OnCheckedChangeListener(){ view.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override @Override
public void onCheckedChanged(CompoundButton buttonView, public void onCheckedChanged(CompoundButton buttonView,
@ -422,7 +431,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void r1(RelativeLayout view) { private void r1(RelativeLayout view) {
view.setOnClickListener(new OnClickListener() { view.setOnClickListener(new OnClickListener() {
@Override @Override
@ -434,7 +443,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void r2(RelativeLayout view) { private void r2(RelativeLayout view) {
view.setOnClickListener(new OnClickListener() { view.setOnClickListener(new OnClickListener() {
@Override @Override
@ -446,7 +455,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void rClearHistoryExit(RelativeLayout view) { private void rClearHistoryExit(RelativeLayout view) {
view.setOnClickListener(new OnClickListener() { view.setOnClickListener(new OnClickListener() {
@Override @Override
@ -458,7 +467,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void rClearCookiesExit(RelativeLayout view) { private void rClearCookiesExit(RelativeLayout view) {
view.setOnClickListener(new OnClickListener() { view.setOnClickListener(new OnClickListener() {
@Override @Override
@ -470,7 +479,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void r3(RelativeLayout view) { private void r3(RelativeLayout view) {
view.setOnClickListener(new OnClickListener() { view.setOnClickListener(new OnClickListener() {
@Override @Override
@ -482,7 +491,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void r4(RelativeLayout view) { private void r4(RelativeLayout view) {
view.setOnClickListener(new OnClickListener() { view.setOnClickListener(new OnClickListener() {
@Override @Override
@ -500,7 +509,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void r5(RelativeLayout view) { private void r5(RelativeLayout view) {
view.setOnClickListener(new OnClickListener() { view.setOnClickListener(new OnClickListener() {
@Override @Override
@ -512,7 +521,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void r6(RelativeLayout view) { private void r6(RelativeLayout view) {
view.setOnClickListener(new OnClickListener() { view.setOnClickListener(new OnClickListener() {
@Override @Override
@ -524,7 +533,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void r7(RelativeLayout view) { private void r7(RelativeLayout view) {
view.setOnClickListener(new OnClickListener() { view.setOnClickListener(new OnClickListener() {
@Override @Override
@ -536,7 +545,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void r8(RelativeLayout view) { private void r8(RelativeLayout view) {
view.setOnClickListener(new OnClickListener() { view.setOnClickListener(new OnClickListener() {
@Override @Override
@ -584,7 +593,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void r11(RelativeLayout view) { private void r11(RelativeLayout view) {
view.setOnClickListener(new OnClickListener() { view.setOnClickListener(new OnClickListener() {
@Override @Override
@ -597,7 +606,7 @@ public class AdvancedSettingsActivity extends Activity {
} }
void r12(RelativeLayout view) { private void r12(RelativeLayout view) {
view.setOnClickListener(new OnClickListener() { view.setOnClickListener(new OnClickListener() {
@Override @Override
@ -609,7 +618,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void r13(RelativeLayout view) { private void r13(RelativeLayout view) {
view.setOnClickListener(new OnClickListener() { view.setOnClickListener(new OnClickListener() {
@Override @Override
@ -620,7 +629,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void r14(RelativeLayout view) { private void r14(RelativeLayout view) {
view.setOnClickListener(new OnClickListener() { view.setOnClickListener(new OnClickListener() {
@Override @Override
@ -631,7 +640,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void r15(RelativeLayout view) { private void r15(RelativeLayout view) {
view.setOnClickListener(new OnClickListener() { view.setOnClickListener(new OnClickListener() {
@Override @Override
@ -678,7 +687,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void rIncognitoCookies(RelativeLayout view) { private void rIncognitoCookies(RelativeLayout view) {
view.setOnClickListener(new OnClickListener() { view.setOnClickListener(new OnClickListener() {
@Override @Override
@ -691,8 +700,8 @@ public class AdvancedSettingsActivity extends Activity {
} }
void rSearchSuggestions(RelativeLayout view){ private void rSearchSuggestions(RelativeLayout view) {
view.setOnClickListener(new OnClickListener(){ view.setOnClickListener(new OnClickListener() {
@Override @Override
public void onClick(View arg0) { public void onClick(View arg0) {
@ -702,7 +711,7 @@ public class AdvancedSettingsActivity extends Activity {
}); });
} }
void rClearCache(RelativeLayout view) { private void rClearCache(RelativeLayout view) {
view.setOnClickListener(new OnClickListener() { view.setOnClickListener(new OnClickListener() {
@Override @Override
@ -723,11 +732,10 @@ public class AdvancedSettingsActivity extends Activity {
getResources().getString(R.string.message_cache_cleared)); getResources().getString(R.string.message_cache_cleared));
} }
@SuppressWarnings("deprecation")
public void clearHistory() { public void clearHistory() {
AdvancedSettingsActivity.this deleteDatabase(DatabaseHandler.DATABASE_NAME);
.deleteDatabase(DatabaseHandler.DATABASE_NAME); WebViewDatabase m = WebViewDatabase.getInstance(this);
WebViewDatabase m = WebViewDatabase
.getInstance(AdvancedSettingsActivity.this);
m.clearFormData(); m.clearFormData();
m.clearHttpAuthUsernamePassword(); m.clearHttpAuthUsernamePassword();
if (API < 18) { if (API < 18) {
@ -737,11 +745,11 @@ public class AdvancedSettingsActivity extends Activity {
if (mSystemBrowser) { if (mSystemBrowser) {
try { try {
Browser.clearHistory(getContentResolver()); Browser.clearHistory(getContentResolver());
} catch (NullPointerException ignored) { } catch (Exception ignored) {
} }
} }
SettingsController.setClearHistory(true); SettingsController.setClearHistory(true);
Utils.trimCache(AdvancedSettingsActivity.this); Utils.trimCache(this);
messageHandler.sendEmptyMessage(1); messageHandler.sendEmptyMessage(1);
} }
@ -752,21 +760,23 @@ public class AdvancedSettingsActivity extends Activity {
messageHandler.sendEmptyMessage(2); messageHandler.sendEmptyMessage(2);
} }
void r9(RelativeLayout view) { private void r9(RelativeLayout view) {
view.setOnClickListener(new OnClickListener() { view.setOnClickListener(new OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
try {
importFromStockBrowser(); importFromStockBrowser();
} catch (Exception e) {
// ignored exception
// TODO add logging
}
} }
}); });
} }
void r10(RelativeLayout view) { private void r10(RelativeLayout view) {
view.setOnClickListener(new OnClickListener() { view.setOnClickListener(new OnClickListener() {
@Override @Override
@ -809,41 +819,36 @@ public class AdvancedSettingsActivity extends Activity {
public void importFromStockBrowser() { public void importFromStockBrowser() {
if (mSystemBrowser) { if (mSystemBrowser) {
try { String[] proj = new String[]{Browser.BookmarkColumns.TITLE,
String[] proj = new String[] { Browser.BookmarkColumns.TITLE, Browser.BookmarkColumns.URL};
Browser.BookmarkColumns.URL }; // use 0 for history, 1 for bookmarks
// use 0 for history, 1 for bookmarks String sel = Browser.BookmarkColumns.BOOKMARK + " = 1";
String sel = Browser.BookmarkColumns.BOOKMARK + " = 1"; Cursor mCur;
Cursor mCur; mCur = getContentResolver().query(Browser.BOOKMARKS_URI, proj,
mCur = getContentResolver().query(Browser.BOOKMARKS_URI, proj, sel, null, null);
sel, null, null);
String title, url;
String title = ""; int number = 0;
String url = ""; if (mCur.moveToFirst() && mCur.getCount() > 0) {
int number = 0; while (!mCur.isAfterLast()) {
if (mCur.moveToFirst() && mCur.getCount() > 0) { number++;
while (mCur.isAfterLast() == false) { title = mCur.getString(mCur
number++; .getColumnIndex(Browser.BookmarkColumns.TITLE));
title = mCur.getString(mCur url = mCur.getString(mCur
.getColumnIndex(Browser.BookmarkColumns.TITLE)); .getColumnIndex(Browser.BookmarkColumns.URL));
url = mCur.getString(mCur if (title.length() < 1) {
.getColumnIndex(Browser.BookmarkColumns.URL)); title = Utils.getDomainName(url);
if (title.length() < 1) {
title = Utils.getDomainName(url);
}
Utils.addBookmark(mContext, title, url);
mCur.moveToNext();
} }
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 { } else {
Utils.createInformativeDialog(mContext, Utils.createInformativeDialog(mContext,
getResources().getString(R.string.title_error), getResources().getString(R.string.title_error),
getResources().getString(R.string.dialog_import_error)); getResources().getString(R.string.dialog_import_error));
} }
} }
} }

6
src/acr/browser/lightning/BookmarkPageVariables.java

@ -4,12 +4,18 @@
package acr.browser.lightning; package acr.browser.lightning;
public class BookmarkPageVariables { public class BookmarkPageVariables {
public static final String Heading = "<!DOCTYPE html><html xmlns=\"http://www.w3.org/1999/xhtml\"><head><meta content=\"en-us\" http-equiv=\"Content-Language\" /><meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><title>" public static final String Heading = "<!DOCTYPE html><html xmlns=\"http://www.w3.org/1999/xhtml\"><head><meta content=\"en-us\" http-equiv=\"Content-Language\" /><meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><title>"
+ BrowserApp.getAppContext().getString(R.string.action_bookmarks) + BrowserApp.getAppContext().getString(R.string.action_bookmarks)
+ "</title></head><style>body { background: #e1e1e1; max-width:100%; min-height:100%;}#content {width:100%; max-width:800px; margin:0 auto; text-align:center;}.box { vertical-align:middle;text-align:center;position:relative; display: inline-block; height: 100px; width: 100px; margin: 10px; background-color:#fff;box-shadow: 0px 3px rgba( 0, 0, 0, 0.1 );font-family: Arial;color: #444;font-size: 12px;-moz-border-radius: 2px;-webkit-border-radius: 2px;border-radius: 2px;}.stuff {height: 100px; width: 100px;vertical-align:middle;text-align:center; display: table-cell;}p.ellipses {width:90px; white-space: nowrap; overflow: hidden;text-align:center;margin:auto; text-overflow: ellipsis; -o-text-overflow: ellipsis; -ms-text-overflow: ellipsis;}.box a { width: 100%; height: 100%; position: absolute; left: 0; top: 0;}</style><body> <div id=\"content\">"; + "</title></head><style>body { background: #e1e1e1; max-width:100%; min-height:100%;}#content {width:100%; max-width:800px; margin:0 auto; text-align:center;}.box { vertical-align:middle;text-align:center;position:relative; display: inline-block; height: 100px; width: 100px; margin: 10px; background-color:#fff;box-shadow: 0px 3px rgba( 0, 0, 0, 0.1 );font-family: Arial;color: #444;font-size: 12px;-moz-border-radius: 2px;-webkit-border-radius: 2px;border-radius: 2px;}.stuff {height: 100px; width: 100px;vertical-align:middle;text-align:center; display: table-cell;}p.ellipses {width:90px; white-space: nowrap; overflow: hidden;text-align:center;margin:auto; text-overflow: ellipsis; -o-text-overflow: ellipsis; -ms-text-overflow: ellipsis;}.box a { width: 100%; height: 100%; position: absolute; left: 0; top: 0;}</style><body> <div id=\"content\">";
public static final String Part1 = "<div class=\"box\"><a href=\""; public static final String Part1 = "<div class=\"box\"><a href=\"";
public static final String Part2 = "\" ></a><div class=\"stuff\" ><img height=\"20\" width=\"20\" src='http://www.google.com/s2/favicons?domain="; public static final String Part2 = "\" ></a><div class=\"stuff\" ><img height=\"20\" width=\"20\" src='http://www.google.com/s2/favicons?domain=";
public static final String Part3 = "' /><p class=\"ellipses\">"; public static final String Part3 = "' /><p class=\"ellipses\">";
public static final String Part4 = "</p></div></div>"; public static final String Part4 = "</p></div></div>";
public static final String End = "</div></body></html>"; public static final String End = "</div></body></html>";
} }

671
src/acr/browser/lightning/BrowserActivity.java

File diff suppressed because it is too large Load Diff

1
src/acr/browser/lightning/BrowserController.java

@ -13,6 +13,7 @@ import android.webkit.WebChromeClient.CustomViewCallback;
import android.webkit.WebView; import android.webkit.WebView;
public interface BrowserController { public interface BrowserController {
public void updateUrl(String title); public void updateUrl(String title);
public void updateProgress(int n); public void updateProgress(int n);

1
src/acr/browser/lightning/ClickHandler.java

@ -27,5 +27,4 @@ public class ClickHandler extends Handler {
url = msg.getData().getString("url"); url = msg.getData().getString("url");
mBrowserController.longClickPage(url); mBrowserController.longClickPage(url);
} }
} }

24
src/acr/browser/lightning/Constants.java

@ -12,28 +12,50 @@ public class Constants {
} }
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 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 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 int API = android.os.Build.VERSION.SDK_INT;
public static final String YAHOO_SEARCH = "http://search.yahoo.com/search?p="; 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 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 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_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 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_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 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 ANDROID_SEARCH = "http://www.androidsearchresult.com/search.pg?aff=olb&keyword=";
public static final String HOMEPAGE = "about:home"; public static final String HOMEPAGE = "about:home";
public static final String BAIDU_SEARCH = "http://www.baidu.com/s?wd="; 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 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 ADVANCED_SETTINGS_INTENT = "android.intent.action.ADVANCED_SETTINGS";
public static final String LICENSE_INTENT = "android.intent.action.LICENSE"; 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 INCOGNITO_INTENT = "android.intent.action.INCOGNITO";
public static final String EXTERNAL_STORAGE = Environment.getExternalStorageDirectory().toString(); public static final String EXTERNAL_STORAGE = Environment.getExternalStorageDirectory().toString();
public static final String SEPARATOR = "\\|\\$\\|SEPARATOR\\|\\$\\|"; public static final String SEPARATOR = "\\|\\$\\|SEPARATOR\\|\\$\\|";
public static final String HTTP = "http://"; public static final String HTTP = "http://";
public static final String HTTPS = "https://"; public static final String HTTPS = "https://";
public static final String FILE = "file://"; public static final String FILE = "file://";
public static final String TAG = "Lightning";
public static final String TAG = "Lightning";
} }

33
src/acr/browser/lightning/DatabaseHandler.java

@ -3,15 +3,15 @@
*/ */
package acr.browser.lightning; package acr.browser.lightning;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteOpenHelper;
import java.util.ArrayList;
import java.util.List;
public class DatabaseHandler extends SQLiteOpenHelper { public class DatabaseHandler extends SQLiteOpenHelper {
// All Static variables // All Static variables
@ -26,8 +26,11 @@ public class DatabaseHandler extends SQLiteOpenHelper {
// HistoryItems Table Columns names // HistoryItems Table Columns names
public static final String KEY_ID = "id"; public static final String KEY_ID = "id";
public static final String KEY_URL = "url"; public static final String KEY_URL = "url";
public static final String KEY_TITLE = "title"; public static final String KEY_TITLE = "title";
public static SQLiteDatabase mDatabase; public static SQLiteDatabase mDatabase;
public DatabaseHandler(Context context) { public DatabaseHandler(Context context) {
@ -55,17 +58,19 @@ public class DatabaseHandler extends SQLiteOpenHelper {
onCreate(db); onCreate(db);
} }
public boolean isOpen(){ public boolean isOpen() {
if(mDatabase != null) if (mDatabase != null) {
return mDatabase.isOpen(); return mDatabase.isOpen();
else } else {
return false; return false;
}
} }
@Override @Override
public synchronized void close() { public synchronized void close() {
if(mDatabase != null) if (mDatabase != null) {
mDatabase.close(); mDatabase.close();
}
super.close(); super.close();
} }
@ -75,8 +80,9 @@ public class DatabaseHandler extends SQLiteOpenHelper {
public synchronized void delete(String url) { public synchronized void delete(String url) {
String n = getHistoryItem(url); String n = getHistoryItem(url);
if(n != null) if (n != null) {
deleteHistoryItem(n); deleteHistoryItem(n);
}
} }
// Adding new item // Adding new item
@ -90,8 +96,8 @@ public class DatabaseHandler extends SQLiteOpenHelper {
// Getting single item // Getting single item
String getHistoryItem(String url) { String getHistoryItem(String url) {
Cursor cursor = mDatabase.query(TABLE_HISTORY, new String[] { KEY_ID, KEY_URL, Cursor cursor = mDatabase.query(TABLE_HISTORY, new String[]{KEY_ID, KEY_URL,
KEY_TITLE }, KEY_URL + "=?", new String[] { url }, null, null, KEY_TITLE}, KEY_URL + "=?", new String[]{url}, null, null,
null, null); null, null);
String m = null; String m = null;
if (cursor != null) { if (cursor != null) {
@ -107,7 +113,7 @@ public class DatabaseHandler extends SQLiteOpenHelper {
public List<HistoryItem> findItemsContaining(String search) { public List<HistoryItem> findItemsContaining(String search) {
List<HistoryItem> itemList = new ArrayList<HistoryItem>(); List<HistoryItem> itemList = new ArrayList<HistoryItem>();
//select query //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); Cursor cursor = mDatabase.rawQuery(selectQuery, null);
// looping through all rows and adding to list // looping through all rows and adding to list
@ -175,7 +181,7 @@ public class DatabaseHandler extends SQLiteOpenHelper {
values.put(KEY_URL, item.getUrl()); values.put(KEY_URL, item.getUrl());
values.put(KEY_TITLE, item.getTitle()); values.put(KEY_TITLE, item.getTitle());
int n = mDatabase.update(TABLE_HISTORY, values, KEY_ID + " = ?", int n = mDatabase.update(TABLE_HISTORY, values, KEY_ID + " = ?",
new String[] { String.valueOf(item.getId()) }); new String[]{String.valueOf(item.getId())});
// updating row // updating row
return n; return n;
} }
@ -183,7 +189,7 @@ public class DatabaseHandler extends SQLiteOpenHelper {
// Deleting single item // Deleting single item
public synchronized void deleteHistoryItem(String id) { public synchronized void deleteHistoryItem(String id) {
mDatabase.delete(TABLE_HISTORY, KEY_ID + " = ?", mDatabase.delete(TABLE_HISTORY, KEY_ID + " = ?",
new String[] { String.valueOf(id) }); new String[]{String.valueOf(id)});
} }
// Getting items Count // Getting items Count
@ -195,5 +201,4 @@ public class DatabaseHandler extends SQLiteOpenHelper {
// return count // return count
return cursor.getCount(); return cursor.getCount();
} }
} }

368
src/acr/browser/lightning/DownloadHandler.java

@ -3,8 +3,6 @@
*/ */
package acr.browser.lightning; package acr.browser.lightning;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.DownloadManager; import android.app.DownloadManager;
@ -27,189 +25,191 @@ import android.widget.Toast;
*/ */
public class DownloadHandler { public class DownloadHandler {
private static final String LOGTAG = "DLHandler";
private static final String LOGTAG = "DLHandler";
private static Activity mActivity; private static Activity mActivity;
/** /**
* Notify the host application a download should be done, or that * Notify the host application a download should be done, or that the data should be streamed if a streaming viewer
* the data should be streamed if a streaming viewer is available. * is available.
* @param activity Activity requesting the download. *
* @param url The full url to the content that should be downloaded * @param activity Activity requesting the download.
* @param userAgent User agent of the downloading application. * @param url The full url to the content that should be downloaded
* @param contentDisposition Content-disposition http header, if present. * @param userAgent User agent of the downloading application.
* @param mimetype The mimetype of the content reported by the server * @param contentDisposition Content-disposition http header, if present.
* @param privateBrowsing If the request is coming from a private browsing tab. * @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, public static void onDownloadStart(Activity activity, String url,
boolean privateBrowsing) { String userAgent, String contentDisposition, String mimetype,
mActivity = activity; boolean privateBrowsing) {
// if we're dealing wih A/V content that's not explicitly marked mActivity = activity;
// for download, check if it's streamable. // if we're dealing wih A/V content that's not explicitly marked
if (contentDisposition == null // for download, check if it's streamable.
|| !contentDisposition.regionMatches( if (contentDisposition == null
true, 0, "attachment", 0, 10)) { || !contentDisposition.regionMatches(
// query the package manager to see if there's a registered handler true, 0, "attachment", 0, 10)) {
// that matches. // query the package manager to see if there's a registered handler
Intent intent = new Intent(Intent.ACTION_VIEW); // that matches.
intent.setDataAndType(Uri.parse(url), mimetype); Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(Uri.parse(url), mimetype);
ResolveInfo info = activity.getPackageManager().resolveActivity(intent, intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PackageManager.MATCH_DEFAULT_ONLY); ResolveInfo info = activity.getPackageManager().resolveActivity(intent,
if (info != null) { PackageManager.MATCH_DEFAULT_ONLY);
ComponentName myName = activity.getComponentName(); if (info != null) {
// If we resolved to ourselves, we don't want to attempt to ComponentName myName = activity.getComponentName();
// load the url only to try and download it again. // If we resolved to ourselves, we don't want to attempt to
if (!myName.getPackageName().equals( // load the url only to try and download it again.
info.activityInfo.packageName) if (!myName.getPackageName().equals(
|| !myName.getClassName().equals( info.activityInfo.packageName)
info.activityInfo.name)) { || !myName.getClassName().equals(
// someone (other than us) knows how to handle this mime info.activityInfo.name)) {
// type with this scheme, don't download. // someone (other than us) knows how to handle this mime
try { // type with this scheme, don't download.
activity.startActivity(intent); try {
return; activity.startActivity(intent);
} catch (ActivityNotFoundException ex) { return;
// Best behavior is to fall back to a download in this } catch (ActivityNotFoundException ex) {
// case // Best behavior is to fall back to a download in this
} // case
} }
} }
} }
onDownloadStartNoStream(activity, url, userAgent, contentDisposition, }
mimetype, privateBrowsing); 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 // This is to work around the fact that java.net.URI throws Exceptions
// Helper method for onDownloadStartNoStream // instead of just encoding URL's properly
private static String encodePath(String path) { // Helper method for onDownloadStartNoStream
char[] chars = path.toCharArray(); private static String encodePath(String path) {
char[] chars = path.toCharArray();
boolean needed = false;
for (char c : chars) { boolean needed = false;
if (c == '[' || c == ']' || c == '|') { for (char c : chars) {
needed = true; if (c == '[' || c == ']' || c == '|') {
break; needed = true;
} break;
} }
if (needed == false) { }
return path; if (needed == false) {
} return path;
}
StringBuilder sb = new StringBuilder("");
for (char c : chars) { StringBuilder sb = new StringBuilder("");
if (c == '[' || c == ']' || c == '|') { for (char c : chars) {
sb.append('%'); if (c == '[' || c == ']' || c == '|') {
sb.append(Integer.toHexString(c)); sb.append('%');
} else { sb.append(Integer.toHexString(c));
sb.append(c); } else {
} sb.append(c);
} }
}
return sb.toString();
} return sb.toString();
}
/**
* Notify the host application a download should be done, even if there /**
* is a streaming viewer available for thise type. * Notify the host application a download should be done, even if there is a streaming viewer available for thise
* @param activity Activity requesting the download. * type.
* @param url The full url to the content that should be downloaded *
* @param userAgent User agent of the downloading application. * @param activity Activity requesting the download.
* @param contentDisposition Content-disposition http header, if present. * @param url The full url to the content that should be downloaded
* @param mimetype The mimetype of the content reported by the server * @param userAgent User agent of the downloading application.
* @param privateBrowsing If the request is coming from a private browsing tab. * @param contentDisposition Content-disposition http header, if present.
*/ * @param mimetype The mimetype of the content reported by the server
/*package */ static void onDownloadStartNoStream(Activity activity, * @param privateBrowsing If the request is coming from a private browsing tab.
String url, String userAgent, String contentDisposition, */
String mimetype, boolean privateBrowsing) { /*package */
static void onDownloadStartNoStream(Activity activity,
String filename = URLUtil.guessFileName(url, String url, String userAgent, String contentDisposition,
contentDisposition, mimetype); String mimetype, boolean privateBrowsing) {
// Check to see if we have an SDCard String filename = URLUtil.guessFileName(url,
String status = Environment.getExternalStorageState(); contentDisposition, mimetype);
if (!status.equals(Environment.MEDIA_MOUNTED)) {
int title; // Check to see if we have an SDCard
String msg; String status = Environment.getExternalStorageState();
if (!status.equals(Environment.MEDIA_MOUNTED)) {
// Check to see if the SDCard is busy, same as the music app int title;
if (status.equals(Environment.MEDIA_SHARED)) { String msg;
msg = activity.getString(R.string.download_sdcard_busy_dlg_msg);
title = R.string.download_sdcard_busy_dlg_title; // Check to see if the SDCard is busy, same as the music app
} else { if (status.equals(Environment.MEDIA_SHARED)) {
msg = activity.getString(R.string.download_no_sdcard_dlg_msg, filename); msg = activity.getString(R.string.download_sdcard_busy_dlg_msg);
title = R.string.download_no_sdcard_dlg_title; title = R.string.download_sdcard_busy_dlg_title;
} } else {
msg = activity.getString(R.string.download_no_sdcard_dlg_msg, filename);
new AlertDialog.Builder(activity) title = R.string.download_no_sdcard_dlg_title;
.setTitle(title) }
.setIcon(android.R.drawable.ic_dialog_alert)
.setMessage(msg) new AlertDialog.Builder(activity)
.setPositiveButton(R.string.action_ok, null) .setTitle(title)
.show(); .setIcon(android.R.drawable.ic_dialog_alert)
return; .setMessage(msg)
} .setPositiveButton(R.string.action_ok, null)
.show();
// java.net.URI is a lot stricter than KURL so we have to encode some return;
// extra characters. Fix for b 2538060 and b 1634719 }
WebAddress webAddress;
try { // java.net.URI is a lot stricter than KURL so we have to encode some
webAddress = new WebAddress(url); // extra characters. Fix for b 2538060 and b 1634719
webAddress.setPath(encodePath(webAddress.getPath())); WebAddress webAddress;
} catch (Exception e) { try {
// This only happens for very bad urls, we want to chatch the webAddress = new WebAddress(url);
// exception here webAddress.setPath(encodePath(webAddress.getPath()));
Log.e(LOGTAG, "Exception trying to parse url:" + url); } catch (Exception e) {
return; // This only happens for very bad urls, we want to chatch the
} // exception here
Log.e(LOGTAG, "Exception trying to parse url:" + url);
String addressString = webAddress.toString(); return;
Uri uri = Uri.parse(addressString); }
final DownloadManager.Request request;
try { String addressString = webAddress.toString();
request = new DownloadManager.Request(uri); Uri uri = Uri.parse(addressString);
} catch (IllegalArgumentException e) { final DownloadManager.Request request;
Toast.makeText(activity, R.string.cannot_download, Toast.LENGTH_SHORT).show(); try {
return; request = new DownloadManager.Request(uri);
} } catch (IllegalArgumentException e) {
request.setMimeType(mimetype); Toast.makeText(activity, R.string.cannot_download, Toast.LENGTH_SHORT).show();
// set downloaded file destination to /sdcard/Download. return;
// or, should it be set to one of several Environment.DIRECTORY* dirs depending on mimetype? }
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) String location = mActivity.getSharedPreferences(PreferenceConstants.PREFERENCES, 0)
.getString(PreferenceConstants.DOWNLOAD_DIRECTORY, Environment.DIRECTORY_DOWNLOADS); .getString(PreferenceConstants.DOWNLOAD_DIRECTORY, Environment.DIRECTORY_DOWNLOADS);
request.setDestinationInExternalPublicDir(location, filename); request.setDestinationInExternalPublicDir(location, filename);
// let this downloaded file be scanned by MediaScanner - so that it can // let this downloaded file be scanned by MediaScanner - so that it can
// show up in Gallery app, for example. // show up in Gallery app, for example.
request.allowScanningByMediaScanner(); request.allowScanningByMediaScanner();
request.setDescription(webAddress.getHost()); request.setDescription(webAddress.getHost());
// XXX: Have to use the old url since the cookies were stored using the // XXX: Have to use the old url since the cookies were stored using the
// old percent-encoded url. // old percent-encoded url.
String cookies = CookieManager.getInstance().getCookie(url); String cookies = CookieManager.getInstance().getCookie(url);
request.addRequestHeader("cookie", cookies); request.addRequestHeader("cookie", cookies);
request.setNotificationVisibility( request.setNotificationVisibility(
DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
if (mimetype == null) { if (mimetype == null) {
if (TextUtils.isEmpty(addressString)) { if (TextUtils.isEmpty(addressString)) {
return; return;
} }
// We must have long pressed on a link or image to download it. We // 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 // are not sure of the mimetype in this case, so do a head request
new FetchUrlMimeType(activity, request, addressString, cookies, new FetchUrlMimeType(activity, request, addressString, cookies,
userAgent).start(); userAgent).start();
} else { } else {
final DownloadManager manager final DownloadManager manager
= (DownloadManager) activity.getSystemService(Context.DOWNLOAD_SERVICE); = (DownloadManager) activity.getSystemService(Context.DOWNLOAD_SERVICE);
new Thread("Browser download") { new Thread("Browser download") {
public void run() { public void run() {
manager.enqueue(request); manager.enqueue(request);
} }
}.start(); }.start();
} }
Toast.makeText(activity, R.string.download_pending, Toast.LENGTH_SHORT) Toast.makeText(activity, R.string.download_pending, Toast.LENGTH_SHORT)
.show(); .show();
} }
} }

109
src/acr/browser/lightning/FetchMimeUrlType.java

@ -1,109 +0,0 @@
/*
* Copyright 2014 A.C.R. Development
*/
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 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.
*
*/
class FetchUrlMimeType extends Thread {
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;
}
@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);
if (mCookies != null && mCookies.length() > 0) {
request.addHeader("Cookie", mCookies);
}
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 (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);
}
}

107
src/acr/browser/lightning/FetchUrlMimeType.java

@ -0,0 +1,107 @@
/*
* Copyright 2014 A.C.R. Development
*/
package acr.browser.lightning;
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.
*/
public class FetchUrlMimeType extends Thread {
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;
}
@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);
if (mCookies != null && mCookies.length() > 0) {
request.addHeader("Cookie", mCookies);
}
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 (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);
}
}

21
src/acr/browser/lightning/HistoryItem.java

@ -9,9 +9,13 @@ public class HistoryItem implements Comparable<HistoryItem> {
// private variables // private variables
private int mId; private int mId;
private String mUrl; private String mUrl;
private String mTitle; private String mTitle;
private Bitmap mBitmap; private Bitmap mBitmap;
private int mImageId; private int mImageId;
// Empty constructor // Empty constructor
@ -35,19 +39,19 @@ public class HistoryItem implements Comparable<HistoryItem> {
} }
// constructor // constructor
public HistoryItem(String url, String title, int imageId) { public HistoryItem(String url, String title, int imageId) {
this.mUrl = url; this.mUrl = url;
this.mTitle = title; this.mTitle = title;
this.mBitmap = null; this.mBitmap = null;
this.mImageId = imageId; this.mImageId = imageId;
} }
// getting ID // getting ID
public int getId() { public int getId() {
return this.mId; return this.mId;
} }
public int getImageId(){ public int getImageId() {
return this.mImageId; return this.mImageId;
} }
@ -56,7 +60,7 @@ public class HistoryItem implements Comparable<HistoryItem> {
this.mId = id; this.mId = id;
} }
public void setImageId(int id){ public void setImageId(int id) {
this.mImageId = id; this.mImageId = id;
} }
@ -97,5 +101,4 @@ public class HistoryItem implements Comparable<HistoryItem> {
public int compareTo(HistoryItem another) { public int compareTo(HistoryItem another) {
return mTitle.compareTo(another.mTitle); return mTitle.compareTo(another.mTitle);
} }
} }

6
src/acr/browser/lightning/HistoryPageVariables.java

@ -4,12 +4,18 @@
package acr.browser.lightning; package acr.browser.lightning;
public class HistoryPageVariables { public class HistoryPageVariables {
public static final String Heading = "<!DOCTYPE html><html xmlns=\"http://www.w3.org/1999/xhtml\"><head><meta content=\"en-us\" http-equiv=\"Content-Language\" /><meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><title>" public static final String Heading = "<!DOCTYPE html><html xmlns=\"http://www.w3.org/1999/xhtml\"><head><meta content=\"en-us\" http-equiv=\"Content-Language\" /><meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><title>"
+ BrowserApp.getAppContext().getString(R.string.action_history) + BrowserApp.getAppContext().getString(R.string.action_history)
+ "</title></head><style>body { background: #e1e1e1;}.box { vertical-align:middle;position:relative; display: block; margin: 10px;padding-left:10px;padding-right:10px;padding-top:5px;padding-bottom:5px; background-color:#fff;box-shadow: 0px 3px rgba( 0, 0, 0, 0.1 );font-family: Arial;color: #444;font-size: 12px;-moz-border-radius: 2px;-webkit-border-radius: 2px;border-radius: 2px;}.box a { width: 100%; height: 100%; position: absolute; left: 0; top: 0;}.black {color: black;font-size: 15px;font-family: Arial; white-space: nowrap; overflow: hidden;margin:auto; text-overflow: ellipsis; -o-text-overflow: ellipsis; -ms-text-overflow: ellipsis;}.font {color: gray;font-size: 10px;font-family: Arial; white-space: nowrap; overflow: hidden;margin:auto; text-overflow: ellipsis; -o-text-overflow: ellipsis; -ms-text-overflow: ellipsis;}</style><body><div id=\"content\">"; + "</title></head><style>body { background: #e1e1e1;}.box { vertical-align:middle;position:relative; display: block; margin: 10px;padding-left:10px;padding-right:10px;padding-top:5px;padding-bottom:5px; background-color:#fff;box-shadow: 0px 3px rgba( 0, 0, 0, 0.1 );font-family: Arial;color: #444;font-size: 12px;-moz-border-radius: 2px;-webkit-border-radius: 2px;border-radius: 2px;}.box a { width: 100%; height: 100%; position: absolute; left: 0; top: 0;}.black {color: black;font-size: 15px;font-family: Arial; white-space: nowrap; overflow: hidden;margin:auto; text-overflow: ellipsis; -o-text-overflow: ellipsis; -ms-text-overflow: ellipsis;}.font {color: gray;font-size: 10px;font-family: Arial; white-space: nowrap; overflow: hidden;margin:auto; text-overflow: ellipsis; -o-text-overflow: ellipsis; -ms-text-overflow: ellipsis;}</style><body><div id=\"content\">";
public static final String Part1 = "<div class=\"box\"><a href=\""; public static final String Part1 = "<div class=\"box\"><a href=\"";
public static final String Part2 = "\"></a><p class=\"black\">"; public static final String Part2 = "\"></a><p class=\"black\">";
public static final String Part3 = "</p><p class=\"font\">"; public static final String Part3 = "</p><p class=\"font\">";
public static final String Part4 = "</p></div></div>"; public static final String Part4 = "</p></div></div>";
public static final String End = "</div></body></html>"; public static final String End = "</div></body></html>";
} }

1
src/acr/browser/lightning/HomepageVariables.java

@ -4,6 +4,7 @@
package acr.browser.lightning; package acr.browser.lightning;
public class HomepageVariables { public class HomepageVariables {
public static final String HEAD = "<!DOCTYPE html><html xmlns=\"http://www.w3.org/1999/xhtml\"><head><meta content=\"en-us\" http-equiv=\"Content-Language\" /><meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1, user-scalable=0\"><title>" public static final String HEAD = "<!DOCTYPE html><html xmlns=\"http://www.w3.org/1999/xhtml\"><head><meta content=\"en-us\" http-equiv=\"Content-Language\" /><meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1, user-scalable=0\"><title>"
+ BrowserApp.getAppContext().getString(R.string.home) + BrowserApp.getAppContext().getString(R.string.home)
+ "</title></head>" + "</title></head>"

4
src/acr/browser/lightning/IncognitoActivity.java

@ -10,6 +10,7 @@ import android.webkit.CookieSyncManager;
public class IncognitoActivity extends BrowserActivity { public class IncognitoActivity extends BrowserActivity {
SharedPreferences mPreferences; SharedPreferences mPreferences;
CookieManager mCookieManager; CookieManager mCookieManager;
@Override @Override
@ -73,7 +74,4 @@ public class IncognitoActivity extends BrowserActivity {
closeDrawers(); closeDrawers();
finish(); finish();
} }
} }

19
src/acr/browser/lightning/IntentUtils.java

@ -1,10 +1,5 @@
package acr.browser.lightning; 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.app.Activity;
import android.content.ActivityNotFoundException; import android.content.ActivityNotFoundException;
import android.content.Intent; import android.content.Intent;
@ -15,10 +10,17 @@ import android.net.Uri;
import android.util.Log; import android.util.Log;
import android.webkit.WebView; 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 { public class IntentUtils {
private Activity mActivity; private Activity mActivity;
private BrowserController mController; private BrowserController mController;
static final Pattern ACCEPTED_URI_SCHEMA = Pattern.compile("(?i)" static final Pattern ACCEPTED_URI_SCHEMA = Pattern.compile("(?i)"
+ // switch on case insensitive matching + // switch on case insensitive matching
"(" "("
@ -72,8 +74,7 @@ public class IntentUtils {
} }
/** /**
* Search for intent handlers that are specific to this URL aka, specialized * Search for intent handlers that are specific to this URL aka, specialized apps like google maps or youtube
* apps like google maps or youtube
*/ */
private boolean isSpecializedHandlerAvailable(Intent intent) { private boolean isSpecializedHandlerAvailable(Intent intent) {
PackageManager pm = mActivity.getPackageManager(); PackageManager pm = mActivity.getPackageManager();
@ -89,6 +90,10 @@ public class IntentUtils {
// Error on the side of staying in the browser, ignore // Error on the side of staying in the browser, ignore
continue; 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 if (filter.countDataAuthorities() == 0
|| filter.countDataPaths() == 0) { || filter.countDataPaths() == 0) {
// Generic handler, skip // Generic handler, skip

19
src/acr/browser/lightning/LicenseActivity.java

@ -31,15 +31,15 @@ public class LicenseActivity extends Activity implements View.OnClickListener {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
switch (v.getId()) { switch (v.getId()) {
case R.id.browserLicense: case R.id.browserLicense:
actionView("http://www.mozilla.org/MPL/2.0/"); actionView("http://www.mozilla.org/MPL/2.0/");
break; break;
case R.id.licenseAOSP: case R.id.licenseAOSP:
actionView("http://www.apache.org/licenses/LICENSE-2.0"); actionView("http://www.apache.org/licenses/LICENSE-2.0");
break; break;
case R.id.licenseHosts: case R.id.licenseHosts:
actionView("http://hosts-file.net/"); actionView("http://hosts-file.net/");
break; break;
} }
} }
@ -54,5 +54,4 @@ public class LicenseActivity extends Activity implements View.OnClickListener {
finish(); finish();
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
} }

19
src/acr/browser/lightning/LightningDownloadListener.java

@ -11,8 +11,10 @@ import android.webkit.DownloadListener;
import android.webkit.URLUtil; import android.webkit.URLUtil;
public class LightningDownloadListener implements DownloadListener { public class LightningDownloadListener implements DownloadListener {
private Activity mActivity; private Activity mActivity;
LightningDownloadListener(Activity activity){
LightningDownloadListener(Activity activity) {
mActivity = activity; mActivity = activity;
} }
@ -26,13 +28,12 @@ public class LightningDownloadListener implements DownloadListener {
@Override @Override
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
switch (which) { switch (which) {
case DialogInterface.BUTTON_POSITIVE: { case DialogInterface.BUTTON_POSITIVE:
DownloadHandler.onDownloadStart(mActivity, url, userAgent, contentDisposition, mimetype, false); DownloadHandler.onDownloadStart(mActivity, url, userAgent, contentDisposition, mimetype, false);
break; break;
}
case DialogInterface.BUTTON_NEGATIVE: { case DialogInterface.BUTTON_NEGATIVE:
break; break;
}
} }
} }
}; };
@ -47,6 +48,4 @@ public class LightningDownloadListener implements DownloadListener {
Log.i(Constants.TAG, "Downloading" + fileName); Log.i(Constants.TAG, "Downloading" + fileName);
} }
} }

347
src/acr/browser/lightning/LightningView.java

@ -4,28 +4,10 @@
package acr.browser.lightning; 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.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.ActivityNotFoundException; import android.content.*;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.net.MailTo; import android.net.MailTo;
@ -33,7 +15,6 @@ import android.net.Uri;
import android.net.http.SslError; import android.net.http.SslError;
import android.os.Message; import android.os.Message;
import android.text.InputType; import android.text.InputType;
import android.text.TextUtils;
import android.text.method.PasswordTransformationMethod; import android.text.method.PasswordTransformationMethod;
import android.util.Log; import android.util.Log;
import android.view.GestureDetector; import android.view.GestureDetector;
@ -42,39 +23,50 @@ import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.View.OnTouchListener; import android.view.View.OnTouchListener;
import android.webkit.CookieManager; import android.webkit.CookieManager;
import android.webkit.GeolocationPermissions; import android.webkit.*;
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.WebSettings.LayoutAlgorithm; import android.webkit.WebSettings.LayoutAlgorithm;
import android.webkit.WebSettings.PluginState; import android.webkit.WebSettings.PluginState;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText; import android.widget.EditText;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.VideoView; import android.widget.VideoView;
import org.apache.http.util.ByteArrayBuffer;
import java.io.*;
import java.net.*;
public class LightningView { public class LightningView {
private Title mTitle; private Title mTitle;
private WebView mWebView; private WebView mWebView;
private BrowserController mBrowserController; private BrowserController mBrowserController;
private GestureDetector mGestureDetector; private GestureDetector mGestureDetector;
private Activity mActivity; private Activity mActivity;
private WebSettings mSettings; private WebSettings mSettings;
private static int API = android.os.Build.VERSION.SDK_INT; private static int API = android.os.Build.VERSION.SDK_INT;
private static String mHomepage; private static String mHomepage;
private static String mDefaultUserAgent; private static String mDefaultUserAgent;
private static Bitmap mWebpageBitmap; private static Bitmap mWebpageBitmap;
private static SharedPreferences mPreferences; private static SharedPreferences mPreferences;
private static boolean mWideViewPort; private static boolean mWideViewPort;
private static AdBlock mAdBlock; private static AdBlock mAdBlock;
private CookieManager mCookieManager; private CookieManager mCookieManager;
private boolean isForgroundTab = false; private boolean isForgroundTab = false;
private IntentUtils mIntentUtils = null; private IntentUtils mIntentUtils = null;
@SuppressLint("NewApi") @SuppressLint("NewApi")
@ -122,7 +114,9 @@ public class LightningView {
mWebView.setOnTouchListener(new OnTouchListener() { mWebView.setOnTouchListener(new OnTouchListener() {
float mLocation = 0; float mLocation = 0;
float mY = 0; float mY = 0;
int mAction = 0; int mAction = 0;
@Override @Override
@ -172,85 +166,85 @@ public class LightningView {
String home = ""; String home = "";
home = HomepageVariables.HEAD; home = HomepageVariables.HEAD;
switch (mPreferences.getInt(PreferenceConstants.SEARCH, 1)) { switch (mPreferences.getInt(PreferenceConstants.SEARCH, 1)) {
case 0: case 0:
// CUSTOM SEARCH // CUSTOM SEARCH
home = home + "file:///android_asset/lightning.png"; home = home + "file:///android_asset/lightning.png";
home = home + HomepageVariables.MIDDLE; home = home + HomepageVariables.MIDDLE;
home = home home = home
+ mPreferences.getString(PreferenceConstants.SEARCH_URL, + mPreferences.getString(PreferenceConstants.SEARCH_URL,
Constants.GOOGLE_SEARCH); Constants.GOOGLE_SEARCH);
break; break;
case 1: case 1:
// GOOGLE_SEARCH; // GOOGLE_SEARCH;
home = home + "file:///android_asset/google.png"; home = home + "file:///android_asset/google.png";
// + "https://www.google.com/images/srpr/logo11w.png"; // + "https://www.google.com/images/srpr/logo11w.png";
home = home + HomepageVariables.MIDDLE; home = home + HomepageVariables.MIDDLE;
home = home + Constants.GOOGLE_SEARCH; home = home + Constants.GOOGLE_SEARCH;
break; break;
case 2: case 2:
// ANDROID SEARCH; // ANDROID SEARCH;
home = home + "file:///android_asset/lightning.png"; home = home + "file:///android_asset/lightning.png";
home = home + HomepageVariables.MIDDLE; home = home + HomepageVariables.MIDDLE;
home = home + Constants.ANDROID_SEARCH; home = home + Constants.ANDROID_SEARCH;
break; break;
case 3: case 3:
// BING_SEARCH; // BING_SEARCH;
home = home + "file:///android_asset/bing.png"; 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"; // "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 + HomepageVariables.MIDDLE;
home = home + Constants.BING_SEARCH; home = home + Constants.BING_SEARCH;
break; break;
case 4: case 4:
// YAHOO_SEARCH; // YAHOO_SEARCH;
home = home + "file:///android_asset/yahoo.png"; 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"; // "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 + HomepageVariables.MIDDLE;
home = home + Constants.YAHOO_SEARCH; home = home + Constants.YAHOO_SEARCH;
break; break;
case 5: case 5:
// STARTPAGE_SEARCH; // STARTPAGE_SEARCH;
home = home + "file:///android_asset/startpage.png"; home = home + "file:///android_asset/startpage.png";
// + "https://startpage.com/graphics/startp_logo.gif"; // + "https://startpage.com/graphics/startp_logo.gif";
home = home + HomepageVariables.MIDDLE; home = home + HomepageVariables.MIDDLE;
home = home + Constants.STARTPAGE_SEARCH; home = home + Constants.STARTPAGE_SEARCH;
break; break;
case 6: case 6:
// STARTPAGE_MOBILE // STARTPAGE_MOBILE
home = home + "file:///android_asset/startpage.png"; home = home + "file:///android_asset/startpage.png";
// + "https://startpage.com/graphics/startp_logo.gif"; // + "https://startpage.com/graphics/startp_logo.gif";
home = home + HomepageVariables.MIDDLE; home = home + HomepageVariables.MIDDLE;
home = home + Constants.STARTPAGE_MOBILE_SEARCH; home = home + Constants.STARTPAGE_MOBILE_SEARCH;
case 7: case 7:
// DUCK_SEARCH; // DUCK_SEARCH;
home = home + "file:///android_asset/duckduckgo.png"; home = home + "file:///android_asset/duckduckgo.png";
// + "https://duckduckgo.com/assets/logo_homepage.normal.v101.png"; // + "https://duckduckgo.com/assets/logo_homepage.normal.v101.png";
home = home + HomepageVariables.MIDDLE; home = home + HomepageVariables.MIDDLE;
home = home + Constants.DUCK_SEARCH; home = home + Constants.DUCK_SEARCH;
break; break;
case 8: case 8:
// DUCK_LITE_SEARCH; // DUCK_LITE_SEARCH;
home = home + "file:///android_asset/duckduckgo.png"; home = home + "file:///android_asset/duckduckgo.png";
// + "https://duckduckgo.com/assets/logo_homepage.normal.v101.png"; // + "https://duckduckgo.com/assets/logo_homepage.normal.v101.png";
home = home + HomepageVariables.MIDDLE; home = home + HomepageVariables.MIDDLE;
home = home + Constants.DUCK_LITE_SEARCH; home = home + Constants.DUCK_LITE_SEARCH;
break; break;
case 9: case 9:
// BAIDU_SEARCH; // BAIDU_SEARCH;
home = home + "file:///android_asset/baidu.png"; home = home + "file:///android_asset/baidu.png";
// + "http://www.baidu.com/img/bdlogo.gif"; // + "http://www.baidu.com/img/bdlogo.gif";
home = home + HomepageVariables.MIDDLE; home = home + HomepageVariables.MIDDLE;
home = home + Constants.BAIDU_SEARCH; home = home + Constants.BAIDU_SEARCH;
break; break;
case 10: case 10:
// YANDEX_SEARCH; // YANDEX_SEARCH;
home = home + "file:///android_asset/yandex.png"; home = home + "file:///android_asset/yandex.png";
// + // +
// "http://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Yandex.svg/600px-Yandex.svg.png"; // "http://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Yandex.svg/600px-Yandex.svg.png";
home = home + HomepageVariables.MIDDLE; home = home + HomepageVariables.MIDDLE;
home = home + Constants.YANDEX_SEARCH; home = home + Constants.YANDEX_SEARCH;
break; break;
} }
@ -285,40 +279,39 @@ public class LightningView {
if (API < 19) { if (API < 19) {
switch (mPreferences.getInt( switch (mPreferences.getInt(
PreferenceConstants.ADOBE_FLASH_SUPPORT, 0)) { PreferenceConstants.ADOBE_FLASH_SUPPORT, 0)) {
case 0: case 0:
mSettings.setPluginState(PluginState.OFF); mSettings.setPluginState(PluginState.OFF);
break; break;
case 1: { case 1:
mSettings.setPluginState(PluginState.ON_DEMAND); mSettings.setPluginState(PluginState.ON_DEMAND);
break; break;
} case 2:
case 2: { mSettings.setPluginState(PluginState.ON);
mSettings.setPluginState(PluginState.ON); break;
break; default:
} break;
default:
break;
} }
} }
switch (mPreferences.getInt(PreferenceConstants.USER_AGENT, 1)) { switch (mPreferences.getInt(PreferenceConstants.USER_AGENT, 1)) {
case 1: case 1:
if (API > 16) if (API > 16) {
mSettings.setUserAgentString(WebSettings mSettings.setUserAgentString(WebSettings
.getDefaultUserAgent(context)); .getDefaultUserAgent(context));
else } else {
mSettings.setUserAgentString(mDefaultUserAgent); mSettings.setUserAgentString(mDefaultUserAgent);
break; }
case 2: break;
mSettings.setUserAgentString(Constants.DESKTOP_USER_AGENT); case 2:
break; mSettings.setUserAgentString(Constants.DESKTOP_USER_AGENT);
case 3: break;
mSettings.setUserAgentString(Constants.MOBILE_USER_AGENT); case 3:
break; mSettings.setUserAgentString(Constants.MOBILE_USER_AGENT);
case 4: break;
mSettings.setUserAgentString(mPreferences.getString( case 4:
PreferenceConstants.USER_AGENT_STRING, mDefaultUserAgent)); mSettings.setUserAgentString(mPreferences.getString(
break; PreferenceConstants.USER_AGENT_STRING, mDefaultUserAgent));
break;
} }
if (mPreferences.getBoolean(PreferenceConstants.SAVE_PASSWORDS, false)) { if (mPreferences.getBoolean(PreferenceConstants.SAVE_PASSWORDS, false)) {
@ -350,25 +343,25 @@ public class LightningView {
mSettings.setLoadWithOverviewMode(mPreferences.getBoolean( mSettings.setLoadWithOverviewMode(mPreferences.getBoolean(
PreferenceConstants.OVERVIEW_MODE, true)); PreferenceConstants.OVERVIEW_MODE, true));
switch (mPreferences.getInt(PreferenceConstants.TEXT_SIZE, 3)) { switch (mPreferences.getInt(PreferenceConstants.TEXT_SIZE, 3)) {
case 1: case 1:
mSettings.setTextZoom(200); mSettings.setTextZoom(200);
break; break;
case 2: case 2:
mSettings.setTextZoom(150); mSettings.setTextZoom(150);
break; break;
case 3: case 3:
mSettings.setTextZoom(100); mSettings.setTextZoom(100);
break; break;
case 4: case 4:
mSettings.setTextZoom(75); mSettings.setTextZoom(75);
break; break;
case 5: case 5:
mSettings.setTextZoom(50); mSettings.setTextZoom(50);
break; break;
} }
} }
@SuppressLint({ "SetJavaScriptEnabled", "NewApi" }) @SuppressLint({"SetJavaScriptEnabled", "NewApi"})
public void initializeSettings(WebSettings settings, Context context) { public void initializeSettings(WebSettings settings, Context context) {
if (API < 18) { if (API < 18) {
settings.setAppCacheMaxSize(Long.MAX_VALUE); settings.setAppCacheMaxSize(Long.MAX_VALUE);
@ -403,20 +396,23 @@ public class LightningView {
} }
public boolean isShown() { public boolean isShown() {
if (mWebView != null) if (mWebView != null) {
return mWebView.isShown(); return mWebView.isShown();
else } else {
return false; return false;
}
} }
public synchronized void onPause() { public synchronized void onPause() {
if (mWebView != null) if (mWebView != null) {
mWebView.onPause(); mWebView.onPause();
}
} }
public synchronized void onResume() { public synchronized void onResume() {
if (mWebView != null) if (mWebView != null) {
mWebView.onResume(); mWebView.onResume();
}
} }
public void setIsForgroundTab(boolean isForground) { public void setIsForgroundTab(boolean isForground) {
@ -456,8 +452,9 @@ public class LightningView {
public void requestFocus() { public void requestFocus() {
if (mWebView != null) { if (mWebView != null) {
if (!mWebView.hasFocus()) if (!mWebView.hasFocus()) {
mWebView.requestFocus(); mWebView.requestFocus();
}
} }
} }
@ -508,8 +505,9 @@ public class LightningView {
} }
public synchronized void goBack() { public synchronized void goBack() {
if (mWebView != null) if (mWebView != null) {
mWebView.goBack(); mWebView.goBack();
}
} }
public String getUserAgent() { public String getUserAgent() {
@ -521,8 +519,9 @@ public class LightningView {
} }
public synchronized void goForward() { public synchronized void goForward() {
if (mWebView != null) if (mWebView != null) {
mWebView.goForward(); mWebView.goForward();
}
} }
public boolean canGoBack() { public boolean canGoBack() {
@ -550,13 +549,15 @@ public class LightningView {
} }
public synchronized void loadUrl(String url) { public synchronized void loadUrl(String url) {
if (mWebView != null) if (mWebView != null) {
mWebView.loadUrl(url); mWebView.loadUrl(url);
}
} }
public synchronized void invalidate() { public synchronized void invalidate() {
if (mWebView != null) if (mWebView != null) {
mWebView.invalidate(); mWebView.invalidate();
}
} }
public String getTitle() { public String getTitle() {
@ -564,10 +565,11 @@ public class LightningView {
} }
public String getUrl() { public String getUrl() {
if (mWebView != null) if (mWebView != null) {
return mWebView.getUrl(); return mWebView.getUrl();
else } else {
return ""; return "";
}
} }
public class LightningWebClient extends WebViewClient { public class LightningWebClient extends WebViewClient {
@ -593,11 +595,13 @@ public class LightningView {
PreferenceConstants.USE_PROXY, false); PreferenceConstants.USE_PROXY, false);
boolean mDoLeakHardening = false; boolean mDoLeakHardening = false;
if (!useProxy) if (!useProxy) {
return null; return null;
}
if (!mDoLeakHardening) if (!mDoLeakHardening) {
return null; return null;
}
// now we are going to proxy! // now we are going to proxy!
try { try {
@ -636,13 +640,15 @@ public class LightningView {
if (cEnc == null && ctArray.length > 1) { if (cEnc == null && ctArray.length > 1) {
cEnc = ctArray[1]; cEnc = ctArray[1];
if (cEnc.indexOf('=') != -1) if (cEnc.indexOf('=') != -1) {
cEnc = cEnc.split("=")[1].trim(); cEnc = cEnc.split("=")[1].trim();
}
} }
} }
if (connLen <= 0) if (connLen <= 0) {
connLen = 2048; connLen = 2048;
}
if (cType != null && cType.startsWith("text")) { if (cType != null && cType.startsWith("text")) {
InputStream fStream = null; InputStream fStream = null;
@ -1043,8 +1049,11 @@ public class LightningView {
} }
public class Title { public class Title {
private Bitmap mFavicon; private Bitmap mFavicon;
private String mTitle; private String mTitle;
private Bitmap mDefaultIcon; private Bitmap mDefaultIcon;
public Title(Context context) { public Title(Context context) {

4
src/acr/browser/lightning/MainActivity.java

@ -10,6 +10,7 @@ import android.webkit.CookieSyncManager;
public class MainActivity extends BrowserActivity { public class MainActivity extends BrowserActivity {
SharedPreferences mPreferences; SharedPreferences mPreferences;
CookieManager mCookieManager; CookieManager mCookieManager;
@Override @Override
@ -72,7 +73,4 @@ public class MainActivity extends BrowserActivity {
closeDrawers(); closeDrawers();
moveTaskToBack(true); moveTaskToBack(true);
} }
} }

32
src/acr/browser/lightning/PreferenceConstants.java

@ -4,38 +4,70 @@
package acr.browser.lightning; package acr.browser.lightning;
public class PreferenceConstants { public class PreferenceConstants {
public static final String ADOBE_FLASH_SUPPORT = "enableflash"; public static final String ADOBE_FLASH_SUPPORT = "enableflash";
public static final String BLOCK_ADS = "AdBlock"; public static final String BLOCK_ADS = "AdBlock";
public static final String BLOCK_IMAGES = "blockimages"; public static final String BLOCK_IMAGES = "blockimages";
public static final String CLEAR_CACHE_EXIT = "cache"; public static final String CLEAR_CACHE_EXIT = "cache";
public static final String COOKIES = "cookies"; public static final String COOKIES = "cookies";
public static final String DOWNLOAD_DIRECTORY = "download"; public static final String DOWNLOAD_DIRECTORY = "download";
public static final String FULL_SCREEN = "fullscreen"; public static final String FULL_SCREEN = "fullscreen";
public static final String HIDE_STATUS_BAR = "hidestatus"; public static final String HIDE_STATUS_BAR = "hidestatus";
public static final String HOMEPAGE = "home"; public static final String HOMEPAGE = "home";
public static final String INCOGNITO_COOKIES = "incognitocookies"; public static final String INCOGNITO_COOKIES = "incognitocookies";
public static final String JAVASCRIPT = "java"; public static final String JAVASCRIPT = "java";
public static final String LOCATION = "location"; public static final String LOCATION = "location";
public static final String OVERVIEW_MODE = "overviewmode"; public static final String OVERVIEW_MODE = "overviewmode";
public static final String POPUPS = "newwindows"; public static final String POPUPS = "newwindows";
public static final String PREFERENCES = "settings"; public static final String PREFERENCES = "settings";
public static final String RESTORE_LOST_TABS = "restoreclosed"; public static final String RESTORE_LOST_TABS = "restoreclosed";
public static final String SAVE_PASSWORDS = "passwords"; public static final String SAVE_PASSWORDS = "passwords";
public static final String SEARCH = "search"; public static final String SEARCH = "search";
public static final String SEARCH_URL = "searchurl"; public static final String SEARCH_URL = "searchurl";
public static final String SYSTEM_BROWSER_PRESENT = "SystemBrowser"; public static final String SYSTEM_BROWSER_PRESENT = "SystemBrowser";
public static final String TEXT_REFLOW = "textreflow"; public static final String TEXT_REFLOW = "textreflow";
public static final String TEXT_SIZE = "textsize"; public static final String TEXT_SIZE = "textsize";
public static final String URL_MEMORY = "memory"; public static final String URL_MEMORY = "memory";
public static final String USE_WIDE_VIEWPORT = "wideviewport"; public static final String USE_WIDE_VIEWPORT = "wideviewport";
public static final String USER_AGENT = "agentchoose"; public static final String USER_AGENT = "agentchoose";
public static final String USER_AGENT_STRING = "userAgentString"; public static final String USER_AGENT_STRING = "userAgentString";
public static final String GOOGLE_SEARCH_SUGGESTIONS = "GoogleSearchSuggestions"; public static final String GOOGLE_SEARCH_SUGGESTIONS = "GoogleSearchSuggestions";
public static final String CLEAR_HISTORY_EXIT = "clearHistoryExit"; public static final String CLEAR_HISTORY_EXIT = "clearHistoryExit";
public static final String CLEAR_COOKIES_EXIT = "clearCookiesExit"; public static final String CLEAR_COOKIES_EXIT = "clearCookiesExit";
public static final String USE_PROXY = "useProxy"; public static final String USE_PROXY = "useProxy";
public static final String USE_PROXY_HOST = "useProxyHost"; public static final String USE_PROXY_HOST = "useProxyHost";
public static final String USE_PROXY_PORT = "useProxyPort"; public static final String USE_PROXY_PORT = "useProxyPort";
public static final String INITIAL_CHECK_FOR_TOR = "checkForTor"; public static final String INITIAL_CHECK_FOR_TOR = "checkForTor";
} }

156
src/acr/browser/lightning/ReplacingInputStream.java

@ -8,84 +8,92 @@ import java.util.LinkedList;
public class ReplacingInputStream extends FilterInputStream { public class ReplacingInputStream extends FilterInputStream {
LinkedList<Integer> inQueue = new LinkedList<Integer>(); LinkedList<Integer> inQueue = new LinkedList<Integer>();
LinkedList<Integer> outQueue = new LinkedList<Integer>();
final byte[] search, replacement; LinkedList<Integer> outQueue = new LinkedList<Integer>();
protected ReplacingInputStream(InputStream in, byte[] search, final byte[] search, replacement;
byte[] replacement) {
super(in); protected ReplacingInputStream(InputStream in, byte[] search,
this.search = search; byte[] replacement) {
this.replacement = replacement; super(in);
} this.search = search;
this.replacement = replacement;
private boolean isMatchFound() { }
Iterator<Integer> inIter = inQueue.iterator();
for (int i = 0; i < search.length; i++) private boolean isMatchFound() {
if (!inIter.hasNext() || search[i] != inIter.next()) Iterator<Integer> inIter = inQueue.iterator();
return false; for (int i = 0; i < search.length; i++) {
return true; if (!inIter.hasNext() || search[i] != inIter.next()) {
} return false;
}
private void readAhead() throws IOException { }
// Work up some look-ahead. return true;
while (inQueue.size() < search.length) { }
int next = super.read();
inQueue.offer(next); private void readAhead() throws IOException {
if (next == -1) // Work up some look-ahead.
break; 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;
}
@Override @Override
public int read(byte[] buffer) throws IOException { public int read() throws IOException {
return read(buffer, 0, buffer.length); // 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);
}
} }

94
src/acr/browser/lightning/SearchAdapter.java

@ -1,19 +1,5 @@
package acr.browser.lightning; 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.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
@ -24,23 +10,41 @@ import android.os.AsyncTask;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.BaseAdapter; import android.widget.*;
import android.widget.Filter; import org.xmlpull.v1.XmlPullParser;
import android.widget.Filterable; import org.xmlpull.v1.XmlPullParserException;
import android.widget.ImageView; import org.xmlpull.v1.XmlPullParserFactory;
import android.widget.TextView;
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 { public class SearchAdapter extends BaseAdapter implements Filterable {
private List<HistoryItem> mHistory; private List<HistoryItem> mHistory;
private List<HistoryItem> mBookmarks; private List<HistoryItem> mBookmarks;
private List<HistoryItem> mSuggestions; private List<HistoryItem> mSuggestions;
private List<HistoryItem> mFilteredList; private List<HistoryItem> mFilteredList;
private List<HistoryItem> mAllBookmarks; private List<HistoryItem> mAllBookmarks;
private DatabaseHandler mDatabaseHandler; private DatabaseHandler mDatabaseHandler;
private SharedPreferences mPreferences; private SharedPreferences mPreferences;
private boolean mUseGoogle = true; private boolean mUseGoogle = true;
private Context mContext; private Context mContext;
private boolean mIncognito = false; private boolean mIncognito = false;
public SearchAdapter(Context context, boolean incognito) { public SearchAdapter(Context context, boolean incognito) {
@ -114,33 +118,33 @@ public class SearchAdapter extends BaseAdapter implements Filterable {
int imageId = R.drawable.ic_bookmark; int imageId = R.drawable.ic_bookmark;
switch (web.getImageId()) { switch (web.getImageId()) {
case R.drawable.ic_bookmark: { case R.drawable.ic_bookmark: {
if (!mIncognito) { if (!mIncognito) {
imageId = R.drawable.ic_bookmark; imageId = R.drawable.ic_bookmark;
} else { } else {
holder.mTitle.setTextColor(Color.WHITE); holder.mTitle.setTextColor(Color.WHITE);
imageId = R.drawable.ic_bookmark_dark; imageId = R.drawable.ic_bookmark_dark;
}
break;
} }
break; case R.drawable.ic_search: {
} if (!mIncognito) {
case R.drawable.ic_search: { imageId = R.drawable.ic_search;
if (!mIncognito) { } else {
imageId = R.drawable.ic_search; holder.mTitle.setTextColor(Color.WHITE);
} else { imageId = R.drawable.ic_search_dark;
holder.mTitle.setTextColor(Color.WHITE); }
imageId = R.drawable.ic_search_dark; break;
} }
break; case R.drawable.ic_history: {
} if (!mIncognito) {
case R.drawable.ic_history: { imageId = R.drawable.ic_history;
if (!mIncognito) { } else {
imageId = R.drawable.ic_history; holder.mTitle.setTextColor(Color.WHITE);
} else { imageId = R.drawable.ic_history_dark;
holder.mTitle.setTextColor(Color.WHITE); }
imageId = R.drawable.ic_history_dark; break;
} }
break;
}
} }
holder.mImage.setImageDrawable(mContext.getResources().getDrawable( holder.mImage.setImageDrawable(mContext.getResources().getDrawable(
@ -235,8 +239,11 @@ public class SearchAdapter extends BaseAdapter implements Filterable {
} }
private class SuggestionHolder { private class SuggestionHolder {
ImageView mImage; ImageView mImage;
TextView mTitle; TextView mTitle;
TextView mUrl; TextView mUrl;
} }
@ -389,5 +396,4 @@ public class SearchAdapter extends BaseAdapter implements Filterable {
return filteredList; return filteredList;
} }
} }

393
src/acr/browser/lightning/SettingsActivity.java

@ -3,11 +3,8 @@
*/ */
package acr.browser.lightning; 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.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.Context; import android.content.Context;
@ -20,36 +17,45 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Color; import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log; import android.util.Log;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.widget.CheckBox; import android.view.WindowManager;
import android.widget.CompoundButton; import android.widget.*;
import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText; import info.guardianproject.onionkit.ui.OrbotHelper;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.Switch;
import android.widget.TextView;
public class SettingsActivity extends Activity { public class SettingsActivity extends Activity {
private static int API = android.os.Build.VERSION.SDK_INT; private static int API = android.os.Build.VERSION.SDK_INT;
private static SharedPreferences.Editor mEditPrefs;
private static int mAgentChoice; private SharedPreferences.Editor mEditPrefs;
private static String mHomepage;
private static TextView mAgentTextView; private int mAgentChoice;
private static TextView mDownloadTextView;
private static int mEasterEggCounter = 0; private String mHomepage;
private static String mSearchUrl;
private static String mDownloadLocation; private TextView mAgentTextView;
private static TextView mHomepageText;
private static SharedPreferences mPreferences; private TextView mDownloadTextView;
private static TextView mSearchText;
private int mEasterEggCounter;
private String mDownloadLocation;
private TextView mHomepageText;
private SharedPreferences mPreferences;
private TextView mSearchText;
private Context mContext; private Context mContext;
private Activity mActivity; private Activity mActivity;
@Override @Override
@ -70,8 +76,12 @@ public class SettingsActivity extends Activity {
@SuppressLint("NewApi") @SuppressLint("NewApi")
public void init() { public void init() {
// mPreferences storage // mPreferences storage
getActionBar().setHomeButtonEnabled(true); ActionBar actionBar = getActionBar();
getActionBar().setDisplayHomeAsUpEnabled(true); if (actionBar != null) {
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
}
mPreferences = getSharedPreferences(PreferenceConstants.PREFERENCES, 0); mPreferences = getSharedPreferences(PreferenceConstants.PREFERENCES, 0);
if (mPreferences.getBoolean(PreferenceConstants.HIDE_STATUS_BAR, false)) { if (mPreferences.getBoolean(PreferenceConstants.HIDE_STATUS_BAR, false)) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
@ -90,38 +100,38 @@ public class SettingsActivity extends Activity {
mSearchText = (TextView) findViewById(R.id.searchText); mSearchText = (TextView) findViewById(R.id.searchText);
switch (mPreferences.getInt(PreferenceConstants.SEARCH, 1)) { switch (mPreferences.getInt(PreferenceConstants.SEARCH, 1)) {
case 0: case 0:
mSearchText.setText(getResources().getString(R.string.custom_url)); mSearchText.setText(getResources().getString(R.string.custom_url));
break; break;
case 1: case 1:
mSearchText.setText("Google"); mSearchText.setText("Google");
break; break;
case 2: case 2:
mSearchText.setText("Android Search"); mSearchText.setText("Android Search");
break; break;
case 3: case 3:
mSearchText.setText("Bing"); mSearchText.setText("Bing");
break; break;
case 4: case 4:
mSearchText.setText("Yahoo"); mSearchText.setText("Yahoo");
break; break;
case 5: case 5:
mSearchText.setText("StartPage"); mSearchText.setText("StartPage");
break; break;
case 6: case 6:
mSearchText.setText("StartPage (Mobile)"); mSearchText.setText("StartPage (Mobile)");
break; break;
case 7: case 7:
mSearchText.setText("DuckDuckGo"); mSearchText.setText("DuckDuckGo");
break; break;
case 8: case 8:
mSearchText.setText("DuckDuckGo Lite"); mSearchText.setText("DuckDuckGo Lite");
break; break;
case 9: case 9:
mSearchText.setText("Baidu"); mSearchText.setText("Baidu");
break; break;
case 10: case 10:
mSearchText.setText("Yandex"); mSearchText.setText("Yandex");
} }
mAgentTextView = (TextView) findViewById(R.id.agentText); mAgentTextView = (TextView) findViewById(R.id.agentText);
@ -144,7 +154,7 @@ public class SettingsActivity extends Activity {
PreferenceConstants.DOWNLOAD_DIRECTORY, PreferenceConstants.DOWNLOAD_DIRECTORY,
Environment.DIRECTORY_DOWNLOADS); Environment.DIRECTORY_DOWNLOADS);
mDownloadTextView.setText(Constants.EXTERNAL_STORAGE + "/" mDownloadTextView.setText(Constants.EXTERNAL_STORAGE + '/'
+ mDownloadLocation); + mDownloadLocation);
String code = "HOLO"; String code = "HOLO";
@ -154,7 +164,7 @@ public class SettingsActivity extends Activity {
getPackageName(), 0); getPackageName(), 0);
code = p.versionName; code = p.versionName;
} catch (NameNotFoundException e) { } catch (NameNotFoundException e) {
// TODO Auto-generated catch block // TODO add logging
e.printStackTrace(); e.printStackTrace();
} }
@ -175,21 +185,21 @@ public class SettingsActivity extends Activity {
} }
switch (mAgentChoice) { switch (mAgentChoice) {
case 1: case 1:
mAgentTextView.setText(getResources().getString( mAgentTextView.setText(getResources().getString(
R.string.agent_default)); R.string.agent_default));
break; break;
case 2: case 2:
mAgentTextView.setText(getResources().getString( mAgentTextView.setText(getResources().getString(
R.string.agent_desktop)); R.string.agent_desktop));
break; break;
case 3: case 3:
mAgentTextView.setText(getResources().getString( mAgentTextView.setText(getResources().getString(
R.string.agent_mobile)); R.string.agent_mobile));
break; break;
case 4: case 4:
mAgentTextView.setText(getResources().getString( mAgentTextView.setText(getResources().getString(
R.string.agent_custom)); R.string.agent_custom));
} }
RelativeLayout r1, r2, r3, r4, r5, licenses; RelativeLayout r1, r2, r3, r4, r5, licenses;
r1 = (RelativeLayout) findViewById(R.id.setR1); r1 = (RelativeLayout) findViewById(R.id.setR1);
@ -268,7 +278,7 @@ public class SettingsActivity extends Activity {
"Google", "Android Search", "Bing", "Yahoo", "Google", "Android Search", "Bing", "Yahoo",
"StartPage", "StartPage (Mobile)", "StartPage", "StartPage (Mobile)",
"DuckDuckGo (Privacy)", "DuckDuckGo Lite (Privacy)", "DuckDuckGo (Privacy)", "DuckDuckGo Lite (Privacy)",
"Baidu (Chinese)", "Yandex (Russian)" }; "Baidu (Chinese)", "Yandex (Russian)"};
int n = mPreferences.getInt(PreferenceConstants.SEARCH, 1); int n = mPreferences.getInt(PreferenceConstants.SEARCH, 1);
@ -282,38 +292,38 @@ public class SettingsActivity extends Activity {
which); which);
mEditPrefs.commit(); mEditPrefs.commit();
switch (which) { switch (which) {
case 0: case 0:
searchUrlPicker(); searchUrlPicker();
break; break;
case 1: case 1:
mSearchText.setText("Google"); mSearchText.setText("Google");
break; break;
case 2: case 2:
mSearchText.setText("Android Search"); mSearchText.setText("Android Search");
break; break;
case 3: case 3:
mSearchText.setText("Bing"); mSearchText.setText("Bing");
break; break;
case 4: case 4:
mSearchText.setText("Yahoo"); mSearchText.setText("Yahoo");
break; break;
case 5: case 5:
mSearchText.setText("StartPage"); mSearchText.setText("StartPage");
break; break;
case 6: case 6:
mSearchText.setText("StartPage (Mobile)"); mSearchText.setText("StartPage (Mobile)");
break; break;
case 7: case 7:
mSearchText.setText("DuckDuckGo"); mSearchText.setText("DuckDuckGo");
break; break;
case 8: case 8:
mSearchText.setText("DuckDuckGo Lite"); mSearchText.setText("DuckDuckGo Lite");
break; break;
case 9: case 9:
mSearchText.setText("Baidu"); mSearchText.setText("Baidu");
break; break;
case 10: case 10:
mSearchText.setText("Yandex"); mSearchText.setText("Yandex");
} }
} }
}); });
@ -334,18 +344,17 @@ public class SettingsActivity extends Activity {
} }
public void searchUrlPicker() { public void searchUrlPicker() {
final AlertDialog.Builder urlPicker = new AlertDialog.Builder( final AlertDialog.Builder urlPicker = new AlertDialog.Builder(this);
SettingsActivity.this);
urlPicker.setTitle(getResources().getString(R.string.custom_url)); 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); Constants.GOOGLE_SEARCH);
getSearchUrl.setText(mSearchUrl); getSearchUrl.setText(mSearchUrl);
urlPicker.setView(getSearchUrl); urlPicker.setView(getSearchUrl);
urlPicker.setPositiveButton(getResources() urlPicker.setPositiveButton(getResources()
.getString(R.string.action_ok), .getString(R.string.action_ok),
new DialogInterface.OnClickListener() { new DialogInterface.OnClickListener() {
@Override @Override
@ -483,8 +492,9 @@ public class SettingsActivity extends Activity {
PackageManager pm = getPackageManager(); PackageManager pm = getPackageManager();
ApplicationInfo ai = pm.getApplicationInfo( ApplicationInfo ai = pm.getApplicationInfo(
"com.adobe.flashplayer", 0); "com.adobe.flashplayer", 0);
if (ai != null) if (ai != null) {
flashInstalled = true; flashInstalled = true;
}
} catch (NameNotFoundException e) { } catch (NameNotFoundException e) {
flashInstalled = false; flashInstalled = false;
} }
@ -570,14 +580,14 @@ public class SettingsActivity extends Activity {
} }
}).setOnCancelListener(new OnCancelListener() { }).setOnCancelListener(new OnCancelListener() {
@Override @Override
public void onCancel(DialogInterface dialog) { public void onCancel(DialogInterface dialog) {
mEditPrefs.putInt( mEditPrefs.putInt(
PreferenceConstants.ADOBE_FLASH_SUPPORT, 0); PreferenceConstants.ADOBE_FLASH_SUPPORT, 0);
mEditPrefs.commit(); mEditPrefs.commit();
} }
}); });
AlertDialog alert = builder.create(); AlertDialog alert = builder.create();
alert.show(); alert.show();
} }
@ -611,8 +621,9 @@ public class SettingsActivity extends Activity {
PackageManager pm = getPackageManager(); PackageManager pm = getPackageManager();
ApplicationInfo ai = pm.getApplicationInfo( ApplicationInfo ai = pm.getApplicationInfo(
"com.adobe.flashplayer", 0); "com.adobe.flashplayer", 0);
if (ai != null) if (ai != null) {
flashInstalled = true; flashInstalled = true;
}
} catch (NameNotFoundException e) { } catch (NameNotFoundException e) {
flashInstalled = false; flashInstalled = false;
} }
@ -674,23 +685,23 @@ public class SettingsActivity extends Activity {
which + 1); which + 1);
mEditPrefs.commit(); mEditPrefs.commit();
switch (which + 1) { switch (which + 1) {
case 1: case 1:
mAgentTextView.setText(getResources() mAgentTextView.setText(getResources()
.getString(R.string.agent_default)); .getString(R.string.agent_default));
break; break;
case 2: case 2:
mAgentTextView.setText(getResources() mAgentTextView.setText(getResources()
.getString(R.string.agent_desktop)); .getString(R.string.agent_desktop));
break; break;
case 3: case 3:
mAgentTextView.setText(getResources() mAgentTextView.setText(getResources()
.getString(R.string.agent_mobile)); .getString(R.string.agent_mobile));
break; break;
case 4: case 4:
mAgentTextView.setText(getResources() mAgentTextView.setText(getResources()
.getString(R.string.agent_custom)); .getString(R.string.agent_custom));
agentPicker(); agentPicker();
break; break;
} }
} }
}); });
@ -728,7 +739,7 @@ public class SettingsActivity extends Activity {
agentStringPicker.setTitle(getResources().getString( agentStringPicker.setTitle(getResources().getString(
R.string.title_user_agent)); R.string.title_user_agent));
final EditText getAgent = new EditText(SettingsActivity.this); final EditText getAgent = new EditText(this);
agentStringPicker.setView(getAgent); agentStringPicker.setView(getAgent);
agentStringPicker.setPositiveButton( agentStringPicker.setPositiveButton(
getResources().getString(R.string.action_ok), getResources().getString(R.string.action_ok),
@ -759,7 +770,7 @@ public class SettingsActivity extends Activity {
mDownloadLocation = mPreferences.getString( mDownloadLocation = mPreferences.getString(
PreferenceConstants.DOWNLOAD_DIRECTORY, PreferenceConstants.DOWNLOAD_DIRECTORY,
Environment.DIRECTORY_DOWNLOADS); Environment.DIRECTORY_DOWNLOADS);
int n = -1; int n;
if (mDownloadLocation.contains(Environment.DIRECTORY_DOWNLOADS)) { if (mDownloadLocation.contains(Environment.DIRECTORY_DOWNLOADS)) {
n = 1; n = 1;
} else { } else {
@ -774,21 +785,21 @@ public class SettingsActivity extends Activity {
int which) { int which) {
switch (which + 1) { switch (which + 1) {
case 1: case 1:
mEditPrefs mEditPrefs
.putString( .putString(
PreferenceConstants.DOWNLOAD_DIRECTORY, PreferenceConstants.DOWNLOAD_DIRECTORY,
Environment.DIRECTORY_DOWNLOADS); Environment.DIRECTORY_DOWNLOADS);
mEditPrefs.commit(); mEditPrefs.commit();
mDownloadTextView mDownloadTextView
.setText(Constants.EXTERNAL_STORAGE .setText(Constants.EXTERNAL_STORAGE
+ "/" + '/'
+ Environment.DIRECTORY_DOWNLOADS); + Environment.DIRECTORY_DOWNLOADS);
break; break;
case 2: case 2:
downPicker(); downPicker();
break; break;
} }
} }
}); });
@ -813,7 +824,7 @@ public class SettingsActivity extends Activity {
mActivity); mActivity);
homePicker.setTitle(getResources().getString( homePicker.setTitle(getResources().getString(
R.string.title_custom_homepage)); R.string.title_custom_homepage));
final EditText getHome = new EditText(SettingsActivity.this); final EditText getHome = new EditText(this);
mHomepage = mPreferences.getString(PreferenceConstants.HOMEPAGE, mHomepage = mPreferences.getString(PreferenceConstants.HOMEPAGE,
Constants.HOMEPAGE); Constants.HOMEPAGE);
if (!mHomepage.startsWith("about:")) { if (!mHomepage.startsWith("about:")) {
@ -845,7 +856,7 @@ public class SettingsActivity extends Activity {
LinearLayout layout = new LinearLayout(this); LinearLayout layout = new LinearLayout(this);
downLocationPicker.setTitle(getResources().getString( downLocationPicker.setTitle(getResources().getString(
R.string.title_download_location)); R.string.title_download_location));
final EditText getDownload = new EditText(SettingsActivity.this); final EditText getDownload = new EditText(this);
getDownload.setBackgroundResource(0); getDownload.setBackgroundResource(0);
mDownloadLocation = mPreferences.getString( mDownloadLocation = mPreferences.getString(
PreferenceConstants.DOWNLOAD_DIRECTORY, PreferenceConstants.DOWNLOAD_DIRECTORY,
@ -864,7 +875,7 @@ public class SettingsActivity extends Activity {
TextView v = new TextView(this); TextView v = new TextView(this);
v.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); v.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
v.setTextColor(Color.DKGRAY); v.setTextColor(Color.DKGRAY);
v.setText(Constants.EXTERNAL_STORAGE + "/"); v.setText(Constants.EXTERNAL_STORAGE + '/');
v.setPadding(padding, padding, 0, padding); v.setPadding(padding, padding, 0, padding);
layout.addView(v); layout.addView(v);
layout.addView(getDownload); layout.addView(getDownload);
@ -887,7 +898,7 @@ public class SettingsActivity extends Activity {
PreferenceConstants.DOWNLOAD_DIRECTORY, text); PreferenceConstants.DOWNLOAD_DIRECTORY, text);
mEditPrefs.commit(); mEditPrefs.commit();
mDownloadTextView.setText(Constants.EXTERNAL_STORAGE mDownloadTextView.setText(Constants.EXTERNAL_STORAGE
+ "/" + text); + '/' + text);
} }
}); });
downLocationPicker.show(); downLocationPicker.show();
@ -902,7 +913,7 @@ public class SettingsActivity extends Activity {
picker.setTitle(getResources().getString(R.string.home)); picker.setTitle(getResources().getString(R.string.home));
mHomepage = mPreferences.getString( mHomepage = mPreferences.getString(
PreferenceConstants.HOMEPAGE, Constants.HOMEPAGE); PreferenceConstants.HOMEPAGE, Constants.HOMEPAGE);
int n = -1; int n;
if (mHomepage.contains("about:home")) { if (mHomepage.contains("about:home")) {
n = 1; n = 1;
} else if (mHomepage.contains("about:blank")) { } else if (mHomepage.contains("about:blank")) {
@ -921,37 +932,37 @@ public class SettingsActivity extends Activity {
int which) { int which) {
switch (which + 1) { switch (which + 1) {
case 1: case 1:
mEditPrefs.putString( mEditPrefs.putString(
PreferenceConstants.HOMEPAGE, PreferenceConstants.HOMEPAGE,
"about:home"); "about:home");
mEditPrefs.commit(); mEditPrefs.commit();
mHomepageText mHomepageText
.setText(getResources().getString( .setText(getResources().getString(
R.string.action_homepage)); R.string.action_homepage));
break; break;
case 2: case 2:
mEditPrefs.putString( mEditPrefs.putString(
PreferenceConstants.HOMEPAGE, PreferenceConstants.HOMEPAGE,
"about:blank"); "about:blank");
mEditPrefs.commit(); mEditPrefs.commit();
mHomepageText.setText(getResources() mHomepageText.setText(getResources()
.getString(R.string.action_blank)); .getString(R.string.action_blank));
break; break;
case 3: case 3:
mEditPrefs.putString( mEditPrefs.putString(
PreferenceConstants.HOMEPAGE, PreferenceConstants.HOMEPAGE,
"about:bookmarks"); "about:bookmarks");
mEditPrefs.commit(); mEditPrefs.commit();
mHomepageText.setText(getResources() mHomepageText.setText(getResources()
.getString( .getString(
R.string.action_bookmarks)); R.string.action_bookmarks));
break; break;
case 4: case 4:
homePicker(); homePicker();
break; break;
} }
} }
}); });

9
src/acr/browser/lightning/SettingsController.java

@ -4,14 +4,12 @@
package acr.browser.lightning; package acr.browser.lightning;
public class SettingsController { public class SettingsController {
static boolean clearHistory = false; static boolean clearHistory = false;
/** /**
* The purpose of this class is so that * The purpose of this class is so that I can clear the dropdown history in the main activities if the user selects
* I can clear the dropdown history in the main * to clear the history from the disk in advanced settings
* activities if the user selects to clear the
* history from the disk in advanced settings
* @param choice
*/ */
static void setClearHistory(boolean choice) { static void setClearHistory(boolean choice) {
clearHistory = choice; clearHistory = choice;
@ -19,7 +17,6 @@ public class SettingsController {
/** /**
* return the choice * return the choice
* @return
*/ */
static boolean getClearHistory() { static boolean getClearHistory() {
if (clearHistory) { if (clearHistory) {

2
src/acr/browser/lightning/SpaceTokenizer.java

@ -40,7 +40,7 @@ public class SpaceTokenizer implements Tokenizer {
@Override @Override
public CharSequence terminateToken(CharSequence text) { public CharSequence terminateToken(CharSequence text) {
//int i = text.length(); //int i = text.length();
if(text.charAt(text.length()-1) != ' '){ if (text.charAt(text.length() - 1) != ' ') {
text = text + " "; text = text + " ";
} }
return text; return text;

39
src/acr/browser/lightning/Utils.java

@ -3,18 +3,6 @@
*/ */
package acr.browser.lightning; 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.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.Context; import android.content.Context;
@ -24,9 +12,16 @@ import android.util.Log;
import android.webkit.URLUtil; import android.webkit.URLUtil;
import android.widget.Toast; 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 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, String fileName = URLUtil.guessFileName(url, null,
null); null);
DownloadHandler.onDownloadStart(activity, url, userAgent, contentDisposition, null, privateBrowsing); DownloadHandler.onDownloadStart(activity, url, userAgent, contentDisposition, null, privateBrowsing);
@ -36,7 +31,7 @@ public class Utils {
public static synchronized void addBookmark(Context context, String title, String url) { public static synchronized void addBookmark(Context context, String title, String url) {
File book = new File(context.getFilesDir(), "bookmarks"); File book = new File(context.getFilesDir(), "bookmarks");
File bookUrl = new File(context.getFilesDir(), "bookurl"); 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; return;
} }
try { try {
@ -75,7 +70,7 @@ public class Utils {
public static Intent newEmailIntent(Context context, String address, public static Intent newEmailIntent(Context context, String address,
String subject, String body, String cc) { String subject, String body, String cc) {
Intent intent = new Intent(Intent.ACTION_SEND); 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_TEXT, body);
intent.putExtra(Intent.EXTRA_SUBJECT, subject); intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_CC, cc); intent.putExtra(Intent.EXTRA_CC, cc);
@ -88,11 +83,12 @@ public class Utils {
AlertDialog.Builder builder = new AlertDialog.Builder(context); AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(title); builder.setTitle(title);
builder.setMessage(message).setCancelable(true) builder.setMessage(message).setCancelable(true)
.setPositiveButton(context.getResources().getString(R.string.action_ok), new DialogInterface.OnClickListener() { .setPositiveButton(context.getResources().getString(R.string.action_ok),
@Override new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) { @Override
} public void onClick(DialogInterface dialog, int id) {
}); }
});
AlertDialog alert = builder.create(); AlertDialog alert = builder.create();
alert.show(); alert.show();
} }
@ -103,9 +99,6 @@ public class Utils {
/** /**
* Returns the number of pixels corresponding to the passed density pixels * Returns the number of pixels corresponding to the passed density pixels
* @param context
* @param densityPixels
* @return
*/ */
public static int convertToDensityPixels(Context context, int densityPixels) { public static int convertToDensityPixels(Context context, int densityPixels) {
float scale = context.getResources().getDisplayMetrics().density; float scale = context.getResources().getDisplayMetrics().density;

310
src/acr/browser/lightning/WebAddress.java

@ -3,167 +3,183 @@
*/ */
package acr.browser.lightning; package acr.browser.lightning;
import static android.util.Patterns.GOOD_IRI_CHAR;
import java.util.Locale; import java.util.Locale;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import static android.util.Patterns.GOOD_IRI_CHAR;
/** /**
* {@hide} * {@hide}
* *
* Web Address Parser * Web Address Parser
* *
* This is called WebAddress, rather than URL or URI, because it * This is called WebAddress, rather than URL or URI, because it attempts to
* attempts to parse the stuff that a user will actually type into a * parse the stuff that a user will actually type into a browser address widget.
* browser address widget.
* *
* Unlike java.net.uri, this parser will not choke on URIs missing * Unlike java.net.uri, this parser will not choke on URIs missing schemes. It
* schemes. It will only throw a ParseException if the input is * will only throw a ParseException if the input is really hosed.
* really hosed.
* *
* If given an https scheme but no port, fills in port * If given an https scheme but no port, fills in port
*
*/ */
public class WebAddress { public class WebAddress {
private String mScheme; private String mScheme;
private String mHost;
private int mPort; private String mHost;
private String mPath;
private String mAuthInfo; private int mPort;
static final int MATCH_GROUP_SCHEME = 1; private String mPath;
static final int MATCH_GROUP_AUTHORITY = 2;
static final int MATCH_GROUP_HOST = 3; private String mAuthInfo;
static final int MATCH_GROUP_PORT = 4;
static final int MATCH_GROUP_PATH = 5; static final int MATCH_GROUP_SCHEME = 1;
static Pattern sAddressPattern = Pattern.compile( static final int MATCH_GROUP_AUTHORITY = 2;
/* scheme */ "(?:(http|https|file)\\:\\/\\/)?" +
/* authority */ "(?:([-A-Za-z0-9$_.+!*'(),;?&=]+(?:\\:[-A-Za-z0-9$_.+!*'(),;?&=]+)?)@)?" + static final int MATCH_GROUP_HOST = 3;
/* host */ "([" + GOOD_IRI_CHAR + "%_-][" + GOOD_IRI_CHAR + "%_\\.-]*|\\[[0-9a-fA-F:\\.]+\\])?" +
/* port */ "(?:\\:([0-9]*))?" + static final int MATCH_GROUP_PORT = 4;
/* path */ "(\\/?[^#]*)?" +
/* anchor */ ".*", Pattern.CASE_INSENSITIVE); static final int MATCH_GROUP_PATH = 5;
/** parses given uriString. static Pattern sAddressPattern = Pattern
* @throws Exception */ .compile(
public WebAddress(String address) throws Exception { /* scheme */"(?:(http|https|file)\\:\\/\\/)?" +
if (address == null) { /* authority */"(?:([-A-Za-z0-9$_.+!*'(),;?&=]+(?:\\:[-A-Za-z0-9$_.+!*'(),;?&=]+)?)@)?" +
throw new NullPointerException(); /* host */"([" + GOOD_IRI_CHAR + "%_-][" + GOOD_IRI_CHAR + "%_\\.-]*|\\[[0-9a-fA-F:\\.]+\\])?" +
} /* port */"(?:\\:([0-9]*))?" +
/* path */"(\\/?[^#]*)?" +
// android.util.Log.d(LOGTAG, "WebAddress: " + address); /* anchor */".*", Pattern.CASE_INSENSITIVE);
mScheme = ""; /**
mHost = ""; * parses given uriString.
mPort = -1; */
mPath = "/"; public WebAddress(String address) throws Exception {
mAuthInfo = ""; if (address == null) {
throw new NullPointerException();
Matcher m = sAddressPattern.matcher(address); }
String t;
if (m.matches()) { // android.util.Log.d(LOGTAG, "WebAddress: " + address);
t = m.group(MATCH_GROUP_SCHEME);
if (t != null) mScheme = t.toLowerCase(Locale.ROOT); mScheme = "";
t = m.group(MATCH_GROUP_AUTHORITY); mHost = "";
if (t != null) mAuthInfo = t; mPort = -1;
t = m.group(MATCH_GROUP_HOST); mPath = "/";
if (t != null) mHost = t; mAuthInfo = "";
t = m.group(MATCH_GROUP_PORT);
if (t != null && t.length() > 0) { Matcher m = sAddressPattern.matcher(address);
// The ':' character is not returned by the regex. String t;
try { if (m.matches()) {
mPort = Integer.parseInt(t); t = m.group(MATCH_GROUP_SCHEME);
} catch (NumberFormatException ex) { if (t != null) {
throw new Exception(); mScheme = t.toLowerCase(Locale.ROOT);
} }
} t = m.group(MATCH_GROUP_AUTHORITY);
t = m.group(MATCH_GROUP_PATH); if (t != null) {
if (t != null && t.length() > 0) { mAuthInfo = t;
/* handle busted myspace frontpage redirect with }
missing initial "/" */ t = m.group(MATCH_GROUP_HOST);
if (t.charAt(0) == '/') { if (t != null) {
mPath = t; mHost = t;
} else { }
mPath = "/" + t; t = m.group(MATCH_GROUP_PORT);
} if (t != null && t.length() > 0) {
} // The ':' character is not returned by the regex.
try {
} else { mPort = Integer.parseInt(t);
// nothing found... outa here } catch (NumberFormatException ex) {
throw new Exception(); throw new Exception();
} }
}
/* Get port from scheme or scheme from port, if necessary and t = m.group(MATCH_GROUP_PATH);
possible */ if (t != null && t.length() > 0) {
if (mPort == 443 && mScheme.equals("")) { /*
mScheme = "https"; * handle busted myspace frontpage redirect with missing initial
} else if (mPort == -1) { * "/"
if (mScheme.equals("https")) */
mPort = 443; if (t.charAt(0) == '/') {
else mPath = t;
mPort = 80; // default } else {
} mPath = "/" + t;
if (mScheme.equals("")) mScheme = "http"; }
} }
@Override } else {
public String toString() { // nothing found... outa here
String port = ""; throw new Exception();
if ((mPort != 443 && mScheme.equals("https")) || }
(mPort != 80 && mScheme.equals("http"))) {
port = ":" + Integer.toString(mPort); /*
} * Get port from scheme or scheme from port, if necessary and possible
String authInfo = ""; */
if (mAuthInfo.length() > 0) { if (mPort == 443 && mScheme.equals("")) {
authInfo = mAuthInfo + "@"; mScheme = "https";
} } else if (mPort == -1) {
if (mScheme.equals("https")) {
return mScheme + "://" + authInfo + mHost + port + mPath; mPort = 443;
} } else {
mPort = 80; // default
public void setScheme(String scheme) { }
mScheme = scheme; }
} if (mScheme.equals("")) {
mScheme = "http";
public String getScheme() { }
return mScheme; }
}
@Override
public void setHost(String host) { public String toString() {
mHost = host; String port = "";
} if ((mPort != 443 && mScheme.equals("https"))
|| (mPort != 80 && mScheme.equals("http"))) {
public String getHost() { port = ":" + Integer.toString(mPort);
return mHost; }
} String authInfo = "";
if (mAuthInfo.length() > 0) {
public void setPort(int port) { authInfo = mAuthInfo + "@";
mPort = port; }
}
return mScheme + "://" + authInfo + mHost + port + mPath;
public int getPort() { }
return mPort;
} public void setScheme(String scheme) {
mScheme = scheme;
public void setPath(String path) { }
mPath = path;
} public String getScheme() {
return mScheme;
public String getPath() { }
return mPath;
} public void setHost(String host) {
mHost = host;
public void setAuthInfo(String authInfo) { }
mAuthInfo = authInfo;
} public String getHost() {
return mHost;
public String getAuthInfo() { }
return mAuthInfo;
} 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;
}
} }
Loading…
Cancel
Save