Commit 3aac7817 authored by wanglei's avatar wanglei

...

parent d3f86eaf
package com.base.browserwhite.bean
data class HistoryBean(
val name: String = "",
val url: String = "",
val time: Long = 0,
val color: Int = 0,
) : SpBean()
package com.base.browserwhite.bean
class SearchTipBean {
}
\ No newline at end of file
package com.base.browserwhite.help package com.base.browserwhite.help
import android.util.Log
import android.widget.Toast
import com.base.browserwhite.utils.AppPreferences
import com.base.browserwhite.utils.LogEx import com.base.browserwhite.utils.LogEx
import org.json.JSONArray
import java.io.BufferedReader import java.io.BufferedReader
import java.io.InputStreamReader import java.io.InputStreamReader
import java.net.HttpURLConnection import java.net.HttpURLConnection
import java.net.URL import java.net.URL
import java.net.URLEncoder
object SearchTipUtils { object SearchTipUtils {
private val TAG = "SearchTipUtils" private val TAG = "SearchTipUtils"
fun getSearchTip(q: String): String? { fun getSearchTip(q: String): List<String>? {
val encodedQuery = URLEncoder.encode(q, "UTF-8")
val url = "https://www.google.com/complete/search?q=$q&cp=3&client=gws-wiz&xssi=t&hl=en" val url = "https://www.google.com/complete/search?q=$q&cp=3&client=gws-wiz&xssi=t&hl=en"
try { try {
val conn: HttpURLConnection = URL(url).openConnection() as HttpURLConnection val conn: HttpURLConnection = URL(url).openConnection() as HttpURLConnection
conn.setRequestMethod("GET") conn.setRequestMethod("GET")
conn.connectTimeout = 5000 conn.connectTimeout = 5000
// conn.setRequestProperty("Accept-Charset", "UTF-8")
if (200 == conn.getResponseCode()) { if (200 == conn.getResponseCode()) {
val json = BufferedReader(InputStreamReader(conn.inputStream)).readLine() val reader = BufferedReader(InputStreamReader(conn.inputStream))
LogEx.logDebug(TAG, json) val sb = StringBuilder()
AppPreferences.getInstance().put(TAG,json) var line: String? = reader.readLine()
return json while (line != null) {
sb.append(line)
// sb.append("\n") // 保留换行符
line = reader.readLine()
}
reader.close() // 关闭流
return parseSearchTip(sb.toString())
} }
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
...@@ -32,4 +43,92 @@ object SearchTipUtils { ...@@ -32,4 +43,92 @@ object SearchTipUtils {
return null return null
} }
fun parseSearchTip(content: String): ArrayList<String> {
LogEx.logDebug(TAG, "content=$content")
// val ss = ")]}'" +
// "[[[\"cathay pacific\",46,[512,433,465,131,199],{\"lm\":[],\"zh\":\"Cathay Pacific\",\"zi\":\"\",\"zp\":{\"gs_ssp\":\"eJzj4tTP1TcwNC7MzVZgNGB0YPDiS04syUisVChITM5My0wGAIIACQ8\"},\"zs\":\"https://encrypted-tbn0.gstatic.com/images?q\\u003dtbn:ANd9GcQtzgOhVqh-vupszYF_gIbWcyVwIdRMfpI_ba906tve\\u0026s\\u003d10\"}],[\"cat\\u003cb\\u003ehay pacific hk\\u003c\\/b\\u003e\",0,[512,433,131]],[\"cat\",46,[512,433,131],{\"lm\":[],\"zh\":\"Cat\",\"zi\":\"Animal\",\"zp\":{\"gs_ssp\":\"eJzj4tDP1TcwrCyqMGD0Yk5OLAEAIl8EWA\"},\"zs\":\"https://encrypted-tbn0.gstatic.com/images?q\\u003dtbn:ANd9GcT4e_IR-4BLrmcChIUBwzHJ0xFnhVRLPaDq3S4Zh-VcV95KdCNROxchRNy5Gg\\u0026s\\u003d10\"}],[\"cat\\u003cb\\u003ehay pacific online check in\\u003c\\/b\\u003e\",0,[512]],[\"cat\\u003cb\\u003ealog hk\\u003c\\/b\\u003e\",0,[512,433,131,650]],[\"cat\\u003cb\\u003ealog\\u003c\\/b\\u003e\",0,[512]],[\"cat\\u003cb\\u003ehay pacific booking\\u003c\\/b\\u003e\",0,[512,433]],[\"cat\\u003cb\\u003ehay pacific flight status\\u003c\\/b\\u003e\",0,[512]],[\"cat\\u003cb\\u003ehay shop\\u003c\\/b\\u003e\",0,[512,433,650]],[\"cat\\u003cb\\u003ehay check in\\u003c\\/b\\u003e\",0,[512,433]]],{\"ag\":{\"a\":{\"40024\":[\"\",\"\",1,20]}},\"q\":\"-26moM5WZmS00EjrsMoHYLIF1Zo\"}]"
val list = arrayListOf<String>()
try {
val json = content.replace(")]}'", "")
val jsonArray = JSONArray(json)
val firstArray = jsonArray.getJSONArray(0)
for (i in 0 until firstArray.length()) {
val subArray = firstArray.getJSONArray(i)
val name = subArray.getString(0).replace("<b>", "").replace("</b>", "")
// list.add(convertUnicodeToChinese(name))
val decodeContent = decodeHtmlEntities(name)
LogEx.logDebug(TAG, "decodeContent=$decodeContent")
list.add(decodeContent)
}
} catch (e: Exception) {
e.printStackTrace()
}
return list
}
fun decodeHtmlEntities(input: String): String {
val regex = "&#(\\d+);".toRegex()
val ss = regex.replace(input) { matchResult ->
val code = matchResult.groupValues[1]
LogEx.logDebug(TAG, "decodeHtmlEntities code=$code")
val unicodeInt = code.toInt()
val chinese = unicodeInt.toChar().toString()
LogEx.logDebug(TAG, "decodeHtmlEntities chinese=$chinese")
chinese
}
return ss
}
private fun test() {
// val ss = "[\n" +
// "\t[\n" +
// "\t\t[\"cathay pacific\", 46, [512, 433, 465, 131, 199], {\n" +
// "\t\t\t\"lm\": [],\n" +
// "\t\t\t\"zh\": \"Cathay Pacific\",\n" +
// "\t\t\t\"zi\": \"\",\n" +
// "\t\t\t\"zp\": {\n" +
// "\t\t\t\t\"gs_ssp\": \"eJzj4tTP1TcwNC7MzVZgNGB0YPDiS04syUisVChITM5My0wGAIIACQ8\"\n" +
// "\t\t\t},\n" +
// "\t\t\t\"zs\": \"https://encrypted-tbn0.gstatic.com/images?q\\u003dtbn:ANd9GcQtzgOhVqh-vupszYF_gIbWcyVwIdRMfpI_ba906tve\\u0026s\\u003d10\"\n" +
// "\t\t}],\n" +
// "\t\t[\"cat\\u003cb\\u003ehay pacific hk\\u003c\\/b\\u003e\", 0, [512, 433, 131]],\n" +
// "\t\t[\"cat\", 46, [512, 433, 131], {\n" +
// "\t\t\t\"lm\": [],\n" +
// "\t\t\t\"zh\": \"Cat\",\n" +
// "\t\t\t\"zi\": \"Animal\",\n" +
// "\t\t\t\"zp\": {\n" +
// "\t\t\t\t\"gs_ssp\": \"eJzj4tDP1TcwrCyqMGD0Yk5OLAEAIl8EWA\"\n" +
// "\t\t\t},\n" +
// "\t\t\t\"zs\": \"https://encrypted-tbn0.gstatic.com/images?q\\u003dtbn:ANd9GcT4e_IR-4BLrmcChIUBwzHJ0xFnhVRLPaDq3S4Zh-VcV95KdCNROxchRNy5Gg\\u0026s\\u003d10\"\n" +
// "\t\t}],\n" +
// "\t\t[\"cat\\u003cb\\u003ehay pacific online check in\\u003c\\/b\\u003e\", 0, [512]],\n" +
// "\t\t[\"cat\\u003cb\\u003ealog hk\\u003c\\/b\\u003e\", 0, [512, 433, 131, 650]],\n" +
// "\t\t[\"cat\\u003cb\\u003ealog\\u003c\\/b\\u003e\", 0, [512]],\n" +
// "\t\t[\"cat\\u003cb\\u003ehay pacific booking\\u003c\\/b\\u003e\", 0, [512, 433]],\n" +
// "\t\t[\"cat\\u003cb\\u003ehay pacific flight status\\u003c\\/b\\u003e\", 0, [512]],\n" +
// "\t\t[\"cat\\u003cb\\u003ehay shop\\u003c\\/b\\u003e\", 0, [512, 433, 650]],\n" +
// "\t\t[\"cat\\u003cb\\u003ehay check in\\u003c\\/b\\u003e\", 0, [512, 433]]\n" +
// "\t], {\n" +
// "\t\t\"ag\": {\n" +
// "\t\t\t\"a\": {\n" +
// "\t\t\t\t\"40024\": [\"\", \"\", 1, 20]\n" +
// "\t\t\t}\n" +
// "\t\t},\n" +
// "\t\t\"q\": \"-26moM5WZmS00EjrsMoHYLIF1Zo\"\n" +
// "\t}\n" +
// "]"
val ss = ")]}'\n" +
"[[[\"&#29483;&#21674;&#22823;&#25136;abc&#29229;\",46,[512],{\"lm\":[],\"zh\":\"a&#29483;b&#21674;c&#22823;&#25136;&#29229;\",\"zi\":\"&#35987;&#21674;&#22823;&#25136;&#29229; \\u2014 &#38651;&#29609;&#36938;&#25138;\",\"zp\":{\"gs_ssp\":\"eJzj4tVP1zc0TDczTTfLMKg0YPTif96z-umkVU-XLH_WseF5x1oAwEEO8g\"},\"zs\":\"https://encrypted-tbn0.gstatic.com/images?q\\u003dtbn:ANd9GcRGG_A_I5lQPkkqg2lMDbGh7oAoia7By2jhoHgJGox0\\u0026s\\u003d10\"}],[\"&#29483;&#21674;\",46,[512],{\"lm\":[],\"zh\":\"&#29483;&#21674;\",\"zi\":\"&#35987; \\u2014 &#21205;&#29289;\",\"zp\":{\"gs_ssp\":\"eJzj4tDP1TcwrCyqMGD0Ynves_rppFUAOMQHYg\"},\"zs\":\"https://encrypted-tbn0.gstatic.com/images?q\\u003dtbn:ANd9GcSQAMEz7n5AwO0o3jxemIZ42sRhDthz6T3rWt_HeYDP\\u0026s\\u003d10\"}],[\"&#29483;&#21674;app\",0,[512]],[\"&#29483;&#21674;&#23448;&#32593;\",0,[512]],[\"&#29483;&#21674;&#25104;&#20154;\",0,[512]],[\"&#29483;&#21674;app&#23448;&#32593;\",0,[512]],[\"&#29483;&#21674;&#22823;&#25136;&#29229; &#35282;&#33394;\",0,[512]],[\"&#29483;&#21674;&#27927;&#28577;\",0,[512]],[\"&#29483;&#21674;&#36393;&#22902;\",0,[512]],[\"&#29483;&#21674;&#23637;\",0,[512]]],{\"ag\":{\"a\":{\"40024\":[\"\",\"\",1,20]}},\"k\":1,\"q\":\"3e-YKkbWWUV1uyIpaIe2ORxb5OE\"}]"
val sss = SearchTipUtils.parseSearchTip(ss)
}
} }
\ No newline at end of file
...@@ -7,6 +7,7 @@ import android.os.Build ...@@ -7,6 +7,7 @@ import android.os.Build
import android.os.Environment import android.os.Environment
import android.os.StatFs import android.os.StatFs
import android.os.storage.StorageManager import android.os.storage.StorageManager
import android.text.TextUtils.replace
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
...@@ -91,13 +92,15 @@ class MainActivity : BaseActivity<ActivityMainBinding>() { ...@@ -91,13 +92,15 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
} }
addDeskShortCut() addDeskShortCut()
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data)
homeFragment?.onActivityResult(resultCode,resultCode,data) homeFragment?.onActivityResult(resultCode, resultCode, data)
} }
...@@ -170,5 +173,4 @@ class MainActivity : BaseActivity<ActivityMainBinding>() { ...@@ -170,5 +173,4 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
} }
} }
\ No newline at end of file
package com.base.browserwhite.ui.activity.search; package com.base.browserwhite.ui.activity.search
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.util.TypedValue;
import android.view.View;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import com.base.browserwhite.R;
import com.base.browserwhite.help.SearchTipUtils;
import com.base.browserwhite.utils.AppPreferences;
import com.base.browserwhite.utils.BarUtils;
import com.base.browserwhite.utils.LogEx;
import com.base.browserwhite.utils.ToastUtils;
public class SearchActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
BarUtils.INSTANCE.setStatusBarLightMode(this, true);
BarUtils.INSTANCE.setStatusBarColor(this, Color.TRANSPARENT);
setContentView(R.layout.activity_search);
ConstraintLayout layout = findViewById(R.id.appbar_layout);
CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) layout.getLayoutParams();
int finalPosition = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16, getResources().getDisplayMetrics());
layoutParams.topMargin = BarUtils.INSTANCE.getStatusBarHeight() + finalPosition;
layout.setLayoutParams(layoutParams);
layout.setVisibility(View.VISIBLE);
new Thread(new Runnable() {
@Override
public void run() {
String a = SearchTipUtils.INSTANCE.getSearchTip("w");
new Handler(getMainLooper()).post(new Runnable() {
@Override
public void run() {
if (a != null) {
ToastUtils.INSTANCE.toast(getApplicationContext(), a);
} else {
ToastUtils.INSTANCE.toast(getApplicationContext(), "空的");
}
}
});
import android.animation.Animator
import android.animation.ObjectAnimator
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import android.graphics.Color
import android.os.Handler
import android.util.TypedValue
import android.view.View
import android.widget.LinearLayout
import androidx.core.view.isVisible
import androidx.core.widget.addTextChangedListener
import com.base.browserwhite.R
import com.base.browserwhite.bean.ConstObject
import com.base.browserwhite.bean.ConstObject.searchEngineSp
import com.base.browserwhite.databinding.ActivitySearchBinding
import com.base.browserwhite.help.SearchTipUtils.getSearchTip
import com.base.browserwhite.ui.activity.BaseActivity
import com.base.browserwhite.ui.activity.webbrowser.WebBrowserActivity
import com.base.browserwhite.utils.BarUtils.getStatusBarHeight
import com.base.browserwhite.utils.BarUtils.setStatusBarColor
import com.base.browserwhite.utils.BarUtils.setStatusBarLightMode
import com.base.browserwhite.utils.LinkSearchUtils
class SearchActivity : BaseActivity<ActivitySearchBinding>() {
private lateinit var searchAdapter: SearchAdapter
override val binding: ActivitySearchBinding by lazy {
ActivitySearchBinding.inflate(layoutInflater)
}
override fun initView() {
setStatusBarLightMode(this, true)
setStatusBarColor(this, Color.TRANSPARENT)
val layout = binding.clTop
val layoutParams = layout.layoutParams as LinearLayout.LayoutParams
val finalPosition = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16f, getResources().displayMetrics).toInt()
layoutParams.topMargin = getStatusBarHeight() + finalPosition
layout.setLayoutParams(layoutParams)
layout.visibility = View.VISIBLE
switchSearch(searchEngineSp)
searchAdapter = SearchAdapter()
searchAdapter.searchAction = { content ->
startActivity(Intent(this, WebBrowserActivity::class.java).apply {
putExtra("url", LinkSearchUtils.getSpSearchAction(content))
})
}
binding.rv.adapter = searchAdapter
binding.editWeb.addTextChangedListener {
if (it.isNullOrEmpty()) {
return@addTextChangedListener
} }
binding.flSearch.isVisible = it.toString().isNotEmpty()
searchAdapter.submitList(listOf())
querySearchTip(it.toString())
}
}
override fun initListener() {
super.initListener()
binding.ivClear.setOnClickListener {
binding.editWeb.setText("")
}
binding.tvSearch.setOnClickListener {
val content = binding.editWeb.text.toString()
startActivity(Intent(this, WebBrowserActivity::class.java).apply {
putExtra("url", LinkSearchUtils.getSpSearchAction(content))
})
} }
).start(); }
String json = AppPreferences.getInstance().getString("SearchTipUtils", "");
LogEx.INSTANCE.logDebug("SearchTipUtils", "json=" + json, false); private fun querySearchTip(query: String) {
Thread {
val list = getSearchTip(query)
Handler(mainLooper).post {
if (list != null) {
searchAdapter.submitList(list)
} else {
searchAdapter.submitList(listOf())
}
}
}.start()
} }
@SuppressLint("MissingSuperCall") @SuppressLint("MissingSuperCall")
@Override override fun onBackPressed() {
public void onBackPressed() { finish()
finish(); setResult(10086)
setResult(10086); overridePendingTransition(0, 0)
overridePendingTransition(0, 0);
} }
companion object {
fun startActivityWithButtonAnimation(currentActivity: Activity, button: View, verticalOffset: Int) {
val finalPosition =
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16f, currentActivity.resources.displayMetrics).toInt()
val buttonTop = button.top - finalPosition
val distanceToTop = -buttonTop - verticalOffset
val animator = ObjectAnimator.ofFloat(button, "translationY", button.translationY, distanceToTop.toFloat())
animator.setDuration(500)
animator.addListener(object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator) {}
override fun onAnimationEnd(animation: Animator) {
button.visibility = View.VISIBLE
val intent = Intent(currentActivity, SearchActivity::class.java)
currentActivity.startActivityForResult(intent, 10086)
currentActivity.overridePendingTransition(R.anim.fade_in, R.anim.fade_out)
}
public static void startActivityWithButtonAnimation(Activity currentActivity, View button, int verticalOffset) { override fun onAnimationCancel(animation: Animator) {}
int finalPosition = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16, currentActivity.getResources().getDisplayMetrics()); override fun onAnimationRepeat(animation: Animator) {}
int buttonTop = button.getTop() - finalPosition; })
int distanceToTop = -buttonTop - verticalOffset; animator.start()
ObjectAnimator animator = ObjectAnimator.ofFloat(button, "translationY", button.getTranslationY(), distanceToTop); }
animator.setDuration(500); }
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
private fun switchSearch(website: String) {
searchEngineSp = website
when (website) {
ConstObject.GOOGLE -> {
binding.ivSearchEngine.setImageResource(R.mipmap.h_s_google)
} }
@Override ConstObject.BING -> {
public void onAnimationEnd(Animator animation) { binding.ivSearchEngine.setImageResource(R.mipmap.h_s_bing)
button.setVisibility(View.VISIBLE);
Intent intent = new Intent(currentActivity, SearchActivity.class);
currentActivity.startActivityForResult(intent, 10086);
currentActivity.overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
} }
@Override ConstObject.YAHOO -> {
public void onAnimationCancel(Animator animation) { binding.ivSearchEngine.setImageResource(R.mipmap.h_s_yahoo)
} }
@Override ConstObject.DUCKDUCKGO -> {
public void onAnimationRepeat(Animator animation) { binding.ivSearchEngine.setImageResource(R.mipmap.h_s_xuckd)
} }
});
animator.start(); ConstObject.YANDEX -> {
binding.ivSearchEngine.setImageResource(R.mipmap.h_s_yandex)
}
ConstObject.BAIDU -> {
binding.ivSearchEngine.setImageResource(R.mipmap.h_s_baidu)
}
}
} }
} }
package com.base.browserwhite.ui.activity.search
import android.content.Context
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.base.browserwhite.R
import com.base.browserwhite.databinding.ItemSearchTipBinding
import com.base.browserwhite.utils.XmlEx.inflate
import com.chad.library.adapter4.BaseQuickAdapter
class SearchAdapter : BaseQuickAdapter<String, SearchAdapter.SearchViewHolder>() {
inner class SearchViewHolder(view: View) : ViewHolder(view)
var searchAction: ((content: String) -> Unit)? = null
override fun onBindViewHolder(holder: SearchViewHolder, position: Int, item: String?) {
if (item == null) return
val binding = ItemSearchTipBinding.bind(holder.itemView)
binding.tvTip.text = item
binding.root.setOnClickListener {
searchAction?.invoke(item)
}
}
override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): SearchViewHolder {
return SearchViewHolder(R.layout.item_search_tip.inflate(parent))
}
}
\ No newline at end of file
...@@ -54,7 +54,7 @@ class WebBrowserActivity : BaseActivity<ActivityWebBrowserBinding>() { ...@@ -54,7 +54,7 @@ class WebBrowserActivity : BaseActivity<ActivityWebBrowserBinding>() {
val url = intent.extras?.getString("url") ?: "" val url = intent.extras?.getString("url") ?: ""
binding.editWeb.setText(url) binding.editWeb.setText(url)
val searchEngine = intent.extras?.getString("searchEngine") ?: GOOGLE val searchEngine = intent.extras?.getString("searchEngine") ?: searchEngineSp
when (searchEngine) { when (searchEngine) {
GOOGLE -> { GOOGLE -> {
binding.ivSearchEngine.setImageResource(R.mipmap.h_s_google) binding.ivSearchEngine.setImageResource(R.mipmap.h_s_google)
......
...@@ -18,6 +18,7 @@ import android.webkit.WebViewClient ...@@ -18,6 +18,7 @@ import android.webkit.WebViewClient
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.browserwhite.bean.BookmarkBean import com.base.browserwhite.bean.BookmarkBean
import com.base.browserwhite.bean.DownloadBean import com.base.browserwhite.bean.DownloadBean
import com.base.browserwhite.bean.HistoryBean
import com.base.browserwhite.databinding.FragmentWebViewBinding import com.base.browserwhite.databinding.FragmentWebViewBinding
import com.base.browserwhite.ui.activity.download.DownloadAdapter import com.base.browserwhite.ui.activity.download.DownloadAdapter
import com.base.browserwhite.ui.fragment.BaseFragment import com.base.browserwhite.ui.fragment.BaseFragment
...@@ -26,6 +27,8 @@ import com.base.browserwhite.utils.DownloadUtils.getDownloadJson ...@@ -26,6 +27,8 @@ import com.base.browserwhite.utils.DownloadUtils.getDownloadJson
import com.base.browserwhite.utils.DownloadUtils.getDownloadJsonBean import com.base.browserwhite.utils.DownloadUtils.getDownloadJsonBean
import com.base.browserwhite.utils.DownloadUtils.saveDownloadRecordFile import com.base.browserwhite.utils.DownloadUtils.saveDownloadRecordFile
import com.base.browserwhite.utils.LogEx import com.base.browserwhite.utils.LogEx
import com.base.browserwhite.utils.SpBeanUtils
import com.base.browserwhite.utils.SpBeanUtils.HISTORY_SP_KEY
import com.google.gson.Gson import com.google.gson.Gson
import com.liulishuo.filedownloader.FileDownloader import com.liulishuo.filedownloader.FileDownloader
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
...@@ -197,8 +200,10 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() { ...@@ -197,8 +200,10 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() {
override fun onPageFinished(view: WebView?, url: String?) { override fun onPageFinished(view: WebView?, url: String?) {
LogEx.logDebug(TAG, "onPageFinished") LogEx.logDebug(TAG, "onPageFinished")
super.onPageFinished(view, url) super.onPageFinished(view, url)
bookmarkBean.name = view?.title.toString() val tittle= view?.title.toString()
bookmarkBean.name = tittle
onPageFinished?.invoke(url) onPageFinished?.invoke(url)
SpBeanUtils.addSpBean(HISTORY_SP_KEY,HistoryBean(name = tittle,url=url?:"", time = System.currentTimeMillis()))
} }
override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError?) { override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError?) {
......
...@@ -32,6 +32,7 @@ import com.base.browserwhite.fcm.NotificationUtil ...@@ -32,6 +32,7 @@ import com.base.browserwhite.fcm.NotificationUtil
import com.base.browserwhite.help.Constants import com.base.browserwhite.help.Constants
import com.base.browserwhite.help.NewsUtils.requestNews import com.base.browserwhite.help.NewsUtils.requestNews
import com.base.browserwhite.help.RxBus import com.base.browserwhite.help.RxBus
import com.base.browserwhite.help.SearchTipUtils
import com.base.browserwhite.ui.activity.search.SearchActivity import com.base.browserwhite.ui.activity.search.SearchActivity
import com.base.browserwhite.ui.activity.appprocess.AppProcessActivity import com.base.browserwhite.ui.activity.appprocess.AppProcessActivity
import com.base.browserwhite.ui.activity.bookmark.BookmarkActivity import com.base.browserwhite.ui.activity.bookmark.BookmarkActivity
...@@ -84,6 +85,9 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() { ...@@ -84,6 +85,9 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
@SuppressLint("CheckResult") @SuppressLint("CheckResult")
override fun setView() { override fun setView() {
switchSearch(searchEngineSp)
mChangeSearchType = RxBus.get().register(Constants.CHANGE_SEARCH_TYPE, String::class.java) mChangeSearchType = RxBus.get().register(Constants.CHANGE_SEARCH_TYPE, String::class.java)
mChangeSearchType?.observeOn(AndroidSchedulers.mainThread())?.subscribe { t -> mChangeSearchType?.observeOn(AndroidSchedulers.mainThread())?.subscribe { t ->
LogEx.logDebug("glc", "i:$t") LogEx.logDebug("glc", "i:$t")
...@@ -183,7 +187,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() { ...@@ -183,7 +187,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
} }
y = binding.searchLayout.translationY y = binding.searchLayout.translationY
binding.editWeb.setOnClickListener { binding.editWeb.setOnClickListener {
SearchActivity.startActivityWithButtonAnimation(activity, binding.searchLayout, verticalOffset) SearchActivity.startActivityWithButtonAnimation(requireActivity(), binding.searchLayout, verticalOffset)
} }
requestMore() requestMore()
} }
...@@ -336,7 +340,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() { ...@@ -336,7 +340,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
// i++ // i++
// lastClickTime = System.currentTimeMillis() // lastClickTime = System.currentTimeMillis()
NotificationUtil.sendNotification(requireContext(), ConstObject.ID_NEWS) // NotificationUtil.sendNotification(requireContext(), ConstObject.ID_NEWS)
} }
binding.ivUp.setOnClickListener { binding.ivUp.setOnClickListener {
binding.rv.scrollToPosition(0) binding.rv.scrollToPosition(0)
...@@ -397,5 +401,4 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() { ...@@ -397,5 +401,4 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
} }
} }
} }
\ No newline at end of file
...@@ -8,7 +8,7 @@ object SpBeanUtils { ...@@ -8,7 +8,7 @@ object SpBeanUtils {
const val BOOKMARK_SP_KEY = "bookmark_sp_key"//书签 const val BOOKMARK_SP_KEY = "bookmark_sp_key"//书签
const val BOOKMARK_NAV_SP_KEY = "bookmark_nav_sp_key"//书签导航 const val BOOKMARK_NAV_SP_KEY = "bookmark_nav_sp_key"//书签导航
const val SEARCH_RECORD_SP_KEY = "search_record_sp_key" const val HISTORY_SP_KEY = "history_sp_key"
fun getSpBeanList(key: String): List<String> { fun getSpBeanList(key: String): List<String> {
val sp = AppPreferences.getInstance().getString(key, "") val sp = AppPreferences.getInstance().getString(key, "")
......
<androidx.coordinatorlayout.widget.CoordinatorLayout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"> android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/appbar_layout" android:id="@+id/cl_top"
android:layout_width="match_parent" android:layout_width="match_parent"
android:visibility="gone"
android:layout_height="50dp" android:layout_height="50dp"
android:layout_marginHorizontal="15dp" android:layout_marginHorizontal="15dp"
android:background="@drawable/bg_stroke_070709" android:background="@drawable/bg_stroke_070709"
...@@ -35,7 +35,8 @@ ...@@ -35,7 +35,8 @@
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<ImageView <ImageView
android:layout_width="wrap_content" android:layout_width="wrap_content"
...@@ -64,30 +65,58 @@ ...@@ -64,30 +65,58 @@
android:singleLine="true" android:singleLine="true"
android:textColorHint="#858587" android:textColorHint="#858587"
android:textSize="14sp" android:textSize="14sp"
app:layout_constraintEnd_toStartOf="@id/fl_scan" app:layout_constraintEnd_toStartOf="@id/fl_search"
app:layout_constraintStart_toEndOf="@id/fl_search_engine" app:layout_constraintStart_toEndOf="@id/fl_search_engine"
tools:ignore="Autofill,HardcodedText,TextFields" /> tools:ignore="Autofill,HardcodedText,TextFields" />
<FrameLayout <LinearLayout
android:id="@+id/fl_scan" android:visibility="gone"
android:id="@+id/fl_search"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="10dp" android:layout_margin="10dp"
android:background="?android:attr/selectableItemBackground" android:background="?android:attr/selectableItemBackground"
android:orientation="horizontal"
android:padding="5dp" android:padding="5dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription"> tools:ignore="ContentDescription">
<ImageView <ImageView
android:id="@+id/iv_clear"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:src="@mipmap/saoyisao" /> android:src="@mipmap/s_guanbi" />
</FrameLayout> <TextView
android:id="@+id/tv_search"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:text="Search"
android:textColor="#0571ED"
android:textSize="16sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginVertical="10dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_search_tip" />
</FrameLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout> </LinearLayout>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginVertical="10dp"
android:layout_marginStart="20dp"
android:src="@mipmap/s_wangluo"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tv_tip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="8dp"
android:textColor="@color/black"
android:textSize="16sp"
tools:text="https://www.wikipedia.org/" />
</LinearLayout>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment