mirror of
https://github.com/nextcloud/android.git
synced 2024-11-24 06:05:42 +03:00
Merge pull request #1657 from rhari991/device-credentials-unlock
Add support for device credentials
This commit is contained in:
commit
b5bc9b6578
69 changed files with 546 additions and 844 deletions
97
drawable_resources/whats_new_device_credentials.svg
Normal file
97
drawable_resources/whats_new_device_credentials.svg
Normal 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 |
1
lint.xml
1
lint.xml
|
@ -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"/>
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
BIN
src/main/res/drawable-hdpi/whats_new_device_credentials.png
Normal file
BIN
src/main/res/drawable-hdpi/whats_new_device_credentials.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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"/>
|
||||
|
|
Loading…
Reference in a new issue