diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e731c9c..2fdca60 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -94,33 +94,19 @@ dependencies { implementation("com.google.mlkit:text-recognition-japanese:16.0.0") // To recognize Korean script implementation("com.google.mlkit:text-recognition-korean:16.0.0") + // 文本识别 + implementation("com.google.mlkit:language-id:17.0.5") // CameraX core library implementation(libs.androidx.camera.core) - // CameraX Camera2 extensions implementation(libs.androidx.camera.camera2) - // CameraX Lifecycle library implementation(libs.androidx.camera.lifecycle) - // CameraX View class implementation(libs.androidx.camera.view) - // 文本识别 - // To recognize Latin script -// implementation(libs.play.services.mlkit.text.recognition) -// // To recognize Chinese script -// implementation(libs.play.services.mlkit.text.recognition.chinese) -// // To recognize Devanagari script -// implementation(libs.play.services.mlkit.text.recognition.devanagari) -// // To recognize Japanese script -// implementation(libs.play.services.mlkit.text.recognition.japanese) -// // To recognize Korean script -// implementation(libs.play.services.mlkit.text.recognition.korean) - - // other implementation(libs.guava) implementation(libs.retrofit) diff --git a/app/src/main/java/com/assimilate/alltrans/common/LolAdWrapper.kt b/app/src/main/java/com/assimilate/alltrans/common/LolAdWrapper.kt index 4f7672c..58341aa 100644 --- a/app/src/main/java/com/assimilate/alltrans/common/LolAdWrapper.kt +++ b/app/src/main/java/com/assimilate/alltrans/common/LolAdWrapper.kt @@ -1,16 +1,18 @@ package com.assimilate.alltrans.common import android.app.Activity -import android.util.Log import android.widget.FrameLayout import com.assimilate.alltrans.MyApp +import com.google.android.gms.ads.interstitial.InterstitialAd import com.lol.apex.ok.google.adlibrary.base.listener.AdLoadListener import com.lol.apex.ok.google.adlibrary.base.listener.AdShowListener import com.lol.apex.ok.google.adlibrary.base.listener.LolLoadError import com.lol.apex.ok.google.adlibrary.base.listener.LolShowError +import com.lol.apex.ok.google.adlibrary.bean.AdType import com.lol.apex.ok.google.adlibrary.inner.LOLAdsInnerDispatcher import com.lol.apex.ok.google.adlibrary.inner.base.AdInnerLoadAdapter import com.lol.apex.ok.google.adlibrary.inner.base.AdInnerShowAdapter +import com.lol.apex.ok.google.adlibrary.inst.InstAdCache import com.lol.apex.ok.google.adlibrary.inst.LOLAdsInstDispatcher import com.lol.apex.ok.google.adlibrary.rewarded.LOLAdsRewardedDispatcher @@ -36,6 +38,7 @@ class LolAdWrapper { return LOLAdsInstDispatcher.canShow(placement, false) } + fun hasRewardCache(placement: String): Boolean { return LOLAdsRewardedDispatcher.canShow(placement) } @@ -167,6 +170,7 @@ class LolAdWrapper { private fun showAd(act: Activity, placement: String, listener: LolShowListener? = null) { if (act.isFinishing) return LOLAdsInstDispatcher.getShower(act, placement, object : AdShowListener { + override fun onAdClicked() { MyApp.app.isAdShowing.set(true) } @@ -202,5 +206,6 @@ class LolAdWrapper { }).showAd() } + } diff --git a/app/src/main/java/com/assimilate/alltrans/common/MyTextTools.kt b/app/src/main/java/com/assimilate/alltrans/common/MyTextTools.kt new file mode 100644 index 0000000..5200927 --- /dev/null +++ b/app/src/main/java/com/assimilate/alltrans/common/MyTextTools.kt @@ -0,0 +1,113 @@ +package com.assimilate.alltrans.common + +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context +import android.content.Intent +import android.speech.tts.TextToSpeech +import android.speech.tts.UtteranceProgressListener +import android.text.TextUtils +import android.util.Log +import android.widget.Toast +import com.assimilate.alltrans.R +import com.assimilate.alltrans.model.LanguagesConstants +import com.assimilate.alltrans.model.PreferenceLanguageUtils +import com.assimilate.alltrans.mydb.DbTranslation +import com.assimilate.alltrans.mydb.Translations +import java.util.Locale + + +object MyTextTools { + + private lateinit var tts: TextToSpeech + + // 添加历史 + fun addToHistory(context: Context, rText: String, transResult: String?) { + val dbTranslation = DbTranslation(context) + val translations = Translations( + PreferenceLanguageUtils.getString("language_source"), + rText, + PreferenceLanguageUtils.getString("language_target"), + transResult + + ) + dbTranslation.addTranslation(translations) + } + + // 分享文本 + fun shareText(context: Context, text: String) { + val share: String = text.trim() + if (!TextUtils.isEmpty(share)) { + val intent = Intent(Intent.ACTION_SEND) + intent.setType("text/plain") + intent.putExtra(Intent.EXTRA_TEXT, share) + context.startActivity(Intent.createChooser(intent, "Share " + R.string.app_name)) + } + } + + // 复制到粘贴板 + fun copyToClipboard(context: Context, string: String) { + val tip = "Copied to clipboard!" + val tipNull = "text is null!" + val share = string.trim() + if (!TextUtils.isEmpty(share)) { + val clipboardManager = + context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val clipData = ClipData.newPlainText("targetValue", share) + clipboardManager.setPrimaryClip(clipData) + Toast.makeText(context, tip, Toast.LENGTH_SHORT).show() + } else { + Toast.makeText(context, tipNull, Toast.LENGTH_SHORT).show() + } + } + + // 朗读文本 + fun ttsReadText(text: String, targetLanguage: String, context: Context) { + Toast.makeText(context, R.string.tr_tts_reading, Toast.LENGTH_SHORT).show() + tts = TextToSpeech(context) { status -> + if (TextToSpeech.SUCCESS == status) tts.setLanguage( + Locale.getDefault() + ) + + tts.setSpeechRate(0.7f) + val speech: String = text.trim() + if (!TextUtils.isEmpty(speech)) { + // 获取目标语言的语言代码 + val languageCode = + LanguagesConstants.getInstance() + .getLanguageCodeByLanguage(targetLanguage, context) + Log.d("LanguageCode", "Language Code for $targetLanguage: $languageCode") + + // 创建语言 Locale 对象 + val locale = Locale(languageCode) + + // 判断语言是否支持 + if (TextToSpeech.LANG_NOT_SUPPORTED != tts.isLanguageAvailable(locale)) { + tts.language = locale + tts.speak(speech, TextToSpeech.QUEUE_FLUSH, null, null) + } else { + Toast.makeText(context, R.string.tr_tts_error, Toast.LENGTH_SHORT).show() + } + + tts.setOnUtteranceProgressListener(object : UtteranceProgressListener() { + override fun onStart(utteranceId: String?) { + + } + + override fun onDone(utteranceId: String?) { + tts.shutdown() + } + + @Deprecated("Deprecated in Java") + override fun onError(utteranceId: String?) { + tts.shutdown() + } + }) + + + } + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/assimilate/alltrans/common/TextGraphic.kt b/app/src/main/java/com/assimilate/alltrans/common/TextGraphic.kt index b03826e..2e64707 100644 --- a/app/src/main/java/com/assimilate/alltrans/common/TextGraphic.kt +++ b/app/src/main/java/com/assimilate/alltrans/common/TextGraphic.kt @@ -22,7 +22,7 @@ class TextGraphic( private val showConfidence: Boolean, private val textShow: Boolean, private val needTrans: Boolean, - private val fbFrom:String + private val fbFrom: String ) : GraphicOverlay.Graphic(overlay) { private val textPaint: TextPaint = TextPaint().apply { @@ -35,14 +35,15 @@ class TextGraphic( color = MARKER_COLOR style = Paint.Style.FILL } - private var hiddenTextBlocks: MutableList = MutableList(text.textBlocks.size) { !textShow } + private var hiddenTextBlocks: MutableList = + MutableList(text.textBlocks.size) { !textShow } private var isVisible: Boolean init { isVisible = textShow if (needTrans) { - TranslationManager(text,fbFrom) { translatedTextPairs -> + TranslationManager(text, fbFrom) { translatedTextPairs -> translatedTextBlocks = translatedTextPairs.map { it.first } // 可以同时打印原Text和翻译后的结果 translatedTextPairs.forEach { (translated, original) -> @@ -51,7 +52,6 @@ class TextGraphic( postInvalidate() } } - // Redraw the overlay, as this graphic has been added. postInvalidate() } @@ -156,11 +156,12 @@ class TextGraphic( var textLayout: StaticLayout while (textSize > 0) { textPaintCopy.textSize = textSize - textLayout = StaticLayout.Builder.obtain(text, 0, text.length, textPaintCopy, availableWidth) - .setAlignment(Layout.Alignment.ALIGN_NORMAL) - .setLineSpacing(0.0f, 1.0f) - .setIncludePad(false) - .build() + textLayout = + StaticLayout.Builder.obtain(text, 0, text.length, textPaintCopy, availableWidth) + .setAlignment(Layout.Alignment.ALIGN_NORMAL) + .setLineSpacing(0.0f, 1.0f) + .setIncludePad(false) + .build() if (textLayout.height <= availableHeight) { break @@ -168,11 +169,12 @@ class TextGraphic( textSize -= 1 } - textLayout = StaticLayout.Builder.obtain(text, 0, text.length, textPaintCopy, availableWidth) - .setAlignment(Layout.Alignment.ALIGN_NORMAL) - .setLineSpacing(0.0f, 1.0f) - .setIncludePad(false) - .build() + textLayout = + StaticLayout.Builder.obtain(text, 0, text.length, textPaintCopy, availableWidth) + .setAlignment(Layout.Alignment.ALIGN_NORMAL) + .setLineSpacing(0.0f, 1.0f) + .setIncludePad(false) + .build() canvas.save() canvas.translate(rect.left, rect.top) diff --git a/app/src/main/java/com/assimilate/alltrans/common/TextRecognitionProcessor.kt b/app/src/main/java/com/assimilate/alltrans/common/TextRecognitionProcessor.kt index 1e6b769..c6f7769 100644 --- a/app/src/main/java/com/assimilate/alltrans/common/TextRecognitionProcessor.kt +++ b/app/src/main/java/com/assimilate/alltrans/common/TextRecognitionProcessor.kt @@ -20,11 +20,12 @@ class TextRecognitionProcessor( private val textShow:Boolean, private val needTrans: Boolean, private val fbFrom:String, - private val callback: TextRecognitionCallback? = null // 添加回调 + private val callback: TextRecognitionCallback? = null ) : VisionProcessorBase(context) { interface TextRecognitionCallback { - fun onTextRecognized(text: String) + fun onTextRecognized(text: Text,graphicOverlay: GraphicOverlay) + fun onTextFailure(e: Exception) } private val textRecognizer: TextRecognizer = TextRecognition.getClient(textRecognizerOptions) @@ -43,10 +44,8 @@ class TextRecognitionProcessor( } override fun onSuccess(text: Text, graphicOverlay: GraphicOverlay) { + // PreferenceLanguageUtils.putString("language_source", getMostFrequentLanguage(text)) - - Log.d(TAG, "On-device Text detection successful") - logExtrasForTesting(text) graphicOverlay.add( TextGraphic( graphicOverlay, @@ -61,10 +60,13 @@ class TextRecognitionProcessor( ) // 调用回调 - callback?.onTextRecognized(text.text) + callback?.onTextRecognized(text,graphicOverlay) + logExtrasForTesting(text) + } override fun onFailure(e: Exception) { + callback?.onTextFailure(e) Log.w(TAG, "Text detection failed.$e") } diff --git a/app/src/main/java/com/assimilate/alltrans/common/TranslationManager.kt b/app/src/main/java/com/assimilate/alltrans/common/TranslationManager.kt index 9c20c78..f239630 100644 --- a/app/src/main/java/com/assimilate/alltrans/common/TranslationManager.kt +++ b/app/src/main/java/com/assimilate/alltrans/common/TranslationManager.kt @@ -42,10 +42,11 @@ class TranslationManager( val translator: Translator = GoogleTranslator() - for ((index, textBlock) in text.textBlocks.withIndex()) { - // 如果源语言和目标语言相同,直接添加原始文本到 translatedTextBlocks + //根据indices获取对应的文本块将翻译后的文本对应 + for (index in text.textBlocks.indices) { + // 如果源语言和目标语言相同,直接添加原始文本到 translatedTextBlocks 不请求网络 if (lanSourceCode == lanTargetCode) { - translatedTextBlocks.add(Pair(index, textBlock.text)) + translatedTextBlocks.add(Pair(index, text.textBlocks[index].text)) if (translatedTextBlocks.size == text.textBlocks.size) { handler.post { callback(translatedTextBlocks.sortedBy { it.first } @@ -56,7 +57,7 @@ class TranslationManager( val param = HashMap().apply { put("sourceLanguage", lanSourceCode) put("translationLanguage", lanTargetCode) - put("text", textBlock.text) + put("text", text.textBlocks[index].text) } translator.translate(param, object : GoogleTranslator.GoogleTranslateCallback { @@ -64,7 +65,7 @@ class TranslationManager( if (result != null) { translatedTextBlocks.add(Pair(index, result)) } else { - translatedTextBlocks.add(Pair(index, "")) + translatedTextBlocks.add(Pair(index, text.textBlocks[index].text)) } if (translatedTextBlocks.size == text.textBlocks.size) { @@ -76,7 +77,7 @@ class TranslationManager( } override fun onFailure(errorMessage: String?) { - translatedTextBlocks.add(Pair(index, "")) + translatedTextBlocks.add(Pair(index, text.textBlocks[index].text)) if (translatedTextBlocks.size == text.textBlocks.size) { handler.post { callback(translatedTextBlocks.sortedBy { it.first } @@ -84,32 +85,43 @@ class TranslationManager( } } - when (fbFrom) { - "global" -> { - FirebaseAnalyticsHelper.hoverGlobalResultEvent(MyApp.Config.FAIL_REASON,fbFrom + "_" + errorMessage) - } - - "float" -> { - FirebaseAnalyticsHelper.hoverGlobalResultEvent(MyApp.Config.FAIL_REASON,fbFrom + "_" + errorMessage) - - } - - "photo" -> { - FirebaseAnalyticsHelper.imagePhotoResultEvent(MyApp.Config.FAIL_REASON,fbFrom + "_" + errorMessage) - - } - - "image" -> { - FirebaseAnalyticsHelper.imageCameraResultEvent(MyApp.Config.FAIL_REASON,fbFrom + "_" + errorMessage) - } - - } - - + transFailEvent(errorMessage) } }) } } } } + + private fun transFailEvent(errorMessage: String?) { + when (fbFrom) { + "global" -> { + FirebaseAnalyticsHelper.hoverGlobalResultEvent( + MyApp.Config.FAIL_REASON, + fbFrom + "_" + errorMessage + ) + } + + "float" -> { + FirebaseAnalyticsHelper.hoverGlobalResultEvent( + MyApp.Config.FAIL_REASON, + fbFrom + "_" + errorMessage + ) + } + + "photo" -> { + FirebaseAnalyticsHelper.imagePhotoResultEvent( + MyApp.Config.FAIL_REASON, + fbFrom + "_" + errorMessage + ) + } + + "image" -> { + FirebaseAnalyticsHelper.imageCameraResultEvent( + MyApp.Config.FAIL_REASON, + fbFrom + "_" + errorMessage + ) + } + } + } } diff --git a/app/src/main/java/com/assimilate/alltrans/curview/ControlView.kt b/app/src/main/java/com/assimilate/alltrans/curview/ControlView.kt index 85058d0..27981c9 100644 --- a/app/src/main/java/com/assimilate/alltrans/curview/ControlView.kt +++ b/app/src/main/java/com/assimilate/alltrans/curview/ControlView.kt @@ -87,10 +87,12 @@ class ControlView(private val context: Context) { fullScreenView.setOnTouchListener { _, event -> if (event.action == MotionEvent.ACTION_DOWN) { removeControlView() + fullScreenView.performClick() true } else { false } + } diff --git a/app/src/main/java/com/assimilate/alltrans/curview/CopyTextView.kt b/app/src/main/java/com/assimilate/alltrans/curview/CopyTextView.kt index e296a5e..7edbdac 100644 --- a/app/src/main/java/com/assimilate/alltrans/curview/CopyTextView.kt +++ b/app/src/main/java/com/assimilate/alltrans/curview/CopyTextView.kt @@ -17,6 +17,7 @@ import android.widget.Toast import com.assimilate.alltrans.common.TextRecognitionProcessor import com.assimilate.alltrans.common.VisionImageProcessor import com.assimilate.alltrans.databinding.LayoutSusCopyBinding +import com.google.mlkit.vision.text.Text import com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions import java.io.IOException @@ -38,7 +39,7 @@ class CopyTextView(private val context: Context) : // 这里还需要调整 imageProcessor = TextRecognitionProcessor( context, - ChineseTextRecognizerOptions.Builder().build(), true, false, "",this + ChineseTextRecognizerOptions.Builder().build(), true, false, "", this ) val inflater = LayoutInflater.from(context) @@ -68,9 +69,9 @@ class CopyTextView(private val context: Context) : } binding?.btSusCopyAll?.setOnClickListener { - Log.d("gdsfsfsadf",recognizedText.toString()) + Log.d("gdsfsfsadf", recognizedText.toString()) copyToClipboard(recognizedText.toString()) - // removeView() + // removeView() } } @@ -135,10 +136,13 @@ class CopyTextView(private val context: Context) : } } - override fun onTextRecognized(text: String) { - recognizedText = text + override fun onTextRecognized(text: Text, graphicOverlay: GraphicOverlay) { + recognizedText = text.text + } + override fun onTextFailure(e: Exception) { + Log.d("copy_", e.toString()) } // 复制到粘贴板 diff --git a/app/src/main/java/com/assimilate/alltrans/curview/DistrictView.kt b/app/src/main/java/com/assimilate/alltrans/curview/DistrictView.kt index 20ad9d3..5b4cc53 100644 --- a/app/src/main/java/com/assimilate/alltrans/curview/DistrictView.kt +++ b/app/src/main/java/com/assimilate/alltrans/curview/DistrictView.kt @@ -49,6 +49,7 @@ class DistrictView( setOnTouchListener { _, event -> if (event.action == MotionEvent.ACTION_DOWN) { removeDistrictView() + performClick() } true } diff --git a/app/src/main/java/com/assimilate/alltrans/curview/FloatingView.kt b/app/src/main/java/com/assimilate/alltrans/curview/FloatingView.kt index c052df5..4176bfd 100644 --- a/app/src/main/java/com/assimilate/alltrans/curview/FloatingView.kt +++ b/app/src/main/java/com/assimilate/alltrans/curview/FloatingView.kt @@ -127,6 +127,7 @@ class FloatingView( private val touchSlop = ViewConfiguration.get(context).scaledTouchSlop private val maxClickDuration = 500 // 最大点击时间(毫秒) + override fun onTouch(v: View?, event: MotionEvent): Boolean { when (event.action) { MotionEvent.ACTION_DOWN -> { @@ -139,6 +140,7 @@ class FloatingView( handler.removeCallbacks(fadeRunnable) imageView.alpha = 1.0f imageView.setImageResource(originalImageResId) + return true } @@ -150,6 +152,7 @@ class FloatingView( imageView.setImageResource(originalImageResId) stickToEdge() + imageView.performClick() if (isClick && duration < maxClickDuration) { onClickListener?.onClick() } else { @@ -193,10 +196,10 @@ class FloatingView( Log.e("FloatingView", "View not attached to window manager", e) } } - return true } } + return false } }) diff --git a/app/src/main/java/com/assimilate/alltrans/curview/GraphicOverlay.java b/app/src/main/java/com/assimilate/alltrans/curview/GraphicOverlay.java index 8170446..a1c3950 100755 --- a/app/src/main/java/com/assimilate/alltrans/curview/GraphicOverlay.java +++ b/app/src/main/java/com/assimilate/alltrans/curview/GraphicOverlay.java @@ -9,7 +9,6 @@ import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.util.AttributeSet; -import android.util.Log; import android.view.MotionEvent; import android.view.View; @@ -57,23 +56,11 @@ public class GraphicOverlay extends View { */ public abstract static class Graphic { private GraphicOverlay overlay; - private boolean textVisible = true; // 添加可见性 public Graphic(GraphicOverlay overlay) { this.overlay = overlay; } - - public boolean isVisible() { - return textVisible; - } - - public void setVisible(boolean visible) { - this.textVisible = visible; - overlay.postInvalidate(); - } - - /** * Draw the graphic on the supplied canvas. Drawing should use the following methods to convert * to view coordinates for the graphics that are drawn: @@ -89,7 +76,6 @@ public class GraphicOverlay extends View { */ public abstract void draw(Canvas canvas); - public abstract boolean contains(float x, float y); protected void drawRect( diff --git a/app/src/main/java/com/assimilate/alltrans/viewui/HistoryActivity.kt b/app/src/main/java/com/assimilate/alltrans/viewui/HistoryActivity.kt index 1d5f3bd..afc1b9b 100644 --- a/app/src/main/java/com/assimilate/alltrans/viewui/HistoryActivity.kt +++ b/app/src/main/java/com/assimilate/alltrans/viewui/HistoryActivity.kt @@ -1,6 +1,7 @@ package com.assimilate.alltrans.viewui import android.content.Context +import android.content.Intent import android.os.Bundle import android.speech.tts.TextToSpeech import android.view.View @@ -55,7 +56,6 @@ class HistoryActivity : AppCompatActivity() { ) } - initClick() } @@ -72,11 +72,10 @@ class HistoryActivity : AppCompatActivity() { binding!!.tvFuncTrans.text = getString(R.string.favor_title) val list = DbTranslation(this).getTranslations(true) if (list.isEmpty()) { - binding!!.defEmpty.visibility = View.VISIBLE + binding!!.llEmptyFav.visibility = View.VISIBLE binding!!.remove.visibility = View.GONE - binding!!.defEmpty.text = getString(R.string.favor_emtpoy) } else { - binding!!.defEmpty.visibility = View.GONE + binding!!.llEmptyFav.visibility = View.GONE binding!!.remove.visibility = View.GONE } if (null != list && list.isNotEmpty()) { @@ -88,11 +87,10 @@ class HistoryActivity : AppCompatActivity() { val list = DbTranslation(this).getTranslations(false) if (list.isEmpty()) { binding!!.remove.visibility = View.GONE - binding!!.defEmpty.visibility = View.VISIBLE - binding!!.defEmpty.text = getString(R.string.his_emtpoy) + binding!!.llEmptyHis.visibility = View.VISIBLE } else { binding!!.remove.visibility = View.GONE - binding!!.defEmpty.visibility = View.GONE + binding!!.llEmptyHis.visibility = View.GONE } if (null != list && list.isNotEmpty()) { translations.addAll(list) @@ -192,9 +190,14 @@ class HistoryActivity : AppCompatActivity() { showInstAdFromCache(MyApp.Config.history_int_auto) finish() } + binding?.emtpoyHisNow?.setOnClickListener { + finish() + } + binding?.emtpoyFavNow?.setOnClickListener { + startActivity(Intent(this, MainActivity::class.java)) + } } - private fun backPressedCall() { val callback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { @@ -213,13 +216,11 @@ class HistoryActivity : AppCompatActivity() { place, object : LolAdWrapper.LoLLoadListener { override fun loadFailed(error: LolLoadError?) { - // Log.d("dsas",error.toString()) } override fun loaded() { // 处理加载成功 - // Log.d("dsas","backSucc") } }) @@ -247,7 +248,6 @@ class HistoryActivity : AppCompatActivity() { }) } - companion object { const val COMMAND: String = "remove" const val COMMAND_COLLECTION: String = "remove_collection" diff --git a/app/src/main/java/com/assimilate/alltrans/viewui/MainActivity.kt b/app/src/main/java/com/assimilate/alltrans/viewui/MainActivity.kt index 8b7e8bf..ec4c3b7 100644 --- a/app/src/main/java/com/assimilate/alltrans/viewui/MainActivity.kt +++ b/app/src/main/java/com/assimilate/alltrans/viewui/MainActivity.kt @@ -27,13 +27,13 @@ import androidx.core.view.WindowInsetsCompat import com.assimilate.alltrans.MyApp import com.assimilate.alltrans.R import com.assimilate.alltrans.allservice.SusService -import com.assimilate.alltrans.common.AppStore import com.assimilate.alltrans.common.FirebaseAnalyticsHelper import com.assimilate.alltrans.common.LolAdWrapper import com.assimilate.alltrans.common.Widget import com.assimilate.alltrans.databinding.ActivityMainBinding import com.assimilate.alltrans.model.LanguagesConstants import com.assimilate.alltrans.model.PreferenceLanguageUtils +import com.google.mlkit.nl.languageid.LanguageIdentification class MainActivity : AppCompatActivity() { @@ -127,19 +127,11 @@ class MainActivity : AppCompatActivity() { } } - private fun initView() { - LolAdWrapper.shared.loadAdShowNativeAd( - this, - "your_native_ad_placement", - binding.homeNative, - R.layout.ad_layout_admob_banner, - R.layout.ad_layout_max_banner - ) + private fun initView(){ binding.chSourceLanguage.text = PreferenceLanguageUtils.getString("language_source") binding.chTargetLanguage.text = PreferenceLanguageUtils.getString("language_target") } - private fun initSet() { loadNative() @@ -283,6 +275,7 @@ class MainActivity : AppCompatActivity() { // 更新字符计数显示 val displayCharCount = if (charCount > 1800) 1800 else charCount binding.tvMainLimitText.text = getString(R.string.main_limit_num, displayCharCount) + reconText(binding.etText.text.toString()) } }) @@ -390,7 +383,7 @@ class MainActivity : AppCompatActivity() { override fun onResume() { super.onResume() - initView() + initView() } override fun onRestart() { @@ -434,4 +427,25 @@ class MainActivity : AppCompatActivity() { ) } + private fun reconText(text:String){ + val languageIdentifier = LanguageIdentification.getClient() + languageIdentifier.identifyLanguage(text) + .addOnSuccessListener { languageCode -> + if (languageCode == "und") { + Log.i("dsafdsf", "Can't identify language.") + + } else { + Log.i("dsafdsf", "Language: $languageCode") + val lan = LanguagesConstants.getInstance().getLanguageByLanguageCode(languageCode,this) + PreferenceLanguageUtils.putString("language_source",lan.language) + binding.chSourceLanguage.text = PreferenceLanguageUtils.getString("language_source") + } + } + .addOnFailureListener { + // Model couldn’t be loaded or other internal error. + // ... + } + } + + } \ No newline at end of file diff --git a/app/src/main/java/com/assimilate/alltrans/viewui/PhotoImageActivity.kt b/app/src/main/java/com/assimilate/alltrans/viewui/PhotoImageActivity.kt index 4959fa2..e9367e3 100644 --- a/app/src/main/java/com/assimilate/alltrans/viewui/PhotoImageActivity.kt +++ b/app/src/main/java/com/assimilate/alltrans/viewui/PhotoImageActivity.kt @@ -94,7 +94,7 @@ class PhotoImageActivity : AppCompatActivity() { } firebaseEvent() - Widget.makeSnackbar(this, "Photographing text for translation") + Widget.makeSnackbar(this, getString(R.string.ph_toast)) isLandScape = resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE savedInstanceState?.let { diff --git a/app/src/main/java/com/assimilate/alltrans/viewui/SettingsActivity.kt b/app/src/main/java/com/assimilate/alltrans/viewui/SettingsActivity.kt index e1fa658..3113b4a 100644 --- a/app/src/main/java/com/assimilate/alltrans/viewui/SettingsActivity.kt +++ b/app/src/main/java/com/assimilate/alltrans/viewui/SettingsActivity.kt @@ -96,7 +96,7 @@ class SettingsActivity private fun setBottomSheet() { // 设置 BottomSheetDialog - bottomSheetDialog = BottomSheetDialog(this) + bottomSheetDialog = BottomSheetDialog(this,R.style.CustomBottomSheetDialogTheme) bottomSheetDialog.setContentView(R.layout.bottomsheet_rate) bottomSheetDialog.dismissWithAnimation = true diff --git a/app/src/main/java/com/assimilate/alltrans/viewui/TextResultActivity.kt b/app/src/main/java/com/assimilate/alltrans/viewui/TextResultActivity.kt index 8cc337b..ad28d16 100644 --- a/app/src/main/java/com/assimilate/alltrans/viewui/TextResultActivity.kt +++ b/app/src/main/java/com/assimilate/alltrans/viewui/TextResultActivity.kt @@ -1,12 +1,7 @@ package com.assimilate.alltrans.viewui - -import android.content.ClipData -import android.content.ClipboardManager -import android.content.Context import android.content.Intent import android.os.Bundle -import android.speech.tts.TextToSpeech import android.text.TextUtils import android.util.Log import android.widget.Toast @@ -18,25 +13,23 @@ import androidx.core.view.WindowInsetsCompat import com.assimilate.alltrans.MyApp import com.assimilate.alltrans.R import com.assimilate.alltrans.common.FirebaseAnalyticsHelper -import com.assimilate.alltrans.model.LanguagesConstants import com.assimilate.alltrans.common.Logger import com.assimilate.alltrans.common.LolAdWrapper -import com.assimilate.alltrans.model.PreferenceLanguageUtils -import com.assimilate.alltrans.common.Widget +import com.assimilate.alltrans.common.MyTextTools import com.assimilate.alltrans.databinding.ActivityTextResultBinding import com.assimilate.alltrans.http.GoogleTranslator import com.assimilate.alltrans.http.Translator +import com.assimilate.alltrans.model.LanguagesConstants +import com.assimilate.alltrans.model.PreferenceLanguageUtils import com.assimilate.alltrans.mydb.DbTranslation -import com.assimilate.alltrans.mydb.Translations import com.lol.apex.ok.google.adlibrary.base.listener.LolLoadError import com.lol.apex.ok.google.adlibrary.base.listener.LolShowError -import java.util.Locale class TextResultActivity : AppCompatActivity() { private lateinit var binding: ActivityTextResultBinding - private lateinit var tts: TextToSpeech + private var translating = false override fun onCreate(savedInstanceState: Bundle?) { @@ -64,12 +57,6 @@ class TextResultActivity : AppCompatActivity() { binding.tvTrSource.text = receivedString translate(binding.tvTrSource.text.toString()) - - tts = TextToSpeech(this) { status -> - if (TextToSpeech.SUCCESS == status) tts.setLanguage( - Locale.getDefault() - ) - } } private fun backPressedCall() { @@ -96,19 +83,19 @@ class TextResultActivity : AppCompatActivity() { showInstAdFromCache(MyApp.Config.text_camera_int_auto) } binding.ivTrCopy.setOnClickListener { - copyToClipboard() + MyTextTools.copyToClipboard(this, binding.tvTrTarget.text.toString()) FirebaseAnalyticsHelper.textTransCopyEvent() } binding.ivSourceClear.setOnClickListener { finish() } binding.ivSourceTts.setOnClickListener { - readText( + MyTextTools.ttsReadText( binding.tvTrSource.text.toString(), PreferenceLanguageUtils.getString("language_source"), this ) } binding.ivTargetTts.setOnClickListener { - readText( + MyTextTools.ttsReadText( binding.tvTrTarget.text.toString(), PreferenceLanguageUtils.getString("language_target"), this @@ -116,7 +103,7 @@ class TextResultActivity : AppCompatActivity() { FirebaseAnalyticsHelper.textTransPlayEvent() } binding.ivTrTargetShare.setOnClickListener { - shareText(binding.tvTrTarget.text.toString()) + MyTextTools.shareText(this, binding.tvTrTarget.text.toString()) FirebaseAnalyticsHelper.textTransShareEvent() } binding.ivTrCollect.setOnClickListener { @@ -166,7 +153,7 @@ class TextResultActivity : AppCompatActivity() { put("text", text) } - binding.tvTrTarget.text = "translating..." + binding.tvTrTarget.text = getString(R.string.tr_trans_ing) val translator: Translator = GoogleTranslator() translator.translate(param, object : GoogleTranslator.GoogleTranslateCallback { override fun onResponse(result: String?, errorMessage: String?) { @@ -174,7 +161,11 @@ class TextResultActivity : AppCompatActivity() { runOnUiThread { if (!TextUtils.isEmpty(result)) { binding.tvTrTarget.text = result - addHistory(result) + MyTextTools.addToHistory( + this@TextResultActivity, + binding.tvTrSource.text.toString(), + result + ) } else { // 处理错误信息 if (!TextUtils.isEmpty(errorMessage)) { @@ -183,7 +174,7 @@ class TextResultActivity : AppCompatActivity() { Log.e("TranslationError", errorMessage) } } - binding.tvTrTarget.text = "Translation failed: $errorMessage" + binding.tvTrTarget.text = getString(R.string.tr_trans_fail) } } } @@ -200,9 +191,9 @@ class TextResultActivity : AppCompatActivity() { if (errorMessage != null) { Log.e("TranslationFailure", errorMessage) } - binding.tvTrTarget.text = "Translation failed: $errorMessage" + binding.tvTrTarget.text = getString(R.string.tr_trans_fail) } else { - binding.tvTrTarget.text = "Translation failed: Unknown error" + binding.tvTrTarget.text = getString(R.string.tr_trans_fail) } } } @@ -210,78 +201,6 @@ class TextResultActivity : AppCompatActivity() { } - private fun addHistory(transResult: String?) { - val dbTranslation = DbTranslation(this) - val translations = Translations( - PreferenceLanguageUtils.getString("language_source"), - binding.tvTrSource.text.toString(), - PreferenceLanguageUtils.getString("language_target"), - transResult - - ) - dbTranslation.addTranslation(translations) - } - - - private fun shareText(text: String) { - val share: String = text.trim() - if (!TextUtils.isEmpty(share)) { - val intent = Intent(Intent.ACTION_SEND) - intent.setType("text/plain") - intent.putExtra(Intent.EXTRA_TEXT, share) - startActivity(Intent.createChooser(intent, "Share " + getString(R.string.app_name))) - } - } - - // readText 方法,整合获取语言代码和朗读文本功能 - private fun readText(text: String, targetLanguage: String, context: Context) { - val speech: String = text.trim() - if (!TextUtils.isEmpty(speech)) { - // 获取目标语言的语言代码 - val languageCode = - LanguagesConstants.getInstance().getLanguageCodeByLanguage(targetLanguage, context) - Log.d("LanguageCode", "Language Code for $targetLanguage: $languageCode") - - // 创建语言 Locale 对象 - val locale = Locale(languageCode) - - // 判断语言是否支持 - if (TextToSpeech.LANG_NOT_SUPPORTED != tts.isLanguageAvailable(locale)) { - tts.language = locale - tts.speak(speech, TextToSpeech.QUEUE_FLUSH, null, null) - } else { - Widget.makeToast(this, getString(R.string.tr_tts_error)) - } - } - } - - - // 复制到粘贴板 - private fun copyToClipboard() { - val tip = "Copied to clipboard!" - val tipNull = "text is null!" - val share = binding.tvTrTarget.text.toString().trim() - if (!TextUtils.isEmpty(share)) { - val clipboardManager = - getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager - val clipData = ClipData.newPlainText("targetValue", share) - clipboardManager.setPrimaryClip(clipData) - Widget.makeToast(this, tip) - } else { - Widget.makeToast(this, tipNull) - } - } - - override fun onStop() { - super.onStop() - tts.stop() - } - - override fun onDestroy() { - super.onDestroy() - tts.shutdown() - } - private fun doBack() { finish() diff --git a/app/src/main/res/drawable-xxxhdpi/ic_wel_icon.webp b/app/src/main/res/drawable-xxxhdpi/ic_wel_icon.webp deleted file mode 100644 index 7221a49..0000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_wel_icon.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/main_setting_quick.webp b/app/src/main/res/drawable-xxxhdpi/main_setting_quick.webp deleted file mode 100644 index 8ec449e..0000000 Binary files a/app/src/main/res/drawable-xxxhdpi/main_setting_quick.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/main_setting_quick_def.webp b/app/src/main/res/drawable-xxxhdpi/main_setting_quick_def.webp deleted file mode 100644 index cd54714..0000000 Binary files a/app/src/main/res/drawable-xxxhdpi/main_setting_quick_def.webp and /dev/null differ diff --git a/app/src/main/res/drawable/button_r24_blue_bg.xml b/app/src/main/res/drawable/button_r24_blue_bg.xml index 09c863a..93844e9 100644 --- a/app/src/main/res/drawable/button_r24_blue_bg.xml +++ b/app/src/main/res/drawable/button_r24_blue_bg.xml @@ -4,7 +4,6 @@ diff --git a/app/src/main/res/drawable/emp.xml b/app/src/main/res/drawable/emp.xml new file mode 100644 index 0000000..b4b9fb1 --- /dev/null +++ b/app/src/main/res/drawable/emp.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_wel_icon.xml b/app/src/main/res/drawable/ic_wel_icon.xml new file mode 100644 index 0000000..e5d56f7 --- /dev/null +++ b/app/src/main/res/drawable/ic_wel_icon.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/left_back.xml b/app/src/main/res/drawable/left_back.xml new file mode 100644 index 0000000..e28e7e6 --- /dev/null +++ b/app/src/main/res/drawable/left_back.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/main_setting_quick.xml b/app/src/main/res/drawable/main_setting_quick.xml new file mode 100644 index 0000000..bb9fedd --- /dev/null +++ b/app/src/main/res/drawable/main_setting_quick.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/main_setting_quick_def.xml b/app/src/main/res/drawable/main_setting_quick_def.xml new file mode 100644 index 0000000..e7488c0 --- /dev/null +++ b/app/src/main/res/drawable/main_setting_quick_def.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_history.xml b/app/src/main/res/layout/activity_history.xml index 2377734..13512ea 100644 --- a/app/src/main/res/layout/activity_history.xml +++ b/app/src/main/res/layout/activity_history.xml @@ -66,16 +66,87 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> - - + android:orientation="vertical" + android:visibility="gone" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/bottomsheet_rate.xml b/app/src/main/res/layout/bottomsheet_rate.xml index 04dea75..492ce0f 100644 --- a/app/src/main/res/layout/bottomsheet_rate.xml +++ b/app/src/main/res/layout/bottomsheet_rate.xml @@ -1,7 +1,8 @@ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index d6ed6b2..60287ba 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -23,6 +23,7 @@ #FF605C62 #FFA5A5A5 + #FFB3B3B3 #FF53514C diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 52b3b0b..77d4f3b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,7 +1,7 @@ Translark ca-app-pub-9280511366580942~8779388277 - + ih grtib slt @@ -9,12 +9,14 @@ pdpg clv Select image + + Settings translate Chinese English - Enter text + Enter text\nSupport for intelligent recognition of language types Paste Clipboard contains empty or invalid data. Your device may not support speech-to-text. @@ -27,6 +29,8 @@ Dictionary %1$d/1800 + + Photographing text for translation Languages @@ -35,7 +39,11 @@ Common other Speech in this language is temporarily not supported. + Preparing to read… Translator + Translation failed: Please check the network. + translating… + Global Translation @@ -49,9 +57,11 @@ Delete History - No translation records + Empty no history... Favorite - No collection record + Empty no favorite... + Translate Now + Settings App Languages @@ -82,7 +92,7 @@ 长按悬浮球 打开应用 双击悬浮球 - + Click the \"Favorite\" button at the end\nafter translation.\nEasily bookmark sentences. \ No newline at end of file