app/src/main/java/jp/aosystem/generatebarcode/MainActivity.kt
package jp.aosystem.generatebarcode
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.res.Configuration
import android.os.Build
import android.os.Bundle
import android.os.LocaleList
import android.text.Editable
import android.text.TextWatcher
import android.util.DisplayMetrics
import android.view.View
import android.view.inputmethod.InputMethodManager
import android.widget.AdapterView
import android.widget.ArrayAdapter
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import androidx.constraintlayout.widget.ConstraintLayout
import com.google.android.gms.ads.AdView
import com.google.zxing.BarcodeFormat
import com.journeyapps.barcodescanner.BarcodeEncoder
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.AdSize
import com.google.android.gms.ads.MobileAds
import jp.aosystem.generatebarcode.databinding.ActivityMainBinding
import java.util.*
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var viewModel: ConstraintLayout
private var inputMethodManager: InputMethodManager? = null
private var themeNumber: Int = 0
private var localeLanguage: String = ""
private lateinit var adView: AdView
private val adSize: AdSize
get() {
val display = windowManager.defaultDisplay
val outMetrics = DisplayMetrics()
display.getMetrics(outMetrics)
val density = outMetrics.density
var adWidthPixels = this.binding.adContainer.width.toFloat()
if (adWidthPixels == 0f) {
adWidthPixels = outMetrics.widthPixels.toFloat()
}
val adWidth = (adWidthPixels / density).toInt()
return AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(this, adWidth)
}
companion object {
private const val AD_UNIT_ID: String = "ca-app-pub-0000000000000000/0000000000"
private const val RESULT_SETTING_ACTIVITY: Int = 1
internal const val SETTINGS: String = "settings"
internal const val THEME_NUMBER: String = "themeNumber"
internal const val LOCALE_LANGUAGE: String = "localeLanguage"
}
private val barcodeFormats = arrayListOf(
BarcodeFormat.QR_CODE,
BarcodeFormat.AZTEC,
BarcodeFormat.CODABAR,
BarcodeFormat.CODE_128,
BarcodeFormat.CODE_39,
BarcodeFormat.CODE_93,
BarcodeFormat.DATA_MATRIX,
BarcodeFormat.EAN_13,
BarcodeFormat.EAN_8,
BarcodeFormat.ITF,
BarcodeFormat.MAXICODE,
BarcodeFormat.PDF_417,
BarcodeFormat.RSS_14,
BarcodeFormat.RSS_EXPANDED,
BarcodeFormat.UPC_A,
BarcodeFormat.UPC_E,
BarcodeFormat.UPC_EAN_EXTENSION,
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
this.binding = ActivityMainBinding.inflate(layoutInflater)
this.viewModel = this.binding.root
setContentView(this.viewModel)
supportActionBar?.hide()
this.loadThemeNumber()
this.setTheme()
MobileAds.initialize(this) {}
adView = AdView(this)
this.binding.adContainer.addView(adView)
loadBanner()
this.setSpinner()
this.setTouchListener()
this.binding.image1.setOnClickListener {
this.binding.textTitle.requestFocus()
}
this.binding.editText1.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {
this@MainActivity.render()
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
}
})
}
private fun loadBanner() {
adView.adUnitId = AD_UNIT_ID
adView.adSize = adSize
val adRequest = AdRequest
.Builder()
.build()
adView.loadAd(adRequest)
}
private fun setTouchListener() {
this.inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
this.binding.editText1.setOnFocusChangeListener { _, hasFocus ->
if (!hasFocus) {
this.inputMethodManager!!.hideSoftInputFromWindow(
this.binding.editText1.windowToken,
InputMethodManager.HIDE_NOT_ALWAYS
)
}
}
}
private fun setSpinner() {
val adapter1 = ArrayAdapter<String>(this, android.R.layout.simple_spinner_item)
adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
adapter1.add("QR Code 2D barcode format.")
adapter1.add("Aztec 2D barcode format.")
adapter1.add("CODABAR 1D format.")
adapter1.add("Code 128 1D format.")
adapter1.add("Code 39 1D format.")
adapter1.add("Code 93 1D format.")
adapter1.add("Data Matrix 2D barcode format.")
adapter1.add("EAN-13 1D format.")
adapter1.add("EAN-8 1D format.")
adapter1.add("ITF (Interleaved Two of Five) 1D format.")
adapter1.add("MaxiCode 2D barcode format.")
adapter1.add("PDF417 format.")
adapter1.add("RSS 14")
adapter1.add("RSS EXPANDED")
adapter1.add("UPC-A 1D format.")
adapter1.add("UPC-E 1D format.")
adapter1.add("UPC/EAN extension format.")
this.binding.spinner1.adapter = adapter1
this.binding.spinner1.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
this@MainActivity.render()
}
override fun onNothingSelected(parent: AdapterView<*>?) {
}
}
}
private fun render() {
val spinnerId: Int = this.binding.spinner1.selectedItemId.toInt()
val editStr: String = this.binding.editText1.text.toString()
if (editStr == "") {
this.binding.image1.setImageBitmap(null)
} else {
try {
val barcodeEncoder = BarcodeEncoder()
val bitmap = barcodeEncoder.encodeBitmap(editStr, this.barcodeFormats[spinnerId], 700, 700)
this.binding.image1.setImageBitmap(bitmap)
} catch (e: Exception) {
this.binding.image1.setImageBitmap(null)
}
}
}
fun onClickSetting(v: View) {
val intent = Intent(applicationContext, SettingActivity::class.java)
intent.putExtra(THEME_NUMBER, this.themeNumber)
intent.putExtra(LOCALE_LANGUAGE, this.localeLanguage)
startActivityForResult(intent, RESULT_SETTING_ACTIVITY)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
super.onActivityResult(requestCode, resultCode, intent)
if (resultCode == Activity.RESULT_OK && requestCode == RESULT_SETTING_ACTIVITY && intent != null) {
var reCreateFlag: Boolean = false
val lastThemeNumber: Int = this.themeNumber
this.themeNumber = intent.getIntExtra(THEME_NUMBER, 0)
if (this.themeNumber != lastThemeNumber) {
this.saveThemeNumber()
reCreateFlag = true
}
val lastLocaleLanguage = this.localeLanguage
this.localeLanguage = intent.getStringExtra(LOCALE_LANGUAGE) ?: ""
if (this.localeLanguage != lastLocaleLanguage) {
this.saveLocaleLanguage()
reCreateFlag = true
}
if (reCreateFlag) {
recreate()
}
}
}
private fun saveThemeNumber() {
getSharedPreferences(SETTINGS, Context.MODE_PRIVATE).edit().apply {
putInt(THEME_NUMBER, this@MainActivity.themeNumber)
apply()
}
}
private fun loadThemeNumber() {
val pref = getSharedPreferences(SETTINGS, Context.MODE_PRIVATE)
this.themeNumber = pref.getInt(THEME_NUMBER, 0)
}
private fun setTheme() {
when (this.themeNumber) {
0 -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
1 -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
}
}
private fun saveLocaleLanguage() {
getSharedPreferences(SETTINGS, Context.MODE_PRIVATE).edit().apply {
putString(LOCALE_LANGUAGE, this@MainActivity.localeLanguage)
apply()
}
}
override fun attachBaseContext(base: Context) {
val pref = base.getSharedPreferences(SETTINGS, Context.MODE_PRIVATE)
this.localeLanguage = pref.getString(LOCALE_LANGUAGE, "") ?: ""
val loc: Locale? = if (this.localeLanguage != "") Locale(this.localeLanguage) else null
if (loc != null) {
val res = base.resources
val config = Configuration(res.configuration)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
val localeList = LocaleList(loc)
LocaleList.setDefault(localeList)
config.setLocales(localeList)
} else {
config.setLocale(loc)
}
super.attachBaseContext(base.createConfigurationContext(config))
} else {
super.attachBaseContext(base)
}
}
}
app/src/main/java/jp/aosystem/generatebarcode/SettingActivity.kt
package jp.aosystem.generatebarcode
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.res.Configuration
import android.os.Build
import android.os.Bundle
import android.os.LocaleList
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout
import jp.aosystem.generatebarcode.databinding.ActivitySettingBinding
import java.util.*
class SettingActivity : AppCompatActivity() {
private lateinit var binding: ActivitySettingBinding
private lateinit var viewModel: ConstraintLayout
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
this.binding = ActivitySettingBinding.inflate(layoutInflater)
this.viewModel = this.binding.root
setContentView(this.viewModel)
val intent = this.intent
val themeNumber: Int = intent.getIntExtra(MainActivity.THEME_NUMBER,0)
this.binding.switchTheme.isChecked = themeNumber != 0
val localeLanguage: String = intent.getStringExtra(MainActivity.LOCALE_LANGUAGE) ?: ""
when (localeLanguage) {
"en" -> this.binding.radioLanguageEn.isChecked = true
"bg" -> this.binding.radioLanguageBg.isChecked = true
"cs" -> this.binding.radioLanguageCs.isChecked = true
"da" -> this.binding.radioLanguageDa.isChecked = true
"de" -> this.binding.radioLanguageDe.isChecked = true
"el" -> this.binding.radioLanguageEl.isChecked = true
"es" -> this.binding.radioLanguageEs.isChecked = true
"et" -> this.binding.radioLanguageEt.isChecked = true
"fi" -> this.binding.radioLanguageFi.isChecked = true
"fr" -> this.binding.radioLanguageFr.isChecked = true
"hu" -> this.binding.radioLanguageHu.isChecked = true
"it" -> this.binding.radioLanguageIt.isChecked = true
"ja" -> this.binding.radioLanguageJa.isChecked = true
"lt" -> this.binding.radioLanguageLt.isChecked = true
"lv" -> this.binding.radioLanguageLv.isChecked = true
"nl" -> this.binding.radioLanguageNl.isChecked = true
"pl" -> this.binding.radioLanguagePl.isChecked = true
"pt" -> this.binding.radioLanguagePt.isChecked = true
"ro" -> this.binding.radioLanguageRo.isChecked = true
"ru" -> this.binding.radioLanguageRu.isChecked = true
"sk" -> this.binding.radioLanguageSk.isChecked = true
"sv" -> this.binding.radioLanguageSv.isChecked = true
"zh" -> this.binding.radioLanguageZh.isChecked = true
else -> this.binding.radioLanguageSystem.isChecked = true
}
supportActionBar?.hide()
}
fun onClickApply(v: View) {
val themeNumber = if (this.binding.switchTheme.isChecked) 1 else 0
var localeLanguage: String = ""
if (this.binding.radioLanguageEn.isChecked) {
localeLanguage = "en"
} else if (this.binding.radioLanguageBg.isChecked) {
localeLanguage = "bg"
} else if (this.binding.radioLanguageCs.isChecked) {
localeLanguage = "cs"
} else if (this.binding.radioLanguageDa.isChecked) {
localeLanguage = "da"
} else if (this.binding.radioLanguageDe.isChecked) {
localeLanguage = "de"
} else if (this.binding.radioLanguageEl.isChecked) {
localeLanguage = "el"
} else if (this.binding.radioLanguageEs.isChecked) {
localeLanguage = "es"
} else if (this.binding.radioLanguageEt.isChecked) {
localeLanguage = "et"
} else if (this.binding.radioLanguageFi.isChecked) {
localeLanguage = "fi"
} else if (this.binding.radioLanguageFr.isChecked) {
localeLanguage = "fr"
} else if (this.binding.radioLanguageHu.isChecked) {
localeLanguage = "hu"
} else if (this.binding.radioLanguageIt.isChecked) {
localeLanguage = "it"
} else if (this.binding.radioLanguageJa.isChecked) {
localeLanguage = "ja"
} else if (this.binding.radioLanguageLt.isChecked) {
localeLanguage = "lt"
} else if (this.binding.radioLanguageLv.isChecked) {
localeLanguage = "lv"
} else if (this.binding.radioLanguageNl.isChecked) {
localeLanguage = "nl"
} else if (this.binding.radioLanguagePl.isChecked) {
localeLanguage = "pl"
} else if (this.binding.radioLanguagePt.isChecked) {
localeLanguage = "pt"
} else if (this.binding.radioLanguageRo.isChecked) {
localeLanguage = "ro"
} else if (this.binding.radioLanguageRu.isChecked) {
localeLanguage = "ru"
} else if (this.binding.radioLanguageSk.isChecked) {
localeLanguage = "sk"
} else if (this.binding.radioLanguageSv.isChecked) {
localeLanguage = "sv"
} else if (this.binding.radioLanguageZh.isChecked) {
localeLanguage = "zh"
}
val intent = Intent()
intent.putExtra(MainActivity.THEME_NUMBER, themeNumber)
intent.putExtra(MainActivity.LOCALE_LANGUAGE, localeLanguage)
setResult(Activity.RESULT_OK, intent)
finish()
}
fun onClickCancel(v: View) {
val intent = Intent()
setResult(Activity.RESULT_CANCELED, intent)
finish()
}
override fun attachBaseContext(base: Context) {
val pref = base.getSharedPreferences(MainActivity.SETTINGS, Context.MODE_PRIVATE)
val localeLanguage: String = pref.getString(MainActivity.LOCALE_LANGUAGE, "") ?: ""
val loc: Locale? = if (localeLanguage != "") Locale(localeLanguage) else null
if (loc != null) {
val res = base.resources
val config = Configuration(res.configuration)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
val localeList = LocaleList(loc)
LocaleList.setDefault(localeList)
config.setLocales(localeList)
} else {
config.setLocale(loc)
}
super.attachBaseContext(base.createConfigurationContext(config))
} else {
super.attachBaseContext(base)
}
}
}