Merge pull request #1 from SimpleMobileTools/master

update fork
This commit is contained in:
solokot 2017-10-03 16:49:02 +03:00 committed by GitHub
commit 69d35d6af6
55 changed files with 848 additions and 205 deletions

190
LICENSE
View file

@ -1,4 +1,192 @@
Copyright 2016 SimpleMobileTools
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2017 SimpleMobileTools
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.

View file

@ -16,6 +16,8 @@ buildscript {
allprojects {
repositories {
jcenter()
maven { url 'https://maven.google.com' }
maven { url 'https://jitpack.io' }
}
}
@ -24,12 +26,12 @@ task clean(type: Delete) {
}
ext {
propBuildToolsVersion = '25.0.2'
propBuildToolsVersion = '25.0.0'
propCompileSdkVersion = 25
propMinSdkVersion = 16
propTargetSdkVersion = propCompileSdkVersion
propVersionCode = 1
propVersionName = '2.27.9'
kotlin_version = '1.1.4-3'
propVersionName = '2.29.2'
kotlin_version = '1.1.51'
support_libs = '25.3.1'
}

View file

@ -31,7 +31,9 @@ dependencies {
compile 'com.github.bumptech.glide:glide:4.0.0'
compile 'com.booking:rtlviewpager:1.0.1'
compile 'com.andrognito.patternlockview:patternlockview:1.0.0'
compile 'com.github.ajalt.reprint:core:3.1.0@aar'
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
annotationProcessor 'com.github.bumptech.glide:compiler:4.0.0'
}

View file

@ -2,32 +2,43 @@ package com.simplemobiletools.commons.adapters
import android.content.Context
import android.support.v4.view.PagerAdapter
import android.util.SparseArray
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.simplemobiletools.commons.R
import com.simplemobiletools.commons.extensions.isFingerPrintSensorAvailable
import com.simplemobiletools.commons.interfaces.HashListener
import com.simplemobiletools.commons.interfaces.SecurityTab
class PasswordTypesAdapter(val context: Context, val requiredHash: String, val hashListener: HashListener) : PagerAdapter() {
private val tabs = SparseArray<SecurityTab>()
override fun instantiateItem(container: ViewGroup, position: Int): Any {
val view = LayoutInflater.from(context).inflate(layoutSelection(position), container, false)
container.addView(view)
tabs.put(position, view as SecurityTab)
(view as SecurityTab).initTab(requiredHash, hashListener)
return view
}
override fun destroyItem(container: ViewGroup, position: Int, item: Any) {
tabs.remove(position)
container.removeView(item as View)
}
override fun getCount() = 2
override fun getCount() = if (context.isFingerPrintSensorAvailable()) 3 else 2
override fun isViewFromObject(view: View, item: Any) = view == item
private fun layoutSelection(position: Int): Int = when (position) {
0 -> R.layout.tab_pattern
1 -> R.layout.tab_pin
else -> throw RuntimeException("Only 2 tabs allowed")
2 -> R.layout.tab_fingerprint
else -> throw RuntimeException("Only 3 tabs allowed")
}
fun isTabVisible(position: Int, isVisible: Boolean) {
tabs[position]?.visibilityChanged(isVisible)
}
}

View file

@ -106,7 +106,7 @@ class ColorPickerDialog(val context: Context, color: Int, val callback: (color:
}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
if ((count == 1 && s.length == 6) || (count == 6 && before == 0)) {
if ((count == 1 && s.length == 6) || (count == 6 && before == 0) || (count == 6 && before == 5)) {
val newColor = Color.parseColor("#$s")
Color.colorToHSV(newColor, currentColorHsv)
updateHue()

View file

@ -42,9 +42,13 @@ class CreateNewFolderDialog(val activity: BaseSimpleActivity, val path: String,
private fun createFolder(file: File, alertDialog: AlertDialog) {
if (activity.needsStupidWritePermissions(file.absolutePath)) {
activity.handleSAFDialog(file) {
try {
val documentFile = activity.getFileDocument(file.absolutePath)
documentFile?.createDirectory(file.name)
sendSuccess(alertDialog, file)
} catch (e: SecurityException) {
activity.showErrorToast(e)
}
}
} else if (file.mkdirs()) {
sendSuccess(alertDialog, file)

View file

@ -127,7 +127,7 @@ class PropertiesDialog() {
exif.getAttribute(ExifInterface.TAG_DATETIME).let {
if (it?.isNotEmpty() == true) {
try {
val simpleDateFormat = SimpleDateFormat("yyyy:MM:dd HH:mm:ss", Locale.ENGLISH)
val simpleDateFormat = SimpleDateFormat("yyyy:MM:dd kk:mm:ss", Locale.ENGLISH)
val dateTaken = simpleDateFormat.parse(it).time.formatLastModified()
addProperty(R.string.date_taken, dateTaken)
} catch (ignored: Exception) {

View file

@ -4,12 +4,17 @@ import android.support.design.widget.TabLayout
import android.support.v4.view.ViewPager
import android.support.v7.app.AlertDialog
import android.view.LayoutInflater
import android.view.ViewTreeObserver
import com.simplemobiletools.commons.R
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.adapters.PasswordTypesAdapter
import com.simplemobiletools.commons.extensions.baseConfig
import com.simplemobiletools.commons.extensions.beGone
import com.simplemobiletools.commons.extensions.isFingerPrintSensorAvailable
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.helpers.PROTECTION_FINGERPRINT
import com.simplemobiletools.commons.helpers.PROTECTION_PATTERN
import com.simplemobiletools.commons.helpers.PROTECTION_PIN
import com.simplemobiletools.commons.helpers.SHOW_ALL_TABS
import com.simplemobiletools.commons.interfaces.HashListener
import com.simplemobiletools.commons.views.MyDialogViewPager
@ -18,11 +23,15 @@ import kotlinx.android.synthetic.main.dialog_security.view.*
class SecurityDialog(val activity: BaseSimpleActivity, val requiredHash: String, val showTabIndex: Int, val callback: (hash: String, type: Int) -> Unit) : HashListener {
var dialog: AlertDialog? = null
val view = LayoutInflater.from(activity).inflate(R.layout.dialog_security, null)
lateinit var tabsAdapter: PasswordTypesAdapter
lateinit var viewPager: MyDialogViewPager
init {
view.apply {
val viewPager = findViewById(R.id.dialog_tab_view_pager) as MyDialogViewPager
viewPager.adapter = PasswordTypesAdapter(context, requiredHash, this@SecurityDialog)
viewPager = findViewById(R.id.dialog_tab_view_pager) as MyDialogViewPager
viewPager.offscreenPageLimit = 2
tabsAdapter = PasswordTypesAdapter(context, requiredHash, this@SecurityDialog)
viewPager.adapter = tabsAdapter
viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) {
}
@ -35,8 +44,19 @@ class SecurityDialog(val activity: BaseSimpleActivity, val requiredHash: String,
}
})
viewPager.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
viewPager.viewTreeObserver.removeOnGlobalLayoutListener(this)
updateTabVisibility()
}
})
if (showTabIndex == SHOW_ALL_TABS) {
val textColor = context.baseConfig.textColor
if (!activity.isFingerPrintSensorAvailable())
dialog_tab_layout.removeTabAt(PROTECTION_FINGERPRINT)
dialog_tab_layout.setTabTextColors(textColor, textColor)
dialog_tab_layout.setSelectedTabIndicatorColor(context.baseConfig.primaryColor)
dialog_tab_layout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
@ -47,11 +67,13 @@ class SecurityDialog(val activity: BaseSimpleActivity, val requiredHash: String,
}
override fun onTabSelected(tab: TabLayout.Tab) {
if (tab.text.toString().equals(resources.getString(R.string.pattern), true)) {
viewPager.currentItem = 0
} else {
viewPager.currentItem = 1
when {
tab.text.toString().equals(resources.getString(R.string.pattern), true) -> viewPager.currentItem = PROTECTION_PATTERN
tab.text.toString().equals(resources.getString(R.string.pin), true) -> viewPager.currentItem = PROTECTION_PIN
else -> viewPager.currentItem = PROTECTION_FINGERPRINT
}
updateTabVisibility()
}
})
} else {
@ -72,4 +94,10 @@ class SecurityDialog(val activity: BaseSimpleActivity, val requiredHash: String,
callback(hash, type)
dialog!!.dismiss()
}
private fun updateTabVisibility() {
for (i in 0..2) {
tabsAdapter.isTabVisible(i, viewPager.currentItem == i)
}
}
}

View file

@ -56,15 +56,18 @@ fun Activity.showErrorToast(exception: Exception, length: Int = Toast.LENGTH_LON
@SuppressLint("NewApi")
fun Activity.storeStoragePaths() {
if (baseConfig.appRunCount == 0) {
baseConfig.internalStoragePath = getInternalStoragePath()
Thread({
baseConfig.sdCardPath = getSDCardPath().trimEnd('/')
}).start()
}
baseConfig.appRunCount++
if (!isThankYouInstalled() && (baseConfig.appRunCount == 50 || baseConfig.appRunCount == 300 || baseConfig.appRunCount == 1000)) {
DonateDialog(this)
}
Thread({
baseConfig.internalStoragePath = getInternalStoragePath()
baseConfig.sdCardPath = getSDCardPath().trimEnd('/')
}).start()
}
fun Activity.isShowingSAFDialog(file: File, treeUri: String, requestCode: Int): Boolean {
@ -234,7 +237,9 @@ fun BaseSimpleActivity.deleteFileBg(file: File, allowDeleteFolder: Boolean = fal
fileDeleted = tryFastDocumentDelete(file, allowDeleteFolder)
if (!fileDeleted) {
val document = getFileDocument(file.absolutePath)
fileDeleted = (document?.isFile == true || allowDeleteFolder) && DocumentsContract.deleteDocument(contentResolver, document?.uri)
if (document != null && (file.isDirectory == document.isDirectory)) {
fileDeleted = (document.isFile == true || allowDeleteFolder) && DocumentsContract.deleteDocument(contentResolver, document.uri)
}
}
if (fileDeleted) {
@ -254,7 +259,7 @@ fun BaseSimpleActivity.rescanDeletedFile(file: File, callback: () -> Unit) {
MediaScannerConnection.scanFile(applicationContext, arrayOf(file.absolutePath), null, { s, uri ->
try {
contentResolver.delete(uri, null, null)
} catch (ignored: Exception) {
} catch (e: Exception) {
}
callback()
})
@ -276,7 +281,7 @@ fun BaseSimpleActivity.renameFile(oldFile: File, newFile: File, callback: (succe
if (needsStupidWritePermissions(newFile.absolutePath)) {
handleSAFDialog(newFile) {
val document = getFileDocument(oldFile.absolutePath)
if (document == null) {
if (document == null || (oldFile.isDirectory != document.isDirectory)) {
callback(false)
return@handleSAFDialog
}
@ -291,7 +296,7 @@ fun BaseSimpleActivity.renameFile(oldFile: File, newFile: File, callback: (succe
callback(false)
}
} catch (e: SecurityException) {
toast(R.string.unknown_error_occurred)
showErrorToast(e)
callback(false)
}
}
@ -304,8 +309,10 @@ fun BaseSimpleActivity.renameFile(oldFile: File, newFile: File, callback: (succe
}
} else {
updateInMediaStore(oldFile, newFile)
scanFile(newFile) {
callback(true)
}
}
} else {
callback(false)
}

View file

@ -27,7 +27,7 @@ fun Context.getSDCardPath(): String {
return ""
}
val directories = getStorageDirectories().filter { it.trimEnd('/') != internalStoragePath }
val directories = getStorageDirectories().filter { it.trimEnd('/') != getInternalStoragePath() }
val sdCardPath = directories.firstOrNull { !physicalPaths.contains(it.toLowerCase().trimEnd('/')) } ?: directories.firstOrNull() ?: ""
return sdCardPath.trimEnd('/')
}
@ -97,12 +97,6 @@ fun Context.getInternalStoragePath() = Environment.getExternalStorageDirectory()
@SuppressLint("NewApi")
fun Context.isPathOnSD(path: String) = sdCardPath.isNotEmpty() && path.startsWith(sdCardPath)
fun Context.isKitkatPlus() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT
fun Context.isLollipopPlus() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP
fun Context.isNougatPlus() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
@SuppressLint("NewApi")
fun Context.needsStupidWritePermissions(path: String) = isPathOnSD(path) && isLollipopPlus()

View file

@ -1,10 +1,16 @@
package com.simplemobiletools.commons.extensions
import android.Manifest
import android.annotation.SuppressLint
import android.content.Context
import android.content.pm.PackageManager
import android.database.Cursor
import android.graphics.drawable.ColorDrawable
import android.net.Uri
import android.os.Build
import android.os.Looper
import android.provider.BaseColumns
import android.provider.MediaStore
import android.support.v4.content.ContextCompat
import android.support.v7.app.AlertDialog
import android.view.LayoutInflater
@ -13,12 +19,14 @@ import android.view.ViewGroup
import android.view.Window
import android.widget.TextView
import android.widget.Toast
import com.github.ajalt.reprint.core.Reprint
import com.simplemobiletools.commons.R
import com.simplemobiletools.commons.helpers.BaseConfig
import com.simplemobiletools.commons.helpers.PREFS_KEY
import com.simplemobiletools.commons.views.*
import kotlinx.android.synthetic.main.dialog_title.view.*
fun Context.isOnMainThread() = Looper.myLooper() == Looper.getMainLooper()
fun Context.getSharedPrefs() = getSharedPreferences(PREFS_KEY, Context.MODE_PRIVATE)
@ -27,6 +35,14 @@ fun Context.hasWriteStoragePermission() = ContextCompat.checkSelfPermission(this
fun Context.hasCameraPermission() = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
fun Context.hasRecordAudioPermission() = ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED
fun Context.isKitkatPlus() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT
fun Context.isLollipopPlus() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP
fun Context.isMarshmallowPlus() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
fun Context.isNougatPlus() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
fun Context.updateTextColors(viewGroup: ViewGroup, tmpTextColor: Int = 0, tmpAccentColor: Int = 0) {
val textColor = if (tmpTextColor == 0) baseConfig.textColor else tmpTextColor
val accentColor = if (tmpAccentColor == 0) baseConfig.primaryColor else tmpAccentColor
@ -113,3 +129,21 @@ fun Context.isThankYouInstalled(): Boolean {
false
}
}
@SuppressLint("InlinedApi", "NewApi")
fun Context.isFingerPrintSensorAvailable() = isMarshmallowPlus() && Reprint.isHardwarePresent()
fun Context.getLatestMediaId(uri: Uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI): Long {
val projection = arrayOf(BaseColumns._ID)
val sortOrder = "${MediaStore.Images.ImageColumns.DATE_TAKEN} DESC"
var cursor: Cursor? = null
try {
cursor = contentResolver.query(uri, projection, null, null, sortOrder)
if (cursor?.moveToFirst() == true) {
return cursor.getLongValue(BaseColumns._ID)
}
} finally {
cursor?.close()
}
return 0
}

View file

@ -11,10 +11,11 @@ fun File.isImageVideoGif() = absolutePath.isImageFast() || absolutePath.isVideoF
fun File.isGif() = absolutePath.endsWith(".gif", true)
fun File.isVideoFast() = absolutePath.videoExtensions.any { absolutePath.endsWith(it, true) }
fun File.isImageFast() = absolutePath.photoExtensions.any { absolutePath.endsWith(it, true) }
fun File.isAudioFast() = absolutePath.audioExtensions.any { absolutePath.endsWith(it, true) }
fun File.isImageSlow() = absolutePath.isImageFast() || getMimeType().startsWith("image")
fun File.isVideoSlow() = absolutePath.isVideoFast() || getMimeType().startsWith("video")
fun File.isAudioSlow() = getMimeType().startsWith("audio")
fun File.isAudioSlow() = absolutePath.isAudioFast() || getMimeType().startsWith("audio")
fun File.getMimeType(default: String = getDefaultMimeType()): String {
try {

View file

@ -16,5 +16,5 @@ fun Long.formatSize(): String {
fun Long.formatLastModified(): String {
val cal = Calendar.getInstance(Locale.ENGLISH)
cal.timeInMillis = this
return DateFormat.format("dd.MM.yyyy HH:mm", cal).toString()
return DateFormat.format("dd.MM.yyyy kk:mm", cal).toString()
}

View file

@ -0,0 +1,15 @@
package com.simplemobiletools.commons.extensions
import android.widget.RemoteViews
fun RemoteViews.setBackgroundColor(id: Int, color: Int) {
setInt(id, "setBackgroundColor", color)
}
fun RemoteViews.setTextSize(id: Int, size: Float) {
setFloat(id, "setTextSize", size)
}
fun RemoteViews.setText(id: Int, text: String) {
setTextViewText(id, text)
}

View file

@ -27,6 +27,7 @@ fun String.isAValidFilename(): Boolean {
val String.photoExtensions: Array<String> get() = arrayOf(".jpg", ".png", ".jpeg", ".bmp", ".webp")
val String.videoExtensions: Array<String> get() = arrayOf(".mp4", ".mkv", ".webm", ".avi", ".3gp", ".mov", ".m4v")
val String.audioExtensions: Array<String> get() = arrayOf(".mp3", ".wav", ".wma", ".ogg", ".m4a")
fun String.isImageVideoGif() = isImageFast() || isVideoFast() || isGif()
@ -34,11 +35,10 @@ fun String.isGif() = endsWith(".gif", true)
fun String.isPng() = endsWith(".png", true)
// fast extension check, not guaranteed to be accurate
// fast extension checks, not guaranteed to be accurate
fun String.isVideoFast() = videoExtensions.any { endsWith(it, true) }
// fast extension check, not guaranteed to be accurate
fun String.isImageFast() = photoExtensions.any { endsWith(it, true) }
fun String.isAudioFast() = audioExtensions.any { endsWith(it, true) }
fun String.areDigitsOnly() = matches(Regex("[0-9]+"))

View file

@ -2,7 +2,7 @@ package com.simplemobiletools.commons.helpers
// taken from https://gist.github.com/MichaelRocks/1b94bb44c7804e999dbf31dac86955ec
// make IMG_5.jpg come before IMG_10.jpg
class AlphanumComparator {
class AlphanumericComparator {
fun compare(string1: String, string2: String): Int {
var thisMarker = 0
var thatMarker = 0

View file

@ -60,3 +60,4 @@ val PROTECTION_FINGERPRINT = 2
val SHOW_ALL_TABS = -1
val SHOW_PATTERN = 0
val SHOW_PIN = 1
val SHOW_FINGERPRINT = 2

View file

@ -2,4 +2,6 @@ package com.simplemobiletools.commons.interfaces
interface SecurityTab {
fun initTab(requiredHash: String, listener: HashListener)
fun visibilityChanged(isVisible: Boolean)
}

View file

@ -1,13 +1,12 @@
package com.simplemobiletools.commons.views
import android.content.Context
import android.graphics.Point
import android.graphics.PorterDuff
import android.graphics.PorterDuffColorFilter
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.view.WindowManager
import android.view.ViewTreeObserver
import android.widget.LinearLayout
import com.simplemobiletools.commons.R
import com.simplemobiletools.commons.extensions.baseConfig
@ -17,30 +16,28 @@ import com.simplemobiletools.commons.models.FileDirItem
import kotlinx.android.synthetic.main.breadcrumb_item.view.*
class Breadcrumbs(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs), View.OnClickListener {
private var mDeviceWidth: Int = 0
private var availableWidth = 0
private var mInflater: LayoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
private var mListener: BreadcrumbsListener? = null
private var mTextColor = 0
private var inflater: LayoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
private var listener: BreadcrumbsListener? = null
private var textColor = 0
init {
mDeviceWidth = getDeviceWidth()
mTextColor = context.baseConfig.textColor
textColor = context.baseConfig.textColor
viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
viewTreeObserver.removeOnGlobalLayoutListener(this)
availableWidth = width
}
})
}
fun setListener(listener: BreadcrumbsListener) {
mListener = listener
this.listener = listener
}
fun setTextColor(color: Int) {
mTextColor = color
}
fun getDeviceWidth(): Int {
val display = (context.getSystemService(Context.WINDOW_SERVICE) as WindowManager).defaultDisplay
val deviceDisplay = Point()
display.getSize(deviceDisplay)
return deviceDisplay.x
textColor = color
}
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
@ -48,7 +45,7 @@ class Breadcrumbs(context: Context, attrs: AttributeSet) : LinearLayout(context,
val childBottom = measuredHeight - paddingBottom
val childHeight = childBottom - paddingTop
val usableWidth = mDeviceWidth - paddingLeft - paddingRight
val usableWidth = availableWidth - paddingLeft - paddingRight
var maxHeight = 0
var curWidth: Int
var curHeight: Int
@ -56,7 +53,7 @@ class Breadcrumbs(context: Context, attrs: AttributeSet) : LinearLayout(context,
var curTop = paddingTop
val cnt = childCount
for (i in 0..cnt - 1) {
for (i in 0 until cnt) {
val child = getChildAt(i)
child.measure(MeasureSpec.makeMeasureSpec(usableWidth, MeasureSpec.AT_MOST),
@ -79,13 +76,13 @@ class Breadcrumbs(context: Context, attrs: AttributeSet) : LinearLayout(context,
}
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
val usableWidth = mDeviceWidth - paddingLeft - paddingRight
val usableWidth = availableWidth - paddingLeft - paddingRight
var width = 0
var rowHeight = 0
var lines = 1
val cnt = childCount
for (i in 0..cnt - 1) {
for (i in 0 until cnt) {
val child = getChildAt(i)
measureChild(child, widthMeasureSpec, heightMeasureSpec)
width += child.measuredWidth
@ -127,7 +124,7 @@ class Breadcrumbs(context: Context, attrs: AttributeSet) : LinearLayout(context,
}
private fun addBreadcrumb(item: FileDirItem, addPrefix: Boolean) {
mInflater.inflate(R.layout.breadcrumb_item, null, false).apply {
inflater.inflate(R.layout.breadcrumb_item, null, false).apply {
var textToAdd = item.name
if (addPrefix)
textToAdd = "/ $textToAdd"
@ -135,14 +132,14 @@ class Breadcrumbs(context: Context, attrs: AttributeSet) : LinearLayout(context,
if (childCount == 0) {
resources.apply {
background = getDrawable(R.drawable.breadcrumb_gradient)
background.colorFilter = PorterDuffColorFilter(mTextColor, PorterDuff.Mode.SRC_IN)
background.colorFilter = PorterDuffColorFilter(textColor, PorterDuff.Mode.SRC_IN)
val medium = getDimension(R.dimen.medium_margin).toInt()
setPadding(medium, medium, medium, medium)
}
}
breadcrumb_text.text = textToAdd
breadcrumb_text.setTextColor(mTextColor)
breadcrumb_text.setTextColor(textColor)
addView(this)
setOnClickListener(this@Breadcrumbs)
@ -158,9 +155,9 @@ class Breadcrumbs(context: Context, attrs: AttributeSet) : LinearLayout(context,
override fun onClick(v: View) {
val cnt = childCount
for (i in 0..cnt - 1) {
for (i in 0 until cnt) {
if (getChildAt(i) != null && getChildAt(i) == v) {
mListener?.breadcrumbClicked(i)
listener?.breadcrumbClicked(i)
}
}
}

View file

@ -78,6 +78,23 @@ class FastScroller : FrameLayout {
}
override fun onTouchEvent(event: MotionEvent): Boolean {
// allow dragging only the handle itself
if (!handle!!.isSelected) {
if (isHorizontal) {
val min = handle!!.x
val max = min + handle!!.width
if (event.x < min || event.x > max) {
return super.onTouchEvent(event)
}
} else {
val min = handle!!.y
val max = min + handle!!.height
if (event.y < min || event.y > max) {
return super.onTouchEvent(event)
}
}
}
return when (event.action) {
MotionEvent.ACTION_DOWN -> {
showHandle()

View file

@ -0,0 +1,81 @@
package com.simplemobiletools.commons.views
import android.content.Context
import android.content.Intent
import android.graphics.PorterDuff
import android.graphics.PorterDuffColorFilter
import android.os.Handler
import android.provider.Settings
import android.util.AttributeSet
import android.widget.RelativeLayout
import com.github.ajalt.reprint.core.AuthenticationFailureReason
import com.github.ajalt.reprint.core.AuthenticationListener
import com.github.ajalt.reprint.core.Reprint
import com.simplemobiletools.commons.R
import com.simplemobiletools.commons.extensions.baseConfig
import com.simplemobiletools.commons.extensions.beGoneIf
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.extensions.updateTextColors
import com.simplemobiletools.commons.helpers.PROTECTION_FINGERPRINT
import com.simplemobiletools.commons.interfaces.HashListener
import com.simplemobiletools.commons.interfaces.SecurityTab
import kotlinx.android.synthetic.main.tab_fingerprint.view.*
class FingerprintTab(context: Context, attrs: AttributeSet) : RelativeLayout(context, attrs), SecurityTab {
private val RECHECK_PERIOD = 3000L
private val registerHandler = Handler()
lateinit var hashListener: HashListener
override fun onFinishInflate() {
super.onFinishInflate()
val textColor = context.baseConfig.textColor
context.updateTextColors(fingerprint_lock_holder)
fingerprint_image.colorFilter = PorterDuffColorFilter(textColor, PorterDuff.Mode.SRC_IN)
fingerprint_settings.setOnClickListener {
context.startActivity(Intent(Settings.ACTION_SETTINGS))
}
}
override fun initTab(requiredHash: String, listener: HashListener) {
hashListener = listener
}
override fun visibilityChanged(isVisible: Boolean) {
if (isVisible) {
checkRegisteredFingerprints()
} else {
Reprint.cancelAuthentication()
}
}
private fun checkRegisteredFingerprints() {
val hasFingerprints = Reprint.hasFingerprintRegistered()
fingerprint_settings.beGoneIf(hasFingerprints)
fingerprint_label.text = context.getString(if (hasFingerprints) R.string.place_finger else R.string.no_fingerprints_registered)
Reprint.authenticate(object : AuthenticationListener {
override fun onSuccess(moduleTag: Int) {
hashListener.receivedHash("", PROTECTION_FINGERPRINT)
}
override fun onFailure(failureReason: AuthenticationFailureReason, fatal: Boolean, errorMessage: CharSequence?, moduleTag: Int, errorCode: Int) {
when (failureReason) {
AuthenticationFailureReason.AUTHENTICATION_FAILED -> context.toast(R.string.authentication_failed)
AuthenticationFailureReason.LOCKED_OUT -> context.toast(R.string.authentication_blocked)
}
}
})
registerHandler.postDelayed({
checkRegisteredFingerprints()
}, RECHECK_PERIOD)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
registerHandler.removeCallbacksAndMessages(null)
Reprint.cancelAuthentication()
}
}

View file

@ -14,9 +14,7 @@ class MyDialogViewPager : ViewPager {
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
// disable manual swiping of viewpager at the dialog by swiping over the pattern
override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
return false
}
override fun onInterceptTouchEvent(ev: MotionEvent) = false
override fun onTouchEvent(ev: MotionEvent): Boolean {
if (!allowSwiping)
@ -33,7 +31,7 @@ class MyDialogViewPager : ViewPager {
// https://stackoverflow.com/a/20784791/1967672
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
var height = 0
for (i in 0..childCount - 1) {
for (i in 0 until childCount) {
val child = getChildAt(i)
child.measure(widthMeasureSpec, View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED))
val h = child.measuredHeight

View file

@ -32,11 +32,9 @@ class PatternTab(context: Context, attrs: AttributeSet) : RelativeLayout(context
receivedHash(PatternLockUtils.patternToSha1(pattern_lock_view, pattern))
}
override fun onCleared() {
}
override fun onCleared() {}
override fun onStarted() {
}
override fun onStarted() {}
override fun onProgress(progressPattern: MutableList<PatternLockView.Dot>?) {
}
@ -50,16 +48,19 @@ class PatternTab(context: Context, attrs: AttributeSet) : RelativeLayout(context
}
private fun receivedHash(newHash: String) {
if (hash.isEmpty()) {
when {
hash.isEmpty() -> {
hash = newHash
pattern_lock_view.clearPattern()
pattern_lock_title.setText(R.string.repeat_pattern)
} else if (hash == newHash) {
}
hash == newHash -> {
pattern_lock_view.setViewMode(PatternLockView.PatternViewMode.CORRECT)
Handler().postDelayed({
hashListener.receivedHash(hash, PROTECTION_PATTERN)
}, 300)
} else {
}
else -> {
pattern_lock_view.setViewMode(PatternLockView.PatternViewMode.WRONG)
context.toast(R.string.wrong_pattern)
Handler().postDelayed({
@ -72,3 +73,6 @@ class PatternTab(context: Context, attrs: AttributeSet) : RelativeLayout(context
}
}
}
override fun visibilityChanged(isVisible: Boolean) {}
}

View file

@ -97,4 +97,6 @@ class PinTab(context: Context, attrs: AttributeSet) : RelativeLayout(context, at
val bigInteger = BigInteger(1, digest)
return String.format(Locale.getDefault(), "%0${digest.size * 2}x", bigInteger).toLowerCase()
}
override fun visibilityChanged(isVisible: Boolean) {}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

View file

@ -22,6 +22,12 @@
android:layout_height="wrap_content"
android:text="@string/pin"/>
<android.support.design.widget.TabItem
android:id="@+id/dialog_tab_fingerprint"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/fingerprint"/>
</android.support.design.widget.TabLayout>
<com.simplemobiletools.commons.views.MyDialogViewPager

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/list_item_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -30,15 +31,15 @@
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="3"
android:text="Directory"/>
tools:text="Directory"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/list_item_details"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/list_item_name"
android:text="1 KB"
android:textSize="@dimen/smaller_text_size"/>
android:textSize="@dimen/smaller_text_size"
tools:text="1 KB"/>
</RelativeLayout>
</RelativeLayout>

View file

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<com.simplemobiletools.commons.views.FingerprintTab
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fingerprint_lock_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/fingerprint_lock_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/activity_margin"
android:text="@string/add_fingerprint"/>
<ImageView
android:id="@+id/fingerprint_image"
android:layout_width="@dimen/fingerprint_icon_size"
android:layout_height="@dimen/fingerprint_icon_size"
android:layout_below="@+id/fingerprint_lock_title"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/activity_margin"
android:src="@drawable/ic_fingerprint"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/fingerprint_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/fingerprint_image"
android:layout_centerHorizontal="true"
android:layout_marginLeft="@dimen/activity_margin"
android:layout_marginRight="@dimen/activity_margin"
android:gravity="center"
android:padding="@dimen/activity_margin"
android:text="@string/place_finger"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/fingerprint_settings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/fingerprint_label"
android:layout_centerHorizontal="true"
android:background="@drawable/breadcrumb_gradient"
android:padding="@dimen/normal_margin"
android:text="@string/go_to_settings"/>
</com.simplemobiletools.commons.views.FingerprintTab>

View file

@ -74,6 +74,7 @@
<string name="confirm_storage_access_title">Confirm external storage access</string>
<string name="confirm_storage_access_text">Please choose the root folder of the SD card on the next screen, to grant write access</string>
<string name="confirm_storage_access_text_sd">If you don\'t see the SD card, try this</string>
<string name="confirm_selection">Confirm selection</string>
<plurals name="items">
<item quantity="one">%1$d item</item>
@ -165,7 +166,15 @@
<string name="insert_pattern">Insert pattern</string>
<string name="wrong_pattern">Wrong pattern</string>
<string name="repeat_pattern">Repeat pattern</string>
<string name="fingerprint">Fingerprint</string>
<string name="add_fingerprint">Add fingerprint</string>
<string name="place_finger">Please place your finger on the fingerprint sensor</string>
<string name="authentication_failed">Authentication failed</string>
<string name="authentication_blocked">Authentication blocked, please try again in a moment</string>
<string name="no_fingerprints_registered">You have no fingerprints registered, please add some in the Settings of your device</string>
<string name="go_to_settings">Go to Settings</string>
<string name="protection_setup_successfully">Password setup successfully. Please reinstall the app in case you forget it.</string>
<string name="fingerprint_setup_successfully">Protection setup successfully. Please reinstall the app in case of problems with reseting it.</string>
<!-- Times -->
<plurals name="seconds">

View file

@ -74,6 +74,7 @@
<string name="confirm_storage_access_title">Potvrďte přístup k externímu úložišti</string>
<string name="confirm_storage_access_text">Na následující obrazovce prosím zvolte root složku SD karty pro povolení oprávnění k zápisu</string>
<string name="confirm_storage_access_text_sd">Pokud SD kartu nevidíte, vyzkoušejte následující</string>
<string name="confirm_selection">Confirm selection</string>
<plurals name="items">
<item quantity="one">%1$d položka</item>
@ -165,7 +166,15 @@
<string name="insert_pattern">Insert pattern</string>
<string name="wrong_pattern">Wrong pattern</string>
<string name="repeat_pattern">Repeat pattern</string>
<string name="fingerprint">Fingerprint</string>
<string name="add_fingerprint">Add fingerprint</string>
<string name="place_finger">Please place your finger on the fingerprint sensor</string>
<string name="authentication_failed">Authentication failed</string>
<string name="authentication_blocked">Authentication blocked, please try again in a moment</string>
<string name="no_fingerprints_registered">You have no fingerprints registered, please add some in the Settings of your device</string>
<string name="go_to_settings">Go to Settings</string>
<string name="protection_setup_successfully">Password setup successfully. Please reinstall the app in case you forget it.</string>
<string name="fingerprint_setup_successfully">Protection setup successfully. Please reinstall the app in case of problems with reseting it.</string>
<!-- Times -->
<plurals name="seconds">

View file

@ -46,8 +46,8 @@
<string name="copying_success_partial">Einige Dateien konnten nicht kopiert werden</string>
<string name="no_files_selected">Keine Dateien ausgewählt</string>
<string name="saving">Speichere&#8230;</string>
<string name="could_not_create_folder">Could not create folder %s</string>
<string name="could_not_create_file">Could not create file %s</string>
<string name="could_not_create_folder">Ordner %s konnte nicht erstellt werden</string>
<string name="could_not_create_file">Datei %s konnte nicht erstellt werden</string>
<!-- Create new -->
<string name="create_new">Neuer Ordner</string>
@ -74,6 +74,7 @@
<string name="confirm_storage_access_title">Bitte Zugriff auf externen Speicher bestätigen</string>
<string name="confirm_storage_access_text">Bitte wähle das Hauptverzeichnis deiner SD-Karte auf dem nächsten Bildschirm, um Schreibzugriff zu erlauben</string>
<string name="confirm_storage_access_text_sd">Wenn die SD-Karte nicht sichtbar ist, versuche das</string>
<string name="confirm_selection">Confirm selection</string>
<plurals name="items">
<item quantity="one">%1$d Datei/Ordner</item>
@ -165,7 +166,15 @@
<string name="insert_pattern">Muster zeichnen</string>
<string name="wrong_pattern">Falsches Muster</string>
<string name="repeat_pattern">Muster wiederholen</string>
<string name="protection_setup_successfully">Password setup successfully. Please reinstall the app in case you forget it.</string>
<string name="fingerprint">Fingerprint</string>
<string name="add_fingerprint">Add fingerprint</string>
<string name="place_finger">Please place your finger on the fingerprint sensor</string>
<string name="authentication_failed">Authentication failed</string>
<string name="authentication_blocked">Authentication blocked, please try again in a moment</string>
<string name="no_fingerprints_registered">You have no fingerprints registered, please add some in the Settings of your device</string>
<string name="go_to_settings">Go to Settings</string>
<string name="protection_setup_successfully">Muster/PIN erfolgreich gespeichert. Falls vergessen, muss die App neu installiert werden.</string>
<string name="fingerprint_setup_successfully">Protection setup successfully. Please reinstall the app in case of problems with reseting it.</string>
<!-- Times -->
<plurals name="seconds">

View file

@ -74,6 +74,7 @@
<string name="confirm_storage_access_title">Permita el acceso al almacenamiento externo</string>
<string name="confirm_storage_access_text">Por favor, elija la carpeta raíz de la tarjeta SD en la próxima pantalla para conceder el acceso de escritura</string>
<string name="confirm_storage_access_text_sd">Si no ve la tarjeta SD, prueba esto</string>
<string name="confirm_selection">Confirm selection</string>
<plurals name="items">
<item quantity="one">%1$d elemento</item>
@ -165,7 +166,15 @@
<string name="insert_pattern">Insert pattern</string>
<string name="wrong_pattern">Wrong pattern</string>
<string name="repeat_pattern">Repeat pattern</string>
<string name="fingerprint">Fingerprint</string>
<string name="add_fingerprint">Add fingerprint</string>
<string name="place_finger">Please place your finger on the fingerprint sensor</string>
<string name="authentication_failed">Authentication failed</string>
<string name="authentication_blocked">Authentication blocked, please try again in a moment</string>
<string name="no_fingerprints_registered">You have no fingerprints registered, please add some in the Settings of your device</string>
<string name="go_to_settings">Go to Settings</string>
<string name="protection_setup_successfully">Password setup successfully. Please reinstall the app in case you forget it.</string>
<string name="fingerprint_setup_successfully">Protection setup successfully. Please reinstall the app in case of problems with reseting it.</string>
<!-- Times -->
<plurals name="seconds">

View file

@ -74,6 +74,7 @@
<string name="confirm_storage_access_title">Confirmer l\'accès au stockage externe</string>
<string name="confirm_storage_access_text">Veuillez choisir le dossier racine de la carte SD dans le prochain écran, pour accorder le droit d\'écriture</string>
<string name="confirm_storage_access_text_sd">Si vous ne voyez pas la carte SD, essayez ceci</string>
<string name="confirm_selection">Confirm selection</string>
<plurals name="items">
<item quantity="one">%1$d élément</item>
@ -165,7 +166,15 @@
<string name="insert_pattern">Insérer modèle</string>
<string name="wrong_pattern">Modèle erroné</string>
<string name="repeat_pattern">Répéter modèle</string>
<string name="fingerprint">Fingerprint</string>
<string name="add_fingerprint">Add fingerprint</string>
<string name="place_finger">Please place your finger on the fingerprint sensor</string>
<string name="authentication_failed">Authentication failed</string>
<string name="authentication_blocked">Authentication blocked, please try again in a moment</string>
<string name="no_fingerprints_registered">You have no fingerprints registered, please add some in the Settings of your device</string>
<string name="go_to_settings">Go to Settings</string>
<string name="protection_setup_successfully">Mot de passe défini avec succès. Veuillez réinstaller l\'appli en cas d\'oubli.</string>
<string name="fingerprint_setup_successfully">Protection setup successfully. Please reinstall the app in case of problems with reseting it.</string>
<!-- Times -->
<plurals name="seconds">
@ -190,7 +199,7 @@
<string name="medium">Moyenne</string>
<string name="large">Large</string>
<string name="extra_large">Extra large</string>
<string name="password_protect_hidden_items">Password protect hidden item visibility</string>
<string name="password_protect_hidden_items">Visibilité des éléments protégés par un mot de passe</string>
<!-- About -->
<string name="about">À propos</string>
@ -206,7 +215,7 @@
<string name="donate_underlined"><u>Donner</u></string>
<string name="follow_us">Suivez nous:</string>
<string name="copyright">v %1$s\nCopyright © Simple Mobile Tools %2$d</string>
<string name="additional_info">Additional info</string>
<string name="additional_info">Info supplémentaire</string>
<string name="gruveo">Êtes-vous à la recherche d\'une appli d\'appels vidéo simple et anonyme ? Essayez mon autre projet</string>
<string name="app_version">Version appli: %1$s</string>
<string name="device_os">OS appareil: %1$s</string>

View file

@ -74,6 +74,7 @@
<string name="confirm_storage_access_title">Confirm external storage access</string>
<string name="confirm_storage_access_text">Please choose the root folder of the SD card on the next screen, to grant write access</string>
<string name="confirm_storage_access_text_sd">If you don\'t see the SD card, try this</string>
<string name="confirm_selection">Confirm selection</string>
<plurals name="items">
<item quantity="one">%1$d item</item>
@ -165,7 +166,15 @@
<string name="insert_pattern">Insert pattern</string>
<string name="wrong_pattern">Wrong pattern</string>
<string name="repeat_pattern">Repeat pattern</string>
<string name="fingerprint">Fingerprint</string>
<string name="add_fingerprint">Add fingerprint</string>
<string name="place_finger">Please place your finger on the fingerprint sensor</string>
<string name="authentication_failed">Authentication failed</string>
<string name="authentication_blocked">Authentication blocked, please try again in a moment</string>
<string name="no_fingerprints_registered">You have no fingerprints registered, please add some in the Settings of your device</string>
<string name="go_to_settings">Go to Settings</string>
<string name="protection_setup_successfully">Password setup successfully. Please reinstall the app in case you forget it.</string>
<string name="fingerprint_setup_successfully">Protection setup successfully. Please reinstall the app in case of problems with reseting it.</string>
<!-- Times -->
<plurals name="seconds">

View file

@ -74,6 +74,7 @@
<string name="confirm_storage_access_title">Confirm external storage access</string>
<string name="confirm_storage_access_text">Please choose the root folder of the SD card on the next screen, to grant write access</string>
<string name="confirm_storage_access_text_sd">If you don\'t see the SD card, try this</string>
<string name="confirm_selection">Confirm selection</string>
<plurals name="items">
<item quantity="one">%1$d item</item>
@ -165,7 +166,15 @@
<string name="insert_pattern">Insert pattern</string>
<string name="wrong_pattern">Wrong pattern</string>
<string name="repeat_pattern">Repeat pattern</string>
<string name="fingerprint">Fingerprint</string>
<string name="add_fingerprint">Add fingerprint</string>
<string name="place_finger">Please place your finger on the fingerprint sensor</string>
<string name="authentication_failed">Authentication failed</string>
<string name="authentication_blocked">Authentication blocked, please try again in a moment</string>
<string name="no_fingerprints_registered">You have no fingerprints registered, please add some in the Settings of your device</string>
<string name="go_to_settings">Go to Settings</string>
<string name="protection_setup_successfully">Password setup successfully. Please reinstall the app in case you forget it.</string>
<string name="fingerprint_setup_successfully">Protection setup successfully. Please reinstall the app in case of problems with reseting it.</string>
<!-- Times -->
<plurals name="seconds">

View file

@ -46,8 +46,8 @@
<string name="copying_success_partial">Alcuni file non possono essere copiati</string>
<string name="no_files_selected">Nessun file selezionato</string>
<string name="saving">Salvataggio&#8230;</string>
<string name="could_not_create_folder">Could not create folder %s</string>
<string name="could_not_create_file">Could not create file %s</string>
<string name="could_not_create_folder">Impossibile creare la cartella %s</string>
<string name="could_not_create_file">Impossibile creare il file %s</string>
<!-- Create new -->
<string name="create_new">Crea nuovo</string>
@ -74,6 +74,7 @@
<string name="confirm_storage_access_title">Conferma l\'accesso all\'archiviazione esterna</string>
<string name="confirm_storage_access_text">Scegli la root della scheda SD nella prossima schermata, per consentire i permessi di scrittura</string>
<string name="confirm_storage_access_text_sd">Se non hai una scheda SD, prova questo</string>
<string name="confirm_selection">Confirm selection</string>
<plurals name="items">
<item quantity="one">%1$d elemento</item>
@ -165,7 +166,15 @@
<string name="insert_pattern">Inserisci sequenza</string>
<string name="wrong_pattern">Sequenza errata</string>
<string name="repeat_pattern">Ripeti la sequenza</string>
<string name="protection_setup_successfully">Password setup successfully. Please reinstall the app in case you forget it.</string>
<string name="fingerprint">Fingerprint</string>
<string name="add_fingerprint">Add fingerprint</string>
<string name="place_finger">Please place your finger on the fingerprint sensor</string>
<string name="authentication_failed">Authentication failed</string>
<string name="authentication_blocked">Authentication blocked, please try again in a moment</string>
<string name="no_fingerprints_registered">You have no fingerprints registered, please add some in the Settings of your device</string>
<string name="go_to_settings">Go to Settings</string>
<string name="protection_setup_successfully">Password impostata correttamente. Reinstalla l\'app nel caso la dimenticassi.</string>
<string name="fingerprint_setup_successfully">Protection setup successfully. Please reinstall the app in case of problems with reseting it.</string>
<!-- Times -->
<plurals name="seconds">

View file

@ -1,13 +1,13 @@
<resources>
<string name="ok">OK</string>
<string name="cancel">キャンセル</string>
<string name="search">Search</string>
<string name="search">検索</string>
<string name="save_as">名前を付けて保存</string>
<string name="file_saved">ファイルを正常に保存しました</string>
<string name="invalid_file_format">Invalid file format</string>
<string name="no_storage_permissions">We need the permission to access your storage</string>
<string name="out_of_memory_error">Out of memory error</string>
<string name="an_error_occurred">An error occurred: %s</string>
<string name="invalid_file_format">使用できないファイル形式</string>
<string name="no_storage_permissions">ストレージにアクセスする権限が必要です</string>
<string name="out_of_memory_error">メモリー不足エラー</string>
<string name="an_error_occurred">エラーが発生しました: %s</string>
<!-- Renaming -->
<string name="rename_file">ファイルの名前を変更</string>
@ -21,18 +21,18 @@
<string name="renaming_folder">フォルダーの名前を変更中</string>
<string name="filename_cannot_be_empty">ファイル名は空にできません</string>
<string name="filename_invalid_characters">ファイル名に無効な文字が含まれています</string>
<string name="extension_cannot_be_empty">Extension cannot be empty</string>
<string name="extension_cannot_be_empty">拡張子は省略できません</string>
<!-- Copy / Move -->
<string name="copy">コピー</string>
<string name="move">移動</string>
<string name="copy_move">コピー / 移動</string>
<string name="copy_to">Copy to</string>
<string name="move_to">Move to</string>
<string name="copy_to">コピー</string>
<string name="move_to">移動</string>
<string name="source"></string>
<string name="destination"></string>
<string name="select_destination">宛先を選択</string>
<string name="click_select_destination">Click here to select destination</string>
<string name="click_select_destination">クリックして宛先を選択</string>
<string name="invalid_destination">選択した宛先に書き込みできませんでした</string>
<string name="please_select_destination">宛先を選択してください</string>
<string name="source_and_destination_same">元と先を同じにすることはできません</string>
@ -44,36 +44,37 @@
<string name="moving_success">ファイルを正常に移動しました</string>
<string name="moving_success_partial">一部のファイルが移動できませんでした</string>
<string name="copying_success_partial">一部のファイルがコピーできませんでした</string>
<string name="no_files_selected">No files selected</string>
<string name="saving">Saving&#8230;</string>
<string name="could_not_create_folder">Could not create folder %s</string>
<string name="could_not_create_file">Could not create file %s</string>
<string name="no_files_selected">ファイルが選択されていません</string>
<string name="saving">保存中&#8230;</string>
<string name="could_not_create_folder">フォルダー %s を作成できません</string>
<string name="could_not_create_file">ファイル %s を作成できません</string>
<!-- Create new -->
<string name="create_new">Create new</string>
<string name="folder">Folder</string>
<string name="file">File</string>
<string name="create_new_folder">Create new folder</string>
<string name="name_taken">A file or folder with that name already exists</string>
<string name="create_new">新規作成</string>
<string name="folder">フォルダー</string>
<string name="file">ファイル</string>
<string name="create_new_folder">フォルダ新規作成</string>
<string name="name_taken">同名のファイルまたはフォルダーが既に存在しています</string>
<string name="invalid_name">名前に無効な文字が含まれています</string>
<string name="empty_name">Please enter a name</string>
<string name="empty_name">名前を入力してください</string>
<string name="unknown_error_occurred">不明なエラーが発生しました</string>
<!-- Copy conflicts -->
<string name="file_already_exists">File %1$s already exists</string>
<string name="file_already_exists_overwrite">File %1$s already exists. Overwrite?</string>
<string name="select_an_action">Select an action</string>
<string name="overwrite">Overwrite</string>
<string name="skip">Skip</string>
<string name="append">Append with \'_1\'</string>
<string name="apply_to_all">Apply to all conflicts</string>
<string name="file_already_exists">ファイル %1$s は既に存在しています</string>
<string name="file_already_exists_overwrite">ファイル %1$s は既に存在しています。上書きしますか?</string>
<string name="select_an_action">処理を選択</string>
<string name="overwrite">上書き</string>
<string name="skip">スキップ</string>
<string name="append">\'_1\' に追記する</string>
<string name="apply_to_all">すべてに適用</string>
<!-- File picker -->
<string name="select_folder">フォルダーを選択</string>
<string name="select_file">ファイルを選択</string>
<string name="confirm_storage_access_title">外部ストレージのアクセスを確認してください</string>
<string name="confirm_storage_access_text">次の画面で SD カードのルートフォルダーを選択して、書き込みアクセス許可を付与してください</string>
<string name="confirm_storage_access_text_sd">If you don\'t see the SD card, try this</string>
<string name="confirm_storage_access_text_sd">SD カードの内容が表示されない場合は、こちらをお試しください</string>
<string name="confirm_selection">Confirm selection</string>
<plurals name="items">
<item quantity="one">%1$d アイテム</item>
@ -85,7 +86,7 @@
<string name="internal">内部</string>
<string name="sd_card">SD カード</string>
<string name="root">ルート</string>
<string name="wrong_root_selected">Wrong folder selected, please select the SD card</string>
<string name="wrong_root_selected">フォルダーの選択が正しくありません。SD カードを選択してください</string>
<!-- File properties -->
<string name="properties">プロパティ</string>
@ -97,58 +98,58 @@
<string name="duration">期間</string>
<string name="artist">アーティスト</string>
<string name="album">アルバム</string>
<string name="focal_length">Focal length</string>
<string name="exposure_time">Exposure time</string>
<string name="iso_speed">ISO speed</string>
<string name="f_number">F-number</string>
<string name="camera">Camera</string>
<string name="focal_length">焦点距離</string>
<string name="exposure_time">露出時間</string>
<string name="iso_speed">ISO感度</string>
<string name="f_number">絞り値</string>
<string name="camera">カメラ名</string>
<string name="exif">EXIF</string>
<!-- Color customization -->
<string name="background_color">Background color</string>
<string name="text_color">Text color</string>
<string name="primary_color">Primary color</string>
<string name="restore_defaults">Restore defaults</string>
<string name="theme">Theme</string>
<string name="light_theme">Light theme</string>
<string name="dark_theme">Dark theme</string>
<string name="custom">Custom</string>
<string name="changing_color_description">Changing a color will make it switch to Custom theme</string>
<string name="background_color">背景色</string>
<string name="text_color">文字色</string>
<string name="primary_color">メインカラー</string>
<string name="restore_defaults">デフォルトに戻す</string>
<string name="theme">テーマ</string>
<string name="light_theme">ライト</string>
<string name="dark_theme">ダーク</string>
<string name="custom">カスタム</string>
<string name="changing_color_description">色を変更すると、テーマが「カスタム」に切り替わります</string>
<string name="save">保存</string>
<string name="discard">Discard</string>
<string name="undo_changes">Undo changes</string>
<string name="undo_changes_confirmation">Are you sure you want to undo your changes?</string>
<string name="save_before_closing">You have unsaved changes. Save before exit?</string>
<string name="discard">破棄</string>
<string name="undo_changes">変更を元に戻す</string>
<string name="undo_changes_confirmation">変更を元に戻してもよろしいですか?</string>
<string name="save_before_closing">保存していない変更があります。保存しますか?</string>
<!-- What's new -->
<string name="whats_new">What\'s new</string>
<string name="whats_new_disclaimer">* only the bigger updates are listed here, there are always some smaller improvements too</string>
<string name="whats_new">更新内容</string>
<string name="whats_new_disclaimer">* ここでは主な変更点を挙げていますが、その他の細かい改善も行われています</string>
<!-- Actionbar items -->
<string name="delete">削除</string>
<string name="rename">名前の変更</string>
<string name="share">共有</string>
<string name="share_via">共有&#8230;</string>
<string name="select_all">Select all</string>
<string name="hide">Hide</string>
<string name="unhide">Unhide</string>
<string name="hide_folder">Hide folder</string>
<string name="unhide_folder">Unhide folder</string>
<string name="temporarily_show_hidden">Temporarily show hidden</string>
<string name="stop_showing_hidden">Stop showing hidden media</string>
<string name="select_all">すべて選択</string>
<string name="hide">非表示</string>
<string name="unhide">再表示</string>
<string name="hide_folder">フォルダーを非表示</string>
<string name="unhide_folder">フォルダーを再表示</string>
<string name="temporarily_show_hidden">非表示の項目を一時的に表示</string>
<string name="stop_showing_hidden">非表示項目を表示しない</string>
<!-- Sorting -->
<string name="sort_by">並び替え</string>
<string name="name">名前</string>
<string name="size">サイズ</string>
<string name="last_modified">Last modified</string>
<string name="date_taken">Date taken</string>
<string name="last_modified">最終更新日時</string>
<string name="date_taken">撮影日時</string>
<string name="title">タイトル</string>
<string name="filename">ファイル名</string>
<string name="extension">拡張子</string>
<string name="ascending">昇順</string>
<string name="descending">降順</string>
<string name="use_for_this_folder">Use for this folder only</string>
<string name="use_for_this_folder">このフォルダーのみに適用</string>
<!-- Confirmation dialog -->
<string name="proceed_with_deletion">削除を続行してもよろしいですか?</string>
@ -157,60 +158,68 @@
<!-- Password protection -->
<string name="pin">PIN</string>
<string name="enter_pin">Enter PIN</string>
<string name="please_enter_pin">Please enter a PIN</string>
<string name="wrong_pin">Wrong PIN</string>
<string name="repeat_pin">Repeat PIN</string>
<string name="pattern">Pattern</string>
<string name="insert_pattern">Insert pattern</string>
<string name="wrong_pattern">Wrong pattern</string>
<string name="repeat_pattern">Repeat pattern</string>
<string name="protection_setup_successfully">Password setup successfully. Please reinstall the app in case you forget it.</string>
<string name="enter_pin">PINを入力</string>
<string name="please_enter_pin">PINを入力してください</string>
<string name="wrong_pin">PINに誤りがあります</string>
<string name="repeat_pin">PINを再入力</string>
<string name="pattern">パターン</string>
<string name="insert_pattern">パターンを入力</string>
<string name="wrong_pattern">パターンに誤りがあります</string>
<string name="repeat_pattern">パターンを再入力</string>
<string name="fingerprint">Fingerprint</string>
<string name="add_fingerprint">Add fingerprint</string>
<string name="place_finger">Please place your finger on the fingerprint sensor</string>
<string name="authentication_failed">Authentication failed</string>
<string name="authentication_blocked">Authentication blocked, please try again in a moment</string>
<string name="no_fingerprints_registered">You have no fingerprints registered, please add some in the Settings of your device</string>
<string name="go_to_settings">Go to Settings</string>
<string name="protection_setup_successfully">パスワードの設定が完了しました。パスワードを紛失した場合は、アプリを再インストールしてください</string>
<string name="fingerprint_setup_successfully">Protection setup successfully. Please reinstall the app in case of problems with reseting it.</string>
<!-- Times -->
<plurals name="seconds">
<item quantity="one">%1$d second</item>
<item quantity="other">%1$d seconds</item>
<item quantity="one">%1$d</item>
<item quantity="other">%1$d</item>
</plurals>
<plurals name="minutes">
<item quantity="one">%1$d minute</item>
<item quantity="other">%1$d minutes</item>
<item quantity="one">%1$d</item>
<item quantity="other">%1$d</item>
</plurals>
<plurals name="hours">
<item quantity="one">%1$d hour</item>
<item quantity="other">%1$d hours</item>
<item quantity="one">%1$d時間</item>
<item quantity="other">%1$d時間</item>
</plurals>
<!-- Settings -->
<string name="settings">Settings</string>
<string name="customize_colors">Customize colors</string>
<string name="settings">設定</string>
<string name="customize_colors">表示色のカスタマイズ</string>
<string name="show_hidden">非表示のファイルとディレクトリーを表示する</string>
<string name="font_size">メモのフォントサイズ</string>
<string name="small"></string>
<string name="medium">通常</string>
<string name="large"></string>
<string name="extra_large">特大</string>
<string name="password_protect_hidden_items">Password protect hidden item visibility</string>
<string name="password_protect_hidden_items">非表示にした項目をパスワードで保護する</string>
<!-- About -->
<string name="about">アプリについて</string>
<string name="website_label">もっとシンプルなアプリとソースコードは</string>
<string name="email_label">ご意見やご提案をお送りください</string>
<string name="more_apps_underlined"><u>More apps</u></string>
<string name="more_apps_underlined"><u>他のアプリ</u></string>
<string name="third_party_licences_underlined"><u>サードパーティー ライセンス</u></string>
<string name="invite_friends_underlined"><u>友達を招待</u></string>
<string name="share_text">%2$s で %1$s を確認してください</string>
<string name="invite_via">招待&#8230;</string>
<string name="rate_us_underlined"><u>Play ストアで評価してください</u></string>
<string name="donate">Donate</string>
<string name="donate_underlined"><u>Donate</u></string>
<string name="donate">寄付</string>
<string name="donate_underlined"><u>寄付</u></string>
<string name="follow_us">フォローしてください:</string>
<string name="copyright">v %1$s\nCopyright © Simple Mobile Tools %2$d</string>
<string name="additional_info">Additional info</string>
<string name="gruveo">Are you looking for a simple and anonymous video calling app? Try out my other project</string>
<string name="app_version">App version: %1$s</string>
<string name="device_os">Device OS: %1$s</string>
<string name="donate_please">Hey,\n\nseems like you\'ve been using this app for quite a while now.\n\nDid you know it\'s not backed by any big company? Developing it takes time and I want to keep it adfree, so your support would be appreciated.\n\nYou can support me either by buying a paid app Simple Thank You, by sending money through Paypal or by sending cryptocurrencies.\n\nMore info at http://simplemobiletools.com/donate.\n\nThank you!</string>
<string name="additional_info">追加情報</string>
<string name="gruveo">登録不要のビデオ通話アプリをお探しですか? 私のアプリを試してみてください</string>
<string name="app_version">アプリバージョン: %1$s</string>
<string name="device_os">デバイスOS: %1$s</string>
<string name="donate_please">このアプリをしばらくご利用いただいているようです。\n\nこのアプリが大企業などの支援を受けていないことをご存知ですか? 開発には時間を費やしており、広告の掲載なしでの提供を維持するため、皆様にご支援いただければ幸いです。\n\n有料アプリ「Simple Thank You」のご購入、Paypal経由での送金、暗号通貨の送金によりご寄付いただけます。\n\n詳しくは、こちらをご覧ください: http://simplemobiletools.com/donate\n\nご協力いただきありがとうございます</string>
<!-- License -->
<string name="notice">このアプリは、私の暮らしにゆとりを持たせるために、次のサードパーティのライブラリーを使用しています。 ありがとうございます。</string>
@ -221,10 +230,10 @@
<string name="picasso_title">Picasso (画像ローディングとキャッシング)</string>
<string name="cropper_title">Android Image Cropper (画像のトリミングと回転)</string>
<string name="multiselect_title">RecyclerView MultiSelect (複数選択リストアイテム)</string>
<string name="rtl_viewpager_title">RtlViewPager (right to left swiping)</string>
<string name="joda_title">Joda-Time (Java date replacement)</string>
<string name="stetho_title">Stetho (debugging databases)</string>
<string name="otto_title">Otto (event bus)</string>
<string name="photoview_title">PhotoView (zoomable gifs)</string>
<string name="pattern_title">PatternLockView (pattern protection)</string>
<string name="rtl_viewpager_title">RtlViewPager (右から左へのスワイプ)</string>
<string name="joda_title">Joda-Time (Java date代替)</string>
<string name="stetho_title">Stetho (データベースのデバッグ)</string>
<string name="otto_title">Otto (イベントバス)</string>
<string name="photoview_title">PhotoView (GIF画像のズーム表示)</string>
<string name="pattern_title">PatternLockView (パターン認証)</string>
</resources>

View file

@ -74,6 +74,7 @@
<string name="confirm_storage_access_title">외장 메모리 접근허용</string>
<string name="confirm_storage_access_text">쓰기 권한을 부여하려면 다음 화면에서 SD 카드의 루트 폴더를 선택하세요.</string>
<string name="confirm_storage_access_text_sd">SD 카드가 보이지 않으면 시도해보세요.</string>
<string name="confirm_selection">Confirm selection</string>
<plurals name="items">
<item quantity="one">%1$d item</item>
@ -165,7 +166,15 @@
<string name="insert_pattern">패턴 입력</string>
<string name="wrong_pattern">패턴이 잘못 입력되었습니다.</string>
<string name="repeat_pattern">패터 확인</string>
<string name="fingerprint">Fingerprint</string>
<string name="add_fingerprint">Add fingerprint</string>
<string name="place_finger">Please place your finger on the fingerprint sensor</string>
<string name="authentication_failed">Authentication failed</string>
<string name="authentication_blocked">Authentication blocked, please try again in a moment</string>
<string name="no_fingerprints_registered">You have no fingerprints registered, please add some in the Settings of your device</string>
<string name="go_to_settings">Go to Settings</string>
<string name="protection_setup_successfully">암호 설정이 완료되었습니다. 암호를 기억하지 못하는경우 앱을 다시 설치하시기 바랍니다.</string>
<string name="fingerprint_setup_successfully">Protection setup successfully. Please reinstall the app in case of problems with reseting it.</string>
<!-- Times -->
<plurals name="seconds">

View file

@ -74,6 +74,7 @@
<string name="confirm_storage_access_title">Pasirinkti iðorinës talpyklos prieigà</string>
<string name="confirm_storage_access_text">Norint suteikti prieigà, pasirinkite pagrindiná SD kortelës aplankà kitame lange</string>
<string name="confirm_storage_access_text_sd">Jei nematote SD kortelës, pabandykite tai</string>
<string name="confirm_selection">Confirm selection</string>
<plurals name="items">
<item quantity="one">%1$d elementas</item>
@ -165,7 +166,15 @@
<string name="insert_pattern">Insert pattern</string>
<string name="wrong_pattern">Wrong pattern</string>
<string name="repeat_pattern">Repeat pattern</string>
<string name="fingerprint">Fingerprint</string>
<string name="add_fingerprint">Add fingerprint</string>
<string name="place_finger">Please place your finger on the fingerprint sensor</string>
<string name="authentication_failed">Authentication failed</string>
<string name="authentication_blocked">Authentication blocked, please try again in a moment</string>
<string name="no_fingerprints_registered">You have no fingerprints registered, please add some in the Settings of your device</string>
<string name="go_to_settings">Go to Settings</string>
<string name="protection_setup_successfully">Password setup successfully. Please reinstall the app in case you forget it.</string>
<string name="fingerprint_setup_successfully">Protection setup successfully. Please reinstall the app in case of problems with reseting it.</string>
<!-- Times -->
<plurals name="seconds">

View file

@ -53,7 +53,7 @@
<string name="create_new">Utwórz nowy</string>
<string name="folder">Folder</string>
<string name="file">Plik</string>
<string name="create_new_folder">Stwórz nowy folder</string>
<string name="create_new_folder">Utwórz nowy folder</string>
<string name="name_taken">Folder lub plik o tej nazwie już istnieje</string>
<string name="invalid_name">Nazwa zawiera niedozwolone znaki</string>
<string name="empty_name">Wpisz nazwę</string>
@ -74,6 +74,7 @@
<string name="confirm_storage_access_title">Potwierdź dostęp do karty pamięci</string>
<string name="confirm_storage_access_text">Wybierz główny folder na karcie pamięci na następnym ekranie i udziel dostępu do zapisu</string>
<string name="confirm_storage_access_text_sd">Jeśli nie widzisz karty pamięci, spróbuj tego:</string>
<string name="confirm_selection">Confirm selection</string>
<plurals name="items">
<item quantity="one">%1$d pozycja</item>
@ -166,7 +167,15 @@
<string name="insert_pattern">Wprowadź wzór</string>
<string name="wrong_pattern">Nieprawidłowy wzór</string>
<string name="repeat_pattern">Wprowadź wzór ponownie</string>
<string name="fingerprint">Odcisk palca</string>
<string name="add_fingerprint">Dodaj odcisk palca</string>
<string name="place_finger">Przyłóż palec do czytnika</string>
   <string name="authentication_failed">Uwierzytelnianie nie powiodło się.</string>
   <string name="authentication_blocked"> Uwierzytelnianie zablokowane. Spróbuj ponownie za chwilę.</string>
   <string name="no_fingerprints_registered">Nie masz zarejestrowanych odcisków palców. Dodaj je w ustawieniach systemowych.</string>
   <string name="go_to_settings">Przejdź do ustawień</string>
<string name="protection_setup_successfully">Hasło zostało ustawione. Jeśli je zapomnisz, przeinstaluj aplikację.</string>
   <string name="fingerprint_setup_successfully">Zabezpieczenie zostało ustawione. W razie problemów z jego zresetowaniem przeinstaluj aplikację.</string>
<!-- Times -->
<plurals name="seconds">
@ -194,7 +203,7 @@
<string name="medium">Średnia</string>
<string name="large">Duża</string>
<string name="extra_large">Bardzo duża</string>
<string name="password_protect_hidden_items">Chroń hasłem widoczność ukrytych plików</string>
   <string name="password_protect_hidden_items">Chroń widoczność ukrytych plików</string>
<!-- About -->
<string name="about">O aplikacji</string>

View file

@ -74,6 +74,7 @@
<string name="confirm_storage_access_title">Confirmação de acesso ao armazenamento externo</string>
<string name="confirm_storage_access_text">Por favor escolha a pasta raíz do cartão SD no próximo passo para conceder acesso de escrita</string>
<string name="confirm_storage_access_text_sd">Se você não encontrar o cartão SD, tente isto</string>
<string name="confirm_selection">Confirm selection</string>
<plurals name="items">
<item quantity="one">%1$d ítem</item>
@ -165,7 +166,15 @@
<string name="insert_pattern">Insert pattern</string>
<string name="wrong_pattern">Wrong pattern</string>
<string name="repeat_pattern">Repeat pattern</string>
<string name="fingerprint">Fingerprint</string>
<string name="add_fingerprint">Add fingerprint</string>
<string name="place_finger">Please place your finger on the fingerprint sensor</string>
<string name="authentication_failed">Authentication failed</string>
<string name="authentication_blocked">Authentication blocked, please try again in a moment</string>
<string name="no_fingerprints_registered">You have no fingerprints registered, please add some in the Settings of your device</string>
<string name="go_to_settings">Go to Settings</string>
<string name="protection_setup_successfully">Password setup successfully. Please reinstall the app in case you forget it.</string>
<string name="fingerprint_setup_successfully">Protection setup successfully. Please reinstall the app in case of problems with reseting it.</string>
<!-- Times -->
<plurals name="seconds">

View file

@ -74,6 +74,7 @@
<string name="confirm_storage_access_title">Confirmação de acesso ao armazenamento externo</string>
<string name="confirm_storage_access_text">Por favor escolha a pasta raiz do cartão SD no próximo ecrã para conceder acesso de escrita</string>
<string name="confirm_storage_access_text_sd">Senão conseguir ver o catão SD, tente isto</string>
<string name="confirm_selection">Confirm selection</string>
<plurals name="items">
<item quantity="one">%1$d item</item>
@ -165,7 +166,15 @@
<string name="insert_pattern">Introduza o padrão</string>
<string name="wrong_pattern">Padrão inválido</string>
<string name="repeat_pattern">Repita o padrão</string>
<string name="fingerprint">Fingerprint</string>
<string name="add_fingerprint">Add fingerprint</string>
<string name="place_finger">Please place your finger on the fingerprint sensor</string>
<string name="authentication_failed">Authentication failed</string>
<string name="authentication_blocked">Authentication blocked, please try again in a moment</string>
<string name="no_fingerprints_registered">You have no fingerprints registered, please add some in the Settings of your device</string>
<string name="go_to_settings">Go to Settings</string>
<string name="protection_setup_successfully">Password setup successfully. Please reinstall the app in case you forget it.</string>
<string name="fingerprint_setup_successfully">Protection setup successfully. Please reinstall the app in case of problems with reseting it.</string>
<!-- Times -->
<plurals name="seconds">

View file

@ -74,6 +74,7 @@
<string name="confirm_storage_access_title">Предоставление доступа к внешнему накопителю</string>
<string name="confirm_storage_access_text">Чтобы предоставить право на запись, пожалуйста, выберите корневую папку SD-карты на следующем шаге</string>
<string name="confirm_storage_access_text_sd">Если вы не видите SD-карту, попробуйте это</string>
<string name="confirm_selection">Confirm selection</string>
<plurals name="items">
<item quantity="one">%1$d объект</item>
@ -165,7 +166,15 @@
<string name="insert_pattern">Установить ключ</string>
<string name="wrong_pattern">Неверный графический ключ</string>
<string name="repeat_pattern">Повторить ключ</string>
<string name="fingerprint">Fingerprint</string>
<string name="add_fingerprint">Add fingerprint</string>
<string name="place_finger">Please place your finger on the fingerprint sensor</string>
<string name="authentication_failed">Authentication failed</string>
<string name="authentication_blocked">Authentication blocked, please try again in a moment</string>
<string name="no_fingerprints_registered">You have no fingerprints registered, please add some in the Settings of your device</string>
<string name="go_to_settings">Go to Settings</string>
<string name="protection_setup_successfully">Пароль успешно установлен. Пожалуйста, переустановите приложение в случае, если вы его забудете.</string>
<string name="fingerprint_setup_successfully">Protection setup successfully. Please reinstall the app in case of problems with reseting it.</string>
<!-- Times -->
<plurals name="seconds">

View file

@ -74,6 +74,7 @@
<string name="confirm_storage_access_title">Potvrďte prístup k súborom</string>
<string name="confirm_storage_access_text">Pre poskytnutie práva na zápis prosím zvoľte na nasledujúcej obrazovke základný priečǐnok SD karty</string>
<string name="confirm_storage_access_text_sd">Ak nevidíte SD kartu, skúste toto</string>
<string name="confirm_selection">Potvrdiť výber</string>
<plurals name="items">
<item quantity="one">%1$d položka</item>
@ -166,7 +167,15 @@
<string name="insert_pattern">Zadajte vzor</string>
<string name="wrong_pattern">Nesprávny vzor</string>
<string name="repeat_pattern">Zopakujte vzor</string>
<string name="fingerprint">Odtlačok</string>
<string name="add_fingerprint">Pridať odtlačok prsta</string>
<string name="place_finger">Prosím priložte prst ku senzoru odtlačku prsta</string>
<string name="authentication_failed">Overovanie zlyhalo</string>
<string name="authentication_blocked">Overovanie je zablokované, prosím skúste o chvíľu</string>
<string name="no_fingerprints_registered">Nemáte zaregistrované žiadne odtlačky, prosím pridajte nejaké v Nastaveniach zariadenia</string>
<string name="go_to_settings">Ísť do nastavení</string>
<string name="protection_setup_successfully">Heslo bolo úspešne nastavené. Ak ho zabudnete, prosím preinštalujte aplikáciu.</string>
<string name="fingerprint_setup_successfully">Ochrana bola úspešne nastavená. Prosím preinštalujte aplikáciu v prípade problémov s jej zmenou.</string>
<!-- Times -->
<plurals name="seconds">

View file

@ -74,6 +74,7 @@
<string name="confirm_storage_access_title">Bekräfta extern åtkomstlagring</string>
<string name="confirm_storage_access_text">Välj rotmappen på ditt SD-kort på nästa skärmbild, för att bevilja skrivrättigheter</string>
<string name="confirm_storage_access_text_sd">Om du inte ser SD-kortet, prova detta</string>
<string name="confirm_selection">Confirm selection</string>
<plurals name="items">
<item quantity="one">%1$d objekt</item>
@ -165,7 +166,15 @@
<string name="insert_pattern">Rita mönster</string>
<string name="wrong_pattern">Du har ritat fel mönster</string>
<string name="repeat_pattern">Upprepa mönster</string>
<string name="fingerprint">Fingerprint</string>
<string name="add_fingerprint">Add fingerprint</string>
<string name="place_finger">Please place your finger on the fingerprint sensor</string>
<string name="authentication_failed">Authentication failed</string>
<string name="authentication_blocked">Authentication blocked, please try again in a moment</string>
<string name="no_fingerprints_registered">You have no fingerprints registered, please add some in the Settings of your device</string>
<string name="go_to_settings">Go to Settings</string>
<string name="protection_setup_successfully">Lösenordet har ställts in. Installera om appen om du glömmer bort det.</string>
<string name="fingerprint_setup_successfully">Protection setup successfully. Please reinstall the app in case of problems with reseting it.</string>
<!-- Times -->
<plurals name="seconds">

View file

@ -74,6 +74,7 @@
<string name="confirm_storage_access_title">Harici depolama erişimini onayla</string>
<string name="confirm_storage_access_text">Yazma erişimi vermek için lütfen bir sonraki ekranda SD kartın kök klasörünü seçin</string>
<string name="confirm_storage_access_text_sd">If you don\'t see the SD card, try this</string>
<string name="confirm_selection">Confirm selection</string>
<plurals name="items">
<item quantity="one">%1$d öğe</item>
@ -165,7 +166,15 @@
<string name="insert_pattern">Insert pattern</string>
<string name="wrong_pattern">Wrong pattern</string>
<string name="repeat_pattern">Repeat pattern</string>
<string name="fingerprint">Fingerprint</string>
<string name="add_fingerprint">Add fingerprint</string>
<string name="place_finger">Please place your finger on the fingerprint sensor</string>
<string name="authentication_failed">Authentication failed</string>
<string name="authentication_blocked">Authentication blocked, please try again in a moment</string>
<string name="no_fingerprints_registered">You have no fingerprints registered, please add some in the Settings of your device</string>
<string name="go_to_settings">Go to Settings</string>
<string name="protection_setup_successfully">Password setup successfully. Please reinstall the app in case you forget it.</string>
<string name="fingerprint_setup_successfully">Protection setup successfully. Please reinstall the app in case of problems with reseting it.</string>
<!-- Times -->
<plurals name="seconds">

View file

@ -74,6 +74,7 @@
<string name="confirm_storage_access_title">确认外部存储器访问权限</string>
<string name="confirm_storage_access_text">请选择 SD 卡根目录并授予写权限</string>
<string name="confirm_storage_access_text_sd">如果您未找到 SD 卡目录,请尝试</string>
<string name="confirm_selection">Confirm selection</string>
<plurals name="items">
<item quantity="one">%1$d 项目</item>
@ -165,7 +166,15 @@
<string name="insert_pattern">Insert pattern</string>
<string name="wrong_pattern">Wrong pattern</string>
<string name="repeat_pattern">Repeat pattern</string>
<string name="fingerprint">Fingerprint</string>
<string name="add_fingerprint">Add fingerprint</string>
<string name="place_finger">Please place your finger on the fingerprint sensor</string>
<string name="authentication_failed">Authentication failed</string>
<string name="authentication_blocked">Authentication blocked, please try again in a moment</string>
<string name="no_fingerprints_registered">You have no fingerprints registered, please add some in the Settings of your device</string>
<string name="go_to_settings">Go to Settings</string>
<string name="protection_setup_successfully">Password setup successfully. Please reinstall the app in case you forget it.</string>
<string name="fingerprint_setup_successfully">Protection setup successfully. Please reinstall the app in case of problems with reseting it.</string>
<!-- Times -->
<plurals name="seconds">

View file

@ -74,6 +74,7 @@
<string name="confirm_storage_access_title">確認外部儲存空間存取權限</string>
<string name="confirm_storage_access_text">請在下個畫面選擇SD卡的根目錄以准許寫入權限</string>
<string name="confirm_storage_access_text_sd">"如果看不到SD卡試試這個"</string>
<string name="confirm_selection">Confirm selection</string>
<plurals name="items">
<item quantity="one">%1$d個項目</item>
@ -165,7 +166,15 @@
<string name="insert_pattern">畫出解鎖圖形</string>
<string name="wrong_pattern">解鎖圖形錯誤</string>
<string name="repeat_pattern">再次畫出解鎖圖形</string>
<string name="fingerprint">Fingerprint</string>
<string name="add_fingerprint">Add fingerprint</string>
<string name="place_finger">Please place your finger on the fingerprint sensor</string>
<string name="authentication_failed">Authentication failed</string>
<string name="authentication_blocked">Authentication blocked, please try again in a moment</string>
<string name="no_fingerprints_registered">You have no fingerprints registered, please add some in the Settings of your device</string>
<string name="go_to_settings">Go to Settings</string>
<string name="protection_setup_successfully">密碼設置成功。若遺忘了請重新安裝此程式。</string>
<string name="fingerprint_setup_successfully">Protection setup successfully. Please reinstall the app in case of problems with reseting it.</string>
<!-- Times -->
<plurals name="seconds">

View file

@ -18,6 +18,7 @@
<dimen name="normal_icon_size">48dp</dimen>
<dimen name="fastscroll_width">8dp</dimen>
<dimen name="fastscroll_height">40dp</dimen>
<dimen name="fingerprint_icon_size">72dp</dimen>
<dimen name="dragselect_hotspot_height">56dp</dimen>

View file

@ -74,6 +74,7 @@
<string name="confirm_storage_access_title">Confirm external storage access</string>
<string name="confirm_storage_access_text">Please choose the root folder of the SD card on the next screen, to grant write access</string>
<string name="confirm_storage_access_text_sd">If you don\'t see the SD card, try this</string>
<string name="confirm_selection">Confirm selection</string>
<plurals name="items">
<item quantity="one">%1$d item</item>
@ -165,7 +166,15 @@
<string name="insert_pattern">Insert pattern</string>
<string name="wrong_pattern">Wrong pattern</string>
<string name="repeat_pattern">Repeat pattern</string>
<string name="fingerprint">Fingerprint</string>
<string name="add_fingerprint">Add fingerprint</string>
<string name="place_finger">Please place your finger on the fingerprint sensor</string>
<string name="authentication_failed">Authentication failed</string>
<string name="authentication_blocked">Authentication blocked, please try again in a moment</string>
<string name="no_fingerprints_registered">You have no fingerprints registered, please add some in the Settings of your device</string>
<string name="go_to_settings">Go to Settings</string>
<string name="protection_setup_successfully">Password setup successfully. Please reinstall the app in case you forget it.</string>
<string name="fingerprint_setup_successfully">Protection setup successfully. Please reinstall the app in case of problems with reseting it.</string>
<!-- Times -->
<plurals name="seconds">

View file

@ -5,6 +5,7 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:name=".App"
android:allowBackup="true"
android:icon="@mipmap/commons_launcher"
android:label="@string/smtco_app_name"

View file

@ -0,0 +1,11 @@
package com.simplemobiletools.commons.samples
import android.app.Application
import com.github.ajalt.reprint.core.Reprint
class App : Application() {
override fun onCreate() {
super.onCreate()
Reprint.initialize(this)
}
}