Merge pull request #1657 from rhari991/device-credentials-unlock

Add support for device credentials
This commit is contained in:
Andy Scherzinger 2018-06-10 22:14:33 +02:00 committed by GitHub
commit b5bc9b6578
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
69 changed files with 546 additions and 844 deletions

View file

@ -0,0 +1,97 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="858.763" height="429.86121"
viewBox="0 0 858.763 429.86121" version="1.1" id="svg4" sodipodi:docname="whats_new_device_credentials.svg"
inkscape:version="0.92.2 2405546, 2018-03-11" inkscape:export-filename="/tmp/device_credentials.png"
inkscape:export-xdpi="96" inkscape:export-ydpi="96">
<metadata id="metadata10">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs id="defs8" />
<sodipodi:namedview pagecolor="#000000" bordercolor="#666666" borderopacity="1" objecttolerance="10"
gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2"
inkscape:window-width="1600" inkscape:window-height="835" id="namedview6" showgrid="false"
inkscape:zoom="0.43457604" inkscape:cx="55.463573" inkscape:cy="381.67998" inkscape:window-x="0"
inkscape:window-y="0" inkscape:window-maximized="1" inkscape:current-layer="svg4" fit-margin-top="10"
fit-margin-left="10" fit-margin-right="10" fit-margin-bottom="10" />
<g id="g841" transform="translate(92.156453)">
<path style="fill:#ffffff;stroke-width:16.58121872" inkscape:connector-curvature="0" id="path2"
d="m 255.62025,115.19225 c -1.32645,0 -2.65299,-0.3322 -3.81368,-0.99448 C 219.97063,97.78252 192.44582,90.8183 159.44919,90.8183 c -32.83082,0 -64.003538,7.79322 -92.357423,23.37947 -3.979493,2.15565 -8.953847,0.66228 -11.275209,-3.31623 -2.155574,-3.97935 -0.663327,-9.11967 3.316223,-11.27512 30.841074,-16.747017 64.666769,-25.369249 100.316409,-25.369249 35.31798,0 66.15905,7.793013 99.98474,25.203359 4.14532,2.15566 5.63763,7.1299 3.48206,11.10944 -1.49232,2.98468 -4.31111,4.64268 -7.29574,4.64268 z M 18.342997,202.24374 c -1.658007,0 -3.316245,-0.49828 -4.808557,-1.49276 -3.8136906,-2.65288 -4.6427369,-7.79321 -1.989777,-11.60688 16.415411,-23.21359 37.307759,-41.45293 62.179581,-54.2206 52.065026,-26.86157 118.721556,-27.02725 170.952386,-0.16609 24.87182,12.76766 45.76417,30.84113 62.17959,53.88904 2.65297,3.64777 1.82388,8.95378 -1.98979,11.60689 -3.81366,2.65289 -8.95385,1.82493 -11.60685,-1.98895 -14.92308,-20.89224 -33.82566,-37.30769 -56.21032,-48.7487 -47.58809,-24.37457 -108.44118,-24.37457 -155.863457,0.16609 -22.550465,11.60668 -41.453054,28.18803 -56.376153,49.08026 -1.326449,2.32155 -3.813692,3.48211 -6.466673,3.48211 z M 121.97561,402.3791 c -2.15557,0 -4.31113,-0.82837 -5.80344,-2.48722 C 101.74651,385.46621 93.953364,376.18065 82.843935,356.1174 71.402907,335.72262 65.433651,310.85081 65.433651,284.15491 c 0,-49.24615 42.116299,-89.37263 93.849719,-89.37263 51.73342,0 93.84972,40.12648 93.84972,89.37263 0,4.64288 -3.64787,8.29068 -8.29063,8.29068 -4.64274,0 -8.29061,-3.6478 -8.29061,-8.29068 0,-40.12647 -34.65474,-72.79149 -77.26848,-72.79149 -42.61375,0 -77.268501,32.66502 -77.268501,72.79149 0,23.87691 5.306001,45.93013 15.420537,63.83772 10.611974,19.06834 17.907714,27.19313 30.675254,40.12669 3.15044,3.31621 3.15044,8.45635 0,11.77256 -1.82389,1.65885 -3.97949,2.48722 -6.13505,2.48722 z m 118.88735,-30.67524 c -19.73164,0 -37.14191,-4.97445 -51.40177,-14.75725 -24.70601,-16.74721 -39.46332,-43.94034 -39.46332,-72.7917 0,-4.64267 3.64787,-8.29047 8.29063,-8.29047 4.64274,0 8.29061,3.6478 8.29061,8.29047 0,23.37968 11.93847,45.43269 32.16755,59.02916 11.77268,7.95911 25.53508,11.77277 42.1163,11.77277 3.9795,0 10.61199,-0.49826 17.24447,-1.65884 4.47694,-0.82837 8.78806,2.15545 9.61711,6.79814 0.829,4.477 -2.15557,8.7881 -6.7983,9.61711 -9.45129,1.82492 -17.74191,1.98895 -20.06328,1.98895 z m -33.32824,34.15735 c -0.66332,0 -1.49233,-0.16609 -2.15555,-0.33218 -26.36415,-7.29577 -43.60862,-17.07878 -61.68215,-34.82068 -23.21374,-23.04791 -35.98126,-53.72315 -35.98126,-86.55385 0,-26.86158 22.8821,-48.74891 51.07015,-48.74891 28.18809,0 51.07017,21.88733 51.07017,48.74891 0,17.7419 15.42054,32.16757 34.48896,32.16757 19.06839,0 34.48893,-14.42567 34.48893,-32.16757 0,-62.51127 -53.88897,-113.24975 -120.21385,-113.24975 -47.09068,0 -90.201837,26.19826 -109.601876,66.82218 -6.466673,13.43078 -9.782918,29.1831 -9.782918,46.42757 0,12.93334 1.160772,33.32815 11.109429,59.85815 1.658009,4.31113 -0.497444,9.11968 -4.808558,10.612 -4.311116,1.65886 -9.119673,-0.66436 -10.611987,-4.80855 -8.124804,-21.72144 -12.104296,-43.27703 -12.104296,-65.6616 0,-19.89757 3.81369,-37.97103 11.27523,-53.72315 22.053037,-46.26169 70.967626,-76.27361 124.524976,-76.27361 75.44455,0 136.79505,58.19993 136.79505,129.83088 0,26.86157 -22.88208,48.7487 -51.07013,48.7487 -28.18809,0 -51.07017,-21.88713 -51.07017,-48.7487 0,-17.74191 -15.42053,-32.16758 -34.48896,-32.16758 -19.06839,0 -34.48893,14.42567 -34.48893,32.16758 0,28.3539 10.94361,54.8837 31.00689,74.78127 15.75217,15.58646 30.84107,24.20868 54.22059,30.67524 4.47693,1.16058 6.96413,5.80345 5.80344,10.11456 -0.829,3.81368 -4.31111,6.3009 -7.79318,6.3009 z" />
<g transform="matrix(0.73707241,0,0,0.73707241,10.310182,16.19179)" id="g848">
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#fffcfc;stroke-width:9.63877487;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path823-2" sodipodi:type="arc" sodipodi:cx="565.53778" sodipodi:cy="149.75388"
sodipodi:rx="9.2415485" sodipodi:ry="9.2415485" sodipodi:start="3.9460498" sodipodi:end="3.9452295"
sodipodi:open="true"
d="m 559.12874,143.09576 a 9.2415485,9.2415485 0 0 1 13.06584,0.24771 9.2415485,9.2415485 0 0 1 -0.24503,13.06589 9.2415485,9.2415485 0 0 1 -13.06594,-0.24235 9.2415485,9.2415485 0 0 1 0.23967,-13.06599" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#fffcfc;stroke-width:9.63877487;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path823-2-9" sodipodi:type="arc" sodipodi:cx="719.49548" sodipodi:cy="149.75388"
sodipodi:rx="9.2415485" sodipodi:ry="9.2415485" sodipodi:start="3.9460498" sodipodi:end="3.9452295"
sodipodi:open="true"
d="m 713.08645,143.09576 a 9.2415485,9.2415485 0 0 1 13.06583,0.24771 9.2415485,9.2415485 0 0 1 -0.24503,13.06589 9.2415485,9.2415485 0 0 1 -13.06594,-0.24235 9.2415485,9.2415485 0 0 1 0.23968,-13.06599" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#fffcfc;stroke-width:9.63877487;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path823-2-9-7" sodipodi:type="arc" sodipodi:cx="873.45319" sodipodi:cy="149.75388"
sodipodi:rx="9.2415485" sodipodi:ry="9.2415485" sodipodi:start="3.9460498" sodipodi:end="3.9452295"
sodipodi:open="true"
d="m 867.04415,143.09576 a 9.2415485,9.2415485 0 0 1 13.06583,0.24771 9.2415485,9.2415485 0 0 1 -0.24503,13.06589 9.2415485,9.2415485 0 0 1 -13.06593,-0.24235 9.2415485,9.2415485 0 0 1 0.23967,-13.06599" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#fff6f6;fill-opacity:1;stroke:#fffcfc;stroke-width:9.63877487;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path823-2-4" sodipodi:type="arc" sodipodi:cx="565.53778" sodipodi:cy="303.71155"
sodipodi:rx="9.2415485" sodipodi:ry="9.2415485" sodipodi:start="3.9460498" sodipodi:end="3.9452295"
sodipodi:open="true"
d="m 559.12874,297.05343 a 9.2415485,9.2415485 0 0 1 13.06584,0.24772 9.2415485,9.2415485 0 0 1 -0.24503,13.06588 9.2415485,9.2415485 0 0 1 -13.06594,-0.24235 9.2415485,9.2415485 0 0 1 0.23967,-13.06599" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffe7e7;fill-opacity:1;stroke:#fffcfc;stroke-width:9.63877487;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path823-2-9-3" sodipodi:type="arc" sodipodi:cx="719.49548" sodipodi:cy="303.71155"
sodipodi:rx="9.2415485" sodipodi:ry="9.2415485" sodipodi:start="3.9460498" sodipodi:end="3.9452295"
sodipodi:open="true"
d="m 713.08645,297.05343 a 9.2415485,9.2415485 0 0 1 13.06583,0.24772 9.2415485,9.2415485 0 0 1 -0.24503,13.06588 9.2415485,9.2415485 0 0 1 -13.06594,-0.24235 9.2415485,9.2415485 0 0 1 0.23968,-13.06599" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffe7e7;fill-opacity:1;stroke:#fffcfc;stroke-width:9.63877487;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path823-2-9-7-5" sodipodi:type="arc" sodipodi:cx="873.45319" sodipodi:cy="303.71155"
sodipodi:rx="9.2415485" sodipodi:ry="9.2415485" sodipodi:start="3.9460498" sodipodi:end="3.9452295"
sodipodi:open="true"
d="m 867.04415,297.05343 a 9.2415485,9.2415485 0 0 1 13.06583,0.24772 9.2415485,9.2415485 0 0 1 -0.24503,13.06588 9.2415485,9.2415485 0 0 1 -13.06593,-0.24235 9.2415485,9.2415485 0 0 1 0.23967,-13.06599" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#fff6f6;fill-opacity:1;stroke:#fffcfc;stroke-width:9.63877487;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path823-2-4-6" sodipodi:type="arc" sodipodi:cx="565.53778" sodipodi:cy="457.66922"
sodipodi:rx="9.2415485" sodipodi:ry="9.2415485" sodipodi:start="3.9460498" sodipodi:end="3.9452295"
sodipodi:open="true"
d="m 559.12874,451.01111 a 9.2415485,9.2415485 0 0 1 13.06584,0.24771 9.2415485,9.2415485 0 0 1 -0.24503,13.06588 9.2415485,9.2415485 0 0 1 -13.06594,-0.24235 9.2415485,9.2415485 0 0 1 0.23967,-13.06598" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#fff6f6;fill-opacity:1;stroke:#fffcfc;stroke-width:9.63877487;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path823-2-9-3-1" sodipodi:type="arc" sodipodi:cx="719.49548" sodipodi:cy="457.66922"
sodipodi:rx="9.2415485" sodipodi:ry="9.2415485" sodipodi:start="3.9460498" sodipodi:end="3.9452295"
sodipodi:open="true"
d="m 713.08645,451.01111 a 9.2415485,9.2415485 0 0 1 13.06583,0.24771 9.2415485,9.2415485 0 0 1 -0.24503,13.06588 9.2415485,9.2415485 0 0 1 -13.06594,-0.24235 9.2415485,9.2415485 0 0 1 0.23968,-13.06598" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffe7e7;fill-opacity:1;stroke:#fffcfc;stroke-width:9.63877487;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path823-2-9-7-5-4" sodipodi:type="arc" sodipodi:cx="873.45319" sodipodi:cy="457.66922"
sodipodi:rx="9.2415485" sodipodi:ry="9.2415485" sodipodi:start="3.9460498" sodipodi:end="3.9452295"
sodipodi:open="true"
d="m 867.04415,451.01111 a 9.2415485,9.2415485 0 0 1 13.06583,0.24771 9.2415485,9.2415485 0 0 1 -0.24503,13.06588 9.2415485,9.2415485 0 0 1 -13.06593,-0.24235 9.2415485,9.2415485 0 0 1 0.23967,-13.06598" />
<path
style="fill:none;fill-rule:evenodd;stroke:#fffcfc;stroke-width:5.77341413;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 565.3017,149.30908 H 719.60332" id="path1066" inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#fffcfc;stroke-width:5.77341413;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 720.54662,304.23964 H 874.84825" id="path1066-0" inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#fffcfc;stroke-width:5.77341413;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 719.60332,303.61067 V 149.30908" id="path1066-3" inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#fffcfc;stroke-width:5.77341413;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 873.60332,457.56838 V 303.26658" id="path1066-3-1" inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -29,6 +29,7 @@
<issue id="UnusedResources">
<ignore path="**/values-b+en+001/strings.xml"/>
<ignore path="**/values-b+es+419/strings.xml" />
<ignore path="**/values-pt-rPT/strings.xml"/>
<ignore path="**/values-ro/strings.xml"/>
<ignore path="**/values-zh-rCN/strings.xml"/>

View file

@ -241,7 +241,7 @@
<service android:name=".media.MediaService" />
<activity android:name=".ui.activity.PassCodeActivity" />
<activity android:name=".ui.activity.FingerprintActivity"/>
<activity android:name=".ui.activity.RequestCredentialsActivity" />
<activity android:name=".ui.activity.ConflictsResolveActivity"/>
<activity android:name=".ui.activity.GenericExplanationActivity"/>
<activity android:name=".ui.activity.ErrorsWhileCopyingHandlerActivity"/>

View file

