diff --git a/app/build.gradle b/app/build.gradle index eaf0cae3..c64eec87 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -164,6 +164,7 @@ dependencies { implementation "eu.davidea:flexible-adapter-ui:1.0.0" implementation "com.aurelhubert:ahbottomnavigation:2.3.4" implementation "com.ncapdevi:frag-nav:3.3.0" + implementation "com.github.YarikSOffice:lingver:1.1.0" implementation "com.github.pwittchen:reactivenetwork-rx2:3.0.6" implementation "io.reactivex.rxjava2:rxandroid:2.1.1" diff --git a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt index 72969059..90b3581c 100644 --- a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt +++ b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt @@ -6,6 +6,7 @@ import android.util.Log.VERBOSE import androidx.multidex.MultiDex import androidx.work.Configuration import com.jakewharton.threetenabp.AndroidThreeTen +import com.yariksoffice.lingver.Lingver import dagger.android.AndroidInjector import dagger.android.support.DaggerApplication import eu.davidea.flexibleadapter.FlexibleAdapter @@ -44,6 +45,7 @@ class WulkanowyApp : DaggerApplication(), Configuration.Provider { super.onCreate() AndroidThreeTen.init(this) RxJavaPlugins.setErrorHandler(::onError) + Lingver.init(this) themeManager.applyDefaultTheme() initLogging() diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt index e1caf920..07a3654a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt @@ -33,6 +33,10 @@ class PreferencesRepository @Inject constructor( val gradeColorTheme: String get() = getString(R.string.pref_key_grade_color_scheme, R.string.pref_default_grade_color_scheme) + val appLanguageKey = context.getString(R.string.pref_key_app_language) + val appLanguage + get() = getString(appLanguageKey, R.string.pref_default_app_language) + val serviceEnableKey = context.getString(R.string.pref_key_services_enable) val isServiceEnabled: Boolean get() = getBoolean(serviceEnableKey, R.bool.pref_default_services_enable) diff --git a/app/src/main/java/io/github/wulkanowy/di/AppModule.kt b/app/src/main/java/io/github/wulkanowy/di/AppModule.kt index 42e50fa4..4f568385 100644 --- a/app/src/main/java/io/github/wulkanowy/di/AppModule.kt +++ b/app/src/main/java/io/github/wulkanowy/di/AppModule.kt @@ -2,6 +2,7 @@ package io.github.wulkanowy.di import android.appwidget.AppWidgetManager import android.content.Context +import com.yariksoffice.lingver.Lingver import dagger.Module import dagger.Provides import eu.davidea.flexibleadapter.FlexibleAdapter @@ -32,4 +33,8 @@ internal class AppModule { @Singleton @Provides fun provideAppInfo() = AppInfo() + + @Singleton + @Provides + fun provideLingver() = Lingver.getInstance() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt index 1288e299..8c7b52ea 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt @@ -16,7 +16,7 @@ import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.hideSoftInput -import io.github.wulkanowy.utils.openEmail +import io.github.wulkanowy.utils.openEmailClient import io.github.wulkanowy.utils.openInternetBrowser import io.github.wulkanowy.utils.showSoftInput import kotlinx.android.synthetic.main.fragment_login_form.* @@ -166,7 +166,7 @@ class LoginFormFragment : BaseFragment(), LoginFormView { } override fun openEmail() { - context?.openEmail( + context?.openEmailClient( requireContext().getString(R.string.login_email_intent_title), "wulkanowyinc@gmail.com", requireContext().getString(R.string.login_email_subject), diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt index dba0c951..8478f7cc 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt @@ -14,7 +14,7 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.utils.AppInfo -import io.github.wulkanowy.utils.openEmail +import io.github.wulkanowy.utils.openEmailClient import io.github.wulkanowy.utils.openInternetBrowser import io.github.wulkanowy.utils.setOnItemClickListener import kotlinx.android.synthetic.main.fragment_login_student_select.* @@ -102,7 +102,7 @@ class LoginStudentSelectFragment : BaseFragment(), LoginStudentSelectView { } override fun openEmail() { - context?.openEmail( + context?.openEmailClient( requireContext().getString(R.string.login_email_intent_title), "wulkanowyinc@gmail.com", requireContext().getString(R.string.login_email_subject), diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt index 724e3fbb..b7ae39a7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt @@ -16,7 +16,7 @@ import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.hideSoftInput -import io.github.wulkanowy.utils.openEmail +import io.github.wulkanowy.utils.openEmailClient import io.github.wulkanowy.utils.openInternetBrowser import io.github.wulkanowy.utils.showSoftInput import kotlinx.android.synthetic.main.fragment_login_symbol.* @@ -131,7 +131,7 @@ class LoginSymbolFragment : BaseFragment(), LoginSymbolView { } override fun openEmail() { - context?.openEmail( + context?.openEmailClient( requireContext().getString(R.string.login_email_intent_title), "wulkanowyinc@gmail.com", requireContext().getString(R.string.login_email_subject), diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolFragment.kt index 92f74ca8..4e944d38 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolFragment.kt @@ -10,8 +10,8 @@ import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.ui.modules.schoolandteachers.SchoolAndTeachersChildView import io.github.wulkanowy.ui.modules.schoolandteachers.SchoolAndTeachersFragment -import io.github.wulkanowy.utils.dialPhone -import io.github.wulkanowy.utils.openMapLocation +import io.github.wulkanowy.utils.openDialer +import io.github.wulkanowy.utils.openNavigation import kotlinx.android.synthetic.main.fragment_school.* import javax.inject.Inject @@ -86,10 +86,10 @@ class SchoolFragment : BaseFragment(), SchoolView, MainView.TitledView, SchoolAn } override fun openMapsLocation(location: String) { - context?.openMapLocation(location) + context?.openNavigation(location) } override fun dialPhone(phone: String) { - context?.dialPhone(phone) + context?.openDialer(phone) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt index cb172b98..17274980 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt @@ -5,6 +5,7 @@ import android.content.SharedPreferences import android.os.Bundle import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import com.yariksoffice.lingver.Lingver import dagger.android.support.AndroidSupportInjection import io.github.wulkanowy.R import io.github.wulkanowy.ui.base.BaseActivity @@ -12,7 +13,8 @@ import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.AppInfo import javax.inject.Inject -class SettingsFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener, +class SettingsFragment : PreferenceFragmentCompat(), + SharedPreferences.OnSharedPreferenceChangeListener, MainView.TitledView, SettingsView { @Inject @@ -21,6 +23,9 @@ class SettingsFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedP @Inject lateinit var appInfo: AppInfo + @Inject + lateinit var lingver: Lingver + companion object { fun newInstance() = SettingsFragment() } @@ -50,6 +55,10 @@ class SettingsFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedP activity?.recreate() } + override fun updateLanguage(langCode: String) { + lingver.setLocale(requireContext(), langCode) + } + override fun setServicesSuspended(serviceEnablesKey: String, isHolidays: Boolean) { findPreference(serviceEnablesKey)?.apply { summary = if (isHolidays) getString(R.string.pref_services_suspended) else "" diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt index 88d38e0d..89ba0ee5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt @@ -6,6 +6,7 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.services.sync.SyncManager import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler +import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.isHolidays @@ -20,7 +21,8 @@ class SettingsPresenter @Inject constructor( private val preferencesRepository: PreferencesRepository, private val analytics: FirebaseAnalyticsHelper, private val syncManager: SyncManager, - private val chuckCollector: ChuckCollector + private val chuckCollector: ChuckCollector, + private val appInfo: AppInfo ) : BasePresenter(errorHandler, studentRepository, schedulers) { override fun onAttachView(view: SettingsView) { @@ -38,6 +40,10 @@ class SettingsPresenter @Inject constructor( servicesIntervalKey, servicesOnlyWifiKey -> syncManager.startSyncWorker(true) isDebugNotificationEnableKey -> chuckCollector.showNotification(isDebugNotificationEnable) appThemeKey -> view?.recreateView() + appLanguageKey -> view?.run { + updateLanguage(if (appLanguage == "system") appInfo.systemLanguage else appLanguage) + recreateView() + } else -> Unit } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsView.kt index 1c4bf3b0..e50eb47b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsView.kt @@ -6,5 +6,7 @@ interface SettingsView : BaseView { fun recreateView() + fun updateLanguage(langCode: String) + fun setServicesSuspended(serviceEnablesKey: String, isHolidays: Boolean) } diff --git a/app/src/main/java/io/github/wulkanowy/utils/AppInfo.kt b/app/src/main/java/io/github/wulkanowy/utils/AppInfo.kt index 3fa83a04..a444da6f 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/AppInfo.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/AppInfo.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.utils +import android.content.res.Resources import android.os.Build.MANUFACTURER import android.os.Build.MODEL import android.os.Build.VERSION.SDK_INT @@ -25,4 +26,8 @@ open class AppInfo { open val systemManufacturer: String get() = MANUFACTURER open val systemModel: String get() = MODEL + + @Suppress("DEPRECATION") + open val systemLanguage: String + get() = Resources.getSystem().configuration.locale.language } diff --git a/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt index 5110b067..a265378e 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt @@ -32,7 +32,7 @@ fun Context.openInternetBrowser(uri: String, onActivityNotFound: (uri: String) - } } -fun Context.openEmail(chooserTitle: String, email: String, subject: String?, body: String?) { +fun Context.openEmailClient(chooserTitle: String, email: String, subject: String?, body: String?) { val emailIntent = Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", email, null)) emailIntent.putExtra(Intent.EXTRA_EMAIL, arrayOf(email)) if (subject != null) emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject) @@ -40,7 +40,7 @@ fun Context.openEmail(chooserTitle: String, email: String, subject: String?, bod startActivity(Intent.createChooser(emailIntent, chooserTitle)) } -fun Context.openMapLocation(location: String) { +fun Context.openNavigation(location: String) { val intentUri = Uri.parse("geo:0,0?q=${Uri.encode(location)}") val intent = Intent(Intent.ACTION_VIEW, intentUri) if (intent.resolveActivity(packageManager) != null) { @@ -48,7 +48,7 @@ fun Context.openMapLocation(location: String) { } } -fun Context.dialPhone(phone: String) { +fun Context.openDialer(phone: String) { val intentUri = Uri.parse("tel:$phone") val intent = Intent(Intent.ACTION_DIAL, intentUri) startActivity(intent) diff --git a/app/src/main/res/values-pl/preferences_values.xml b/app/src/main/res/values-pl/preferences_values.xml index e4c30eb0..facec3f0 100644 --- a/app/src/main/res/values-pl/preferences_values.xml +++ b/app/src/main/res/values-pl/preferences_values.xml @@ -16,6 +16,12 @@ Czarny (AMOLED) + + Język systemu + Polski + English + + Domyślna 0,25 diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 8ff4d307..2ceff8a0 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -300,6 +300,7 @@ Motyw aplikacji Rozwiń oceny Schemat kolorów ocen + Język aplikacji Powiadomienia Pokazuj powiadomienia diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index 53b5c2ab..733d71b0 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -7,6 +7,7 @@ false light vulcan + system true 60 false diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index 730fea59..a2172db9 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -7,6 +7,7 @@ expand_grade grade_average_mode grade_average_always_calc + app_language services_enable services_interval services_disable_wifi_only diff --git a/app/src/main/res/values/preferences_values.xml b/app/src/main/res/values/preferences_values.xml index 289f14f3..52de39e1 100644 --- a/app/src/main/res/values/preferences_values.xml +++ b/app/src/main/res/values/preferences_values.xml @@ -24,6 +24,17 @@ black + + System language + Polski + English + + + system + pl + en + + 15 minutes 30 minutes diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4660f9fe..d5149a1d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -286,6 +286,7 @@ Application theme Expand grades Grades color scheme + App language Notifications Show notifications diff --git a/app/src/main/res/xml/scheme_preferences.xml b/app/src/main/res/xml/scheme_preferences.xml index 28229f41..d9e6c533 100644 --- a/app/src/main/res/xml/scheme_preferences.xml +++ b/app/src/main/res/xml/scheme_preferences.xml @@ -37,6 +37,14 @@ app:key="@string/pref_key_grade_color_scheme" app:title="@string/pref_view_grade_color_scheme" app:useSimpleSummaryProvider="true" /> + + app:title="@string/pref_view_grade_average_force_calc" />