commit 02a8b24f9f35d13182c39b982be81a2fcd663817 Author: sonichy Date: Thu Mar 29 23:36:28 2018 +0800 first diff --git a/README.md b/README.md new file mode 100644 index 0000000..2a5b6b8 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# Android:海天鹰浏览器 +基本电量信息,数据列表,电量电流电压折线图。 +### 主界面 +![alt](preview.png) \ No newline at end of file diff --git a/app-debug.apk b/app-debug.apk new file mode 100644 index 0000000..e22308d Binary files /dev/null and b/app-debug.apk differ diff --git a/main/AndroidManifest.xml b/main/AndroidManifest.xml new file mode 100644 index 0000000..68a665d --- /dev/null +++ b/main/AndroidManifest.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/main/assets/about.htm b/main/assets/about.htm new file mode 100644 index 0000000..183471e --- /dev/null +++ b/main/assets/about.htm @@ -0,0 +1,47 @@ + + + + +海天鹰浏览器 + + + +


海天鹰浏览器 V3.4

+

内置扩展的浏览器。

+

扩展:[查看图片]文字链接转图片,广告图片自定义过滤。

+

作者:黄颖

+

E-mail:sonichy@163.com

+

QQ:84429027

+

更新日志:

+

V3.4 (2018-03-13)

  1. 增加视频独立播放。
  2. 使用系统下载取代浏览器跳转下载、图片下载,并增加链接下载
+

V3.3 (2018-01)

  1. 增加分享菜单。
  2. 增加:视频全屏禁用屏幕休眠。
  3. 解决网页跳转APP协议问题。
+

V3.2 (2017-12-17)

  1. 修复:关闭查找框,高亮不消失的问题。
  2. 增加过滤iframe。
  3. 修复:EditTextPreference没有设置defaultValue,引起第一次运行点击主页菜单崩溃。
+

V3.1 (2017-09-16)

  1. 修复:增加设置主页后,从打开方式打开仍然打开主页而不是打开文件的问题。
  2. 增加全屏菜单。
+

V3.0 (2017-08-31)

  1. 增加广告图片自定义过滤。
+

V2.15 (2017-08-27)

  1. 增加设置页面,增加主页设置。
+

V2.14 (2017-03-05)

  1. 按钮设置空背景去除边框,使按钮更小,从而使导航栏高度更小,下面的网页更大;更换主菜单图标。
+

V2.13 (2016-10-07)

  1. 下载图片后自动添加到图库中。
+

V2.12 (2016-08-17)

  1. 优化移动端关于页面。
+

V2.11 (2016-05-08)

  1. 增加显示网页源码。
  2. 增加查找功能。
  3. 自定义搜索栏,代替搜索对话框,支持搜索上一个、下一个。
  4. 适配无虚拟键盘的 Android X86。
  5. 网址收藏数据库存储到扩展存储上,以免重装应用时数据库被删除。
+

V2.10 (2016-04-28)

  1. 设置前进、后退按钮可用、禁用逻辑。
  2. 点击返回键无历史网页可退时,无动作而不是退到后台。
+

V2.9 (2016-04-13)

  1. 浏览器添加到HTML文件打开方式选择列表。
+

V2.8 (2016-03-11)

  1. 文字按钮改为图片按钮。
  2. 适配平板,取消沉浸模式,增加前进、后退、菜单按钮,点击菜单按钮弹出菜单,适配无物理按键。
  3. 修复图片无扩展名无法保存的问题。
+

V2.7 (2016-02-25)

  1. 网址收藏排除[about:blank]。
  2. 取消恢复前台自动播放视频,因为会引起解锁时新浪微博视频自动播放。
  3. 全屏暂停时显示播放按钮。
+

V2.6 (2016-02-21)

  1. 浏览器退到后台暂停视频播放。
+

V2.5 (2016-02-14)

  1. 增加onConsoleMessage。
  2. 测试视频全屏,MIUI显示控件,LEUI不显示控件,是手机系统问题,因为回退键已做好退出退出全屏功能,取消显示退出全屏按钮。
+

V2.4 (2016-02-12)

  1. 视频全屏适用iqiyi.com。
  2. 点击返回键优先退出全屏,返回上一页次之,最后moveTaskToback。
+

V2.3 (2016-02-09)

  1. 修复网络未连接,反复请求百度搜索的问题。
+

V2.2 (2016-02-03)

  1. 触摸WebView隐藏地址栏输入法。
  2. 自定义进度条。
+

V2.1 (2016-02-01)

  1. 增加保存图片功能。
+

V2.0 (2016-01-31)

  1. 改用SQLite数据库收藏网址。
  2. 完善收藏夹的显示、添加、删除、点击跳转菜单。
+

V1.5 (2016-01-28)

  1. 增加使用localStorage技术的收藏夹。
+

V1.4 (2016-01-26)

  1. 修复中文网址打不开时,跳转百度搜索乱码。
  2. 增加图片长按菜单。
+