@ -1,4 +1,4 @@
/**
/*
* ownCloud Android client application
*
* @author David A. Velasco
@ -22,16 +22,16 @@ 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 android.view.WindowManager;
import com.owncloud.android.MainApp;
import com.owncloud.android.ui.activity.FingerprintActivity;
import com.owncloud.android.db.PreferenceManager;
import com.owncloud.android.ui.activity.PassCodeActivity;
import com.owncloud.android.ui.activity.Preferences;
import com.owncloud.android.ui.activity.RequestCredentialsActivity;
import com.owncloud.android.utils.DeviceCredentialUtils;
import java.util.HashSet;
import java.util.Set;
@ -40,10 +40,12 @@ public class PassCodeManager {
private static final Set<Class> exemptOfPasscodeActivities;
public static final int PASSCODE_ACTIVITY = 9999;
static {
exemptOfPasscodeActivities = new HashSet<>();
exemptOfPasscodeActivities.add(PassCodeActivity.class);
exemptOfPasscodeActivities.add(FingerprintActivity.class);
exemptOfPasscodeActivities.add(RequestCredentialsActivity.class);
// other activities may be exempted, if needed
}
@ -62,10 +64,10 @@ public class PassCodeManager {
return passCodeManagerInstance;
}
protected PassCodeManager() {}
private PassCodeManager() {}
public void onActivityCreated(Activity activity) {
if (passCodeIsEnabled() || fingerprintIsEnabled()) {
if (passCodeIsEnabled() || deviceCredentialsAreEnabled(activity)) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
} else {
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
@ -78,17 +80,15 @@ public class PassCodeManager {
Intent i = new Intent(MainApp.getAppContext(), PassCodeActivity.class);
i.setAction(PassCodeActivity.ACTION_CHECK);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
activity.startActivity(i);
activity.startActivityForResult(i, PASSCODE_ACTIVITY);
}
if (!exemptOfPasscodeActivities.contains(activity.getClass()) &&
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
fingerprintShouldBeRequested() && FingerprintActivity.isFingerprintReady(MainApp.getAppContext())) {
Intent i = new Intent(MainApp.getAppContext(), FingerprintActivity.class);
i.setAction(PassCodeActivity.ACTION_CHECK);
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && deviceCredentialsShouldBeRequested(activity) &&
!DeviceCredentialUtils.tryEncrypt(activity)) {
Intent i = new Intent(MainApp.getAppContext(), RequestCredentialsActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
activity.startActivity(i);
activity.startActivityForResult(i, PASSCODE_ACTIVITY);
}
visibleActivitiesCounter++; // keep it AFTER passCodeShouldBeRequested was checked
@ -100,7 +100,8 @@ public class PassCodeManager {
}
setUnlockTimestamp();
PowerManager powerMgr = (PowerManager) activity.getSystemService(Context.POWER_SERVICE);
if ((passCodeIsEnabled() || fingerprintIsEnabled())&& powerMgr != null && !powerMgr.isScreenOn()) {
if ((passCodeIsEnabled() || deviceCredentialsAreEnabled(activity)) && powerMgr != null
&& !powerMgr.isScreenOn()) {
activity.moveTaskToBack(true);
}
}
@ -110,25 +111,23 @@ public class PassCodeManager {
}
private boolean passCodeShouldBeRequested() {
return (passCodeIsEnabled() && hasAuthenticationTimeoutExpired());
return (System.currentTimeMillis() - timestamp) > PASS_CODE_TIMEOUT &&
visibleActivitiesCounter <= 0 && passCodeIsEnabled();
}
private boolean passCodeIsEnabled() {
SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(MainApp.getAppContext());
return (appPrefs.getBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, false));
return PreferenceManager.getLockPreference(MainApp.getAppContext()).equals(Preferences.LOCK_PASSCODE);
}
private boolean fingerprintShouldBeRequested() {
return (fingerprintIsEnabled() && hasAuthenticationTimeoutExpired());
private boolean deviceCredentialsShouldBeRequested(Activity activity) {
return (System.currentTimeMillis() - timestamp) > PASS_CODE_TIMEOUT && visibleActivitiesCounter <= 0 &&
deviceCredentialsAreEnabled(activity);
}
private boolean hasAuthenticationTimeoutExpired() {
return (System.currentTimeMillis() - timestamp) > PASS_CODE_TIMEOUT && visibleActivitiesCounter <= 0;
}
private boolean fingerprintIsEnabled() {
SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(MainApp.getAppContext());
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
appPrefs.getBoolean(Preferences.PREFERENCE_USE_FINGERPRINT, false);
private boolean deviceCredentialsAreEnabled(Activity activity) {
return PreferenceManager.getLockPreference(MainApp.getAppContext()).equals(Preferences.LOCK_DEVICE_CREDENTIALS)
|| Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
(PreferenceManager.isUseFingerprint(MainApp.getAppContext())
&& DeviceCredentialUtils.areCredentialsAvailable(activity));
}
}

View file

@ -28,6 +28,7 @@ import com.owncloud.android.datamodel.ArbitraryDataProvider;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.ui.activity.ComponentsGetter;
import com.owncloud.android.ui.activity.Preferences;
import com.owncloud.android.utils.FileSortOrder;
import static com.owncloud.android.ui.fragment.OCFileListFragment.FOLDER_LAYOUT_LIST;
@ -181,6 +182,26 @@ public abstract class PreferenceManager {
saveStringPreference(context, AUTO_PREF__LAST_UPLOAD_PATH, path);
}
/**
* Gets the lock preference configured by the user.
*
* @param context Caller {@link Context}, used to access to shared preferences manager.
* @return lock lock preference value.
*/
public static String getLockPreference(Context context) {
return getDefaultSharedPreferences(context).getString(Preferences.PREFERENCE_LOCK, "");
}
/**
* Gets the lock via fingerprint preference configured by the user.
*
* @param context Caller {@link Context}, used to access to shared preferences manager.
* @return useFingerprint is lock via fingerprint preference.
*/
public static boolean isUseFingerprint(Context context) {
return getDefaultSharedPreferences(context).getBoolean(Preferences.PREFERENCE_USE_FINGERPRINT, false);
}
/**
* Get preferred folder display type.
*

View file

@ -41,6 +41,7 @@ public class FeatureList {
private static final int VERSION_1_0_0 = 10000099;
private static final int VERSION_3_0_0 = 30000099;
private static final int VERSION_3_3_0 = 30030099;
private static final int BETA_VERSION_0 = 0;
static public ArrayList<FeatureItem> get(boolean isMultiAccount) {
@ -69,6 +70,11 @@ public class FeatureList {
R.string.whats_new_ipv6_content, VERSION_3_0_0,
BETA_VERSION_0, SHOW_ON_UPGRADE, false, false));
// 3.3.0
featuresList.add(new FeatureItem(R.drawable.whats_new_device_credentials,
R.string.whats_new_device_credentials_title, R.string.whats_new_device_credentials_content,
VERSION_3_3_0, BETA_VERSION_0, SHOW_ON_UPGRADE, false, false));
return featuresList;
}

View file

@ -26,6 +26,7 @@ import android.annotation.TargetApi;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.AssetFileDescriptor;
import android.database.Cursor;
import android.graphics.Point;
@ -34,6 +35,7 @@ import android.os.CancellationSignal;
import android.os.Handler;
import android.os.Looper;
import android.os.ParcelFileDescriptor;
import android.preference.PreferenceManager;
import android.provider.DocumentsProvider;
import android.util.Log;
import android.widget.Toast;
@ -47,6 +49,7 @@ import com.owncloud.android.files.services.FileDownloader;
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.operations.SynchronizeFileOperation;
import com.owncloud.android.ui.activity.ConflictsResolveActivity;
import com.owncloud.android.ui.activity.Preferences;
import com.owncloud.android.utils.FileStorageUtils;
import org.nextcloud.providers.cursors.FileCursor;
@ -68,6 +71,13 @@ public class DocumentsStorageProvider extends DocumentsProvider {
@Override
public Cursor queryRoots(String[] projection) throws FileNotFoundException {
SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(MainApp.getAppContext());
if (appPrefs.getString(Preferences.PREFERENCE_LOCK, "").equals(Preferences.LOCK_PASSCODE) ||
appPrefs.getString(Preferences.PREFERENCE_LOCK, "").equals(Preferences.LOCK_DEVICE_CREDENTIALS)) {
return new FileCursor(new String[]{});
}
initiateStorageMap();
final RootCursor result = new RootCursor(projection);

View file

@ -34,6 +34,7 @@ import android.graphics.PorterDuff;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.NavigationView;
@ -59,6 +60,7 @@ import com.bumptech.glide.request.target.SimpleTarget;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.authentication.AccountUtils;
import com.owncloud.android.authentication.PassCodeManager;
import com.owncloud.android.datamodel.ArbitraryDataProvider;
import com.owncloud.android.datamodel.ExternalLinksProvider;
import com.owncloud.android.datamodel.OCFile;
@ -1228,6 +1230,15 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU
} else {
updateAccountList();
}
} else if (requestCode == PassCodeManager.PASSCODE_ACTIVITY &&
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && data != null) {
int result = data.getIntExtra(RequestCredentialsActivity.KEY_CHECK_RESULT,
RequestCredentialsActivity.KEY_CHECK_RESULT_FALSE);
if (result == RequestCredentialsActivity.KEY_CHECK_RESULT_CANCEL) {
Log_OC.d(TAG, "PassCodeManager cancelled");
super.onBackPressed();
}
}
}

View file

@ -1,341 +0,0 @@
/*
* Nextcloud Android client application
*
* @author Florian Lentz
* Copyright (C) 2017 Florian Lentz
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.owncloud.android.ui.activity;
import android.Manifest;
import android.app.KeyguardManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.hardware.fingerprint.FingerprintManager;
import android.os.Build;
import android.os.Bundle;
import android.os.CancellationSignal;
import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.KeyPermanentlyInvalidatedException;
import android.security.keystore.KeyProperties;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.KeyEvent;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.utils.ThemeUtils;
import java.io.IOException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
/**
* Activity to handle access to the app based on the fingerprint.
*/
@RequiresApi(Build.VERSION_CODES.M)
public class FingerprintActivity extends AppCompatActivity {
private static final String TAG = FingerprintActivity.class.getSimpleName();
public final static String KEY_CHECK_RESULT = "KEY_CHECK_RESULT";
public static final String ANDROID_KEY_STORE = "AndroidKeyStore";
private KeyStore keyStore;
// Variable used for storing the key in the Android Keystore container
private static final String KEY_NAME = "Nextcloud";
private Cipher cipher;
private CancellationSignal cancellationSignal;
/**
* Initializes the activity.
*
* @param savedInstanceState Previously saved state - irrelevant in this case
*/
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fingerprintlock);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().setStatusBarColor(ThemeUtils.primaryDarkColor(this));
}
Toolbar toolbar = findViewById(R.id.toolbar);
toolbar.setTitleTextColor(ThemeUtils.fontColor(this));
toolbar.setBackground(new ColorDrawable(ThemeUtils.primaryColor(this, false)));
}
private void startFingerprint() {
TextView fingerprintTextView = findViewById(R.id.scanfingerprinttext);
FingerprintManager fingerprintManager =
(FingerprintManager) MainApp.getAppContext().getSystemService(Context.FINGERPRINT_SERVICE);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.USE_FINGERPRINT)
!= PackageManager.PERMISSION_GRANTED) {
return;
}
KeyguardManager keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
if (keyguardManager.isKeyguardSecure()) {
generateKey();
if (cipherInit()) {
FingerprintManager.CryptoObject cryptoObject = new FingerprintManager.CryptoObject(cipher);
FingerprintHandler.Callback callback = new FingerprintHandler.Callback() {
@Override
public void onAuthenticated() {
fingerprintResult(true);
}
@Override
public void onFailed(String error) {
Toast.makeText(MainApp.getAppContext(), error, Toast.LENGTH_LONG).show();
ImageView imageView = findViewById(R.id.fingerprinticon);
int[][] states = new int[][]{
new int[]{android.R.attr.state_activated},
new int[]{-android.R.attr.state_activated}
};
int[] colors = new int[]{Color.parseColor("#FF0000"), Color.RED};
ColorStateList csl = new ColorStateList(states, colors);
Drawable drawable = DrawableCompat.wrap(imageView.getDrawable());
DrawableCompat.setTintList(drawable, csl);
imageView.setImageDrawable(drawable);
}
};
FingerprintHandler helper = new FingerprintHandler(fingerprintTextView, callback);
cancellationSignal = new CancellationSignal();
if (ActivityCompat.checkSelfPermission(MainApp.getAppContext(), Manifest.permission.USE_FINGERPRINT)
!= PackageManager.PERMISSION_GRANTED) {
return;
}
fingerprintManager.authenticate(cryptoObject, cancellationSignal, 0, helper, null);
}
}
}
@Override
public void onResume(){
super.onResume();
startFingerprint();
ImageView imageView = findViewById(R.id.fingerprinticon);
imageView.setImageDrawable(ThemeUtils.tintDrawable(R.drawable.ic_fingerprint, ThemeUtils.primaryColor(this)));
}
@Override
public void onStop(){
super.onStop();
if(cancellationSignal != null) {
cancellationSignal.cancel();
}
}
/**
* Overrides click on the BACK arrow to prevent fingerprint from being worked around.
*
* @param keyCode Key code of the key that triggered the down event.
* @param event Event triggered.
* @return 'True' when the key event was processed by this method.
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0 || super.onKeyDown(keyCode, event);
}
protected void generateKey() {
try {
keyStore = KeyStore.getInstance(ANDROID_KEY_STORE);
} catch (Exception e) {
Log_OC.e(TAG, "Error getting KeyStore", e);
}
KeyGenerator keyGenerator;
try {
keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, ANDROID_KEY_STORE);
keyStore.load(null);
keyGenerator.init(
new KeyGenParameterSpec.Builder(
KEY_NAME, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT
)
.setBlockModes(KeyProperties.BLOCK_MODE_CBC)
.setUserAuthenticationRequired(true)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
.build());
keyGenerator.generateKey();
} catch (NoSuchAlgorithmException | InvalidAlgorithmParameterException | CertificateException | IOException |
NoSuchProviderException e) {
Log_OC.e(TAG, "Exception: " + e.getMessage());
}
}
public boolean cipherInit() {
try {
cipher = Cipher.getInstance(
KeyProperties.KEY_ALGORITHM_AES + "/"
+ KeyProperties.BLOCK_MODE_CBC + "/"
+ KeyProperties.ENCRYPTION_PADDING_PKCS7);
} catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
return false;
}
try {
keyStore.load(null);
SecretKey key = (SecretKey) keyStore.getKey(KEY_NAME, null);
cipher.init(Cipher.ENCRYPT_MODE, key);
return true;
} catch (KeyPermanentlyInvalidatedException e) {
return false;
} catch (KeyStoreException
| CertificateException
| UnrecoverableKeyException
| IOException
| NoSuchAlgorithmException
| InvalidKeyException e) {
return false;
}
}
private void fingerprintResult(boolean fingerOk) {
if (fingerOk) {
Intent resultIntent = new Intent();
resultIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
resultIntent.putExtra(KEY_CHECK_RESULT, true);
setResult(RESULT_OK, resultIntent);
finish();
} else {
showErrorAndRestart(R.string.fingerprint_unknown);
}
}
private void showErrorAndRestart(int errorMessage) {
CharSequence errorSeq = getString(errorMessage);
Toast.makeText(this, errorSeq, Toast.LENGTH_LONG).show();
}
@RequiresApi(api = Build.VERSION_CODES.M)
static public boolean isFingerprintCapable(Context context) {
try {
FingerprintManager fingerprintManager =
(FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.USE_FINGERPRINT)
!= PackageManager.PERMISSION_GRANTED) {
return false;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return fingerprintManager.isHardwareDetected();
}
} catch (Exception e) {
return false;
}
return false;
}
static public boolean isFingerprintReady(Context context) {
try {
FingerprintManager fingerprintManager =
(FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
return ActivityCompat.checkSelfPermission(context, Manifest.permission.USE_FINGERPRINT) ==
PackageManager.PERMISSION_GRANTED && fingerprintManager.isHardwareDetected() &&
fingerprintManager.hasEnrolledFingerprints();
} catch (Exception e) {
return false;
}
}
}
@RequiresApi(api = Build.VERSION_CODES.M)
class FingerprintHandler extends FingerprintManager.AuthenticationCallback {
private TextView text;
private Callback callback;
// Constructor
FingerprintHandler(TextView mText, Callback mCallback) {
text = mText;
callback = mCallback;
}
@Override
public void onAuthenticationError(int errMsgId, CharSequence errString) {
// this.update(String.valueOf(errString), false);
}
@Override
public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
this.update(String.valueOf(helpString), false);
}
@Override
public void onAuthenticationFailed() {
this.update(MainApp.getAppContext().getString(R.string.fingerprint_unknown), false);
}
@Override
public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
this.update("Fingerprint Authentication succeeded.", true);
}
public void update(final String e, Boolean success) {
if(success) {
text.postDelayed(new Runnable() {
@Override
public void run() {
callback.onAuthenticated();
}
}, 0);
} else {
text.postDelayed(new Runnable() {
@Override
public void run() {
callback.onFailed(e);
}
}, 0);
}
}
interface Callback {
void onAuthenticated();
void onFailed(String error);
}
}

View file

@ -52,10 +52,10 @@ public class ManageSpaceActivity extends AppCompatActivity {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setTitle(R.string.manage_space_title);
TextView descriptionTextView = (TextView) findViewById(R.id.general_description);
TextView descriptionTextView = findViewById(R.id.general_description);
descriptionTextView.setText(getString(R.string.manage_space_description, getString(R.string.app_name)));
Button clearDataButton = (Button) findViewById(R.id.clearDataButton);
Button clearDataButton = findViewById(R.id.clearDataButton);
clearDataButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@ -94,7 +94,9 @@ public class ManageSpaceActivity extends AppCompatActivity {
SharedPreferences appPrefs = PreferenceManager
.getDefaultSharedPreferences(getApplicationContext());
boolean passCodeEnable = appPrefs.getBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, false);
String lockPref = appPrefs.getString(Preferences.PREFERENCE_LOCK, Preferences.LOCK_NONE);
boolean passCodeEnable = appPrefs.getString(Preferences.PREFERENCE_LOCK, "")
.equals(Preferences.LOCK_PASSCODE);
String passCodeDigits[] = new String[4];
if (passCodeEnable) {
@ -122,7 +124,7 @@ public class ManageSpaceActivity extends AppCompatActivity {
appPrefsEditor.putString(PassCodeActivity.PREFERENCE_PASSCODE_D4, passCodeDigits[3]);
}
appPrefsEditor.putBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, passCodeEnable);
appPrefsEditor.putString(Preferences.PREFERENCE_LOCK, lockPref);
result = result && appPrefsEditor.commit();
return result;

View file

@ -56,9 +56,6 @@ public class PassCodeActivity extends AppCompatActivity {
public final static String KEY_PASSCODE = "KEY_PASSCODE";
public final static String KEY_CHECK_RESULT = "KEY_CHECK_RESULT";
// NOTE: PREFERENCE_SET_PASSCODE must have the same value as preferences.xml-->android:key for passcode preference
public final static String PREFERENCE_SET_PASSCODE = "set_pincode";
public final static String PREFERENCE_PASSCODE_D = "PrefPinCode";
public final static String PREFERENCE_PASSCODE_D1 = "PrefPinCode1";
public final static String PREFERENCE_PASSCODE_D2 = "PrefPinCode2";

View file

@ -70,11 +70,13 @@ import com.owncloud.android.lib.common.ExternalLinkType;
import com.owncloud.android.lib.common.OwnCloudAccount;
import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.utils.DeviceCredentialUtils;
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.MimeTypeUtil;
import com.owncloud.android.utils.ThemeUtils;
import java.io.IOException;
import java.util.ArrayList;
/**
* An Activity that allows the user to change the application's settings.
@ -86,11 +88,18 @@ public class Preferences extends PreferenceActivity
private static final String TAG = Preferences.class.getSimpleName();
public static final String PREFERENCE_LOCK= "lock";
public static final String LOCK_NONE = "none";
public static final String LOCK_PASSCODE = "passcode";
public static final String LOCK_DEVICE_CREDENTIALS = "device_credentials";
public final static String PREFERENCE_USE_FINGERPRINT = "use_fingerprint";
public static final String PREFERENCE_EXPERT_MODE = "expert_mode";
private static final int ACTION_REQUEST_PASSCODE = 5;
private static final int ACTION_CONFIRM_PASSCODE = 6;
private static final int ACTION_CONFIRM_DEVICE_CREDENTIALS = 7;
private static final int ACTION_REQUEST_CODE_DAVDROID_SETUP = 10;
@ -103,14 +112,14 @@ public class Preferences extends PreferenceActivity
*/
private Uri mUri;
private SwitchPreference pCode;
private SwitchPreference fPrint;
private ListPreference mLock;
private SwitchPreference mShowHiddenFiles;
private SwitchPreference mExpertMode;
private AppCompatDelegate mDelegate;
private ListPreference mPrefStoragePath;
private String mStoragePath;
private String pendingLock;
public static class PreferenceKeys {
public static final String STORAGE_PATH = "storage_path";
@ -502,26 +511,26 @@ public class Preferences extends PreferenceActivity
accentColor));
boolean fPassCodeEnabled = getResources().getBoolean(R.bool.passcode_enabled);
boolean fPrintEnabled = getResources().getBoolean(R.bool.fingerprint_enabled);
boolean fDeviceCredentialsEnabled = getResources().getBoolean(R.bool.device_credentials_enabled);
boolean fShowHiddenFilesEnabled = getResources().getBoolean(R.bool.show_hidden_files_enabled);
boolean fSyncedFolderLightEnabled = getResources().getBoolean(R.bool.syncedFolder_light);
setupPasscodePreference(preferenceCategoryDetails, fPassCodeEnabled);
setupFingerprintPreference(preferenceCategoryDetails, fPrintEnabled);
setupLockPreference(preferenceCategoryDetails, fPassCodeEnabled, fDeviceCredentialsEnabled);
setupHiddenFilesPreference(preferenceCategoryDetails, fShowHiddenFilesEnabled);
setupExpertModePreference(preferenceCategoryDetails);
setupExpertModePreference(preferenceCategoryDetails, fSyncedFolderLightEnabled);
if (!fShowHiddenFilesEnabled && !fPrintEnabled && !fPassCodeEnabled) {
if (!fPassCodeEnabled && !fDeviceCredentialsEnabled && !fShowHiddenFilesEnabled && fSyncedFolderLightEnabled) {
preferenceScreen.removePreference(preferenceCategoryDetails);
}
}
private void setupExpertModePreference(PreferenceCategory preferenceCategoryDetails) {
private void setupExpertModePreference(PreferenceCategory preferenceCategoryDetails,
boolean fSyncedFolderLightEnabled) {
mExpertMode = (SwitchPreference) findPreference(PREFERENCE_EXPERT_MODE);
if (getResources().getBoolean(R.bool.syncedFolder_light)) {
if (fSyncedFolderLightEnabled) {
preferenceCategoryDetails.removePreference(mExpertMode);
} else {
mExpertMode = (SwitchPreference) findPreference(PREFERENCE_EXPERT_MODE);
@ -569,78 +578,56 @@ public class Preferences extends PreferenceActivity
}
}
private void setupFingerprintPreference(PreferenceCategory preferenceCategoryDetails, boolean fPrintEnabled) {
fPrint = (SwitchPreference) findPreference(PREFERENCE_USE_FINGERPRINT);
if (fPrint != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (FingerprintActivity.isFingerprintCapable(MainApp.getAppContext()) && fPrintEnabled) {
final Activity activity = this;
fPrint.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
Boolean incoming = (Boolean) newValue;
private void setupLockPreference(PreferenceCategory preferenceCategoryDetails,
boolean passCodeEnabled,
boolean deviceCredentialsEnabled) {
mLock = (ListPreference) findPreference(PREFERENCE_LOCK);
if (mLock != null && (passCodeEnabled || deviceCredentialsEnabled)) {
ArrayList<String> lockEntries = new ArrayList<>(3);
lockEntries.add(getString(R.string.prefs_lock_none));
lockEntries.add(getString(R.string.prefs_lock_using_passcode));
lockEntries.add(getString(R.string.prefs_lock_using_device_credentials));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (FingerprintActivity.isFingerprintReady(MainApp.getAppContext())) {
SharedPreferences appPrefs =
PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = appPrefs.edit();
editor.putBoolean(PREFERENCE_USE_FINGERPRINT, incoming);
editor.apply();
return true;
} else {
if (incoming) {
DisplayUtils.showSnackMessage(activity, R.string.prefs_fingerprint_notsetup);
fPrint.setChecked(false);
}
SharedPreferences appPrefs =
PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = appPrefs.edit();
editor.putBoolean(PREFERENCE_USE_FINGERPRINT, false);
editor.apply();
return false;
}
} else {
return false;
}
}
});
if (!FingerprintActivity.isFingerprintReady(MainApp.getAppContext())) {
fPrint.setChecked(false);
}
ArrayList<String> lockValues = new ArrayList<>(3);
lockValues.add(LOCK_NONE);
lockValues.add(LOCK_PASSCODE);
lockValues.add(LOCK_DEVICE_CREDENTIALS);
} else {
preferenceCategoryDetails.removePreference(fPrint);
}
} else {
preferenceCategoryDetails.removePreference(fPrint);
if (!passCodeEnabled) {
lockEntries.remove(1);
lockValues.remove(1);
} else if (!deviceCredentialsEnabled || Build.VERSION.SDK_INT < Build.VERSION_CODES.M ||
!DeviceCredentialUtils.areCredentialsAvailable(getApplicationContext())) {
lockEntries.remove(2);
lockValues.remove(2);
}
}
}
String[] lockEntriesArr = new String[lockEntries.size()];
lockEntriesArr = lockEntries.toArray(lockEntriesArr);
String[] lockValuesArr = new String[lockValues.size()];
lockValuesArr = lockValues.toArray(lockValuesArr);
private void setupPasscodePreference(PreferenceCategory preferenceCategoryDetails, boolean fPassCodeEnabled) {
pCode = (SwitchPreference) findPreference(PassCodeActivity.PREFERENCE_SET_PASSCODE);
if (pCode != null && fPassCodeEnabled) {
pCode.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
mLock.setEntries(lockEntriesArr);
mLock.setEntryValues(lockValuesArr);
mLock.setSummary(mLock.getEntry());
mLock.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
Intent i = new Intent(getApplicationContext(), PassCodeActivity.class);
Boolean incoming = (Boolean) newValue;
i.setAction(
incoming ? PassCodeActivity.ACTION_REQUEST_WITH_RESULT :
PassCodeActivity.ACTION_CHECK_WITH_RESULT
);
startActivityForResult(i, incoming ? ACTION_REQUEST_PASSCODE :
ACTION_CONFIRM_PASSCODE);
// Don't update just yet, we will decide on it in onActivityResult
public boolean onPreferenceChange(Preference preference, Object o) {
pendingLock = LOCK_NONE;
String oldValue = ((ListPreference) preference).getValue();
String newValue = (String) o;
if (!oldValue.equals(newValue)) {
if (oldValue.equals(LOCK_NONE)) {
enableLock(newValue);
} else {
pendingLock = newValue;
disableLock(oldValue);
}
}
return false;
}
});
} else {
preferenceCategoryDetails.removePreference(pCode);
preferenceCategoryDetails.removePreference(mLock);
}
}
@ -692,6 +679,35 @@ public class Preferences extends PreferenceActivity
}
}
private void enableLock(String lock) {
pendingLock = LOCK_NONE;
if (lock.equals(LOCK_PASSCODE)) {
Intent i = new Intent(getApplicationContext(), PassCodeActivity.class);
i.setAction(PassCodeActivity.ACTION_REQUEST_WITH_RESULT);
startActivityForResult(i, ACTION_REQUEST_PASSCODE);
} else if (lock.equals(LOCK_DEVICE_CREDENTIALS)){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
!DeviceCredentialUtils.areCredentialsAvailable(getApplicationContext())) {
DisplayUtils.showSnackMessage(this, R.string.prefs_lock_device_credentials_not_setup);
} else {
DisplayUtils.showSnackMessage(this, R.string.prefs_lock_device_credentials_enabled);
mLock.setValue(LOCK_DEVICE_CREDENTIALS);
mLock.setSummary(mLock.getEntry());
}
}
}
private void disableLock(String lock) {
if (lock.equals(LOCK_PASSCODE)) {
Intent i = new Intent(getApplicationContext(), PassCodeActivity.class);
i.setAction(PassCodeActivity.ACTION_CHECK_WITH_RESULT);
startActivityForResult(i, ACTION_CONFIRM_PASSCODE);
} else if (lock.equals(LOCK_DEVICE_CREDENTIALS)) {
Intent i = new Intent(getApplicationContext(), RequestCredentialsActivity.class);
startActivityForResult(i, ACTION_CONFIRM_DEVICE_CREDENTIALS);
}
}
private void setupGeneralCategory(int accentColor) {
PreferenceCategory preferenceCategoryGeneral = (PreferenceCategory) findPreference("general");
preferenceCategoryGeneral.setTitle(ThemeUtils.getColoredTitle(getString(R.string.prefs_category_general),
@ -825,14 +841,7 @@ public class Preferences extends PreferenceActivity
t.start();
}
@Override
protected void onResume() {
super.onResume();
SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
boolean state = appPrefs.getBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, false);
pCode.setChecked(state);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
@ -853,27 +862,39 @@ public class Preferences extends PreferenceActivity
for (int i = 1; i <= 4; ++i) {
appPrefs.putString(PassCodeActivity.PREFERENCE_PASSCODE_D + i, passcode.substring(i - 1, i));
}
appPrefs.putBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, true);
appPrefs.apply();
mLock.setValue(LOCK_PASSCODE);
mLock.setSummary(mLock.getEntry());
DisplayUtils.showSnackMessage(this, R.string.pass_code_stored);
}
} else if (requestCode == ACTION_CONFIRM_PASSCODE && resultCode == RESULT_OK) {
if (data.getBooleanExtra(PassCodeActivity.KEY_CHECK_RESULT, false)) {
SharedPreferences.Editor appPrefs = PreferenceManager
.getDefaultSharedPreferences(getApplicationContext()).edit();
appPrefs.putBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, false);
appPrefs.apply();
mLock.setValue(LOCK_NONE);
mLock.setSummary(mLock.getEntry());
DisplayUtils.showSnackMessage(this, R.string.pass_code_removed);
if (!pendingLock.equals(LOCK_NONE)) {
enableLock(pendingLock);
}
}
} else if (requestCode == ACTION_REQUEST_CODE_DAVDROID_SETUP && resultCode == RESULT_OK) {
DisplayUtils.showSnackMessage(this, R.string.prefs_calendar_contacts_sync_setup_successful);
} else if (requestCode == ACTION_CONFIRM_DEVICE_CREDENTIALS && resultCode == RESULT_OK &&
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
data.getIntExtra(RequestCredentialsActivity.KEY_CHECK_RESULT,
RequestCredentialsActivity.KEY_CHECK_RESULT_FALSE) ==
RequestCredentialsActivity.KEY_CHECK_RESULT_TRUE) {
mLock.setValue(LOCK_NONE);
mLock.setSummary(mLock.getEntry());
DisplayUtils.showSnackMessage(this, R.string.credentials_disabled);
if (!pendingLock.equals(LOCK_NONE)) {
enableLock(pendingLock);
}
}
}
@NonNull
@Override
@NonNull
public MenuInflater getMenuInflater() {
return getDelegate().getMenuInflater();
}

