Skip to content

Commit

Permalink
feat: multilanguage support (#377)
Browse files Browse the repository at this point in the history
  • Loading branch information
adityastic authored and mariobehling committed Jun 15, 2019
1 parent adfda9e commit cee39f4
Show file tree
Hide file tree
Showing 22 changed files with 348 additions and 135 deletions.
2 changes: 2 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ spotless {
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${versions.kotlin_version}"

kapt "androidx.databinding:compiler:3.2.0-alpha11"

//Moshi
implementation "com.squareup.moshi:moshi-kotlin:${versions.moshi_version}"
kapt "com.squareup.moshi:moshi-kotlin-codegen:${versions.moshi_version}"
Expand Down
23 changes: 19 additions & 4 deletions app/src/main/java/org/fossasia/badgemagic/BadgeMagicApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@ package org.fossasia.badgemagic

import android.app.Application
import android.content.Context
import org.fossasia.badgemagic.di.appModules
import android.content.res.Configuration
import org.fossasia.badgemagic.di.singletonModules
import org.fossasia.badgemagic.di.utilModules
import org.fossasia.badgemagic.di.viewModelModules
import org.fossasia.badgemagic.util.LocaleManager
import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger
import org.koin.core.context.startKoin
Expand All @@ -23,9 +27,11 @@ class BadgeMagicApp : Application() {
startKoin {
androidLogger()
androidContext(applicationContext)
modules(
appModules
)
modules(listOf(
singletonModules,
utilModules,
viewModelModules
))
}

initLogger()
Expand All @@ -36,4 +42,13 @@ class BadgeMagicApp : Application() {
Timber.plant(Timber.DebugTree())
}
}

override fun attachBaseContext(base: Context?) {
super.attachBaseContext(LocaleManager.setLocale(base))
}

override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
LocaleManager.setLocale(this)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.fossasia.badgemagic.bindings

import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import androidx.appcompat.widget.AppCompatSpinner
import androidx.databinding.BindingAdapter
import org.fossasia.badgemagic.viewmodels.SettingsViewModel

@BindingAdapter("createAdapterFrom")
fun setSpinnerAdapter(spinner: AppCompatSpinner, viewModel: SettingsViewModel) {
val list: MutableList<String> = viewModel.languageList.get() ?: mutableListOf()
spinner.adapter = ArrayAdapter<String>(spinner.context, android.R.layout.simple_spinner_dropdown_item, list)
spinner.setSelection(viewModel.getSelectedSpinnerLanguage(), false)
spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onNothingSelected(parent: AdapterView<*>?) {
}

override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
viewModel.setSelectedSpinnerLangauge(position)
}
}
}
8 changes: 8 additions & 0 deletions app/src/main/java/org/fossasia/badgemagic/data/Language.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.fossasia.badgemagic.data

import java.util.Locale