V1.3 (2016-01-25)

  1. 菜单键增加前进菜单项。
  2. 增加输入法回车打开网址。
  3. 改用Holo主题。
  4. 增加网址补齐[http://]。
  5. 找不到网站时到百度网搜索。
  6. 增加进度条。
+

V1.2 (2016-01-23)

  1. 支持自适应屏幕,支持缩放。
+

V1.1 (2016-01-22)

  1. 增加支持网页input.file转安卓文件选择器。
  2. 点击加载按钮隐藏输入法。
  3. 增加支持使用内部浏览器下载文件。
+

V1.0 (2016-01-21)

  1. 实现基本的浏览器界面。
  2. 实现第一个扩展[链接转图片]。
  3. 网页JS.alert转安卓Toast。
+ + diff --git a/main/assets/logo.png b/main/assets/logo.png new file mode 100644 index 0000000..109ff0d Binary files /dev/null and b/main/assets/logo.png differ diff --git a/main/java/com/hty/browser/DBHelper.java b/main/java/com/hty/browser/DBHelper.java new file mode 100644 index 0000000..2cf4143 --- /dev/null +++ b/main/java/com/hty/browser/DBHelper.java @@ -0,0 +1,80 @@ +package com.hty.browser; + +import java.io.File; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; + +public class DBHelper extends SQLiteOpenHelper { + + public static final String DATABASE_NAME = MainActivity.dir + File.separator + "webfav.db"; + private final static int VERSION = 1; + String TableName = "webfav"; + private SQLiteDatabase db; + private static DBHelper mInstance = null; + + public DBHelper(Context context) { + super(context, DATABASE_NAME, null, VERSION); + } + + public static synchronized DBHelper getInstance(Context context) { + if (mInstance == null) { + mInstance = new DBHelper(context); + } + return mInstance; + } + + @Override + public void onCreate(SQLiteDatabase db) { + this.db = db; + db.execSQL("CREATE TABLE webfav (_id INTEGER PRIMARY KEY ,website TEXT,title TEXT)"); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + // db.execSQL("DROP TABLE IF EXISTS battery"); + // onCreate(db); + switch (newVersion) { + case 6: + db.execSQL("alter table battery rename to battery_temp"); + db.execSQL("CREATE TABLE battery (_id INTEGER PRIMARY KEY ,time TEXT,level INTEGER, voltage INTEGER, current INTEGER , temperature INTEGER, cpu INTEGER)"); + db.execSQL("insert into battery select *,'' from battery_temp"); + db.execSQL("drop table battery_temp"); + break; + } + } + + public void insert(ContentValues values) { + db = getWritableDatabase(); + db.insert(TableName, null, values); + db.close(); + } + + public Cursor query(String url) { + db = getWritableDatabase(); + Cursor c = null; + if (url.equalsIgnoreCase("")) { + c = db.query(TableName, null, null, null, null, null, "_id desc"); + } else { + c = db.query(TableName, null, "website=?", new String[] { url }, null, null, "_id desc"); + } + return c; + } + + public void del(int id) { + if (db == null) + db = getWritableDatabase(); + db.delete(TableName, "_id=?", new String[] { String.valueOf(id) }); + // Log.e("id", id + ""); + // db.ExecuteNonQuery(CommandType.Text, "VACUUM"); + } + + @Override + public void close() { + if (db != null) + db.close(); + } +} diff --git a/main/java/com/hty/browser/FavoriteActivity.java b/main/java/com/hty/browser/FavoriteActivity.java new file mode 100644 index 0000000..ec2de7b --- /dev/null +++ b/main/java/com/hty/browser/FavoriteActivity.java @@ -0,0 +1,93 @@ +package com.hty.browser; + +import android.app.Activity; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Intent; +import android.database.Cursor; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import android.view.ContextMenu; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.MenuItem; +import android.view.View; +import android.view.View.OnCreateContextMenuListener; +import android.widget.AdapterView; +import android.widget.AdapterView.AdapterContextMenuInfo; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.ListView; +import android.widget.SimpleCursorAdapter; +import android.widget.TextView; +import android.widget.Toast; + +public class FavoriteActivity extends Activity { + SimpleCursorAdapter adapter; + ListView listView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_favorite); + DBHelper helper = new DBHelper(this); + Cursor c = helper.query(""); + String[] from = { "_id", "title", "website" }; + int[] to = { R.id.id, R.id.title, R.id.website }; + adapter = new SimpleCursorAdapter(this, R.layout.favorite_row, c, from, to, 0); + listView = (ListView) this.findViewById(R.id.listView1); + listView.setAdapter(adapter); + listView.setDivider(new ColorDrawable(Color.GREEN)); + listView.setDividerHeight(2); + listView.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) { + String url = ((TextView) arg1.findViewById(R.id.website)).getText().toString(); + Intent intent = new Intent(FavoriteActivity.this, MainActivity.class); + intent.putExtra("url", url); + setResult(RESULT_OK, intent); + finish(); + } + }); + + listView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() { + @Override + public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) { + AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; + String title = ((TextView) info.targetView.findViewById(R.id.title)).getText().toString(); + menu.setHeaderTitle(title); + menu.add(0, 0, 0, "复制链接"); + menu.add(0, 1, 1, "删除"); + } + }); + + } + + @Override + public boolean onContextItemSelected(MenuItem item) { + AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo(); + switch (item.getItemId()) { + case 0: + ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); + String url = ((TextView) menuInfo.targetView.findViewById(R.id.website)).getText().toString(); + cm.setPrimaryClip(ClipData.newPlainText("link", url)); + Toast.makeText(getApplicationContext(), "链接已复制", Toast.LENGTH_SHORT).show(); + break; + case 1: + int id = Integer.parseInt(((TextView) menuInfo.targetView.findViewById(R.id.id)).getText() + .toString()); + DBHelper helper = new DBHelper(getApplicationContext()); + helper.del(id); + Cursor c = helper.query(""); + String[] from = { "_id", "title", "website" }; + int[] to = { R.id.id, R.id.title, R.id.website }; + adapter = new SimpleCursorAdapter(this, R.layout.favorite_row, c, from, to, 0); + listView.setAdapter(adapter); + break; + } + return true; + } + + public void favback(View v) { + finish(); + } +} diff --git a/main/java/com/hty/browser/MainActivity.java b/main/java/com/hty/browser/MainActivity.java new file mode 100644 index 0000000..ada98a6 --- /dev/null +++ b/main/java/com/hty/browser/MainActivity.java @@ -0,0 +1,1031 @@ +package com.hty.browser; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.DownloadManager; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.ContentResolver; +import android.content.ContentValues; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.ActivityInfo; +import android.content.res.Configuration; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.media.MediaScannerConnection; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Bundle; +import android.os.Environment; +import android.preference.PreferenceManager; +import android.provider.MediaStore; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.Log; +import android.view.ContextMenu; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.KeyEvent; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.View.OnTouchListener; +import android.view.WindowManager; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputMethodManager; +import android.webkit.ConsoleMessage; +import android.webkit.DownloadListener; +import android.webkit.JsResult; +import android.webkit.URLUtil; +import android.webkit.ValueCallback; +import android.webkit.WebChromeClient; +import android.webkit.WebChromeClient.CustomViewCallback; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebView.FindListener; +import android.webkit.WebView.HitTestResult; +import android.webkit.WebViewClient; +import android.widget.AdapterView.AdapterContextMenuInfo; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; +import android.widget.Toast; + +public class MainActivity extends Activity { + TextView findCount; + EditText editText1, findText; + ImageButton btnGo, btnBack, btnForward, btnMenu, findPrev, findNext, findClose; + WebView webView1; + // RelativeLayout RelativeLayout1; + LinearLayout LinearLayout1,LinearLayout2; + FrameLayout video, findbar; + ImageView imageView1; + InputMethodManager IMM; + ProgressBar pgb1; + String urlo = "", HTRE = "", ptitle = "", urln = ""; + int ec = 0; + CustomViewCallback customViewCallback; + boolean isFullScreen; + static File dir; + SharedPreferences sharedPreferences; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); + + String path = Environment.getExternalStorageDirectory().getPath() + File.separator + "HTYBrowser"; + dir = new File(path); + if (!dir.exists()) { + dir.mkdirs(); + } + setContentView(R.layout.activity_main); + //ptitle = "百度"; + //urln = "http//www.baidu.com"; + getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); + IMM = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE); + LinearLayout1 = (LinearLayout) findViewById(R.id.LinearLayout1); + LinearLayout2 = (LinearLayout) findViewById(R.id.LinearLayout2); + // RelativeLayout1 = (RelativeLayout) + // findViewById(R.id.RelativeLayout1); + video = (FrameLayout) findViewById(R.id.video); + findbar = (FrameLayout) findViewById(R.id.findbar); + pgb1 = (ProgressBar) findViewById(R.id.progressBar1); + // if (VERSION.SDK_INT > 18) { + // getWindow().addFlags( + // WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + // getWindow().addFlags( + // WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); + // LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) + // LinearLayout1 + // .getLayoutParams(); + // lp.topMargin = 45; + // LinearLayout1.setLayoutParams(lp); + // // RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) + // // RelativeLayout1 + // // .getLayoutParams(); + // // lp.topMargin = 45; + // // RelativeLayout1.setLayoutParams(lp); + // } + btnGo = (ImageButton) findViewById(R.id.ImageButtonGo); + btnBack = (ImageButton) findViewById(R.id.ImageButtonBack); + btnForward = (ImageButton) findViewById(R.id.ImageButtonForward); + btnMenu = (ImageButton) findViewById(R.id.ImageButtonMenu); + imageView1 = (ImageView) findViewById(R.id.imageView1); + findText = (EditText) findViewById(R.id.findText); + findCount = (TextView) findViewById(R.id.findCount); + findPrev = (ImageButton) findViewById(R.id.findPrev); + findNext = (ImageButton) findViewById(R.id.findNext); + findClose = (ImageButton) findViewById(R.id.findClose); + // imageView1.setAlpha(100); + btnGo.setOnClickListener(new ButtonListener()); + btnBack.setOnClickListener(new ButtonListener()); + btnForward.setOnClickListener(new ButtonListener()); + btnMenu.setOnClickListener(new ButtonListener()); + imageView1.setOnClickListener(new ButtonListener()); + findPrev.setOnClickListener(new ButtonListener()); + findNext.setOnClickListener(new ButtonListener()); + findClose.setOnClickListener(new ButtonListener()); + editText1 = (EditText) findViewById(R.id.EditText1); + webView1 = (WebView) findViewById(R.id.WebView1); + registerForContextMenu(webView1); + // 开启JS + webView1.getSettings().setJavaScriptEnabled(true); + // 开启JS能打开窗口 + webView1.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); + // 开启缓存 + webView1.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); + // 自适应屏幕 + webView1.getSettings().setUseWideViewPort(true); + webView1.getSettings().setLoadWithOverviewMode(true); + // 支持缩放 + webView1.getSettings().setSupportZoom(true); + // 启用内置缩放控件 + webView1.getSettings().setBuiltInZoomControls(true); + // 隐藏缩放控件 + webView1.getSettings().setDisplayZoomControls(false); + // 开启访问文件 + webView1.getSettings().setAllowFileAccess(true); + // 开启数据库 + webView1.getSettings().setDatabaseEnabled(true); + // 开启localStorage + webView1.getSettings().setDomStorageEnabled(true); + // 开启定位 + webView1.getSettings().setGeolocationEnabled(true); + // 支持多窗口 + webView1.getSettings().supportMultipleWindows(); + // 支持获取手势焦点 + webView1.requestFocusFromTouch(); + + webView1.setWebViewClient(new WebViewClient() { + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + if(url.startsWith("http")) + view.loadUrl(url); + return true; + } + + @Override + public void onPageStarted(WebView view, String url, Bitmap favicon) { + super.onPageStarted(view, url, favicon); + editText1.setText(url); + urln = url; + btnBack.setEnabled(true); + } + + @Override + public void onPageFinished(WebView view, String url) { + super.onPageFinished(view, url); + String js = ""; + // link2img,宽度适应浏览器 + js = "javascript:var obj=document.getElementsByTagName('a');var aimg=new Array();var dw=document.documentElement.clientWidth-10;var dh=document.documentElement.clientHeight;for(var i=0;idw){var text='';bl=(dw/iw).toFixed(2);this.style.width=dw+'px';this.style.height=dw*ih/iw+'px';text=' '+i+': W:'+dw+'/'+iw+'='+bl;this.style.border='1px solid blue';var span=document.createElement('span');span.textContent=text;span.setAttribute('style','white-space:nowrap;');this.parentNode.appendChild(span);}}})(i);}}"; + view.loadUrl(js); + } + + @Override + public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { + super.onReceivedError(view, errorCode, description, failingUrl); + Toast.makeText(getApplicationContext(), "ReceivedError:" + errorCode, Toast.LENGTH_SHORT) + .show(); + if (isNetworkConnected()) { + switch(errorCode){ + case WebViewClient.ERROR_HOST_LOOKUP: // 找不到主机,跳转百度搜索 + Log.e("ErrorHostLookup", failingUrl); + String url = "http://m.baidu.com/s?word=" + urlo; + editText1.setText(url); + webView1.loadUrl(url); + urln = url; + break; + case WebViewClient.ERROR_UNSUPPORTED_SCHEME: +// Log.e("ErrorUnsupportedScheme",failingUrl); +// String surl = ""; +// try { +// surl = URLDecoder.decode(failingUrl, "utf-8"); +// Log.e("Decode",surl); +// } catch (UnsupportedEncodingException e) { +// e.printStackTrace(); +// } +// String paraUrl=""; +// if(failingUrl.startsWith("baiduboxapp://")){ +// String[] paras=surl.split("&"); +// for(int i=0;i

网络未连接

", + "text/html", "utf-8", ""); + } + } + + }); + + webView1.setWebChromeClient(new WebChromeClient() { + + // JS的alert('')提示信息转换成安卓控件提示信息 + @Override + public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { + Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); + result.confirm(); + return true; + } + + // HTML5.input.file转换为安卓文件选择器 + @Override + public boolean onShowFileChooser(WebView webView, ValueCallback uploadMsg, + WebChromeClient.FileChooserParams fileChooserParams) { + openFileChooserImplForAndroid5(uploadMsg); + return true; + } + + // 进度条 + @Override + public void onProgressChanged(WebView view, int newProgress) { + super.onProgressChanged(view, newProgress); + pgb1.setProgress(newProgress); + if(!isFullScreen) { + if (newProgress == 100) { + pgb1.setVisibility(View.INVISIBLE); + } else { + pgb1.setVisibility(View.VISIBLE); + } + } + if(sharedPreferences.getBoolean("switch_adBlock",true)){ + ADBlock(); + } + if(sharedPreferences.getBoolean("switch_iframeBlock",false)) { + //Log.e("line292", "progress:" + newProgress); + //if (!webView1.getUrl().contains("baidu.com")){ + iframeBlock(); + //} + } + } + + // 获取网页标题 + @Override + public void onReceivedTitle(WebView view, String title) { + super.onReceivedTitle(view, title); + ptitle = title; + } + + // 播放网络视频时全屏会被调用的方法 + @Override + public void onShowCustomView(View view, CustomViewCallback callback) { + Log.e("onShowCustomView", "onShowCustomView"); + Toast.makeText(getApplicationContext(), "onShowCustomView", Toast.LENGTH_SHORT).show(); + customViewCallback = callback; + // 将video放到当前视图中 + video.addView(view); + // 设置全屏 + setFullScreen(); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } + + // 视频播放退出全屏会被调用的 + @Override + public void onHideCustomView() { + Log.e("onHideCustomView", "onHideCustomView"); + Toast.makeText(getApplicationContext(), "onHideCustomView", Toast.LENGTH_SHORT).show(); + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + // 退出全屏 + // quitFullScreen(); + } + + @Override + public boolean onConsoleMessage(ConsoleMessage consoleMessage) { + Log.d("onConsoleMessage", consoleMessage.message() + " at " + consoleMessage.sourceId() + ":" + + consoleMessage.lineNumber()); + return super.onConsoleMessage(consoleMessage); + } + }); + + webView1.setDownloadListener(new MyWebViewDownLoadListener()); + + webView1.setOnTouchListener(new OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + webView1.requestFocus(); + IMM.hideSoftInputFromWindow(editText1.getWindowToken(), 0); + return false; + } + }); + + editText1.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (actionId == EditorInfo.IME_ACTION_GO) { + loadPage(editText1.getText().toString()); + return true; + } + return false; + } + }); + + findText.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (actionId == EditorInfo.IME_ACTION_SEARCH) { + webView1.findAllAsync(findText.getText().toString()); + IMM.hideSoftInputFromWindow(findText.getWindowToken(), 0); + return true; + } + return false; + } + }); + + findText.addTextChangedListener(new TextWatcher() { + @Override + public void onTextChanged(CharSequence text, int start, int before, int count) { + // text 输入框中改变后的字符串信息 + // start 输入框中改变后的字符串的起始位置 + // before 输入框中改变前的字符串的位置 默认为0 + // count 输入框中改变后的一共输入字符串的数量 + webView1.findAllAsync(text.toString()); + } + + @Override + public void beforeTextChanged(CharSequence text, int start, int count, int after) { + // text 输入框中改变前的字符串信息 + // start 输入框中改变前的字符串的起始位置 + // count 输入框中改变前后的字符串改变数量一般为0 + // after 输入框中改变后的字符串与起始位置的偏移量 + } + + @Override + public void afterTextChanged(Editable edit) { + // edit 输入结束呈现在输入框中的信息 + } + }); + + Intent intent = getIntent(); + if (intent.ACTION_VIEW.equals(intent.getAction())) { + urln = intent.getDataString(); + loadPage(urln); + }else{ + loadPage(sharedPreferences.getString("homepage","http://www.baidu.com")); + } + + webView1.setFindListener(new FindListener() { + @Override + public void onFindResultReceived(int activeMatchOrdinal, int numberOfMatches, + boolean isDoneCounting) { + findCount.setText(activeMatchOrdinal + "/" + numberOfMatches); + } + }); + + + } + + private void setFullScreen() { + // RelativeLayout1.setVisibility(View.GONE); + LinearLayout1.setVisibility(View.GONE); + video.setVisibility(View.VISIBLE); + // imageView1.setVisibility(View.VISIBLE); + // 横屏显示 + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); + // 设置全屏的相关属性,获取当前的屏幕状态,然后设置全屏 + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + // 全屏下的状态码:1098974464 + // 窗口下的状态吗:1098973440 + isFullScreen = true; + } + + // 退出全屏 + private void quitFullScreen() { + if (customViewCallback != null) { + // 隐藏掉 + customViewCallback.onCustomViewHidden(); + } + // RelativeLayout1.setVisibility(View.VISIBLE); + LinearLayout1.setVisibility(View.VISIBLE); + LinearLayout2.setVisibility(View.VISIBLE); + pgb1.setVisibility(View.VISIBLE); + video.setVisibility(View.GONE); + // imageView1.setVisibility(View.GONE); + // 用户当前的首选方向 + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER); + // 声明当前屏幕状态的参数并获取 + final WindowManager.LayoutParams attrs = getWindow().getAttributes(); + attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN); + getWindow().setAttributes(attrs); + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); + isFullScreen = false; + } + + public ValueCallback mUploadMessage; + public ValueCallback mUploadMessageForAndroid5; + public final static int FILECHOOSER_RESULTCODE = 1; + public final static int FILECHOOSER_RESULTCODE_FOR_ANDROID_5 = 2; + + private void openFileChooserImplForAndroid5(ValueCallback uploadMsg) { + mUploadMessageForAndroid5 = uploadMsg; + Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT); + contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE); + contentSelectionIntent.setType("*/*"); + Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER); + chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent); + chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser"); + startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE_FOR_ANDROID_5); + } + + class ButtonListener implements OnClickListener { + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.ImageButtonGo: + loadPage(editText1.getText().toString()); + break; + case R.id.ImageButtonBack: + if (webView1.canGoBack()) { + webView1.goBack(); + btnForward.setEnabled(true); + } else { + btnBack.setEnabled(false); + } + break; + case R.id.ImageButtonForward: + if (webView1.canGoForward()) { + webView1.goForward(); + btnBack.setEnabled(true); + } else { + btnForward.setEnabled(false); + } + break; + case R.id.ImageButtonMenu: + // MainActivity.this.openOptionsMenu(); + MenuDialog(); + break; + case R.id.imageView1: + playVideo(); + imageView1.setVisibility(View.GONE); + break; + case R.id.findPrev: + webView1.findNext(false); + break; + case R.id.findNext: + webView1.findNext(true); + break; + case R.id.findClose: + findText.setText(""); + IMM.hideSoftInputFromWindow(findText.getWindowToken(), 0); + findbar.setVisibility(View.GONE); + break; + } + } + } + + private class MyWebViewDownLoadListener implements DownloadListener { + @Override + public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, + long contentLength) { +// Uri uri = Uri.parse(url); +// Intent intent = new Intent(Intent.ACTION_VIEW, uri); +// startActivity(intent); + downloadBySystem(url,"",""); + } + } + + @Override + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { + super.onCreateContextMenu(menu, v, menuInfo); + WebView w = (WebView) v; + HitTestResult result = w.getHitTestResult(); + HTRE = result.getExtra(); + menu.setHeaderTitle(HTRE); + if (result.getType() == HitTestResult.IMAGE_TYPE || result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE) { + menu.add(0, 0, 0, "查看图片"); + menu.add(0, 1, 1, "复制图片"); + menu.add(0, 2, 2, "保存图片"); + menu.add(0, 3, 3, "复制链接"); + menu.add(0, 4, 4, "屏蔽图片"); + } + if (result.getType() == HitTestResult.SRC_ANCHOR_TYPE) { + menu.add(0, 2, 2, "下载"); + menu.add(0, 3, 3, "复制链接"); + } + } + + @Override + public boolean onContextItemSelected(MenuItem item) { + //AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo(); + switch (item.getItemId()) { + case 0: + webView1.loadUrl(HTRE); + break; + case 1: + ClipboardManager mClipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + ContentValues values = new ContentValues(2); + values.put(MediaStore.Images.Media.MIME_TYPE, "Image/jpg"); + values.put(MediaStore.Images.Media.DATA, HTRE); + ContentResolver theContent = getContentResolver(); + Uri imageUri = theContent.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); + ClipData theClip = ClipData.newUri(getContentResolver(), "Image", imageUri); + mClipboard.setPrimaryClip(theClip); + break; + case 2: + //new SaveImage().execute(); + downloadBySystem(HTRE,"",""); + break; + case 3: + ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); + cm.setPrimaryClip(ClipData.newPlainText("link", HTRE)); + Toast.makeText(getApplicationContext(), "链接已复制", Toast.LENGTH_SHORT).show(); + break; + case 4: + DialogBlock(HTRE); + break; +// case 5: +// downloadBySystem(HTRE,"",""); +// break; + default: + return super.onContextItemSelected(item); + } + return true; + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + if (isFullScreen) { + imageView1.setVisibility(View.GONE); + quitFullScreen(); + } else { + if (webView1.canGoBack()) { + webView1.goBack(); + } else { + // moveTaskToBack(false); + // MenuDialog(); + } + } + return true; + } + if (keyCode == KeyEvent.KEYCODE_ENTER) { + webView1.findAllAsync(findText.getText().toString()); + IMM.hideSoftInputFromWindow(findText.getWindowToken(), 0); + return true; + } + if (keyCode == KeyEvent.KEYCODE_F) { + findbar.setVisibility(View.VISIBLE); + findText.requestFocus(); + webView1.findAllAsync(findText.getText().toString()); + return true; + } + if (keyCode == KeyEvent.KEYCODE_ESCAPE) { + findbar.setVisibility(View.GONE); + // Toast.makeText(getApplicationContext(), "Esc Pressed", + // Toast.LENGTH_SHORT).show(); + return true; + } + return super.onKeyDown(keyCode, event); + } + + void loadPage(String url) { + urlo = url; + if (url.indexOf("://") == -1) { + url = "http://" + url; + } + // editText1.setText(url); + Log.e("webview", url); + IMM.hideSoftInputFromWindow(editText1.getWindowToken(), 0); + findText.setText(""); + webView1.loadUrl(url); + // btnBack.setEnabled(true); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent intent) { + if (requestCode == FILECHOOSER_RESULTCODE) { + if (null == mUploadMessage) + return; + Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData(); + mUploadMessage.onReceiveValue(result); + mUploadMessage = null; + } + if (requestCode == FILECHOOSER_RESULTCODE_FOR_ANDROID_5) { + if (null == mUploadMessageForAndroid5) + return; + Uri result = (intent == null || resultCode != RESULT_OK) ? null : intent.getData(); + if (result != null) { + mUploadMessageForAndroid5.onReceiveValue(new Uri[] { result }); + } else { + mUploadMessageForAndroid5.onReceiveValue(new Uri[] {}); + } + mUploadMessageForAndroid5 = null; + } + if (requestCode == 0) { + if (intent != null) + webView1.loadUrl(intent.getStringExtra("url")); + } + } + + private class SaveImage extends AsyncTask { + @Override + protected String doInBackground(String... params) { + String result = ""; + String imgurl = HTRE; + try { + String sdcard = Environment.getExternalStorageDirectory().toString(); + File file = new File(sdcard + "/Download"); + if (!file.exists()) { + file.mkdirs(); + } + int idx = imgurl.lastIndexOf("/"); + String filename = imgurl.substring(idx); + String filepath = sdcard + "/Download/" + filename; + file = new File(filepath); + InputStream inputStream = null; + URL url = new URL(imgurl); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("GET"); + conn.setConnectTimeout(20000); + if (conn.getResponseCode() == 200) { + inputStream = conn.getInputStream(); + } + byte[] buffer = new byte[4096]; + int len = 0; + FileOutputStream outStream = new FileOutputStream(file); + while ((len = inputStream.read(buffer)) != -1) { + outStream.write(buffer, 0, len); + } + outStream.close(); + result = "图片已保存至:" + file.getAbsolutePath(); + MediaScannerConnection.scanFile(MainActivity.this, new String[] { filepath }, null, null); + } catch (Exception e) { + result = "保存失败!" + e.getLocalizedMessage(); + } + return result; + } + + @Override + protected void onPostExecute(String result) { + Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show(); + } + } + + boolean isNetworkConnected() { + ConnectivityManager mConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo(); + if (mNetworkInfo != null) { + return mNetworkInfo.isAvailable(); + } + return false; + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + // TODO Auto-generated method stub + super.onConfigurationChanged(newConfig); + // if (this.getResources().getConfiguration().orientation == + // Configuration.ORIENTATION_LANDSCAPE) { + // Toast.makeText(getApplicationContext(), "横屏", Toast.LENGTH_SHORT) + // .show(); + // } else if (this.getResources().getConfiguration().orientation == + // Configuration.ORIENTATION_PORTRAIT) { + // Toast.makeText(getApplicationContext(), "竖屏", Toast.LENGTH_SHORT) + // .show(); + // } + } + + @Override + protected void onPause() { + Log.e("MainActivity", "onPause"); + pauseVideo(); + if (isFullScreen) { + imageView1.setVisibility(View.VISIBLE); + } + super.onPause(); + } + + @Override + protected void onResume() { + super.onResume(); + } + + void pauseVideo() { + String js = "javascript:var obj = document.getElementsByTagName('video');for (var i = 0; i < obj.length; i++) { obj[i].pause();}"; + webView1.loadUrl(js); + } + + void playVideo() { + String js = "javascript:var obj = document.getElementsByTagName('video');for (var i = 0; i < obj.length; i++) { obj[i].play();}"; + webView1.loadUrl(js); + } + + void MenuDialog() { + final String items[] = { "收藏本页", "收藏夹", "查找", "分享", "视频独立播放", "查看源码", "主页", "全屏", "广告过滤规则", "设置", "关于", "退出" }; + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle("菜单"); + builder.setIcon(R.drawable.ic_launcher); + builder.setItems(items, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + switch (which) { + case 0: + if (!urln.equals("about:blank")) { + DBHelper helper = new DBHelper(getApplicationContext()); + Cursor c = helper.query(urln); + if (c.getCount() == 0) { + ContentValues values = new ContentValues(); + values.put("website", urln); + values.put("title", ptitle); + helper.insert(values); + } else { + Toast.makeText(getApplicationContext(), "网址已存在", Toast.LENGTH_SHORT).show(); + } + } + break; + case 1: + Intent intent = new Intent(MainActivity.this, FavoriteActivity.class); + startActivityForResult(intent, 0); + break; + case 2: + findbar.setVisibility(View.VISIBLE); + findText.requestFocus(); + webView1.findAllAsync(findText.getText().toString()); + break; + case 3: + intent = new Intent(); + intent.setAction(Intent.ACTION_SEND); + intent.putExtra(Intent.EXTRA_TEXT, webView1.getUrl()); + intent.setType("text/plain"); + startActivity(Intent.createChooser(intent, "分享")); + break; + case 4: + String js = "javascript:var video0=document.getElementsByTagName('video')[0]; if(video0!=null){ var url=video0.src; document.body.innerHTML=''; var video=document.createElement('video'); video.style.width='100%'; video.style.height='auto'; video.src=url; video.controls=true; document.body.appendChild(video); var a=document.createElement('a'); a.textContent=url; a.href=url; document.body.appendChild(a); }"; + webView1.loadUrl(js); + break; + case 5: + js = "javascript:var s=''+document.getElementsByTagName('html')[0].innerHTML+''; document.body.innerHTML=''; var pre=document.createElement('pre'); document.body.appendChild(pre); pre.textContent=s;"; + webView1.loadUrl(js); + break; + case 6: + webView1.loadUrl(sharedPreferences.getString("homepage","")); + break; + case 7: + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + LinearLayout2.setVisibility(View.GONE); + pgb1.setVisibility(View.GONE); + isFullScreen = true; + break; + case 8: + DialogBlockList(); + break; + case 9: + startActivity(new Intent(MainActivity.this, SettingsActivity.class)); + break; + case 10: + webView1.loadUrl("file:///android_asset/about.htm"); + break; + case 11: + MainActivity.this.finish(); + break; + } + } + }); + builder.create().show(); + } + + void DialogBlock(String content){ + final EditText ETrule = new EditText(this); + ETrule.setText(content); + final AlertDialog dialogRule = new AlertDialog.Builder(this).setIcon(R.drawable.ic_launcher).setTitle("屏蔽规则").setView(ETrule).setCancelable(false).setPositiveButton("添加",null).setNeutralButton("删除",null).setNegativeButton("取消",null).create(); + dialogRule.show(); + dialogRule.getButton(AlertDialog.BUTTON_POSITIVE) + .setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + boolean exist = false; + String rule = ETrule.getText().toString(); + List rulelist = new ArrayList(Arrays.asList(ReadFile("blockrules").split("\n"))); + for(int i=0;i rulelist = new ArrayList(Arrays.asList(ReadFile("blockrules").split("\n"))); + for(int i=0;i adapter=new ArrayAdapter(this, android.R.layout.simple_list_item_1, datas); + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setIcon(R.drawable.ic_launcher); + builder.setTitle("屏蔽规则列表:"); + builder.setAdapter(adapter, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + DialogBlock(datas[which]); + //Toast.makeText(MainActivity.this, "你点击了第" + which + "个item", Toast.LENGTH_SHORT).show(); + } + }); + builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + + } + }); + builder.setNeutralButton("清空", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + AlertDialog.Builder builder1 = new AlertDialog.Builder(MainActivity.this); + builder1.setMessage("操作不可逆,确认清空吗?"); + builder1.setIcon(R.drawable.ic_launcher); + builder1.setTitle("警告"); + builder1.setPositiveButton("确认", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + String filepath = getFilesDir().getAbsolutePath() + "/blockrules"; + File file = new File(filepath); + //if(file.isFile() && file.exists()) { + Log.e("delete "+filepath, String.valueOf(file.delete())); + //} + } + }); + builder1.setNegativeButton("取消", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + + } + }); + builder1.create().show(); + } + }); + builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + + } + }); + builder.show(); + } + + String ReadFile(String filename) { + String s = ""; + FileInputStream istream; + try { + istream = MainActivity.this.openFileInput(filename); + byte[] buffer = new byte[1024]; + ByteArrayOutputStream ostream = new ByteArrayOutputStream(); + int len; + while ((len = istream.read(buffer)) != -1) { + ostream.write(buffer, 0, len); + } + s = new String(ostream.toByteArray()); + istream.close(); + ostream.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return s; + } + + void ADBlock(){ + String s = ReadFile("blockrules"); + if(!s.equals("")) { + String rules = s.replace("\n", ","); + if (rules.endsWith(",")) { + rules = rules.substring(0, rules.length() - 1); + } + String js = "javascript:var rules='" + rules + "';var rule=new Array();rule=rules.split(',');var img=document.getElementsByTagName('img');for(i=0;i + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/main/res/layout/activity_favorite.xml b/main/res/layout/activity_favorite.xml new file mode 100644 index 0000000..788a447 --- /dev/null +++ b/main/res/layout/activity_favorite.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/main/res/layout/activity_main.xml b/main/res/layout/activity_main.xml new file mode 100644 index 0000000..8d86194 --- /dev/null +++ b/main/res/layout/activity_main.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/main/res/layout/favorite_row.xml b/main/res/layout/favorite_row.xml new file mode 100644 index 0000000..5e15266 --- /dev/null +++ b/main/res/layout/favorite_row.xml @@ -0,0 +1,37 @@ + + + + + + + + + + \ No newline at end of file diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml new file mode 100644 index 0000000..aba79e7 --- /dev/null +++ b/main/res/values/strings.xml @@ -0,0 +1,5 @@ + + + 海天鹰浏览器 + Settings + diff --git a/main/res/xml/preference.xml b/main/res/xml/preference.xml new file mode 100644 index 0000000..68286d0 --- /dev/null +++ b/main/res/xml/preference.xml @@ -0,0 +1,21 @@ + + + + + + + + + \ No newline at end of file diff --git a/preview.png b/preview.png new file mode 100644 index 0000000..0e24014 Binary files /dev/null and b/preview.png differ