View file

@ -0,0 +1,95 @@
/*
* Nextcloud Android client application
*
* @author Harikrishnan Rajan
* Copyright (C) 2017
* Copyright (C) 2017 Nextcloud GmbH.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License version 3,
* 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*
*/
package com.owncloud.android.ui.activity;
import android.app.Activity;
import android.app.KeyguardManager;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.widget.Toast;
import com.owncloud.android.R;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.utils.DeviceCredentialUtils;
import com.owncloud.android.utils.DisplayUtils;
/**
* Dummy activity that is used to handle the device's default authentication workflow.
*/
@RequiresApi(Build.VERSION_CODES.M)
public class RequestCredentialsActivity extends Activity {
private static final String TAG = RequestCredentialsActivity.class.getSimpleName();
public final static String KEY_CHECK_RESULT = "KEY_CHECK_RESULT";
public final static int KEY_CHECK_RESULT_TRUE = 1;
public final static int KEY_CHECK_RESULT_FALSE = 0;
public final static int KEY_CHECK_RESULT_CANCEL = -1;
private static final int REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS = 1;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS) {
if (resultCode == Activity.RESULT_OK && DeviceCredentialUtils.tryEncrypt(getApplicationContext())) {
finishWithResult(KEY_CHECK_RESULT_TRUE);
} else if (resultCode == Activity.RESULT_CANCELED) {
finishWithResult(KEY_CHECK_RESULT_CANCEL);
} else {
Toast.makeText(this, R.string.default_credentials_wrong, Toast.LENGTH_SHORT).show();
requestCredentials();
}
}
}
@Override
protected void onResume() {
super.onResume();
if (DeviceCredentialUtils.areCredentialsAvailable(this)) {
DeviceCredentialUtils.createKey(getApplicationContext());
requestCredentials();
} else {
DisplayUtils.showSnackMessage(this, R.string.prefs_lock_device_credentials_not_setup);
finishWithResult(KEY_CHECK_RESULT_TRUE);
}
}
private void requestCredentials() {
KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
if (keyguardManager != null) {
Intent i = keyguardManager.createConfirmDeviceCredentialIntent(null, null);
startActivityForResult(i, REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS);
} else {
Log_OC.e(TAG, "Keyguard manager is null");
finishWithResult(KEY_CHECK_RESULT_FALSE);
}
}
private void finishWithResult(int success) {
Intent resultIntent = new Intent();
resultIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
resultIntent.putExtra(KEY_CHECK_RESULT, success);
setResult(Activity.RESULT_OK, resultIntent);
finish();
}
}