enum class Language(val locale: Locale) {
ENGLISH(Locale.ENGLISH),
CHINESE(Locale.CHINA),
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import org.fossasia.badgemagic.R
import org.fossasia.badgemagic.util.Resource
import org.koin.core.KoinComponent
import org.koin.core.inject

class ClipArtService {
class ClipArtService : KoinComponent {
private val clipArts = MutableLiveData<SparseArray<Drawable>>()
private val resourceHelper = Resource()
private val resourceHelper: Resource by inject()

init {
val tempSparseArray = SparseArray<Drawable>()
Expand Down
20 changes: 16 additions & 4 deletions app/src/main/java/org/fossasia/badgemagic/di/Modules.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,29 @@ package org.fossasia.badgemagic.di

import org.fossasia.badgemagic.database.ClipArtService
import org.fossasia.badgemagic.database.StorageFilesService
import org.fossasia.badgemagic.util.PreferenceUtils
import org.fossasia.badgemagic.util.Resource
import org.fossasia.badgemagic.viewmodels.FilesViewModel
import org.fossasia.badgemagic.viewmodels.TextArtViewModel
import org.fossasia.badgemagic.viewmodels.SettingsViewModel
import org.fossasia.badgemagic.viewmodels.DrawViewModel
import org.koin.android.ext.koin.androidContext
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.dsl.module

val appModules = module {
single { ClipArtService() }
single { StorageFilesService() }

val viewModelModules = module {
viewModel { TextArtViewModel(get(), get()) }
viewModel { FilesViewModel(get()) }
viewModel { SettingsViewModel(get()) }
viewModel { DrawViewModel() }
}

val singletonModules = module {
single { ClipArtService() }
single { StorageFilesService() }
}

val utilModules = module {
single { PreferenceUtils(androidContext()) }
single { Resource(androidContext()) }
}
11 changes: 8 additions & 3 deletions app/src/main/java/org/fossasia/badgemagic/ui/DrawerActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import androidx.appcompat.app.ActionBarDrawerToggle
import android.view.MenuItem
import androidx.drawerlayout.widget.DrawerLayout
import com.google.android.material.navigation.NavigationView
import androidx.appcompat.app.AppCompatActivity
import android.view.Menu
import android.view.View
import android.widget.Toast
Expand All @@ -26,16 +25,18 @@ import kotlinx.android.synthetic.main.activity_drawer.*
import kotlinx.android.synthetic.main.app_bar_drawer.*
import org.fossasia.badgemagic.R
import org.fossasia.badgemagic.core.android.log.Timber
import org.fossasia.badgemagic.ui.fragments.base.BaseFragment
import org.fossasia.badgemagic.ui.base.BaseFragment
import org.fossasia.badgemagic.viewmodels.FilesViewModel
import org.fossasia.badgemagic.ui.fragments.AboutFragment
import org.fossasia.badgemagic.ui.fragments.SavedBadgesFragment
import org.fossasia.badgemagic.ui.fragments.SettingsFragment
import org.fossasia.badgemagic.ui.fragments.TextArtFragment
import org.fossasia.badgemagic.ui.base.BaseActivity
import org.fossasia.badgemagic.util.SendingUtils
import org.fossasia.badgemagic.util.StorageUtils
import org.koin.androidx.viewmodel.ext.android.viewModel

class DrawerActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
class DrawerActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedListener {

companion object {
private const val PICK_FILE_RESULT_CODE = 2
Expand Down Expand Up @@ -86,6 +87,10 @@ class DrawerActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelec
switchFragment(SavedBadgesFragment.newInstance())
showMenu?.setGroupVisible(R.id.saved_group, true)
}
R.id.settings -> {
switchFragment(SettingsFragment.newInstance())
showMenu?.setGroupVisible(R.id.saved_group, false)
}
R.id.feedback -> {
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/fossasia/badge-magic-android/issues")))
}
Expand Down
11 changes: 11 additions & 0 deletions app/src/main/java/org/fossasia/badgemagic/ui/base/BaseActivity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.fossasia.badgemagic.ui.base

import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import org.fossasia.badgemagic.util.LocaleManager

abstract class BaseActivity : AppCompatActivity() {
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(LocaleManager.setLocale(base))
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.fossasia.badgemagic.ui.fragments.base
package org.fossasia.badgemagic.ui.base

import androidx.fragment.app.Fragment
import org.fossasia.badgemagic.data.device.model.DataToSend
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import org.fossasia.badgemagic.R
import org.fossasia.badgemagic.ui.fragments.base.BaseFragment
import org.fossasia.badgemagic.ui.base.BaseFragment
import de.psdev.licensesdialog.LicensesDialog
import de.psdev.licensesdialog.licenses.ApacheSoftwareLicense20
import de.psdev.licensesdialog.licenses.MITLicense
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import org.fossasia.badgemagic.data.device.model.DataToSend
import org.fossasia.badgemagic.data.device.model.Mode
import org.fossasia.badgemagic.data.device.model.Speed
import org.fossasia.badgemagic.viewmodels.FilesViewModel
import org.fossasia.badgemagic.ui.fragments.base.BaseFragment
import org.fossasia.badgemagic.ui.base.BaseFragment
import org.fossasia.badgemagic.util.Converters
import org.fossasia.badgemagic.util.SendingUtils
import org.fossasia.badgemagic.adapter.OnSavedItemSelected
Expand Down
Original file line number Diff line number Diff line change
@@ -1,121 +1,46 @@
package org.fossasia.badgemagic.ui.fragments

import android.content.Intent
import android.net.Uri
import androidx.databinding.DataBindingUtil
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.Observer
import com.google.android.material.snackbar.Snackbar
import org.fossasia.badgemagic.R
import org.fossasia.badgemagic.ui.fragments.base.BaseFragment
import de.psdev.licensesdialog.LicensesDialog
import de.psdev.licensesdialog.licenses.ApacheSoftwareLicense20
import de.psdev.licensesdialog.licenses.MITLicense
import de.psdev.licensesdialog.model.Notice
import de.psdev.licensesdialog.model.Notices
import kotlinx.android.synthetic.main.fragment_about_us.*
import org.fossasia.badgemagic.databinding.FragmentSettingsBinding
import org.fossasia.badgemagic.ui.base.BaseFragment
import org.fossasia.badgemagic.viewmodels.SettingsViewModel
import org.koin.androidx.viewmodel.ext.android.viewModel

class SettingsFragment : BaseFragment() {

companion object {
@JvmStatic
fun newInstance() =
SettingsFragment()
SettingsFragment()
}

private val viewModel by viewModel<SettingsViewModel>()

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_about_us, container, false)
val binding = DataBindingUtil.inflate<FragmentSettingsBinding>(inflater, R.layout.fragment_settings, container, false)
binding.viewModel = viewModel
return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

about_fossasia.setOnClickListener {
contributorsLink()
}

githubLayout.setOnClickListener {
github()
}

ll_about_license.setOnClickListener {
license()
}

ll_about_libs.setOnClickListener {
libraryLicenseDialog()
}
}

private fun contributorsLink() {
val url = "https://github.com/fossasia/badge-magic-android/graphs/contributors"
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse(url)
startActivity(intent)
}

private fun github() {
val url = "https://github.com/fossasia/badge-magic-android"
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse(url)
startActivity(intent)
}

private fun license() {
val url = "https://github.com/fossasia/badge-magic-android/blob/development/LICENSE"
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse(url)
startActivity(intent)
}

private fun libraryLicenseDialog() {
val notices = Notices()

notices.addNotice(
Notice(
context?.getString(R.string.moshi),
context?.getString(R.string.moshi_github),
context?.getString(R.string.moshi_copy),
ApacheSoftwareLicense20()
)
)
notices.addNotice(
Notice(
context?.getString(R.string.gif),
context?.getString(R.string.gif_github),
context?.getString(R.string.gif_copy),
ApacheSoftwareLicense20()
)
)
notices.addNotice(
Notice(
context?.getString(R.string.timber),
context?.getString(R.string.timber_github),
context?.getString(R.string.timber_copy),
MITLicense()
)
)
notices.addNotice(
Notice(
context?.getString(R.string.scanner),
context?.getString(R.string.scanner_github),
context?.getString(R.string.scanner_copy),
ApacheSoftwareLicense20()
)
)
notices.addNotice(
Notice(
context?.getString(R.string.licences),
context?.getString(R.string.licences_github),
context?.getString(R.string.licences_copy),
ApacheSoftwareLicense20()
)
)
viewModel.changedLanguage.observe(viewLifecycleOwner, Observer {

LicensesDialog.Builder(context)
.setNotices(notices)
.setIncludeOwnLicense(true)
.build()
Snackbar
.make(view, requireContext().getString(R.string.change_language), Snackbar.LENGTH_INDEFINITE)
.setAction("RESTART") {
requireActivity().finishAffinity()
startActivity(requireActivity().intent)
}
.show()
})
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import android.widget.EditText
import android.widget.TextView
import android.widget.LinearLayout
import android.widget.Toast
import androidx.core.content.ContextCompat.getSystemService
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.GridLayoutManager
import com.google.android.material.tabs.TabLayout
Expand All @@ -33,7 +32,7 @@ import org.fossasia.badgemagic.data.DrawableInfo
import org.fossasia.badgemagic.data.ModeInfo
import org.fossasia.badgemagic.data.device.model.Mode
import org.fossasia.badgemagic.ui.custom.knob.Croller
import org.fossasia.badgemagic.ui.fragments.base.BaseFragment
import org.fossasia.badgemagic.ui.base.BaseFragment
import kotlinx.android.synthetic.main.fragment_main_textart.*
import kotlinx.android.synthetic.main.sections_tab.*
import org.fossasia.badgemagic.adapter.DrawableAdapter
Expand Down

0 comments on commit cee39f4

Please sign in to comment.