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.Animator
import android.animation.ObjectAnimator; import android.animation.ObjectAnimator
import android.annotation.SuppressLint; import android.annotation.SuppressLint
import android.app.Activity; import android.app.Activity
import android.content.Intent; import android.content.Intent
import android.graphics.Color; import android.graphics.Color
import android.os.Bundle; import android.os.Handler
import android.os.Handler; import android.util.TypedValue
import android.util.TypedValue; import android.view.View
import android.view.View; import android.widget.LinearLayout
import androidx.core.view.isVisible
import androidx.annotation.Nullable; import androidx.core.widget.addTextChangedListener
import androidx.appcompat.app.AppCompatActivity; import com.base.browserwhite.R
import androidx.constraintlayout.widget.ConstraintLayout; import com.base.browserwhite.bean.ConstObject
import androidx.coordinatorlayout.widget.CoordinatorLayout; import com.base.browserwhite.bean.ConstObject.searchEngineSp
import com.base.browserwhite.databinding.ActivitySearchBinding
import com.base.browserwhite.R; import com.base.browserwhite.help.SearchTipUtils.getSearchTip
import com.base.browserwhite.help.SearchTipUtils; import com.base.browserwhite.ui.activity.BaseActivity
import com.base.browserwhite.utils.AppPreferences; import com.base.browserwhite.ui.activity.webbrowser.WebBrowserActivity
import com.base.browserwhite.utils.BarUtils; import com.base.browserwhite.utils.BarUtils.getStatusBarHeight
import com.base.browserwhite.utils.LogEx; import com.base.browserwhite.utils.BarUtils.setStatusBarColor
import com.base.browserwhite.utils.ToastUtils; import com.base.browserwhite.utils.BarUtils.setStatusBarLightMode
import com.base.browserwhite.utils.LinkSearchUtils
public class SearchActivity extends AppCompatActivity {
@Override class SearchActivity : BaseActivity<ActivitySearchBinding>() {
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); private lateinit var searchAdapter: SearchAdapter
BarUtils.INSTANCE.setStatusBarLightMode(this, true);
BarUtils.INSTANCE.setStatusBarColor(this, Color.TRANSPARENT); override val binding: ActivitySearchBinding by lazy {
setContentView(R.layout.activity_search); ActivitySearchBinding.inflate(layoutInflater)
}
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()); override fun initView() {
layoutParams.topMargin = BarUtils.INSTANCE.getStatusBarHeight() + finalPosition; setStatusBarLightMode(this, true)
layout.setLayoutParams(layoutParams); setStatusBarColor(this, Color.TRANSPARENT)
layout.setVisibility(View.VISIBLE);
val layout = binding.clTop
new Thread(new Runnable() { val layoutParams = layout.layoutParams as LinearLayout.LayoutParams
@Override val finalPosition = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16f, getResources().displayMetrics).toInt()
public void run() { layoutParams.topMargin = getStatusBarHeight() + finalPosition
String a = SearchTipUtils.INSTANCE.getSearchTip("w"); layout.setLayoutParams(layoutParams)
new Handler(getMainLooper()).post(new Runnable() { layout.visibility = View.VISIBLE
@Override
public void run() { switchSearch(searchEngineSp)
if (a != null) {
ToastUtils.INSTANCE.toast(getApplicationContext(), a); searchAdapter = SearchAdapter()
} else { searchAdapter.searchAction = { content ->
ToastUtils.INSTANCE.toast(getApplicationContext(), "空的"); 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)
} }
override fun onAnimationCancel(animation: Animator) {}
override fun onAnimationRepeat(animation: Animator) {}
})
animator.start()
}
}
private fun switchSearch(website: String) {
searchEngineSp = website
when (website) {
ConstObject.GOOGLE -> {
binding.ivSearchEngine.setImageResource(R.mipmap.h_s_google)
}
public static void startActivityWithButtonAnimation(Activity currentActivity, View button, int verticalOffset) { ConstObject.BING -> {
int finalPosition = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16, currentActivity.getResources().getDisplayMetrics()); binding.ivSearchEngine.setImageResource(R.mipmap.h_s_bing)
int buttonTop = button.getTop() - finalPosition; }
int distanceToTop = -buttonTop - verticalOffset;
ObjectAnimator animator = ObjectAnimator.ofFloat(button, "translationY", button.getTranslationY(), distanceToTop); ConstObject.YAHOO -> {
animator.setDuration(500); binding.ivSearchEngine.setImageResource(R.mipmap.h_s_yahoo)
animator.addListener(new Animator.AnimatorListener() { }
@Override
public void onAnimationStart(Animator animation) {
ConstObject.DUCKDUCKGO -> {
binding.ivSearchEngine.setImageResource(R.mipmap.h_s_xuckd)
} }
@Override ConstObject.YANDEX -> {
public void onAnimationEnd(Animator animation) { binding.ivSearchEngine.setImageResource(R.mipmap.h_s_yandex)
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.BAIDU -> {
public void onAnimationCancel(Animator animation) { binding.ivSearchEngine.setImageResource(R.mipmap.h_s_baidu)
} }
@Override
public void onAnimationRepeat(Animator animation) {
} }
});
animator.start();
} }
} }
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