View file

@ -0,0 +1,136 @@
/*
* Nextcloud Android client application
*
* @author Harikrishnan Rajan
* Copyright (C) 2017
* Copyright (C) 2017 Nextcloud GmbH.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License version 3,
* 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*
*/
package com.owncloud.android.utils;
import android.app.KeyguardManager;
import android.content.Context;
import android.os.Build;
import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.KeyProperties;
import android.support.annotation.RequiresApi;
import com.owncloud.android.R;
import com.owncloud.android.lib.common.utils.Log_OC;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
/**
* Utility class with methods for handling device credentials.
*/
@RequiresApi(Build.VERSION_CODES.M)
public class DeviceCredentialUtils {
private static final String TAG = DeviceCredentialUtils.class.getSimpleName();
private static final int AUTHENTICATION_DURATION_SECONDS = 30;
private static final String ANDROID_KEY_STORE = "AndroidKeyStore";
public static boolean areCredentialsAvailable(Context context) {
KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
if (keyguardManager != null) {
return keyguardManager.isKeyguardSecure();
} else {
Log_OC.e(TAG, "Keyguard manager is null");
return false;
}
}
/**
* Creates a symmetric key in the Android Key Store which can only be used after the user has
* authenticated with device credentials within the last X seconds.
*/
public static void createKey(Context context) {
// Generate a key to decrypt payment credentials, tokens, etc.
final String keyName = context.getResources().getString(R.string.secret_key_name);
try {
KeyStore keyStore = KeyStore.getInstance(ANDROID_KEY_STORE);
keyStore.load(null);
KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, ANDROID_KEY_STORE);
// Set the alias of the entry in Android KeyStore where the key will appear
// and the constrains (purposes) in the constructor of the Builder
keyGenerator.init(new KeyGenParameterSpec.Builder(keyName, KeyProperties.PURPOSE_ENCRYPT |
KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_CBC)
.setUserAuthenticationRequired(true)
// Require that the user has unlocked in the last 30 seconds
.setUserAuthenticationValidityDurationSeconds(AUTHENTICATION_DURATION_SECONDS)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
.build());
keyGenerator.generateKey();
} catch (NoSuchAlgorithmException | NoSuchProviderException
| InvalidAlgorithmParameterException | KeyStoreException
| CertificateException | IOException e) {
Log_OC.e(TAG, "Exception: " + e.getMessage());
}
}
/**
* Tries to encrypt some data with the generated key in {@link #createKey} which
* only works if the user has just authenticated via device credentials.
*/
public static boolean tryEncrypt(Context context) {
try {
final String keyName = context.getResources().getString(R.string.secret_key_name);
final int[] secretIntArray = context.getResources().getIntArray(R.array.secret_byte_array);
ByteBuffer byteBuffer = ByteBuffer.allocate(secretIntArray.length * 4);
IntBuffer intBuffer = byteBuffer.asIntBuffer();
intBuffer.put(secretIntArray);
byte[] secretByteArray = byteBuffer.array();
KeyStore keyStore = KeyStore.getInstance(ANDROID_KEY_STORE);
keyStore.load(null);
SecretKey secretKey = (SecretKey) keyStore.getKey(keyName, null);
Cipher cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" +
KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7);
// Try encrypting something, it will only work if the user authenticated within
// the last AUTHENTICATION_DURATION_SECONDS seconds.
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
cipher.doFinal(secretByteArray);
// If the user has recently authenticated, you will reach here.
return true;
} catch (BadPaddingException | IllegalBlockSizeException | KeyStoreException |
CertificateException | UnrecoverableKeyException | IOException
| NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException e) {
return false;
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View file

@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M17.81,4.47c-0.08,0 -0.16,-0.02 -0.23,-0.06C15.66,3.42 14,3 12.01,3c-1.98,0 -3.86,0.47 -5.57,1.41 -0.24,0.13 -0.54,0.04 -0.68,-0.2 -0.13,-0.24 -0.04,-0.55 0.2,-0.68C7.82,2.52 9.86,2 12.01,2c2.13,0 3.99,0.47 6.03,1.52 0.25,0.13 0.34,0.43 0.21,0.67 -0.09,0.18 -0.26,0.28 -0.44,0.28zM3.5,9.72c-0.1,0 -0.2,-0.03 -0.29,-0.09 -0.23,-0.16 -0.28,-0.47 -0.12,-0.7 0.99,-1.4 2.25,-2.5 3.75,-3.27C9.98,4.04 14,4.03 17.15,5.65c1.5,0.77 2.76,1.86 3.75,3.25 0.16,0.22 0.11,0.54 -0.12,0.7 -0.23,0.16 -0.54,0.11 -0.7,-0.12 -0.9,-1.26 -2.04,-2.25 -3.39,-2.94 -2.87,-1.47 -6.54,-1.47 -9.4,0.01 -1.36,0.7 -2.5,1.7 -3.4,2.96 -0.08,0.14 -0.23,0.21 -0.39,0.21zM9.75,21.79c-0.13,0 -0.26,-0.05 -0.35,-0.15 -0.87,-0.87 -1.34,-1.43 -2.01,-2.64 -0.69,-1.23 -1.05,-2.73 -1.05,-4.34 0,-2.97 2.54,-5.39 5.66,-5.39s5.66,2.42 5.66,5.39c0,0.28 -0.22,0.5 -0.5,0.5s-0.5,-0.22 -0.5,-0.5c0,-2.42 -2.09,-4.39 -4.66,-4.39 -2.57,0 -4.66,1.97 -4.66,4.39 0,1.44 0.32,2.77 0.93,3.85 0.64,1.15 1.08,1.64 1.85,2.42 0.19,0.2 0.19,0.51 0,0.71 -0.11,0.1 -0.24,0.15 -0.37,0.15zM16.92,19.94c-1.19,0 -2.24,-0.3 -3.1,-0.89 -1.49,-1.01 -2.38,-2.65 -2.38,-4.39 0,-0.28 0.22,-0.5 0.5,-0.5s0.5,0.22 0.5,0.5c0,1.41 0.72,2.74 1.94,3.56 0.71,0.48 1.54,0.71 2.54,0.71 0.24,0 0.64,-0.03 1.04,-0.1 0.27,-0.05 0.53,0.13 0.58,0.41 0.05,0.27 -0.13,0.53 -0.41,0.58 -0.57,0.11 -1.07,0.12 -1.21,0.12zM14.91,22c-0.04,0 -0.09,-0.01 -0.13,-0.02 -1.59,-0.44 -2.63,-1.03 -3.72,-2.1 -1.4,-1.39 -2.17,-3.24 -2.17,-5.22 0,-1.62 1.38,-2.94 3.08,-2.94 1.7,0 3.08,1.32 3.08,2.94 0,1.07 0.93,1.94 2.08,1.94s2.08,-0.87 2.08,-1.94c0,-3.77 -3.25,-6.83 -7.25,-6.83 -2.84,0 -5.44,1.58 -6.61,4.03 -0.39,0.81 -0.59,1.76 -0.59,2.8 0,0.78 0.07,2.01 0.67,3.61 0.1,0.26 -0.03,0.55 -0.29,0.64 -0.26,0.1 -0.55,-0.04 -0.64,-0.29 -0.49,-1.31 -0.73,-2.61 -0.73,-3.96 0,-1.2 0.23,-2.29 0.68,-3.24 1.33,-2.79 4.28,-4.6 7.51,-4.6 4.55,0 8.25,3.51 8.25,7.83 0,1.62 -1.38,2.94 -3.08,2.94s-3.08,-1.32 -3.08,-2.94c0,-1.07 -0.93,-1.94 -2.08,-1.94s-2.08,0.87 -2.08,1.94c0,1.71 0.66,3.31 1.87,4.51 0.95,0.94 1.86,1.46 3.27,1.85 0.27,0.07 0.42,0.35 0.35,0.61 -0.05,0.23 -0.26,0.38 -0.47,0.38z"/>
</vector>

View file

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Nextcloud Android client application
Copyright (C) 2017 Florian Lentz
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
License as published by the Free Software Foundation; either
version 3 of the License, or any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU AFFERO GENERAL PUBLIC LICENSE for more details.
You should have received a copy of the GNU Affero General Public
License along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways|snap"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:title="@string/app_name"
app:titleTextColor="@color/white"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="@dimen/standard_padding">
<TextView
android:id="@+id/scanfingerprinttext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:padding="@dimen/standard_half_padding"
android:text="@string/fingerprint_scan_finger"
android:textColor="@android:color/black"
android:textSize="@dimen/scan_fingerprint_text_size"/>
<ImageView
android:id="@+id/fingerprinticon"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/standard_padding"
android:scaleType="fitCenter"
android:src="@drawable/ic_fingerprint"
android:tint="@color/primary"
android:contentDescription="@string/fingerprint_icon"/>
</LinearLayout>
</LinearLayout>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">عام</string>
<string name="prefs_category_more">المزيد</string>
<string name="prefs_manage_accounts">إدارة الحسابات</string>
<string name="prefs_passcode">الرقم السري</string>
<string name="prefs_fingerprint">قفل بصمه الاصبع</string>
<string name="prefs_fingerprint_notsetup">لم يتم ادخال اى بصمات </string>
<string name="prefs_expert_mode">وضع متقدم</string>
<string name="prefs_show_hidden_files">عرض الملفات المخفية</string>
<string name="prefs_log_delete_history_button">حذف البيانات التاريخية</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">More</string>
<string name="prefs_manage_accounts">Manage accounts</string>
<string name="prefs_passcode">Passcode lock</string>
<string name="prefs_fingerprint">Fingerprint lock</string>
<string name="prefs_fingerprint_notsetup">No fingerprints have been set up.</string>
<string name="prefs_expert_mode">Expert mode</string>
<string name="prefs_show_hidden_files">Show hidden files</string>
<string name="prefs_log_delete_history_button">Delete history</string>
@ -602,9 +599,6 @@
<string name="whats_new_skip">Skip</string>
<string name="fingerprint_scan_finger">Please scan your finger</string>
<string name="fingerprint_unknown">Finger not recognized</string>
<!-- User information -->
<string name="user_info_email">E-mail</string>
<string name="user_info_phone">Phone number</string>
@ -678,7 +672,6 @@
<string name="activity_icon">Activity icon</string>
<string name="file_icon">File icon</string>
<string name="user_icon">User icon</string>
<string name="fingerprint_icon">Fingerprint icon</string>
<string name="favorite_icon">Favourite icon</string>
<string name="shared_via_link_icon">Shared via link icon</string>
<string name="synced_icon">Synced icon</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Més</string>
<string name="prefs_manage_accounts">Gestió de comptes</string>
<string name="prefs_passcode">Contrasenya</string>
<string name="prefs_fingerprint">Bloqueig d\'empremta</string>
<string name="prefs_fingerprint_notsetup">No s\'ha configurat cap empremta digital.</string>
<string name="prefs_expert_mode">Mode expert</string>
<string name="prefs_show_hidden_files">Mostra els fitxers ocults</string>
<string name="prefs_log_delete_history_button">Esborra l\'històric</string>

View file

@ -39,7 +39,6 @@
<string name="prefs_category_general">Obecné</string>
<string name="prefs_category_more">Více</string>
<string name="prefs_manage_accounts">Spravovat účty</string>
<string name="prefs_passcode">Zámek bezpečnostního kódu</string>
<string name="prefs_fingerprint">Zámek otiskem prstu</string>
<string name="prefs_fingerprint_notsetup">Nebyly nastaveny žádné otisky prstů.</string>
<string name="prefs_expert_mode">Režim pro experty</string>
@ -567,9 +566,6 @@
<string name="whats_new_ipv6_title">Podpora IPv6</string>
<string name="whats_new_skip">Přeskočit</string>
<string name="fingerprint_scan_finger">Prosím, naskenujte svůj otisk prstu</string>
<string name="fingerprint_unknown">Otisk prstu nerozpoznán</string>
<!-- User information -->
<string name="user_info_email">E-mail</string>
<string name="user_info_phone">Telefonní číslo</string>
@ -633,7 +629,6 @@
<string name="activity_icon">Ikona Aktivita</string>
<string name="file_icon">Ikona Soubor</string>
<string name="user_icon">Ikona Uživatel</string>
<string name="fingerprint_icon">Ikona Otisk prstu</string>
<string name="favorite_icon">Ikona Oblíbené</string>
<string name="shared_via_link_icon">Ikona Sdíleno odkazem</string>
<string name="synced_icon">Ikona Synchronizováno</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">Generel</string>
<string name="prefs_category_more">Mere</string>
<string name="prefs_manage_accounts">Administrer konti</string>
<string name="prefs_passcode">Passcode-lås</string>
<string name="prefs_fingerprint">Fingeraftrykslås</string>
<string name="prefs_fingerprint_notsetup">Ingen fingeraftryk er blevet sat op.</string>
<string name="prefs_expert_mode">Eksperttilstand </string>
<string name="prefs_show_hidden_files">Vis skjulte filer</string>
<string name="prefs_log_delete_history_button">Slet historik</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">Allgemein</string>
<string name="prefs_category_more">Mehr</string>
<string name="prefs_manage_accounts">Konten verwalten</string>
<string name="prefs_passcode">PIN gesperrt</string>
<string name="prefs_fingerprint">Fingerabdruck-Sperre</string>
<string name="prefs_fingerprint_notsetup">Keine Fingerabdrücke eingerichtet.</string>
<string name="prefs_expert_mode">Expertenmodus</string>
<string name="prefs_show_hidden_files">Versteckte Dateien anzeigen</string>
<string name="prefs_log_delete_history_button">Verlauf löschen</string>
@ -602,8 +599,6 @@
<string name="whats_new_skip">Überspringen</string>
<string name="fingerprint_scan_finger">Bitte scannen Sie Ihren Finger</string>
<string name="fingerprint_unknown">Finger nicht erkannt</string>
<!-- User information -->
<string name="user_info_email">E-Mail</string>
@ -679,7 +674,6 @@
<string name="activity_icon">Aktivitäten-Icon</string>
<string name="file_icon">Datei-Icon</string>
<string name="user_icon">Nutzer-Icon</string>
<string name="fingerprint_icon">Fingerabdruck-Icon</string>
<string name="favorite_icon">Favoriten-Icon</string>
<string name="shared_via_link_icon">Geteilt mittels Link Icon</string>
<string name="synced_icon">Synchronisiert-Icon</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">Γενικά</string>
<string name="prefs_category_more">Περισσότερα</string>
<string name="prefs_manage_accounts">Διαχείριση λογαριασμών</string>
<string name="prefs_passcode">Κλείδωμα με κωδικό πρόσβασης</string>
<string name="prefs_fingerprint">Κλείδωμα με αποτύπωμα</string>
<string name="prefs_fingerprint_notsetup">Δεν έχει οριστεί αποτύπωμα</string>
<string name="prefs_expert_mode">Λειτουργία για προχωρημένους</string>
<string name="prefs_show_hidden_files">Εμφάνιση κρυφών αρχείων</string>
<string name="prefs_log_delete_history_button">Διαγραφή ιστορικού</string>
@ -527,9 +524,6 @@
<string name="whats_new_ipv6_title">Υποστήριξη IPv6</string>
<string name="whats_new_skip">Παράλειψη</string>
<string name="fingerprint_scan_finger">Παρακαλώ σαρρώστε το αποτύπωμά σας</string>
<string name="fingerprint_unknown">Το αποτύπωμα δεν αναγνωρίστηκε</string>
<!-- User information -->
<string name="user_info_email">E-mail</string>
<string name="user_info_phone">Αριθμός τηλεφώνου</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Más</string>
<string name="prefs_manage_accounts">Administrar cuentas</string>
<string name="prefs_passcode">Bloqueo con código de seguridad</string>
<string name="prefs_fingerprint">Bloqueo por huella digital</string>
<string name="prefs_fingerprint_notsetup">No se ha establecido ninguna huella digital. </string>
<string name="prefs_expert_mode">Modo experto</string>
<string name="prefs_show_hidden_files">Mostrar archivos ocultos</string>
<string name="prefs_log_delete_history_button">Borrar historial</string>
@ -434,9 +431,6 @@
<string name="whats_new_skip">Saltar</string>
<string name="fingerprint_scan_finger">Favor de escanear su dedo</string>
<string name="fingerprint_unknown">El dedo no ha sido reconocido</string>
<!-- User information -->
<string name="user_info_email">Correo electrónico</string>
<string name="user_info_phone">Número telefónico</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Más</string>
<string name="prefs_manage_accounts">Administrar cuentas</string>
<string name="prefs_passcode">Bloqueo con código de seguridad</string>
<string name="prefs_fingerprint">Bloqueo cor huella digital</string>
<string name="prefs_fingerprint_notsetup">No se ha establecido alguna huella digital. </string>
<string name="prefs_expert_mode">Modo experto</string>
<string name="prefs_show_hidden_files">Mostrar archivos ocultos</string>
<string name="prefs_log_delete_history_button">Borrar historial</string>
@ -580,9 +577,6 @@
<string name="whats_new_skip">Omitir</string>
<string name="fingerprint_scan_finger">Por favor escanea tu dedo</string>
<string name="fingerprint_unknown">El dedo no ha sido reconocido</string>
<!-- User information -->
<string name="user_info_email">Correo electrónico</string>
<string name="user_info_phone">Número telefónico</string>
@ -656,7 +650,6 @@
<string name="activity_icon">Ícono de actividad</string>
<string name="file_icon">Ícono de archivo</string>
<string name="user_icon">Ícono de usuario</string>
<string name="fingerprint_icon">Ícono de huella digital</string>
<string name="favorite_icon">Ícono de Favorito</string>
<string name="shared_via_link_icon">Ícono de compartido por liga</string>
<string name="synced_icon">Ícono de sincronizado</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Más</string>
<string name="prefs_manage_accounts">Administrar cuentas</string>
<string name="prefs_passcode">Bloqueo con código de seguridad</string>
<string name="prefs_fingerprint">Bloqueo cor huella digital</string>
<string name="prefs_fingerprint_notsetup">No se ha establecido alguna huella digital. </string>
<string name="prefs_expert_mode">Modo experto</string>
<string name="prefs_show_hidden_files">Mostrar archivos ocultos</string>
<string name="prefs_log_delete_history_button">Borrar historial</string>
@ -580,9 +577,6 @@
<string name="whats_new_skip">Omitir</string>
<string name="fingerprint_scan_finger">Por favor escanea tu dedo</string>
<string name="fingerprint_unknown">El dedo no ha sido reconocido</string>
<!-- User information -->
<string name="user_info_email">Correo electrónico</string>
<string name="user_info_phone">Número telefónico</string>
@ -656,7 +650,6 @@
<string name="activity_icon">Ícono de actividad</string>
<string name="file_icon">Ícono de archivo</string>
<string name="user_icon">Ícono de usuario</string>
<string name="fingerprint_icon">Ícono de huella digital</string>
<string name="favorite_icon">Ícono de Favorito</string>
<string name="shared_via_link_icon">Ícono de compartido por liga</string>
<string name="synced_icon">Ícono de sincronizado</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Más</string>
<string name="prefs_manage_accounts">Administrar cuentas</string>
<string name="prefs_passcode">Bloqueo con código de seguridad</string>
<string name="prefs_fingerprint">Bloqueo cor huella digital</string>
<string name="prefs_fingerprint_notsetup">No se ha establecido alguna huella digital. </string>
<string name="prefs_expert_mode">Modo experto</string>
<string name="prefs_show_hidden_files">Mostrar archivos ocultos</string>
<string name="prefs_log_delete_history_button">Borrar historial</string>
@ -580,9 +577,6 @@
<string name="whats_new_skip">Omitir</string>
<string name="fingerprint_scan_finger">Por favor escanea tu dedo</string>
<string name="fingerprint_unknown">El dedo no ha sido reconocido</string>
<!-- User information -->
<string name="user_info_email">Correo electrónico</string>
<string name="user_info_phone">Número telefónico</string>
@ -656,7 +650,6 @@
<string name="activity_icon">Ícono de actividad</string>
<string name="file_icon">Ícono de archivo</string>
<string name="user_icon">Ícono de usuario</string>
<string name="fingerprint_icon">Ícono de huella digital</string>
<string name="favorite_icon">Ícono de Favorito</string>
<string name="shared_via_link_icon">Ícono de compartido por liga</string>
<string name="synced_icon">Ícono de sincronizado</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Más</string>
<string name="prefs_manage_accounts">Administrar cuentas</string>
<string name="prefs_passcode">Bloqueo con código de seguridad</string>
<string name="prefs_fingerprint">Bloqueo cor huella digital</string>
<string name="prefs_fingerprint_notsetup">No se ha establecido alguna huella digital. </string>
<string name="prefs_expert_mode">Modo experto</string>
<string name="prefs_show_hidden_files">Mostrar archivos ocultos</string>
<string name="prefs_log_delete_history_button">Borrar historial</string>
@ -580,9 +577,6 @@
<string name="whats_new_skip">Omitir</string>
<string name="fingerprint_scan_finger">Por favor escanea tu dedo</string>
<string name="fingerprint_unknown">El dedo no ha sido reconocido</string>
<!-- User information -->
<string name="user_info_email">Correo electrónico</string>
<string name="user_info_phone">Número telefónico</string>
@ -656,7 +650,6 @@
<string name="activity_icon">Ícono de actividad</string>
<string name="file_icon">Ícono de archivo</string>
<string name="user_icon">Ícono de usuario</string>
<string name="fingerprint_icon">Ícono de huella digital</string>
<string name="favorite_icon">Ícono de Favorito</string>
<string name="shared_via_link_icon">Ícono de compartido por liga</string>
<string name="synced_icon">Ícono de sincronizado</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Más</string>
<string name="prefs_manage_accounts">Administrar cuentas</string>
<string name="prefs_passcode">Bloqueo con código de seguridad</string>
<string name="prefs_fingerprint">Bloqueo cor huella digital</string>
<string name="prefs_fingerprint_notsetup">No se ha establecido alguna huella digital. </string>
<string name="prefs_expert_mode">Modo experto</string>
<string name="prefs_show_hidden_files">Mostrar archivos ocultos</string>
<string name="prefs_log_delete_history_button">Borrar historial</string>
@ -580,9 +577,6 @@
<string name="whats_new_skip">Omitir</string>
<string name="fingerprint_scan_finger">Por favor escanea tu dedo</string>
<string name="fingerprint_unknown">El dedo no ha sido reconocido</string>
<!-- User information -->
<string name="user_info_email">Correo electrónico</string>
<string name="user_info_phone">Número telefónico</string>
@ -656,7 +650,6 @@
<string name="activity_icon">Ícono de actividad</string>
<string name="file_icon">Ícono de archivo</string>
<string name="user_icon">Ícono de usuario</string>
<string name="fingerprint_icon">Ícono de huella digital</string>
<string name="favorite_icon">Ícono de Favorito</string>
<string name="shared_via_link_icon">Ícono de compartido por liga</string>
<string name="synced_icon">Ícono de sincronizado</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Más</string>
<string name="prefs_manage_accounts">Administrar cuentas</string>
<string name="prefs_passcode">Bloqueo con código de seguridad</string>
<string name="prefs_fingerprint">Bloqueo cor huella digital</string>
<string name="prefs_fingerprint_notsetup">No se ha establecido alguna huella digital. </string>
<string name="prefs_expert_mode">Modo experto</string>
<string name="prefs_show_hidden_files">Mostrar archivos ocultos</string>
<string name="prefs_log_delete_history_button">Borrar historial</string>
@ -580,9 +577,6 @@
<string name="whats_new_skip">Omitir</string>
<string name="fingerprint_scan_finger">Por favor escanea tu dedo</string>
<string name="fingerprint_unknown">El dedo no ha sido reconocido</string>
<!-- User information -->
<string name="user_info_email">Correo electrónico</string>
<string name="user_info_phone">Número telefónico</string>
@ -656,7 +650,6 @@
<string name="activity_icon">Ícono de actividad</string>
<string name="file_icon">Ícono de archivo</string>
<string name="user_icon">Ícono de usuario</string>
<string name="fingerprint_icon">Ícono de huella digital</string>
<string name="favorite_icon">Ícono de Favorito</string>
<string name="shared_via_link_icon">Ícono de compartido por liga</string>
<string name="synced_icon">Ícono de sincronizado</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Más</string>
<string name="prefs_manage_accounts">Administrar cuentas</string>
<string name="prefs_passcode">Bloqueo con código de seguridad</string>
<string name="prefs_fingerprint">Bloqueo cor huella digital</string>
<string name="prefs_fingerprint_notsetup">No se ha establecido alguna huella digital. </string>
<string name="prefs_expert_mode">Modo experto</string>
<string name="prefs_show_hidden_files">Mostrar archivos ocultos</string>
<string name="prefs_log_delete_history_button">Borrar historial</string>
@ -480,9 +477,6 @@
<string name="whats_new_skip">Saltar</string>
<string name="fingerprint_scan_finger">Por favor escanea tu dedo</string>
<string name="fingerprint_unknown">El dedo no ha sido reconocido</string>
<!-- User information -->
<string name="user_info_email">Correo electrónico</string>
<string name="user_info_phone">Número telefónico</string>
@ -543,7 +537,6 @@
<string name="activity_icon">Ícono de actividad</string>
<string name="file_icon">Ícono de archivo</string>
<string name="user_icon">Ícono de usuario</string>
<string name="fingerprint_icon">Ícono de huella digital</string>
<string name="favorite_icon">Ícono de Favorito</string>
<string name="shared_via_link_icon">Ícono de compartido por liga</string>
<string name="synced_icon">Ícono de sincronizado</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Más</string>
<string name="prefs_manage_accounts">Administrar cuentas</string>
<string name="prefs_passcode">Bloqueo con código de seguridad</string>
<string name="prefs_fingerprint">Bloqueo cor huella digital</string>
<string name="prefs_fingerprint_notsetup">No se ha establecido alguna huella digital. </string>
<string name="prefs_expert_mode">Modo experto</string>
<string name="prefs_show_hidden_files">Mostrar archivos ocultos</string>
<string name="prefs_log_delete_history_button">Borrar historial</string>
@ -602,9 +599,6 @@
<string name="whats_new_skip">Omitir</string>
<string name="fingerprint_scan_finger">Por favor escanea tu dedo</string>
<string name="fingerprint_unknown">El dedo no ha sido reconocido</string>
<!-- User information -->
<string name="user_info_email">Correo electrónico</string>
<string name="user_info_phone">Número telefónico</string>
@ -678,7 +672,6 @@
<string name="activity_icon">Ícono de actividad</string>
<string name="file_icon">Ícono de archivo</string>
<string name="user_icon">Ícono de usuario</string>
<string name="fingerprint_icon">Ícono de huella digital</string>
<string name="favorite_icon">Ícono de Favorito</string>
<string name="shared_via_link_icon">Ícono de compartido por liga</string>
<string name="synced_icon">Ícono de sincronizado</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Más</string>
<string name="prefs_manage_accounts">Administrar cuentas</string>
<string name="prefs_passcode">Bloqueo con código de seguridad</string>
<string name="prefs_fingerprint">Bloqueo cor huella digital</string>
<string name="prefs_fingerprint_notsetup">No se ha establecido alguna huella digital. </string>
<string name="prefs_expert_mode">Modo experto</string>
<string name="prefs_show_hidden_files">Mostrar archivos ocultos</string>
<string name="prefs_log_delete_history_button">Borrar historial</string>
@ -480,9 +477,6 @@
<string name="whats_new_skip">Saltar</string>
<string name="fingerprint_scan_finger">Por favor escanea tu dedo</string>
<string name="fingerprint_unknown">El dedo no ha sido reconocido</string>
<!-- User information -->
<string name="user_info_email">Correo electrónico</string>
<string name="user_info_phone">Número telefónico</string>
@ -543,7 +537,6 @@
<string name="activity_icon">Ícono de actividad</string>
<string name="file_icon">Ícono de archivo</string>
<string name="user_icon">Ícono de usuario</string>
<string name="fingerprint_icon">Ícono de huella digital</string>
<string name="favorite_icon">Ícono de Favorito</string>
<string name="shared_via_link_icon">Ícono de compartido por liga</string>
<string name="synced_icon">Ícono de sincronizado</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Más</string>
<string name="prefs_manage_accounts">Administrar cuentas</string>
<string name="prefs_passcode">Bloqueo con código de seguridad</string>
<string name="prefs_fingerprint">Bloqueo cor huella digital</string>
<string name="prefs_fingerprint_notsetup">No se ha establecido alguna huella digital. </string>
<string name="prefs_expert_mode">Modo experto</string>
<string name="prefs_show_hidden_files">Mostrar archivos ocultos</string>
<string name="prefs_log_delete_history_button">Borrar historial</string>
@ -480,9 +477,6 @@
<string name="whats_new_skip">Saltar</string>
<string name="fingerprint_scan_finger">Por favor escanea tu dedo</string>
<string name="fingerprint_unknown">El dedo no ha sido reconocido</string>
<!-- User information -->
<string name="user_info_email">Correo electrónico</string>
<string name="user_info_phone">Número telefónico</string>
@ -543,7 +537,6 @@
<string name="activity_icon">Ícono de actividad</string>
<string name="file_icon">Ícono de archivo</string>
<string name="user_icon">Ícono de usuario</string>
<string name="fingerprint_icon">Ícono de huella digital</string>
<string name="favorite_icon">Ícono de Favorito</string>
<string name="shared_via_link_icon">Ícono de compartido por liga</string>
<string name="synced_icon">Ícono de sincronizado</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Más</string>
<string name="prefs_manage_accounts">Administrar cuentas</string>
<string name="prefs_passcode">Bloqueo con código de seguridad</string>
<string name="prefs_fingerprint">Bloqueo cor huella digital</string>
<string name="prefs_fingerprint_notsetup">No se ha establecido alguna huella digital. </string>
<string name="prefs_expert_mode">Modo experto</string>
<string name="prefs_show_hidden_files">Mostrar archivos ocultos</string>
<string name="prefs_log_delete_history_button">Borrar historial</string>
@ -480,9 +477,6 @@
<string name="whats_new_skip">Saltar</string>
<string name="fingerprint_scan_finger">Por favor escanea tu dedo</string>
<string name="fingerprint_unknown">El dedo no ha sido reconocido</string>
<!-- User information -->
<string name="user_info_email">Correo electrónico</string>
<string name="user_info_phone">Número telefónico</string>
@ -543,7 +537,6 @@
<string name="activity_icon">Ícono de actividad</string>
<string name="file_icon">Ícono de archivo</string>
<string name="user_icon">Ícono de usuario</string>
<string name="fingerprint_icon">Ícono de huella digital</string>
<string name="favorite_icon">Ícono de Favorito</string>
<string name="shared_via_link_icon">Ícono de compartido por liga</string>
<string name="synced_icon">Ícono de sincronizado</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Más</string>
<string name="prefs_manage_accounts">Administrar cuentas</string>
<string name="prefs_passcode">Bloqueo con código de seguridad</string>
<string name="prefs_fingerprint">Bloqueo cor huella digital</string>
<string name="prefs_fingerprint_notsetup">No se ha establecido alguna huella digital. </string>
<string name="prefs_expert_mode">Modo experto</string>
<string name="prefs_show_hidden_files">Mostrar archivos ocultos</string>
<string name="prefs_log_delete_history_button">Borrar historial</string>
@ -480,9 +477,6 @@
<string name="whats_new_skip">Saltar</string>
<string name="fingerprint_scan_finger">Por favor escanea tu dedo</string>
<string name="fingerprint_unknown">El dedo no ha sido reconocido</string>
<!-- User information -->
<string name="user_info_email">Correo electrónico</string>
<string name="user_info_phone">Número telefónico</string>
@ -543,7 +537,6 @@
<string name="activity_icon">Ícono de actividad</string>
<string name="file_icon">Ícono de archivo</string>
<string name="user_icon">Ícono de usuario</string>
<string name="fingerprint_icon">Ícono de huella digital</string>
<string name="favorite_icon">Ícono de Favorito</string>
<string name="shared_via_link_icon">Ícono de compartido por liga</string>
<string name="synced_icon">Ícono de sincronizado</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Más</string>
<string name="prefs_manage_accounts">Administrar cuentas</string>
<string name="prefs_passcode">Bloqueo con código de seguridad</string>
<string name="prefs_fingerprint">Bloqueo cor huella digital</string>
<string name="prefs_fingerprint_notsetup">No se ha establecido alguna huella digital. </string>
<string name="prefs_expert_mode">Modo experto</string>
<string name="prefs_show_hidden_files">Mostrar archivos ocultos</string>
<string name="prefs_log_delete_history_button">Borrar historial</string>
@ -480,9 +477,6 @@
<string name="whats_new_skip">Saltar</string>
<string name="fingerprint_scan_finger">Por favor escanea tu dedo</string>
<string name="fingerprint_unknown">El dedo no ha sido reconocido</string>
<!-- User information -->
<string name="user_info_email">Correo electrónico</string>
<string name="user_info_phone">Número telefónico</string>
@ -543,7 +537,6 @@
<string name="activity_icon">Ícono de actividad</string>
<string name="file_icon">Ícono de archivo</string>
<string name="user_icon">Ícono de usuario</string>
<string name="fingerprint_icon">Ícono de huella digital</string>
<string name="favorite_icon">Ícono de Favorito</string>
<string name="shared_via_link_icon">Ícono de compartido por liga</string>
<string name="synced_icon">Ícono de sincronizado</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Más</string>
<string name="prefs_manage_accounts">Administrar cuentas</string>
<string name="prefs_passcode">Bloqueo con código de seguridad</string>
<string name="prefs_fingerprint">Bloqueo cor huella digital</string>
<string name="prefs_fingerprint_notsetup">No se ha establecido alguna huella digital. </string>
<string name="prefs_expert_mode">Modo experto</string>
<string name="prefs_show_hidden_files">Mostrar archivos ocultos</string>
<string name="prefs_log_delete_history_button">Borrar historial</string>
@ -580,9 +577,6 @@
<string name="whats_new_skip">Omitir</string>
<string name="fingerprint_scan_finger">Por favor escanea tu dedo</string>
<string name="fingerprint_unknown">El dedo no ha sido reconocido</string>
<!-- User information -->
<string name="user_info_email">Correo electrónico</string>
<string name="user_info_phone">Número telefónico</string>
@ -656,7 +650,6 @@
<string name="activity_icon">Ícono de actividad</string>
<string name="file_icon">Ícono de archivo</string>
<string name="user_icon">Ícono de usuario</string>
<string name="fingerprint_icon">Ícono de huella digital</string>
<string name="favorite_icon">Ícono de Favorito</string>
<string name="shared_via_link_icon">Ícono de compartido por liga</string>
<string name="synced_icon">Ícono de sincronizado</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Más</string>
<string name="prefs_manage_accounts">Administrar cuentas</string>
<string name="prefs_passcode">Bloqueo con código de seguridad</string>
<string name="prefs_fingerprint">Bloqueo cor huella digital</string>
<string name="prefs_fingerprint_notsetup">No se ha establecido alguna huella digital. </string>
<string name="prefs_expert_mode">Modo experto</string>
<string name="prefs_show_hidden_files">Mostrar archivos ocultos</string>
<string name="prefs_log_delete_history_button">Borrar historial</string>
@ -480,9 +477,6 @@
<string name="whats_new_skip">Saltar</string>
<string name="fingerprint_scan_finger">Por favor escanea tu dedo</string>
<string name="fingerprint_unknown">El dedo no ha sido reconocido</string>
<!-- User information -->
<string name="user_info_email">Correo electrónico</string>
<string name="user_info_phone">Número telefónico</string>
@ -543,7 +537,6 @@
<string name="activity_icon">Ícono de actividad</string>
<string name="file_icon">Ícono de archivo</string>
<string name="user_icon">Ícono de usuario</string>
<string name="fingerprint_icon">Ícono de huella digital</string>
<string name="favorite_icon">Ícono de Favorito</string>
<string name="shared_via_link_icon">Ícono de compartido por liga</string>
<string name="synced_icon">Ícono de sincronizado</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Más</string>
<string name="prefs_manage_accounts">Gestionar cuentas</string>
<string name="prefs_passcode">Bloqueo con código de acceso</string>
<string name="prefs_fingerprint">Bloqueo con huella dactilar</string>
<string name="prefs_fingerprint_notsetup">No se han configurado huellas dactilares</string>
<string name="prefs_expert_mode">Modo experto</string>
<string name="prefs_show_hidden_files">Mostrar archivos ocultos</string>
<string name="prefs_log_delete_history_button">Eliminar historial</string>
@ -602,9 +599,6 @@
<string name="whats_new_skip">Omitir</string>
<string name="fingerprint_scan_finger">Por favor, escanea tu dedo</string>
<string name="fingerprint_unknown">Dedo no reconocido</string>
<!-- User information -->
<string name="user_info_email">Correo electrónico</string>
<string name="user_info_phone">Número de teléfono</string>
@ -678,7 +672,6 @@
<string name="activity_icon">Icono de actividad</string>
<string name="file_icon">Icono de archivo</string>
<string name="user_icon">Icono de usuario</string>
<string name="fingerprint_icon">Icono de lector de huellas</string>
<string name="favorite_icon">Icono de favorito</string>
<string name="shared_via_link_icon">Icono de compartido vía enlace</string>
<string name="synced_icon">Icono de sincronizado</string>

View file

@ -39,7 +39,6 @@
<string name="prefs_category_general">Orokorra</string>
<string name="prefs_category_more">Gehiago</string>
<string name="prefs_manage_accounts">Kudeatu kontuak</string>
<string name="prefs_passcode">Pasakode bidezko blokeoa</string>
<string name="prefs_fingerprint">Hatz-marka bidezko blokeoa</string>
<string name="prefs_fingerprint_notsetup">Ez da hatz-markarik konfiguratu</string>
<string name="prefs_expert_mode">Modu aurreratua</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">Yleiset</string>
<string name="prefs_category_more">Enemmän</string>
<string name="prefs_manage_accounts">Tilien hallinta</string>
<string name="prefs_passcode">Suojakoodilukitus</string>
<string name="prefs_fingerprint">Sormenjälkilukitus</string>
<string name="prefs_fingerprint_notsetup">Sormenjälkiä ei ole asetettu</string>
<string name="prefs_expert_mode">Asiantuntijatila</string>
<string name="prefs_show_hidden_files">Näytä piilotetut tiedostot</string>
<string name="prefs_log_delete_history_button">Poista historia</string>
@ -529,8 +526,6 @@
<string name="whats_new_skip">Ohita</string>
<string name="fingerprint_scan_finger">Skannaa sormesi.</string>
<string name="fingerprint_unknown">Sormea ei tunnistettu</string>
<!-- User information -->
<string name="user_info_email">Sähköposti</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">Général</string>
<string name="prefs_category_more">Plus</string>
<string name="prefs_manage_accounts">Gestion des comptes</string>
<string name="prefs_passcode">Code de sécurité</string>
<string name="prefs_fingerprint">Verrouillage par empreinte digitale</string>
<string name="prefs_fingerprint_notsetup">Aucune empreinte digitale n\'a été installée.</string>
<string name="prefs_expert_mode">Mode expert</string>
<string name="prefs_show_hidden_files">Afficher les fichiers masqués</string>
<string name="prefs_log_delete_history_button">Effacer le journal</string>
@ -601,9 +598,6 @@ Veuillez contacter votre administrateur</string>
<string name="whats_new_skip">Ignorer</string>
<string name="fingerprint_scan_finger">Veuillez scanner votre doigt</string>
<string name="fingerprint_unknown">Doigt non reconnu</string>
<!-- User information -->
<string name="user_info_email">Adresse e-mail</string>
<string name="user_info_phone">Numéro de téléphone</string>
@ -677,7 +671,6 @@ Veuillez contacter votre administrateur</string>
<string name="activity_icon">Icône d\'activité</string>
<string name="file_icon">Icône de fichier</string>
<string name="user_icon">Icône d\'utilisateur</string>
<string name="fingerprint_icon">Icône de fingerprint</string>
<string name="favorite_icon">Icône des favoris</string>
<string name="shared_via_link_icon">Icône de partage par lien</string>
<string name="synced_icon">Icône synchronisé</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">Általános</string>
<string name="prefs_category_more">Több</string>
<string name="prefs_manage_accounts">Fiókok kezelése</string>
<string name="prefs_passcode">Számkódos lezárás</string>
<string name="prefs_fingerprint">Lezárás Újjlenyomattal</string>
<string name="prefs_fingerprint_notsetup">Nincs újjlenyomat beállítva.</string>
<string name="prefs_expert_mode">Szakértő mód</string>
<string name="prefs_show_hidden_files">Rejtett fájlok megjelenítése</string>
<string name="prefs_log_delete_history_button">Előzmények törlése</string>
@ -580,9 +577,6 @@ Lépj kapcsolatba a rendszergazdával</string>
<string name="whats_new_skip">Kihagy</string>
<string name="fingerprint_scan_finger">Kérlek húzd le az ujjad</string>
<string name="fingerprint_unknown">Ujj ismeretlen</string>
<!-- User information -->
<string name="user_info_email">E-mail</string>
<string name="user_info_phone">Telefonszám</string>
@ -674,7 +668,6 @@ A Nextcloud itt érhető el: https://nextcloud.com</string>
<string name="activity_icon">Aktivitás ikon</string>
<string name="file_icon">Fájl ikon</string>
<string name="user_icon">Felhasználó ikon</string>
<string name="fingerprint_icon">Ujjlenyomat ikon</string>
<string name="favorite_icon">Kedvencek ikon</string>
<string name="shared_via_link_icon">Link ikonon keresztül megosztva</string>
<string name="synced_icon">Szinkronizálva ikon</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">Umum</string>
<string name="prefs_category_more">Lainnya</string>
<string name="prefs_manage_accounts">Kelola akun</string>
<string name="prefs_passcode">Kunci kode sandi</string>
<string name="prefs_fingerprint">Kunci Fingerprint</string>
<string name="prefs_fingerprint_notsetup">Belum ada fingerprint ditambahkan</string>
<string name="prefs_expert_mode">Mode Ahli</string>
<string name="prefs_show_hidden_files">Lihat berkas tersembunyi</string>
<string name="prefs_log_delete_history_button">Hapus riwayat</string>
@ -434,9 +431,6 @@
<string name="whats_new_skip">Lewat</string>
<string name="fingerprint_scan_finger">Pindai jari anda.</string>
<string name="fingerprint_unknown">Jari tidak dikenali.</string>
<!-- User information -->
<string name="user_info_email">Surel</string>
<string name="user_info_phone">Nomor telepon</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">Almennt</string>
<string name="prefs_category_more">Meira</string>
<string name="prefs_manage_accounts">Sýsla með notandaaðganga</string>
<string name="prefs_passcode">Læsing með lykilkóða</string>
<string name="prefs_fingerprint">Fingrafaralás</string>
<string name="prefs_fingerprint_notsetup">Engin fingraför hafa verið sett inn.</string>
<string name="prefs_expert_mode">Sérfræðingahamur</string>
<string name="prefs_show_hidden_files">Sýna faldar skrár</string>
<string name="prefs_log_delete_history_button">Eyða ferli</string>
@ -602,9 +599,6 @@
<string name="whats_new_skip">Sleppa</string>
<string name="fingerprint_scan_finger">Skannaðu fingurinn þinn</string>
<string name="fingerprint_unknown">Fingrafar þekktist ekki</string>
<!-- User information -->
<string name="user_info_email">Tölvupóstur</string>
<string name="user_info_phone">Símanúmer</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">Generale</string>
<string name="prefs_category_more">Altro</string>
<string name="prefs_manage_accounts">Gestisci account</string>
<string name="prefs_passcode">Blocco con codice di sicurezza</string>
<string name="prefs_fingerprint">Blocco con impronta digitale</string>
<string name="prefs_fingerprint_notsetup">Non è stata impostata alcuna impronta digitale</string>
<string name="prefs_expert_mode">Modalità esperta</string>
<string name="prefs_show_hidden_files">Mostra i file nascosti</string>
<string name="prefs_log_delete_history_button">Elimina cronologia</string>
@ -602,9 +599,6 @@
<string name="whats_new_skip">Salta</string>
<string name="fingerprint_scan_finger">Esegui la scansione del tuo dito</string>
<string name="fingerprint_unknown">Dito non riconosciuto</string>
<!-- User information -->
<string name="user_info_email">Email</string>
<string name="user_info_phone">Numero di telefono</string>
@ -679,7 +673,6 @@
<string name="activity_icon">Icona attività</string>
<string name="file_icon">Icona file</string>
<string name="user_icon">Icona utente</string>
<string name="fingerprint_icon">Icona impronta digitale</string>
<string name="favorite_icon">Icona preferiti</string>
<string name="shared_via_link_icon">Icona condivisi tramite collegamento</string>
<string name="synced_icon">Icona sincronizzati</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">一般</string>
<string name="prefs_category_more">もっと見る</string>
<string name="prefs_manage_accounts">アカウント管理</string>
<string name="prefs_passcode">パスコードロック</string>
<string name="prefs_fingerprint">指紋ロック</string>
<string name="prefs_fingerprint_notsetup">指紋は設定されていません。</string>
<string name="prefs_expert_mode">エキスパートモード</string>
<string name="prefs_show_hidden_files">隠しファイルを表示</string>
<string name="prefs_log_delete_history_button">履歴の削除</string>
@ -450,9 +447,6 @@
<string name="whats_new_skip">スキップ</string>
<string name="fingerprint_scan_finger">指紋をスキャンしてください</string>
<string name="fingerprint_unknown">指紋が認識できません</string>
<string name="user_info_phone">電話番号</string>
<string name="user_info_address">住所</string>
<string name="user_info_website">ウェブサイト</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">ზოგადი</string>
<string name="prefs_category_more">მეტი</string>
<string name="prefs_manage_accounts">ანგარიშების მართვა</string>
<string name="prefs_passcode">ჩაკეტვა პასკოდით</string>
<string name="prefs_fingerprint">ჩაკეტვა თითის ანაბეჭდით</string>
<string name="prefs_fingerprint_notsetup">თითის ანაბეჭდები არ დაყენებულა.</string>
<string name="prefs_expert_mode">ექპერტ-რეჟიმი</string>
<string name="prefs_show_hidden_files">დამალული ფაილების ჩვენება</string>
<string name="prefs_log_delete_history_button">ისტორიის წაშლა</string>
@ -544,9 +541,6 @@
<string name="whats_new_skip">გამოტოვება</string>
<string name="fingerprint_scan_finger">გთხოვთ დაასკანიროთ თქვენი თითი</string>
<string name="fingerprint_unknown">თითი ვერ იქნა ამოცნობილი</string>
<!-- User information -->
<string name="user_info_email">ელ-ფოსტა</string>
<string name="user_info_phone">ტელეფონის ნომერი</string>
@ -617,7 +611,6 @@
<string name="activity_icon">აქტივობის პიქტოგრამა</string>
<string name="file_icon">ფაილის პიქტოგრამა</string>
<string name="user_icon">მომხმარებლის პიქტოგრამა</string>
<string name="fingerprint_icon">თითის ანაბეჭდის პიქტოგრამა</string>
<string name="favorite_icon">რჩეულის პიქტოგრამა</string>
<string name="shared_via_link_icon">გაზიარებულია ბმულის პიქტოგრამით</string>
<string name="synced_icon">სინქრონიზირებული პიქტოგრამა</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">일반</string>
<string name="prefs_category_more">더 보기</string>
<string name="prefs_manage_accounts">계정 관리</string>
<string name="prefs_passcode">암호 잠금</string>
<string name="prefs_fingerprint">지문 잠금</string>
<string name="prefs_fingerprint_notsetup">설정된 지문이 없습니다.</string>
<string name="prefs_expert_mode">전문가 모드</string>
<string name="prefs_show_hidden_files">숨겨진 파일 보기</string>
<string name="prefs_log_delete_history_button">과거 기록 삭제</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">Bendras</string>
<string name="prefs_category_more">Daugiau</string>
<string name="prefs_manage_accounts">Tvarkyti paskyras</string>
<string name="prefs_passcode">Užrakinimas kodų</string>
<string name="prefs_fingerprint">Piršto užraktas</string>
<string name="prefs_fingerprint_notsetup">Nėra pirštų antspaudo užrakto</string>
<string name="prefs_expert_mode">Eksperto režimas</string>
<string name="prefs_show_hidden_files">Rodyti paslėptus failus</string>
<string name="prefs_log_delete_history_button">Ištrinti istoriją</string>
@ -458,9 +455,6 @@
<string name="whats_new_skip">Praleisti</string>
<string name="fingerprint_scan_finger">Prašome nuskenuoti piršto atspaudą</string>
<string name="fingerprint_unknown">Atspaudas neatpažintas</string>
<!-- User information -->
<string name="user_info_email">El. paštas</string>
<string name="user_info_phone">Telefono numeris</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">Generelt</string>
<string name="prefs_category_more">Mer</string>
<string name="prefs_manage_accounts">Håndter kontoer</string>
<string name="prefs_passcode">Passordlås</string>
<string name="prefs_fingerprint">Fingeravtrykkslås</string>
<string name="prefs_fingerprint_notsetup">Det har ikke blitt satt opp noen fingeravtrykk.</string>
<string name="prefs_expert_mode">Ekspertmodus</string>
<string name="prefs_show_hidden_files">Vis skjulte filer</string>
<string name="prefs_log_delete_history_button">Slett historikk</string>
@ -598,9 +595,6 @@
<string name="whats_new_skip">Hopp over</string>
<string name="fingerprint_scan_finger">Skann fingeren din</string>
<string name="fingerprint_unknown">Gjenkjenner ikke finger</string>
<!-- User information -->
<string name="user_info_email">E-post</string>
<string name="user_info_phone">Telefonnummer</string>
@ -691,7 +685,6 @@ Sjekk ut Nextcloud på https://nextcloud.com</string>
<string name="activity_icon">Aktivitetsikon</string>
<string name="file_icon">Filikon</string>
<string name="user_icon">Brukerikon</string>
<string name="fingerprint_icon">Fingeravtrykksikon</string>
<string name="favorite_icon">Favorittikon</string>
<string name="shared_via_link_icon">Delt via lenkeikon</string>
<string name="synced_icon">Synkronisert-ikon</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">Algemeen</string>
<string name="prefs_category_more">Meer</string>
<string name="prefs_manage_accounts">Accounts beheren</string>
<string name="prefs_passcode">Toegangscode</string>
<string name="prefs_fingerprint">Vingerafdrukbeveiliging</string>
<string name="prefs_fingerprint_notsetup">Er zijn geen vingerafdrukken ingesteld.</string>
<string name="prefs_expert_mode">Expertmodus</string>
<string name="prefs_show_hidden_files">Verborgen bestanden weergeven</string>
<string name="prefs_log_delete_history_button">Verwijder geschiedenis</string>
@ -599,9 +596,6 @@
<string name="whats_new_skip">Overslaan</string>
<string name="fingerprint_scan_finger">Scan je vinger</string>
<string name="fingerprint_unknown">Vinger niet herkend</string>
<!-- User information -->
<string name="user_info_email">Email</string>
<string name="user_info_phone">Telefoonnummer</string>
@ -675,7 +669,6 @@
<string name="activity_icon">Activiteitspictogram</string>
<string name="file_icon">Bestandpictogram</string>
<string name="user_icon">Gebruikerspictogram</string>
<string name="fingerprint_icon">Vingerafdrukpictogram</string>
<string name="favorite_icon">Favorietenpictogram</string>
<string name="shared_via_link_icon">Gedeeld via link icoon</string>
<string name="synced_icon">Gesynch\'d pictogram</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">Ogólne</string>
<string name="prefs_category_more">Więcej</string>
<string name="prefs_manage_accounts">Zarządzaj kontami</string>
<string name="prefs_passcode">Blokada kodem PIN</string>
<string name="prefs_fingerprint">Blokada odciskiem palca</string>
<string name="prefs_fingerprint_notsetup">Brak skonfigurowanych odcisków palców</string>
<string name="prefs_expert_mode">Tryb eksperta</string>
<string name="prefs_show_hidden_files">Pokaż ukryte pliki</string>
<string name="prefs_log_delete_history_button">Wyczyść historię</string>
@ -599,9 +596,6 @@
<string name="whats_new_ipv6_title">Wsparcie IPv6</string>
<string name="whats_new_skip">Pomiń</string>
<string name="fingerprint_scan_finger">Umieść palec na czytniku odcisku palca</string>
<string name="fingerprint_unknown">Nie rozpoznano odcisku palca</string>
<!-- User information -->
<string name="user_info_email">E-mail</string>
<string name="user_info_phone">Numer telefonu</string>
@ -664,7 +658,6 @@
<string name="activity_icon">Ikona aktywności</string>
<string name="file_icon">Ikona pliku</string>
<string name="user_icon">Ikona użytkownika</string>
<string name="fingerprint_icon">Ikona odcisku palca</string>
<string name="favorite_icon">Ikona ulubionych</string>
<string name="shared_via_link_icon">Ikona udostępniania przez link</string>
<string name="synced_icon">Ikona synchronizacji</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">Geral</string>
<string name="prefs_category_more">Mais</string>
<string name="prefs_manage_accounts">Gerenciar contas</string>
<string name="prefs_passcode">Bloqueio de código de acesso</string>
<string name="prefs_fingerprint">Bloqueio por impressão digital</string>
<string name="prefs_fingerprint_notsetup">Nenhuma impressão digital foi configurada.</string>
<string name="prefs_expert_mode">Modo avançado</string>
<string name="prefs_show_hidden_files">Mostrar arquivos ocultos</string>
<string name="prefs_log_delete_history_button">Eliminar histórico</string>
@ -602,9 +599,6 @@
<string name="whats_new_skip">Saltar</string>
<string name="fingerprint_scan_finger">Por favor escaneie sua impressão digital</string>
<string name="fingerprint_unknown">Impressão digital não reconhecida</string>
<!-- User information -->
<string name="user_info_email">Email</string>
<string name="user_info_phone">Número do telefone</string>
@ -679,7 +673,6 @@
<string name="activity_icon">Ícone de atividade</string>
<string name="file_icon">Ícone de arquivo</string>
<string name="user_icon">Ícone de usuário</string>
<string name="fingerprint_icon">Ícone de impressão digital</string>
<string name="favorite_icon">Ícone de favorito</string>
<string name="shared_via_link_icon">Ícone de compartilhamento via link</string>
<string name="synced_icon">Ícone de sincronizado</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">Основные</string>
<string name="prefs_category_more">Больше</string>
<string name="prefs_manage_accounts">Управление аккаунтами</string>
<string name="prefs_passcode">Блокировка кодом</string>
<string name="prefs_fingerprint">Блокировка отпечатком пальца</string>
<string name="prefs_fingerprint_notsetup">Отпечатки не были настроены.</string>
<string name="prefs_expert_mode">Экспертный режим</string>
<string name="prefs_show_hidden_files">Показывать скрытые файлы</string>
<string name="prefs_log_delete_history_button">Удалить историю</string>
@ -610,9 +607,6 @@
<string name="whats_new_skip">Пропустить</string>
<string name="fingerprint_scan_finger">Приложите палец</string>
<string name="fingerprint_unknown">Отпечаток не распознан</string>
<!-- User information -->
<string name="user_info_email">Email</string>
<string name="user_info_phone">Номер телефона</string>
@ -686,7 +680,6 @@
<string name="activity_icon">Значок события</string>
<string name="file_icon">Значок файла</string>
<string name="user_icon">Значок пользователя</string>
<string name="fingerprint_icon">Значок отпечатка пальца</string>
<string name="favorite_icon">Значок избранного</string>
<string name="shared_via_link_icon">Значок доступного по ссылке</string>
<string name="synced_icon">Значок синхронизированного содержимого</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">Všeobecné</string>
<string name="prefs_category_more">Viac</string>
<string name="prefs_manage_accounts">Spravovať účty</string>
<string name="prefs_passcode">Zámok bezpečnostného kódu</string>
<string name="prefs_fingerprint">Zámok odtlačkom prstu</string>
<string name="prefs_fingerprint_notsetup">Neboli nastavené žiadne odtlačky prstov.</string>
<string name="prefs_expert_mode">Expertný režim</string>
<string name="prefs_show_hidden_files">Zobraziť skryté súbory</string>
<string name="prefs_log_delete_history_button">Vymazať históriu</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">Splošno</string>
<string name="prefs_category_more">Več</string>
<string name="prefs_manage_accounts">Upravljanje z računi</string>
<string name="prefs_passcode">Zakleni dostop s kodo PIN</string>
<string name="prefs_fingerprint">Ključavnica na prstni odtis</string>
<string name="prefs_fingerprint_notsetup">Prstni odtis ni nasavljen.</string>
<string name="prefs_expert_mode">Napredni način</string>
<string name="prefs_show_hidden_files">Prikaži skrite datoteke</string>
<string name="prefs_log_delete_history_button">Izbriši zgodovino</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">Të përgjithshme</string>
<string name="prefs_category_more">Më tepër</string>
<string name="prefs_manage_accounts">Administroni llogaritë</string>
<string name="prefs_passcode">Kyçje kodkalimi</string>
<string name="prefs_fingerprint">Kyçuni me shenjat e gishtave</string>
<string name="prefs_fingerprint_notsetup">Shenjat e gishtave nuk janë vendosur</string>
<string name="prefs_expert_mode">Mënyra eksperte</string>
<string name="prefs_show_hidden_files">Trego skedarët e fshehur</string>
<string name="prefs_log_delete_history_button">Fshini historikun</string>
@ -602,9 +599,6 @@
<string name="whats_new_skip">Kalo</string>
<string name="fingerprint_scan_finger">Ju lutemi skanoni gishtin tuaj</string>
<string name="fingerprint_unknown">Gishti nuk u njoh</string>
<!-- User information -->
<string name="user_info_email">E-mail</string>
<string name="user_info_phone">Numri i telefonit</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">Опште</string>
<string name="prefs_category_more">Остало</string>
<string name="prefs_manage_accounts">Управљање налозима</string>
<string name="prefs_passcode">Закључавање кодом</string>
<string name="prefs_fingerprint">Закључавање отиском прста</string>
<string name="prefs_fingerprint_notsetup">Отисак прста није подешен.</string>
<string name="prefs_expert_mode">Експертски режим</string>
<string name="prefs_show_hidden_files">Прикажи скривене фајлове</string>
<string name="prefs_log_delete_history_button">Обриши историјат</string>
@ -607,9 +604,6 @@
<string name="whats_new_skip">Прескочи</string>
<string name="fingerprint_scan_finger">Молимо скенирајте Ваш прст</string>
<string name="fingerprint_unknown">Прст није препознат</string>
<!-- User information -->
<string name="user_info_email">Адреса е-поште</string>
<string name="user_info_phone">Број телефона</string>
@ -684,7 +678,6 @@
<string name="activity_icon">Икона активности</string>
<string name="file_icon">Икона фајла</string>
<string name="user_icon">Икона корисника</string>
<string name="fingerprint_icon">Икона отиска прста</string>
<string name="favorite_icon">Икона омиљених</string>
<string name="shared_via_link_icon">Икона дељења преко везе</string>
<string name="synced_icon">Икона синхронизоване ставке</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">Allmänt</string>
<string name="prefs_category_more">Mer</string>
<string name="prefs_manage_accounts">Hantera konton</string>
<string name="prefs_passcode">Kodlås</string>
<string name="prefs_fingerprint">Fingeravtryckslås</string>
<string name="prefs_fingerprint_notsetup">Inget fingeravtryck har konfigurerats.</string>
<string name="prefs_expert_mode">Expertläge</string>
<string name="prefs_show_hidden_files">Visa dolda filer</string>
<string name="prefs_log_delete_history_button">Radera historik</string>
@ -499,9 +496,6 @@
<string name="whats_new_skip">Hoppa över</string>
<string name="fingerprint_scan_finger">Vänligen skanna ditt finger</string>
<string name="fingerprint_unknown">Finger ej igenkänt</string>
<!-- User information -->
<string name="user_info_email">E-post</string>
<string name="user_info_phone">Telefonnummer</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">Genel</string>
<string name="prefs_category_more">Daha fazla</string>
<string name="prefs_manage_accounts">Hesap yönetimi</string>
<string name="prefs_passcode">Parola kod kilidi</string>
<string name="prefs_fingerprint">Parmak izi kilidi</string>
<string name="prefs_fingerprint_notsetup">Henüz bir parmak izi ayarlanmamış.</string>
<string name="prefs_expert_mode">Uzman kipi</string>
<string name="prefs_show_hidden_files">Gizli dosyaları görüntüle</string>
<string name="prefs_log_delete_history_button">Geçmişi sil</string>
@ -602,9 +599,6 @@
<string name="whats_new_skip">Atla</string>
<string name="fingerprint_scan_finger">Lütfen parmağınızı tarayın</string>
<string name="fingerprint_unknown">Parmak tanınamadı</string>
<!-- User information -->
<string name="user_info_email">E-posta</string>
<string name="user_info_phone">Telefon numarası</string>
@ -679,7 +673,6 @@
<string name="activity_icon">İşlem simgesi</string>
<string name="file_icon">Dosya simgesi</string>
<string name="user_icon">Kullanıcı simgesi</string>
<string name="fingerprint_icon">Parmakizi simgesi</string>
<string name="favorite_icon">Sık kullanılanlar simgesi</string>
<string name="shared_via_link_icon">Bağlantı ile paylaşılmış simgesi</string>
<string name="synced_icon">Eşitlenmiş simgesi</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">常规</string>
<string name="prefs_category_more">更多</string>
<string name="prefs_manage_accounts">管理账号</string>
<string name="prefs_passcode">安全码锁</string>
<string name="prefs_fingerprint">指纹锁</string>
<string name="prefs_fingerprint_notsetup">未设置指纹。</string>
<string name="prefs_expert_mode">专家模式</string>
<string name="prefs_show_hidden_files">显示隐藏文件</string>
<string name="prefs_log_delete_history_button">删除历史</string>
@ -551,9 +548,6 @@
<string name="whats_new_skip">跳过</string>
<string name="fingerprint_scan_finger">请扫描你的手指</string>
<string name="fingerprint_unknown">手指未被识别</string>
<!-- User information -->
<string name="user_info_email">邮件</string>
<string name="user_info_phone">电话号码</string>

View file

@ -39,9 +39,6 @@
<string name="prefs_category_general">一般</string>
<string name="prefs_category_more">更多</string>
<string name="prefs_manage_accounts">管理帳戶</string>
<string name="prefs_passcode">密碼鎖</string>
<string name="prefs_fingerprint">指紋上鎖</string>
<string name="prefs_fingerprint_notsetup">尚未設置任何指紋。</string>
<string name="prefs_expert_mode">專家模式</string>
<string name="prefs_show_hidden_files">顯示隱藏檔案</string>
<string name="prefs_log_delete_history_button">刪除記錄</string>
@ -482,8 +479,6 @@
<string name="whats_new_skip">略過</string>
<string name="fingerprint_scan_finger">請掃描您的指紋</string>
<string name="fingerprint_unknown">不認識的指紋</string>
<!-- User information -->
<string name="user_info_email">E-mail</string>

View file

@ -112,7 +112,6 @@
<dimen name="grid_image_kept_offline_icon_layout_height">16dp</dimen>
<dimen name="grid_image_kept_offline_icon_layout_right_end_margin">24dp</dimen>
<dimen name="grid_item_shared_icon_layout_top_margin">24dp</dimen>
<dimen name="scan_fingerprint_text_size">32sp</dimen>
<dimen name="grid_item_local_file_indicator_layout_width">16dp</dimen>
<dimen name="grid_item_local_file_indicator_layout_height">16dp</dimen>
<dimen name="grid_item_kept_offline_icon_layout_width">16dp</dimen>

View file

@ -89,8 +89,17 @@
<bool name="bottom_toolbar_enabled">false</bool>
<!-- Help, imprint and feedback, and other things -->
<bool name="fingerprint_enabled">true</bool>
<bool name="passcode_enabled">true</bool>
<bool name="device_credentials_enabled">true</bool>
<string name="secret_key_name">Nextcloud</string>
<integer-array name="secret_byte_array">
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
<item>6</item>
</integer-array>
<bool name="show_hidden_files_enabled">true</bool>
<bool name="davdroid_integration_enabled">true</bool>
<bool name="help_enabled">true</bool>

View file

@ -39,9 +39,13 @@
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">More</string>
<string name="prefs_manage_accounts">Manage accounts</string>
<string name="prefs_passcode">Passcode lock</string>
<string name="prefs_fingerprint">Fingerprint lock</string>
<string name="prefs_fingerprint_notsetup">No fingerprints have been set up.</string>
<string name="prefs_lock">Lock</string>
<string name="prefs_lock_title">Lock using</string>
<string name="prefs_lock_none">None</string>
<string name="prefs_lock_using_passcode">Passcode</string>
<string name="prefs_lock_using_device_credentials">Device credentials</string>
<string name="prefs_lock_device_credentials_enabled">Device credentials enabled</string>
<string name="prefs_lock_device_credentials_not_setup">No device credentials have been set up.</string>
<string name="prefs_expert_mode">Expert mode</string>
<string name="prefs_show_hidden_files">Show hidden files</string>
<string name="prefs_log_delete_history_button">Delete history</string>
@ -200,6 +204,8 @@
<string name="foreign_files_remote_text">Remote: %1$s</string>
<string name="upload_query_move_foreign_files">Insufficient space prevents copying the selected files into the %1$s folder. Would you like to move them there instead?</string>
<string name="pass_code_enter_pass_code">Please enter your passcode</string>
<string name="default_credentials_wrong">Incorrect credentials</string>
<string name="credentials_disabled">Credentials disabled</string>
<string name="pass_code_configure_your_pass_code">Enter your passcode</string>
<string name="pass_code_configure_your_pass_code_explanation">The passcode will be requested every time the app is started</string>
@ -615,9 +621,6 @@
<string name="whats_new_skip">Skip</string>
<string name="fingerprint_scan_finger">Please scan your finger</string>
<string name="fingerprint_unknown">Finger not recognized</string>
<!-- User information -->
<string name="user_info_email">E-mail</string>
<string name="user_info_phone">Phone number</string>
@ -694,7 +697,6 @@
<string name="activity_icon">Activity icon</string>
<string name="file_icon">File icon</string>
<string name="user_icon">User icon</string>
<string name="fingerprint_icon">Fingerprint icon</string>
<string name="favorite_icon">Favorite icon</string>
<string name="shared_via_link_icon">Shared via link icon</string>
<string name="synced_icon">Synced icon</string>
@ -792,4 +794,6 @@
<string name="sharee_add_failed">Adding sharee failed</string>
<string name="unsharing_failed">Unsharing failed</string>
<string name="updating_share_failed">Updating share failed</string>
<string name="whats_new_device_credentials_title">Use Android device protection</string>
<string name="whats_new_device_credentials_content">Use anything like a pattern, password, pin or your fingerprint to keep your data safe.</string>
</resources>

View file

@ -39,12 +39,11 @@
</PreferenceCategory>
<PreferenceCategory android:title="@string/prefs_category_details" android:key="details">
<com.owncloud.android.ui.ThemeableSwitchPreference
android:title="@string/prefs_passcode"
android:key="set_pincode"/>
<com.owncloud.android.ui.ThemeableSwitchPreference
android:title="@string/prefs_fingerprint"
android:key="use_fingerprint"/>
<ListPreference
android:title="@string/prefs_lock"
android:key="lock"
android:dialogTitle="@string/prefs_lock_title"
android:defaultValue="none"/>
<com.owncloud.android.ui.ThemeableSwitchPreference
android:title="@string/prefs_show_hidden_files"
android:key="show_hidden_files"/>