commit
69d35d6af6
55 changed files with 848 additions and 205 deletions
208
LICENSE
208
LICENSE
|
@ -1,13 +1,201 @@
|
|||
Copyright 2016 SimpleMobileTools
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
1. Definitions.
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
"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.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
|
|
@ -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'
|
||||
}
|
||||
|
|
|
@ -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'
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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) {
|
||||
val documentFile = activity.getFileDocument(file.absolutePath)
|
||||
documentFile?.createDirectory(file.name)
|
||||
sendSuccess(alertDialog, 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)
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,7 +309,9 @@ fun BaseSimpleActivity.renameFile(oldFile: File, newFile: File, callback: (succe
|
|||
}
|
||||
} else {
|
||||
updateInMediaStore(oldFile, newFile)
|
||||
callback(true)
|
||||
scanFile(newFile) {
|
||||
callback(true)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
callback(false)
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
|
@ -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]+"))
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -2,4 +2,6 @@ package com.simplemobiletools.commons.interfaces
|
|||
|
||||
interface SecurityTab {
|
||||
fun initTab(requiredHash: String, listener: HashListener)
|
||||
|
||||
fun visibilityChanged(isVisible: Boolean)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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,25 +48,31 @@ class PatternTab(context: Context, attrs: AttributeSet) : RelativeLayout(context
|
|||
}
|
||||
|
||||
private fun receivedHash(newHash: String) {
|
||||
if (hash.isEmpty()) {
|
||||
hash = newHash
|
||||
pattern_lock_view.clearPattern()
|
||||
pattern_lock_title.setText(R.string.repeat_pattern)
|
||||
} else if (hash == newHash) {
|
||||
pattern_lock_view.setViewMode(PatternLockView.PatternViewMode.CORRECT)
|
||||
Handler().postDelayed({
|
||||
hashListener.receivedHash(hash, PROTECTION_PATTERN)
|
||||
}, 300)
|
||||
} else {
|
||||
pattern_lock_view.setViewMode(PatternLockView.PatternViewMode.WRONG)
|
||||
context.toast(R.string.wrong_pattern)
|
||||
Handler().postDelayed({
|
||||
when {
|
||||
hash.isEmpty() -> {
|
||||
hash = newHash
|
||||
pattern_lock_view.clearPattern()
|
||||
if (requiredHash.isEmpty()) {
|
||||
hash = ""
|
||||
pattern_lock_title.setText(R.string.insert_pattern)
|
||||
}
|
||||
}, 1000)
|
||||
pattern_lock_title.setText(R.string.repeat_pattern)
|
||||
}
|
||||
hash == newHash -> {
|
||||
pattern_lock_view.setViewMode(PatternLockView.PatternViewMode.CORRECT)
|
||||
Handler().postDelayed({
|
||||
hashListener.receivedHash(hash, PROTECTION_PATTERN)
|
||||
}, 300)
|
||||
}
|
||||
else -> {
|
||||
pattern_lock_view.setViewMode(PatternLockView.PatternViewMode.WRONG)
|
||||
context.toast(R.string.wrong_pattern)
|
||||
Handler().postDelayed({
|
||||
pattern_lock_view.clearPattern()
|
||||
if (requiredHash.isEmpty()) {
|
||||
hash = ""
|
||||
pattern_lock_title.setText(R.string.insert_pattern)
|
||||
}
|
||||
}, 1000)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun visibilityChanged(isVisible: Boolean) {}
|
||||
}
|
||||
|
|
|
@ -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) {}
|
||||
}
|
||||
|
|
BIN
commons/src/main/res/drawable-hdpi/ic_fingerprint.png
Normal file
BIN
commons/src/main/res/drawable-hdpi/ic_fingerprint.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.8 KiB |
BIN
commons/src/main/res/drawable-xhdpi/ic_fingerprint.png
Normal file
BIN
commons/src/main/res/drawable-xhdpi/ic_fingerprint.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.4 KiB |
BIN
commons/src/main/res/drawable-xxhdpi/ic_fingerprint.png
Normal file
BIN
commons/src/main/res/drawable-xxhdpi/ic_fingerprint.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.7 KiB |
BIN
commons/src/main/res/drawable-xxxhdpi/ic_fingerprint.png
Normal file
BIN
commons/src/main/res/drawable-xxxhdpi/ic_fingerprint.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.9 KiB |
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
46
commons/src/main/res/layout/tab_fingerprint.xml
Normal file
46
commons/src/main/res/layout/tab_fingerprint.xml
Normal 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>
|
|
@ -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">
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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…</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">
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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…</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,8 +166,16 @@
|
|||
<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">
|
||||
<item quantity="one">%1$d secondo</item>
|
||||
|
|
|
@ -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…</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">保存中…</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">共有…</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">招待…</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>
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue