diff --git a/app/src/main/java/com/nextcloud/client/onboarding/WhatsNewActivity.java b/app/src/main/java/com/nextcloud/client/onboarding/WhatsNewActivity.java deleted file mode 100644 index dd43cb5f2f..0000000000 --- a/app/src/main/java/com/nextcloud/client/onboarding/WhatsNewActivity.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Nextcloud Android client application - * - * @author Bartosz Przybylski - * @author Chris Narkiewicz - * Copyright (C) 2015 Bartosz Przybylski - * Copyright (C) 2015 ownCloud Inc. - * Copyright (C) 2016 Nextcloud. - * Copyright (C) 2019 Chris Narkiewicz - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this program. If not, see . - */ -package com.nextcloud.client.onboarding; - -import android.os.Bundle; -import android.view.View; -import android.widget.Button; -import android.widget.ImageButton; -import android.widget.TextView; - -import com.google.android.material.button.MaterialButton; -import com.nextcloud.android.common.ui.theme.utils.ColorRole; -import com.nextcloud.client.appinfo.AppInfo; -import com.nextcloud.client.di.Injectable; -import com.nextcloud.client.preferences.AppPreferences; -import com.owncloud.android.BuildConfig; -import com.owncloud.android.R; -import com.owncloud.android.databinding.WhatsNewActivityBinding; -import com.owncloud.android.ui.adapter.FeaturesViewAdapter; -import com.owncloud.android.ui.adapter.FeaturesWebViewAdapter; -import com.owncloud.android.ui.whatsnew.ProgressIndicator; -import com.owncloud.android.utils.theme.ViewThemeUtils; - -import javax.inject.Inject; - -import androidx.fragment.app.FragmentActivity; -import androidx.viewpager.widget.ViewPager; - -/** - * Activity displaying new features after an update. - */ -public class WhatsNewActivity extends FragmentActivity implements ViewPager.OnPageChangeListener, Injectable { - - @Inject AppPreferences preferences; - @Inject AppInfo appInfo; - @Inject OnboardingService onboarding; - @Inject ViewThemeUtils.Factory viewThemeUtilsFactory; - private ViewThemeUtils viewThemeUtils; - - private WhatsNewActivityBinding binding; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - binding = WhatsNewActivityBinding.inflate(getLayoutInflater()); - setContentView(binding.getRoot()); - - viewThemeUtils = viewThemeUtilsFactory.withPrimaryAsBackground(); - viewThemeUtils.platform.themeStatusBar(this, ColorRole.PRIMARY); - - - String[] urls = getResources().getStringArray(R.array.whatsnew_urls); - - boolean showWebView = urls.length > 0; - - if (showWebView) { - FeaturesWebViewAdapter featuresWebViewAdapter = new FeaturesWebViewAdapter(getSupportFragmentManager(), - urls); - binding.progressIndicator.setNumberOfSteps(featuresWebViewAdapter.getCount()); - binding.contentPanel.setAdapter(featuresWebViewAdapter); - } else { - FeaturesViewAdapter featuresViewAdapter = new FeaturesViewAdapter(getSupportFragmentManager(), - onboarding.getWhatsNew()); - binding.progressIndicator.setNumberOfSteps(featuresViewAdapter.getCount()); - binding.contentPanel.setAdapter(featuresViewAdapter); - } - - binding.contentPanel.addOnPageChangeListener(this); - - viewThemeUtils.platform.colorImageView(binding.forward, ColorRole.ON_PRIMARY); - - binding.forward.setOnClickListener(view -> { - if (binding.progressIndicator.hasNextStep()) { - binding.contentPanel.setCurrentItem(binding.contentPanel.getCurrentItem() + 1, true); - binding.progressIndicator.animateToStep(binding.contentPanel.getCurrentItem() + 1); - } else { - onFinish(); - finish(); - } - updateNextButtonIfNeeded(); - }); - - binding.forward.setBackground(null); - - viewThemeUtils.platform.colorTextView(binding.skip, ColorRole.ON_PRIMARY); - binding.skip.setOnClickListener(view -> { - onFinish(); - finish(); - }); - - viewThemeUtils.platform.colorTextView(binding.welcomeText, ColorRole.ON_PRIMARY); - - if (showWebView) { - binding.welcomeText.setText(R.string.app_name); - } else { - binding.welcomeText.setText(String.format(getString(R.string.whats_new_title), appInfo.getVersionName())); - } - - updateNextButtonIfNeeded(); - } - - @Override - public void onBackPressed() { - onFinish(); - super.onBackPressed(); - } - - private void updateNextButtonIfNeeded() { - if (!binding.progressIndicator.hasNextStep()) { - binding.forward.setImageResource(R.drawable.ic_ok); - binding.skip.setVisibility(View.INVISIBLE); - } else { - binding.forward.setImageResource(R.drawable.arrow_right); - binding.skip.setVisibility(View.VISIBLE); - } - } - - private void onFinish() { - preferences.setLastSeenVersionCode(BuildConfig.VERSION_CODE); - } - - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - // unused but to be implemented due to abstract parent - } - - @Override - public void onPageSelected(int position) { - binding.progressIndicator.animateToStep(position + 1); - updateNextButtonIfNeeded(); - } - - @Override - public void onPageScrollStateChanged(int state) { - // unused but to be implemented due to abstract parent - } -} - diff --git a/app/src/main/java/com/nextcloud/client/onboarding/WhatsNewActivity.kt b/app/src/main/java/com/nextcloud/client/onboarding/WhatsNewActivity.kt new file mode 100644 index 0000000000..9a25653147 --- /dev/null +++ b/app/src/main/java/com/nextcloud/client/onboarding/WhatsNewActivity.kt @@ -0,0 +1,169 @@ +/* + * Nextcloud Android client application + * + * @author Bartosz Przybylski + * @author Chris Narkiewicz + * Copyright (C) 2015 Bartosz Przybylski + * Copyright (C) 2015 ownCloud Inc. + * Copyright (C) 2016 Nextcloud. + * Copyright (C) 2019 Chris Narkiewicz + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this program. If not, see . + */ +package com.nextcloud.client.onboarding + +import android.os.Bundle +import android.view.View +import androidx.activity.OnBackPressedCallback +import androidx.fragment.app.FragmentActivity +import androidx.viewpager.widget.ViewPager +import com.nextcloud.android.common.ui.theme.utils.ColorRole +import com.nextcloud.client.appinfo.AppInfo +import com.nextcloud.client.di.Injectable +import com.nextcloud.client.preferences.AppPreferences +import com.owncloud.android.BuildConfig +import com.owncloud.android.R +import com.owncloud.android.databinding.WhatsNewActivityBinding +import com.owncloud.android.ui.adapter.FeaturesViewAdapter +import com.owncloud.android.ui.adapter.FeaturesWebViewAdapter +import com.owncloud.android.utils.theme.ViewThemeUtils +import javax.inject.Inject + +/** + * Activity displaying new features after an update. + */ +class WhatsNewActivity : FragmentActivity(), ViewPager.OnPageChangeListener, Injectable { + + @JvmField + @Inject + var preferences: AppPreferences? = null + + @JvmField + @Inject + var appInfo: AppInfo? = null + + @JvmField + @Inject + var onboarding: OnboardingService? = null + + @JvmField + @Inject + var viewThemeUtilsFactory: ViewThemeUtils.Factory? = null + + private var viewThemeUtils: ViewThemeUtils? = null + + private lateinit var binding: WhatsNewActivityBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + binding = WhatsNewActivityBinding.inflate(layoutInflater) + setContentView(binding.root) + + viewThemeUtils = viewThemeUtilsFactory?.withPrimaryAsBackground() + viewThemeUtils?.platform?.themeStatusBar(this, ColorRole.PRIMARY) + + val urls = resources.getStringArray(R.array.whatsnew_urls) + val showWebView = urls.isNotEmpty() + + setupFeatureViewAdapter(showWebView, urls) + binding.contentPanel.addOnPageChangeListener(this) + setupForwardImageButton() + setupSkipImageButton() + setupWelcomeText(showWebView) + updateNextButtonIfNeeded() + handleOnBackPressed() + } + + @Suppress("SpreadOperator") + private fun setupFeatureViewAdapter(showWebView: Boolean, urls: Array) { + val adapter = if (showWebView) { + FeaturesWebViewAdapter(supportFragmentManager, *urls) + } else { + onboarding?.let { + FeaturesViewAdapter(supportFragmentManager, *it.whatsNew) + } + } + + adapter?.let { + binding.progressIndicator.setNumberOfSteps(it.count) + binding.contentPanel.adapter = it + } + } + + private fun setupForwardImageButton() { + viewThemeUtils?.platform?.colorImageView(binding.forward, ColorRole.ON_PRIMARY) + binding.forward.setOnClickListener { + if (binding.progressIndicator.hasNextStep()) { + binding.contentPanel.setCurrentItem(binding.contentPanel.currentItem + 1, true) + binding.progressIndicator.animateToStep(binding.contentPanel.currentItem + 1) + } else { + onFinish() + finish() + } + updateNextButtonIfNeeded() + } + binding.forward.background = null + } + + private fun setupSkipImageButton() { + viewThemeUtils?.platform?.colorTextView(binding.skip, ColorRole.ON_PRIMARY) + binding.skip.setOnClickListener { + onFinish() + finish() + } + } + + private fun setupWelcomeText(showWebView: Boolean) { + viewThemeUtils?.platform?.colorTextView(binding.welcomeText, ColorRole.ON_PRIMARY) + binding.welcomeText.text = if (showWebView) { + getString(R.string.app_name) + } else { + String.format(getString(R.string.whats_new_title), appInfo?.versionName) + } + } + + private fun handleOnBackPressed() { + onBackPressedDispatcher.addCallback( + this, + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + onFinish() + onBackPressedDispatcher.onBackPressed() + } + } + ) + } + + private fun updateNextButtonIfNeeded() { + val hasNextStep = binding.progressIndicator.hasNextStep() + binding.forward.setImageResource(if (hasNextStep) R.drawable.arrow_right else R.drawable.ic_ok) + binding.skip.visibility = if (hasNextStep) View.VISIBLE else View.INVISIBLE + } + + private fun onFinish() { + preferences?.lastSeenVersionCode = BuildConfig.VERSION_CODE + } + + override fun onPageSelected(position: Int) { + binding.progressIndicator.animateToStep(position + 1) + updateNextButtonIfNeeded() + } + + @Suppress("EmptyFunctionBlock") + override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {} + + @Suppress("EmptyFunctionBlock") + override fun onPageScrollStateChanged(state: Int) {} +} diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 3e40a180b5..cea72ad5ba 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -14,10 +14,11 @@ 送信/共有 グリッド表示 リスト表示 - 連絡先とカレンダーを復元する + 連絡先とカレンダーを復元 コピー 新しいフォルダー 移動 + 移動またはコピー 次で開く 検索 詳細 @@ -30,12 +31,12 @@ 送信 リンク送信… アクティビティ - 別のリンクを作成 + 別のリンクを追加 新規公開共有リンクを追加 新しいセキュアなファイルドロップを追加 %1$s に追加 高度な設定 - 再共有を許可 + 再共有を許可する ダッシュボードから一つのウィジェットを表示 %s の中を検索 関連付けられたアカウントが見つかりません! @@ -45,7 +46,7 @@ 入力されたユーザーはこのアカウントのユーザーと一致しません 認識できないサーバーのバージョンです 接続が確立しました - サーバーが正しいユーザーIDを返していない場合、管理者に連絡してください。 + サーバーが正しいユーザーIDを返していません。管理者に連絡してください。 サーバーアドレス https://… サーバーアドレスの書式が違います サーバーが見つかりません @@ -550,6 +551,7 @@ ファイルをダウンロードとアップロードする追加の権限が必要です。 画像を設定するアプリが見つかりませんでした ホームスクリーンにピン留めする + %1$sを開く 389 KB placeholder.txt 12:23:45 @@ -591,6 +593,7 @@ 元のファイルになります… 日付を基にしたサブフォルダーに保存 サブフォルダーを利用 + サブフォルダーのオプション このクライアントに End-to-End 暗号化を追加 ライセンス アプリパスコード @@ -603,6 +606,7 @@ アカウント管理 友達にすすめる end-to-end 暗号化を設定 + アップスイッチャーを表示 隠しファイルを表示 ソースコードを入手 データ保存フォルダー @@ -925,7 +929,9 @@ 少々お待ちください… 保存された資格情報をチェック プライベートストレージからファイルをコピー中 + ログインするにはAndroidシステムのWebViewを更新してください 更新 + AndroidシステムのWebViewをアップデート 新しいイメージとは スキップ %1$sの新機能