diff --git a/app/src/main/java/jp/atled/agileworks/model/api/BadRefreshTokenException.kt b/app/src/main/java/jp/atled/agileworks/model/api/BadRefreshTokenException.kt index 449544b75af0b63e1d7d446f97a5fd6cb607001e..ccf2e9644c532323f3c67336b7d5e370e0115fd4 100644 --- a/app/src/main/java/jp/atled/agileworks/model/api/BadRefreshTokenException.kt +++ b/app/src/main/java/jp/atled/agileworks/model/api/BadRefreshTokenException.kt @@ -1,5 +1,6 @@ package jp.atled.agileworks.model.api +import jp.atled.agileworks.AwApp import jp.atled.agileworks.R import java.io.IOException @@ -13,5 +14,5 @@ import java.io.IOException */ class BadRefreshTokenException : IOException() { override val message: String? - get() = R.string.bad_refresh_token_exception.toString() + get() = AwApp.instance.resources.getString(R.string.bad_refresh_token_exception) } \ No newline at end of file diff --git a/app/src/main/java/jp/atled/agileworks/model/api/NetworkOfflineException.kt b/app/src/main/java/jp/atled/agileworks/model/api/NetworkOfflineException.kt index 2430246f1a360ad8d0f0abf1a6231fed04161b3c..bfeeaf864d311171a2ca785fa3d0b66dd2c9a9d9 100644 --- a/app/src/main/java/jp/atled/agileworks/model/api/NetworkOfflineException.kt +++ b/app/src/main/java/jp/atled/agileworks/model/api/NetworkOfflineException.kt @@ -1,9 +1,10 @@ package jp.atled.agileworks.model.api +import jp.atled.agileworks.AwApp import jp.atled.agileworks.R import java.io.IOException class NetworkOfflineException : IOException() { override val message: String? - get() = R.string.offline_message.toString() + get() = AwApp.instance.resources.getString(R.string.offline_message) } diff --git a/app/src/main/java/jp/atled/agileworks/view/base/BaseActivity.kt b/app/src/main/java/jp/atled/agileworks/view/base/BaseActivity.kt new file mode 100644 index 0000000000000000000000000000000000000000..a40e9684b3db3136d3fffda0347f2d24072cb600 --- /dev/null +++ b/app/src/main/java/jp/atled/agileworks/view/base/BaseActivity.kt @@ -0,0 +1,33 @@ +package jp.atled.agileworks.view.base + +import android.content.Context +import android.content.res.Configuration +import android.os.LocaleList +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import java.util.* + +open class BaseActivity: AppCompatActivity() { + private val TAG = "BaseActivity" + + override fun attachBaseContext(newBase: Context?) { + Log.d(TAG, "call attachBaseContext()") + + val pref = newBase?.getSharedPreferences("settings", Context.MODE_PRIVATE) + val localeLanguage = pref?.getString("localeLanguage", "") ?: "" + val localeCountry = pref?.getString("localeCountry", "") ?: "" + + val locale = if (localeLanguage != "" && localeCountry != "") Locale(localeLanguage, localeCountry) else null + + if (locale != null) { + val resources = newBase?.resources + val config = Configuration(resources?.configuration) + val localeList = LocaleList(locale) + LocaleList.setDefault(localeList) + config.setLocales(localeList) + super.attachBaseContext(newBase?.createConfigurationContext(config)) + } else { + super.attachBaseContext(newBase) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/jp/atled/agileworks/view/ui/DirectOpenDocumentActivity.kt b/app/src/main/java/jp/atled/agileworks/view/ui/DirectOpenDocumentActivity.kt index 738785f6f134655cb330c864c43ea9806f78e85d..2cea52c11d1bcaba36a7e51d86cdf0c1a103def7 100644 --- a/app/src/main/java/jp/atled/agileworks/view/ui/DirectOpenDocumentActivity.kt +++ b/app/src/main/java/jp/atled/agileworks/view/ui/DirectOpenDocumentActivity.kt @@ -6,15 +6,15 @@ import android.content.res.Configuration import android.os.Bundle import android.util.Log import androidx.appcompat.app.ActionBarDrawerToggle -import androidx.appcompat.app.AppCompatActivity import jp.atled.agileworks.BuildConfig import jp.atled.agileworks.R +import jp.atled.agileworks.view.base.BaseActivity import jp.atled.agileworks.view.ui.documentweb.DocumentWebFragment import jp.atled.agileworks.view.utils.putExtraNonNullString import jp.atled.agileworks.view.utils.putNonNullStingFromExtra import kotlinx.android.synthetic.main.activity_main.* -class DirectOpenDocumentActivity : AppCompatActivity() { +class DirectOpenDocumentActivity : BaseActivity() { private val TAG = "DirectOpenDocumentActivity" private lateinit var directOpenControl: DirectOpenControl diff --git a/app/src/main/java/jp/atled/agileworks/view/ui/MainActivity.kt b/app/src/main/java/jp/atled/agileworks/view/ui/MainActivity.kt index eefb503b9616e3461efd7008bf89bb8d86e0b41b..e1b92f17ff2b88d229a069f3fdf09d74f0227c81 100644 --- a/app/src/main/java/jp/atled/agileworks/view/ui/MainActivity.kt +++ b/app/src/main/java/jp/atled/agileworks/view/ui/MainActivity.kt @@ -12,7 +12,6 @@ import android.widget.TextView import androidx.annotation.RequiresApi import androidx.annotation.StringRes import androidx.appcompat.app.ActionBar -import androidx.appcompat.app.AppCompatActivity import androidx.core.app.NotificationManagerCompat import androidx.fragment.app.Fragment import androidx.lifecycle.LiveData @@ -27,12 +26,14 @@ import jp.atled.agileworks.R import jp.atled.agileworks.common.util.toFormattedString import jp.atled.agileworks.model.DeviceInfoRepository import jp.atled.agileworks.model.FcmRepository +import jp.atled.agileworks.view.base.BaseActivity import jp.atled.agileworks.view.ui.documentweb.DocumentWebFragment import jp.atled.agileworks.view.ui.login.LoginUtil import jp.atled.agileworks.view.utils.putNonNullStingFromExtra import kotlinx.android.synthetic.main.activity_main.* +import java.util.* -class MainActivity : AppCompatActivity() { +class MainActivity : BaseActivity() { private val TAG = "MainActivity" private var currentNavController: LiveData? = null diff --git a/app/src/main/java/jp/atled/agileworks/view/ui/login/LoginActivity.kt b/app/src/main/java/jp/atled/agileworks/view/ui/login/LoginActivity.kt index e961e33b6d90307291022a507adf8d406f32474a..9d2fef87436957e16cae125d35afd307f2bbc655 100644 --- a/app/src/main/java/jp/atled/agileworks/view/ui/login/LoginActivity.kt +++ b/app/src/main/java/jp/atled/agileworks/view/ui/login/LoginActivity.kt @@ -5,19 +5,34 @@ import android.content.Intent import android.content.res.Configuration import android.os.Bundle import android.util.Log -import androidx.appcompat.app.AppCompatActivity import jp.atled.agileworks.R +import jp.atled.agileworks.view.base.BaseActivity import jp.atled.agileworks.view.ui.toDeepLinkArguments import jp.atled.agileworks.view.ui.toDirectOpenArguments -class LoginActivity : AppCompatActivity() { +class LoginActivity : BaseActivity() { private val TAG = "LoginActivity" + private lateinit var multilingualControl: MultilingualControl + override fun onCreate(savedInstanceState: Bundle?) { Log.d(TAG, "call onCreate()") super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) + multilingualControl = MultilingualControl(this) + multilingualControl.multilingualControl() + multilingualControl.setOnItemSelectedListener { newContext -> + newContext?.let { + getSharedPreferences("settings", Context.MODE_PRIVATE).edit().apply() { + putString("localeLanguage", it.resources.configuration.locales[0].language) + putString("localeCountry", it.resources.configuration.locales[0].country) + apply() + } + this.recreate() + } + } + supportFragmentManager.beginTransaction() .replace(R.id.frameLayout, loginFragment()) .commit() @@ -38,6 +53,7 @@ class LoginActivity : AppCompatActivity() { Configuration.UI_MODE_NIGHT_YES -> Log.d("msg", "ダークテーマ") } } + companion object { const val ACTION_REAUTH = "jp.atled.agileworks.view.ui.login.ACTION_REAUTH" diff --git a/app/src/main/java/jp/atled/agileworks/view/ui/login/LoginFragment.kt b/app/src/main/java/jp/atled/agileworks/view/ui/login/LoginFragment.kt index fd95517835c6f6b4fc41fa73b08ec332fa3eaba7..64b2bce25115ab2d1a65fb23c77eb2c693477184 100644 --- a/app/src/main/java/jp/atled/agileworks/view/ui/login/LoginFragment.kt +++ b/app/src/main/java/jp/atled/agileworks/view/ui/login/LoginFragment.kt @@ -8,8 +8,7 @@ import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Button -import android.widget.TextView +import android.widget.* import androidx.annotation.StringRes import androidx.appcompat.app.AlertDialog import androidx.core.content.ContextCompat @@ -32,7 +31,6 @@ import kotlinx.android.synthetic.main.fragment_login.* import net.openid.appauth.AuthState import net.openid.appauth.AuthorizationException import net.openid.appauth.AuthorizationService -import android.widget.Toast import com.journeyapps.barcodescanner.ScanContract diff --git a/app/src/main/java/jp/atled/agileworks/view/ui/login/MultilingualControl.kt b/app/src/main/java/jp/atled/agileworks/view/ui/login/MultilingualControl.kt new file mode 100644 index 0000000000000000000000000000000000000000..ebd706c48c8860e4926c2954af044847dbb946a5 --- /dev/null +++ b/app/src/main/java/jp/atled/agileworks/view/ui/login/MultilingualControl.kt @@ -0,0 +1,92 @@ +package jp.atled.agileworks.view.ui.login + +import android.content.ContextWrapper +import android.content.res.Configuration +import android.os.LocaleList +import android.util.Log +import android.view.View +import android.widget.AdapterView +import android.widget.ArrayAdapter +import android.widget.Spinner +import jp.atled.agileworks.R +import java.util.* + +class MultilingualControl(var activity: LoginActivity) { + private lateinit var spinner : Spinner + private lateinit var locale: Locale + + // プルダウン設定値 + private val spinnerItems = arrayOf(activity.baseContext.getString(R.string.login_multilingual_auto), "日本語", "English", "中文(簡体)", "中文(繫体)") + + fun multilingualControl() { + // プルダウン設定 + spinner = activity.findViewById(R.id.multilingual_spinner) + val adapter = ArrayAdapter(activity, R.layout.spinner_item, spinnerItems) + adapter.setDropDownViewResource(R.layout.spinner_dropdown_item) + spinner.adapter = adapter + + // 設定言語取得 + locale = Locale.getDefault() + // プルダウンの初期設定値を設定 + setInitialLanguage() + } + + private fun setInitialLanguage() { + // 設定言語からプルダウンの初期設定値を設定する + when (locale.language) { + "ja" -> { spinner.setSelection(1) } // 日本語 + "en" -> { spinner.setSelection(2) } // English + "zh" -> { + when (locale.country) { + "TW" -> { spinner.setSelection(4) } // 中文(繫体) + else -> { spinner.setSelection(3) } // 中文(簡体) + } + } + else -> { spinner.setSelection(1) } // 日本語 + } + } + + fun setOnItemSelectedListener(newContext:(ContextWrapper?) -> Unit) { + spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(spinner: AdapterView<*>?, view: View?, position: Int, id: Long) { + // 項目が選択された時 + newContext(getNewContext(spinner?.selectedItem.toString())) + } + + override fun onNothingSelected(p0: AdapterView<*>?) { + // アイテムが選択されることなくプルダウンが閉じられた時に呼ばれるので処理なし + newContext(null) + } + } + } + + private fun getNewContext(selectedLanguage: String): ContextWrapper? { + val resources = activity.baseContext.resources + val config = Configuration(resources.configuration) + + val newLocale = convSelectedLanguageToLocale(selectedLanguage) + if (newLocale.language == locale.language && newLocale.country == locale.country) { + // 同一言語・国の場合、言語設定しない + return null + } + + val newLocaleList = LocaleList(newLocale) + LocaleList.setDefault(newLocaleList) + config.setLocales(newLocaleList) + + val newContext = activity.baseContext.createConfigurationContext(config) + + return ContextWrapper(newContext) + } + + private fun convSelectedLanguageToLocale(selectedLanguage: String): Locale { + return when (selectedLanguage) { + "自動" -> { activity.applicationContext.resources.configuration.locales[0] } + "日本語" -> { Locale("ja", "JP") } + "English" -> { Locale("en", "US") } + "中文(簡体)" -> { Locale("zh", "CN") } + "中文(繫体)" -> { Locale("zh", "TW") } + else -> { Locale("ja", "JP") } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/frame_border.xml b/app/src/main/res/drawable/frame_border.xml new file mode 100644 index 0000000000000000000000000000000000000000..81021d69855a05aeb98b669a6b790ce28b134407 --- /dev/null +++ b/app/src/main/res/drawable/frame_border.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5d5344ee62b4c335d5268db67b57c232a037f86f..290fc338b2bff55a91e08e9f29737240849350c4 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -1,5 +1,7 @@ - + + @@ -8,6 +10,30 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> + + + + + + + diff --git a/app/src/main/res/layout/spinner_dropdown_item.xml b/app/src/main/res/layout/spinner_dropdown_item.xml new file mode 100644 index 0000000000000000000000000000000000000000..eac63a3704b1c5e646604737f68ad80d2296e396 --- /dev/null +++ b/app/src/main/res/layout/spinner_dropdown_item.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/spinner_item.xml b/app/src/main/res/layout/spinner_item.xml new file mode 100644 index 0000000000000000000000000000000000000000..93817c7395ef626409238dc70a7088e4880f5a95 --- /dev/null +++ b/app/src/main/res/layout/spinner_item.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index c41d10a6762eca61cf6b26f5de4995885e6528ba..2c5cc5afb26032d99ef5d0fa9b528a8bf959dec8 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -6,16 +6,16 @@ メニューを開く メニューを閉じる - プロファイル - ログアウト - ライセンス - オープンソースライセンス + Profile + Logout + License + open source license Home - 仕事 - 検索 - 書類作成 + Task + Search + Apply 検索結果 %s件 @@ -40,16 +40,18 @@ 再ログイン + language + auto https:// - AgileWorksサーバ (example.com[:443]) + AgileWorks server (example.com[:443]) / AgileWorks - 接続 - クライアント証明書: 設定取得中… - クライアント証明書: %s - クライアント証明書: 利用しない - 選択… - QRコード読み込み + connection + client certificate: Getting settings… + client certificate: %s + client certificate: not use + select… + Read QR code QR ログインQRコードを読み込んでください Cancelled @@ -68,9 +70,9 @@ AgileWorks - ログアウトしますか? - はい - いいえ + Would you like to log out? + Yes + No document @@ -86,15 +88,15 @@ 通知の詳細情報 - プロファイル - ユーザ情報 - ユーザコード - ユーザ名 - ログインID - 所属する組織(主務) - 組織 - ロール - 閉じる + Profile + User info + User code + User name + Login ID + Affiliated unit(main unit) + Unit + Role + Close ログアウト通知 @@ -102,7 +104,7 @@ OK - 利用許諾 + license agreement 同意する 同意しない OK diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index c41d10a6762eca61cf6b26f5de4995885e6528ba..aad875f5b362bd3e9037476bfbc94547b745c738 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -40,6 +40,8 @@ 再ログイン + language + 自動 https:// AgileWorksサーバ (example.com[:443]) / diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index c41d10a6762eca61cf6b26f5de4995885e6528ba..fc29520dc73c98c55f680aaa3d2c4b593efc6bd3 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -6,16 +6,16 @@ メニューを開く メニューを閉じる - プロファイル - ログアウト - ライセンス - オープンソースライセンス + 個人檔案 + 登出 + 授權 + 開放源代碼許可證 - Home - 仕事 - 検索 - 書類作成 + + 工作 + 搜尋 + 建立文件 検索結果 %s件 @@ -40,16 +40,18 @@ 再ログイン + language + 自動 https:// - AgileWorksサーバ (example.com[:443]) + AgileWorks服務器 (example.com[:443]) / AgileWorks - 接続 - クライアント証明書: 設定取得中… - クライアント証明書: %s - クライアント証明書: 利用しない - 選択… - QRコード読み込み + 聯繫 + 客戶證書: 獲取設置… + 客戶證書: %s + 客戶證書: 不使用 + 選擇… + 讀取QR碼 QR ログインQRコードを読み込んでください Cancelled @@ -68,9 +70,9 @@ AgileWorks - ログアウトしますか? - はい - いいえ + 你想登出嗎? + + document @@ -86,15 +88,15 @@ 通知の詳細情報 - プロファイル - ユーザ情報 - ユーザコード - ユーザ名 - ログインID - 所属する組織(主務) + 個人檔案 + 用戶信息 + 用戶代碼 + 用戶名 + 登入ID + 隸屬組織(主組織) 組織 - ロール - 閉じる + 職位 + 關閉 ログアウト通知 @@ -102,7 +104,7 @@ OK - 利用許諾 + 許可證協議 同意する 同意しない OK diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index c41d10a6762eca61cf6b26f5de4995885e6528ba..064237ff0664571fc7a24f967e47c53d15620ed8 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -6,16 +6,16 @@ メニューを開く メニューを閉じる - プロファイル - ログアウト - ライセンス - オープンソースライセンス + 个人档案 + 退出 + 许可证 + 开放源代码许可证 - Home - 仕事 - 検索 - 書類作成 + + 工作 + 检索 + 制作文档 検索結果 %s件 @@ -40,16 +40,18 @@ 再ログイン + language + 自動 https:// - AgileWorksサーバ (example.com[:443]) + AgileWorks服务器 (example.com[:443]) / AgileWorks - 接続 - クライアント証明書: 設定取得中… - クライアント証明書: %s - クライアント証明書: 利用しない - 選択… - QRコード読み込み + 联系 + 客户证书: 获取设置… + 客户证书: %s + 客户证书: 不使用 + 选择… + 读取QR码 QR ログインQRコードを読み込んでください Cancelled @@ -68,9 +70,9 @@ AgileWorks - ログアウトしますか? - はい - いいえ + 你想登出吗? + + document @@ -86,15 +88,15 @@ 通知の詳細情報 - プロファイル - ユーザ情報 - ユーザコード - ユーザ名 - ログインID - 所属する組織(主務) - 組織 - ロール - 閉じる + 个人档案 + 用户信息 + 用户代码 + 用户名 + 登录ID + 所属组织(主组织) + 组织 + 职位 + 关闭 ログアウト通知 @@ -102,7 +104,7 @@ OK - 利用許諾 + 许可证协议 同意する 同意しない OK diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 0e45f125486ea6f8c0d822f58ddeaddd2144c150..b2b9b2ba601e9692a5919752d79dd2b24fb74725 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -20,6 +20,8 @@ 16sp 10sp 100dp + 25sp + 20sp 10dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c41d10a6762eca61cf6b26f5de4995885e6528ba..aad875f5b362bd3e9037476bfbc94547b745c738 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -40,6 +40,8 @@ 再ログイン + language + 自動 https:// AgileWorksサーバ (example.com[:443]) /