Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,12 @@ import androidx.appcompat.widget.Toolbar
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.animation.doOnEnd
import androidx.core.app.ActivityCompat
import androidx.core.net.toUri
import androidx.core.util.Pair
import androidx.core.view.ScrollingView
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.get
import androidx.core.view.size
import androidx.core.widget.NestedScrollView
import androidx.recyclerview.widget.RecyclerView
import org.fossify.commons.R
Expand Down Expand Up @@ -104,7 +107,12 @@ abstract class BaseSimpleActivity : AppCompatActivity() {
if (!packageName.startsWith("org.fossify.", true)) {
if ((0..50).random() == 10 || baseConfig.appRunCount % 100 == 0) {
val label = "You are using a fake version of the app. For your own safety download the original one from www.fossify.org. Thanks"
ConfirmationDialog(this, label, positive = R.string.ok, negative = 0) {
ConfirmationDialog(
activity = this,
message = label,
positive = R.string.ok,
negative = 0
) {
launchViewIntent(DEVELOPER_PLAY_STORE_URL)
}
}
Expand Down Expand Up @@ -311,9 +319,9 @@ abstract class BaseSimpleActivity : AppCompatActivity() {
toolbar.overflowIcon = resources.getColoredDrawableWithColor(R.drawable.ic_three_dots_vector, contrastColor)

val menu = toolbar.menu
for (i in 0 until menu.size()) {
for (i in 0 until menu.size) {
try {
menu.getItem(i)?.icon?.setTint(contrastColor)
menu[i].icon?.setTint(contrastColor)
} catch (ignored: Exception) {
}
}
Expand Down Expand Up @@ -392,7 +400,11 @@ abstract class BaseSimpleActivity : AppCompatActivity() {
}
}

fun updateMenuItemColors(menu: Menu?, baseColor: Int = getProperStatusBarColor(), forceWhiteIcons: Boolean = false) {
fun updateMenuItemColors(
menu: Menu?,
baseColor: Int = getProperStatusBarColor(),
forceWhiteIcons: Boolean = false
) {
if (menu == null) {
return
}
Expand All @@ -402,9 +414,9 @@ abstract class BaseSimpleActivity : AppCompatActivity() {
color = Color.WHITE
}

for (i in 0 until menu.size()) {
for (i in 0 until menu.size) {
try {
menu.getItem(i)?.icon?.setTint(color)
menu[i].icon?.setTint(color)
} catch (ignored: Exception) {
}
}
Expand Down Expand Up @@ -639,7 +651,12 @@ abstract class BaseSimpleActivity : AppCompatActivity() {
if (!packageName.contains("yfissof".reversed(), true)) {
if (baseConfig.appRunCount > 100) {
val label = "You are using a fake version of the app. For your own safety download the original one from www.fossify.org. Thanks"
ConfirmationDialog(this, label, positive = R.string.ok, negative = 0) {
ConfirmationDialog(
activity = this,
message = label,
positive = R.string.ok,
negative = 0
) {
launchViewIntent(DEVELOPER_PLAY_STORE_URL)
}
return
Expand Down Expand Up @@ -793,7 +810,11 @@ abstract class BaseSimpleActivity : AppCompatActivity() {
}

@SuppressLint("NewApi")
fun trashSDK30Uris(uris: List<Uri>, toTrash: Boolean, callback: (success: Boolean) -> Unit) {
fun trashSDK30Uris(
uris: List<Uri>,
toTrash: Boolean,
callback: (success: Boolean) -> Unit
) {
hideKeyboard()
if (isRPlus()) {
funAfterTrash30File = callback
Expand All @@ -809,7 +830,10 @@ abstract class BaseSimpleActivity : AppCompatActivity() {
}

@SuppressLint("NewApi")
fun updateSDK30Uris(uris: List<Uri>, callback: (success: Boolean) -> Unit) {
fun updateSDK30Uris(
uris: List<Uri>,
callback: (success: Boolean) -> Unit
) {
hideKeyboard()
if (isRPlus()) {
funAfterUpdate30File = callback
Expand Down Expand Up @@ -843,7 +867,7 @@ abstract class BaseSimpleActivity : AppCompatActivity() {
@RequiresApi(Build.VERSION_CODES.S)
fun launchMediaManagementIntent(callback: () -> Unit) {
Intent(Settings.ACTION_REQUEST_MANAGE_MEDIA).apply {
data = Uri.parse("package:$packageName")
data = "package:$packageName".toUri()
try {
startActivityForResult(this, MANAGE_MEDIA_RC)
} catch (e: Exception) {
Expand All @@ -854,8 +878,13 @@ abstract class BaseSimpleActivity : AppCompatActivity() {
}

fun copyMoveFilesTo(
fileDirItems: ArrayList<FileDirItem>, source: String, destination: String, isCopyOperation: Boolean, copyPhotoVideoOnly: Boolean,
copyHidden: Boolean, callback: (destinationPath: String) -> Unit,
fileDirItems: ArrayList<FileDirItem>,
source: String,
destination: String,
isCopyOperation: Boolean,
copyPhotoVideoOnly: Boolean,
copyHidden: Boolean,
callback: (destinationPath: String) -> Unit,
) {
if (source == destination) {
toast(R.string.source_and_destination_same)
Expand Down Expand Up @@ -960,6 +989,7 @@ abstract class BaseSimpleActivity : AppCompatActivity() {
}
}

@SuppressLint("DefaultLocale")
fun getAlternativeFile(file: File): File {
var fileIndex = 1
var newFile: File?
Expand All @@ -986,9 +1016,19 @@ abstract class BaseSimpleActivity : AppCompatActivity() {
val pair = Pair(files, destinationPath)
handleNotificationPermission { granted ->
if (granted) {
CopyMoveTask(this, isCopyOperation, copyPhotoVideoOnly, it, copyMoveListener, copyHidden).execute(pair)
CopyMoveTask(
activity = this,
copyOnly = isCopyOperation,
copyMediaOnly = copyPhotoVideoOnly,
conflictResolutions = it,
listener = copyMoveListener,
copyHidden = copyHidden
).execute(pair)
} else {
PermissionRequiredDialog(this, R.string.allow_notifications_files, { openNotificationSettings() })
PermissionRequiredDialog(
activity = this,
textId = R.string.allow_notifications_files,
positiveActionCallback = { openNotificationSettings() })
}
}
}
Expand All @@ -999,7 +1039,10 @@ abstract class BaseSimpleActivity : AppCompatActivity() {
}

fun checkConflicts(
files: ArrayList<FileDirItem>, destinationPath: String, index: Int, conflictResolutions: LinkedHashMap<String, Int>,
files: ArrayList<FileDirItem>,
destinationPath: String,
index: Int,
conflictResolutions: LinkedHashMap<String, Int>,
callback: (resolutions: LinkedHashMap<String, Int>) -> Unit,
) {
if (index == files.size) {
Expand All @@ -1012,26 +1055,51 @@ abstract class BaseSimpleActivity : AppCompatActivity() {
ensureBackgroundThread {
if (getDoesFilePathExist(newFileDirItem.path)) {
runOnUiThread {
FileConflictDialog(this, newFileDirItem, files.size > 1) { resolution, applyForAll ->
FileConflictDialog(
activity = this,
fileDirItem = newFileDirItem,
showApplyToAllCheckbox = files.size > 1
) { resolution, applyForAll ->
if (applyForAll) {
conflictResolutions.clear()
conflictResolutions[""] = resolution
checkConflicts(files, destinationPath, files.size, conflictResolutions, callback)
checkConflicts(
files = files,
destinationPath = destinationPath,
index = files.size,
conflictResolutions = conflictResolutions,
callback = callback
)
} else {
conflictResolutions[newFileDirItem.path] = resolution
checkConflicts(files, destinationPath, index + 1, conflictResolutions, callback)
checkConflicts(
files = files,
destinationPath = destinationPath,
index = index + 1,
conflictResolutions = conflictResolutions,
callback = callback
)
}
}
}
} else {
runOnUiThread {
checkConflicts(files, destinationPath, index + 1, conflictResolutions, callback)
checkConflicts(
files = files,
destinationPath = destinationPath,
index = index + 1,
conflictResolutions = conflictResolutions,
callback = callback
)
}
}
}
}

fun handlePermission(permissionId: Int, callback: (granted: Boolean) -> Unit) {
fun handlePermission(
permissionId: Int,
callback: (granted: Boolean) -> Unit
) {
actionOnPermission = null
if (hasPermission(permissionId)) {
callback(true)
Expand All @@ -1042,7 +1110,11 @@ abstract class BaseSimpleActivity : AppCompatActivity() {
}
}

fun handlePartialMediaPermissions(permissionIds: Collection<Int>, force: Boolean = false, callback: (granted: Boolean) -> Unit) {
fun handlePartialMediaPermissions(
permissionIds: Collection<Int>,
force: Boolean = false,
callback: (granted: Boolean) -> Unit
) {
actionOnPermission = null
if (isUpsideDownCakePlus()) {
if (hasPermission(PERMISSION_READ_MEDIA_VISUAL_USER_SELECTED) && !force) {
Expand Down Expand Up @@ -1073,7 +1145,11 @@ abstract class BaseSimpleActivity : AppCompatActivity() {
}
}

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
isAskingPermissions = false
if (requestCode == GENERIC_PERM_HANDLER && grantResults.isNotEmpty()) {
Expand All @@ -1082,7 +1158,12 @@ abstract class BaseSimpleActivity : AppCompatActivity() {
}

val copyMoveListener = object : CopyMoveListener {
override fun copySucceeded(copyOnly: Boolean, copiedAll: Boolean, destinationPath: String, wasCopyingOneFileOnly: Boolean) {
override fun copySucceeded(
copyOnly: Boolean,
copiedAll: Boolean,
destinationPath: String,
wasCopyingOneFileOnly: Boolean
) {
if (copyOnly) {
toast(
if (copiedAll) {
Expand Down Expand Up @@ -1122,43 +1203,43 @@ abstract class BaseSimpleActivity : AppCompatActivity() {
fun checkAppOnSDCard() {
if (!baseConfig.wasAppOnSDShown && isAppInstalledOnSDCard()) {
baseConfig.wasAppOnSDShown = true
ConfirmationDialog(this, "", R.string.app_on_sd_card, R.string.ok, 0) {}
ConfirmationDialog(
activity = this,
message = "",
messageId = R.string.app_on_sd_card,
positive = R.string.ok,
negative = 0
) {}
}
}

fun exportSettings(configItems: LinkedHashMap<String, Any>) {
if (isQPlus()) {
configItemsToExport = configItems
ExportSettingsDialog(this, getExportSettingsFilename(), true) { path, filename ->
Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
type = "text/plain"
putExtra(Intent.EXTRA_TITLE, filename)
addCategory(Intent.CATEGORY_OPENABLE)
configItemsToExport = configItems
ExportSettingsDialog(
activity = this,
defaultFilename = getExportSettingsFilename(),
hidePath = true
) { path, filename ->
Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
type = "text/plain"
putExtra(Intent.EXTRA_TITLE, filename)
addCategory(Intent.CATEGORY_OPENABLE)

try {
startActivityForResult(this, SELECT_EXPORT_SETTINGS_FILE_INTENT)
} catch (e: ActivityNotFoundException) {
toast(R.string.system_service_disabled, Toast.LENGTH_LONG)
} catch (e: Exception) {
showErrorToast(e)
}
}
}
} else {
handlePermission(PERMISSION_WRITE_STORAGE) {
if (it) {
ExportSettingsDialog(this, getExportSettingsFilename(), false) { path, filename ->
val file = File(path)
getFileOutputStream(file.toFileDirItem(this), true) {
exportSettingsTo(it, configItems)
}
}
try {
startActivityForResult(this, SELECT_EXPORT_SETTINGS_FILE_INTENT)
} catch (e: ActivityNotFoundException) {
toast(R.string.system_service_disabled, Toast.LENGTH_LONG)
} catch (e: Exception) {
showErrorToast(e)
}
}
}
}

private fun exportSettingsTo(outputStream: OutputStream?, configItems: LinkedHashMap<String, Any>) {
private fun exportSettingsTo(
outputStream: OutputStream?,
configItems: LinkedHashMap<String, Any>
) {
if (outputStream == null) {
toast(R.string.unknown_error_occurred)
return
Expand Down
Loading
Loading