diff --git a/build.gradle b/build.gradle index acc08190ed0..63f15e56590 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,7 @@ buildscript { appCompat = "1.1.0" sqliteVersion = "2.0.1" lifecycleLiveData = "2.0.0" + biometricVersion="1.0.1" // Kotlin kotlinVersion = "1.3.61" diff --git a/owncloudApp/build.gradle b/owncloudApp/build.gradle index e66de22c4b9..090a2f233fc 100644 --- a/owncloudApp/build.gradle +++ b/owncloudApp/build.gradle @@ -25,6 +25,7 @@ dependencies { implementation "androidx.browser:browser:1.2.0" implementation 'commons-io:commons-io:2.6' implementation "androidx.sqlite:sqlite:$sqliteVersion" + implementation "androidx.biometric:biometric:$biometricVersion" // Tests testImplementation project(':owncloudTestUtil') diff --git a/owncloudApp/src/androidTest/java/com/owncloud/android/settings/security/OCSettingsSecurityTest.kt b/owncloudApp/src/androidTest/java/com/owncloud/android/settings/security/OCSettingsSecurityTest.kt index d075343d5a9..d6fd855ee02 100644 --- a/owncloudApp/src/androidTest/java/com/owncloud/android/settings/security/OCSettingsSecurityTest.kt +++ b/owncloudApp/src/androidTest/java/com/owncloud/android/settings/security/OCSettingsSecurityTest.kt @@ -102,9 +102,9 @@ class OCSettingsSecurityTest { fun securityView() { onView(withText(R.string.prefs_passcode)).check(matches(isDisplayed())) onView(withText(R.string.prefs_pattern)).check(matches(isDisplayed())) - onView(withText(R.string.prefs_fingerprint)).check(matches(isDisplayed())) - onView(withText(R.string.prefs_fingerprint_summary)).check(matches(isDisplayed())) - onView(withText(R.string.prefs_fingerprint)).check(matches(not(isEnabled()))) + onView(withText(R.string.prefs_biometric)).check(matches(isDisplayed())) + onView(withText(R.string.prefs_biometric_summary)).check(matches(isDisplayed())) + onView(withText(R.string.prefs_biometric)).check(matches(not(isEnabled()))) onView(withText(R.string.prefs_touches_with_other_visible_windows)).check(matches(isDisplayed())) onView(withText(R.string.prefs_touches_with_other_visible_windows_summary)).check(matches(isDisplayed())) } @@ -146,13 +146,13 @@ class OCSettingsSecurityTest { @Test fun enablePasscodeEnablesFingerprint() { firstEnablePasscode() - onView(withText(R.string.prefs_fingerprint)).check(matches(isEnabled())) + onView(withText(R.string.prefs_biometric)).check(matches(isEnabled())) } @Test fun enablePatternEnablesFingerprint() { firstEnablePattern() - onView(withText(R.string.prefs_fingerprint)).check(matches(isEnabled())) + onView(withText(R.string.prefs_biometric)).check(matches(isEnabled())) } @Test @@ -179,7 +179,7 @@ class OCSettingsSecurityTest { onView(withText(R.string.prefs_passcode)).perform(click()) assertFalse(mPrefPasscode.isChecked) onView(withText(R.string.pass_code_removed)).check(matches(isEnabled())) - onView(withText(R.string.prefs_fingerprint)).check(matches(not(isEnabled()))) + onView(withText(R.string.prefs_biometric)).check(matches(not(isEnabled()))) } @Test @@ -192,7 +192,7 @@ class OCSettingsSecurityTest { onView(withText(R.string.prefs_pattern)).perform(click()) assertFalse(mPrefPattern.isChecked) onView(withText(R.string.pattern_removed)).check(matches(isEnabled())) - onView(withText(R.string.prefs_fingerprint)).check(matches(not(isEnabled()))) + onView(withText(R.string.prefs_biometric)).check(matches(not(isEnabled()))) } @Test diff --git a/owncloudApp/src/main/AndroidManifest.xml b/owncloudApp/src/main/AndroidManifest.xml index 0bf414ac845..056575afaa3 100644 --- a/owncloudApp/src/main/AndroidManifest.xml +++ b/owncloudApp/src/main/AndroidManifest.xml @@ -272,6 +272,6 @@ android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode" android:theme="@style/Theme.ownCloud.Fullscreen" /> - + \ No newline at end of file diff --git a/owncloudApp/src/main/java/com/owncloud/android/MainApp.kt b/owncloudApp/src/main/java/com/owncloud/android/MainApp.kt index c3912372f88..c7d310a9d12 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/MainApp.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/MainApp.kt @@ -28,14 +28,14 @@ import android.content.pm.PackageManager import android.os.Build import android.os.Bundle import android.os.Environment -import android.preference.PreferenceManager import android.view.WindowManager import androidx.multidex.MultiDex import androidx.multidex.MultiDexApplication -import com.owncloud.android.authentication.FingerprintManager +import com.owncloud.android.authentication.BiometricManager import com.owncloud.android.authentication.PassCodeManager import com.owncloud.android.authentication.PatternManager import com.owncloud.android.datamodel.ThumbnailsCacheManager +import com.owncloud.android.db.PreferenceManager import com.owncloud.android.dependecyinjection.commonModule import com.owncloud.android.dependecyinjection.localDataSourceModule import com.owncloud.android.dependecyinjection.remoteDataSourceModule @@ -45,7 +45,7 @@ import com.owncloud.android.dependecyinjection.viewModelModule import com.owncloud.android.lib.common.OwnCloudClient import com.owncloud.android.lib.common.SingleSessionManager import com.owncloud.android.lib.common.utils.LoggingHelper -import com.owncloud.android.ui.activity.FingerprintActivity +import com.owncloud.android.ui.activity.BiometricActivity import com.owncloud.android.ui.activity.PassCodeActivity import com.owncloud.android.ui.activity.PatternLockActivity import com.owncloud.android.ui.activity.WhatsNewActivity @@ -77,7 +77,7 @@ class MainApp : MultiDexApplication() { // initialise thumbnails cache on background thread ThumbnailsCacheManager.InitDiskCacheTask().execute() - // register global protection with pass code, pattern lock and fingerprint lock + // register global protection with pass code, pattern lock and biometric lock registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks { override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { Timber.d("${activity.javaClass.simpleName} onCreate(Bundle) starting") @@ -85,7 +85,7 @@ class MainApp : MultiDexApplication() { val passCodeEnabled = preferences.getBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, false) val patternCodeEnabled = preferences.getBoolean(PatternLockActivity.PREFERENCE_SET_PATTERN, false) if (!isDeveloper) { - // To enable FingerPrint you need to enable passCode or pattern, so no need to add check to if + // To enable biometric you need to enable passCode or pattern, so no need to add check to if if (passCodeEnabled || patternCodeEnabled) { activity.window.addFlags(WindowManager.LayoutParams.FLAG_SECURE) } else { @@ -97,10 +97,12 @@ class MainApp : MultiDexApplication() { // have finished if (activity !is PassCodeActivity && activity !is PatternLockActivity && - activity !is FingerprintActivity + activity !is BiometricActivity ) { WhatsNewActivity.runIfNeeded(activity) } + + PreferenceManager.migrateFingerprintToBiometricKey(applicationContext); } override fun onActivityStarted(activity: Activity) { @@ -108,7 +110,7 @@ class MainApp : MultiDexApplication() { PassCodeManager.getPassCodeManager().onActivityStarted(activity) PatternManager.getPatternManager().onActivityStarted(activity) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - FingerprintManager.getFingerprintManager(activity).onActivityStarted(activity) + BiometricManager.getBiometricManager(activity).onActivityStarted(activity) } } @@ -125,11 +127,11 @@ class MainApp : MultiDexApplication() { PassCodeManager.getPassCodeManager().onActivityStopped(activity) PatternManager.getPatternManager().onActivityStopped(activity) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - FingerprintManager.getFingerprintManager(activity).onActivityStopped(activity) + BiometricManager.getBiometricManager(activity).onActivityStopped(activity) } if (activity is PassCodeActivity || activity is PatternLockActivity || - activity is FingerprintActivity + activity is BiometricActivity ) { WhatsNewActivity.runIfNeeded(activity) } diff --git a/owncloudApp/src/main/java/com/owncloud/android/authentication/BiometricManager.java b/owncloudApp/src/main/java/com/owncloud/android/authentication/BiometricManager.java new file mode 100755 index 00000000000..e6e0c20e4c5 --- /dev/null +++ b/owncloudApp/src/main/java/com/owncloud/android/authentication/BiometricManager.java @@ -0,0 +1,148 @@ +/** + * ownCloud Android client application + * + * @author David González Verdugo + * @author Christian Schabesberger + * @author Roberto Bermejo + * Copyright (C) 2019 ownCloud GmbH. + *

+ * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. + *

+ * 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 General Public License for more details. + *

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.owncloud.android.authentication; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Build; +import android.os.PowerManager; +import android.preference.PreferenceManager; + +import androidx.annotation.RequiresApi; +import com.owncloud.android.MainApp; +import com.owncloud.android.ui.activity.BiometricActivity; + +import java.util.HashSet; +import java.util.Set; + +@RequiresApi(api = Build.VERSION_CODES.M) +/** + * Handle biometric requests. Besides, is a facade to access some + * {@link androidx.biometric.BiometricMananager} methods + */ + public class BiometricManager { + + private static final Set sExemptOfBiometricActivites; + + private androidx.biometric.BiometricManager mBiometricManager; + + static { + sExemptOfBiometricActivites = new HashSet<>(); + sExemptOfBiometricActivites.add(BiometricActivity.class); + // other activities may be exempted, if needed + } + + private static int BIOMETRIC_TIMEOUT = 1000; + // keeping a "low" positive value is the easiest way to prevent the biometric is requested on rotations + + private static BiometricManager mBiometricManagerInstance = null; + + public static BiometricManager getBiometricManager(Context context) { + + if (mBiometricManagerInstance == null) { + mBiometricManagerInstance = new BiometricManager(); + mBiometricManagerInstance.mBiometricManager = androidx.biometric.BiometricManager.from(context); + } + return mBiometricManagerInstance; + } + + private Long mTimestamp = 0l; + private int mVisibleActivitiesCounter = 0; + + private BiometricManager() { + } + + public void onActivityStarted(Activity activity) { + + if (!sExemptOfBiometricActivites.contains(activity.getClass())) { + + if (biometricShouldBeRequested()) { + + if (isHardwareDetected() && hasEnrolledBiometric()) { + // Use biometric lock + Intent i = new Intent(MainApp.Companion.getAppContext(), BiometricActivity.class); + activity.startActivity(i); + } else if (PassCodeManager.getPassCodeManager().isPassCodeEnabled()) { + // Cancel biometric lock and use passcode unlock method + PassCodeManager.getPassCodeManager().onBiometricCancelled(activity); + mVisibleActivitiesCounter++; + } else if (PatternManager.getPatternManager().isPatternEnabled()) { + // Cancel biometric lock and use pattern unlock method + PatternManager.getPatternManager().onBiometricCancelled(activity); + mVisibleActivitiesCounter++; + } + + } + } + + mVisibleActivitiesCounter++; // keep it AFTER biometricShouldBeRequested was checked + } + + public void onActivityStopped(Activity activity) { + if (mVisibleActivitiesCounter > 0) { + mVisibleActivitiesCounter--; + } + setUnlockTimestamp(); + PowerManager powerMgr = (PowerManager) activity.getSystemService(Context.POWER_SERVICE); + if (isBiometricEnabled() && powerMgr != null && !powerMgr.isScreenOn()) { + activity.moveTaskToBack(true); + } + } + + private void setUnlockTimestamp() { + mTimestamp = System.currentTimeMillis(); + } + + private boolean biometricShouldBeRequested() { + + if ((System.currentTimeMillis() - mTimestamp) > BIOMETRIC_TIMEOUT && mVisibleActivitiesCounter <= 0) { + return isBiometricEnabled(); + } + + return false; + } + + protected boolean isBiometricEnabled() { + SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(MainApp.Companion.getAppContext()); + return (appPrefs.getBoolean(BiometricActivity.PREFERENCE_SET_BIOMETRIC, false)); + } + + public boolean isHardwareDetected() { + return mBiometricManager.canAuthenticate() != androidx.biometric.BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE && + mBiometricManager.canAuthenticate() != androidx.biometric.BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE; + } + + public boolean hasEnrolledBiometric() { + return mBiometricManager.canAuthenticate() != androidx.biometric.BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED; + } + + /** + * This can be used for example for onActivityResult, where you don't want to re authenticate + * again. + * + * USE WITH CARE + */ + public void bayPassUnlockOnce() { + setUnlockTimestamp(); + } +} diff --git a/owncloudApp/src/main/java/com/owncloud/android/authentication/FingerprintManager.java b/owncloudApp/src/main/java/com/owncloud/android/authentication/FingerprintManager.java deleted file mode 100644 index 013178bbd06..00000000000 --- a/owncloudApp/src/main/java/com/owncloud/android/authentication/FingerprintManager.java +++ /dev/null @@ -1,157 +0,0 @@ -/** - * ownCloud Android client application - * - * @author David González Verdugo - * @author Christian Schabesberger - * Copyright (C) 2020 ownCloud GmbH. - *

- * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. - *

- * 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 General Public License for more details. - *

- * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.owncloud.android.authentication; - -import android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.os.Build; -import android.os.PowerManager; -import android.preference.PreferenceManager; - -import androidx.annotation.RequiresApi; -import com.owncloud.android.MainApp; -import com.owncloud.android.ui.activity.FingerprintActivity; -import timber.log.Timber; - -import java.util.HashSet; -import java.util.Set; - -@RequiresApi(api = Build.VERSION_CODES.M) -/** - * Handle fingerprint requests. Besides, is a facade to access some - * {@link android.hardware.fingerprint.FingerprintManager} methods - */ -public class FingerprintManager { - - private static final Set sExemptOfFingerprintActivites; - - private android.hardware.fingerprint.FingerprintManager mHwFingerPrintManager; - - static { - sExemptOfFingerprintActivites = new HashSet(); - sExemptOfFingerprintActivites.add(FingerprintActivity.class); - // other activities may be exempted, if needed - } - - private static int FINGERPRINT_TIMEOUT = 1000; - // keeping a "low" positive value is the easiest way to prevent the fingerprint is requested on rotations - - public static FingerprintManager mFingerprintManagerInstance = null; - - public static FingerprintManager getFingerprintManager(Context context) { - if (mFingerprintManagerInstance == null) { - mFingerprintManagerInstance = new FingerprintManager(); - mFingerprintManagerInstance.mHwFingerPrintManager = context.getSystemService(android.hardware.fingerprint. - FingerprintManager.class); - } - return mFingerprintManagerInstance; - } - - private Long mTimestamp = 0l; - private int mVisibleActivitiesCounter = 0; - - protected FingerprintManager() { - } - - public void onActivityStarted(Activity activity) { - - if (!sExemptOfFingerprintActivites.contains(activity.getClass())) { - - if (fingerprintShouldBeRequested()) { - - // There's no fingerprints registered in the device - if (!hasEnrolledFingerprints() && PassCodeManager.getPassCodeManager().isPassCodeEnabled()) { - - // Cancel fingerprint lock and use passcode unlock method - PassCodeManager.getPassCodeManager().onFingerprintCancelled(activity); - mVisibleActivitiesCounter++; - return; - - } else if (!hasEnrolledFingerprints() && PatternManager.getPatternManager().isPatternEnabled()) { - - // Cancel fingerprint lock and use pattern unlock method - PatternManager.getPatternManager().onFingerprintCancelled(activity); - mVisibleActivitiesCounter++; - return; - } - - Intent i = new Intent(MainApp.Companion.getAppContext(), FingerprintActivity.class); - activity.startActivity(i); - } - } - - mVisibleActivitiesCounter++; // keep it AFTER fingerprintShouldBeRequested was checked - } - - public void onActivityStopped(Activity activity) { - if (mVisibleActivitiesCounter > 0) { - mVisibleActivitiesCounter--; - } - setUnlockTimestamp(); - PowerManager powerMgr = (PowerManager) activity.getSystemService(Context.POWER_SERVICE); - if (isFingerPrintEnabled() && powerMgr != null && !powerMgr.isScreenOn()) { - activity.moveTaskToBack(true); - } - } - - private void setUnlockTimestamp() { - mTimestamp = System.currentTimeMillis(); - } - - private boolean fingerprintShouldBeRequested() { - - if ((System.currentTimeMillis() - mTimestamp) > FINGERPRINT_TIMEOUT && - mVisibleActivitiesCounter <= 0) { - return isFingerPrintEnabled(); - } - - return false; - } - - public boolean isFingerPrintEnabled() { - SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(MainApp.Companion.getAppContext()); - return (appPrefs.getBoolean(FingerprintActivity.PREFERENCE_SET_FINGERPRINT, false)); - } - - public boolean isHardwareDetected() { - return mHwFingerPrintManager.isHardwareDetected(); - } - - public boolean hasEnrolledFingerprints() { - try { - return mHwFingerPrintManager.hasEnrolledFingerprints(); - } catch (RuntimeException re) { - Timber.e(re, "Could find out if finger prints are enroded due to lack of android.permission.INTERACT_ACROSS_USERS"); - return false; - } - } - - /** - * This can be used for example for onActivityResult, where you don't want to re authenticate - * again. - * - * USE WITH CARE - */ - public void bayPassUnlockOnce() { - setUnlockTimestamp(); - } -} diff --git a/owncloudApp/src/main/java/com/owncloud/android/authentication/FingerprintUIHelper.java b/owncloudApp/src/main/java/com/owncloud/android/authentication/FingerprintUIHelper.java deleted file mode 100644 index 5e9c8198c76..00000000000 --- a/owncloudApp/src/main/java/com/owncloud/android/authentication/FingerprintUIHelper.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - * - * Modifications - * - * @author David González Verdugo - * Copyright (C) 2020 ownCloud GmbH. - */ - -package com.owncloud.android.authentication; - -import android.hardware.fingerprint.FingerprintManager; -import android.os.Build; -import android.os.CancellationSignal; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.RequiresApi; -import com.owncloud.android.R; - -/** - * Small helper class to manage text/icon around fingerprint authentication UI. - */ -@RequiresApi(api = Build.VERSION_CODES.M) -public class FingerprintUIHelper extends FingerprintManager.AuthenticationCallback { - - private static final long ERROR_TIMEOUT_MILLIS = 3000; - private static final long SUCCESS_DELAY_MILLIS = 1300; - - private final FingerprintManager mFingerprintManager; - private final ImageView mIcon; - private final TextView mErrorTextView; - private final Callback mCallback; - private CancellationSignal mCancellationSignal; - - private boolean mSelfCancelled; - - /** - * Constructor for {@link FingerprintUIHelper}. - */ - public FingerprintUIHelper(FingerprintManager fingerprintManager, - ImageView icon, TextView errorTextView, Callback callback) { - mFingerprintManager = fingerprintManager; - mIcon = icon; - mErrorTextView = errorTextView; - mCallback = callback; - } - - public void startListening(FingerprintManager.CryptoObject cryptoObject) { - mCancellationSignal = new CancellationSignal(); - mSelfCancelled = false; - mFingerprintManager.authenticate(cryptoObject, mCancellationSignal, 0 /* flags */, this, - null); - } - - public void stopListening() { - if (mCancellationSignal != null) { - mSelfCancelled = true; - mCancellationSignal.cancel(); - mCancellationSignal = null; - } - } - - @Override - public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) { - mErrorTextView.removeCallbacks(mResetErrorTextRunnable); - mIcon.setImageResource(R.drawable.ic_fingerprint_success); - mErrorTextView.setTextColor(mErrorTextView.getResources().getColor(R.color.success, null)); - mErrorTextView.setText(mErrorTextView.getResources().getString(R.string.fingerprint_success)); - mIcon.postDelayed(new Runnable() { - @Override - public void run() { - mCallback.onAuthenticated(); - } - }, SUCCESS_DELAY_MILLIS); - } - - @Override - public void onAuthenticationFailed() { - showError(mIcon.getResources().getString(R.string.fingerprint_not_recognized)); - } - - private void showError(CharSequence error) { - mIcon.setImageResource(R.drawable.ic_fingerprint_error); - mErrorTextView.setText(error); - mErrorTextView.setTextColor(mErrorTextView.getResources().getColor(R.color.warning, null)); - mErrorTextView.removeCallbacks(mResetErrorTextRunnable); - mErrorTextView.postDelayed(mResetErrorTextRunnable, ERROR_TIMEOUT_MILLIS); - } - - @Override - public void onAuthenticationError(int errMsgId, CharSequence errString) { - if (!mSelfCancelled) { - showError(errString); - mIcon.postDelayed(new Runnable() { - @Override - public void run() { - mCallback.onError(); - } - }, ERROR_TIMEOUT_MILLIS); - } - } - - @Override - public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) { - showError(helpString); - } - - private Runnable mResetErrorTextRunnable = new Runnable() { - @Override - public void run() { - mErrorTextView.setTextColor(mErrorTextView.getResources().getColor(R.color.grey, null)); - mErrorTextView.setText(mErrorTextView.getResources().getString(R.string.fingerprint_hint)); - mIcon.setImageResource(R.drawable.ic_fp_40px); - } - }; - - public interface Callback { - - void onAuthenticated(); - - void onError(); - } -} \ No newline at end of file diff --git a/owncloudApp/src/main/java/com/owncloud/android/authentication/PassCodeManager.java b/owncloudApp/src/main/java/com/owncloud/android/authentication/PassCodeManager.java index 550036f0746..647375fda1a 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/authentication/PassCodeManager.java +++ b/owncloudApp/src/main/java/com/owncloud/android/authentication/PassCodeManager.java @@ -29,6 +29,7 @@ import com.owncloud.android.MainApp; import com.owncloud.android.ui.activity.PassCodeActivity; +import com.owncloud.android.authentication.BiometricManager; import java.util.HashSet; import java.util.Set; @@ -65,9 +66,9 @@ public void onActivityStarted(Activity activity) { if (!sExemptOfPasscodeActivites.contains(activity.getClass()) && passCodeShouldBeRequested()) { - // Do not ask for passcode if fingerprint is enabled - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && FingerprintManager.getFingerprintManager(activity). - isFingerPrintEnabled()) { + // Do not ask for passcode if biometric is enabled + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && BiometricManager.getBiometricManager(activity). + isBiometricEnabled()) { mVisibleActivitiesCounter++; return; } @@ -89,7 +90,7 @@ public void onActivityStopped(Activity activity) { } } - public void onFingerprintCancelled(Activity activity) { + public void onBiometricCancelled(Activity activity) { // Ask user for passcode checkPasscode(activity); } @@ -97,7 +98,7 @@ public void onFingerprintCancelled(Activity activity) { private void checkPasscode(Activity activity) { Intent i = new Intent(MainApp.Companion.getAppContext(), PassCodeActivity.class); i.setAction(PassCodeActivity.ACTION_CHECK); - i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); + i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP); activity.startActivity(i); } diff --git a/owncloudApp/src/main/java/com/owncloud/android/authentication/PatternManager.java b/owncloudApp/src/main/java/com/owncloud/android/authentication/PatternManager.java index 7db7b8bc084..010cedda8a4 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/authentication/PatternManager.java +++ b/owncloudApp/src/main/java/com/owncloud/android/authentication/PatternManager.java @@ -60,9 +60,9 @@ private PatternManager() { public void onActivityStarted(Activity activity) { if (!sExemptOfPatternActivites.contains(activity.getClass()) && patternShouldBeRequested()) { - // Do not ask for pattern if fingerprint is enabled - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && FingerprintManager.getFingerprintManager(activity). - isFingerPrintEnabled()) { + // Do not ask for pattern if biometric is enabled + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && BiometricManager.getBiometricManager(activity). + isBiometricEnabled()) { mVisibleActivitiesCounter++; return; } @@ -86,7 +86,7 @@ public void onActivityStopped(Activity activity) { } } - public void onFingerprintCancelled(Activity activity) { + public void onBiometricCancelled(Activity activity) { // Ask user for pattern checkPattern(activity); } @@ -94,6 +94,7 @@ public void onFingerprintCancelled(Activity activity) { private void checkPattern(Activity activity) { Intent i = new Intent(MainApp.Companion.getAppContext(), PatternLockActivity.class); i.setAction(PatternLockActivity.ACTION_CHECK); + i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP); activity.startActivity(i); } diff --git a/owncloudApp/src/main/java/com/owncloud/android/db/PreferenceManager.java b/owncloudApp/src/main/java/com/owncloud/android/db/PreferenceManager.java index 41601375f15..89b851a9f19 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/db/PreferenceManager.java +++ b/owncloudApp/src/main/java/com/owncloud/android/db/PreferenceManager.java @@ -25,11 +25,13 @@ import android.content.Context; import android.content.SharedPreferences; import android.os.Environment; +import android.util.Log; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.services.FileUploader; +import com.owncloud.android.ui.activity.BiometricActivity; import com.owncloud.android.utils.FileStorageUtils; import java.io.File; @@ -61,6 +63,21 @@ public abstract class PreferenceManager { public static final String PREF__CAMERA_UPLOADS_DEFAULT_PATH = "/CameraUpload"; + public static final String PREF__LEGACY_FINGERPRINT = "set_fingerprint"; + + public static void migrateFingerprintToBiometricKey(Context context) { + SharedPreferences sharedPref = getDefaultSharedPreferences(context); + + // Check if legacy fingerprint key exists, delete it and migrate its value to the new key + if (sharedPref.contains(PREF__LEGACY_FINGERPRINT)) { + boolean currentFingerprintValue = sharedPref.getBoolean(PREF__LEGACY_FINGERPRINT, false); + SharedPreferences.Editor editor = sharedPref.edit(); + editor.remove(PREF__LEGACY_FINGERPRINT); + editor.putBoolean(BiometricActivity.PREFERENCE_SET_BIOMETRIC, currentFingerprintValue); + editor.apply(); + } + } + public static boolean cameraPictureUploadEnabled(Context context) { return getDefaultSharedPreferences(context).getBoolean(PREF__CAMERA_PICTURE_UPLOADS_ENABLED, false); } @@ -227,7 +244,7 @@ private static void saveIntPreference(String key, int value, Context context) { appPreferences.apply(); } - private static SharedPreferences getDefaultSharedPreferences(Context context) { + public static SharedPreferences getDefaultSharedPreferences(Context context) { return android.preference.PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()); } diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FingerprintActivity.java b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/BiometricActivity.java similarity index 59% rename from owncloudApp/src/main/java/com/owncloud/android/ui/activity/FingerprintActivity.java rename to owncloudApp/src/main/java/com/owncloud/android/ui/activity/BiometricActivity.java index 8c60def5eae..beba399b4c8 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FingerprintActivity.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/BiometricActivity.java @@ -19,16 +19,22 @@ package com.owncloud.android.ui.activity; -import android.hardware.fingerprint.FingerprintManager; import android.os.Build; import android.os.Bundle; +import android.os.Handler; import android.security.keystore.KeyGenParameterSpec; import android.security.keystore.KeyPermanentlyInvalidatedException; import android.security.keystore.KeyProperties; +import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; -import com.owncloud.android.ui.dialog.FingerprintAuthDialogFragment; +import androidx.biometric.BiometricManager; +import androidx.biometric.BiometricPrompt; + +import com.owncloud.android.R; +import com.owncloud.android.authentication.PassCodeManager; +import com.owncloud.android.authentication.PatternManager; import timber.log.Timber; import javax.crypto.Cipher; @@ -44,50 +50,107 @@ import java.security.NoSuchProviderException; import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; +import java.util.concurrent.Executor; -public class FingerprintActivity extends AppCompatActivity { - - private static final String TAG_FINGERPRINT_FRAGMENT = "FINGERPRINT_LOCK"; +public class BiometricActivity extends AppCompatActivity { private static final String ANDROID_KEY_STORE = "AndroidKeyStore"; - public final static String PREFERENCE_SET_FINGERPRINT = "set_fingerprint"; + public final static String PREFERENCE_SET_BIOMETRIC = "set_biometric"; private static final String KEY_NAME = "default_key"; private KeyStore mKeyStore; private KeyGenerator mKeyGenerator; private Cipher mCipher; - private FingerprintManager.CryptoObject mCryptoObject; + private BiometricPrompt.CryptoObject mCryptoObject; + private BiometricActivity mActivity; /** * Initializes the activity. - * + *

* An intent with a valid ACTION is expected; if none is found, an * {@link IllegalArgumentException} will be thrown. * - * @param savedInstanceState Previously saved state - irrelevant in this case + * @param savedInstanceState Previously saved state - irrelevant in this case */ @RequiresApi(api = Build.VERSION_CODES.M) protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + mActivity = this; + generateAndStoreKey(); if (initCipher()) { - mCryptoObject = new FingerprintManager.CryptoObject(mCipher); + mCryptoObject = new BiometricPrompt.CryptoObject(mCipher); } - FingerprintAuthDialogFragment fingerprintAuthDialogFragment = new FingerprintAuthDialogFragment(); + BiometricManager biometricManager = BiometricManager.from(this); + if (biometricManager.canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS) { + showBiometricPrompt(); + } else { + authError(); + } + } - // Attach crypto object used during the fingerprint authentication process - fingerprintAuthDialogFragment.setCryptoObject(mCryptoObject); + private Handler handler = new Handler(); + + private Executor executor = new Executor() { + @Override + public void execute(Runnable command) { + handler.post(command); + } + }; + + private void showBiometricPrompt() { + BiometricPrompt.PromptInfo promptInfo = + new BiometricPrompt.PromptInfo.Builder() + .setTitle(getString(R.string.biometric_prompt_title)) + .setSubtitle(getString(R.string.biometric_prompt_subtitle)) + .setNegativeButtonText(getString(android.R.string.cancel)) + .setConfirmationRequired(true) + .setDeviceCredentialAllowed(false) + .build(); + + BiometricPrompt biometricPrompt = new BiometricPrompt(BiometricActivity.this, + executor, new BiometricPrompt.AuthenticationCallback() { + @Override + public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) { + super.onAuthenticationError(errorCode, errString); + Timber.e("onAuthenticationError (" + errorCode + "): " + errString); + authError(); + } + + @Override + public void onAuthenticationSucceeded(@NonNull BiometricPrompt.AuthenticationResult result) { + super.onAuthenticationSucceeded(result); + mActivity.finish(); + } + + @Override + public void onAuthenticationFailed() { + super.onAuthenticationFailed(); + Timber.e("onAuthenticationFailed"); + } + }); + + // Displays the "log in" prompt. + biometricPrompt.authenticate(promptInfo, mCryptoObject); + } + + private void authError() { + if (PassCodeManager.getPassCodeManager().isPassCodeEnabled()) { + PassCodeManager.getPassCodeManager().onBiometricCancelled(mActivity); + } else if (PatternManager.getPatternManager().isPatternEnabled()) { + PatternManager.getPatternManager().onBiometricCancelled(mActivity); + } - fingerprintAuthDialogFragment.show(getFragmentManager(), TAG_FINGERPRINT_FRAGMENT); + mActivity.finish(); } /** - * Generate encryption key involved in fingerprint authentication process and store it securely on the device using + * Generate encryption key involved in biometric authentication process and store it securely on the device using * the Android Keystore system */ @RequiresApi(api = Build.VERSION_CODES.M) @@ -102,7 +165,7 @@ private void generateAndStoreKey() { } try { - // Access Android KeyGenerator to create the encryption key involved in fingerprint authentication process + // Access Android KeyGenerator to create the encryption key involved in biometric authentication process mKeyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, ANDROID_KEY_STORE); } catch (NoSuchAlgorithmException | NoSuchProviderException e) { @@ -128,8 +191,8 @@ private void generateAndStoreKey() { } /** - * Init mCipher that will be used to create the encrypted FingerprintManager.CryptoObject instance. This - * CryptoObject will be used during the fingerprint authentication process + * Init mCipher that will be used to create the encrypted {@link BiometricPrompt.CryptoObject} instance. This + * CryptoObject will be used during the biometric authentication process * * @return true if mCipher is properly initialized, false otherwise */ diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index 9ea71586173..50b45050a1d 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -56,7 +56,7 @@ import com.google.android.material.snackbar.Snackbar import com.owncloud.android.AppRater import com.owncloud.android.MainApp import com.owncloud.android.R -import com.owncloud.android.authentication.FingerprintManager +import com.owncloud.android.authentication.BiometricManager import com.owncloud.android.authentication.PassCodeManager import com.owncloud.android.authentication.PatternManager import com.owncloud.android.datamodel.FileDataStorageManager @@ -649,7 +649,7 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - FingerprintManager.getFingerprintManager(this).bayPassUnlockOnce() + BiometricManager.getBiometricManager(this).bayPassUnlockOnce() } PassCodeManager.getPassCodeManager().bayPassUnlockOnce() PatternManager.getPatternManager().bayPassUnlockOnce() diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/ManageSpaceActivity.java b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/ManageSpaceActivity.java index ca4f48afa45..b84fe355d28 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/ManageSpaceActivity.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/ManageSpaceActivity.java @@ -99,7 +99,7 @@ protected Boolean doInBackground(Void... params) { boolean passCodeEnable = appPrefs.getBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, false); boolean patternEnabled = appPrefs.getBoolean(PatternLockActivity.PREFERENCE_SET_PATTERN, false); - boolean fingerprintEnabled = appPrefs.getBoolean(FingerprintActivity.PREFERENCE_SET_FINGERPRINT, false); + boolean biometricEnabled = appPrefs.getBoolean(BiometricActivity.PREFERENCE_SET_BIOMETRIC, false); String[] passCodeDigits = new String[4]; if (passCodeEnable) { @@ -135,8 +135,8 @@ protected Boolean doInBackground(Void... params) { appPrefsEditor.putString(PatternLockActivity.KEY_PATTERN, patternValue); } - // Reenable fingerprint - appPrefsEditor.putBoolean(FingerprintActivity.PREFERENCE_SET_FINGERPRINT, fingerprintEnabled); + // Reenable biometric + appPrefsEditor.putBoolean(BiometricActivity.PREFERENCE_SET_BIOMETRIC, biometricEnabled); appPrefsEditor.putBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, passCodeEnable); appPrefsEditor.putBoolean(PatternLockActivity.PREFERENCE_SET_PATTERN, patternEnabled); diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/Preferences.java b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/Preferences.java index f7a2a66a5dc..cab0af223af 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/Preferences.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/Preferences.java @@ -47,7 +47,7 @@ import com.owncloud.android.BuildConfig; import com.owncloud.android.MainApp; import com.owncloud.android.R; -import com.owncloud.android.authentication.FingerprintManager; +import com.owncloud.android.authentication.BiometricManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.db.PreferenceManager.CameraUploadsConfiguration; import com.owncloud.android.files.services.CameraUploadsHandler; @@ -121,8 +121,8 @@ public class Preferences extends PreferenceActivity { private PreferenceCategory mPrefSecurityCategory; private CheckBoxPreference mPasscode; private CheckBoxPreference mPattern; - private CheckBoxPreference mFingerprint; - private FingerprintManager mFingerprintManager; + private CheckBoxPreference mBiometric; + private BiometricManager mBiometricManager; private boolean patternSet; private boolean passcodeSet; private CheckBoxPreference mPrefTouchesWithOtherVisibleWindows; @@ -173,7 +173,7 @@ public void onCreate(Bundle savedInstanceState) { ); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - mFingerprintManager = FingerprintManager.getFingerprintManager(this); + mBiometricManager = BiometricManager.getBiometricManager(this); } /* @@ -279,7 +279,7 @@ public void onCreate(Bundle savedInstanceState) { mPrefSecurityCategory = (PreferenceCategory) findPreference(PREFERENCE_SECURITY_CATEGORY); mPasscode = (CheckBoxPreference) findPreference(PassCodeActivity.PREFERENCE_SET_PASSCODE); mPattern = (CheckBoxPreference) findPreference(PatternLockActivity.PREFERENCE_SET_PATTERN); - mFingerprint = (CheckBoxPreference) findPreference(FingerprintActivity.PREFERENCE_SET_FINGERPRINT); + mBiometric = (CheckBoxPreference) findPreference(BiometricActivity.PREFERENCE_SET_BIOMETRIC); mPrefTouchesWithOtherVisibleWindows = (CheckBoxPreference) findPreference(PREFERENCE_TOUCHES_WITH_OTHER_VISIBLE_WINDOWS); @@ -319,31 +319,31 @@ public void onCreate(Bundle savedInstanceState) { }); } - // Fingerprint lock + // Biometric lock if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - mPrefSecurityCategory.removePreference(mFingerprint); - } else if (mFingerprint != null) { - // Disable Fingerprint lock if Passcode or Pattern locks are disabled + mPrefSecurityCategory.removePreference(mBiometric); + } else if (mBiometric != null) { + // Disable biometric lock if Passcode or Pattern locks are disabled if (mPasscode != null && mPattern != null && !mPasscode.isChecked() && !mPattern.isChecked()) { - mFingerprint.setEnabled(false); - mFingerprint.setSummary(R.string.prefs_fingerprint_summary); + mBiometric.setEnabled(false); + mBiometric.setSummary(R.string.prefs_biometric_summary); } - mFingerprint.setOnPreferenceChangeListener((preference, newValue) -> { + mBiometric.setOnPreferenceChangeListener((preference, newValue) -> { Boolean incoming = (Boolean) newValue; - // Fingerprint not supported - if (incoming && mFingerprintManager != null && !mFingerprintManager.isHardwareDetected()) { + // Biometric not supported + if (incoming && mBiometricManager != null && !mBiometricManager.isHardwareDetected()) { - showSnackMessage(R.string.fingerprint_not_hardware_detected); + showSnackMessage(R.string.biometric_not_hardware_detected); return false; } - // No fingerprints enrolled yet - if (incoming && mFingerprintManager != null && !mFingerprintManager.hasEnrolledFingerprints()) { + // No biometric enrolled yet + if (incoming && mBiometricManager != null && !mBiometricManager.hasEnrolledBiometric()) { - showSnackMessage(R.string.fingerprint_not_enrolled_fingerprints); + showSnackMessage(R.string.biometric_not_enrolled); return false; } @@ -653,14 +653,14 @@ protected void onResume() { mPasscode.setChecked(passCodeState); boolean patternState = mAppPrefs.getBoolean(PatternLockActivity.PREFERENCE_SET_PATTERN, false); mPattern.setChecked(patternState); - boolean fingerprintState = mAppPrefs.getBoolean(FingerprintActivity.PREFERENCE_SET_FINGERPRINT, false); + boolean biometricState = mAppPrefs.getBoolean(BiometricActivity.PREFERENCE_SET_BIOMETRIC, false); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && mFingerprintManager != null && - !mFingerprintManager.hasEnrolledFingerprints()) { - fingerprintState = false; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && mBiometricManager != null && + !mBiometricManager.hasEnrolledBiometric()) { + biometricState = false; } - mFingerprint.setChecked(fingerprintState); + mBiometric.setChecked(biometricState); } @Override @@ -744,8 +744,8 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { showSnackMessage(R.string.pass_code_stored); - // Allow to use Fingerprint lock since Passcode lock has been enabled - enableFingerprint(); + // Allow to use biometric lock since Passcode lock has been enabled + enableBiometric(); } } else if (requestCode == ACTION_CONFIRM_PASSCODE && resultCode == RESULT_OK) { // Disable passcode @@ -754,8 +754,8 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { mAppPrefs.edit().putBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, false).apply(); showSnackMessage(R.string.pass_code_removed); - // Do not allow to use Fingerprint lock since Passcode lock has been disabled - disableFingerprint(getString(R.string.prefs_fingerprint_summary)); + // Do not allow to use biometric lock since Passcode lock has been disabled + disableBiometric(getString(R.string.prefs_biometric_summary)); } } else if (requestCode == ACTION_REQUEST_PATTERN && resultCode == RESULT_OK) { // Enable pattern String patternValue = data.getStringExtra(PatternLockActivity.KEY_PATTERN); @@ -766,16 +766,16 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { editor.apply(); showSnackMessage(R.string.pattern_stored); - // Allow to use Fingerprint lock since Pattern lock has been enabled - enableFingerprint(); + // Allow to use biometric lock since Pattern lock has been enabled + enableBiometric(); } } else if (requestCode == ACTION_CONFIRM_PATTERN && resultCode == RESULT_OK) { // Disable pattern if (data.getBooleanExtra(PatternLockActivity.KEY_CHECK_RESULT, false)) { mAppPrefs.edit().putBoolean(PatternLockActivity.PREFERENCE_SET_PATTERN, false).apply(); showSnackMessage(R.string.pattern_removed); - // Do not allow to use Fingerprint lock since Pattern lock has been disabled - disableFingerprint(getString(R.string.prefs_fingerprint_summary)); + // Do not allow to use biometric lock since Pattern lock has been disabled + disableBiometric(getString(R.string.prefs_biometric_summary)); } } } @@ -931,17 +931,17 @@ private void saveCameraUploadsSourcePathOnPreferences() { mAppPrefs.edit().putString(PREFERENCE_CAMERA_UPLOADS_SOURCE_PATH, mSourcePath).apply(); } - private void enableFingerprint() { - mFingerprint.setEnabled(true); - mFingerprint.setSummary(null); + private void enableBiometric() { + mBiometric.setEnabled(true); + mBiometric.setSummary(null); } - private void disableFingerprint(String summary) { - if (mFingerprint.isChecked()) { - mFingerprint.setChecked(false); + private void disableBiometric(String summary) { + if (mBiometric.isChecked()) { + mBiometric.setChecked(false); } - mFingerprint.setEnabled(false); - mFingerprint.setSummary(summary); + mBiometric.setEnabled(false); + mBiometric.setSummary(summary); } /** diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/dialog/FingerprintAuthDialogFragment.java b/owncloudApp/src/main/java/com/owncloud/android/ui/dialog/FingerprintAuthDialogFragment.java deleted file mode 100644 index 79107306a9f..00000000000 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/dialog/FingerprintAuthDialogFragment.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - * - * Modifications - * - * @author David González Verdugo - * @author Christian Schabesberger - * Copyright (C) 2020 ownCloud GmbH. - */ - -package com.owncloud.android.ui.dialog; - -import android.app.DialogFragment; -import android.content.Context; -import android.content.DialogInterface; -import android.hardware.fingerprint.FingerprintManager; -import android.os.Build; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.RequiresApi; -import com.owncloud.android.R; -import com.owncloud.android.authentication.FingerprintUIHelper; -import com.owncloud.android.authentication.PassCodeManager; -import com.owncloud.android.authentication.PatternManager; -import com.owncloud.android.ui.activity.FingerprintActivity; -import timber.log.Timber; - -/** - * Dialog to authenticate the user using fingerprint APIs, enabling the user to use pass code authentication as well - */ -@RequiresApi(api = Build.VERSION_CODES.M) -public class FingerprintAuthDialogFragment extends DialogFragment implements FingerprintUIHelper.Callback { - - private FingerprintActivity mActivity; - private FingerprintManager.CryptoObject mCryptoObject; - private FingerprintUIHelper mFingerprintUiHelper; - private Button mFingerprintCancelButton; - - /** - * Public factory method to create new FingerprintAuthDialogFragment instances. - * - * @return Dialog ready to show. - */ - public static FingerprintAuthDialogFragment newInstance() { - return new FingerprintAuthDialogFragment(); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setCancelable(false); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - - View v = inflater.inflate(R.layout.fingerprint_dialog, container, false); - - mFingerprintUiHelper = new FingerprintUIHelper( - mActivity.getSystemService(FingerprintManager.class), - (ImageView) v.findViewById(R.id.fingerprintIcon), - (TextView) v.findViewById(R.id.fingerprintStatus), this); - - mFingerprintCancelButton = v.findViewById(R.id.fingerprintCancelButton); - - mFingerprintCancelButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - dismiss(); - - if (PassCodeManager.getPassCodeManager().isPassCodeEnabled()) { - PassCodeManager.getPassCodeManager().onFingerprintCancelled(mActivity); - } else if (PatternManager.getPatternManager().isPatternEnabled()) { - PatternManager.getPatternManager().onFingerprintCancelled(mActivity); - } - mActivity.finish(); - } - }); - - // Avoid pressing back button and skipping fingerprint lock - getDialog().setOnKeyListener(new DialogInterface.OnKeyListener() { - @Override - public boolean onKey(android.content.DialogInterface dialog, int keyCode, android.view.KeyEvent event) { - - return keyCode == android.view.KeyEvent.KEYCODE_BACK; - } - }); - - return v; - } - - @Override - public void onResume() { - super.onResume(); - mFingerprintUiHelper.startListening(mCryptoObject); - } - - @Override - public void onPause() { - super.onPause(); - mFingerprintUiHelper.stopListening(); - } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - mActivity = (FingerprintActivity) getActivity(); - } - - /** - * Sets the crypto object to be passed in when authenticating with fingerprint. - */ - public void setCryptoObject(FingerprintManager.CryptoObject cryptoObject) { - mCryptoObject = cryptoObject; - } - - @Override - public void onAuthenticated() { - dismiss(); - mActivity.finish(); - } - - @Override - public void onError() { - Timber.d("Failed fingerprint authentication"); - } -} diff --git a/owncloudApp/src/main/res/drawable-hdpi/ic_fp_40px.png b/owncloudApp/src/main/res/drawable-hdpi/ic_fp_40px.png deleted file mode 100644 index 48ebd8ad737..00000000000 Binary files a/owncloudApp/src/main/res/drawable-hdpi/ic_fp_40px.png and /dev/null differ diff --git a/owncloudApp/src/main/res/drawable-mdpi/ic_fp_40px.png b/owncloudApp/src/main/res/drawable-mdpi/ic_fp_40px.png deleted file mode 100644 index 122f44257b1..00000000000 Binary files a/owncloudApp/src/main/res/drawable-mdpi/ic_fp_40px.png and /dev/null differ diff --git a/owncloudApp/src/main/res/drawable-xhdpi/ic_fp_40px.png b/owncloudApp/src/main/res/drawable-xhdpi/ic_fp_40px.png deleted file mode 100644 index e1c9590bbfb..00000000000 Binary files a/owncloudApp/src/main/res/drawable-xhdpi/ic_fp_40px.png and /dev/null differ diff --git a/owncloudApp/src/main/res/drawable-xxhdpi/ic_fp_40px.png b/owncloudApp/src/main/res/drawable-xxhdpi/ic_fp_40px.png deleted file mode 100644 index f7e87240e1a..00000000000 Binary files a/owncloudApp/src/main/res/drawable-xxhdpi/ic_fp_40px.png and /dev/null differ diff --git a/owncloudApp/src/main/res/drawable-xxxhdpi/ic_fp_40px.png b/owncloudApp/src/main/res/drawable-xxxhdpi/ic_fp_40px.png deleted file mode 100644 index 0fb8545249a..00000000000 Binary files a/owncloudApp/src/main/res/drawable-xxxhdpi/ic_fp_40px.png and /dev/null differ diff --git a/owncloudApp/src/main/res/layout/fingerprint_dialog.xml b/owncloudApp/src/main/res/layout/fingerprint_dialog.xml deleted file mode 100644 index 4380750802b..00000000000 --- a/owncloudApp/src/main/res/layout/fingerprint_dialog.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/owncloudApp/src/main/res/values-ar/strings.xml b/owncloudApp/src/main/res/values-ar/strings.xml index c56976dbea2..2a7eb9f4cc3 100644 --- a/owncloudApp/src/main/res/values-ar/strings.xml +++ b/owncloudApp/src/main/res/values-ar/strings.xml @@ -37,8 +37,8 @@ الحسابات إدارة الحسابات قفل رمز المرور - قفل بصمة الإصبع - فعِّل رمز المرور أو قفل النمط لتفعيل هذا الخيار + قفل بصمة الإصبع + فعِّل رمز المرور أو قفل النمط لتفعيل هذا الخيار اللمس باستخدام نوافذ أخرى مرئية يتيح اللمس باستخدام نافذة أخرى مرئية عندما تكون نافذة العرض مخفية. فعِّله لاستخدام تطبيقات تصفية الإضاءة. هل أنت متأكد أنك ترغب في تفعيل هذه الميزة؟ @@ -218,13 +218,8 @@ رمز مرور غير صحيح تم حذف رمز المرور تم تخزين رمز المرور - أكد بصمة إصبعك للمتابعة - مستشعر اللمس - لم يتم التعرف على بصمة الإصبع، أعد المحاولة - تم التعرف على بصمة الإصبع - لا يدعم هذا الجهاز المصادقة باستخدام بصمة الإصبع - سجِّل بصمة إصبع واحدة على الأقل لاستخدام هذه الميزة - لم تُمنح إذونات بصمة الإصبع + لا يدعم هذا الجهاز المصادقة باستخدام بصمة الإصبع + سجِّل بصمة إصبع واحدة على الأقل لاستخدام هذه الميزة %1$s مُشغل الموسيقى %1$s (تشغيل) %1$s (تحميل) diff --git a/owncloudApp/src/main/res/values-bg-rBG/strings.xml b/owncloudApp/src/main/res/values-bg-rBG/strings.xml index 4a5f013d221..e812ac0f156 100644 --- a/owncloudApp/src/main/res/values-bg-rBG/strings.xml +++ b/owncloudApp/src/main/res/values-bg-rBG/strings.xml @@ -37,8 +37,6 @@ Профили Управление на профилите Заключваща парола - Заключване с пръстов отпечатък - Активирайте парола или схема за заключване за да активирате тази опция Докосване с други видими прозорци Разрешаване на докосвания, когато изгледът е затъмнен от друг видим прозорец. Разрешете да използва приложения за филтриране на светлината. Сигурни ли сте, че искате да активирате тази функция? @@ -225,13 +223,6 @@ Грешна парола Паролата е премахната Паролата е запаметена - Потвърдете пръстовия си отпечатък, за да продължите - Сензор за докосване - Отпечатъкът не се разпознава, опитайте отново - Отпечатъкът разпознат - Това устройство не поддържа удостоверяване с пръстов отпечатък - Регистрирайте поне един пръстов отпечатък за да използвате тази функция - Не са предоставени разрешения за пръстови отпечатъци %1$s музикален плеър %1$s (изпълнява се) %1$s (се зарежда) diff --git a/owncloudApp/src/main/res/values-ca/strings.xml b/owncloudApp/src/main/res/values-ca/strings.xml index 73fa3df0cb7..4ff987179c0 100644 --- a/owncloudApp/src/main/res/values-ca/strings.xml +++ b/owncloudApp/src/main/res/values-ca/strings.xml @@ -37,8 +37,8 @@ Comptes Gestió de comptes Contrasenya - Bloqueig per petjada dactilar - Activa la contrasenya o el patró de desbloqueig per activar aquesta opció + Bloqueig per petjada dactilar + Activa la contrasenya o el patró de desbloqueig per activar aquesta opció Segur que voleu habilitar aquesta funció? Utilitzeu aquesta característica sota la vostra responsabilitat, aplicacions malicioses podrien executar accions sense que us adonesiu fent servir altres vistes. Imatges pujades @@ -222,13 +222,8 @@ Codi d\'accés incorrecte Codi d\'accés eliminat Codi d\'accés guardat - Confirmar petjada dactilar per continuar - Sensor dactilar - Petjada dactilar no reconeguda, intenta de nou - Petjada dactilar reconeguda - Aquest dispositiu no disposa de lector de petjades dactilars - Guarda com a mínim una petjada dactilar per utilitzar aquesta funció - Autentificació dactilar denegada + Aquest dispositiu no disposa de lector de petjades dactilars + Guarda com a mínim una petjada dactilar per utilitzar aquesta funció reproductor de música %1$s %1$s (sonant) %1$s (carregant) diff --git a/owncloudApp/src/main/res/values-cs-rCZ/strings.xml b/owncloudApp/src/main/res/values-cs-rCZ/strings.xml index fd051993e2f..571e4212054 100644 --- a/owncloudApp/src/main/res/values-cs-rCZ/strings.xml +++ b/owncloudApp/src/main/res/values-cs-rCZ/strings.xml @@ -37,8 +37,8 @@ Účty Spravovat účty Zámek bezpečnostního kódu - Zámek otisku prstů - Nutné povolit bezpečnostní kód nebo gesto k povolení této možnosti + Zámek otisku prstů + Nutné povolit bezpečnostní kód nebo gesto k povolení této možnosti Dotek s jinými viditelnými okny Povolit dotek s aplikacemi, které mohou překrýt toto okno. Nutné pro povolení při použití filtrů světla. Jste si jisti, že chcete povolit tuto funkci? @@ -223,13 +223,8 @@ Nesprávný bezpečnostní kód Bezpečnostní kód odstraněn Bezpečnostní kód uložen - Ověřte otisk prstu a pokračujte - Dotekový senzor - Otisk prstu nerozeznán, zkuste prosím znovu - Otisk prstu rozeznán - Toto zařízení nepodporuje autentizaci pomocí otisku prstů - Chcete-li tuto funkci použít, zaregistrujte si alespoň jeden otisk prstu - Nemáte oprávnění k otistu prstu + Toto zařízení nepodporuje autentizaci pomocí otisku prstů + Chcete-li tuto funkci použít, zaregistrujte si alespoň jeden otisk prstu Hudební přehrávač %1$s %1$s (přehrává) %1$s (načítá) diff --git a/owncloudApp/src/main/res/values-de-rDE/strings.xml b/owncloudApp/src/main/res/values-de-rDE/strings.xml index b8d813ef8f2..fc992635c5a 100644 --- a/owncloudApp/src/main/res/values-de-rDE/strings.xml +++ b/owncloudApp/src/main/res/values-de-rDE/strings.xml @@ -37,8 +37,8 @@ Konten Konten verwalten PIN gesperrt - Fingerabdrucksperre - Passwort oder Wisch-Muster eingeben um diese Option zu aktivieren + Fingerabdrucksperre + Passwort oder Wisch-Muster eingeben um diese Option zu aktivieren Berührungen mit anderen sichtbaren Fenstern Berührungen zulassen, wenn die Ansicht von einem anderen sichtbaren Fenster verdeckt wird. Aktivieren Sie es, um Lichtfilter-Apps zu verwenden. Wollen Sie diese Funktion wirklich einschalten? @@ -225,13 +225,8 @@ PIN nicht korrekt PIN entfernt PIN gespeichert - Bitte Fingerabdruck zum Fortsetzen bestätigen - Bitte Sensor berühren - Fingerabdruck nicht erkannt, bitte erneut versuchen - Fingerabdruck erkannt - Dieses Gerät unterstützt keine Authentifizierung mittels Fingerabdruck - Registrieren Sie mindestens einen Fingerabruck, um dieses Feature zu benutzen - Fingerabdruck nicht erkannt, nochmal versuchen + Dieses Gerät unterstützt keine Authentifizierung mittels Fingerabdruck + Registrieren Sie mindestens einen Fingerabruck, um dieses Feature zu benutzen %1$s Musikplayer %1$s (abspielend) %1$s (lädt) diff --git a/owncloudApp/src/main/res/values-de/strings.xml b/owncloudApp/src/main/res/values-de/strings.xml index 6511e2b1ddf..31782804d35 100644 --- a/owncloudApp/src/main/res/values-de/strings.xml +++ b/owncloudApp/src/main/res/values-de/strings.xml @@ -37,8 +37,8 @@ Konten Konten verwalten PIN gesperrt - Fingerabdrucksperre - Passwort oder Wisch-Muster eingeben um diese Option zu aktivieren + Fingerabdrucksperre + Passwort oder Wisch-Muster eingeben um diese Option zu aktivieren Berührungen mit anderen sichtbaren Fenstern Berührungen zulassen, wenn die Ansicht von einem anderen sichtbaren Fenster verdeckt wird. Aktiviere dies, um Lichtfilter-Apps zu verwenden. Willst Du diese Funktion wirklich einschalten? @@ -225,13 +225,8 @@ PIN nicht korrekt PIN entfernt PIN gespeichert - Bitte Fingerabdruck zum Fortsetzen bestätigen - Bitte Sensor berühren - Fingerabdruck nicht erkannt, bitte erneut versuchen - Fingerabdruck erkannt - Dieses Gerät unterstützt keine Authentifizierung mittels Fingerabdruck - Registriere mindestens einen Fingerabruck, um dieses Feature zu benutzen - Fingerabdruck nicht erkannt, nochmal versuchen + Dieses Gerät unterstützt keine Authentifizierung mittels Fingerabdruck + Registriere mindestens einen Fingerabruck, um dieses Feature zu benutzen %1$s Musik Player %1$s (playing) %1$s (loading) diff --git a/owncloudApp/src/main/res/values-el/strings.xml b/owncloudApp/src/main/res/values-el/strings.xml index d57737e125e..d17dea7e6b9 100644 --- a/owncloudApp/src/main/res/values-el/strings.xml +++ b/owncloudApp/src/main/res/values-el/strings.xml @@ -37,8 +37,8 @@ Λογαριασμοί Διαχείριση λογαριασμών Κλείδωμα με κωδικό - Κλείδωμα με δακτυλικό αποτύπωμα - Ενεργοποιήστε τον κωδικό ή το μοτίβο κλειδώματος για να ενεργοποιήσετε αυτήν την επιλογή + Κλείδωμα με δακτυλικό αποτύπωμα + Ενεργοποιήστε τον κωδικό ή το μοτίβο κλειδώματος για να ενεργοποιήσετε αυτήν την επιλογή Άγγιγμα με άλλα ορατά παράθυρα Επιτρέψτε το άγγιγμα όταν η προβολή καλύπτεται από άλλο ορατό παράθυρο. Ενεργοποιήστε τη χρήση εφαρμογών φιλτραρίσματος φωτός. Είστε βέβαιοι ότι θέλετε να ενεργοποιήσετε αυτήν τη λειτουργία; @@ -220,13 +220,8 @@ Εσφαλμένος κωδικός Ο κωδικός αφαιρέθηκε Ο κωδικός αποθηκεύτηκε - Επιβεβαιώστε το δακτυλικό σας αποτύπωμα για να συνεχίσετε - Αγγίξτε τον αισθητήρα - Δεν αναγνωρίστηκε το δακτυλικό αποτύπωμα, δοκιμάστε ξανά - Αναγνωρίστηκε το δακτυλικό αποτυπώμα - Αυτή η συσκευή δεν υποστηρίζει την πιστοποίηση με δακτυλικό αποτύπωμα - Καταχωρήστε τουλάχιστον ένα δακτυλικό αποτύπωμα για να χρησιμοποιήσετε αυτό το χαρακτηριστικό - Δεν επιτρέπονται τα δικαιώματα δακτυλικών αποτυπωμάτων + Αυτή η συσκευή δεν υποστηρίζει την πιστοποίηση με δακτυλικό αποτύπωμα + Καταχωρήστε τουλάχιστον ένα δακτυλικό αποτύπωμα για να χρησιμοποιήσετε αυτό το χαρακτηριστικό %1$s αναπαραγωγή μουσικής %1$s (αναπαραγωγή) %1$s (φόρτωση) diff --git a/owncloudApp/src/main/res/values-en-rGB/strings.xml b/owncloudApp/src/main/res/values-en-rGB/strings.xml index fceadacf7dd..08f02fe4992 100644 --- a/owncloudApp/src/main/res/values-en-rGB/strings.xml +++ b/owncloudApp/src/main/res/values-en-rGB/strings.xml @@ -37,8 +37,8 @@ Accounts Manage accounts Passcode lock - Fingerprint lock - Enable passcode or pattern lock to enable this option + Biometric lock + Enable passcode or pattern lock to enable this option Touches with other visible windows Allow touches when the view is obscured by another visible window. Enable it to use light filtering apps. Are you sure you want to enable this feature? @@ -224,13 +224,8 @@ Incorrect passcode Passcode removed Passcode stored - Confirm your fingerprint to continue - Touch sensor - Fingerprint not recognised, try again - Fingerprint recognised - This device doesn\'t support fingerprint authentication - Register at least one fingerprint to use this feature - Fingerprint permissions not granted + This device doesn\'t support biometric authentication + Register at least one biometric to use this feature %1$s music player %1$s (playing) %1$s (loading) diff --git a/owncloudApp/src/main/res/values-es-rAR/strings.xml b/owncloudApp/src/main/res/values-es-rAR/strings.xml index cecc2d8632c..176f555d634 100644 --- a/owncloudApp/src/main/res/values-es-rAR/strings.xml +++ b/owncloudApp/src/main/res/values-es-rAR/strings.xml @@ -37,8 +37,8 @@ Cuentas Gestionar cuentas Bloqueo con clave - Bloqueo de huella dactilar - Habilitar la contraseña o patrón de bloqueo para utilizar esta opción + Autenticación biométrica + Habilitar la contraseña o patrón de bloqueo para utilizar esta opción En contacto con otras ventanas visibles Permitir clicks mientras que la vista está oscurecida por otra ventana visible. Habilítalo para utilizar aplicaciones de filtro de luz. ¿Estás seguro que quieres habilitar esta funcionalidad? @@ -222,13 +222,8 @@ Contraseña incorrecta Contraseña eliminada Contraseña almacenada - Confirma tu huella dactilar para continuar - Toca el sensor - Huella dactilar no reconocida, intente nuevamente - Huella dactilar reconocida - El dispositivo no soporta identificación por huella dactilar - Debes registrar al menos una huella dactilar para utilizar esta funcionalidad - Permisos de huella dactilar no otorgados + El dispositivo no soporta identificación biométrica + Debes registrar al menos un método biométrico para utilizar esta funcionalidad Reproductor de música %1$s %1$s (reproduciendo) %1$s (cargando) diff --git a/owncloudApp/src/main/res/values-es-rMX/strings.xml b/owncloudApp/src/main/res/values-es-rMX/strings.xml index 9ef822d7265..6854b55eaae 100644 --- a/owncloudApp/src/main/res/values-es-rMX/strings.xml +++ b/owncloudApp/src/main/res/values-es-rMX/strings.xml @@ -37,8 +37,8 @@ Cuentas Gestionar cuentas Contraseña - Bloqueo de huella digital - Habilitar código de acceso o bloqueo de patrón para habilitar esta opción + Bloqueo de huella digital + Habilitar código de acceso o bloqueo de patrón para habilitar esta opción Cargar imagenes Cargar fotos automáticamente tomadas por la cámara Cargar videos diff --git a/owncloudApp/src/main/res/values-es/strings.xml b/owncloudApp/src/main/res/values-es/strings.xml index bf2bf1ad6ed..40e786e6c0a 100644 --- a/owncloudApp/src/main/res/values-es/strings.xml +++ b/owncloudApp/src/main/res/values-es/strings.xml @@ -37,8 +37,8 @@ Cuentas Gestionar cuentas Código de bloqueo - Bloqueo de huella digital - Habilitar código de acceso o bloqueo de patrón para activar esta opción + Autenticación biométrica + Habilitar código de acceso o bloqueo de patrón para activar esta opción Toques con otras ventanas visibles. Permite los toques cuando la vista está oculta por otra ventana visible. Habilítelo para utilizar aplicaciones de filtrado de luz. ¿Está seguro que desea habilitar esta función? @@ -56,7 +56,7 @@ Sincronice sus contactos, calendarios y tareas Instalar DAVx⁵ Recomendar a un amigo - Mensajes de retroalimentación + Sugerencias Imprimir Recordar ubicación de compartidos Recordar la ubicación de los últimos archivos compartidos subidos @@ -225,13 +225,8 @@ Código de acceso incorrecto Código de acceso borrado Contraseña almacenada - Confirma tu huella para continuar - Toca el sensor - Huella no reconocida, prueba otra vez - Huella reconocida - Este dispositivo no soporta autenticación por huella - Registra al menos una huella para usar este complemento - No se han concedido permisos de acceso a huella + Este dispositivo no soporta autenticación biométrica + Registra al menos un método biométrico para usar este complemento Reproductor de música %1$s %1$s (reproduciendo) %1$s (cargando) @@ -550,4 +545,6 @@ Reproduce tus videos sin descargarlos No hay un navegador instalado, Por favor, instale uno para poder realizar un login seguro no se encontró + Accede usando autenticación biométrica + Acceso biométrico diff --git a/owncloudApp/src/main/res/values-eu/strings.xml b/owncloudApp/src/main/res/values-eu/strings.xml index ad1843a7c9e..23618f1f8ab 100644 --- a/owncloudApp/src/main/res/values-eu/strings.xml +++ b/owncloudApp/src/main/res/values-eu/strings.xml @@ -28,7 +28,7 @@ Kontuak Kontuak kudeatu Pasahitza bidezko blokeoa - Hatz-marka bidezko blokeoa + Hatz-marka bidezko blokeoa Irudien igoerak Automatikoki igo kamarak ateratako argazkiak Bideoen igoerak @@ -190,10 +190,7 @@ Pasahitza ez da zuzena Pasahitza ezabatuta Pasahitza gordeta - Baieztatu zure hatz-marka jarraitzeko - Hatz-marka ezezaguna, saia zaitez berriro - Hartz-marka ezaguna - Gailu honek ez du hatz-marka bidezko autentikazioa onartzen. + Gailu honek ez du hatz-marka bidezko autentikazioa onartzen. %1$s musika erreproduzigailua %1$s (jotzen) %1$s (kargatzen) diff --git a/owncloudApp/src/main/res/values-fa/strings.xml b/owncloudApp/src/main/res/values-fa/strings.xml index c7ec2d5eb32..fb85ee364ac 100644 --- a/owncloudApp/src/main/res/values-fa/strings.xml +++ b/owncloudApp/src/main/res/values-fa/strings.xml @@ -28,7 +28,7 @@ حساب‌ها مدیریت حساب‌ها قفل رمزعبور - قفل اثر انگشت + قفل اثر انگشت فعّال کردن گزارش گیری برای ثبت مشکلات استفاده می‌شود تاریخچهٔ گزارش گیری @@ -180,7 +180,6 @@ رمز نادرست رمز حذف شد رمز ذخیره شد - اثر انگشت شناسایی شد %1$s پخش کننده موسیقی %1$s ( در حال پخش موسیقی ) %1$s (درحال بارگذاری) diff --git a/owncloudApp/src/main/res/values-fi-rFI/strings.xml b/owncloudApp/src/main/res/values-fi-rFI/strings.xml index 9365fa79003..e87aed5803c 100644 --- a/owncloudApp/src/main/res/values-fi-rFI/strings.xml +++ b/owncloudApp/src/main/res/values-fi-rFI/strings.xml @@ -32,8 +32,8 @@ Tilit Tilien hallinta Suojakoodilukitus - Sormenjälkilukitus - Kytke suojakoodilukitus tai kuviolukitus käyttöön jotta voit käyttää tätä vaihtoehtoa + Sormenjälkilukitus + Kytke suojakoodilukitus tai kuviolukitus käyttöön jotta voit käyttää tätä vaihtoehtoa Kuvien lähetys Lähetä automaattisesti kameralla otetut kuvat Videoiden lähetys @@ -191,12 +191,8 @@ Virheellinen suojakoodi Suojakoodi poistettu Suojakoodi tallennettu - Vahvista sormenjälkesi jatkaaksesi - Kosketa sormenjälkilukijaa - Sormenjälkeä ei tunnistettu, yritä uudelleen - Sormenjälki tunnistettiin - Laitteesi ei tue sormenjäljellä tunnistautumista - Rekisteröi vähintään yksi sormenjälki käyttääksesi tätä ominaisuutta + Laitteesi ei tue sormenjäljellä tunnistautumista + Rekisteröi vähintään yksi sormenjälki käyttääksesi tätä ominaisuutta %1$s-musiikkisoitin %1$s (toistetaan) %1$s (ladataan) diff --git a/owncloudApp/src/main/res/values-fr/strings.xml b/owncloudApp/src/main/res/values-fr/strings.xml index 27f33c89906..0caa5109a33 100644 --- a/owncloudApp/src/main/res/values-fr/strings.xml +++ b/owncloudApp/src/main/res/values-fr/strings.xml @@ -37,8 +37,8 @@ Comptes Gérer les comptes Code de sécurité - Verrouillage par empreinte - Activez un code de sécurité ou un motif afin d’activer cette option + Verrouillage par empreinte + Activez un code de sécurité ou un motif afin d’activer cette option Êtes-vous sûr de vouloir activer cette fonctionnalité ? Vous utilisez cette fonctionnalité sous votre propre responsabilité. Une application malveillante pourrait tenter de vous pousser à effectuer des actions en falsifiant l’application. Envoi d\'images @@ -213,12 +213,8 @@ Ci-dessous la liste des fichiers locaux, et les fichiers distants dans %5$s auxq Code de sécurité incorrect Code de sécurité supprimé Code de sécurité enregistré - Confirmez votre empreinte pour continuer - Empreinte non reconnue, essayez à nouveau - Empreinte reconnue - L’appareil ne supporte pas l’authentification par empreinte - Enregistrez au moins une empreinte pour accéder à cette fonctionnalité - L’utilisation d’empreinte n’est pas permise + L’appareil ne supporte pas l’authentification par empreinte + Enregistrez au moins une empreinte pour accéder à cette fonctionnalité %1$s lecteur de musique %1$s (lecture) %1$s (chargement) diff --git a/owncloudApp/src/main/res/values-gl/strings.xml b/owncloudApp/src/main/res/values-gl/strings.xml index 0d4ab6f5862..06709ea5b8c 100644 --- a/owncloudApp/src/main/res/values-gl/strings.xml +++ b/owncloudApp/src/main/res/values-gl/strings.xml @@ -37,8 +37,8 @@ Contas Xestionar as contas Código de bloqueo - Bloqueo por pegada - Activar o código de seguridade ou patrón de bloqueo para activar esta opción + Bloqueo por pegada + Activar o código de seguridade ou patrón de bloqueo para activar esta opción Toques con outras xanelas visíbeis Permitir toques cando a vista estea escurecida por outra xanela visíbel. Activar o emprego de aplis de filtrado de luz. Confirma que quere activar esta característica? @@ -226,13 +226,8 @@ Descárgueo de aquí: %2$s Código de seguridade incorrecto Retirouse o código de seguridade O código de seguridade foi almacenado - Confirme a súa pegada para continuar - Sensor táctil - Non se recoñeceu a pegada, ténteo de novo - A pegada foi recoñecida - O dispositivo non admite a autenticación por pegada - Rexistre polo menos unha pegada para empregar esta cracterística - Non se concederon permisos de pegada + O dispositivo non admite a autenticación por pegada + Rexistre polo menos unha pegada para empregar esta cracterística %1$s reprodutor musical %1$s (reproducindo) %1$s (cargando) diff --git a/owncloudApp/src/main/res/values-he/strings.xml b/owncloudApp/src/main/res/values-he/strings.xml index a4b623c6201..5c4ef64b238 100644 --- a/owncloudApp/src/main/res/values-he/strings.xml +++ b/owncloudApp/src/main/res/values-he/strings.xml @@ -37,8 +37,8 @@ חשבונות ניהול חשבונות נעילת סיסמא - נעילת טביעת אצבע - הפעלת קוד סיסמא או נעילת דפוס במטרה לאפשר אפשרות זו + נעילת טביעת אצבע + הפעלת קוד סיסמא או נעילת דפוס במטרה לאפשר אפשרות זו נוגע בחלונות גלויים אחרים מאפשר מגע כאשר התצוגה מוסתרת על ידי חלון גלוי אחר. יש לאפשר זאת לשימוש ביישומי סינון קלים. האם באמת לאפשר תכונה זו? @@ -225,13 +225,8 @@ קוד שגוי הקוד הוסר הקוד נשמר - יש לאשר את טביעת האצבע להמשך - גלאי מגע - טביעת האצבע לא אומתה, יש לנסות שוב - טביעת האצבע אומתה - התקן זה אינו תומך באימות על בסיס טביעת אצבע - יש לרשום לפחות טביעת אצבע אחת לשימוש בתכונה זו - הרשאות טביעת אצבע לא ניתנו + התקן זה אינו תומך באימות על בסיס טביעת אצבע + יש לרשום לפחות טביעת אצבע אחת לשימוש בתכונה זו נגנן המוזיקה %1$s %1$s (מתנגן) %1$s (בטעינה) diff --git a/owncloudApp/src/main/res/values-hu-rHU/strings.xml b/owncloudApp/src/main/res/values-hu-rHU/strings.xml index 5c211b59bb7..5a6cbaa17d6 100644 --- a/owncloudApp/src/main/res/values-hu-rHU/strings.xml +++ b/owncloudApp/src/main/res/values-hu-rHU/strings.xml @@ -37,8 +37,8 @@ Fiókok Fiókok kezelése Jelszavas zár - Ujjlenyomat zár - Adjon meg zárolási jelszót vagy mintát a beállítás engedélyezéséhez + Ujjlenyomat zár + Adjon meg zárolási jelszót vagy mintát a beállítás engedélyezéséhez Érintkezik más látható ablakkal Engedélyezze az érintéseket, amikor a kép takarásban van egy másik ablak által. Biztos, hogy engedélyezi ezt a funkciót? @@ -221,13 +221,8 @@ Hibás jelszó Jelszó eltávolítva Jelszó eltárolva - Erősítse meg az ujjlenyomatát a folytatáshoz - Érintésérzékelő - Az ujjlenyomat nem felismerhető, próbálja újra - Ujjlenyomat felismerve - Az eszköz nem támogatja az ujjlenyomatos hitelesítést - Regisztráljon legalább egy ujjlenyomatot a funkció használatához - Az ujjlenyomat jogosultság nincs megadva + Az eszköz nem támogatja az ujjlenyomatos hitelesítést + Regisztráljon legalább egy ujjlenyomatot a funkció használatához %1$s zenelejátszó %1$s (lejátszás) %1$s (betöltés) diff --git a/owncloudApp/src/main/res/values-id/strings.xml b/owncloudApp/src/main/res/values-id/strings.xml index 85f49e8dc19..f376b196d5c 100644 --- a/owncloudApp/src/main/res/values-id/strings.xml +++ b/owncloudApp/src/main/res/values-id/strings.xml @@ -37,8 +37,8 @@ Akun Kelola akun Kunci kode sandi - Kunci sidik jari - Aktifkan kode sandi atau kunci pola untuk mengaktifkan opsi ini + Kunci sidik jari + Aktifkan kode sandi atau kunci pola untuk mengaktifkan opsi ini Bersentuhan dengan jendela lainnya Perbolehkan sentuhan ketika penglihatan dikaburkan oleh jendela lain yang terlihat. Aktifkanlah untuk menggunakan aplikasi penyaring cahaya. Anda yakin ingin mengaktifkan fitur ini? @@ -218,13 +218,8 @@ Kode sandi salah Kode sandi dihapus Kode sandi disimpan - Konfirmasikan sidik jari Anda untuk melanjutkan - Sensor sentuh - Sidik jari tidak dikenali, coba lagi - Sidik jari dikenali - Perangkat ini tidak mendukung otentikasi sidik jari - Daftarkan setidaknya satu sidik jari untuk menggunakan fitur ini - Izin sidik jari tidak diberikan + Perangkat ini tidak mendukung otentikasi sidik jari + Daftarkan setidaknya satu sidik jari untuk menggunakan fitur ini Pemutar musik %1$s %1$s (dimainkan) %1$s (sedang dimuat) diff --git a/owncloudApp/src/main/res/values-is/strings.xml b/owncloudApp/src/main/res/values-is/strings.xml index 4f57b9f652b..ccfbd9501ce 100644 --- a/owncloudApp/src/main/res/values-is/strings.xml +++ b/owncloudApp/src/main/res/values-is/strings.xml @@ -36,7 +36,7 @@ Notandaaðgangar Sýsla með notandaaðganga Læsing með lykilkóða - Fingrafaralæsing + Fingrafaralæsing Innsendar myndir Hlaða sjálfvirkt inn myndum teknum á myndavél Innsend myndskeið @@ -202,9 +202,6 @@ Rangur lykilkóði Fjarlægði lykilkóða Geymdi lykilkóða - Snertiskynjari - Fingrafar þekktist ekki, prófaðu aftur - Fingrafar þekktist %1$s tónlistarspilari %1$s (afspilun) %1$s (hleð) diff --git a/owncloudApp/src/main/res/values-it/strings.xml b/owncloudApp/src/main/res/values-it/strings.xml index 3863018a5ef..b60c47816fb 100644 --- a/owncloudApp/src/main/res/values-it/strings.xml +++ b/owncloudApp/src/main/res/values-it/strings.xml @@ -37,8 +37,8 @@ Account Gestisci account Blocco con codice di sicurezza - Blocco con impronta digitale - Abilita il blocco con pasword o la sequenza di blocco per attivare questa opzione. + Blocco con impronta digitale + Abilita il blocco con pasword o la sequenza di blocco per attivare questa opzione. Tocca con altre finestre visibili Consenti tocchi quando la vista è oscurata da un\'altra finestra visibile. Abilitalo per utilizzare app di filtraggio della luce. Sei sicuro di voler abilitare queste funzione? @@ -218,13 +218,8 @@ Codice segreto non corretto Codice segreto rimosso Codice segreto memorizzato - Conferma la tua impronta digitale per continuare - Tocca il sensore - Impronta non riconosciuta, prova di nuovo - Impronta riconosciuta - Questo dispositivo non supporta l\'autenticazione a mezzo impronta digitale - Registra almeno una impronta per usare questa funzionalità - Permesso per impronta digitale non garantito + Questo dispositivo non supporta l\'autenticazione a mezzo impronta digitale + Registra almeno una impronta per usare questa funzionalità Lettore musicale %1$s %1$s (in riproduzione) %1$s (in caricamento) diff --git a/owncloudApp/src/main/res/values-ja-rJP/strings.xml b/owncloudApp/src/main/res/values-ja-rJP/strings.xml index 0f4cd93c00e..060cf545786 100644 --- a/owncloudApp/src/main/res/values-ja-rJP/strings.xml +++ b/owncloudApp/src/main/res/values-ja-rJP/strings.xml @@ -34,8 +34,8 @@ アカウント アカウント管理 パスコードロック - 指紋認証 - パスコードまたはパターンロックを有効にする + 指紋認証 + パスコードまたはパターンロックを有効にする ピクチャーアップロード カメラで撮影した画像を自動アップロード 動画アップロード @@ -197,11 +197,7 @@ パスコードが正しくありません パスコードを削除しました パスコードを保存しました - タッチセンサー - 指紋認証に失敗しました。再度やり直してください。 - 指紋認証に成功しました - このデバイスでは指紋認証はサポートされていません。 - 指紋認証は許可されていません。 + このデバイスでは指紋認証はサポートされていません。 %1$s ミュージックプレーヤー %1$s (プレイ中) %1$s (読込中) diff --git a/owncloudApp/src/main/res/values-ko/strings.xml b/owncloudApp/src/main/res/values-ko/strings.xml index 1b8ab734034..5e988a140d2 100644 --- a/owncloudApp/src/main/res/values-ko/strings.xml +++ b/owncloudApp/src/main/res/values-ko/strings.xml @@ -30,8 +30,8 @@ 계정 계정 관리 암호 잠금 - 지문 잠금 - 이 옵션을 활성화하려면 비밀번호나 패턴 잠금을 활성화하십시오 + 지문 잠금 + 이 옵션을 활성화하려면 비밀번호나 패턴 잠금을 활성화하십시오 사진 업로드 카메라로 찍은 사진 자동으로 업로드 동영상 업로드 @@ -191,11 +191,7 @@ 암호가 잘못됨 암호 삭제됨 암호 저장됨 - 터치센서 - 지문이 인식되지 않았습니다. 다시시도해주세요 - 지문확인됨 - 이 기기는 지문 인식이 지원이 되지 않습니다 - 지문인식 권한이 부여되지 않았습니다 + 이 기기는 지문 인식이 지원이 되지 않습니다 %1$s 음악 재생기 %1$s (재생 중) %1$s (불러오는 중) diff --git a/owncloudApp/src/main/res/values-lt-rLT/strings.xml b/owncloudApp/src/main/res/values-lt-rLT/strings.xml index a93dd314539..8a6d0a242a1 100644 --- a/owncloudApp/src/main/res/values-lt-rLT/strings.xml +++ b/owncloudApp/src/main/res/values-lt-rLT/strings.xml @@ -35,8 +35,8 @@ Paskyros Tvarkyti paskyras Užrakto kodas - Kontrolinis kodas užraktas - Įveskite slaptą frazę ar modelio užrakinimą kad įjungti šią opciją + Kontrolinis kodas užraktas + Įveskite slaptą frazę ar modelio užrakinimą kad įjungti šią opciją Nuotraukų įkėlimai Automatiškai įkelti nuotraukas iš kameros Video įkėlimai @@ -201,13 +201,8 @@ Neteisingas užraktas Užraktas pašalintas Užraktas išsaugotas - Patvirtinkite savo piršto anspaudą - Lietimo sensorius - Piršto anspaudas neatpažintas, bandykite dar kartą - Piršto atspaudas atpažintas - Įrenginys nepalaiko piršto anspaudų - Užregistruokite bent vieną piršto anspaudą šiam funkcionalumui - Piršto anspaudo leidimai nesuteikti + Įrenginys nepalaiko piršto anspaudų + Užregistruokite bent vieną piršto anspaudą šiam funkcionalumui %1$s muzikos grotuvas %1$s (grojama) %1$s (įkeliama) diff --git a/owncloudApp/src/main/res/values-nb-rNO/strings.xml b/owncloudApp/src/main/res/values-nb-rNO/strings.xml index dbe48388e3c..d3a0b16c647 100644 --- a/owncloudApp/src/main/res/values-nb-rNO/strings.xml +++ b/owncloudApp/src/main/res/values-nb-rNO/strings.xml @@ -28,8 +28,8 @@ Kontoer Håndter kontoer Passordlås - Fingeravtrykkslås - Aktiver passord eller mønsterlås for å aktivere dette alternativet + Fingeravtrykkslås + Aktiver passord eller mønsterlås for å aktivere dette alternativet Bilde opplastninger Last opp bilder tatt med kamera automatisk Video opplastninger @@ -191,13 +191,8 @@ Feil passord Passord fjernet Passord lagret - Bekreft ditt fingeravtrykk for å fortsette - Touch sensor - Fingeravtrykk ikke gjenkjent, prøv igjen - Fingeravtrykk gjenkjent - Denne enheten støtter ikke fingeravtrykksautentisering - Registrer minst ett fingeravtrykk for å bruke denne funksjonen - Fingeravtrykkstillatelser ikke gitt + Denne enheten støtter ikke fingeravtrykksautentisering + Registrer minst ett fingeravtrykk for å bruke denne funksjonen %1$s musikkspiller %1$s (spiller) %1$s (laster) diff --git a/owncloudApp/src/main/res/values-nl/strings.xml b/owncloudApp/src/main/res/values-nl/strings.xml index cbca7e7d8e7..d104a8153f5 100644 --- a/owncloudApp/src/main/res/values-nl/strings.xml +++ b/owncloudApp/src/main/res/values-nl/strings.xml @@ -37,8 +37,8 @@ Accounts Accounts beheren Pincode slot - Vingerafdrukvergrendeling - Zet de toegangscode of de patroonvergrendeling aan om deze optie te activeren + Vingerafdrukvergrendeling + Zet de toegangscode of de patroonvergrendeling aan om deze optie te activeren Sta acties toe als het scherm wordt beinvloed door een andere app. Zet dit aan als je licht-filter apps gebruikt. Weet je zeker dat je deze functionaliteit wilt aanzetten? Afbeeldingen uploaden @@ -220,13 +220,8 @@ Hieronder staan de lokale bestanden en de externe bestanden in %5$s waar ze naar Onjuiste pincode Pincode verwijderd Pincode opgeslagen - Bevestig uw vingerafdruk om door te gaan - Touch sensor - Vingerafdruk niet herkend, probeer opnieuw - Vingerafdruk herkend - Dit apparaat ondersteunt geen vingerafdruk-authenticatie - Registreer ten minste één vingerafdruk om deze functie te gebruiken - Vingerafdruk-autorisatie is niet toegestaan + Dit apparaat ondersteunt geen vingerafdruk-authenticatie + Registreer ten minste één vingerafdruk om deze functie te gebruiken %1$s muziekspeler %1$s (speelt) %1$s (laden) diff --git a/owncloudApp/src/main/res/values-pl/strings.xml b/owncloudApp/src/main/res/values-pl/strings.xml index 363b2f20f3f..c1f22f55783 100644 --- a/owncloudApp/src/main/res/values-pl/strings.xml +++ b/owncloudApp/src/main/res/values-pl/strings.xml @@ -37,8 +37,8 @@ Konta Zarządzaj kontami Blokada hasłem - Blokada odciskiem palca - Wprowadź kod PIN lub wzór odblokowania aby odblokować tę opcję + Blokada odciskiem palca + Wprowadź kod PIN lub wzór odblokowania aby odblokować tę opcję Czy jesteś pewny, że chcesz włączyć tą funkcję? Wrzucanie obrazków Automatycznie wrzuć obrazki zrobione przez kamerę @@ -220,13 +220,8 @@ Kod PIN nieprawidłowy Kod PIN został usunięty Kod PIN został zapisany - Potwierdź odciskiem palca aby kontynuować - Czujnik dotykowy - Nierozpoznany odcisk palca, spróbuj jeszcze raz - Odcisk palca rozpoznany - To urządzenie nie obsługuje autoryzacji odciskiem palca - Zarejestruj przynajmniej jeden odcisk palca aby skorzystać z tej funkcji - Nie przydzielono uprawnień dla odcisku palca + To urządzenie nie obsługuje autoryzacji odciskiem palca + Zarejestruj przynajmniej jeden odcisk palca aby skorzystać z tej funkcji %1$s odtwarzacz muzyki %1$s (odtwarzany) %1$s (wczytywany) diff --git a/owncloudApp/src/main/res/values-pt-rBR/strings.xml b/owncloudApp/src/main/res/values-pt-rBR/strings.xml index cc24c1e2e04..02e8513d281 100644 --- a/owncloudApp/src/main/res/values-pt-rBR/strings.xml +++ b/owncloudApp/src/main/res/values-pt-rBR/strings.xml @@ -37,8 +37,8 @@ Contas Gerenciar contas Bloqueio de senha - Bloqueio Impressão Digital - Ativar senha ou bloqueio padrão para habilitar esta opção + Bloqueio Impressão Digital + Ativar senha ou bloqueio padrão para habilitar esta opção Toques com outras janelas visíveis Permitir toques quando a visualização é obscurecida por outra janela visível. Ativá-lo para usar aplicativos de filtragem de luz. Tem certeza de que deseja ativar esse recurso? @@ -225,13 +225,8 @@ Código de acesso incorreto Código de acesso removido Código de acesso armazenado - Confirme sua impressão digital para continuar - Sensor de toque - Impressão digital não reconhecida, tente novamente - Impressão digital reconhecida - Este dispositivo não suporta a autenticação com impressão digital - Registre pelo menos uma impressão digital para usar esse recurso - Permissões de impressão digital não concedidas + Este dispositivo não suporta a autenticação com impressão digital + Registre pelo menos uma impressão digital para usar esse recurso %1$s reprodutor de música %1$s (reproduzindo) %1$s (carregando) diff --git a/owncloudApp/src/main/res/values-pt-rPT/strings.xml b/owncloudApp/src/main/res/values-pt-rPT/strings.xml index 2c23d279f01..8eea19112aa 100644 --- a/owncloudApp/src/main/res/values-pt-rPT/strings.xml +++ b/owncloudApp/src/main/res/values-pt-rPT/strings.xml @@ -178,8 +178,6 @@ Código incorreto Código removido Código guardado - Confirme a sua impressão digital para continuar - Sensor de toque %1$s reprodutor de música %1$s (a reproduzir) %1$s (a carregar) diff --git a/owncloudApp/src/main/res/values-ro/strings.xml b/owncloudApp/src/main/res/values-ro/strings.xml index f3b70c5dd3f..d37f41c720f 100644 --- a/owncloudApp/src/main/res/values-ro/strings.xml +++ b/owncloudApp/src/main/res/values-ro/strings.xml @@ -35,7 +35,7 @@ Conturi Administrare conturi Parolă de blocare - Blocat cu amprentă + Blocat cu amprentă Ești sigur că dorești activarea acestei funcții? Încărcări fotografii Încarcă automat fotografiile create cu camera @@ -193,11 +193,7 @@ Parolă incorectă Parolă ștearsă Parolă stocată - Confirmă amprenta pentru a continua - Senzor tactil - Amprenta nu a fost recunoscută, încearcă din nou - Amprentă recunoscută - Acest dispozitiv nu suportă autentificarea cu amprentă + Acest dispozitiv nu suportă autentificarea cu amprentă %1$s player de muzică %1$s (cântă) %1$s (încarcă) diff --git a/owncloudApp/src/main/res/values-ru/strings.xml b/owncloudApp/src/main/res/values-ru/strings.xml index 4346cf323fb..14f4ce570f4 100644 --- a/owncloudApp/src/main/res/values-ru/strings.xml +++ b/owncloudApp/src/main/res/values-ru/strings.xml @@ -37,8 +37,8 @@ Учётные записи Управление аккаунтами Блокировка кодом - Блокировка по отпечатку пальца - Чтобы использовать эту настройку, включите блокировку по коду или графическому ключу + Блокировка по отпечатку пальца + Чтобы использовать эту настройку, включите блокировку по коду или графическому ключу Разрешить соприкосновения с другими видимыми окнами Разрешить соприкосновения, когда просмотр перекрывается другим видимым окном. Разрешите, чтобы использовать лёгкие фильтрующие приложения. Вы уверены, что хотите включить эту функцию? @@ -226,13 +226,8 @@ Некоррентный код Код удален Код сохранен - Для продолжения подтвердите свой отпечаток пальца - Датчик прикосновения - Отпечаток пальца не распознан, попробуйте ещё раз - Отпечаток пальца распознан - Это устройство не поддерживает аутентификацию по отпечатку пальца - Чтобы использовать эту возможность, зарегистрируйте хотя-бы один отпечаток пальца - Разрешения по отпечатку пальца не предоставлены + Это устройство не поддерживает аутентификацию по отпечатку пальца + Чтобы использовать эту возможность, зарегистрируйте хотя-бы один отпечаток пальца %1$s аудиоплеер %1$s (проигрывается) %1$s (загружается) diff --git a/owncloudApp/src/main/res/values-sl/strings.xml b/owncloudApp/src/main/res/values-sl/strings.xml index 74373baee0d..92871a0a44e 100644 --- a/owncloudApp/src/main/res/values-sl/strings.xml +++ b/owncloudApp/src/main/res/values-sl/strings.xml @@ -36,7 +36,7 @@ Računi Upravljanje z računi Zakleni dostop s kodo PIN - Zaklepanje z prstnim odtisom + Zaklepanje z prstnim odtisom Hipno pošiljanje slik Hipno pošiljanje slik, zajetih s kamero, na strežnik Hipno pošiljanje posnetkov diff --git a/owncloudApp/src/main/res/values-sq/strings.xml b/owncloudApp/src/main/res/values-sq/strings.xml index 9b524e78ad9..5f773eae112 100644 --- a/owncloudApp/src/main/res/values-sq/strings.xml +++ b/owncloudApp/src/main/res/values-sq/strings.xml @@ -37,8 +37,8 @@ Llogari Administroni llogari Kyçje me kodkalim - Kyçje me shenja gishtash - Që të aktivizohet kjo mundësi, aktivizoni kyçje përmes kodkalimesh ose përmes rregullsish + Kyçje me shenja gishtash + Që të aktivizohet kjo mundësi, aktivizoni kyçje përmes kodkalimesh ose përmes rregullsish Prekje me dritare të tjera të dukshme Lejo prekje kur pamja është zënë nga një tjetër dritare e dukshme. Aktivizojeni që të përdorni aplikacione filtrimi drite. Jeni i sigurt se doni të aktivizohet kjo veçori? @@ -225,13 +225,8 @@ Kodkalim i pasaktë Kodkalimi u hoq Kodkalimi u depozitua - Që të vazhdohet, ripohoni shenjat tuaja të gishtave - Ndijues prekjesh - Shenja gishtash jo të pranuara, riprovoni - Shenjat e gishtave u njohën - Kjo pajisje nuk mbulon mirëfilltësim përmes shenja gishtash - Që të përdorni këtë veçori, regjistroni të paktën një palë shenja gishtash - S\’janë akorduar leje shenjash gishtash + Kjo pajisje nuk mbulon mirëfilltësim përmes shenja gishtash + Që të përdorni këtë veçori, regjistroni të paktën një palë shenja gishtash Lojtësi %1$s i muzikës %1$s (po luhet) %1$s (po ngarkohet) diff --git a/owncloudApp/src/main/res/values-th-rTH/strings.xml b/owncloudApp/src/main/res/values-th-rTH/strings.xml index de187dcb657..de55cc9a7b7 100644 --- a/owncloudApp/src/main/res/values-th-rTH/strings.xml +++ b/owncloudApp/src/main/res/values-th-rTH/strings.xml @@ -37,8 +37,8 @@ บัญชี บริหารจัดการบัญชี ล็อครหัสยืนยัน - ล็อคด้วยลายนิ้วมือ - เปิดใช้งานรหัสผ่านหรือรูปแบบล็อคเพื่อเปิดใช้งานตัวเลือกนี้ + ล็อคด้วยลายนิ้วมือ + เปิดใช้งานรหัสผ่านหรือรูปแบบล็อคเพื่อเปิดใช้งานตัวเลือกนี้ แตะกับหน้าต่างอื่นที่มองเห็น อนุญาตให้แตะเมื่อมุมมองถูกบดบังโดยหน้าต่างอื่นที่มองเห็นได้ เปิดใช้งานเพื่อใช้แอปกรองแสง คุณแน่ใจหรือว่าต้องการเปิดใช้งานคุณลักษณะนี้? @@ -225,13 +225,8 @@ รหัสยืนยันไม่ถูกต้อง ลบรหัสยืนยัน รหัสยืนยันที่เก็บไว้ - ยืนยันลายนิ้วมือของคุณเพื่อดำเนินการต่อ - เซ็นเซอร์ระบบสัมผัส - ไม่รู้จักลายนิ้วมือนี้ โปรดลองอีกครั้ง - ตรวจสอบลายนิ้วมือแล้ว - อุปกรณ์นี้ไม่สนับสนุนการตรวจสอบด้วยลายนิ้วมือ - เปิดใช้งานอย่างน้อยหนึ่งลายนิ้วมือเพื่อใช้คุณลักษณะนี้ - ลายนิ้วมือนี้ยังไม่ได้รับอนุญาต + อุปกรณ์นี้ไม่สนับสนุนการตรวจสอบด้วยลายนิ้วมือ + เปิดใช้งานอย่างน้อยหนึ่งลายนิ้วมือเพื่อใช้คุณลักษณะนี้ เล่นเพลง %1$s %1$s (กำลังเล่น) %1$s (กำลังโหลด) diff --git a/owncloudApp/src/main/res/values-tr/strings.xml b/owncloudApp/src/main/res/values-tr/strings.xml index ebf441fe394..995518ad38f 100644 --- a/owncloudApp/src/main/res/values-tr/strings.xml +++ b/owncloudApp/src/main/res/values-tr/strings.xml @@ -37,8 +37,8 @@ Hesaplar Hesapları yönet Parola kod kilidi - Parmak izi kilidi - Bu özelliği etkinleştirmek için parola veya desen ile kilitlemeyi etkinleşir + Parmak izi kilidi + Bu özelliği etkinleştirmek için parola veya desen ile kilitlemeyi etkinleşir Diğer görünür pencerelerle birlikte dokunma Başka bir görünür pencere tarafından gizlendiğinde dokunmalara izin ver. Uygulamaları hafif filtrelemek için etkinleştir. Bu özelliği etkinleştirmek istediğinizden emin misiniz? @@ -225,13 +225,8 @@ Hatalı parola kodu Parola kodu kaldırıldı Parola kodu depolandı - Devam etmek için parmak izinizi onaylayın - Dokunma sensörü - Parmak izi tanınmadı, yeniden deneyin - Parmak izi tanındı - Bu cihaz parmak izi kimlik doğrulamasını desteklemiyor - Bu özelliği kullanmak için en azından bir parmak izi kaydedin - Parmak izi izinleri verilmemiş + Bu cihaz parmak izi kimlik doğrulamasını desteklemiyor + Bu özelliği kullanmak için en azından bir parmak izi kaydedin %1$s müzik çalar %1$s (oynatılıyor) %1$s (yükleniyor) diff --git a/owncloudApp/src/main/res/values-uk/strings.xml b/owncloudApp/src/main/res/values-uk/strings.xml index 56c73b907fa..1241f492f14 100644 --- a/owncloudApp/src/main/res/values-uk/strings.xml +++ b/owncloudApp/src/main/res/values-uk/strings.xml @@ -35,7 +35,7 @@ Облікові записи Управління обліковими записами Захистити паролем - Увімкніть блокування паролем або графічним ключем щоб увімкнути це налаштування + Увімкніть блокування паролем або графічним ключем щоб увімкнути це налаштування Завантаження зображень Автоматично завантажувати зображення з камери Завантаження відео diff --git a/owncloudApp/src/main/res/values-zh-rCN/strings.xml b/owncloudApp/src/main/res/values-zh-rCN/strings.xml index 60a7d6512c7..cb84690ca4b 100644 --- a/owncloudApp/src/main/res/values-zh-rCN/strings.xml +++ b/owncloudApp/src/main/res/values-zh-rCN/strings.xml @@ -37,8 +37,8 @@ 账号 管理账号 密码锁 - 指纹锁 - 使用密码或图案锁定以启用此选项 + 指纹锁 + 使用密码或图案锁定以启用此选项 你确定要启用此功能吗? 图片上传 自动上传相机拍摄的图片 @@ -215,13 +215,8 @@ 错误的密码 移除的密码 存储的密码 - 确认您的指纹以继续下一步 - 触摸传感器 - 指纹无法识别,请重试 - 指纹已识别 - 此设备不支持指纹验证 - 请至少录入一个指纹以使用此功能 - 指纹权限未授权 + 此设备不支持指纹验证 + 请至少录入一个指纹以使用此功能 %1$s 音乐播放器 %1$s (播放中) %1$s (载入中) diff --git a/owncloudApp/src/main/res/values/strings.xml b/owncloudApp/src/main/res/values/strings.xml index f8dc3d50863..906e3eae8af 100644 --- a/owncloudApp/src/main/res/values/strings.xml +++ b/owncloudApp/src/main/res/values/strings.xml @@ -37,8 +37,8 @@ Accounts Manage accounts Passcode lock - Fingerprint lock - Enable passcode or pattern lock to enable this option + Biometric lock + Enable passcode or pattern lock to enable this option Touches with other visible windows Allow touches when the view is obscured by another visible window. Enable it to use light filtering apps. Are you sure you want to enable this feature? @@ -229,13 +229,10 @@ Passcode removed Passcode stored - Confirm your fingerprint to continue - Touch sensor - Fingerprint not recognized, try again - Fingerprint recognized - This device doesn\'t support fingerprint authentication - Register at least one fingerprint to use this feature - Fingerprint permissions not granted + This device doesn\'t support biometric authentication + Register at least one biometric to use this feature + Biometric log in + Log in using your biometric credential %1$s music player %1$s (playing) diff --git a/owncloudApp/src/main/res/xml/preferences.xml b/owncloudApp/src/main/res/xml/preferences.xml index d76dd46f885..c87969afe20 100644 --- a/owncloudApp/src/main/res/xml/preferences.xml +++ b/owncloudApp/src/main/res/xml/preferences.xml @@ -64,8 +64,8 @@ android:key="set_pattern" android:title="@string/prefs_pattern" /> + android:key="set_biometric" + android:title="@string/prefs_biometric" />