mirror of
https://github.com/FossifyOrg/Gallery.git
synced 2025-04-17 00:44:00 +02:00
Compare commits
177 commits
Author | SHA1 | Date | |
---|---|---|---|
|
a1c90a1bd7 | ||
|
c57f51984d | ||
|
0a95620a11 | ||
|
50e7223b31 | ||
|
f084cde44f | ||
|
5d108af0e7 | ||
|
e6a90db721 | ||
|
5630a4ceb0 | ||
|
28eed6bede | ||
|
496e37cbe0 | ||
|
36c256d81e | ||
|
78366352a4 | ||
|
b53e560014 | ||
|
d0150cb20a | ||
|
019d76f9da | ||
|
74a6fb48c5 | ||
|
c847db9318 | ||
|
65736f1bd0 | ||
|
264b9d4b03 | ||
|
e5d6afe01e | ||
|
4f44f1c4a7 | ||
|
c7ea06c74a | ||
|
77b4b8eca4 | ||
|
2dc750d3cb | ||
|
0110ac699c | ||
|
13515d9b5a | ||
|
4d279ce19f | ||
|
1331e491b8 | ||
|
b2ccd654e8 | ||
|
df7244471d | ||
|
6b2f32b602 | ||
|
c4bd3af2c3 | ||
|
ee7f5001ac | ||
|
c4d7adfd6e | ||
|
52ca5a0a4d | ||
|
54ace84249 | ||
|
8347e680a8 | ||
|
be9003788c | ||
|
2a78323e0f | ||
|
f3b3edab29 | ||
|
23e374c882 | ||
|
047d0a6585 | ||
|
d2fa286676 | ||
|
140f876d13 | ||
|
6b0e90f425 | ||
|
fdc59d6836 | ||
|
f223d952ec | ||
|
bd64d31bf5 | ||
|
b7f3ba98da | ||
|
b902dbe067 | ||
|
d385477ce3 | ||
|
f4b1addb40 | ||
|
c7fddbc4a8 | ||
|
34ca91931f | ||
|
e76f4a55f7 | ||
|
cba2e24a02 | ||
|
b6b2e569c7 | ||
|
0880552939 | ||
|
04422a73bb | ||
|
3e16e28417 | ||
|
36eaca6022 | ||
|
81c2d1a854 | ||
|
a85af89a69 | ||
|
ad03c24964 | ||
|
0da7bdebc1 | ||
|
b84c3bc8d6 | ||
|
8b36ae72cf | ||
|
e135a09832 | ||
|
c715157bc1 | ||
|
8ce2262a38 | ||
|
d7679c296a | ||
|
26729b2a5f | ||
|
43f94b2214 | ||
|
b5d08f0948 | ||
|
f90a009a17 | ||
|
d489964799 | ||
|
95b6e10f19 | ||
|
fbdfd05b80 | ||
|
f196e111c7 | ||
|
6e5802f021 | ||
|
a948355d2e | ||
|
8132d0dfb6 | ||
|
13cba41863 | ||
|
ff2f42fffc | ||
|
42543cbfda | ||
|
f77ab15032 | ||
|
2493cba10f | ||
|
df8525b588 | ||
|
a2029c7e8e | ||
|
50edd42e7d | ||
|
c4c1a9c9ff | ||
|
9c6ff12dff | ||
|
5e199f1af4 | ||
|
3b76c16d78 | ||
|
28a6748a53 | ||
|
5034000143 | ||
|
ae159ece42 | ||
|
849a5d4478 | ||
|
380ab1d3f4 | ||
|
8259e41906 | ||
|
bd8e411e2a | ||
|
95deb1a1bf | ||
|
7c62c58f8d | ||
|
4bf0efb7c1 | ||
|
e81d17cda3 | ||
|
bcaf168409 | ||
|
af82aa174b | ||
|
ba4ff13e4e | ||
|
a7884696ea | ||
|
a40bb00f42 | ||
|
c58f9f6752 | ||
|
7eae0fb89a | ||
|
cc0198426c | ||
|
2d4b8a82e8 | ||
|
694c3096e7 | ||
|
0fcda500bc | ||
|
18a2036226 | ||
|
5054b37a96 | ||
|
90469ffb17 | ||
|
c150678f45 | ||
|
4225254358 | ||
|
f6291f1cad | ||
|
c58630f39f | ||
|
7e369795a9 | ||
|
d3190924b5 | ||
|
381b06b2d5 | ||
|
c2b0219650 | ||
|
4e786d9209 | ||
|
d88ddc22e7 | ||
|
b4bed3ab4c | ||
|
c7d18b138e | ||
|
087f4ff630 | ||
|
424b7f0e6a | ||
|
3ce226af60 | ||
|
9760ba1885 | ||
|
52d298e5a2 | ||
|
b15807734a | ||
|
0e08228d15 | ||
|
0ba8558358 | ||
|
8ed3657e9f | ||
|
c5958c0070 | ||
|
5128602cf7 | ||
|
3de6ef10da | ||
|
a2be982104 | ||
|
58b93d55c6 | ||
|
6a9cc42979 | ||
|
4e479e5309 | ||
|
f176fe2915 | ||
|
08cc4fc39b | ||
|
2d69922cfb | ||
|
54666d6b68 | ||
|
f9111757e8 | ||
|
4a14d03a2c | ||
|
dd594a57b2 | ||
|
d2faff3f2f | ||
|
f9a723da40 | ||
|
a5f10c35bb | ||
|
11beb4a626 | ||
|
f74a830454 | ||
|
c7867483ae | ||
|
571866543d | ||
|
1edcd5d161 | ||
|
43eff348e6 | ||
|
fafd6343d9 | ||
|
6e98294147 | ||
|
2caa178417 | ||
|
30663de8ae | ||
|
056032cb67 | ||
|
9b93b62f00 | ||
|
8b65aec0f1 | ||
|
d5e019ba00 | ||
|
4c2320d06a | ||
|
654f0654a1 | ||
|
45db8c19aa | ||
|
ff836d8c24 | ||
|
85f5f43b29 | ||
|
ac8f912efb |
204 changed files with 9116 additions and 1367 deletions
.github
ISSUE_TEMPLATE
workflows
app
build.gradle.ktsdetekt-baseline.xmllint-baseline.xml
build.gradle.ktssrc/main
kotlin/org/fossify/gallery
activities
EditActivity.ktMainActivity.ktMediaActivity.ktSetWallpaperActivity.ktSimpleActivity.ktVideoPlayerActivity.ktViewPagerActivity.kt
adapters
dialogs
extensions
fragments
helpers
jobs
res
drawable
layout
activity_media.xmldialog_change_sorting.xmlphoto_item_grid.xmlphoto_item_list.xmlvideo_item_grid.xmlvideo_item_list.xml
values-bg
values-br
values-ca
values-cs
values-cy
values-de
values-eo
values-es
values-et
values-eu
values-fi
values-fr
values-ga
values-gl
values-gu
values-hr
values-hu
values-in
values-it
values-iw
values-ja
values-nl
values-pl
values-pt-rBR
values-pt
values-ro
values-ru
values-sv
values-tr
values-uk
values-zh-rCN
values-zh-rTW
values
fastlane/metadata/android
bg
ca
cs-CZ
da-DK
de-DE/changelogs
2
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
2
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
|
@ -112,7 +112,7 @@ body:
|
|||
description: |
|
||||
A picture or video is worth a thousand words.
|
||||
|
||||
If applicable, drag and drop screenshots or a screen recording to help explain your problem. If your file is too big for Github to accept, try to compress it (ZIP file), or feel free to paste a link to an image/video hoster here instead.
|
||||
If applicable, drag and drop screenshots or a screen recording to help explain your problem. If your file is too big for Github to accept, try to compress it (ZIP file), or feel free to paste a link to an image/video instead.
|
||||
|
||||
- type: textarea
|
||||
id: additional-information
|
||||
|
|
4
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
4
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
|
@ -20,14 +20,12 @@ body:
|
|||
required: true
|
||||
- label: "I have read the FAQs inside the app (Menu -> About -> FAQs) and my problem isn't listed."
|
||||
required: true
|
||||
- label: "**I have taken the time to fill in all the required details. I understand that the bug report will be dismissed otherwise.**"
|
||||
- label: "**I have taken the time to fill in all the required details. I understand that the request will be dismissed otherwise.**"
|
||||
required: true
|
||||
- label: "This issue contains only one feature request."
|
||||
required: true
|
||||
- label: "I have read and understood the [contribution guidelines](https://github.com/FossifyOrg/Gallery/blob/master/CONTRIBUTING.md)."
|
||||
required: true
|
||||
- label: "I optionally [donated](https://fossify.org/donate) to support the Fossify mission."
|
||||
required: false
|
||||
|
||||
- type: textarea
|
||||
id: feature-description
|
||||
|
|
148
.github/workflows/image-minimizer.js
vendored
148
.github/workflows/image-minimizer.js
vendored
|
@ -1,148 +0,0 @@
|
|||
/*
|
||||
* Script for minimizing big images (jpg,gif,png) when they are uploaded to GitHub and not edited otherwise.
|
||||
* Source: https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/workflows/image-minimizer.js
|
||||
*/
|
||||
module.exports = async ({github, context}) => {
|
||||
const IGNORE_KEY = '<!-- IGNORE IMAGE MINIFY -->';
|
||||
const IGNORE_ALT_NAME_END = 'ignoreImageMinify';
|
||||
// Targeted maximum height
|
||||
const IMG_MAX_HEIGHT_PX = 400;
|
||||
// maximum width of GitHub issues/comments
|
||||
const IMG_MAX_WIDTH_PX = 800;
|
||||
// all images that have a lower aspect ratio (-> have a smaller width) than this will be minimized
|
||||
const MIN_ASPECT_RATIO = IMG_MAX_WIDTH_PX / IMG_MAX_HEIGHT_PX
|
||||
|
||||
// Get the body of the image
|
||||
let initialBody = null;
|
||||
if (context.eventName == 'issue_comment') {
|
||||
initialBody = context.payload.comment.body;
|
||||
} else if (context.eventName == 'issues') {
|
||||
initialBody = context.payload.issue.body;
|
||||
} else if (context.eventName == 'pull_request') {
|
||||
initialBody = context.payload.pull_request.body;
|
||||
} else {
|
||||
console.log('Aborting: No body found');
|
||||
return;
|
||||
}
|
||||
console.log(`Found body: \n${initialBody}\n`);
|
||||
|
||||
// Check if we should ignore the currently processing element
|
||||
if (initialBody.includes(IGNORE_KEY)) {
|
||||
console.log('Ignoring: Body contains IGNORE_KEY');
|
||||
return;
|
||||
}
|
||||
|
||||
// Regex for finding images (simple variant) 
|
||||
const REGEX_USER_CONTENT_IMAGE_LOOKUP = /\!\[(.*)\]\((https:\/\/[-a-z0-9]+\.githubusercontent\.com\/\d+\/[-0-9a-f]{32,512}\.(jpg|gif|png))\)/gm;
|
||||
const REGEX_ASSETS_IMAGE_LOCKUP = /\!\[(.*)\]\((https:\/\/github\.com\/[-\w\d]+\/[-\w\d]+\/assets\/\d+\/[\-0-9a-f]{32,512})\)/gm;
|
||||
|
||||
// Check if we found something
|
||||
let foundSimpleImages = REGEX_USER_CONTENT_IMAGE_LOOKUP.test(initialBody)
|
||||
|| REGEX_ASSETS_IMAGE_LOCKUP.test(initialBody);
|
||||
if (!foundSimpleImages) {
|
||||
console.log('Found no simple images to process');
|
||||
return;
|
||||
}
|
||||
|
||||
console.log('Found at least one simple image to process');
|
||||
|
||||
// Require the probe lib for getting the image dimensions
|
||||
const probe = require('probe-image-size');
|
||||
|
||||
var wasMatchModified = false;
|
||||
|
||||
// Try to find and replace the images with minimized ones
|
||||
let newBody = await replaceAsync(initialBody, REGEX_USER_CONTENT_IMAGE_LOOKUP, minimizeAsync);
|
||||
newBody = await replaceAsync(newBody, REGEX_ASSETS_IMAGE_LOCKUP, minimizeAsync);
|
||||
|
||||
if (!wasMatchModified) {
|
||||
console.log('Nothing was modified. Skipping update');
|
||||
return;
|
||||
}
|
||||
|
||||
// Update the corresponding element
|
||||
if (context.eventName == 'issue_comment') {
|
||||
console.log('Updating comment with id', context.payload.comment.id);
|
||||
await github.rest.issues.updateComment({
|
||||
comment_id: context.payload.comment.id,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
body: newBody
|
||||
})
|
||||
} else if (context.eventName == 'issues') {
|
||||
console.log('Updating issue', context.payload.issue.number);
|
||||
await github.rest.issues.update({
|
||||
issue_number: context.payload.issue.number,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
body: newBody
|
||||
});
|
||||
} else if (context.eventName == 'pull_request') {
|
||||
console.log('Updating pull request', context.payload.pull_request.number);
|
||||
await github.rest.pulls.update({
|
||||
pull_number: context.payload.pull_request.number,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
body: newBody
|
||||
});
|
||||
}
|
||||
|
||||
// Async replace function from https://stackoverflow.com/a/48032528
|
||||
async function replaceAsync(str, regex, asyncFn) {
|
||||
const promises = [];
|
||||
str.replace(regex, (match, ...args) => {
|
||||
const promise = asyncFn(match, ...args);
|
||||
promises.push(promise);
|
||||
});
|
||||
const data = await Promise.all(promises);
|
||||
return str.replace(regex, () => data.shift());
|
||||
}
|
||||
|
||||
async function minimizeAsync(match, g1, g2) {
|
||||
console.log(`Found match '${match}'`);
|
||||
|
||||
if (g1.endsWith(IGNORE_ALT_NAME_END)) {
|
||||
console.log(`Ignoring match '${match}': IGNORE_ALT_NAME_END`);
|
||||
return match;
|
||||
}
|
||||
|
||||
let probeAspectRatio = 0;
|
||||
let shouldModify = false;
|
||||
try {
|
||||
console.log(`Probing ${g2}`);
|
||||
let probeResult = await probe(g2);
|
||||
if (probeResult == null) {
|
||||
throw 'No probeResult';
|
||||
}
|
||||
if (probeResult.hUnits != 'px') {
|
||||
throw `Unexpected probeResult.hUnits (expected px but got ${probeResult.hUnits})`;
|
||||
}
|
||||
if (probeResult.height <= 0) {
|
||||
throw `Unexpected probeResult.height (height is invalid: ${probeResult.height})`;
|
||||
}
|
||||
if (probeResult.wUnits != 'px') {
|
||||
throw `Unexpected probeResult.wUnits (expected px but got ${probeResult.wUnits})`;
|
||||
}
|
||||
if (probeResult.width <= 0) {
|
||||
throw `Unexpected probeResult.width (width is invalid: ${probeResult.width})`;
|
||||
}
|
||||
console.log(`Probing resulted in ${probeResult.width}x${probeResult.height}px`);
|
||||
|
||||
probeAspectRatio = probeResult.width / probeResult.height;
|
||||
shouldModify = probeResult.height > IMG_MAX_HEIGHT_PX && probeAspectRatio < MIN_ASPECT_RATIO;
|
||||
} catch(e) {
|
||||
console.log('Probing failed:', e);
|
||||
// Immediately abort
|
||||
return match;
|
||||
}
|
||||
|
||||
if (shouldModify) {
|
||||
wasMatchModified = true;
|
||||
console.log(`Modifying match '${match}'`);
|
||||
return `<img alt="${g1}" src="${g2}" width=${Math.min(600, Math.floor(IMG_MAX_HEIGHT_PX * probeAspectRatio))} />`;
|
||||
}
|
||||
|
||||
console.log(`Match '${match}' is ok/will not be modified`);
|
||||
return match;
|
||||
}
|
||||
}
|
30
.github/workflows/image-minimizer.yml
vendored
30
.github/workflows/image-minimizer.yml
vendored
|
@ -5,31 +5,11 @@ on:
|
|||
types: [created, edited]
|
||||
issues:
|
||||
types: [opened, edited]
|
||||
pull_request:
|
||||
pull_request_target:
|
||||
types: [opened, edited]
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
try-minimize:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 16
|
||||
|
||||
- name: Install probe-image-size
|
||||
run: npm i probe-image-size@7.2.3 --ignore-scripts
|
||||
|
||||
- name: Minimize simple images
|
||||
uses: actions/github-script@v7
|
||||
timeout-minutes: 3
|
||||
with:
|
||||
script: |
|
||||
const script = require('.github/workflows/image-minimizer.js');
|
||||
await script({github, context});
|
||||
call-image-minimizer-workflow:
|
||||
uses: FossifyOrg/.github/.github/workflows/image-minimizer.yml@main
|
||||
secrets:
|
||||
FOSSIFYBOT_TOKEN: ${{ secrets.FOSSIFYBOT_TOKEN }}
|
27
.github/workflows/no-response.yml
vendored
27
.github/workflows/no-response.yml
vendored
|
@ -1,25 +1,12 @@
|
|||
name: no-response
|
||||
name: No Response
|
||||
|
||||
# Both `issue_comment` and `scheduled` event types are required for this Action
|
||||
# to work properly.
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
schedule:
|
||||
# Run daily at midnight.
|
||||
- cron: '0 0 * * *'
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
- cron: '0 12 * * *' # Runs daily at noon
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
noResponse:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: lee-dohm/no-response@v0.5.0
|
||||
with:
|
||||
token: ${{ github.token }}
|
||||
# Number of days of inactivity before an issue is closed for lack of response.
|
||||
daysUntilClose: 30
|
||||
responseRequiredLabel: waiting for author
|
||||
call-no-response-workflow:
|
||||
uses: FossifyOrg/.github/.github/workflows/no-response.yml@main
|
||||
secrets:
|
||||
FOSSIFYBOT_TOKEN: ${{ secrets.FOSSIFYBOT_TOKEN }}
|
11
.github/workflows/pr.yml
vendored
Normal file
11
.github/workflows/pr.yml
vendored
Normal file
|
@ -0,0 +1,11 @@
|
|||
name: PR
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
call-pr-workflow:
|
||||
uses: FossifyOrg/.github/.github/workflows/pr.yml@main
|
||||
with:
|
||||
test_task: ":app:testFossDebugUnitTest"
|
10
.github/workflows/testing-build.yml
vendored
Normal file
10
.github/workflows/testing-build.yml
vendored
Normal file
|
@ -0,0 +1,10 @@
|
|||
name: Testing build (on PR)
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
types: [ labeled, opened, synchronize, reopened ]
|
||||
|
||||
jobs:
|
||||
call-testing-build-workflow:
|
||||
uses: FossifyOrg/.github/.github/workflows/testing-build.yml@main
|
14
CHANGELOG.md
14
CHANGELOG.md
|
@ -1,6 +1,20 @@
|
|||
Changelog
|
||||
==========
|
||||
|
||||
Version 1.2.1 *(2024-09-28)*
|
||||
----------------------------
|
||||
|
||||
* Updated target Android version to 14
|
||||
* Added option to control video playback speed
|
||||
* Added option to mute videos
|
||||
* Replaced checkboxes with switches
|
||||
* Added error indicator for media load failures
|
||||
* Improve scrolling performance and interface
|
||||
* Improved app lock logic and interface
|
||||
* Added initial support for JPEG XL format (increased app size)
|
||||
* Other minor bug fixes and improvements
|
||||
* Added more translations
|
||||
|
||||
Version 1.2.0 *(2024-09-21)*
|
||||
----------------------------
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
Before you report something, read the reporting rules [here](https://github.com/FossifyOrg/General-Discussion#how-do-i-suggest-an-improvement-ask-a-question-or-report-an-issue) please.
|
||||
|
||||
### Contributing as a developer
|
||||
Some instructions about code style and everything that has to be done to increase the change of your code getting accepted can be found at the [General Discussion](https://github.com/FossifyOrg/General-Discussion#contribution-rules-for-developers) section.
|
||||
Some instructions about code style and everything that has to be done to increase the chance of your code getting accepted can be found at the [General Discussion](https://github.com/FossifyOrg/General-Discussion#contribution-rules-for-developers) section.
|
||||
|
||||
### Contributing as a non developer
|
||||
In case you just want to for example improve a translation, you can find the way of doing it [here](https://github.com/FossifyOrg/General-Discussion#how-can-i-suggest-an-edit-to-a-file).
|
||||
|
|
|
@ -6,6 +6,7 @@ plugins {
|
|||
alias(libs.plugins.android)
|
||||
alias(libs.plugins.kotlinAndroid)
|
||||
alias(libs.plugins.ksp)
|
||||
alias(libs.plugins.detekt)
|
||||
}
|
||||
|
||||
val keystorePropertiesFile: File = rootProject.file("keystore.properties")
|
||||
|
@ -70,7 +71,7 @@ android {
|
|||
}
|
||||
|
||||
compileOptions {
|
||||
val currentJavaVersionFromLibs = JavaVersion.valueOf(libs.versions.app.build.javaVersion.get().toString())
|
||||
val currentJavaVersionFromLibs = JavaVersion.valueOf(libs.versions.app.build.javaVersion.get())
|
||||
sourceCompatibility = currentJavaVersionFromLibs
|
||||
targetCompatibility = currentJavaVersionFromLibs
|
||||
}
|
||||
|
@ -87,7 +88,9 @@ android {
|
|||
|
||||
lint {
|
||||
checkReleaseBuilds = false
|
||||
abortOnError = false
|
||||
abortOnError = true
|
||||
warningsAsErrors = true
|
||||
baseline = file("lint-baseline.xml")
|
||||
}
|
||||
|
||||
packaging {
|
||||
|
@ -104,6 +107,10 @@ android {
|
|||
}
|
||||
}
|
||||
|
||||
detekt {
|
||||
baseline = file("detekt-baseline.xml")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation(libs.fossify.commons)
|
||||
implementation(libs.android.image.cropper)
|
||||
|
@ -112,7 +119,7 @@ dependencies {
|
|||
implementation(libs.androidx.constraintlayout)
|
||||
implementation(libs.androidx.media3.exoplayer)
|
||||
implementation(libs.sanselan)
|
||||
implementation(libs.imagefilters)
|
||||
implementation(libs.androidphotofilters)
|
||||
implementation(libs.androidsvg.aar)
|
||||
implementation(libs.gestureviews)
|
||||
implementation(libs.subsamplingscaleimageview)
|
||||
|
|
824
app/detekt-baseline.xml
Normal file
824
app/detekt-baseline.xml
Normal file
|
@ -0,0 +1,824 @@
|
|||
<?xml version="1.0" ?>
|
||||
<SmellBaseline>
|
||||
<ManuallySuppressedIssues></ManuallySuppressedIssues>
|
||||
<CurrentIssues>
|
||||
<ID>ComplexCondition:Activity.kt$(hide && filename.startsWith('.')) || (!hide && !filename.startsWith('.'))</ID>
|
||||
<ID>ComplexCondition:Context.kt$animate && roundCorners == ROUNDED_CORNERS_NONE && (path.isGif() || path.isWebP())</ID>
|
||||
<ID>ComplexCondition:DirectoryAdapter.kt$DirectoryAdapter$!config.useRecycleBin || config.tempSkipRecycleBin || (isOneItemSelected() && fileDirItem.areFavorites())</ID>
|
||||
<ID>ComplexCondition:MainActivity.kt$MainActivity$!config.wasOTGHandled && hasPermission(getPermissionToRequest()) && hasOTGConnected() && config.OTGPath.isEmpty()</ID>
|
||||
<ID>ComplexCondition:MainActivity.kt$MainActivity$(!defaultDir.exists() || !defaultDir.isDirectory) && (config.defaultFolder != RECYCLE_BIN && config.defaultFolder != FAVORITES)</ID>
|
||||
<ID>ComplexCondition:MediaActivity.kt$MediaActivity$mMedia.isEmpty() || !isRandomSorting || (isRandomSorting && !mWasFullscreenViewOpen)</ID>
|
||||
<ID>ComplexCondition:MediaAdapter.kt$MediaAdapter$showFileTypes && (medium.isGIF() || medium.isRaw() || medium.isSVG())</ID>
|
||||
<ID>ComplexCondition:MediaFetcher.kt$MediaFetcher$!isImage && !isVideo && !isGif && !isRaw && !isSvg</ID>
|
||||
<ID>ComplexCondition:MediaFetcher.kt$MediaFetcher$curPath != FAVORITES && curPath != RECYCLE_BIN && isRPlus() && !isExternalStorageManager()</ID>
|
||||
<ID>ComplexCondition:MediaFetcher.kt$MediaFetcher$currentGrouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 || currentGrouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0 || currentGrouping and GROUP_BY_DATE_TAKEN_DAILY != 0 || currentGrouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0</ID>
|
||||
<ID>ComplexCondition:MediaFetcher.kt$MediaFetcher$isImage || isVideo || isGif || isRaw</ID>
|
||||
<ID>ComplexCondition:MediaSideScroll.kt$MediaSideScroll$(percent == 100 && event.rawY > mLastTouchY) || (percent == -100 && event.rawY < mLastTouchY)</ID>
|
||||
<ID>ComplexCondition:PhotoFragment.kt$PhotoFragment$isRPlus() && !isExternalStorageManager() && mMedium.path.startsWith("/storage/") && mMedium.isHidden()</ID>
|
||||
<ID>ComplexCondition:PhotoFragment.kt$PhotoFragment$mIsFragmentVisible && context?.config?.allowZoomingImages == true && (mMedium.isImage() || mMedium.isPortrait()) && !mIsSubsamplingVisible</ID>
|
||||
<ID>ComplexCondition:PhotoFragment.kt$PhotoFragment$mStoredShowExtendedDetails && isVisible() && context != null && resources != null</ID>
|
||||
<ID>ComplexCondition:PhotoVideoActivity.kt$PhotoVideoActivity$realPath != mUri.toString() && realPath.isNotEmpty() && mUri!!.authority != "mms" && filename.contains('.') && getDoesFilePathExist(realPath)</ID>
|
||||
<ID>ComplexCondition:PicassoRegionDecoder.kt$PicassoRegionDecoder$(rect.width() > rect.height() && screenWidth > screenHeight) || (rect.height() > rect.width() && screenHeight > screenWidth)</ID>
|
||||
<ID>ComplexCondition:SettingsActivity.kt$SettingsActivity$requestCode == PICK_IMPORT_SOURCE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null</ID>
|
||||
<ID>ComplexCondition:SettingsActivity.kt$SettingsActivity$requestCode == SELECT_EXPORT_FAVORITES_FILE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null</ID>
|
||||
<ID>ComplexCondition:SettingsActivity.kt$SettingsActivity$requestCode == SELECT_IMPORT_FAVORITES_FILE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null</ID>
|
||||
<ID>ComplexCondition:VideoFragment.kt$VideoFragment$activity == null || mConfig.openVideosOnSeparateScreen || mIsPanorama || mExoPlayer != null</ID>
|
||||
<ID>ComplexCondition:VideoFragment.kt$VideoFragment$mStoredShowExtendedDetails && isVisible() && context != null && resources != null</ID>
|
||||
<ID>ComplexCondition:VideoFragment.kt$VideoFragment$mWasFragmentInit && menuVisible && mConfig.autoplayVideos && !mConfig.openVideosOnSeparateScreen</ID>
|
||||
<ID>ComplexCondition:VideoPlayerActivity.kt$VideoPlayerActivity$config.allowDownGesture && !mIgnoreCloseDown && Math.abs(diffY) > Math.abs(diffX) && diffY < -mCloseDownThreshold && downGestureDuration < MAX_CLOSE_DOWN_GESTURE_DURATION && binding.videoSurfaceFrame.controller.state.zoom == 1f</ID>
|
||||
<ID>ComplexCondition:VideoPlayerActivity.kt$VideoPlayerActivity$mIsDragged || (Math.abs(diffX) > mDragThreshold && Math.abs(diffX) > Math.abs(diffY)) && binding.videoSurfaceFrame.controller.state.zoom == 1f</ID>
|
||||
<ID>ComplexCondition:ViewPagerFragment.kt$ViewPagerFragment$!mIgnoreCloseDown && (Math.abs(diffY) > Math.abs(diffX)) && (diffY < -mCloseDownThreshold) && downGestureDuration < MAX_CLOSE_DOWN_GESTURE_DURATION && context?.config?.allowDownGesture == true</ID>
|
||||
<ID>CyclomaticComplexMethod:Activity.kt$fun AppCompatActivity.fixDateTaken( paths: ArrayList<String>, showToasts: Boolean, hasRescanned: Boolean = false, callback: (() -> Unit)? = null )</ID>
|
||||
<ID>CyclomaticComplexMethod:Context.kt$@Suppress("UNCHECKED_CAST") fun Context.getSortedDirectories(source: ArrayList<Directory>): ArrayList<Directory></ID>
|
||||
<ID>CyclomaticComplexMethod:Context.kt$fun Context.getCachedDirectories( getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, forceShowHidden: Boolean = false, forceShowExcluded: Boolean = false, callback: (ArrayList<Directory>) -> Unit, )</ID>
|
||||
<ID>CyclomaticComplexMethod:Context.kt$fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, callback: (ArrayList<ThumbnailItem>) -> Unit)</ID>
|
||||
<ID>CyclomaticComplexMethod:Context.kt$fun Context.getDirectParentSubfolders(dirs: ArrayList<Directory>, currentPathPrefix: String): ArrayList<Directory></ID>
|
||||
<ID>CyclomaticComplexMethod:DirectoryAdapter.kt$DirectoryAdapter$override fun actionItemPressed(id: Int)</ID>
|
||||
<ID>CyclomaticComplexMethod:DirectoryAdapter.kt$DirectoryAdapter$private fun copyMoveTo(selectedPaths: Collection<String>, isCopyOperation: Boolean)</ID>
|
||||
<ID>CyclomaticComplexMethod:DirectoryAdapter.kt$DirectoryAdapter$private fun setupView(view: View, directory: Directory, holder: ViewHolder)</ID>
|
||||
<ID>CyclomaticComplexMethod:EditActivity.kt$EditActivity$private fun initEditActivity()</ID>
|
||||
<ID>CyclomaticComplexMethod:EditActivity.kt$EditActivity$private fun updatePrimaryActionButtons()</ID>
|
||||
<ID>CyclomaticComplexMethod:MainActivity.kt$MainActivity$override fun deleteFolders(folders: ArrayList<File>)</ID>
|
||||
<ID>CyclomaticComplexMethod:MainActivity.kt$MainActivity$private fun checkInvalidDirectories(dirs: ArrayList<Directory>)</ID>
|
||||
<ID>CyclomaticComplexMethod:MainActivity.kt$MainActivity$private fun gotDirectories(newDirs: ArrayList<Directory>)</ID>
|
||||
<ID>CyclomaticComplexMethod:MainActivity.kt$MainActivity$private fun setupOptionsMenu()</ID>
|
||||
<ID>CyclomaticComplexMethod:ManageBottomActionsDialog.kt$ManageBottomActionsDialog$private fun dialogConfirmed()</ID>
|
||||
<ID>CyclomaticComplexMethod:MediaActivity.kt$MediaActivity$override fun onResume()</ID>
|
||||
<ID>CyclomaticComplexMethod:MediaActivity.kt$MediaActivity$private fun setupOptionsMenu()</ID>
|
||||
<ID>CyclomaticComplexMethod:MediaAdapter.kt$MediaAdapter$override fun actionItemPressed(id: Int)</ID>
|
||||
<ID>CyclomaticComplexMethod:MediaAdapter.kt$MediaAdapter$private fun setupThumbnail(view: View, medium: Medium)</ID>
|
||||
<ID>CyclomaticComplexMethod:MediaFetcher.kt$MediaFetcher$fun getAndroid11FolderMedia( isPickImage: Boolean, isPickVideo: Boolean, favoritePaths: ArrayList<String>, getFavoritePathsOnly: Boolean, getProperDateTaken: Boolean, dateTakens: HashMap<String, Long> ): HashMap<String, ArrayList<Medium>></ID>
|
||||
<ID>CyclomaticComplexMethod:MediaFetcher.kt$MediaFetcher$fun getFilesFrom( curPath: String, isPickImage: Boolean, isPickVideo: Boolean, getProperDateTaken: Boolean, getProperLastModified: Boolean, getProperFileSize: Boolean, favoritePaths: ArrayList<String>, getVideoDurations: Boolean, lastModifieds: HashMap<String, Long>, dateTakens: HashMap<String, Long>, android11Files: HashMap<String, ArrayList<Medium>>? ): ArrayList<Medium></ID>
|
||||
<ID>CyclomaticComplexMethod:MediaFetcher.kt$MediaFetcher$fun groupMedia(media: ArrayList<Medium>, path: String): ArrayList<ThumbnailItem></ID>
|
||||
<ID>CyclomaticComplexMethod:MediaFetcher.kt$MediaFetcher$private fun getMediaInFolder( folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, getProperDateTaken: Boolean, getProperLastModified: Boolean, getProperFileSize: Boolean, favoritePaths: ArrayList<String>, getVideoDurations: Boolean, lastModifieds: HashMap<String, Long>, dateTakens: HashMap<String, Long> ): ArrayList<Medium></ID>
|
||||
<ID>CyclomaticComplexMethod:MediaFetcher.kt$MediaFetcher$private fun getMediaOnOTG( folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, favoritePaths: ArrayList<String>, getVideoDurations: Boolean ): ArrayList<Medium></ID>
|
||||
<ID>CyclomaticComplexMethod:MediaSideScroll.kt$MediaSideScroll$override fun onTouchEvent(event: MotionEvent): Boolean</ID>
|
||||
<ID>CyclomaticComplexMethod:PhotoFragment.kt$PhotoFragment$override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View</ID>
|
||||
<ID>CyclomaticComplexMethod:PhotoVideoActivity.kt$PhotoVideoActivity$private fun checkIntent(savedInstanceState: Bundle? = null)</ID>
|
||||
<ID>CyclomaticComplexMethod:PickDirectoryDialog.kt$PickDirectoryDialog$private fun gotDirectories(newDirs: ArrayList<Directory>)</ID>
|
||||
<ID>CyclomaticComplexMethod:SettingsActivity.kt$SettingsActivity$private fun parseFile(inputStream: InputStream?)</ID>
|
||||
<ID>CyclomaticComplexMethod:String.kt$fun String.shouldFolderBeVisible( excludedPaths: MutableSet<String>, includedPaths: MutableSet<String>, showHidden: Boolean, folderNoMediaStatuses: HashMap<String, Boolean>, callback: (path: String, hasNoMedia: Boolean) -> Unit ): Boolean</ID>
|
||||
<ID>CyclomaticComplexMethod:VideoFragment.kt$VideoFragment$override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View</ID>
|
||||
<ID>CyclomaticComplexMethod:VideoPlayerActivity.kt$VideoPlayerActivity$private fun handleEvent(event: MotionEvent)</ID>
|
||||
<ID>CyclomaticComplexMethod:ViewPagerActivity.kt$ViewPagerActivity$fun refreshMenuItems()</ID>
|
||||
<ID>CyclomaticComplexMethod:ViewPagerActivity.kt$ViewPagerActivity$private fun initContinue()</ID>
|
||||
<ID>CyclomaticComplexMethod:ViewPagerActivity.kt$ViewPagerActivity$private fun setupOptionsMenu()</ID>
|
||||
<ID>CyclomaticComplexMethod:ViewPagerFragment.kt$ViewPagerFragment$fun getMediumExtendedDetails(medium: Medium): String</ID>
|
||||
<ID>EmptyCatchBlock:Activity.kt${ }</ID>
|
||||
<ID>EmptyCatchBlock:Context.kt${ }</ID>
|
||||
<ID>EmptyCatchBlock:EditActivity.kt$EditActivity${ }</ID>
|
||||
<ID>EmptyCatchBlock:MainActivity.kt$MainActivity${ }</ID>
|
||||
<ID>EmptyCatchBlock:MediaActivity.kt$MediaActivity${ }</ID>
|
||||
<ID>EmptyCatchBlock:MediaFetcher.kt$MediaFetcher${ }</ID>
|
||||
<ID>EmptyCatchBlock:MyWidgetProvider.kt$MyWidgetProvider${ }</ID>
|
||||
<ID>EmptyCatchBlock:PhotoVideoActivity.kt$PhotoVideoActivity${ }</ID>
|
||||
<ID>EmptyCatchBlock:ViewPagerActivity.kt$ViewPagerActivity${ }</ID>
|
||||
<ID>EmptyFunctionBlock:App.kt$App.<no name provided>${}</ID>
|
||||
<ID>EmptyFunctionBlock:DefaultPageTransformer.kt$DefaultPageTransformer${}</ID>
|
||||
<ID>EmptyFunctionBlock:DirectoryAdapter.kt$DirectoryAdapter${}</ID>
|
||||
<ID>EmptyFunctionBlock:ManageFoldersAdapter.kt$ManageFoldersAdapter${}</ID>
|
||||
<ID>EmptyFunctionBlock:ManageHiddenFoldersAdapter.kt$ManageHiddenFoldersAdapter${}</ID>
|
||||
<ID>EmptyFunctionBlock:MediaAdapter.kt$MediaAdapter${}</ID>
|
||||
<ID>EmptyFunctionBlock:PhotoVideoActivity.kt$PhotoVideoActivity${}</ID>
|
||||
<ID>EmptyFunctionBlock:RotateTransformation.kt$RotateTransformation${}</ID>
|
||||
<ID>EmptyFunctionBlock:SearchActivity.kt$SearchActivity${}</ID>
|
||||
<ID>EmptyFunctionBlock:VideoFragment.kt$VideoFragment${}</ID>
|
||||
<ID>EmptyFunctionBlock:VideoPlayerActivity.kt$VideoPlayerActivity${}</ID>
|
||||
<ID>EmptyFunctionBlock:ViewPagerActivity.kt$ViewPagerActivity${}</ID>
|
||||
<ID>EmptyFunctionBlock:ViewPagerActivity.kt$ViewPagerActivity.<no name provided>${}</ID>
|
||||
<ID>ForbiddenComment:Context.kt$// TODO: animate JXL</ID>
|
||||
<ID>ForbiddenComment:PhotoFragment.kt$PhotoFragment$// TODO: Implement panorama using a FOSS library</ID>
|
||||
<ID>ForbiddenComment:PhotoFragment.kt$PhotoFragment.<no name provided>$// TODO: Implement panorama using a FOSS library</ID>
|
||||
<ID>ForbiddenComment:VideoFragment.kt$VideoFragment$// checkIfPanorama() TODO: Implement panorama using a FOSS library</ID>
|
||||
<ID>ImplicitDefaultLocale:PlaybackSpeedFragment.kt$PlaybackSpeedFragment$String.format("%.2f", value)</ID>
|
||||
<ID>InstanceOfCheckForException:Activity.kt$e !is IOException</ID>
|
||||
<ID>LargeClass:DirectoryAdapter.kt$DirectoryAdapter : MyRecyclerViewAdapterItemTouchHelperContractOnPopupTextUpdate</ID>
|
||||
<ID>LargeClass:EditActivity.kt$EditActivity : SimpleActivityOnCropImageCompleteListener</ID>
|
||||
<ID>LargeClass:MainActivity.kt$MainActivity : SimpleActivityDirectoryOperationsListener</ID>
|
||||
<ID>LargeClass:MediaActivity.kt$MediaActivity : SimpleActivityMediaOperationsListener</ID>
|
||||
<ID>LargeClass:MediaFetcher.kt$MediaFetcher</ID>
|
||||
<ID>LargeClass:PhotoFragment.kt$PhotoFragment : ViewPagerFragment</ID>
|
||||
<ID>LargeClass:SettingsActivity.kt$SettingsActivity : SimpleActivity</ID>
|
||||
<ID>LargeClass:VideoFragment.kt$VideoFragment : ViewPagerFragmentSurfaceTextureListenerOnSeekBarChangeListenerPlaybackSpeedListener</ID>
|
||||
<ID>LargeClass:ViewPagerActivity.kt$ViewPagerActivity : SimpleActivityOnPageChangeListenerFragmentListener</ID>
|
||||
<ID>LongMethod:Activity.kt$fun AppCompatActivity.fixDateTaken( paths: ArrayList<String>, showToasts: Boolean, hasRescanned: Boolean = false, callback: (() -> Unit)? = null )</ID>
|
||||
<ID>LongMethod:Activity.kt$fun BaseSimpleActivity.restoreRecycleBinPaths(paths: ArrayList<String>, callback: () -> Unit)</ID>
|
||||
<ID>LongMethod:Context.kt$@Suppress("UNCHECKED_CAST") fun Context.getSortedDirectories(source: ArrayList<Directory>): ArrayList<Directory></ID>
|
||||
<ID>LongMethod:Context.kt$fun Context.getCachedDirectories( getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, forceShowHidden: Boolean = false, forceShowExcluded: Boolean = false, callback: (ArrayList<Directory>) -> Unit, )</ID>
|
||||
<ID>LongMethod:Context.kt$fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, callback: (ArrayList<ThumbnailItem>) -> Unit)</ID>
|
||||
<ID>LongMethod:DirectoryAdapter.kt$DirectoryAdapter$private fun setupView(view: View, directory: Directory, holder: ViewHolder)</ID>
|
||||
<ID>LongMethod:EditActivity.kt$EditActivity$private fun updatePrimaryActionButtons()</ID>
|
||||
<ID>LongMethod:MainActivity.kt$MainActivity$override fun onCreate(savedInstanceState: Bundle?)</ID>
|
||||
<ID>LongMethod:MainActivity.kt$MainActivity$private fun gotDirectories(newDirs: ArrayList<Directory>)</ID>
|
||||
<ID>LongMethod:MediaAdapter.kt$MediaAdapter$private fun setupThumbnail(view: View, medium: Medium)</ID>
|
||||
<ID>LongMethod:MediaFetcher.kt$MediaFetcher$fun getAndroid11FolderMedia( isPickImage: Boolean, isPickVideo: Boolean, favoritePaths: ArrayList<String>, getFavoritePathsOnly: Boolean, getProperDateTaken: Boolean, dateTakens: HashMap<String, Long> ): HashMap<String, ArrayList<Medium>></ID>
|
||||
<ID>LongMethod:MediaFetcher.kt$MediaFetcher$private fun getMediaInFolder( folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, getProperDateTaken: Boolean, getProperLastModified: Boolean, getProperFileSize: Boolean, favoritePaths: ArrayList<String>, getVideoDurations: Boolean, lastModifieds: HashMap<String, Long>, dateTakens: HashMap<String, Long> ): ArrayList<Medium></ID>
|
||||
<ID>LongMethod:PhotoFragment.kt$PhotoFragment$override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View</ID>
|
||||
<ID>LongMethod:PhotoVideoActivity.kt$PhotoVideoActivity$private fun checkIntent(savedInstanceState: Bundle? = null)</ID>
|
||||
<ID>LongMethod:SettingsActivity.kt$SettingsActivity$private fun parseFile(inputStream: InputStream?)</ID>
|
||||
<ID>LongMethod:SettingsActivity.kt$SettingsActivity$private fun setupExportSettings()</ID>
|
||||
<ID>LongMethod:SettingsActivity.kt$SettingsActivity$private fun setupSettingItems()</ID>
|
||||
<ID>LongMethod:VideoFragment.kt$VideoFragment$override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View</ID>
|
||||
<ID>LongMethod:VideoPlayerActivity.kt$VideoPlayerActivity$private fun handleEvent(event: MotionEvent)</ID>
|
||||
<ID>LongMethod:ViewPagerActivity.kt$ViewPagerActivity$private fun initBottomActionButtons()</ID>
|
||||
<ID>LongMethod:ViewPagerActivity.kt$ViewPagerActivity$private fun initContinue()</ID>
|
||||
<ID>LongParameterList:Context.kt$( path: String, curMedia: ArrayList<Medium>, albumCovers: ArrayList<AlbumCover>, hiddenString: String, includedFolders: MutableSet<String>, getProperFileSize: Boolean, noMediaFolders: ArrayList<String>, )</ID>
|
||||
<ID>LongParameterList:Context.kt$( path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Int, signature: ObjectKey, crossFadeDuration: Int = THUMBNAIL_FADE_DURATION_MS, )</ID>
|
||||
<ID>LongParameterList:Context.kt$( path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Int, signature: ObjectKey, skipMemoryCacheAtPaths: ArrayList<String>? = null, animate: Boolean = false, tryLoadingWithPicasso: Boolean = false, crossFadeDuration: Int = THUMBNAIL_FADE_DURATION_MS, onError: (() -> Unit)? = null )</ID>
|
||||
<ID>LongParameterList:Context.kt$( type: Int, path: String, target: MySquareImageView, horizontalScroll: Boolean, animateGifs: Boolean, cropThumbnails: Boolean, roundCorners: Int, signature: ObjectKey, skipMemoryCacheAtPaths: ArrayList<String>? = null, onError: (() -> Unit)? = null )</ID>
|
||||
<ID>LongParameterList:Context.kt$(path: String, fc: FileChannel, level: Int, start: Long, end: Long, callback: () -> Unit)</ID>
|
||||
<ID>LongParameterList:DirectoryAdapter.kt$DirectoryAdapter$( activity: BaseSimpleActivity, var dirs: ArrayList<Directory>, val listener: DirectoryOperationsListener?, recyclerView: MyRecyclerView, val isPickIntent: Boolean, val swipeRefreshLayout: SwipeRefreshLayout? = null, itemClick: (Any) -> Unit )</ID>
|
||||
<ID>LongParameterList:DirectoryDao.kt$DirectoryDao$(path: String, thumbnail: String, mediaCnt: Int, lastModified: Long, dateTaken: Long, size: Long, mediaTypes: Int, sortValue: String)</ID>
|
||||
<ID>LongParameterList:MediaAdapter.kt$MediaAdapter$( activity: BaseSimpleActivity, var media: ArrayList<ThumbnailItem>, val listener: MediaOperationsListener?, val isAGetIntent: Boolean, val allowMultiplePicks: Boolean, val path: String, recyclerView: MyRecyclerView, itemClick: (Any) -> Unit )</ID>
|
||||
<ID>LongParameterList:MediaFetcher.kt$MediaFetcher$( curPath: String, isPickImage: Boolean, isPickVideo: Boolean, getProperDateTaken: Boolean, getProperLastModified: Boolean, getProperFileSize: Boolean, favoritePaths: ArrayList<String>, getVideoDurations: Boolean, lastModifieds: HashMap<String, Long>, dateTakens: HashMap<String, Long>, android11Files: HashMap<String, ArrayList<Medium>>? )</ID>
|
||||
<ID>LongParameterList:MediaFetcher.kt$MediaFetcher$( folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, favoritePaths: ArrayList<String>, getVideoDurations: Boolean )</ID>
|
||||
<ID>LongParameterList:MediaFetcher.kt$MediaFetcher$( folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, getProperDateTaken: Boolean, getProperLastModified: Boolean, getProperFileSize: Boolean, favoritePaths: ArrayList<String>, getVideoDurations: Boolean, lastModifieds: HashMap<String, Long>, dateTakens: HashMap<String, Long> )</ID>
|
||||
<ID>LongParameterList:MediaFetcher.kt$MediaFetcher$( isPickImage: Boolean, isPickVideo: Boolean, favoritePaths: ArrayList<String>, getFavoritePathsOnly: Boolean, getProperDateTaken: Boolean, dateTakens: HashMap<String, Long> )</ID>
|
||||
<ID>LongParameterList:MediaSideScroll.kt$MediaSideScroll$( activity: Activity, slideInfoView: TextView, isBrightness: Boolean, parentView: ViewGroup?, singleTap: (x: Float, y: Float) -> Unit, doubleTap: ((x: Float, y: Float) -> Unit)? = null )</ID>
|
||||
<ID>LongParameterList:PickDirectoryDialog.kt$PickDirectoryDialog$( val activity: BaseSimpleActivity, val sourcePath: String, showOtherFolderButton: Boolean, val showFavoritesBin: Boolean, val isPickingCopyMoveDestination: Boolean, val isPickingFolderForWidget: Boolean, val callback: (path: String) -> Unit )</ID>
|
||||
<ID>LoopWithTooManyJumpStatements:Activity.kt$for</ID>
|
||||
<ID>LoopWithTooManyJumpStatements:Context.kt$for</ID>
|
||||
<ID>LoopWithTooManyJumpStatements:MediaFetcher.kt$MediaFetcher$for</ID>
|
||||
<ID>LoopWithTooManyJumpStatements:String.kt$for</ID>
|
||||
<ID>LoopWithTooManyJumpStatements:String.kt$while</ID>
|
||||
<ID>MagicNumber:Activity.kt$10</ID>
|
||||
<ID>MagicNumber:Activity.kt$1000</ID>
|
||||
<ID>MagicNumber:Activity.kt$11</ID>
|
||||
<ID>MagicNumber:Activity.kt$360</ID>
|
||||
<ID>MagicNumber:Activity.kt$4</ID>
|
||||
<ID>MagicNumber:Activity.kt$5</ID>
|
||||
<ID>MagicNumber:Activity.kt$50</ID>
|
||||
<ID>MagicNumber:Activity.kt$90</ID>
|
||||
<ID>MagicNumber:ChangeFileThumbnailStyleDialog.kt$ChangeFileThumbnailStyleDialog$16</ID>
|
||||
<ID>MagicNumber:ChangeFileThumbnailStyleDialog.kt$ChangeFileThumbnailStyleDialog$32</ID>
|
||||
<ID>MagicNumber:ChangeFileThumbnailStyleDialog.kt$ChangeFileThumbnailStyleDialog$4</ID>
|
||||
<ID>MagicNumber:ChangeFileThumbnailStyleDialog.kt$ChangeFileThumbnailStyleDialog$64</ID>
|
||||
<ID>MagicNumber:ChangeFileThumbnailStyleDialog.kt$ChangeFileThumbnailStyleDialog$8</ID>
|
||||
<ID>MagicNumber:ChangeFolderThumbnailStyleDialog.kt$ChangeFolderThumbnailStyleDialog$36</ID>
|
||||
<ID>MagicNumber:Config.kt$Config$0.05f</ID>
|
||||
<ID>MagicNumber:Config.kt$Config$0.5f</ID>
|
||||
<ID>MagicNumber:Config.kt$Config$50</ID>
|
||||
<ID>MagicNumber:Context.kt$1000L</ID>
|
||||
<ID>MagicNumber:Context.kt$1024</ID>
|
||||
<ID>MagicNumber:Context.kt$50</ID>
|
||||
<ID>MagicNumber:Context.kt$8</ID>
|
||||
<ID>MagicNumber:EditActivity.kt$EditActivity$0.03f</ID>
|
||||
<ID>MagicNumber:EditActivity.kt$EditActivity$100</ID>
|
||||
<ID>MagicNumber:EditActivity.kt$EditActivity$100f</ID>
|
||||
<ID>MagicNumber:EditActivity.kt$EditActivity$16f</ID>
|
||||
<ID>MagicNumber:EditActivity.kt$EditActivity$180</ID>
|
||||
<ID>MagicNumber:EditActivity.kt$EditActivity$3f</ID>
|
||||
<ID>MagicNumber:EditActivity.kt$EditActivity$4f</ID>
|
||||
<ID>MagicNumber:EditActivity.kt$EditActivity$90</ID>
|
||||
<ID>MagicNumber:EditActivity.kt$EditActivity$9f</ID>
|
||||
<ID>MagicNumber:EditorDrawCanvas.kt$EditorDrawCanvas$100f</ID>
|
||||
<ID>MagicNumber:EditorDrawCanvas.kt$EditorDrawCanvas$40f</ID>
|
||||
<ID>MagicNumber:FilterThumbnailsManager.kt$FilterThumbnailsManager$10</ID>
|
||||
<ID>MagicNumber:GalleryDatabase.kt$GalleryDatabase.Companion.<no name provided>$10</ID>
|
||||
<ID>MagicNumber:GalleryDatabase.kt$GalleryDatabase.Companion.<no name provided>$4</ID>
|
||||
<ID>MagicNumber:GalleryDatabase.kt$GalleryDatabase.Companion.<no name provided>$5</ID>
|
||||
<ID>MagicNumber:GalleryDatabase.kt$GalleryDatabase.Companion.<no name provided>$6</ID>
|
||||
<ID>MagicNumber:GalleryDatabase.kt$GalleryDatabase.Companion.<no name provided>$7</ID>
|
||||
<ID>MagicNumber:GalleryDatabase.kt$GalleryDatabase.Companion.<no name provided>$8</ID>
|
||||
<ID>MagicNumber:GalleryDatabase.kt$GalleryDatabase.Companion.<no name provided>$9</ID>
|
||||
<ID>MagicNumber:IsoTypeReader.kt$IsoTypeReader$32</ID>
|
||||
<ID>MagicNumber:IsoTypeReader.kt$IsoTypeReader$4</ID>
|
||||
<ID>MagicNumber:MainActivity.kt$MainActivity$1000</ID>
|
||||
<ID>MagicNumber:MainActivity.kt$MainActivity$30</ID>
|
||||
<ID>MagicNumber:MainActivity.kt$MainActivity$3000L</ID>
|
||||
<ID>MagicNumber:MainActivity.kt$MainActivity$50</ID>
|
||||
<ID>MagicNumber:MainActivity.kt$MainActivity$500</ID>
|
||||
<ID>MagicNumber:MediaActivity.kt$MediaActivity$3000L</ID>
|
||||
<ID>MagicNumber:MediaAdapter.kt$MediaAdapter$180</ID>
|
||||
<ID>MagicNumber:MediaAdapter.kt$MediaAdapter$270</ID>
|
||||
<ID>MagicNumber:MediaAdapter.kt$MediaAdapter$90</ID>
|
||||
<ID>MagicNumber:MediaFetcher.kt$MediaFetcher$10</ID>
|
||||
<ID>MagicNumber:MediaFetcher.kt$MediaFetcher$1000</ID>
|
||||
<ID>MagicNumber:MediaSideScroll.kt$MediaSideScroll$100</ID>
|
||||
<ID>MagicNumber:MediaSideScroll.kt$MediaSideScroll$1000L</ID>
|
||||
<ID>MagicNumber:MediaSideScroll.kt$MediaSideScroll$100f</ID>
|
||||
<ID>MagicNumber:MediaSideScroll.kt$MediaSideScroll$2.55</ID>
|
||||
<ID>MagicNumber:MediaSideScroll.kt$MediaSideScroll$255f</ID>
|
||||
<ID>MagicNumber:MediaSideScroll.kt$MediaSideScroll$3</ID>
|
||||
<ID>MagicNumber:MediaSideScroll.kt$MediaSideScroll$70</ID>
|
||||
<ID>MagicNumber:OtherAspectRatioDialog.kt$OtherAspectRatioDialog$16f</ID>
|
||||
<ID>MagicNumber:OtherAspectRatioDialog.kt$OtherAspectRatioDialog$19f</ID>
|
||||
<ID>MagicNumber:OtherAspectRatioDialog.kt$OtherAspectRatioDialog$3f</ID>
|
||||
<ID>MagicNumber:OtherAspectRatioDialog.kt$OtherAspectRatioDialog$4f</ID>
|
||||
<ID>MagicNumber:OtherAspectRatioDialog.kt$OtherAspectRatioDialog$5f</ID>
|
||||
<ID>MagicNumber:OtherAspectRatioDialog.kt$OtherAspectRatioDialog$9f</ID>
|
||||
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$0.01</ID>
|
||||
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$100</ID>
|
||||
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$100L</ID>
|
||||
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$10f</ID>
|
||||
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$180</ID>
|
||||
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$270</ID>
|
||||
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$300</ID>
|
||||
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$360</ID>
|
||||
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$400</ID>
|
||||
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$4096</ID>
|
||||
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$50</ID>
|
||||
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$7</ID>
|
||||
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$90</ID>
|
||||
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment.<no name provided>$270</ID>
|
||||
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment.<no name provided>$360</ID>
|
||||
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment.<no name provided>$90</ID>
|
||||
<ID>MagicNumber:PlaybackSpeedFragment.kt$PlaybackSpeedFragment$0.05f</ID>
|
||||
<ID>MagicNumber:PlaybackSpeedFragment.kt$PlaybackSpeedFragment$0.25f</ID>
|
||||
<ID>MagicNumber:PlaybackSpeedFragment.kt$PlaybackSpeedFragment$100</ID>
|
||||
<ID>MagicNumber:PlaybackSpeedFragment.kt$PlaybackSpeedFragment$3f</ID>
|
||||
<ID>MagicNumber:ResizeMultipleImagesDialog.kt$ResizeMultipleImagesDialog$0.6f</ID>
|
||||
<ID>MagicNumber:ResizeMultipleImagesDialog.kt$ResizeMultipleImagesDialog$10</ID>
|
||||
<ID>MagicNumber:ResizeMultipleImagesDialog.kt$ResizeMultipleImagesDialog$100</ID>
|
||||
<ID>MagicNumber:ResizeMultipleImagesDialog.kt$ResizeMultipleImagesDialog$90</ID>
|
||||
<ID>MagicNumber:SetWallpaperActivity.kt$SetWallpaperActivity$90</ID>
|
||||
<ID>MagicNumber:VideoFragment.kt$VideoFragment$1000</ID>
|
||||
<ID>MagicNumber:VideoFragment.kt$VideoFragment$1000L</ID>
|
||||
<ID>MagicNumber:VideoFragment.kt$VideoFragment$1000f</ID>
|
||||
<ID>MagicNumber:VideoFragment.kt$VideoFragment$7</ID>
|
||||
<ID>MagicNumber:VideoFragment.kt$VideoFragment.<no name provided>$1000</ID>
|
||||
<ID>MagicNumber:VideoFragment.kt$VideoFragment.<no name provided>$7</ID>
|
||||
<ID>MagicNumber:VideoPlayerActivity.kt$VideoPlayerActivity$0.5</ID>
|
||||
<ID>MagicNumber:VideoPlayerActivity.kt$VideoPlayerActivity$0.8</ID>
|
||||
<ID>MagicNumber:VideoPlayerActivity.kt$VideoPlayerActivity$100</ID>
|
||||
<ID>MagicNumber:VideoPlayerActivity.kt$VideoPlayerActivity$1000</ID>
|
||||
<ID>MagicNumber:VideoPlayerActivity.kt$VideoPlayerActivity$1000L</ID>
|
||||
<ID>MagicNumber:VideoPlayerActivity.kt$VideoPlayerActivity$1000f</ID>
|
||||
<ID>MagicNumber:VideoPlayerActivity.kt$VideoPlayerActivity$100L</ID>
|
||||
<ID>MagicNumber:VideoPlayerActivity.kt$VideoPlayerActivity$100f</ID>
|
||||
<ID>MagicNumber:VideoPlayerActivity.kt$VideoPlayerActivity$7</ID>
|
||||
<ID>MagicNumber:VideoPlayerActivity.kt$VideoPlayerActivity.<no name provided>$1000</ID>
|
||||
<ID>MagicNumber:ViewPagerActivity.kt$ViewPagerActivity$1000L</ID>
|
||||
<ID>MagicNumber:ViewPagerActivity.kt$ViewPagerActivity$180</ID>
|
||||
<ID>MagicNumber:ViewPagerActivity.kt$ViewPagerActivity$5</ID>
|
||||
<ID>MagicNumber:ViewPagerActivity.kt$ViewPagerActivity$90</ID>
|
||||
<ID>MagicNumber:ViewPagerFragment.kt$ViewPagerFragment$1000L</ID>
|
||||
<ID>MagicNumber:ViewPagerFragment.kt$ViewPagerFragment$100f</ID>
|
||||
<ID>MagicNumber:WidgetConfigureActivity.kt$WidgetConfigureActivity$100</ID>
|
||||
<ID>MagicNumber:WidgetConfigureActivity.kt$WidgetConfigureActivity$100f</ID>
|
||||
<ID>MagicNumber:WidgetConfigureActivity.kt$WidgetConfigureActivity$255f</ID>
|
||||
<ID>MaxLineLength:Activity.kt$LICENSE_PICASSO</ID>
|
||||
<ID>MaxLineLength:Activity.kt$copyMoveFilesTo(fileDirItems, source.trimEnd('/'), destination, isCopyOperation, true, config.shouldShowHidden, callback)</ID>
|
||||
<ID>MaxLineLength:Activity.kt$faqItems.add(0, FAQItem(R.string.faq_16_title, "${getString(R.string.faq_16_text)} ${getString(R.string.faq_16_text_extra)}"))</ID>
|
||||
<ID>MaxLineLength:Activity.kt$faqItems.add(FAQItem(org.fossify.commons.R.string.faq_10_title_commons, org.fossify.commons.R.string.faq_10_text_commons))</ID>
|
||||
<ID>MaxLineLength:Activity.kt$faqItems.add(FAQItem(org.fossify.commons.R.string.faq_2_title_commons, org.fossify.commons.R.string.faq_2_text_commons))</ID>
|
||||
<ID>MaxLineLength:Activity.kt$faqItems.add(FAQItem(org.fossify.commons.R.string.faq_6_title_commons, org.fossify.commons.R.string.faq_6_text_commons))</ID>
|
||||
<ID>MaxLineLength:Activity.kt$faqItems.add(FAQItem(org.fossify.commons.R.string.faq_7_title_commons, org.fossify.commons.R.string.faq_7_text_commons))</ID>
|
||||
<ID>MaxLineLength:Activity.kt$fun</ID>
|
||||
<ID>MaxLineLength:Activity.kt$mediaDB.updateDeleted(destination.removePrefix(recycleBinPath), 0, "$RECYCLE_BIN${source.removePrefix(recycleBinPath)}")</ID>
|
||||
<ID>MaxLineLength:Activity.kt$return (realDisplayMetrics.widthPixels - displayMetrics.widthPixels > 0) || (realDisplayMetrics.heightPixels - displayMetrics.heightPixels > 0)</ID>
|
||||
<ID>MaxLineLength:Activity.kt$toast(if (didUpdateFile) R.string.dates_fixed_successfully else org.fossify.commons.R.string.unknown_error_occurred)</ID>
|
||||
<ID>MaxLineLength:Activity.kt$val</ID>
|
||||
<ID>MaxLineLength:Activity.kt$}</ID>
|
||||
<ID>MaxLineLength:AllFilesPermissionDialog.kt$AllFilesPermissionDialog$val activity: BaseSimpleActivity</ID>
|
||||
<ID>MaxLineLength:ChangeFileThumbnailStyleDialog.kt$ChangeFileThumbnailStyleDialog$dialogFileStyleShowThumbnailFileTypesHolder.setOnClickListener { dialogFileStyleShowThumbnailFileTypes.toggle() }</ID>
|
||||
<ID>MaxLineLength:ChangeFileThumbnailStyleDialog.kt$ChangeFileThumbnailStyleDialog$dialogFileStyleShowThumbnailVideoDurationHolder.setOnClickListener { dialogFileStyleShowThumbnailVideoDuration.toggle() }</ID>
|
||||
<ID>MaxLineLength:ChangeFolderThumbnailStyleDialog.kt$ChangeFolderThumbnailStyleDialog$class</ID>
|
||||
<ID>MaxLineLength:ChangeFolderThumbnailStyleDialog.kt$ChangeFolderThumbnailStyleDialog$val cornerRadius = root.resources.getDimension(org.fossify.commons.R.dimen.rounded_corner_radius_big).toInt()</ID>
|
||||
<ID>MaxLineLength:ChangeFolderThumbnailStyleDialog.kt$ChangeFolderThumbnailStyleDialog$val useRoundedCornersLayout = binding.dialogRadioFolderStyle.checkedRadioButtonId == R.id.dialog_radio_folder_rounded_corners</ID>
|
||||
<ID>MaxLineLength:ChangeSortingDialog.kt$ChangeSortingDialog$binding.sortingDialogOrderDivider.beVisibleIf(binding.sortingDialogNumericSorting.isVisible() || binding.sortingDialogUseForThisFolder.isVisible())</ID>
|
||||
<ID>MaxLineLength:ChangeSortingDialog.kt$ChangeSortingDialog$sortingDialogNumericSorting.beVisibleIf(showFolderCheckbox && (currSorting and SORT_BY_NAME != 0 || currSorting and SORT_BY_PATH != 0))</ID>
|
||||
<ID>MaxLineLength:ChangeSortingDialog.kt$ChangeSortingDialog$sortingDialogOrderDivider.beVisibleIf(showFolderCheckbox || (currSorting and SORT_BY_NAME != 0 || currSorting and SORT_BY_PATH != 0))</ID>
|
||||
<ID>MaxLineLength:ChangeSortingDialog.kt$ChangeSortingDialog$val hideSortOrder = checkedId == binding.sortingDialogRadioCustom.id || checkedId == binding.sortingDialogRadioRandom.id</ID>
|
||||
<ID>MaxLineLength:ChangeSortingDialog.kt$ChangeSortingDialog$val isSortingByNameOrPath = checkedId == binding.sortingDialogRadioName.id || checkedId == binding.sortingDialogRadioPath.id</ID>
|
||||
<ID>MaxLineLength:ChangeViewTypeDialog.kt$ChangeViewTypeDialog$class</ID>
|
||||
<ID>MaxLineLength:ChangeViewTypeDialog.kt$ChangeViewTypeDialog$val</ID>
|
||||
<ID>MaxLineLength:Config.kt$Config$fun getFolderViewType(path: String)</ID>
|
||||
<ID>MaxLineLength:Config.kt$Config$fun getLastVideoPosition(path: String)</ID>
|
||||
<ID>MaxLineLength:Config.kt$Config$set(allowRotatingWithGestures) = prefs.edit().putBoolean(ALLOW_ROTATING_WITH_GESTURES, allowRotatingWithGestures).apply()</ID>
|
||||
<ID>MaxLineLength:Config.kt$Config$set(avoidShowingAllFilesPrompt) = prefs.edit().putBoolean(AVOID_SHOWING_ALL_FILES_PROMPT, avoidShowingAllFilesPrompt).apply()</ID>
|
||||
<ID>MaxLineLength:Config.kt$Config$set(excludedFolders) = prefs.edit().remove(EXCLUDED_FOLDERS).putStringSet(EXCLUDED_FOLDERS, excludedFolders).apply()</ID>
|
||||
<ID>MaxLineLength:Config.kt$Config$set(includedFolders) = prefs.edit().remove(INCLUDED_FOLDERS).putStringSet(INCLUDED_FOLDERS, includedFolders).apply()</ID>
|
||||
<ID>MaxLineLength:Config.kt$Config$set(isExcludedPasswordProtectionOn) = prefs.edit().putBoolean(EXCLUDED_PASSWORD_PROTECTION, isExcludedPasswordProtectionOn).apply()</ID>
|
||||
<ID>MaxLineLength:Config.kt$Config$set(lastEditorCropAspectRatio) = prefs.edit().putInt(LAST_EDITOR_CROP_ASPECT_RATIO, lastEditorCropAspectRatio).apply()</ID>
|
||||
<ID>MaxLineLength:Config.kt$Config$set(lastEditorCropOtherAspectRatioX) = prefs.edit().putFloat(LAST_EDITOR_CROP_OTHER_ASPECT_RATIO_X, lastEditorCropOtherAspectRatioX).apply()</ID>
|
||||
<ID>MaxLineLength:Config.kt$Config$set(lastEditorCropOtherAspectRatioY) = prefs.edit().putFloat(LAST_EDITOR_CROP_OTHER_ASPECT_RATIO_Y, lastEditorCropOtherAspectRatioY).apply()</ID>
|
||||
<ID>MaxLineLength:Config.kt$Config$set(lastExportedFavoritesFolder) = prefs.edit().putString(LAST_EXPORTED_FAVORITES_FOLDER, lastExportedFavoritesFolder).apply()</ID>
|
||||
<ID>MaxLineLength:Config.kt$Config$set(openVideosOnSeparateScreen) = prefs.edit().putBoolean(OPEN_VIDEOS_ON_SEPARATE_SCREEN, openVideosOnSeparateScreen).apply()</ID>
|
||||
<ID>MaxLineLength:Config.kt$Config$set(searchAllFilesByDefault) = prefs.edit().putBoolean(SEARCH_ALL_FILES_BY_DEFAULT, searchAllFilesByDefault).apply()</ID>
|
||||
<ID>MaxLineLength:Config.kt$Config$set(showPermissionRationale) = prefs.edit().putBoolean(SHOW_PERMISSION_RATIONALE, showPermissionRationale).apply()</ID>
|
||||
<ID>MaxLineLength:Config.kt$Config$set(showRecycleBinAtFolders) = prefs.edit().putBoolean(SHOW_RECYCLE_BIN_AT_FOLDERS, showRecycleBinAtFolders).apply()</ID>
|
||||
<ID>MaxLineLength:Config.kt$Config$set(showThumbnailVideoDuration) = prefs.edit().putBoolean(SHOW_THUMBNAIL_VIDEO_DURATION, showThumbnailVideoDuration).apply()</ID>
|
||||
<ID>MaxLineLength:Config.kt$Config$set(tempSkipDeleteConfirmation) = prefs.edit().putBoolean(TEMP_SKIP_DELETE_CONFIRMATION, tempSkipDeleteConfirmation).apply()</ID>
|
||||
<ID>MaxLineLength:Config.kt$Config$set(temporarilyShowExcluded) = prefs.edit().putBoolean(TEMPORARILY_SHOW_EXCLUDED, temporarilyShowExcluded).apply()</ID>
|
||||
<ID>MaxLineLength:Constants.kt$const val DEFAULT_BOTTOM_ACTIONS = BOTTOM_ACTION_TOGGLE_FAVORITE or BOTTOM_ACTION_EDIT or BOTTOM_ACTION_SHARE or BOTTOM_ACTION_DELETE</ID>
|
||||
<ID>MaxLineLength:Context.kt$// but /storage/emulated/0/Pictures is empty, still Pictures with the first folders thumbnails and proper other info</ID>
|
||||
<ID>MaxLineLength:Context.kt$<no name provided>$override</ID>
|
||||
<ID>MaxLineLength:Context.kt$AlphanumericComparator().compare(o1.sortValue.lowercase(Locale.getDefault()), o2.sortValue.lowercase(Locale.getDefault()))</ID>
|
||||
<ID>MaxLineLength:Context.kt$GetMediaAsynctask</ID>
|
||||
<ID>MaxLineLength:Context.kt$MultiTransformation(WebpDrawableTransformation(CenterCrop()), WebpDrawableTransformation(roundedCornersTransform))</ID>
|
||||
<ID>MaxLineLength:Context.kt$allDirs.firstOrNull { parentDirs.firstOrNull { it.path.equals(currentPathPrefix, true) } == null && it.path.equals(currentPathPrefix, true) }</ID>
|
||||
<ID>MaxLineLength:Context.kt$dirsToCheck.filter { !it.areFavorites() && !it.isRecycleBin() && !getDoesFilePathExist(it.path, OTGPath) && it.path != config.tempFolderPath }</ID>
|
||||
<ID>MaxLineLength:Context.kt$fun</ID>
|
||||
<ID>MaxLineLength:Context.kt$if</ID>
|
||||
<ID>MaxLineLength:Context.kt$if (roundCorners == ROUNDED_CORNERS_SMALL) org.fossify.commons.R.dimen.rounded_corner_radius_small else org.fossify.commons.R.dimen.rounded_corner_radius_big</ID>
|
||||
<ID>MaxLineLength:Context.kt$it.path</ID>
|
||||
<ID>MaxLineLength:Context.kt$null</ID>
|
||||
<ID>MaxLineLength:Context.kt$o1.sortValue.normalizeString().lowercase(Locale.getDefault()).compareTo(o2.sortValue.normalizeString().lowercase(Locale.getDefault()))</ID>
|
||||
<ID>MaxLineLength:Context.kt$return</ID>
|
||||
<ID>MaxLineLength:Context.kt$return Directory(null, path, thumbnail!!, dirName, curMedia.size, lastModified, dateTaken, size, getPathLocation(path), mediaTypes, sortValue)</ID>
|
||||
<ID>MaxLineLength:Context.kt$sorting and SORT_BY_DATE_MODIFIED != 0 -> (o1.sortValue.toLongOrNull() ?: 0).compareTo(o2.sortValue.toLongOrNull() ?: 0)</ID>
|
||||
<ID>MaxLineLength:Context.kt$sorting and SORT_BY_SIZE != 0 -> (o1.sortValue.toLongOrNull() ?: 0).compareTo(o2.sortValue.toLongOrNull() ?: 0)</ID>
|
||||
<ID>MaxLineLength:Context.kt$val</ID>
|
||||
<ID>MaxLineLength:Context.kt$val dateTaken = if (isSortingAscending) Math.min(firstItem.taken, lastItem.taken) else Math.max(firstItem.taken, lastItem.taken)</ID>
|
||||
<ID>MaxLineLength:Context.kt$val directory = createDirectoryFromMedia(path, curMedia, albumCovers, hiddenString, includedFolders, getProperFileSize, noMediaFolders)</ID>
|
||||
<ID>MaxLineLength:Context.kt$val lastModified = if (isSortingAscending) Math.min(firstItem.modified, lastItem.modified) else Math.max(firstItem.modified, lastItem.modified)</ID>
|
||||
<ID>MaxLineLength:Context.kt$val newFolder = Directory(null, tempFolderPath, "", tempFolderPath.getFilenameFromPath(), 0, 0, 0, 0L, getPathLocation(tempFolderPath), 0, "")</ID>
|
||||
<ID>MaxLineLength:Context.kt$}</ID>
|
||||
<ID>MaxLineLength:CustomAspectRatioDialog.kt$CustomAspectRatioDialog$val activity: BaseSimpleActivity</ID>
|
||||
<ID>MaxLineLength:DateTakensDao.kt$DateTakensDao$@Query("SELECT full_path, filename, parent_path, date_taken, last_fixed, last_modified FROM date_takens WHERE parent_path = :path COLLATE NOCASE")</ID>
|
||||
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$(!isRPlus() || isExternalStorageManager()) && selectedPaths.any { !it.doesThisOrParentHaveNoMedia(HashMap(), null) }</ID>
|
||||
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$(!isRPlus() || isExternalStorageManager()) && selectedPaths.any { it.doesThisOrParentHaveNoMedia(HashMap(), null) }</ID>
|
||||
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$MyRecyclerViewAdapter(activity, recyclerView, itemClick), ItemTouchHelperContract, RecyclerViewFastScroller.OnPopupTextUpdate</ID>
|
||||
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$activity.directoryDB.updateDirectoryAfterRename(firstDir.tmb, firstDir.name, firstDir.path, sourcePath)</ID>
|
||||
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$activity: BaseSimpleActivity</ID>
|
||||
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$dirLocation.setImageResource(if (directory.location == LOCATION_SD) org.fossify.commons.R.drawable.ic_sd_card_vector else org.fossify.commons.R.drawable.ic_usb_vector)</ID>
|
||||
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$dirThumbnail.setImageDrawable(AppCompatResources.getDrawable(activity, R.drawable.ic_vector_warning_colored))</ID>
|
||||
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$findItem(R.id.cab_empty_disable_recycle_bin).isVisible = isOneItemSelected && selectedPaths.first() == RECYCLE_BIN</ID>
|
||||
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$findItem(R.id.cab_rename).isVisible = !selectedPaths.contains(FAVORITES) && !selectedPaths.contains(RECYCLE_BIN)</ID>
|
||||
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$override fun onChange(position: Int)</ID>
|
||||
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$paths.filter { config.isFolderProtected(it) && config.getFolderProtectionType(it) == tabToShow && config.getFolderProtectionHash(it) == hashToCheck }</ID>
|
||||
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$private</ID>
|
||||
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$private fun getAlbumCoversWithout(path: String)</ID>
|
||||
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$selectedPaths.filter { it != FAVORITES && it != RECYCLE_BIN && (selectedPaths.size == 1 || !config.isFolderProtected(it)) }</ID>
|
||||
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$val</ID>
|
||||
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$val paths = getSelectedPaths().filter { !activity.isAStorageRootFolder(it) && !config.isFolderProtected(it) } as ArrayList<String></ID>
|
||||
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$val removeDir = directory.path.doesThisOrParentHaveNoMedia(HashMap(), null) && !includedFolders.contains(directory.path)</ID>
|
||||
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$val warning = resources.getQuantityString(org.fossify.commons.R.plurals.delete_warning, itemsCnt, itemsCnt)</ID>
|
||||
<ID>MaxLineLength:DirectoryDao.kt$DirectoryDao$@Query("SELECT path, thumbnail, filename, media_count, last_modified, date_taken, size, location, media_types, sort_value FROM directories")</ID>
|
||||
<ID>MaxLineLength:DirectoryDao.kt$DirectoryDao$@Query("UPDATE OR REPLACE directories SET thumbnail = :thumbnail, media_count = :mediaCnt, last_modified = :lastModified, date_taken = :dateTaken, size = :size, media_types = :mediaTypes, sort_value = :sortValue WHERE path = :path COLLATE NOCASE")</ID>
|
||||
<ID>MaxLineLength:DirectoryDao.kt$DirectoryDao$@Query("UPDATE directories SET thumbnail = :thumbnail, filename = :name, path = :newPath WHERE path = :oldPath COLLATE NOCASE")</ID>
|
||||
<ID>MaxLineLength:DirectoryDao.kt$DirectoryDao$fun</ID>
|
||||
<ID>MaxLineLength:DirectoryItemBinding.kt$GridDirectoryItemRoundedCornersBinding$class</ID>
|
||||
<ID>MaxLineLength:EditActivity.kt$EditActivity$(binding.bottomEditorCropRotateActions.root.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 1)</ID>
|
||||
<ID>MaxLineLength:EditActivity.kt$EditActivity$binding.bottomEditorDrawActions.bottomDrawWidth.setColors(getProperTextColor(), getProperPrimaryColor(), getProperBackgroundColor())</ID>
|
||||
<ID>MaxLineLength:EditActivity.kt$EditActivity$if</ID>
|
||||
<ID>MaxLineLength:EditActivity.kt$EditActivity$if (intent.extras?.containsKey(REAL_FILE_PATH) == true) intent.getStringExtra(REAL_FILE_PATH)?.getParentPath() else internalStoragePath</ID>
|
||||
<ID>MaxLineLength:EditActivity.kt$EditActivity$intent.extras?.containsKey(MediaStore.EXTRA_OUTPUT) == true && intent.extras!!.get(MediaStore.EXTRA_OUTPUT) is Uri -> intent.extras!!.get(MediaStore.EXTRA_OUTPUT) as Uri</ID>
|
||||
<ID>MaxLineLength:EditActivity.kt$EditActivity$newPath = "$internalStoragePath/${getCurrentFormattedDateTime()}.${saveUri.toString().getFilenameExtension()}"</ID>
|
||||
<ID>MaxLineLength:EditActivity.kt$EditActivity$private fun getFiltersAdapter()</ID>
|
||||
<ID>MaxLineLength:EditActivity.kt$EditActivity$val layoutManager = binding.bottomEditorFilterActions.bottomActionsFilterList.layoutManager as LinearLayoutManager</ID>
|
||||
<ID>MaxLineLength:EditActivity.kt$EditActivity$val originalBitmap = Glide.with(applicationContext).asBitmap().load(uri).submit(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).get()</ID>
|
||||
<ID>MaxLineLength:EditActivity.kt$EditActivity$}</ID>
|
||||
<ID>MaxLineLength:EditActivity.kt$EditActivity.<no name provided>$if</ID>
|
||||
<ID>MaxLineLength:EditActivity.kt$EditActivity.<no name provided>$override</ID>
|
||||
<ID>MaxLineLength:ExcludeFolderDialog.kt$ExcludeFolderDialog$radioGroup!!.addView(radioButton, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))</ID>
|
||||
<ID>MaxLineLength:ExcludeFolderDialog.kt$ExcludeFolderDialog$val path = if (alternativePaths.isEmpty()) selectedPaths[0] else alternativePaths[radioGroup!!.checkedRadioButtonId]</ID>
|
||||
<ID>MaxLineLength:ExcludedFoldersActivity.kt$ExcludedFoldersActivity$updateMaterialActivityViews(binding.manageFoldersCoordinator, binding.manageFoldersList, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
|
||||
<ID>MaxLineLength:FavoritesDao.kt$FavoritesDao$@Query("SELECT favorites.full_path FROM favorites INNER JOIN media ON favorites.full_path = media.full_path WHERE media.deleted_ts = 0")</ID>
|
||||
<ID>MaxLineLength:FavoritesDao.kt$FavoritesDao$@Query("UPDATE OR REPLACE favorites SET filename = :newFilename, full_path = :newFullPath, parent_path = :newParentPath WHERE full_path = :oldPath COLLATE NOCASE")</ID>
|
||||
<ID>MaxLineLength:GalleryDatabase.kt$GalleryDatabase.Companion.<no name provided>$database.execSQL("CREATE TABLE IF NOT EXISTS `date_takens` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `full_path` TEXT NOT NULL, `filename` TEXT NOT NULL, `parent_path` TEXT NOT NULL, `date_taken` INTEGER NOT NULL, `last_fixed` INTEGER NOT NULL)")</ID>
|
||||
<ID>MaxLineLength:GalleryDatabase.kt$GalleryDatabase.Companion.<no name provided>$database.execSQL("CREATE TABLE IF NOT EXISTS `favorites` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `full_path` TEXT NOT NULL, `filename` TEXT NOT NULL, `parent_path` TEXT NOT NULL)")</ID>
|
||||
<ID>MaxLineLength:GalleryDatabase.kt$GalleryDatabase.Companion.<no name provided>$database.execSQL("CREATE TABLE IF NOT EXISTS `widgets` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `widget_id` INTEGER NOT NULL, `folder_path` TEXT NOT NULL)")</ID>
|
||||
<ID>MaxLineLength:GetMediaAsynctask.kt$GetMediaAsynctask$mPath</ID>
|
||||
<ID>MaxLineLength:GetMediaAsynctask.kt$GetMediaAsynctask$val foldersToScan = mediaFetcher.getFoldersToScan().filter { it != RECYCLE_BIN && it != FAVORITES && !context.config.isFolderProtected(it) }</ID>
|
||||
<ID>MaxLineLength:GrantAllFilesDialog.kt$GrantAllFilesDialog$.</ID>
|
||||
<ID>MaxLineLength:GridSpacingItemDecoration.kt$GridSpacingItemDecoration$override</ID>
|
||||
<ID>MaxLineLength:HiddenFoldersActivity.kt$HiddenFoldersActivity$updateMaterialActivityViews(binding.manageFoldersCoordinator, binding.manageFoldersList, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
|
||||
<ID>MaxLineLength:IncludedFoldersActivity.kt$IncludedFoldersActivity$updateMaterialActivityViews(binding.manageFoldersCoordinator, binding.manageFoldersList, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
|
||||
<ID>MaxLineLength:InstantItemSwitch.kt$InstantItemSwitch$if</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$(binding.directoriesRefreshLayout.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.BELOW, R.id.directories_switch_searching)</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$// exclude probably unwanted folders, for example facebook stickers are split between hundreds of separate folders like</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$// recyclerview sometimes becomes empty at init/update, triggering an invisible refresh like this seems to work fine</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$// update directories and media files in the local db, delete invalid items. Intentionally creating a new thread</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$// we are looping through the already displayed folders looking for changes, do not do anything if nothing changed</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$binding.directoriesRefreshLayout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$createDirectoryFromMedia(directory.path, curMedia, albumCovers, hiddenString, includedFolders, getProperFileSize, noMediaFolders)</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$dirsToShow</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.more_apps_from_us).isVisible = !resources.getBoolean(org.fossify.commons.R.bool.hide_google_relations)</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.stop_showing_hidden).isVisible = (!isRPlus() || isExternalStorageManager()) && config.temporarilyShowHidden</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$folders.asSequence().filter { it.isDirectory }.map { FileDirItem(it.absolutePath, it.name, true) }.toMutableList() as ArrayList<FileDirItem></ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$folders.filter { !it.absolutePath.isDownloadsFolder() && it.isDirectory && it.toFileDirItem(this).getProperFileCount(this, true) == 0 }</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$getStorageDirectories().firstOrNull { it.trimEnd('/') != internalStoragePath && it.trimEnd('/') != sdCardPath }</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$if</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$if (config.useRecycleBin && !config.tempSkipRecycleBin) org.fossify.commons.R.plurals.moving_items_into_bin else org.fossify.commons.R.plurals.delete_items</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$intent.extras?.containsKey(MediaStore.EXTRA_OUTPUT) == true && intent.flags and Intent.FLAG_GRANT_WRITE_URI_PERMISSION != 0</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$mIsThirdPartyIntent</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$private</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$private fun isImageType(intent: Intent)</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$private fun isPickImageIntent(intent: Intent)</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$private fun isPickVideoIntent(intent: Intent)</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$private fun isVideoType(intent: Intent)</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$private var mOpenedSubfolders = arrayListOf("") // used at "Group direct subfolders" for navigating Up with the back button</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$resultData.extras?.containsKey(PICKED_PATHS) == true -> fillPickedPaths(resultData, resultIntent)</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$toast(String.format(getString(org.fossify.commons.R.string.deleting_folder), config.tempFolderPath), Toast.LENGTH_LONG)</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$toast(String.format(getString(org.fossify.commons.R.string.deleting_folder), fileDirItems.first().name))</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$val android11Files = mLastMediaFetcher?.getAndroid11FolderMedia(getImagesOnly, getVideosOnly, favoritePaths, false, true, dateTakens)</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$val filesToDelete = mediaDB.getOldRecycleBinItems(System.currentTimeMillis() - MONTH_MILLISECONDS)</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$val newDir = createDirectoryFromMedia(folder, newMedia, albumCovers, hiddenString, includedFolders, getProperFileSize, noMediaFolders)</ID>
|
||||
<ID>MaxLineLength:ManageFoldersAdapter.kt$ManageFoldersAdapter$activity: BaseSimpleActivity</ID>
|
||||
<ID>MaxLineLength:MediaActivity.kt$MediaActivity$binding.mediaRefreshLayout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)</ID>
|
||||
<ID>MaxLineLength:MediaActivity.kt$MediaActivity$binding.mediaRefreshLayout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)</ID>
|
||||
<ID>MaxLineLength:MediaActivity.kt$MediaActivity$findItem(R.id.stop_showing_hidden).isVisible = (!isRPlus() || isExternalStorageManager()) && config.temporarilyShowHidden</ID>
|
||||
<ID>MaxLineLength:MediaActivity.kt$MediaActivity$this</ID>
|
||||
<ID>MaxLineLength:MediaActivity.kt$MediaActivity$updateMaterialActivityViews(binding.mediaCoordinator, binding.mediaGrid, useTransparentNavigation = !config.scrollHorizontally, useTopSearchMenu = true)</ID>
|
||||
<ID>MaxLineLength:MediaActivity.kt$MediaActivity$val deletingItems = resources.getQuantityString(org.fossify.commons.R.plurals.deleting_items, filtered.size, filtered.size)</ID>
|
||||
<ID>MaxLineLength:MediaActivity.kt$MediaActivity$val movingItems = resources.getQuantityString(org.fossify.commons.R.plurals.moving_items_into_bin, filtered.size, filtered.size)</ID>
|
||||
<ID>MaxLineLength:MediaActivity.kt$MediaActivity$val newGridDecoration = GridSpacingItemDecoration(spanCount, spacing, config.scrollHorizontally, config.fileRoundedCorners, media, useGridPosition)</ID>
|
||||
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$activity: BaseSimpleActivity</ID>
|
||||
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$findItem(R.id.cab_confirm_selection).isVisible = isAGetIntent && allowMultiplePicks && selectedKeys.isNotEmpty()</ID>
|
||||
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$findItem(R.id.cab_restore_recycle_bin_files).isVisible = selectedPaths.all { it.startsWith(activity.recycleBinPath) }</ID>
|
||||
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$if (config.useRecycleBin && !config.tempSkipRecycleBin && !isRecycleBin) org.fossify.commons.R.string.move_to_recycle_bin_confirmation else org.fossify.commons.R.string.deletion_confirmation</ID>
|
||||
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$mediumThumbnail.setImageDrawable(AppCompatResources.getDrawable(activity, R.drawable.ic_vector_warning_colored))</ID>
|
||||
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$menu.findItem(R.id.cab_add_to_favorites).isVisible = selectedItems.none { it.getIsInRecycleBin() } && selectedItems.any { !it.isFavorite }</ID>
|
||||
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$menu.findItem(R.id.cab_hide).isVisible = (!isRPlus() || isExternalStorageManager()) && !isInRecycleBin && selectedItems.any { !it.isHidden() }</ID>
|
||||
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$menu.findItem(R.id.cab_remove_from_favorites).isVisible = selectedItems.none { it.getIsInRecycleBin() } && selectedItems.any { it.isFavorite }</ID>
|
||||
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$menu.findItem(R.id.cab_unhide).isVisible = (!isRPlus() || isExternalStorageManager()) && !isInRecycleBin && selectedItems.any { it.isHidden() }</ID>
|
||||
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$private fun getItemWithKey(key: Int): Medium?</ID>
|
||||
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$val SAFPath = selectedPaths.firstOrNull { activity.needsStupidWritePermissions(it) } ?: getFirstSelectedItemPath() ?: return</ID>
|
||||
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$val deleteItemsString = resources.getQuantityString(org.fossify.commons.R.plurals.delete_items, itemsCnt, itemsCnt)</ID>
|
||||
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$val isSDOrOtgRootFolder = activity.isAStorageRootFolder(firstPath.getParentPath()) && !firstPath.startsWith(activity.internalStoragePath)</ID>
|
||||
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$val sdk30SAFPath = selectedPaths.firstOrNull { activity.isAccessibleWithSAFSdk30(it) } ?: getFirstSelectedItemPath() ?: return@handleSAFDialog</ID>
|
||||
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$AlphanumericComparator().compare(o1.name.normalizeString().lowercase(Locale.getDefault()), o2.name.normalizeString().lowercase(Locale.getDefault()))</ID>
|
||||
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$AlphanumericComparator().compare(o1.path.lowercase(Locale.getDefault()), o2.path.lowercase(Locale.getDefault()))</ID>
|
||||
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$FAVORITES -> favoritePaths.filter { showHidden || !it.contains("/.") }.map { File(it) }.toMutableList() as ArrayList<File></ID>
|
||||
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$Medium(null, filename, path, path.getParentPath(), lastModified, dateTaken, size, type, videoDuration, isFavorite, 0L, mediaStoreId)</ID>
|
||||
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$curPath</ID>
|
||||
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$curPath: String</ID>
|
||||
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$favoritePaths</ID>
|
||||
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$file.uri.toString().replaceFirst("${context.config.OTGTreeUri}/document/${context.config.OTGPartition}%3A", "${context.config.OTGPath}/")</ID>
|
||||
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$getAndroid11FolderMedia(isPickImage, isPickVideo, favoritePaths, true, getProperDateTaken, dateTakens.clone() as HashMap<String, Long>)</ID>
|
||||
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 || grouping and GROUP_BY_DATE_TAKEN_DAILY != 0</ID>
|
||||
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0 || grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0 -> formatDate(key, false)</ID>
|
||||
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$it</ID>
|
||||
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$lastModifieds: HashMap<String, Long></ID>
|
||||
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$o1.name.normalizeString().lowercase(Locale.getDefault()).compareTo(o2.name.normalizeString().lowercase(Locale.getDefault()))</ID>
|
||||
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$val</ID>
|
||||
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$val cover = portraitFiles.firstOrNull { it.name.contains("cover", true) } ?: portraitFiles.firstOrNull()</ID>
|
||||
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$val files = getAndroid11FolderMedia(isPickImage, isPickVideo, favoritePaths, false, getProperDateTaken, dateTakens)</ID>
|
||||
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$val foldersToScan = config.everShownFolders.filter { it == FAVORITES || it == RECYCLE_BIN || context.getDoesFilePathExist(it, OTGPath) }.toHashSet()</ID>
|
||||
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$val medium = Medium(null, filename, path, file.parent, lastModified, dateTaken, size, type, videoDuration, isFavorite, 0L, 0L)</ID>
|
||||
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$val medium = Medium(null, filename, path, folder, dateModified, dateTaken, size, type, videoDuration, isFavorite, 0L, 0L)</ID>
|
||||
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$val newMedia = getMediaOnOTG(curPath, isPickImage, isPickVideo, filterMedia, favoritePaths, getVideoDurations)</ID>
|
||||
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$val videoDuration = Math.round(cursor.getIntValue(MediaStore.MediaColumns.DURATION) / 1000.toDouble()).toInt()</ID>
|
||||
<ID>MaxLineLength:MediaSideScroll.kt$MediaSideScroll$activity: Activity</ID>
|
||||
<ID>MaxLineLength:Medium.kt$Medium$fun isHeic()</ID>
|
||||
<ID>MaxLineLength:MediumDao.kt$MediumDao$@Query("SELECT filename, full_path, parent_path, last_modified, date_taken, size, type, video_duration, is_favorite, deleted_ts, media_store_id FROM media WHERE deleted_ts != 0")</ID>
|
||||
<ID>MaxLineLength:MediumDao.kt$MediumDao$@Query("SELECT filename, full_path, parent_path, last_modified, date_taken, size, type, video_duration, is_favorite, deleted_ts, media_store_id FROM media WHERE deleted_ts < :timestmap AND deleted_ts != 0")</ID>
|
||||
<ID>MaxLineLength:MediumDao.kt$MediumDao$@Query("SELECT filename, full_path, parent_path, last_modified, date_taken, size, type, video_duration, is_favorite, deleted_ts, media_store_id FROM media WHERE deleted_ts = 0 AND is_favorite = 1")</ID>
|
||||
<ID>MaxLineLength:MediumDao.kt$MediumDao$@Query("SELECT filename, full_path, parent_path, last_modified, date_taken, size, type, video_duration, is_favorite, deleted_ts, media_store_id FROM media WHERE deleted_ts = 0 AND parent_path = :path COLLATE NOCASE")</ID>
|
||||
<ID>MaxLineLength:MediumDao.kt$MediumDao$@Query("UPDATE OR REPLACE media SET filename = :newFilename, full_path = :newFullPath, parent_path = :newParentPath WHERE full_path = :oldPath COLLATE NOCASE")</ID>
|
||||
<ID>MaxLineLength:MediumDao.kt$MediumDao$@Query("UPDATE OR REPLACE media SET full_path = :newPath, deleted_ts = :deletedTS WHERE full_path = :oldPath COLLATE NOCASE")</ID>
|
||||
<ID>MaxLineLength:MyPagerAdapter.kt$MyPagerAdapter$class</ID>
|
||||
<ID>MaxLineLength:MyWidgetProvider.kt$MyWidgetProvider$override</ID>
|
||||
<ID>MaxLineLength:MyWidgetProvider.kt$MyWidgetProvider$val pendingIntent = PendingIntent.getActivity(context, widget.widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)</ID>
|
||||
<ID>MaxLineLength:NewPhotoFetcher.kt$NewPhotoFetcher$if</ID>
|
||||
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$if</ID>
|
||||
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$mIsFullscreen = requireActivity().window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN</ID>
|
||||
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$orient = exif2.getTag(ExifInterface.TAG_ORIENTATION)?.getValueAsInt(defaultOrientation) ?: defaultOrientation</ID>
|
||||
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$resources.getDimension(R.dimen.portrait_photos_stripe_height).toInt()</ID>
|
||||
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$val actionsHeight = if (requireContext().config.bottomActions && !mIsFullscreen) resources.getDimension(R.dimen.bottom_actions_height) else 0f</ID>
|
||||
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$val imageParser = JpegImageParser().getXmpXml(ByteSourceInputStream(it, mMedium.name), HashMap<String, Any>())</ID>
|
||||
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$var bottomMargin = requireContext().navigationBarHeight + resources.getDimension(org.fossify.commons.R.dimen.normal_margin).toInt()</ID>
|
||||
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$var pathToLoad = if (getFilePathToShow().startsWith("content://")) getFilePathToShow() else "file://${getFilePathToShow()}"</ID>
|
||||
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment.<no name provided>$binding.gesturesView.controller.settings.isZoomEnabled = mMedium.isRaw() || mCurrentRotationDegrees != 0 || allowZoomingImages == false</ID>
|
||||
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment.<no name provided>$override</ID>
|
||||
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment.<no name provided>$setTextColor(if (context.config.blackBackground) Color.WHITE else context.getProperTextColor())</ID>
|
||||
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment.<no name provided>$val useHeight = if (mImageOrientation == ORIENTATION_ROTATE_90 || mImageOrientation == ORIENTATION_ROTATE_270) sWidth else sHeight</ID>
|
||||
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment.<no name provided>$val useWidth = if (mImageOrientation == ORIENTATION_ROTATE_90 || mImageOrientation == ORIENTATION_ROTATE_270) sHeight else sWidth</ID>
|
||||
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$binding.bottomActions.bottomEdit.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_EDIT != 0 && mMedium?.isImage() == true)</ID>
|
||||
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$binding.bottomActions.bottomSetAs.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SET_AS != 0 && mMedium?.isImage() == true)</ID>
|
||||
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$binding.bottomActions.root.layoutParams.height = resources.getDimension(R.dimen.bottom_actions_height).toInt() + navigationBarHeight</ID>
|
||||
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$binding.fragmentViewerToolbar.title = Html.fromHtml("<font color='${Color.WHITE.toHex()}'>${mMedium!!.name}</font>")</ID>
|
||||
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$findItem(R.id.menu_edit).isVisible = mMedium?.isImage() == true && mUri?.scheme == "file" && visibleBottomActions and BOTTOM_ACTION_EDIT == 0</ID>
|
||||
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$findItem(R.id.menu_properties).isVisible = mUri?.scheme == "file" && visibleBottomActions and BOTTOM_ACTION_PROPERTIES == 0</ID>
|
||||
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$findItem(R.id.menu_set_as).isVisible = mMedium?.isImage() == true && visibleBottomActions and BOTTOM_ACTION_SET_AS == 0</ID>
|
||||
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$if</ID>
|
||||
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$mMedium = Medium(null, filename, mUri.toString(), mUri!!.path!!.getParentPath(), 0, 0, file.length(), type, 0, false, 0L, 0)</ID>
|
||||
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$navigationIcon = resources.getColoredDrawableWithColor(org.fossify.commons.R.drawable.ic_arrow_left_vector, Color.WHITE)</ID>
|
||||
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$overflowIcon = resources.getColoredDrawableWithColor(org.fossify.commons.R.drawable.ic_three_dots_vector, Color.WHITE)</ID>
|
||||
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$val isFileFolderHidden = (File(realPath).isHidden || File(realPath.getParentPath(), NOMEDIA).exists() || realPath.contains("/."))</ID>
|
||||
<ID>MaxLineLength:PicassoRegionDecoder.kt$PicassoRegionDecoder$if</ID>
|
||||
<ID>MaxLineLength:PicassoRegionDecoder.kt$PicassoRegionDecoder$return bitmap ?: throw RuntimeException("Region decoder returned null bitmap - image format may not be supported")</ID>
|
||||
<ID>MaxLineLength:PickDirectoryDialog.kt$PickDirectoryDialog$activity</ID>
|
||||
<ID>MaxLineLength:PickDirectoryDialog.kt$PickDirectoryDialog$orientation = if (activity.config.scrollHorizontally && isGridViewType) RecyclerView.HORIZONTAL else RecyclerView.VERTICAL</ID>
|
||||
<ID>MaxLineLength:PickDirectoryDialog.kt$PickDirectoryDialog$val</ID>
|
||||
<ID>MaxLineLength:PickDirectoryDialog.kt$PickDirectoryDialog$}</ID>
|
||||
<ID>MaxLineLength:PickMediumDialog.kt$PickMediumDialog$activity</ID>
|
||||
<ID>MaxLineLength:PickMediumDialog.kt$PickMediumDialog$orientation = if (config.scrollHorizontally && isGridViewType) RecyclerView.HORIZONTAL else RecyclerView.VERTICAL</ID>
|
||||
<ID>MaxLineLength:PickMediumDialog.kt$PickMediumDialog$val</ID>
|
||||
<ID>MaxLineLength:PickMediumDialog.kt$PickMediumDialog$val newGridDecoration = GridSpacingItemDecoration(spanCount, spacing, config.scrollHorizontally, config.fileRoundedCorners, media, useGridPosition)</ID>
|
||||
<ID>MaxLineLength:PlaybackSpeedFragment.kt$PlaybackSpeedFragment$val background = ResourcesCompat.getDrawable(resources, org.fossify.commons.R.drawable.bottom_sheet_bg, requireContext().theme)</ID>
|
||||
<ID>MaxLineLength:PortraitPhotosAdapter.kt$PortraitPhotosAdapter$class</ID>
|
||||
<ID>MaxLineLength:ResizeMultipleImagesDialog.kt$ResizeMultipleImagesDialog$toast(resources.getQuantityString(R.plurals.failed_to_resize_images, failureCount, failureCount))</ID>
|
||||
<ID>MaxLineLength:ResizeWithPathDialog.kt$ResizeWithPathDialog$class</ID>
|
||||
<ID>MaxLineLength:ResizeWithPathDialog.kt$ResizeWithPathDialog$val title = String.format(activity.getString(org.fossify.commons.R.string.file_already_exists_overwrite), newFilename)</ID>
|
||||
<ID>MaxLineLength:SaveAsDialog.kt$SaveAsDialog$val activity: BaseSimpleActivity</ID>
|
||||
<ID>MaxLineLength:SaveAsDialog.kt$SaveAsDialog$val title = String.format(activity.getString(org.fossify.commons.R.string.file_already_exists_overwrite), newFilename)</ID>
|
||||
<ID>MaxLineLength:SearchActivity.kt$SearchActivity$binding.searchGrid.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)</ID>
|
||||
<ID>MaxLineLength:SearchActivity.kt$SearchActivity$binding.searchGrid.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)</ID>
|
||||
<ID>MaxLineLength:SearchActivity.kt$SearchActivity$updateMaterialActivityViews(binding.searchCoordinator, binding.searchGrid, useTransparentNavigation = true, useTopSearchMenu = true)</ID>
|
||||
<ID>MaxLineLength:SearchActivity.kt$SearchActivity$val decoration = GridSpacingItemDecoration(spanCount, spacing, config.scrollHorizontally, config.fileRoundedCorners, media, true)</ID>
|
||||
<ID>MaxLineLength:SearchActivity.kt$SearchActivity$val deletingItems = resources.getQuantityString(org.fossify.commons.R.plurals.deleting_items, filtered.size, filtered.size)</ID>
|
||||
<ID>MaxLineLength:SearchActivity.kt$SearchActivity$val movingItems = resources.getQuantityString(org.fossify.commons.R.plurals.moving_items_into_bin, filtered.size, filtered.size)</ID>
|
||||
<ID>MaxLineLength:SetWallpaperActivity.kt$SetWallpaperActivity$RadioItem(WallpaperManager.FLAG_SYSTEM or WallpaperManager.FLAG_LOCK, getString(R.string.home_and_lock_screen))</ID>
|
||||
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$"${getString(R.string.manage_included_folders)} (${getString(org.fossify.commons.R.string.no_permission)})"</ID>
|
||||
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$"${getString(org.fossify.commons.R.string.show_hidden_items)} (${getString(org.fossify.commons.R.string.no_permission)})"</ID>
|
||||
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$LAST_EDITOR_CROP_OTHER_ASPECT_RATIO_X -> config.lastEditorCropOtherAspectRatioX = value.toString().toFloat()</ID>
|
||||
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$LAST_EDITOR_CROP_OTHER_ASPECT_RATIO_Y -> config.lastEditorCropOtherAspectRatioY = value.toString().toFloat()</ID>
|
||||
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$binding.settingsExcludedItemPasswordProtectionHolder.beGoneIf(binding.settingsHiddenItemPasswordProtectionHolder.isVisible())</ID>
|
||||
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$binding.settingsUseEnglishHolder.beVisibleIf((config.wasUseEnglishToggled || Locale.getDefault().language != "en") && !isTiramisuPlus())</ID>
|
||||
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$if</ID>
|
||||
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$org.fossify.commons.R.string.fingerprint_setup_successfully</ID>
|
||||
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$toast(if (configValues.size > 0) org.fossify.commons.R.string.settings_imported_successfully else org.fossify.commons.R.string.no_entries_for_importing)</ID>
|
||||
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$toast(if (importedItems > 0) org.fossify.commons.R.string.importing_successful else org.fossify.commons.R.string.no_entries_for_importing)</ID>
|
||||
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$updateMaterialActivityViews(binding.settingsCoordinator, binding.settingsHolder, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
|
||||
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$}</ID>
|
||||
<ID>MaxLineLength:SlideshowDialog.kt$SlideshowDialog$intervalHint.hint = activity.getString(org.fossify.commons.R.string.seconds_raw).replaceFirstChar { it.uppercaseChar() }</ID>
|
||||
<ID>MaxLineLength:String.kt$folderNoMediaStatuses.getOrElse("$this/$NOMEDIA") { false } || ((!isRPlus() || isExternalStorageManager()) && File(this, NOMEDIA).exists())</ID>
|
||||
<ID>MaxLineLength:String.kt$fun String.isDownloadsFolder()</ID>
|
||||
<ID>MaxLineLength:String.kt$val noMediaExists = folderNoMediaStatuses.getOrElse(pathToCheck, { false }) || File(pathToCheck).exists()</ID>
|
||||
<ID>MaxLineLength:SvgModule.kt$SvgModule$registry.register(SVG::class.java, PictureDrawable::class.java, SvgDrawableTranscoder()).append(InputStream::class.java, SVG::class.java, SvgDecoder())</ID>
|
||||
<ID>MaxLineLength:SvgSoftwareLayerSetter.kt$SvgSoftwareLayerSetter$override</ID>
|
||||
<ID>MaxLineLength:VideoFragment.kt$VideoFragment$.</ID>
|
||||
<ID>MaxLineLength:VideoFragment.kt$VideoFragment$binding.bottomVideoTimeHolder.videoPlaybackSpeed.text = "${DecimalFormat("#.##").format(mConfig.playbackSpeed)}x"</ID>
|
||||
<ID>MaxLineLength:VideoFragment.kt$VideoFragment$class</ID>
|
||||
<ID>MaxLineLength:VideoFragment.kt$VideoFragment$if</ID>
|
||||
<ID>MaxLineLength:VideoFragment.kt$VideoFragment$mConfig = requireContext().config</ID>
|
||||
<ID>MaxLineLength:VideoFragment.kt$VideoFragment$mIsFullscreen = activity.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN</ID>
|
||||
<ID>MaxLineLength:VideoFragment.kt$VideoFragment$val drawableId = if (isSlow) R.drawable.ic_playback_speed_slow_vector else R.drawable.ic_playback_speed_vector</ID>
|
||||
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$.</ID>
|
||||
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$binding.bottomVideoTimeHolder.videoPlaybackSpeed.text = "${DecimalFormat("#.##").format(config.playbackSpeed)}x"</ID>
|
||||
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$binding.bottomVideoTimeHolder.videoTogglePlayPause.setImageResource(org.fossify.commons.R.drawable.ic_pause_outline_vector)</ID>
|
||||
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$binding.bottomVideoTimeHolder.videoTogglePlayPause.setImageResource(org.fossify.commons.R.drawable.ic_play_outline_vector)</ID>
|
||||
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$binding.videoBrightnessController</ID>
|
||||
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$binding.videoVolumeController</ID>
|
||||
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$if</ID>
|
||||
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$navigationIcon = resources.getColoredDrawableWithColor(org.fossify.commons.R.drawable.ic_arrow_left_vector, Color.WHITE)</ID>
|
||||
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$open</ID>
|
||||
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$overflowIcon = resources.getColoredDrawableWithColor(org.fossify.commons.R.drawable.ic_three_dots_vector, Color.WHITE)</ID>
|
||||
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$val drawableId = if (isSlow) R.drawable.ic_playback_speed_slow_vector else R.drawable.ic_playback_speed_vector</ID>
|
||||
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity.<no name provided>$override</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$!currentMedium.isFavorite && visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE == 0 && !currentMedium.getIsInRecycleBin()</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$(!isRPlus() || isExternalStorageManager()) && !currentMedium.isHidden() && visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY == 0 && !currentMedium.getIsInRecycleBin()</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$(!isRPlus() || isExternalStorageManager()) && currentMedium.isHidden() && visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY == 0 && !currentMedium.getIsInRecycleBin()</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$// show the selected image asap, while loading the rest in the background to allow swiping between them. Might be needed at third party intents</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$GetMediaAsynctask</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.bottomChangeOrientation.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_CHANGE_ORIENTATION != 0)</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.bottomChangeOrientation.setOnLongClickListener { toast(R.string.change_orientation); true }</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.bottomEdit.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_EDIT != 0 && currentMedium?.isSVG() == false)</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.bottomFavorite.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE != 0 && currentMedium?.getIsInRecycleBin() == false)</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.bottomProperties.setOnLongClickListener { toast(org.fossify.commons.R.string.properties); true }</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.bottomRename.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_RENAME != 0 && currentMedium?.getIsInRecycleBin() == false)</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.bottomResize.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_RESIZE != 0 && currentMedium?.isImage() == true)</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.bottomRotate.beVisibleIf(config.visibleBottomActions and BOTTOM_ACTION_ROTATE != 0 && getCurrentMedium()?.isImage() == true)</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.bottomToggleFileVisibility.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY != 0)</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.root.layoutParams.height = resources.getDimension(R.dimen.bottom_actions_height).toInt() + navigationBarHeight</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$currentMedium.isFavorite && visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE == 0 && !currentMedium.getIsInRecycleBin()</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$findItem(R.id.menu_change_orientation).isVisible = rotationDegrees == 0 && visibleBottomActions and BOTTOM_ACTION_CHANGE_ORIENTATION == 0</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$findItem(R.id.menu_edit).isVisible = visibleBottomActions and BOTTOM_ACTION_EDIT == 0 && !currentMedium.isSVG()</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$findItem(R.id.menu_rename).isVisible = visibleBottomActions and BOTTOM_ACTION_RENAME == 0 && !currentMedium.getIsInRecycleBin()</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$findItem(R.id.menu_resize).isVisible = visibleBottomActions and BOTTOM_ACTION_RESIZE == 0 && currentMedium.isImage()</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$findItem(R.id.menu_rotate).isVisible = currentMedium.isImage() && visibleBottomActions and BOTTOM_ACTION_ROTATE == 0</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$flipSides = orientation == ExifInterface.ORIENTATION_ROTATE_90 || orientation == ExifInterface.ORIENTATION_ROTATE_270</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$if (medium.isFavorite) org.fossify.commons.R.drawable.ic_star_vector else org.fossify.commons.R.drawable.ic_star_outline_vector</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$if (medium.isHidden()) org.fossify.commons.R.drawable.ic_unhide_vector else org.fossify.commons.R.drawable.ic_hide_vector</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$it.isImage() || it.isPortrait() || (config.slideshowIncludeVideos && it.isVideo() || (config.slideshowIncludeGIFs && it.isGIF()))</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$navigationIcon = resources.getColoredDrawableWithColor(org.fossify.commons.R.drawable.ic_arrow_left_vector, Color.WHITE)</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$overflowIcon = resources.getColoredDrawableWithColor(org.fossify.commons.R.drawable.ic_three_dots_vector, Color.WHITE)</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$private</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$private fun getCurrentFragment()</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$private fun getCurrentMedia()</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$toast(if (currentMedium?.isHidden() == true) org.fossify.commons.R.string.unhide else org.fossify.commons.R.string.hide); true</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$val isSDOrOtgRootFolder = isAStorageRootFolder(oldPath.getParentPath()) && !oldPath.startsWith(internalStoragePath)</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$val medium = Medium(null, filename, mPath, parent, ts, ts, File(mPath).length(), type, duration, isFavorite, 0, 0L)</ID>
|
||||
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity.<no name provided>$override</ID>
|
||||
<ID>MaxLineLength:ViewPagerFragment.kt$ViewPagerFragment$context!!.getResolution(file.absolutePath)?.formatAsResolution().let { if (it?.isNotEmpty() == true) details.appendLine(it) }</ID>
|
||||
<ID>MaxLineLength:ViewPagerFragment.kt$ViewPagerFragment$fun getPathToLoad(medium: Medium)</ID>
|
||||
<ID>MaxLineLength:ViewPagerFragment.kt$ViewPagerFragment$if</ID>
|
||||
<ID>MaxLineLength:WidgetConfigureActivity.kt$WidgetConfigureActivity$if</ID>
|
||||
<ID>NestedBlockDepth:Context.kt$fun Context.getDirectParentSubfolders(dirs: ArrayList<Directory>, currentPathPrefix: String): ArrayList<Directory></ID>
|
||||
<ID>NestedBlockDepth:Context.kt$fun Context.getNoMediaFoldersSync(): ArrayList<String></ID>
|
||||
<ID>NestedBlockDepth:Context.kt$fun Context.parseFileChannel(path: String, fc: FileChannel, level: Int, start: Long, end: Long, callback: () -> Unit)</ID>
|
||||
<ID>NestedBlockDepth:Context.kt$fun Context.updateSubfolderCounts(children: ArrayList<Directory>, parentDirs: ArrayList<Directory>)</ID>
|
||||
<ID>NestedBlockDepth:EditActivity.kt$EditActivity$override fun onCropImageComplete(view: CropImageView, result: CropImageView.CropResult)</ID>
|
||||
<ID>NestedBlockDepth:MainActivity.kt$MainActivity$override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?)</ID>
|
||||
<ID>NestedBlockDepth:MainActivity.kt$MainActivity$private fun getFoldersWithMedia(path: String): HashSet<String></ID>
|
||||
<ID>NestedBlockDepth:MainActivity.kt$MainActivity$private fun gotDirectories(newDirs: ArrayList<Directory>)</ID>
|
||||
<ID>NestedBlockDepth:MediaFetcher.kt$MediaFetcher$fun getFilesFrom( curPath: String, isPickImage: Boolean, isPickVideo: Boolean, getProperDateTaken: Boolean, getProperLastModified: Boolean, getProperFileSize: Boolean, favoritePaths: ArrayList<String>, getVideoDurations: Boolean, lastModifieds: HashMap<String, Long>, dateTakens: HashMap<String, Long>, android11Files: HashMap<String, ArrayList<Medium>>? ): ArrayList<Medium></ID>
|
||||
<ID>NestedBlockDepth:MediaFetcher.kt$MediaFetcher$private fun getLatestFileFolders(): LinkedHashSet<String></ID>
|
||||
<ID>NestedBlockDepth:MediaFetcher.kt$MediaFetcher$private fun getMediaInFolder( folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, getProperDateTaken: Boolean, getProperLastModified: Boolean, getProperFileSize: Boolean, favoritePaths: ArrayList<String>, getVideoDurations: Boolean, lastModifieds: HashMap<String, Long>, dateTakens: HashMap<String, Long> ): ArrayList<Medium></ID>
|
||||
<ID>NestedBlockDepth:MediaFetcher.kt$MediaFetcher$private fun parseCursor(cursor: Cursor): LinkedHashSet<String></ID>
|
||||
<ID>NestedBlockDepth:MediaSideScroll.kt$MediaSideScroll$override fun onTouchEvent(event: MotionEvent): Boolean</ID>
|
||||
<ID>NestedBlockDepth:PhotoFragment.kt$PhotoFragment$override fun fullscreenToggled(isFullscreen: Boolean)</ID>
|
||||
<ID>NestedBlockDepth:PhotoVideoActivity.kt$PhotoVideoActivity$private fun checkIntent(savedInstanceState: Bundle? = null)</ID>
|
||||
<ID>NestedBlockDepth:SettingsActivity.kt$SettingsActivity$private fun parseFile(inputStream: InputStream?)</ID>
|
||||
<ID>NestedBlockDepth:String.kt$fun String.shouldFolderBeVisible( excludedPaths: MutableSet<String>, includedPaths: MutableSet<String>, showHidden: Boolean, folderNoMediaStatuses: HashMap<String, Boolean>, callback: (path: String, hasNoMedia: Boolean) -> Unit ): Boolean</ID>
|
||||
<ID>NestedBlockDepth:VideoPlayerActivity.kt$VideoPlayerActivity$private fun handleEvent(event: MotionEvent)</ID>
|
||||
<ID>NestedBlockDepth:ViewPagerActivity.kt$ViewPagerActivity$private fun getPositionInList(items: MutableList<Medium>): Int</ID>
|
||||
<ID>ReturnCount:Context.kt$@Suppress("UNCHECKED_CAST") fun Context.getSortedDirectories(source: ArrayList<Directory>): ArrayList<Directory></ID>
|
||||
<ID>ReturnCount:Context.kt$fun Context.getDirectorySortingValue(media: ArrayList<Medium>, path: String, name: String, size: Long): String</ID>
|
||||
<ID>ReturnCount:ExcludeFolderDialog.kt$ExcludeFolderDialog$private fun getAlternativePathsList(): List<String></ID>
|
||||
<ID>ReturnCount:InstantItemSwitch.kt$InstantItemSwitch$override fun onTouchEvent(event: MotionEvent): Boolean</ID>
|
||||
<ID>ReturnCount:MediaFetcher.kt$MediaFetcher$fun groupMedia(media: ArrayList<Medium>, path: String): ArrayList<ThumbnailItem></ID>
|
||||
<ID>ReturnCount:MediaSideScroll.kt$MediaSideScroll$override fun onTouchEvent(event: MotionEvent): Boolean</ID>
|
||||
<ID>ReturnCount:PhotoFragment.kt$PhotoFragment$override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View</ID>
|
||||
<ID>ReturnCount:PhotoVideoActivity.kt$PhotoVideoActivity$private fun checkIntent(savedInstanceState: Bundle? = null)</ID>
|
||||
<ID>ReturnCount:String.kt$fun String.shouldFolderBeVisible( excludedPaths: MutableSet<String>, includedPaths: MutableSet<String>, showHidden: Boolean, folderNoMediaStatuses: HashMap<String, Boolean>, callback: (path: String, hasNoMedia: Boolean) -> Unit ): Boolean</ID>
|
||||
<ID>ReturnCount:ViewPagerActivity.kt$ViewPagerActivity$private fun getPositionInList(items: MutableList<Medium>): Int</ID>
|
||||
<ID>ReturnCount:ViewPagerActivity.kt$ViewPagerActivity$private fun initViewPager(savedPath: String)</ID>
|
||||
<ID>ReturnCount:ViewPagerActivity.kt$ViewPagerActivity$private fun isShowHiddenFlagNeeded(): Boolean</ID>
|
||||
<ID>ReturnCount:ViewPagerFragment.kt$ViewPagerFragment$fun getMediumExtendedDetails(medium: Medium): String</ID>
|
||||
<ID>SpreadOperator:Context.kt$(*mediaToDelete.toTypedArray())</ID>
|
||||
<ID>SpreadOperator:MainActivity.kt$MainActivity$(*mediaToDelete.toTypedArray())</ID>
|
||||
<ID>SwallowedException:Activity.kt$e: Exception</ID>
|
||||
<ID>SwallowedException:Activity.kt$e: OutOfMemoryError</ID>
|
||||
<ID>SwallowedException:Context.kt$e: Exception</ID>
|
||||
<ID>SwallowedException:EditActivity.kt$EditActivity$e: Exception</ID>
|
||||
<ID>SwallowedException:EditActivity.kt$EditActivity$e: OutOfMemoryError</ID>
|
||||
<ID>SwallowedException:IsoTypeReader.kt$IsoTypeReader$e: UnsupportedEncodingException</ID>
|
||||
<ID>SwallowedException:MainActivity.kt$MainActivity$e: Exception</ID>
|
||||
<ID>SwallowedException:MediaActivity.kt$MediaActivity$e: Exception</ID>
|
||||
<ID>SwallowedException:MediaFetcher.kt$MediaFetcher$e: Exception</ID>
|
||||
<ID>SwallowedException:MediaSideScroll.kt$MediaSideScroll$e: Settings.SettingNotFoundException</ID>
|
||||
<ID>SwallowedException:MyWidgetProvider.kt$MyWidgetProvider$e: Exception</ID>
|
||||
<ID>SwallowedException:PhotoFragment.kt$PhotoFragment$e: Exception</ID>
|
||||
<ID>SwallowedException:PhotoFragment.kt$PhotoFragment$e: OutOfMemoryError</ID>
|
||||
<ID>SwallowedException:PhotoVideoActivity.kt$PhotoVideoActivity$e: Exception</ID>
|
||||
<ID>SwallowedException:ResizeMultipleImagesDialog.kt$ResizeMultipleImagesDialog$e: OutOfMemoryError</ID>
|
||||
<ID>SwallowedException:SetWallpaperActivity.kt$SetWallpaperActivity$e: OutOfMemoryError</ID>
|
||||
<ID>SwallowedException:SettingsActivity.kt$SettingsActivity$e: ActivityNotFoundException</ID>
|
||||
<ID>SwallowedException:String.kt$e: IOException</ID>
|
||||
<ID>SwallowedException:ViewPagerActivity.kt$ViewPagerActivity$e: ActivityNotFoundException</ID>
|
||||
<ID>SwallowedException:ViewPagerActivity.kt$ViewPagerActivity$e: Exception</ID>
|
||||
<ID>SwallowedException:ViewPagerActivity.kt$ViewPagerActivity.<no name provided>$e: Exception</ID>
|
||||
<ID>SwallowedException:ViewPagerFragment.kt$ViewPagerFragment$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:Activity.kt$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:Context.kt$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:DirectoryAdapter.kt$DirectoryAdapter$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:EditActivity.kt$EditActivity$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:MainActivity.kt$MainActivity$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:MediaActivity.kt$MediaActivity$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:MediaFetcher.kt$MediaFetcher$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:MyWidgetProvider.kt$MyWidgetProvider$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:PhotoFragment.kt$PhotoFragment$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:PhotoVideoActivity.kt$PhotoVideoActivity$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:ResizeMultipleImagesDialog.kt$ResizeMultipleImagesDialog$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:SettingsActivity.kt$SettingsActivity$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:VideoFragment.kt$VideoFragment$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:VideoPlayerActivity.kt$VideoPlayerActivity$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:ViewPagerActivity.kt$ViewPagerActivity$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:ViewPagerActivity.kt$ViewPagerActivity.<no name provided>$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:ViewPagerFragment.kt$ViewPagerFragment$e: Exception</ID>
|
||||
<ID>TooGenericExceptionThrown:PicassoRegionDecoder.kt$PicassoRegionDecoder$throw RuntimeException("Region decoder returned null bitmap - image format may not be supported")</ID>
|
||||
<ID>TooManyFunctions:Activity.kt$org.fossify.gallery.extensions.Activity.kt</ID>
|
||||
<ID>TooManyFunctions:Config.kt$Config : BaseConfig</ID>
|
||||
<ID>TooManyFunctions:Context.kt$org.fossify.gallery.extensions.Context.kt</ID>
|
||||
<ID>TooManyFunctions:DirectoryAdapter.kt$DirectoryAdapter : MyRecyclerViewAdapterItemTouchHelperContractOnPopupTextUpdate</ID>
|
||||
<ID>TooManyFunctions:EditActivity.kt$EditActivity : SimpleActivityOnCropImageCompleteListener</ID>
|
||||
<ID>TooManyFunctions:EditorDrawCanvas.kt$EditorDrawCanvas : View</ID>
|
||||
<ID>TooManyFunctions:MainActivity.kt$MainActivity : SimpleActivityDirectoryOperationsListener</ID>
|
||||
<ID>TooManyFunctions:ManageFoldersAdapter.kt$ManageFoldersAdapter : MyRecyclerViewAdapter</ID>
|
||||
<ID>TooManyFunctions:ManageHiddenFoldersAdapter.kt$ManageHiddenFoldersAdapter : MyRecyclerViewAdapter</ID>
|
||||
<ID>TooManyFunctions:MediaActivity.kt$MediaActivity : SimpleActivityMediaOperationsListener</ID>
|
||||
<ID>TooManyFunctions:MediaAdapter.kt$MediaAdapter : MyRecyclerViewAdapterOnPopupTextUpdate</ID>
|
||||
<ID>TooManyFunctions:MediaFetcher.kt$MediaFetcher</ID>
|
||||
<ID>TooManyFunctions:Medium.kt$Medium : SerializableThumbnailItem</ID>
|
||||
<ID>TooManyFunctions:MediumDao.kt$MediumDao</ID>
|
||||
<ID>TooManyFunctions:PhotoFragment.kt$PhotoFragment : ViewPagerFragment</ID>
|
||||
<ID>TooManyFunctions:PhotoVideoActivity.kt$PhotoVideoActivity : SimpleActivityFragmentListener</ID>
|
||||
<ID>TooManyFunctions:SearchActivity.kt$SearchActivity : SimpleActivityMediaOperationsListener</ID>
|
||||
<ID>TooManyFunctions:SettingsActivity.kt$SettingsActivity : SimpleActivity</ID>
|
||||
<ID>TooManyFunctions:VideoFragment.kt$VideoFragment : ViewPagerFragmentSurfaceTextureListenerOnSeekBarChangeListenerPlaybackSpeedListener</ID>
|
||||
<ID>TooManyFunctions:VideoPlayerActivity.kt$VideoPlayerActivity : SimpleActivityOnSeekBarChangeListenerSurfaceTextureListenerPlaybackSpeedListener</ID>
|
||||
<ID>TooManyFunctions:ViewPagerActivity.kt$ViewPagerActivity : SimpleActivityOnPageChangeListenerFragmentListener</ID>
|
||||
<ID>TooManyFunctions:WidgetConfigureActivity.kt$WidgetConfigureActivity : SimpleActivity</ID>
|
||||
<ID>UnusedParameter:Activity.kt$toggleActionBarVisibility: Boolean</ID>
|
||||
<ID>UnusedPrivateMember:PhotoFragment.kt$PhotoFragment$private fun checkIfPanorama()</ID>
|
||||
<ID>UnusedPrivateMember:VideoFragment.kt$VideoFragment$private fun checkIfPanorama()</ID>
|
||||
<ID>UnusedPrivateProperty:MyPagerAdapter.kt$MyPagerAdapter$pos</ID>
|
||||
<ID>UnusedPrivateProperty:PhotoFragment.kt$PhotoFragment$i</ID>
|
||||
<ID>UnusedPrivateProperty:String.kt$i</ID>
|
||||
<ID>UtilityClassWithPublicConstructor:ExifInterface.kt$ExifInterfaceAttributes</ID>
|
||||
<ID>VariableNaming:Activity.kt$val BATCH_SIZE = 50</ID>
|
||||
<ID>VariableNaming:Activity.kt$val OTGPath = config.OTGPath</ID>
|
||||
<ID>VariableNaming:Context.kt$val FILE_CHANNEL_CONTAINERS = arrayListOf("moov", "trak", "mdia", "minf", "udta", "stbl")</ID>
|
||||
<ID>VariableNaming:Context.kt$val OTGPath = config.OTGPath</ID>
|
||||
<ID>VariableNaming:DirectoryAdapter.kt$DirectoryAdapter$val SAFPath = getFirstSelectedItemPath() ?: return</ID>
|
||||
<ID>VariableNaming:MainActivity.kt$MainActivity$val OTGPath = config.OTGPath</ID>
|
||||
<ID>VariableNaming:MediaActivity.kt$MediaActivity$private val LAST_MEDIA_CHECK_PERIOD = 3000L</ID>
|
||||
<ID>VariableNaming:MediaAdapter.kt$MediaAdapter$private val ITEM_MEDIUM_PHOTO = 2</ID>
|
||||
<ID>VariableNaming:MediaAdapter.kt$MediaAdapter$private val ITEM_MEDIUM_VIDEO_PORTRAIT = 1</ID>
|
||||
<ID>VariableNaming:MediaAdapter.kt$MediaAdapter$private val ITEM_SECTION = 0</ID>
|
||||
<ID>VariableNaming:MediaAdapter.kt$MediaAdapter$val SAFPath = selectedPaths.firstOrNull { activity.needsStupidWritePermissions(it) } ?: getFirstSelectedItemPath() ?: return</ID>
|
||||
<ID>VariableNaming:MediaFetcher.kt$MediaFetcher$val OTGPath = config.OTGPath</ID>
|
||||
<ID>VariableNaming:MediaFetcher.kt$MediaFetcher$val OTGPath = context.config.OTGPath</ID>
|
||||
<ID>VariableNaming:MediaSideScroll.kt$MediaSideScroll$private val SLIDE_INFO_FADE_DELAY = 1000L</ID>
|
||||
<ID>VariableNaming:PhotoFragment.kt$PhotoFragment$// devices with good displays, but the rest of the hardware not good enough for them private val WEIRD_DEVICES = arrayListOf( "motorola xt1685", "google nexus 5x" )</ID>
|
||||
<ID>VariableNaming:PhotoFragment.kt$PhotoFragment$private val DEFAULT_DOUBLE_TAP_ZOOM = 2f</ID>
|
||||
<ID>VariableNaming:PhotoFragment.kt$PhotoFragment$private val SAME_ASPECT_RATIO_THRESHOLD = 0.01</ID>
|
||||
<ID>VariableNaming:PhotoFragment.kt$PhotoFragment$private val ZOOMABLE_VIEW_LOAD_DELAY = 100L</ID>
|
||||
<ID>VariableNaming:PlaybackSpeedFragment.kt$PlaybackSpeedFragment$private val HALF_PROGRESS = MAX_PROGRESS / 2</ID>
|
||||
<ID>VariableNaming:PlaybackSpeedFragment.kt$PlaybackSpeedFragment$private val MAX_PLAYBACK_SPEED = 3f</ID>
|
||||
<ID>VariableNaming:PlaybackSpeedFragment.kt$PlaybackSpeedFragment$private val MAX_PROGRESS = (MAX_PLAYBACK_SPEED * 100 + MIN_PLAYBACK_SPEED * 100).toInt()</ID>
|
||||
<ID>VariableNaming:PlaybackSpeedFragment.kt$PlaybackSpeedFragment$private val MIN_PLAYBACK_SPEED = 0.25f</ID>
|
||||
<ID>VariableNaming:PlaybackSpeedFragment.kt$PlaybackSpeedFragment$private val STEP = 0.05f</ID>
|
||||
<ID>VariableNaming:SetWallpaperActivity.kt$SetWallpaperActivity$private val PICK_IMAGE = 1</ID>
|
||||
<ID>VariableNaming:SetWallpaperActivity.kt$SetWallpaperActivity$private val RATIO_LANDSCAPE = 1</ID>
|
||||
<ID>VariableNaming:SetWallpaperActivity.kt$SetWallpaperActivity$private val RATIO_PORTRAIT = 0</ID>
|
||||
<ID>VariableNaming:SetWallpaperActivity.kt$SetWallpaperActivity$private val RATIO_SQUARE = 2</ID>
|
||||
<ID>VariableNaming:VideoFragment.kt$VideoFragment$private val PROGRESS = "progress"</ID>
|
||||
<ID>VariableNaming:VideoPlayerActivity.kt$VideoPlayerActivity$private val PLAY_WHEN_READY_DRAG_DELAY = 100L</ID>
|
||||
<ID>WildcardImport:Activity.kt$import java.io.*</ID>
|
||||
<ID>WildcardImport:Activity.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:Activity.kt$import org.fossify.commons.helpers.*</ID>
|
||||
<ID>WildcardImport:ArrayList.kt$import org.fossify.gallery.helpers.*</ID>
|
||||
<ID>WildcardImport:ChangeFolderThumbnailStyleDialog.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:ChangeFolderThumbnailStyleDialog.kt$import org.fossify.gallery.helpers.*</ID>
|
||||
<ID>WildcardImport:ChangeGroupingDialog.kt$import org.fossify.gallery.helpers.*</ID>
|
||||
<ID>WildcardImport:ChangeSortingDialog.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:ChangeSortingDialog.kt$import org.fossify.commons.helpers.*</ID>
|
||||
<ID>WildcardImport:Config.kt$import org.fossify.commons.helpers.*</ID>
|
||||
<ID>WildcardImport:Constants.kt$import org.fossify.commons.helpers.*</ID>
|
||||
<ID>WildcardImport:Context.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:Context.kt$import org.fossify.commons.helpers.*</ID>
|
||||
<ID>WildcardImport:Context.kt$import org.fossify.gallery.helpers.*</ID>
|
||||
<ID>WildcardImport:Context.kt$import org.fossify.gallery.interfaces.*</ID>
|
||||
<ID>WildcardImport:Context.kt$import org.fossify.gallery.models.*</ID>
|
||||
<ID>WildcardImport:Directory.kt$import androidx.room.*</ID>
|
||||
<ID>WildcardImport:Directory.kt$import org.fossify.commons.helpers.*</ID>
|
||||
<ID>WildcardImport:DirectoryAdapter.kt$import org.fossify.commons.dialogs.*</ID>
|
||||
<ID>WildcardImport:DirectoryAdapter.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:DirectoryAdapter.kt$import org.fossify.commons.helpers.*</ID>
|
||||
<ID>WildcardImport:DirectoryAdapter.kt$import org.fossify.gallery.extensions.*</ID>
|
||||
<ID>WildcardImport:DirectoryAdapter.kt$import org.fossify.gallery.helpers.*</ID>
|
||||
<ID>WildcardImport:EditActivity.kt$import java.io.*</ID>
|
||||
<ID>WildcardImport:EditActivity.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:EditActivity.kt$import org.fossify.gallery.helpers.*</ID>
|
||||
<ID>WildcardImport:EditorDrawCanvas.kt$import android.graphics.*</ID>
|
||||
<ID>WildcardImport:ExcludedFoldersActivity.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:ExportFavoritesDialog.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:FilterMediaDialog.kt$import org.fossify.gallery.helpers.*</ID>
|
||||
<ID>WildcardImport:GalleryDatabase.kt$import org.fossify.gallery.interfaces.*</ID>
|
||||
<ID>WildcardImport:GalleryDatabase.kt$import org.fossify.gallery.models.*</ID>
|
||||
<ID>WildcardImport:GetMediaAsynctask.kt$import org.fossify.gallery.helpers.*</ID>
|
||||
<ID>WildcardImport:MainActivity.kt$import java.io.*</ID>
|
||||
<ID>WildcardImport:MainActivity.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:MainActivity.kt$import org.fossify.commons.helpers.*</ID>
|
||||
<ID>WildcardImport:MainActivity.kt$import org.fossify.gallery.extensions.*</ID>
|
||||
<ID>WildcardImport:MainActivity.kt$import org.fossify.gallery.helpers.*</ID>
|
||||
<ID>WildcardImport:ManageBottomActionsDialog.kt$import org.fossify.gallery.helpers.*</ID>
|
||||
<ID>WildcardImport:ManageExtendedDetailsDialog.kt$import org.fossify.gallery.helpers.*</ID>
|
||||
<ID>WildcardImport:ManageFoldersAdapter.kt$import android.view.*</ID>
|
||||
<ID>WildcardImport:MediaActivity.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:MediaActivity.kt$import org.fossify.commons.helpers.*</ID>
|
||||
<ID>WildcardImport:MediaActivity.kt$import org.fossify.gallery.dialogs.*</ID>
|
||||
<ID>WildcardImport:MediaActivity.kt$import org.fossify.gallery.extensions.*</ID>
|
||||
<ID>WildcardImport:MediaActivity.kt$import org.fossify.gallery.helpers.*</ID>
|
||||
<ID>WildcardImport:MediaAdapter.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:MediaAdapter.kt$import org.fossify.commons.helpers.*</ID>
|
||||
<ID>WildcardImport:MediaAdapter.kt$import org.fossify.gallery.databinding.*</ID>
|
||||
<ID>WildcardImport:MediaAdapter.kt$import org.fossify.gallery.extensions.*</ID>
|
||||
<ID>WildcardImport:MediaAdapter.kt$import org.fossify.gallery.helpers.*</ID>
|
||||
<ID>WildcardImport:MediaFetcher.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:MediaFetcher.kt$import org.fossify.commons.helpers.*</ID>
|
||||
<ID>WildcardImport:MediaFetcher.kt$import org.fossify.gallery.extensions.*</ID>
|
||||
<ID>WildcardImport:Medium.kt$import androidx.room.*</ID>
|
||||
<ID>WildcardImport:Medium.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:Medium.kt$import org.fossify.commons.helpers.*</ID>
|
||||
<ID>WildcardImport:Medium.kt$import org.fossify.gallery.helpers.*</ID>
|
||||
<ID>WildcardImport:MediumDao.kt$import androidx.room.*</ID>
|
||||
<ID>WildcardImport:PhotoFragment.kt$import androidx.exifinterface.media.ExifInterface.*</ID>
|
||||
<ID>WildcardImport:PhotoFragment.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:PhotoFragment.kt$import org.fossify.gallery.helpers.*</ID>
|
||||
<ID>WildcardImport:PhotoVideoActivity.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:PhotoVideoActivity.kt$import org.fossify.commons.helpers.*</ID>
|
||||
<ID>WildcardImport:PhotoVideoActivity.kt$import org.fossify.gallery.extensions.*</ID>
|
||||
<ID>WildcardImport:PhotoVideoActivity.kt$import org.fossify.gallery.helpers.*</ID>
|
||||
<ID>WildcardImport:PicassoRegionDecoder.kt$import android.graphics.*</ID>
|
||||
<ID>WildcardImport:PicassoRoundedCornersTransformation.kt$import android.graphics.*</ID>
|
||||
<ID>WildcardImport:PickDirectoryDialog.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:PickDirectoryDialog.kt$import org.fossify.gallery.extensions.*</ID>
|
||||
<ID>WildcardImport:PlaybackSpeedFragment.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:ResizeDialog.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:ResizeMultipleImagesDialog.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:ResizeWithPathDialog.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:SaveAsDialog.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:SearchActivity.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:SearchActivity.kt$import org.fossify.gallery.extensions.*</ID>
|
||||
<ID>WildcardImport:SettingsActivity.kt$import org.fossify.commons.dialogs.*</ID>
|
||||
<ID>WildcardImport:SettingsActivity.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:SettingsActivity.kt$import org.fossify.commons.helpers.*</ID>
|
||||
<ID>WildcardImport:SettingsActivity.kt$import org.fossify.gallery.dialogs.*</ID>
|
||||
<ID>WildcardImport:SettingsActivity.kt$import org.fossify.gallery.extensions.*</ID>
|
||||
<ID>WildcardImport:SettingsActivity.kt$import org.fossify.gallery.helpers.*</ID>
|
||||
<ID>WildcardImport:SimpleActivity.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:VideoFragment.kt$import android.view.*</ID>
|
||||
<ID>WildcardImport:VideoFragment.kt$import androidx.media3.common.*</ID>
|
||||
<ID>WildcardImport:VideoFragment.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:VideoFragment.kt$import org.fossify.gallery.helpers.*</ID>
|
||||
<ID>WildcardImport:VideoPlayerActivity.kt$import android.view.*</ID>
|
||||
<ID>WildcardImport:VideoPlayerActivity.kt$import androidx.media3.common.*</ID>
|
||||
<ID>WildcardImport:VideoPlayerActivity.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:VideoPlayerActivity.kt$import org.fossify.gallery.extensions.*</ID>
|
||||
<ID>WildcardImport:VideoPlayerActivity.kt$import org.fossify.gallery.helpers.*</ID>
|
||||
<ID>WildcardImport:ViewPagerActivity.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:ViewPagerActivity.kt$import org.fossify.commons.helpers.*</ID>
|
||||
<ID>WildcardImport:ViewPagerActivity.kt$import org.fossify.gallery.extensions.*</ID>
|
||||
<ID>WildcardImport:ViewPagerActivity.kt$import org.fossify.gallery.helpers.*</ID>
|
||||
<ID>WildcardImport:ViewPagerFragment.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:ViewPagerFragment.kt$import org.fossify.gallery.helpers.*</ID>
|
||||
<ID>WildcardImport:WidgetConfigureActivity.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:WidgetConfigureActivity.kt$import org.fossify.gallery.extensions.*</ID>
|
||||
</CurrentIssues>
|
||||
</SmellBaseline>
|
5393
app/lint-baseline.xml
Normal file
5393
app/lint-baseline.xml
Normal file
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,5 @@
|
|||
package org.fossify.gallery.activities
|
||||
|
||||
import android.annotation.TargetApi
|
||||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
import android.graphics.Bitmap
|
||||
|
@ -8,13 +7,15 @@ import android.graphics.Bitmap.CompressFormat
|
|||
import android.graphics.Color
|
||||
import android.graphics.Point
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.os.Handler
|
||||
import android.provider.MediaStore
|
||||
import android.view.View
|
||||
import android.widget.ImageView
|
||||
import android.widget.RelativeLayout
|
||||
import androidx.core.view.isInvisible
|
||||
import androidx.exifinterface.media.ExifInterface
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import com.bumptech.glide.Glide
|
||||
import com.bumptech.glide.load.DataSource
|
||||
|
@ -27,12 +28,12 @@ import com.bumptech.glide.request.target.Target
|
|||
import com.canhub.cropper.CropImageView
|
||||
import com.zomato.photofilters.FilterPack
|
||||
import com.zomato.photofilters.imageprocessors.Filter
|
||||
import kotlinx.coroutines.*
|
||||
import org.fossify.commons.dialogs.ColorPickerDialog
|
||||
import org.fossify.commons.extensions.*
|
||||
import org.fossify.commons.helpers.NavigationIcon
|
||||
import org.fossify.commons.helpers.REAL_FILE_PATH
|
||||
import org.fossify.commons.helpers.ensureBackgroundThread
|
||||
import org.fossify.commons.helpers.isNougatPlus
|
||||
import org.fossify.commons.models.FileDirItem
|
||||
import org.fossify.gallery.BuildConfig
|
||||
import org.fossify.gallery.R
|
||||
|
@ -50,7 +51,7 @@ import org.fossify.gallery.models.FilterItem
|
|||
import java.io.*
|
||||
import kotlin.math.max
|
||||
|
||||
class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener {
|
||||
class EditActivity : SimpleActivity() {
|
||||
companion object {
|
||||
init {
|
||||
System.loadLibrary("NativeImageProcessor")
|
||||
|
@ -90,6 +91,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
|
|||
private var oldExif: ExifInterface? = null
|
||||
private var filterInitialBitmap: Bitmap? = null
|
||||
private var originalUri: Uri? = null
|
||||
private var bitmapCroppingJob: Job? = null
|
||||
private val binding by viewBinding(ActivityEditBinding::inflate)
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
|
@ -254,7 +256,6 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
|
|||
binding.editorDrawCanvas.beGone()
|
||||
binding.cropImageView.apply {
|
||||
beVisible()
|
||||
setOnCropImageCompleteListener(this@EditActivity)
|
||||
setImageUriAsync(uri)
|
||||
guidelines = CropImageView.Guidelines.ON
|
||||
|
||||
|
@ -312,12 +313,11 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
|
|||
}
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.N)
|
||||
private fun saveImage() {
|
||||
setOldExif()
|
||||
|
||||
if (binding.cropImageView.isVisible()) {
|
||||
binding.cropImageView.croppedImageAsync()
|
||||
cropImageAsync()
|
||||
} else if (binding.editorDrawCanvas.isVisible()) {
|
||||
val bitmap = binding.editorDrawCanvas.getBitmap()
|
||||
if (saveUri.scheme == "file") {
|
||||
|
@ -355,14 +355,31 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
|
|||
}
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.N)
|
||||
private fun setCropProgressBarVisibility(visible: Boolean) {
|
||||
val progressBar: View? = binding.cropImageView.findViewById(com.canhub.cropper.R.id.CropProgressBar)
|
||||
progressBar?.isInvisible = visible.not()
|
||||
}
|
||||
|
||||
private fun cropImageAsync() {
|
||||
setCropProgressBarVisibility(visible = true)
|
||||
bitmapCroppingJob?.cancel()
|
||||
bitmapCroppingJob = lifecycleScope.launch(CoroutineExceptionHandler { _, t ->
|
||||
onCropImageComplete(bitmap = null, error = Exception(t))
|
||||
}) {
|
||||
val bitmap = withContext(Dispatchers.Default) {
|
||||
binding.cropImageView.getCroppedImage()
|
||||
}
|
||||
onCropImageComplete(bitmap, null)
|
||||
}.apply {
|
||||
invokeOnCompletion { setCropProgressBarVisibility(visible = false) }
|
||||
}
|
||||
}
|
||||
|
||||
private fun setOldExif() {
|
||||
var inputStream: InputStream? = null
|
||||
try {
|
||||
if (isNougatPlus()) {
|
||||
inputStream = contentResolver.openInputStream(uri!!)
|
||||
oldExif = ExifInterface(inputStream!!)
|
||||
}
|
||||
inputStream = contentResolver.openInputStream(uri!!)
|
||||
oldExif = ExifInterface(inputStream!!)
|
||||
} catch (e: Exception) {
|
||||
} finally {
|
||||
inputStream?.close()
|
||||
|
@ -387,7 +404,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
|
|||
binding.cropImageView.isVisible() -> {
|
||||
isSharingBitmap = true
|
||||
runOnUiThread {
|
||||
binding.cropImageView.croppedImageAsync()
|
||||
cropImageAsync()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -771,7 +788,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
|
|||
ResizeDialog(this, point) {
|
||||
resizeWidth = it.x
|
||||
resizeHeight = it.y
|
||||
binding.cropImageView.croppedImageAsync()
|
||||
cropImageAsync()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -799,11 +816,10 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
|
|||
}
|
||||
}
|
||||
|
||||
override fun onCropImageComplete(view: CropImageView, result: CropImageView.CropResult) {
|
||||
if (result.error == null && result.bitmap != null) {
|
||||
private fun onCropImageComplete(bitmap: Bitmap?, error: Exception?) {
|
||||
if (error == null && bitmap != null) {
|
||||
setOldExif()
|
||||
|
||||
val bitmap = result.bitmap!!
|
||||
if (isSharingBitmap) {
|
||||
isSharingBitmap = false
|
||||
shareBitmap(bitmap)
|
||||
|
@ -850,7 +866,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
|
|||
toast(R.string.unknown_file_location)
|
||||
}
|
||||
} else {
|
||||
toast("${getString(R.string.image_editing_failed)}: ${result.error?.message}")
|
||||
toast("${getString(R.string.image_editing_failed)}: ${error?.message}")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -904,7 +920,6 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
|
|||
}
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.N)
|
||||
private fun saveBitmap(file: File, bitmap: Bitmap, out: OutputStream, showSavingToast: Boolean) {
|
||||
if (showSavingToast) {
|
||||
toast(org.fossify.commons.R.string.saving)
|
||||
|
@ -918,10 +933,8 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
|
|||
}
|
||||
|
||||
try {
|
||||
if (isNougatPlus()) {
|
||||
val newExif = ExifInterface(file.absolutePath)
|
||||
oldExif?.copyNonDimensionAttributesTo(newExif)
|
||||
}
|
||||
val newExif = ExifInterface(file.absolutePath)
|
||||
oldExif?.copyNonDimensionAttributesTo(newExif)
|
||||
} catch (e: Exception) {
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package org.fossify.gallery.activities
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.ClipData
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
|
@ -16,8 +15,62 @@ import androidx.recyclerview.widget.RecyclerView
|
|||
import org.fossify.commons.dialogs.CreateNewFolderDialog
|
||||
import org.fossify.commons.dialogs.FilePickerDialog
|
||||
import org.fossify.commons.dialogs.RadioGroupDialog
|
||||
import org.fossify.commons.extensions.*
|
||||
import org.fossify.commons.helpers.*
|
||||
import org.fossify.commons.extensions.appLaunched
|
||||
import org.fossify.commons.extensions.appLockManager
|
||||
import org.fossify.commons.extensions.areSystemAnimationsEnabled
|
||||
import org.fossify.commons.extensions.beGone
|
||||
import org.fossify.commons.extensions.beVisible
|
||||
import org.fossify.commons.extensions.beVisibleIf
|
||||
import org.fossify.commons.extensions.checkWhatsNew
|
||||
import org.fossify.commons.extensions.deleteFiles
|
||||
import org.fossify.commons.extensions.getDoesFilePathExist
|
||||
import org.fossify.commons.extensions.getFileCount
|
||||
import org.fossify.commons.extensions.getFilePublicUri
|
||||
import org.fossify.commons.extensions.getFilenameFromPath
|
||||
import org.fossify.commons.extensions.getLatestMediaByDateId
|
||||
import org.fossify.commons.extensions.getLatestMediaId
|
||||
import org.fossify.commons.extensions.getMimeType
|
||||
import org.fossify.commons.extensions.getProperBackgroundColor
|
||||
import org.fossify.commons.extensions.getProperPrimaryColor
|
||||
import org.fossify.commons.extensions.getProperSize
|
||||
import org.fossify.commons.extensions.getProperTextColor
|
||||
import org.fossify.commons.extensions.getStorageDirectories
|
||||
import org.fossify.commons.extensions.getTimeFormat
|
||||
import org.fossify.commons.extensions.handleHiddenFolderPasswordProtection
|
||||
import org.fossify.commons.extensions.handleLockedFolderOpening
|
||||
import org.fossify.commons.extensions.hasAllPermissions
|
||||
import org.fossify.commons.extensions.hasOTGConnected
|
||||
import org.fossify.commons.extensions.hasPermission
|
||||
import org.fossify.commons.extensions.hideKeyboard
|
||||
import org.fossify.commons.extensions.internalStoragePath
|
||||
import org.fossify.commons.extensions.isExternalStorageManager
|
||||
import org.fossify.commons.extensions.isGif
|
||||
import org.fossify.commons.extensions.isGone
|
||||
import org.fossify.commons.extensions.isImageFast
|
||||
import org.fossify.commons.extensions.isMediaFile
|
||||
import org.fossify.commons.extensions.isPathOnOTG
|
||||
import org.fossify.commons.extensions.isRawFast
|
||||
import org.fossify.commons.extensions.isSvg
|
||||
import org.fossify.commons.extensions.isVideoFast
|
||||
import org.fossify.commons.extensions.launchMoreAppsFromUsIntent
|
||||
import org.fossify.commons.extensions.recycleBinPath
|
||||
import org.fossify.commons.extensions.sdCardPath
|
||||
import org.fossify.commons.extensions.showErrorToast
|
||||
import org.fossify.commons.extensions.toFileDirItem
|
||||
import org.fossify.commons.extensions.toast
|
||||
import org.fossify.commons.extensions.underlineText
|
||||
import org.fossify.commons.extensions.viewBinding
|
||||
import org.fossify.commons.helpers.DAY_SECONDS
|
||||
import org.fossify.commons.helpers.FAVORITES
|
||||
import org.fossify.commons.helpers.PERMISSION_READ_STORAGE
|
||||
import org.fossify.commons.helpers.SORT_BY_DATE_MODIFIED
|
||||
import org.fossify.commons.helpers.SORT_BY_DATE_TAKEN
|
||||
import org.fossify.commons.helpers.SORT_BY_SIZE
|
||||
import org.fossify.commons.helpers.SORT_USE_NUMERIC_VALUE
|
||||
import org.fossify.commons.helpers.VIEW_TYPE_GRID
|
||||
import org.fossify.commons.helpers.VIEW_TYPE_LIST
|
||||
import org.fossify.commons.helpers.ensureBackgroundThread
|
||||
import org.fossify.commons.helpers.isRPlus
|
||||
import org.fossify.commons.models.FileDirItem
|
||||
import org.fossify.commons.models.RadioItem
|
||||
import org.fossify.commons.models.Release
|
||||
|
@ -32,13 +85,70 @@ import org.fossify.gallery.dialogs.ChangeSortingDialog
|
|||
import org.fossify.gallery.dialogs.ChangeViewTypeDialog
|
||||
import org.fossify.gallery.dialogs.FilterMediaDialog
|
||||
import org.fossify.gallery.dialogs.GrantAllFilesDialog
|
||||
import org.fossify.gallery.extensions.*
|
||||
import org.fossify.gallery.helpers.*
|
||||
import org.fossify.gallery.extensions.addTempFolderIfNeeded
|
||||
import org.fossify.gallery.extensions.config
|
||||
import org.fossify.gallery.extensions.createDirectoryFromMedia
|
||||
import org.fossify.gallery.extensions.directoryDB
|
||||
import org.fossify.gallery.extensions.getCachedDirectories
|
||||
import org.fossify.gallery.extensions.getCachedMedia
|
||||
import org.fossify.gallery.extensions.getDirectorySortingValue
|
||||
import org.fossify.gallery.extensions.getDirsToShow
|
||||
import org.fossify.gallery.extensions.getDistinctPath
|
||||
import org.fossify.gallery.extensions.getFavoritePaths
|
||||
import org.fossify.gallery.extensions.getNoMediaFoldersSync
|
||||
import org.fossify.gallery.extensions.getOTGFolderChildrenNames
|
||||
import org.fossify.gallery.extensions.getSortedDirectories
|
||||
import org.fossify.gallery.extensions.handleExcludedFolderPasswordProtection
|
||||
import org.fossify.gallery.extensions.handleMediaManagementPrompt
|
||||
import org.fossify.gallery.extensions.isDownloadsFolder
|
||||
import org.fossify.gallery.extensions.launchAbout
|
||||
import org.fossify.gallery.extensions.launchCamera
|
||||
import org.fossify.gallery.extensions.launchSettings
|
||||
import org.fossify.gallery.extensions.mediaDB
|
||||
import org.fossify.gallery.extensions.movePathsInRecycleBin
|
||||
import org.fossify.gallery.extensions.movePinnedDirectoriesToFront
|
||||
import org.fossify.gallery.extensions.openRecycleBin
|
||||
import org.fossify.gallery.extensions.removeInvalidDBDirectories
|
||||
import org.fossify.gallery.extensions.storeDirectoryItems
|
||||
import org.fossify.gallery.extensions.tryDeleteFileDirItem
|
||||
import org.fossify.gallery.extensions.updateDBDirectory
|
||||
import org.fossify.gallery.extensions.updateWidgets
|
||||
import org.fossify.gallery.helpers.DIRECTORY
|
||||
import org.fossify.gallery.helpers.GET_ANY_INTENT
|
||||
import org.fossify.gallery.helpers.GET_IMAGE_INTENT
|
||||
import org.fossify.gallery.helpers.GET_VIDEO_INTENT
|
||||
import org.fossify.gallery.helpers.GROUP_BY_DATE_TAKEN_DAILY
|
||||
import org.fossify.gallery.helpers.GROUP_BY_DATE_TAKEN_MONTHLY
|
||||
import org.fossify.gallery.helpers.GROUP_BY_LAST_MODIFIED_DAILY
|
||||
import org.fossify.gallery.helpers.GROUP_BY_LAST_MODIFIED_MONTHLY
|
||||
import org.fossify.gallery.helpers.GROUP_DESCENDING
|
||||
import org.fossify.gallery.helpers.LOCATION_INTERNAL
|
||||
import org.fossify.gallery.helpers.MAX_COLUMN_COUNT
|
||||
import org.fossify.gallery.helpers.MONTH_MILLISECONDS
|
||||
import org.fossify.gallery.helpers.MediaFetcher
|
||||
import org.fossify.gallery.helpers.PICKED_PATHS
|
||||
import org.fossify.gallery.helpers.RECYCLE_BIN
|
||||
import org.fossify.gallery.helpers.SET_WALLPAPER_INTENT
|
||||
import org.fossify.gallery.helpers.SHOW_ALL
|
||||
import org.fossify.gallery.helpers.SHOW_TEMP_HIDDEN_DURATION
|
||||
import org.fossify.gallery.helpers.SKIP_AUTHENTICATION
|
||||
import org.fossify.gallery.helpers.TYPE_GIFS
|
||||
import org.fossify.gallery.helpers.TYPE_IMAGES
|
||||
import org.fossify.gallery.helpers.TYPE_RAWS
|
||||
import org.fossify.gallery.helpers.TYPE_SVGS
|
||||
import org.fossify.gallery.helpers.TYPE_VIDEOS
|
||||
import org.fossify.gallery.helpers.getDefaultFileFilter
|
||||
import org.fossify.gallery.helpers.getPermissionToRequest
|
||||
import org.fossify.gallery.helpers.getPermissionsToRequest
|
||||
import org.fossify.gallery.interfaces.DirectoryOperationsListener
|
||||
import org.fossify.gallery.jobs.NewPhotoFetcher
|
||||
import org.fossify.gallery.models.Directory
|
||||
import org.fossify.gallery.models.Medium
|
||||
import java.io.*
|
||||
import java.io.File
|
||||
import java.io.FileInputStream
|
||||
import java.io.FileNotFoundException
|
||||
import java.io.InputStream
|
||||
import java.io.OutputStream
|
||||
|
||||
class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
||||
companion object {
|
||||
|
@ -62,8 +172,13 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
private var mWasMediaManagementPromptShown = false
|
||||
private var mLatestMediaId = 0L
|
||||
private var mLatestMediaDateId = 0L
|
||||
private var mCurrentPathPrefix = "" // used at "Group direct subfolders" for navigation
|
||||
private var mOpenedSubfolders = arrayListOf("") // used at "Group direct subfolders" for navigating Up with the back button
|
||||
|
||||
// used at "Group direct subfolders" for navigation
|
||||
private var mCurrentPathPrefix = ""
|
||||
|
||||
// used at "Group direct subfolders" for navigating Up with the back button
|
||||
private var mOpenedSubfolders = arrayListOf("")
|
||||
|
||||
private var mDateFormat = ""
|
||||
private var mTimeFormat = ""
|
||||
private var mLastMediaHandler = Handler()
|
||||
|
@ -104,15 +219,19 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
mIsGetAnyContentIntent = isGetAnyContentIntent(intent)
|
||||
mIsSetWallpaperIntent = isSetWallpaperIntent(intent)
|
||||
mAllowPickingMultiple = intent.getBooleanExtra(Intent.EXTRA_ALLOW_MULTIPLE, false)
|
||||
mIsThirdPartyIntent = mIsPickImageIntent || mIsPickVideoIntent || mIsGetImageContentIntent || mIsGetVideoContentIntent ||
|
||||
mIsGetAnyContentIntent || mIsSetWallpaperIntent
|
||||
mIsThirdPartyIntent = mIsPickImageIntent
|
||||
|| mIsPickVideoIntent
|
||||
|| mIsGetImageContentIntent
|
||||
|| mIsGetVideoContentIntent
|
||||
|| mIsGetAnyContentIntent
|
||||
|| mIsSetWallpaperIntent
|
||||
|
||||
setupOptionsMenu()
|
||||
refreshMenuItems()
|
||||
|
||||
updateMaterialActivityViews(
|
||||
binding.directoriesCoordinator,
|
||||
binding.directoriesGrid,
|
||||
mainCoordinatorLayout = binding.directoriesCoordinator,
|
||||
nestedView = binding.directoriesGrid,
|
||||
useTransparentNavigation = !config.scrollHorizontally,
|
||||
useTopSearchMenu = true
|
||||
)
|
||||
|
@ -203,7 +322,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
getRecyclerAdapter()?.updatePrimaryColor()
|
||||
}
|
||||
|
||||
val styleString = "${config.folderStyle}${config.showFolderMediaCount}${config.limitFolderTitle}"
|
||||
val styleString =
|
||||
"${config.folderStyle}${config.showFolderMediaCount}${config.limitFolderTitle}"
|
||||
if (mStoredStyleString != styleString) {
|
||||
setupAdapter(mDirs, forceRecreate = true)
|
||||
}
|
||||
|
@ -281,7 +401,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
if (mCurrentPathPrefix.isEmpty()) {
|
||||
super.onBackPressed()
|
||||
} else {
|
||||
mOpenedSubfolders.removeLast()
|
||||
mOpenedSubfolders.removeAt(mOpenedSubfolders.lastIndex)
|
||||
mCurrentPathPrefix = mOpenedSubfolders.last()
|
||||
setupAdapter(mDirs)
|
||||
}
|
||||
|
@ -292,17 +412,21 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
}
|
||||
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
|
||||
if (resultCode == Activity.RESULT_OK) {
|
||||
if (resultCode == RESULT_OK) {
|
||||
if (requestCode == PICK_MEDIA && resultData != null) {
|
||||
val resultIntent = Intent()
|
||||
var resultUri: Uri? = null
|
||||
if (mIsThirdPartyIntent) {
|
||||
when {
|
||||
intent.extras?.containsKey(MediaStore.EXTRA_OUTPUT) == true && intent.flags and Intent.FLAG_GRANT_WRITE_URI_PERMISSION != 0 -> {
|
||||
intent.extras?.containsKey(MediaStore.EXTRA_OUTPUT) == true
|
||||
&& intent.flags and Intent.FLAG_GRANT_WRITE_URI_PERMISSION != 0 -> {
|
||||
resultUri = fillExtraOutput(resultData)
|
||||
}
|
||||
|
||||
resultData.extras?.containsKey(PICKED_PATHS) == true -> fillPickedPaths(resultData, resultIntent)
|
||||
resultData.extras?.containsKey(PICKED_PATHS) == true -> {
|
||||
fillPickedPaths(resultData, resultIntent)
|
||||
}
|
||||
|
||||
else -> fillIntentPath(resultData, resultIntent)
|
||||
}
|
||||
}
|
||||
|
@ -312,10 +436,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
resultIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||
}
|
||||
|
||||
setResult(Activity.RESULT_OK, resultIntent)
|
||||
setResult(RESULT_OK, resultIntent)
|
||||
finish()
|
||||
} else if (requestCode == PICK_WALLPAPER) {
|
||||
setResult(Activity.RESULT_OK)
|
||||
setResult(RESULT_OK)
|
||||
finish()
|
||||
}
|
||||
}
|
||||
|
@ -327,14 +451,17 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
binding.mainMenu.getToolbar().menu.apply {
|
||||
findItem(R.id.column_count).isVisible = config.viewTypeFolders == VIEW_TYPE_GRID
|
||||
findItem(R.id.set_as_default_folder).isVisible = !config.defaultFolder.isEmpty()
|
||||
findItem(R.id.open_recycle_bin).isVisible = config.useRecycleBin && !config.showRecycleBinAtFolders
|
||||
findItem(R.id.more_apps_from_us).isVisible = !resources.getBoolean(org.fossify.commons.R.bool.hide_google_relations)
|
||||
findItem(R.id.open_recycle_bin).isVisible =
|
||||
config.useRecycleBin && !config.showRecycleBinAtFolders
|
||||
findItem(R.id.more_apps_from_us).isVisible =
|
||||
!resources.getBoolean(org.fossify.commons.R.bool.hide_google_relations)
|
||||
}
|
||||
}
|
||||
|
||||
binding.mainMenu.getToolbar().menu.apply {
|
||||
findItem(R.id.temporarily_show_hidden).isVisible = !config.shouldShowHidden
|
||||
findItem(R.id.stop_showing_hidden).isVisible = (!isRPlus() || isExternalStorageManager()) && config.temporarilyShowHidden
|
||||
findItem(R.id.stop_showing_hidden).isVisible =
|
||||
(!isRPlus() || isExternalStorageManager()) && config.temporarilyShowHidden
|
||||
|
||||
findItem(R.id.temporarily_show_excluded).isVisible = !config.temporarilyShowExcluded
|
||||
findItem(R.id.stop_showing_excluded).isVisible = config.temporarilyShowExcluded
|
||||
|
@ -360,7 +487,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
|
||||
binding.mainMenu.onSearchTextChangedListener = { text ->
|
||||
setupAdapter(mDirsIgnoringSearch, text)
|
||||
binding.directoriesRefreshLayout.isEnabled = text.isEmpty() && config.enablePullToRefresh
|
||||
binding.directoriesRefreshLayout.isEnabled =
|
||||
text.isEmpty() && config.enablePullToRefresh
|
||||
binding.directoriesSwitchSearching.beVisibleIf(text.isNotEmpty())
|
||||
}
|
||||
|
||||
|
@ -407,11 +535,9 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
}
|
||||
|
||||
private fun startNewPhotoFetcher() {
|
||||
if (isNougatPlus()) {
|
||||
val photoFetcher = NewPhotoFetcher()
|
||||
if (!photoFetcher.isScheduled(applicationContext)) {
|
||||
photoFetcher.scheduleJob(applicationContext)
|
||||
}
|
||||
val photoFetcher = NewPhotoFetcher()
|
||||
if (!photoFetcher.isScheduled(applicationContext)) {
|
||||
photoFetcher.scheduleJob(applicationContext)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -419,8 +545,17 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
if (config.tempFolderPath.isNotEmpty()) {
|
||||
val newFolder = File(config.tempFolderPath)
|
||||
if (getDoesFilePathExist(newFolder.absolutePath) && newFolder.isDirectory) {
|
||||
if (newFolder.getProperSize(true) == 0L && newFolder.getFileCount(true) == 0 && newFolder.list()?.isEmpty() == true) {
|
||||
toast(String.format(getString(org.fossify.commons.R.string.deleting_folder), config.tempFolderPath), Toast.LENGTH_LONG)
|
||||
if (
|
||||
newFolder.getProperSize(true) == 0L
|
||||
&& newFolder.getFileCount(true) == 0
|
||||
&& newFolder.list()?.isEmpty() == true
|
||||
) {
|
||||
toast(
|
||||
String.format(
|
||||
getString(org.fossify.commons.R.string.deleting_folder),
|
||||
config.tempFolderPath
|
||||
), Toast.LENGTH_LONG
|
||||
)
|
||||
tryDeleteFileDirItem(newFolder.toFileDirItem(applicationContext), true, true)
|
||||
}
|
||||
}
|
||||
|
@ -431,7 +566,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
private fun checkOTGPath() {
|
||||
ensureBackgroundThread {
|
||||
if (!config.wasOTGHandled && hasPermission(getPermissionToRequest()) && hasOTGConnected() && config.OTGPath.isEmpty()) {
|
||||
getStorageDirectories().firstOrNull { it.trimEnd('/') != internalStoragePath && it.trimEnd('/') != sdCardPath }?.apply {
|
||||
getStorageDirectories().firstOrNull {
|
||||
it.trimEnd('/') != internalStoragePath
|
||||
&& it.trimEnd('/') != sdCardPath
|
||||
}?.apply {
|
||||
config.wasOTGHandled = true
|
||||
val otgPath = trimEnd('/')
|
||||
config.OTGPath = otgPath
|
||||
|
@ -459,7 +597,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
|
||||
private fun tryLoadGallery() {
|
||||
// avoid calling anything right after granting the permission, it will be called from onResume()
|
||||
val wasMissingPermission = config.appRunCount == 1 && !hasAllPermissions(getPermissionsToRequest())
|
||||
val wasMissingPermission =
|
||||
config.appRunCount == 1 && !hasAllPermissions(getPermissionsToRequest())
|
||||
handleMediaPermissions {
|
||||
if (wasMissingPermission) {
|
||||
return@handleMediaPermissions
|
||||
|
@ -598,23 +737,39 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
}
|
||||
|
||||
override fun deleteFolders(folders: ArrayList<File>) {
|
||||
val fileDirItems =
|
||||
folders.asSequence().filter { it.isDirectory }.map { FileDirItem(it.absolutePath, it.name, true) }.toMutableList() as ArrayList<FileDirItem>
|
||||
val fileDirItems = folders
|
||||
.asSequence()
|
||||
.filter { it.isDirectory }
|
||||
.map { FileDirItem(it.absolutePath, it.name, true) }
|
||||
.toMutableList() as ArrayList<FileDirItem>
|
||||
|
||||
when {
|
||||
fileDirItems.isEmpty() -> return
|
||||
fileDirItems.size == 1 -> {
|
||||
try {
|
||||
toast(String.format(getString(org.fossify.commons.R.string.deleting_folder), fileDirItems.first().name))
|
||||
toast(
|
||||
String.format(
|
||||
getString(org.fossify.commons.R.string.deleting_folder),
|
||||
fileDirItems.first().name
|
||||
)
|
||||
)
|
||||
} catch (e: Exception) {
|
||||
showErrorToast(e)
|
||||
}
|
||||
}
|
||||
|
||||
else -> {
|
||||
val baseString =
|
||||
if (config.useRecycleBin && !config.tempSkipRecycleBin) org.fossify.commons.R.plurals.moving_items_into_bin else org.fossify.commons.R.plurals.delete_items
|
||||
val deletingItems = resources.getQuantityString(baseString, fileDirItems.size, fileDirItems.size)
|
||||
toast(deletingItems)
|
||||
val baseString = if (config.useRecycleBin && !config.tempSkipRecycleBin) {
|
||||
org.fossify.commons.R.plurals.moving_items_into_bin
|
||||
} else {
|
||||
org.fossify.commons.R.plurals.delete_items
|
||||
}
|
||||
|
||||
toast(
|
||||
msg = resources.getQuantityString(
|
||||
baseString, fileDirItems.size, fileDirItems.size
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -624,12 +779,13 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
fileDirItems.filter { it.isDirectory }.forEach {
|
||||
val files = File(it.path).listFiles()
|
||||
files?.filter {
|
||||
it.absolutePath.isMediaFile() && (showHidden || !it.name.startsWith('.')) &&
|
||||
((it.isImageFast() && filter and TYPE_IMAGES != 0) ||
|
||||
(it.isVideoFast() && filter and TYPE_VIDEOS != 0) ||
|
||||
(it.isGif() && filter and TYPE_GIFS != 0) ||
|
||||
(it.isRawFast() && filter and TYPE_RAWS != 0) ||
|
||||
(it.isSvg() && filter and TYPE_SVGS != 0))
|
||||
it.absolutePath.isMediaFile()
|
||||
&& (showHidden || !it.name.startsWith('.'))
|
||||
&& ((it.isImageFast() && filter and TYPE_IMAGES != 0)
|
||||
|| (it.isVideoFast() && filter and TYPE_VIDEOS != 0)
|
||||
|| (it.isGif() && filter and TYPE_GIFS != 0)
|
||||
|| (it.isRawFast() && filter and TYPE_RAWS != 0)
|
||||
|| (it.isSvg() && filter and TYPE_SVGS != 0))
|
||||
}?.mapTo(itemsToDelete) { it.toFileDirItem(applicationContext) }
|
||||
}
|
||||
|
||||
|
@ -649,7 +805,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
}
|
||||
}
|
||||
|
||||
private fun deleteFilteredFileDirItems(fileDirItems: ArrayList<FileDirItem>, folders: ArrayList<File>) {
|
||||
private fun deleteFilteredFileDirItems(
|
||||
fileDirItems: ArrayList<FileDirItem>,
|
||||
folders: ArrayList<File>
|
||||
) {
|
||||
val OTGPath = config.OTGPath
|
||||
deleteFiles(fileDirItems) {
|
||||
runOnUiThread {
|
||||
|
@ -662,7 +821,11 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
}
|
||||
|
||||
if (config.deleteEmptyFolders) {
|
||||
folders.filter { !it.absolutePath.isDownloadsFolder() && it.isDirectory && it.toFileDirItem(this).getProperFileCount(this, true) == 0 }
|
||||
folders.filter {
|
||||
!it.absolutePath.isDownloadsFolder()
|
||||
&& it.isDirectory
|
||||
&& it.toFileDirItem(this).getProperFileCount(this, true) == 0
|
||||
}
|
||||
.forEach {
|
||||
tryDeleteFileDirItem(it.toFileDirItem(this), true, true)
|
||||
}
|
||||
|
@ -678,7 +841,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
setupListLayoutManager()
|
||||
}
|
||||
|
||||
(binding.directoriesRefreshLayout.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.BELOW, R.id.directories_switch_searching)
|
||||
(binding.directoriesRefreshLayout.layoutParams as RelativeLayout.LayoutParams)
|
||||
.addRule(RelativeLayout.BELOW, R.id.directories_switch_searching)
|
||||
}
|
||||
|
||||
private fun setupGridLayoutManager() {
|
||||
|
@ -686,11 +850,17 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
if (config.scrollHorizontally) {
|
||||
layoutManager.orientation = RecyclerView.HORIZONTAL
|
||||
binding.directoriesRefreshLayout.layoutParams =
|
||||
RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)
|
||||
RelativeLayout.LayoutParams(
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT,
|
||||
ViewGroup.LayoutParams.MATCH_PARENT
|
||||
)
|
||||
} else {
|
||||
layoutManager.orientation = RecyclerView.VERTICAL
|
||||
binding.directoriesRefreshLayout.layoutParams =
|
||||
RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
|
||||
RelativeLayout.LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
)
|
||||
}
|
||||
|
||||
layoutManager.spanCount = config.dirColumnCnt
|
||||
|
@ -700,7 +870,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
val layoutManager = binding.directoriesGrid.layoutManager as MyGridLayoutManager
|
||||
layoutManager.spanCount = 1
|
||||
layoutManager.orientation = RecyclerView.VERTICAL
|
||||
binding.directoriesRefreshLayout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
|
||||
binding.directoriesRefreshLayout.layoutParams = RelativeLayout.LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
)
|
||||
mZoomListener = null
|
||||
}
|
||||
|
||||
|
@ -741,10 +914,18 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
private fun changeColumnCount() {
|
||||
val items = ArrayList<RadioItem>()
|
||||
for (i in 1..MAX_COLUMN_COUNT) {
|
||||
items.add(RadioItem(i, resources.getQuantityString(org.fossify.commons.R.plurals.column_counts, i, i)))
|
||||
items.add(
|
||||
RadioItem(
|
||||
id = i,
|
||||
title = resources.getQuantityString(
|
||||
org.fossify.commons.R.plurals.column_counts, i, i
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
val currentColumnCount = (binding.directoriesGrid.layoutManager as MyGridLayoutManager).spanCount
|
||||
val currentColumnCount =
|
||||
(binding.directoriesGrid.layoutManager as MyGridLayoutManager).spanCount
|
||||
RadioGroupDialog(this, items, currentColumnCount) {
|
||||
val newColumnCount = it as Int
|
||||
if (currentColumnCount != newColumnCount) {
|
||||
|
@ -765,40 +946,69 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
}
|
||||
|
||||
private fun columnCountChanged() {
|
||||
(binding.directoriesGrid.layoutManager as MyGridLayoutManager).spanCount = config.dirColumnCnt
|
||||
(binding.directoriesGrid.layoutManager as MyGridLayoutManager).spanCount =
|
||||
config.dirColumnCnt
|
||||
refreshMenuItems()
|
||||
getRecyclerAdapter()?.apply {
|
||||
notifyItemRangeChanged(0, dirs.size)
|
||||
}
|
||||
}
|
||||
|
||||
private fun isPickImageIntent(intent: Intent) = isPickIntent(intent) && (hasImageContentData(intent) || isImageType(intent))
|
||||
private fun isPickImageIntent(intent: Intent): Boolean {
|
||||
return isPickIntent(intent) && (hasImageContentData(intent) || isImageType(intent))
|
||||
}
|
||||
|
||||
private fun isPickVideoIntent(intent: Intent) = isPickIntent(intent) && (hasVideoContentData(intent) || isVideoType(intent))
|
||||
private fun isPickVideoIntent(intent: Intent): Boolean {
|
||||
return isPickIntent(intent) && (hasVideoContentData(intent) || isVideoType(intent))
|
||||
}
|
||||
|
||||
private fun isPickIntent(intent: Intent) = intent.action == Intent.ACTION_PICK
|
||||
private fun isPickIntent(intent: Intent): Boolean {
|
||||
return intent.action == Intent.ACTION_PICK
|
||||
}
|
||||
|
||||
private fun isGetContentIntent(intent: Intent) = intent.action == Intent.ACTION_GET_CONTENT && intent.type != null
|
||||
private fun isGetContentIntent(intent: Intent): Boolean {
|
||||
return intent.action == Intent.ACTION_GET_CONTENT && intent.type != null
|
||||
}
|
||||
|
||||
private fun isGetImageContentIntent(intent: Intent) = isGetContentIntent(intent) &&
|
||||
(intent.type!!.startsWith("image/") || intent.type == Images.Media.CONTENT_TYPE)
|
||||
private fun isGetImageContentIntent(intent: Intent): Boolean {
|
||||
return isGetContentIntent(intent)
|
||||
&& (intent.type!!.startsWith("image/")
|
||||
|| intent.type == Images.Media.CONTENT_TYPE)
|
||||
}
|
||||
|
||||
private fun isGetVideoContentIntent(intent: Intent) = isGetContentIntent(intent) &&
|
||||
(intent.type!!.startsWith("video/") || intent.type == Video.Media.CONTENT_TYPE)
|
||||
private fun isGetVideoContentIntent(intent: Intent): Boolean {
|
||||
return isGetContentIntent(intent)
|
||||
&& (intent.type!!.startsWith("video/")
|
||||
|| intent.type == Video.Media.CONTENT_TYPE)
|
||||
}
|
||||
|
||||
private fun isGetAnyContentIntent(intent: Intent) = isGetContentIntent(intent) && intent.type == "*/*"
|
||||
private fun isGetAnyContentIntent(intent: Intent): Boolean {
|
||||
return isGetContentIntent(intent) && intent.type == "*/*"
|
||||
}
|
||||
|
||||
private fun isSetWallpaperIntent(intent: Intent?) = intent?.action == Intent.ACTION_SET_WALLPAPER
|
||||
private fun isSetWallpaperIntent(intent: Intent?): Boolean {
|
||||
return intent?.action == Intent.ACTION_SET_WALLPAPER
|
||||
}
|
||||
|
||||
private fun hasImageContentData(intent: Intent) = (intent.data == Images.Media.EXTERNAL_CONTENT_URI ||
|
||||
intent.data == Images.Media.INTERNAL_CONTENT_URI)
|
||||
private fun hasImageContentData(intent: Intent): Boolean {
|
||||
return intent.data == Images.Media.EXTERNAL_CONTENT_URI
|
||||
|| intent.data == Images.Media.INTERNAL_CONTENT_URI
|
||||
}
|
||||
|
||||
private fun hasVideoContentData(intent: Intent) = (intent.data == Video.Media.EXTERNAL_CONTENT_URI ||
|
||||
intent.data == Video.Media.INTERNAL_CONTENT_URI)
|
||||
private fun hasVideoContentData(intent: Intent): Boolean {
|
||||
return intent.data == Video.Media.EXTERNAL_CONTENT_URI
|
||||
|| intent.data == Video.Media.INTERNAL_CONTENT_URI
|
||||
}
|
||||
|
||||
private fun isImageType(intent: Intent) = (intent.type?.startsWith("image/") == true || intent.type == Images.Media.CONTENT_TYPE)
|
||||
private fun isImageType(intent: Intent): Boolean {
|
||||
return (intent.type?.startsWith("image/") == true
|
||||
|| intent.type == Images.Media.CONTENT_TYPE)
|
||||
}
|
||||
|
||||
private fun isVideoType(intent: Intent) = (intent.type?.startsWith("video/") == true || intent.type == Video.Media.CONTENT_TYPE)
|
||||
private fun isVideoType(intent: Intent): Boolean {
|
||||
return (intent.type?.startsWith("video/") == true
|
||||
|| intent.type == Video.Media.CONTENT_TYPE)
|
||||
}
|
||||
|
||||
private fun fillExtraOutput(resultData: Intent): Uri? {
|
||||
val file = File(resultData.data!!.path!!)
|
||||
|
@ -823,8 +1033,13 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
|
||||
private fun fillPickedPaths(resultData: Intent, resultIntent: Intent) {
|
||||
val paths = resultData.extras!!.getStringArrayList(PICKED_PATHS)
|
||||
val uris = paths!!.map { getFilePublicUri(File(it), BuildConfig.APPLICATION_ID) } as ArrayList
|
||||
val clipData = ClipData("Attachment", arrayOf("image/*", "video/*"), ClipData.Item(uris.removeAt(0)))
|
||||
val uris = paths!!
|
||||
.map { getFilePublicUri(File(it), BuildConfig.APPLICATION_ID) } as ArrayList
|
||||
val clipData = ClipData(
|
||||
"Attachment",
|
||||
arrayOf("image/*", "video/*"),
|
||||
ClipData.Item(uris.removeAt(0))
|
||||
)
|
||||
|
||||
uris.forEach {
|
||||
clipData.addItem(ClipData.Item(it))
|
||||
|
@ -878,7 +1093,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
// if hidden item showing is disabled but all Favorite items are hidden, hide the Favorites folder
|
||||
if (!config.shouldShowHidden) {
|
||||
val favoritesFolder = newDirs.firstOrNull { it.areFavorites() }
|
||||
if (favoritesFolder != null && favoritesFolder.tmb.getFilenameFromPath().startsWith('.')) {
|
||||
if (
|
||||
favoritesFolder != null
|
||||
&& favoritesFolder.tmb.getFilenameFromPath().startsWith('.')
|
||||
) {
|
||||
newDirs.remove(favoritesFolder)
|
||||
}
|
||||
}
|
||||
|
@ -911,7 +1129,11 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
val lastModifieds = mLastMediaFetcher!!.getLastModifieds()
|
||||
val dateTakens = mLastMediaFetcher!!.getDateTakens()
|
||||
|
||||
if (config.showRecycleBinAtFolders && !config.showRecycleBinLast && !dirs.map { it.path }.contains(RECYCLE_BIN)) {
|
||||
if (
|
||||
config.showRecycleBinAtFolders
|
||||
&& !config.showRecycleBinLast
|
||||
&& !dirs.map { it.path }.contains(RECYCLE_BIN)
|
||||
) {
|
||||
try {
|
||||
if (mediaDB.getDeletedMediaCount() > 0) {
|
||||
val recycleBin = Directory().apply {
|
||||
|
@ -939,7 +1161,14 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
}
|
||||
|
||||
// fetch files from MediaStore only, unless the app has the MANAGE_EXTERNAL_STORAGE permission on Android 11+
|
||||
val android11Files = mLastMediaFetcher?.getAndroid11FolderMedia(getImagesOnly, getVideosOnly, favoritePaths, false, true, dateTakens)
|
||||
val android11Files = mLastMediaFetcher?.getAndroid11FolderMedia(
|
||||
isPickImage = getImagesOnly,
|
||||
isPickVideo = getVideosOnly,
|
||||
favoritePaths = favoritePaths,
|
||||
getFavoritePathsOnly = false,
|
||||
getProperDateTaken = true,
|
||||
dateTakens = dateTakens
|
||||
)
|
||||
try {
|
||||
for (directory in dirs) {
|
||||
if (mShouldStopFetching || isDestroyed || isFinishing) {
|
||||
|
@ -948,19 +1177,29 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
|
||||
val sorting = config.getFolderSorting(directory.path)
|
||||
val grouping = config.getFolderGrouping(directory.path)
|
||||
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 ||
|
||||
sorting and SORT_BY_DATE_TAKEN != 0 ||
|
||||
grouping and GROUP_BY_DATE_TAKEN_DAILY != 0 ||
|
||||
grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0
|
||||
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0
|
||||
|| sorting and SORT_BY_DATE_TAKEN != 0
|
||||
|| grouping and GROUP_BY_DATE_TAKEN_DAILY != 0
|
||||
|| grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0
|
||||
|
||||
val getProperLastModified = config.directorySorting and SORT_BY_DATE_MODIFIED != 0 ||
|
||||
sorting and SORT_BY_DATE_MODIFIED != 0 ||
|
||||
grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 ||
|
||||
grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0
|
||||
val getProperLastModified =
|
||||
config.directorySorting and SORT_BY_DATE_MODIFIED != 0
|
||||
|| sorting and SORT_BY_DATE_MODIFIED != 0
|
||||
|| grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0
|
||||
|| grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0
|
||||
|
||||
val curMedia = mLastMediaFetcher!!.getFilesFrom(
|
||||
directory.path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified,
|
||||
getProperFileSize, favoritePaths, false, lastModifieds, dateTakens, android11Files
|
||||
curPath = directory.path,
|
||||
isPickImage = getImagesOnly,
|
||||
isPickVideo = getVideosOnly,
|
||||
getProperDateTaken = getProperDateTaken,
|
||||
getProperLastModified = getProperLastModified,
|
||||
getProperFileSize = getProperFileSize,
|
||||
favoritePaths = favoritePaths,
|
||||
getVideoDurations = false,
|
||||
lastModifieds = lastModifieds,
|
||||
dateTakens = dateTakens,
|
||||
android11Files = android11Files
|
||||
)
|
||||
|
||||
val newDir = if (curMedia.isEmpty()) {
|
||||
|
@ -969,7 +1208,15 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
}
|
||||
directory
|
||||
} else {
|
||||
createDirectoryFromMedia(directory.path, curMedia, albumCovers, hiddenString, includedFolders, getProperFileSize, noMediaFolders)
|
||||
createDirectoryFromMedia(
|
||||
path = directory.path,
|
||||
curMedia = curMedia,
|
||||
albumCovers = albumCovers,
|
||||
hiddenString = hiddenString,
|
||||
includedFolders = includedFolders,
|
||||
getProperFileSize = getProperFileSize,
|
||||
noMediaFolders = noMediaFolders
|
||||
)
|
||||
}
|
||||
|
||||
// we are looping through the already displayed folders looking for changes, do not do anything if nothing changed
|
||||
|
@ -985,7 +1232,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
taken = newDir.taken
|
||||
this@apply.size = newDir.size
|
||||
types = newDir.types
|
||||
sortValue = getDirectorySortingValue(curMedia, path, name, size)
|
||||
sortValue = getDirectorySortingValue(curMedia, path, name, size, mediaCnt)
|
||||
}
|
||||
|
||||
setupAdapter(dirs)
|
||||
|
@ -1055,19 +1302,28 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
|
||||
val sorting = config.getFolderSorting(folder)
|
||||
val grouping = config.getFolderGrouping(folder)
|
||||
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 ||
|
||||
sorting and SORT_BY_DATE_TAKEN != 0 ||
|
||||
grouping and GROUP_BY_DATE_TAKEN_DAILY != 0 ||
|
||||
grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0
|
||||
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0
|
||||
|| sorting and SORT_BY_DATE_TAKEN != 0
|
||||
|| grouping and GROUP_BY_DATE_TAKEN_DAILY != 0
|
||||
|| grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0
|
||||
|
||||
val getProperLastModified = config.directorySorting and SORT_BY_DATE_MODIFIED != 0 ||
|
||||
sorting and SORT_BY_DATE_MODIFIED != 0 ||
|
||||
grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 ||
|
||||
grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0
|
||||
val getProperLastModified = config.directorySorting and SORT_BY_DATE_MODIFIED != 0
|
||||
|| sorting and SORT_BY_DATE_MODIFIED != 0
|
||||
|| grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0
|
||||
|| grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0
|
||||
|
||||
val newMedia = mLastMediaFetcher!!.getFilesFrom(
|
||||
folder, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified,
|
||||
getProperFileSize, favoritePaths, false, lastModifieds, dateTakens, android11Files
|
||||
curPath = folder,
|
||||
isPickImage = getImagesOnly,
|
||||
isPickVideo = getVideosOnly,
|
||||
getProperDateTaken = getProperDateTaken,
|
||||
getProperLastModified = getProperLastModified,
|
||||
getProperFileSize = getProperFileSize,
|
||||
favoritePaths = favoritePaths,
|
||||
getVideoDurations = false,
|
||||
lastModifieds = lastModifieds,
|
||||
dateTakens = dateTakens,
|
||||
android11Files = android11Files
|
||||
)
|
||||
|
||||
if (newMedia.isEmpty()) {
|
||||
|
@ -1083,7 +1339,15 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
}
|
||||
}
|
||||
|
||||
val newDir = createDirectoryFromMedia(folder, newMedia, albumCovers, hiddenString, includedFolders, getProperFileSize, noMediaFolders)
|
||||
val newDir = createDirectoryFromMedia(
|
||||
path = folder,
|
||||
curMedia = newMedia,
|
||||
albumCovers = albumCovers,
|
||||
hiddenString = hiddenString,
|
||||
includedFolders = includedFolders,
|
||||
getProperFileSize = getProperFileSize,
|
||||
noMediaFolders = noMediaFolders
|
||||
)
|
||||
dirs.add(newDir)
|
||||
setupAdapter(dirs)
|
||||
|
||||
|
@ -1165,11 +1429,13 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
binding.directoriesEmptyPlaceholder2.beVisibleIf(dirs.isEmpty() && mLoadedInitialPhotos)
|
||||
|
||||
if (binding.mainMenu.isSearchOpen) {
|
||||
binding.directoriesEmptyPlaceholder.text = getString(org.fossify.commons.R.string.no_items_found)
|
||||
binding.directoriesEmptyPlaceholder.text =
|
||||
getString(org.fossify.commons.R.string.no_items_found)
|
||||
binding.directoriesEmptyPlaceholder2.beGone()
|
||||
} else if (dirs.isEmpty() && config.filterMedia == getDefaultFileFilter()) {
|
||||
if (isRPlus() && !isExternalStorageManager()) {
|
||||
binding.directoriesEmptyPlaceholder.text = getString(org.fossify.commons.R.string.no_items_found)
|
||||
binding.directoriesEmptyPlaceholder.text =
|
||||
getString(org.fossify.commons.R.string.no_items_found)
|
||||
binding.directoriesEmptyPlaceholder2.beGone()
|
||||
} else {
|
||||
binding.directoriesEmptyPlaceholder.text = getString(R.string.no_media_add_included)
|
||||
|
@ -1183,7 +1449,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
}
|
||||
} else {
|
||||
binding.directoriesEmptyPlaceholder.text = getString(R.string.no_media_with_filters)
|
||||
binding.directoriesEmptyPlaceholder2.text = getString(R.string.change_filters_underlined)
|
||||
binding.directoriesEmptyPlaceholder2.text =
|
||||
getString(R.string.change_filters_underlined)
|
||||
|
||||
binding.directoriesEmptyPlaceholder2.setOnClickListener {
|
||||
showFilterMediaDialog()
|
||||
|
@ -1194,11 +1461,22 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
binding.directoriesFastscroller.beVisibleIf(binding.directoriesEmptyPlaceholder.isGone())
|
||||
}
|
||||
|
||||
private fun setupAdapter(dirs: ArrayList<Directory>, textToSearch: String = binding.mainMenu.getCurrentQuery(), forceRecreate: Boolean = false) {
|
||||
private fun setupAdapter(
|
||||
dirs: ArrayList<Directory>,
|
||||
textToSearch: String = binding.mainMenu.getCurrentQuery(),
|
||||
forceRecreate: Boolean = false
|
||||
) {
|
||||
val currAdapter = binding.directoriesGrid.adapter
|
||||
val distinctDirs = dirs.distinctBy { it.path.getDistinctPath() }.toMutableList() as ArrayList<Directory>
|
||||
val distinctDirs = dirs
|
||||
.distinctBy { it.path.getDistinctPath() }
|
||||
.toMutableList() as ArrayList<Directory>
|
||||
|
||||
val sortedDirs = getSortedDirectories(distinctDirs)
|
||||
var dirsToShow = getDirsToShow(sortedDirs, mDirs, mCurrentPathPrefix).clone() as ArrayList<Directory>
|
||||
var dirsToShow = getDirsToShow(
|
||||
dirs = sortedDirs,
|
||||
allDirs = mDirs,
|
||||
currentPathPrefix = mCurrentPathPrefix
|
||||
).clone() as ArrayList<Directory>
|
||||
|
||||
if (currAdapter == null || forceRecreate) {
|
||||
mDirsIgnoringSearch = dirs
|
||||
|
@ -1236,7 +1514,9 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
} else {
|
||||
runOnUiThread {
|
||||
if (textToSearch.isNotEmpty()) {
|
||||
dirsToShow = dirsToShow.filter { it.name.contains(textToSearch, true) }.sortedBy { !it.name.startsWith(textToSearch, true) }
|
||||
dirsToShow = dirsToShow
|
||||
.filter { it.name.contains(textToSearch, true) }
|
||||
.sortedBy { !it.name.startsWith(textToSearch, true) }
|
||||
.toMutableList() as ArrayList
|
||||
}
|
||||
checkPlaceholderVisibility(dirsToShow)
|
||||
|
@ -1252,7 +1532,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
}
|
||||
|
||||
private fun setupScrollDirection() {
|
||||
val scrollHorizontally = config.scrollHorizontally && config.viewTypeFolders == VIEW_TYPE_GRID
|
||||
val scrollHorizontally =
|
||||
config.scrollHorizontally && config.viewTypeFolders == VIEW_TYPE_GRID
|
||||
binding.directoriesFastscroller.setScrollVertically(!scrollHorizontally)
|
||||
}
|
||||
|
||||
|
@ -1271,8 +1552,12 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
}
|
||||
|
||||
val hasMediaFile = children?.any {
|
||||
it != null && (it.isMediaFile() || (it.startsWith("img_", true) && File(it).isDirectory))
|
||||
} ?: false
|
||||
it != null && (
|
||||
it.isMediaFile()
|
||||
|| (it.startsWith("img_", true)
|
||||
&& File(it).isDirectory)
|
||||
)
|
||||
} == true
|
||||
|
||||
if (!hasMediaFile) {
|
||||
invalidDirs.add(it)
|
||||
|
@ -1349,7 +1634,9 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
Handler().postDelayed({
|
||||
ensureBackgroundThread {
|
||||
try {
|
||||
val filesToDelete = mediaDB.getOldRecycleBinItems(System.currentTimeMillis() - MONTH_MILLISECONDS)
|
||||
val filesToDelete = mediaDB.getOldRecycleBinItems(
|
||||
System.currentTimeMillis() - MONTH_MILLISECONDS
|
||||
)
|
||||
filesToDelete.forEach {
|
||||
if (File(it.path.replaceFirst(RECYCLE_BIN, recycleBinPath)).delete()) {
|
||||
mediaDB.deleteMediumPath(it.path)
|
||||
|
@ -1371,7 +1658,9 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
|
|||
val internalPath = internalStoragePath
|
||||
val checkedPaths = ArrayList<String>()
|
||||
val oftenRepeatedPaths = ArrayList<String>()
|
||||
val paths = mDirs.map { it.path.removePrefix(internalPath) }.toMutableList() as ArrayList<String>
|
||||
val paths = mDirs
|
||||
.map { it.path.removePrefix(internalPath) }
|
||||
.toMutableList() as ArrayList<String>
|
||||
paths.forEach {
|
||||
val parts = it.split("/")
|
||||
var currentString = ""
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
package org.fossify.gallery.activities
|
||||
|
||||
import android.app.Activity
|
||||
import android.app.WallpaperManager
|
||||
import android.content.Intent
|
||||
import android.graphics.Bitmap
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import android.os.Handler
|
||||
import android.view.ViewGroup
|
||||
import android.widget.RelativeLayout
|
||||
import androidx.core.net.toUri
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.bumptech.glide.Glide
|
||||
|
@ -17,8 +16,41 @@ import com.bumptech.glide.request.target.SimpleTarget
|
|||
import com.bumptech.glide.request.transition.Transition
|
||||
import org.fossify.commons.dialogs.CreateNewFolderDialog
|
||||
import org.fossify.commons.dialogs.RadioGroupDialog
|
||||
import org.fossify.commons.extensions.*
|
||||
import org.fossify.commons.helpers.*
|
||||
import org.fossify.commons.extensions.appLockManager
|
||||
import org.fossify.commons.extensions.areSystemAnimationsEnabled
|
||||
import org.fossify.commons.extensions.beGone
|
||||
import org.fossify.commons.extensions.beVisible
|
||||
import org.fossify.commons.extensions.beVisibleIf
|
||||
import org.fossify.commons.extensions.deleteFiles
|
||||
import org.fossify.commons.extensions.getDoesFilePathExist
|
||||
import org.fossify.commons.extensions.getFilenameFromPath
|
||||
import org.fossify.commons.extensions.getIsPathDirectory
|
||||
import org.fossify.commons.extensions.getLatestMediaByDateId
|
||||
import org.fossify.commons.extensions.getLatestMediaId
|
||||
import org.fossify.commons.extensions.getProperBackgroundColor
|
||||
import org.fossify.commons.extensions.getProperPrimaryColor
|
||||
import org.fossify.commons.extensions.getProperTextColor
|
||||
import org.fossify.commons.extensions.getTimeFormat
|
||||
import org.fossify.commons.extensions.handleHiddenFolderPasswordProtection
|
||||
import org.fossify.commons.extensions.handleLockedFolderOpening
|
||||
import org.fossify.commons.extensions.hideKeyboard
|
||||
import org.fossify.commons.extensions.isExternalStorageManager
|
||||
import org.fossify.commons.extensions.isGone
|
||||
import org.fossify.commons.extensions.isMediaFile
|
||||
import org.fossify.commons.extensions.isVideoFast
|
||||
import org.fossify.commons.extensions.isVisible
|
||||
import org.fossify.commons.extensions.recycleBinPath
|
||||
import org.fossify.commons.extensions.showErrorToast
|
||||
import org.fossify.commons.extensions.toast
|
||||
import org.fossify.commons.extensions.viewBinding
|
||||
import org.fossify.commons.helpers.FAVORITES
|
||||
import org.fossify.commons.helpers.IS_FROM_GALLERY
|
||||
import org.fossify.commons.helpers.REQUEST_EDIT_IMAGE
|
||||
import org.fossify.commons.helpers.SORT_BY_RANDOM
|
||||
import org.fossify.commons.helpers.VIEW_TYPE_GRID
|
||||
import org.fossify.commons.helpers.VIEW_TYPE_LIST
|
||||
import org.fossify.commons.helpers.ensureBackgroundThread
|
||||
import org.fossify.commons.helpers.isRPlus
|
||||
import org.fossify.commons.models.FileDirItem
|
||||
import org.fossify.commons.models.RadioItem
|
||||
import org.fossify.commons.views.MyGridLayoutManager
|
||||
|
@ -28,9 +60,49 @@ import org.fossify.gallery.adapters.MediaAdapter
|
|||
import org.fossify.gallery.asynctasks.GetMediaAsynctask
|
||||
import org.fossify.gallery.databases.GalleryDatabase
|
||||
import org.fossify.gallery.databinding.ActivityMediaBinding
|
||||
import org.fossify.gallery.dialogs.*
|
||||
import org.fossify.gallery.extensions.*
|
||||
import org.fossify.gallery.helpers.*
|
||||
import org.fossify.gallery.dialogs.ChangeGroupingDialog
|
||||
import org.fossify.gallery.dialogs.ChangeSortingDialog
|
||||
import org.fossify.gallery.dialogs.ChangeViewTypeDialog
|
||||
import org.fossify.gallery.dialogs.FilterMediaDialog
|
||||
import org.fossify.gallery.dialogs.GrantAllFilesDialog
|
||||
import org.fossify.gallery.extensions.config
|
||||
import org.fossify.gallery.extensions.deleteDBPath
|
||||
import org.fossify.gallery.extensions.directoryDB
|
||||
import org.fossify.gallery.extensions.emptyAndDisableTheRecycleBin
|
||||
import org.fossify.gallery.extensions.emptyTheRecycleBin
|
||||
import org.fossify.gallery.extensions.favoritesDB
|
||||
import org.fossify.gallery.extensions.getCachedMedia
|
||||
import org.fossify.gallery.extensions.getHumanizedFilename
|
||||
import org.fossify.gallery.extensions.isDownloadsFolder
|
||||
import org.fossify.gallery.extensions.launchAbout
|
||||
import org.fossify.gallery.extensions.launchCamera
|
||||
import org.fossify.gallery.extensions.launchSettings
|
||||
import org.fossify.gallery.extensions.mediaDB
|
||||
import org.fossify.gallery.extensions.movePathsInRecycleBin
|
||||
import org.fossify.gallery.extensions.openPath
|
||||
import org.fossify.gallery.extensions.openRecycleBin
|
||||
import org.fossify.gallery.extensions.restoreRecycleBinPaths
|
||||
import org.fossify.gallery.extensions.showRecycleBinEmptyingDialog
|
||||
import org.fossify.gallery.extensions.tryDeleteFileDirItem
|
||||
import org.fossify.gallery.extensions.updateWidgets
|
||||
import org.fossify.gallery.helpers.DIRECTORY
|
||||
import org.fossify.gallery.helpers.GET_ANY_INTENT
|
||||
import org.fossify.gallery.helpers.GET_IMAGE_INTENT
|
||||
import org.fossify.gallery.helpers.GET_VIDEO_INTENT
|
||||
import org.fossify.gallery.helpers.GridSpacingItemDecoration
|
||||
import org.fossify.gallery.helpers.IS_IN_RECYCLE_BIN
|
||||
import org.fossify.gallery.helpers.MAX_COLUMN_COUNT
|
||||
import org.fossify.gallery.helpers.MediaFetcher
|
||||
import org.fossify.gallery.helpers.PATH
|
||||
import org.fossify.gallery.helpers.PICKED_PATHS
|
||||
import org.fossify.gallery.helpers.RECYCLE_BIN
|
||||
import org.fossify.gallery.helpers.SET_WALLPAPER_INTENT
|
||||
import org.fossify.gallery.helpers.SHOW_ALL
|
||||
import org.fossify.gallery.helpers.SHOW_FAVORITES
|
||||
import org.fossify.gallery.helpers.SHOW_RECYCLE_BIN
|
||||
import org.fossify.gallery.helpers.SHOW_TEMP_HIDDEN_DURATION
|
||||
import org.fossify.gallery.helpers.SKIP_AUTHENTICATION
|
||||
import org.fossify.gallery.helpers.SLIDESHOW_START_ON_ENTER
|
||||
import org.fossify.gallery.interfaces.MediaOperationsListener
|
||||
import org.fossify.gallery.models.Medium
|
||||
import org.fossify.gallery.models.ThumbnailItem
|
||||
|
@ -49,6 +121,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
private var mAllowPickingMultiple = false
|
||||
private var mShowAll = false
|
||||
private var mLoadedInitialPhotos = false
|
||||
private var mShowLoadingIndicator = true
|
||||
private var mWasFullscreenViewOpen = false
|
||||
private var mLastSearchedText = ""
|
||||
private var mLatestMediaId = 0L
|
||||
|
@ -98,7 +171,12 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
setupOptionsMenu()
|
||||
refreshMenuItems()
|
||||
storeStateVariables()
|
||||
updateMaterialActivityViews(binding.mediaCoordinator, binding.mediaGrid, useTransparentNavigation = !config.scrollHorizontally, useTopSearchMenu = true)
|
||||
updateMaterialActivityViews(
|
||||
mainCoordinatorLayout = binding.mediaCoordinator,
|
||||
nestedView = binding.mediaGrid,
|
||||
useTransparentNavigation = !config.scrollHorizontally,
|
||||
useTopSearchMenu = true
|
||||
)
|
||||
|
||||
if (mShowAll) {
|
||||
registerFileUpdateListener()
|
||||
|
@ -164,6 +242,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
timeFormat = getTimeFormat()
|
||||
}
|
||||
|
||||
binding.loadingIndicator.setIndicatorColor(getProperPrimaryColor())
|
||||
binding.mediaEmptyTextPlaceholder.setTextColor(getProperTextColor())
|
||||
binding.mediaEmptyTextPlaceholder2.setTextColor(getProperPrimaryColor())
|
||||
binding.mediaEmptyTextPlaceholder2.bringToFront()
|
||||
|
@ -238,7 +317,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
|
||||
if (requestCode == REQUEST_EDIT_IMAGE) {
|
||||
if (resultCode == Activity.RESULT_OK && resultData != null) {
|
||||
if (resultCode == RESULT_OK && resultData != null) {
|
||||
mMedia.clear()
|
||||
refreshItems()
|
||||
}
|
||||
|
@ -247,7 +326,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
}
|
||||
|
||||
private fun refreshMenuItems() {
|
||||
val isDefaultFolder = !config.defaultFolder.isEmpty() && File(config.defaultFolder).compareTo(File(mPath)) == 0
|
||||
val isDefaultFolder = !config.defaultFolder.isEmpty()
|
||||
&& File(config.defaultFolder).compareTo(File(mPath)) == 0
|
||||
|
||||
binding.mediaMenu.getToolbar().menu.apply {
|
||||
findItem(R.id.group).isVisible = !config.scrollHorizontally
|
||||
|
@ -259,11 +339,13 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
findItem(R.id.folder_view).isVisible = mShowAll
|
||||
findItem(R.id.open_camera).isVisible = mShowAll
|
||||
findItem(R.id.about).isVisible = mShowAll
|
||||
findItem(R.id.create_new_folder).isVisible = !mShowAll && mPath != RECYCLE_BIN && mPath != FAVORITES
|
||||
findItem(R.id.create_new_folder).isVisible =
|
||||
!mShowAll && mPath != RECYCLE_BIN && mPath != FAVORITES
|
||||
findItem(R.id.open_recycle_bin).isVisible = config.useRecycleBin && mPath != RECYCLE_BIN
|
||||
|
||||
findItem(R.id.temporarily_show_hidden).isVisible = !config.shouldShowHidden
|
||||
findItem(R.id.stop_showing_hidden).isVisible = (!isRPlus() || isExternalStorageManager()) && config.temporarilyShowHidden
|
||||
findItem(R.id.stop_showing_hidden).isVisible =
|
||||
(!isRPlus() || isExternalStorageManager()) && config.temporarilyShowHidden
|
||||
|
||||
findItem(R.id.set_as_default_folder).isVisible = !isDefaultFolder
|
||||
findItem(R.id.unset_as_default_folder).isVisible = isDefaultFolder
|
||||
|
@ -350,12 +432,16 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
private fun searchQueryChanged(text: String) {
|
||||
ensureBackgroundThread {
|
||||
try {
|
||||
val filtered = mMedia.filter { it is Medium && it.name.contains(text, true) } as ArrayList
|
||||
val filtered = mMedia
|
||||
.filter { it is Medium && it.name.contains(text, true) } as ArrayList
|
||||
filtered.sortBy { it is Medium && !it.name.startsWith(text, true) }
|
||||
val grouped = MediaFetcher(applicationContext).groupMedia(filtered as ArrayList<Medium>, mPath)
|
||||
val grouped = MediaFetcher(applicationContext).groupMedia(
|
||||
media = filtered as ArrayList<Medium>, path = mPath
|
||||
)
|
||||
runOnUiThread {
|
||||
if (grouped.isEmpty()) {
|
||||
binding.mediaEmptyTextPlaceholder.text = getString(org.fossify.commons.R.string.no_items_found)
|
||||
binding.mediaEmptyTextPlaceholder.text =
|
||||
getString(org.fossify.commons.R.string.no_items_found)
|
||||
binding.mediaEmptyTextPlaceholder.beVisible()
|
||||
binding.mediaFastscroller.beGone()
|
||||
} else {
|
||||
|
@ -394,6 +480,11 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
}
|
||||
}
|
||||
|
||||
if (mShowLoadingIndicator) {
|
||||
binding.loadingIndicator.show()
|
||||
mShowLoadingIndicator = false
|
||||
}
|
||||
|
||||
getMedia()
|
||||
setupLayoutManager()
|
||||
}
|
||||
|
@ -410,8 +501,13 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
if (currAdapter == null) {
|
||||
initZoomListener()
|
||||
MediaAdapter(
|
||||
this, mMedia.clone() as ArrayList<ThumbnailItem>, this, mIsGetImageIntent || mIsGetVideoIntent || mIsGetAnyIntent,
|
||||
mAllowPickingMultiple, mPath, binding.mediaGrid
|
||||
activity = this,
|
||||
media = mMedia.clone() as ArrayList<ThumbnailItem>,
|
||||
listener = this,
|
||||
isAGetIntent = mIsGetImageIntent || mIsGetVideoIntent || mIsGetAnyIntent,
|
||||
allowMultiplePicks = mAllowPickingMultiple,
|
||||
path = mPath,
|
||||
recyclerView = binding.mediaGrid
|
||||
) {
|
||||
if (it is Medium && !isFinishing) {
|
||||
itemClicked(it.path)
|
||||
|
@ -578,7 +674,13 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
|
||||
private fun startAsyncTask() {
|
||||
mCurrAsyncTask?.stopFetching()
|
||||
mCurrAsyncTask = GetMediaAsynctask(applicationContext, mPath, mIsGetImageIntent, mIsGetVideoIntent, mShowAll) {
|
||||
mCurrAsyncTask = GetMediaAsynctask(
|
||||
context = applicationContext,
|
||||
mPath = mPath,
|
||||
isPickImage = mIsGetImageIntent,
|
||||
isPickVideo = mIsGetVideoIntent,
|
||||
showAll = mShowAll
|
||||
) {
|
||||
ensureBackgroundThread {
|
||||
val oldMedia = mMedia.clone() as ArrayList<ThumbnailItem>
|
||||
val newMedia = it
|
||||
|
@ -587,14 +689,17 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
|
||||
// remove cached files that are no longer valid for whatever reason
|
||||
val newPaths = newMedia.mapNotNull { it as? Medium }.map { it.path }
|
||||
oldMedia.mapNotNull { it as? Medium }.filter { !newPaths.contains(it.path) }.forEach {
|
||||
if (mPath == FAVORITES && getDoesFilePathExist(it.path)) {
|
||||
favoritesDB.deleteFavoritePath(it.path)
|
||||
mediaDB.updateFavorite(it.path, false)
|
||||
} else {
|
||||
mediaDB.deleteMediumPath(it.path)
|
||||
oldMedia
|
||||
.mapNotNull { it as? Medium }
|
||||
.filter { !newPaths.contains(it.path) }
|
||||
.forEach {
|
||||
if (mPath == FAVORITES && getDoesFilePathExist(it.path)) {
|
||||
favoritesDB.deleteFavoritePath(it.path)
|
||||
mediaDB.updateFavorite(it.path, false)
|
||||
} else {
|
||||
mediaDB.deleteMediumPath(it.path)
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
}
|
||||
}
|
||||
|
@ -604,7 +709,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
}
|
||||
|
||||
private fun isDirEmpty(): Boolean {
|
||||
return if (mMedia.size <= 0 && config.filterMedia > 0) {
|
||||
return if (mMedia.isEmpty() && config.filterMedia > 0) {
|
||||
if (mPath != FAVORITES && mPath != RECYCLE_BIN) {
|
||||
deleteDirectoryIfEmpty()
|
||||
deleteDBDirectory()
|
||||
|
@ -679,10 +784,16 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
val layoutManager = binding.mediaGrid.layoutManager as MyGridLayoutManager
|
||||
if (config.scrollHorizontally) {
|
||||
layoutManager.orientation = RecyclerView.HORIZONTAL
|
||||
binding.mediaRefreshLayout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)
|
||||
binding.mediaRefreshLayout.layoutParams = RelativeLayout.LayoutParams(
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT,
|
||||
ViewGroup.LayoutParams.MATCH_PARENT
|
||||
)
|
||||
} else {
|
||||
layoutManager.orientation = RecyclerView.VERTICAL
|
||||
binding.mediaRefreshLayout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
|
||||
binding.mediaRefreshLayout.layoutParams = RelativeLayout.LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
)
|
||||
}
|
||||
|
||||
layoutManager.spanCount = config.mediaColumnCnt
|
||||
|
@ -702,7 +813,10 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
val layoutManager = binding.mediaGrid.layoutManager as MyGridLayoutManager
|
||||
layoutManager.spanCount = 1
|
||||
layoutManager.orientation = RecyclerView.VERTICAL
|
||||
binding.mediaRefreshLayout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
|
||||
binding.mediaRefreshLayout.layoutParams = RelativeLayout.LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
)
|
||||
mZoomListener = null
|
||||
}
|
||||
|
||||
|
@ -715,11 +829,19 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
|
||||
var currentGridDecoration: GridSpacingItemDecoration? = null
|
||||
if (binding.mediaGrid.itemDecorationCount > 0) {
|
||||
currentGridDecoration = binding.mediaGrid.getItemDecorationAt(0) as GridSpacingItemDecoration
|
||||
currentGridDecoration =
|
||||
binding.mediaGrid.getItemDecorationAt(0) as GridSpacingItemDecoration
|
||||
currentGridDecoration.items = media
|
||||
}
|
||||
|
||||
val newGridDecoration = GridSpacingItemDecoration(spanCount, spacing, config.scrollHorizontally, config.fileRoundedCorners, media, useGridPosition)
|
||||
val newGridDecoration = GridSpacingItemDecoration(
|
||||
spanCount = spanCount,
|
||||
spacing = spacing,
|
||||
isScrollingHorizontally = config.scrollHorizontally,
|
||||
addSideSpacing = config.fileRoundedCorners,
|
||||
items = media,
|
||||
useGridPosition = useGridPosition
|
||||
)
|
||||
if (currentGridDecoration.toString() != newGridDecoration.toString()) {
|
||||
if (currentGridDecoration != null) {
|
||||
binding.mediaGrid.removeItemDecoration(currentGridDecoration)
|
||||
|
@ -756,7 +878,14 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
private fun changeColumnCount() {
|
||||
val items = ArrayList<RadioItem>()
|
||||
for (i in 1..MAX_COLUMN_COUNT) {
|
||||
items.add(RadioItem(i, resources.getQuantityString(org.fossify.commons.R.plurals.column_counts, i, i)))
|
||||
items.add(
|
||||
RadioItem(
|
||||
id = i,
|
||||
title = resources.getQuantityString(
|
||||
org.fossify.commons.R.plurals.column_counts, i, i
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
val currentColumnCount = (binding.mediaGrid.layoutManager as MyGridLayoutManager).spanCount
|
||||
|
@ -808,10 +937,13 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
.load(File(path))
|
||||
.apply(options)
|
||||
.into(object : SimpleTarget<Bitmap>() {
|
||||
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
|
||||
override fun onResourceReady(
|
||||
resource: Bitmap,
|
||||
transition: Transition<in Bitmap>?
|
||||
) {
|
||||
try {
|
||||
WallpaperManager.getInstance(applicationContext).setBitmap(resource)
|
||||
setResult(Activity.RESULT_OK)
|
||||
setResult(RESULT_OK)
|
||||
} catch (ignored: IOException) {
|
||||
}
|
||||
|
||||
|
@ -820,8 +952,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
})
|
||||
} else if (mIsGetImageIntent || mIsGetVideoIntent || mIsGetAnyIntent) {
|
||||
Intent().apply {
|
||||
data = Uri.parse(path)
|
||||
setResult(Activity.RESULT_OK, this)
|
||||
data = path.toUri()
|
||||
setResult(RESULT_OK, this)
|
||||
}
|
||||
finish()
|
||||
} else {
|
||||
|
@ -858,6 +990,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
mMedia = media
|
||||
|
||||
runOnUiThread {
|
||||
binding.loadingIndicator.hide()
|
||||
binding.mediaRefreshLayout.isRefreshing = false
|
||||
binding.mediaEmptyTextPlaceholder.beVisibleIf(media.isEmpty() && !isFromCache)
|
||||
binding.mediaEmptyTextPlaceholder2.beVisibleIf(media.isEmpty() && !isFromCache)
|
||||
|
@ -872,7 +1005,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
mLatestMediaId = getLatestMediaId()
|
||||
mLatestMediaDateId = getLatestMediaByDateId()
|
||||
if (!isFromCache) {
|
||||
val mediaToInsert = (mMedia).filter { it is Medium && it.deletedTS == 0L }.map { it as Medium }
|
||||
val mediaToInsert = mMedia
|
||||
.filter { it is Medium && it.deletedTS == 0L }.map { it as Medium }
|
||||
Thread {
|
||||
try {
|
||||
mediaDB.insertAll(mediaToInsert)
|
||||
|
@ -883,13 +1017,22 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
}
|
||||
|
||||
override fun tryDeleteFiles(fileDirItems: ArrayList<FileDirItem>, skipRecycleBin: Boolean) {
|
||||
val filtered = fileDirItems.filter { !getIsPathDirectory(it.path) && it.path.isMediaFile() } as ArrayList
|
||||
val filtered = fileDirItems
|
||||
.filter { !getIsPathDirectory(it.path) && it.path.isMediaFile() } as ArrayList
|
||||
if (filtered.isEmpty()) {
|
||||
return
|
||||
}
|
||||
|
||||
if (config.useRecycleBin && !skipRecycleBin && !filtered.first().path.startsWith(recycleBinPath)) {
|
||||
val movingItems = resources.getQuantityString(org.fossify.commons.R.plurals.moving_items_into_bin, filtered.size, filtered.size)
|
||||
if (
|
||||
config.useRecycleBin
|
||||
&& !skipRecycleBin
|
||||
&& !filtered.first().path.startsWith(recycleBinPath)
|
||||
) {
|
||||
val movingItems = resources.getQuantityString(
|
||||
org.fossify.commons.R.plurals.moving_items_into_bin,
|
||||
filtered.size,
|
||||
filtered.size
|
||||
)
|
||||
toast(movingItems)
|
||||
|
||||
movePathsInRecycleBin(filtered.map { it.path } as ArrayList<String>) {
|
||||
|
@ -900,13 +1043,19 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
}
|
||||
}
|
||||
} else {
|
||||
val deletingItems = resources.getQuantityString(org.fossify.commons.R.plurals.deleting_items, filtered.size, filtered.size)
|
||||
val deletingItems = resources.getQuantityString(
|
||||
org.fossify.commons.R.plurals.deleting_items,
|
||||
filtered.size,
|
||||
filtered.size
|
||||
)
|
||||
toast(deletingItems)
|
||||
deleteFilteredFiles(filtered)
|
||||
}
|
||||
}
|
||||
|
||||
private fun shouldSkipAuthentication() = intent.getBooleanExtra(SKIP_AUTHENTICATION, false)
|
||||
private fun shouldSkipAuthentication(): Boolean {
|
||||
return intent.getBooleanExtra(SKIP_AUTHENTICATION, false)
|
||||
}
|
||||
|
||||
private fun deleteFilteredFiles(filtered: ArrayList<FileDirItem>) {
|
||||
deleteFiles(filtered) {
|
||||
|
@ -941,7 +1090,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
override fun selectedPaths(paths: ArrayList<String>) {
|
||||
Intent().apply {
|
||||
putExtra(PICKED_PATHS, paths)
|
||||
setResult(Activity.RESULT_OK, this)
|
||||
setResult(RESULT_OK, this)
|
||||
}
|
||||
finish()
|
||||
}
|
||||
|
@ -957,7 +1106,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
|||
}
|
||||
|
||||
if (binding.mediaGrid.itemDecorationCount > 0) {
|
||||
val currentGridDecoration = binding.mediaGrid.getItemDecorationAt(0) as GridSpacingItemDecoration
|
||||
val currentGridDecoration =
|
||||
binding.mediaGrid.getItemDecorationAt(0) as GridSpacingItemDecoration
|
||||
currentGridDecoration.items = media
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,7 +13,6 @@ import org.fossify.commons.extensions.toast
|
|||
import org.fossify.commons.extensions.viewBinding
|
||||
import org.fossify.commons.helpers.NavigationIcon
|
||||
import org.fossify.commons.helpers.ensureBackgroundThread
|
||||
import org.fossify.commons.helpers.isNougatPlus
|
||||
import org.fossify.commons.models.RadioItem
|
||||
import org.fossify.gallery.R
|
||||
import org.fossify.gallery.databinding.ActivitySetWallpaperBinding
|
||||
|
@ -127,18 +126,14 @@ class SetWallpaperActivity : SimpleActivity(), CropImageView.OnCropImageComplete
|
|||
}
|
||||
|
||||
private fun confirmWallpaper() {
|
||||
if (isNougatPlus()) {
|
||||
val items = arrayListOf(
|
||||
RadioItem(WallpaperManager.FLAG_SYSTEM, getString(R.string.home_screen)),
|
||||
RadioItem(WallpaperManager.FLAG_LOCK, getString(R.string.lock_screen)),
|
||||
RadioItem(WallpaperManager.FLAG_SYSTEM or WallpaperManager.FLAG_LOCK, getString(R.string.home_and_lock_screen))
|
||||
)
|
||||
val items = arrayListOf(
|
||||
RadioItem(WallpaperManager.FLAG_SYSTEM, getString(R.string.home_screen)),
|
||||
RadioItem(WallpaperManager.FLAG_LOCK, getString(R.string.lock_screen)),
|
||||
RadioItem(WallpaperManager.FLAG_SYSTEM or WallpaperManager.FLAG_LOCK, getString(R.string.home_and_lock_screen))
|
||||
)
|
||||
|
||||
RadioGroupDialog(this, items) {
|
||||
wallpaperFlag = it as Int
|
||||
binding.cropImageView.croppedImageAsync()
|
||||
}
|
||||
} else {
|
||||
RadioGroupDialog(this, items) {
|
||||
wallpaperFlag = it as Int
|
||||
binding.cropImageView.croppedImageAsync()
|
||||
}
|
||||
}
|
||||
|
@ -156,11 +151,7 @@ class SetWallpaperActivity : SimpleActivity(), CropImageView.OnCropImageComplete
|
|||
val wantedWidth = (bitmap.width * ratio).toInt()
|
||||
try {
|
||||
val scaledBitmap = Bitmap.createScaledBitmap(bitmap, wantedWidth, wantedHeight, true)
|
||||
if (isNougatPlus()) {
|
||||
wallpaperManager.setBitmap(scaledBitmap, null, true, wallpaperFlag)
|
||||
} else {
|
||||
wallpaperManager.setBitmap(scaledBitmap)
|
||||
}
|
||||
wallpaperManager.setBitmap(scaledBitmap, null, true, wallpaperFlag)
|
||||
setResult(Activity.RESULT_OK)
|
||||
} catch (e: OutOfMemoryError) {
|
||||
toast(org.fossify.commons.R.string.out_of_memory_error)
|
||||
|
|
|
@ -59,6 +59,8 @@ open class SimpleActivity : BaseSimpleActivity() {
|
|||
|
||||
override fun getAppLauncherName() = getString(R.string.app_launcher_name)
|
||||
|
||||
override fun getRepositoryName() = "Gallery"
|
||||
|
||||
protected fun checkNotchSupport() {
|
||||
if (isPiePlus()) {
|
||||
val cutoutMode = when {
|
||||
|
|
|
@ -13,11 +13,21 @@ import android.net.Uri
|
|||
import android.os.Bundle
|
||||
import android.os.Handler
|
||||
import android.util.DisplayMetrics
|
||||
import android.view.*
|
||||
import android.view.GestureDetector
|
||||
import android.view.MotionEvent
|
||||
import android.view.Surface
|
||||
import android.view.TextureView
|
||||
import android.view.View
|
||||
import android.view.WindowManager
|
||||
import android.widget.RelativeLayout
|
||||
import android.widget.SeekBar
|
||||
import androidx.appcompat.content.res.AppCompatResources
|
||||
import androidx.media3.common.*
|
||||
import androidx.media3.common.AudioAttributes
|
||||
import androidx.media3.common.C
|
||||
import androidx.media3.common.MediaItem
|
||||
import androidx.media3.common.PlaybackException
|
||||
import androidx.media3.common.Player
|
||||
import androidx.media3.common.VideoSize
|
||||
import androidx.media3.common.util.UnstableApi
|
||||
import androidx.media3.datasource.ContentDataSource
|
||||
import androidx.media3.datasource.DataSource
|
||||
|
@ -28,17 +38,56 @@ import androidx.media3.exoplayer.SeekParameters
|
|||
import androidx.media3.exoplayer.source.DefaultMediaSourceFactory
|
||||
import androidx.media3.exoplayer.source.MediaSource
|
||||
import androidx.media3.exoplayer.source.ProgressiveMediaSource
|
||||
import org.fossify.commons.extensions.*
|
||||
import org.fossify.commons.extensions.actionBarHeight
|
||||
import org.fossify.commons.extensions.beGone
|
||||
import org.fossify.commons.extensions.beVisible
|
||||
import org.fossify.commons.extensions.beVisibleIf
|
||||
import org.fossify.commons.extensions.fadeIn
|
||||
import org.fossify.commons.extensions.getColoredDrawableWithColor
|
||||
import org.fossify.commons.extensions.getFilenameFromUri
|
||||
import org.fossify.commons.extensions.getFormattedDuration
|
||||
import org.fossify.commons.extensions.getProperTextColor
|
||||
import org.fossify.commons.extensions.navigationBarHeight
|
||||
import org.fossify.commons.extensions.navigationBarOnSide
|
||||
import org.fossify.commons.extensions.navigationBarWidth
|
||||
import org.fossify.commons.extensions.onGlobalLayout
|
||||
import org.fossify.commons.extensions.portrait
|
||||
import org.fossify.commons.extensions.setDrawablesRelativeWithIntrinsicBounds
|
||||
import org.fossify.commons.extensions.showErrorToast
|
||||
import org.fossify.commons.extensions.statusBarHeight
|
||||
import org.fossify.commons.extensions.updateTextColors
|
||||
import org.fossify.commons.extensions.viewBinding
|
||||
import org.fossify.gallery.R
|
||||
import org.fossify.gallery.databinding.ActivityVideoPlayerBinding
|
||||
import org.fossify.gallery.extensions.*
|
||||
import org.fossify.gallery.extensions.config
|
||||
import org.fossify.gallery.extensions.getFriendlyMessage
|
||||
import org.fossify.gallery.extensions.hasNavBar
|
||||
import org.fossify.gallery.extensions.hideSystemUI
|
||||
import org.fossify.gallery.extensions.mute
|
||||
import org.fossify.gallery.extensions.openPath
|
||||
import org.fossify.gallery.extensions.shareMediumPath
|
||||
import org.fossify.gallery.extensions.showSystemUI
|
||||
import org.fossify.gallery.extensions.unmute
|
||||
import org.fossify.gallery.fragments.PlaybackSpeedFragment
|
||||
import org.fossify.gallery.helpers.*
|
||||
import org.fossify.gallery.helpers.DRAG_THRESHOLD
|
||||
import org.fossify.gallery.helpers.EXOPLAYER_MAX_BUFFER_MS
|
||||
import org.fossify.gallery.helpers.EXOPLAYER_MIN_BUFFER_MS
|
||||
import org.fossify.gallery.helpers.FAST_FORWARD_VIDEO_MS
|
||||
import org.fossify.gallery.helpers.GO_TO_NEXT_ITEM
|
||||
import org.fossify.gallery.helpers.GO_TO_PREV_ITEM
|
||||
import org.fossify.gallery.helpers.HIDE_SYSTEM_UI_DELAY
|
||||
import org.fossify.gallery.helpers.MAX_CLOSE_DOWN_GESTURE_DURATION
|
||||
import org.fossify.gallery.helpers.ROTATE_BY_ASPECT_RATIO
|
||||
import org.fossify.gallery.helpers.ROTATE_BY_DEVICE_ROTATION
|
||||
import org.fossify.gallery.helpers.ROTATE_BY_SYSTEM_SETTING
|
||||
import org.fossify.gallery.helpers.SHOW_NEXT_ITEM
|
||||
import org.fossify.gallery.helpers.SHOW_PREV_ITEM
|
||||
import org.fossify.gallery.interfaces.PlaybackSpeedListener
|
||||
import java.text.DecimalFormat
|
||||
|
||||
@UnstableApi
|
||||
open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListener, TextureView.SurfaceTextureListener, PlaybackSpeedListener {
|
||||
open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListener,
|
||||
TextureView.SurfaceTextureListener, PlaybackSpeedListener {
|
||||
private val PLAY_WHEN_READY_DRAG_DELAY = 100L
|
||||
|
||||
private var mIsFullscreen = false
|
||||
|
@ -61,7 +110,6 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
private var mVideoSize = Point(0, 0)
|
||||
private var mTimerHandler = Handler()
|
||||
private var mPlayWhenReadyHandler = Handler()
|
||||
private var mVolumeController: VolumeController? = null
|
||||
|
||||
private var mIgnoreCloseDown = false
|
||||
|
||||
|
@ -119,16 +167,22 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
binding.bottomVideoTimeHolder.videoSeekbar.progress = 0
|
||||
mTimerHandler.removeCallbacksAndMessages(null)
|
||||
mPlayWhenReadyHandler.removeCallbacksAndMessages(null)
|
||||
mVolumeController?.destroy()
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupOptionsMenu() {
|
||||
(binding.videoAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
|
||||
(binding.videoAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin =
|
||||
statusBarHeight
|
||||
binding.videoToolbar.apply {
|
||||
setTitleTextColor(Color.WHITE)
|
||||
overflowIcon = resources.getColoredDrawableWithColor(org.fossify.commons.R.drawable.ic_three_dots_vector, Color.WHITE)
|
||||
navigationIcon = resources.getColoredDrawableWithColor(org.fossify.commons.R.drawable.ic_arrow_left_vector, Color.WHITE)
|
||||
overflowIcon = resources.getColoredDrawableWithColor(
|
||||
org.fossify.commons.R.drawable.ic_three_dots_vector,
|
||||
Color.WHITE
|
||||
)
|
||||
navigationIcon = resources.getColoredDrawableWithColor(
|
||||
org.fossify.commons.R.drawable.ic_arrow_left_vector,
|
||||
Color.WHITE
|
||||
)
|
||||
}
|
||||
|
||||
updateMenuItemColors(binding.videoToolbar.menu, forceWhiteIcons = true)
|
||||
|
@ -156,7 +210,8 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
}
|
||||
|
||||
binding.topShadow.layoutParams.height = statusBarHeight + actionBarHeight
|
||||
(binding.videoAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
|
||||
(binding.videoAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin =
|
||||
statusBarHeight
|
||||
if (!portrait && navigationBarOnSide && navigationBarWidth > 0) {
|
||||
binding.videoToolbar.setPadding(0, 0, navigationBarWidth, 0)
|
||||
} else {
|
||||
|
@ -189,22 +244,37 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
binding.bottomVideoTimeHolder.videoDuration.setOnClickListener { doSkip(true) }
|
||||
binding.bottomVideoTimeHolder.videoTogglePlayPause.setOnClickListener { togglePlayPause() }
|
||||
binding.bottomVideoTimeHolder.videoPlaybackSpeed.setOnClickListener { showPlaybackSpeedPicker() }
|
||||
binding.bottomVideoTimeHolder.videoToggleMute.setOnClickListener { mVolumeController?.toggleMute() }
|
||||
binding.bottomVideoTimeHolder.videoToggleMute.setOnClickListener {
|
||||
config.muteVideos = !config.muteVideos
|
||||
updatePlayerMuteState()
|
||||
}
|
||||
|
||||
binding.videoSurfaceFrame.setOnClickListener { toggleFullscreen() }
|
||||
binding.videoSurfaceFrame.controller.settings.swallowDoubleTaps = true
|
||||
|
||||
binding.bottomVideoTimeHolder.videoNextFile.beVisibleIf(intent.getBooleanExtra(SHOW_NEXT_ITEM, false))
|
||||
binding.bottomVideoTimeHolder.videoNextFile.beVisibleIf(
|
||||
intent.getBooleanExtra(
|
||||
SHOW_NEXT_ITEM,
|
||||
false
|
||||
)
|
||||
)
|
||||
binding.bottomVideoTimeHolder.videoNextFile.setOnClickListener { handleNextFile() }
|
||||
|
||||
binding.bottomVideoTimeHolder.videoPrevFile.beVisibleIf(intent.getBooleanExtra(SHOW_PREV_ITEM, false))
|
||||
binding.bottomVideoTimeHolder.videoPrevFile.beVisibleIf(
|
||||
intent.getBooleanExtra(
|
||||
SHOW_PREV_ITEM,
|
||||
false
|
||||
)
|
||||
)
|
||||
binding.bottomVideoTimeHolder.videoPrevFile.setOnClickListener { handlePrevFile() }
|
||||
|
||||
val gestureDetector = GestureDetector(this, object : GestureDetector.SimpleOnGestureListener() {
|
||||
override fun onDoubleTap(e: MotionEvent): Boolean {
|
||||
handleDoubleTap(e.rawX)
|
||||
return true
|
||||
}
|
||||
})
|
||||
val gestureDetector =
|
||||
GestureDetector(this, object : GestureDetector.SimpleOnGestureListener() {
|
||||
override fun onDoubleTap(e: MotionEvent): Boolean {
|
||||
handleDoubleTap(e.rawX)
|
||||
return true
|
||||
}
|
||||
})
|
||||
|
||||
binding.videoSurfaceFrame.setOnTouchListener { view, event ->
|
||||
handleEvent(event)
|
||||
|
@ -216,17 +286,29 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
binding.videoSurface.surfaceTextureListener = this
|
||||
|
||||
if (config.allowVideoGestures) {
|
||||
binding.videoBrightnessController.initialize(this, binding.slideInfo, true, binding.videoPlayerHolder, singleTap = { x, y ->
|
||||
toggleFullscreen()
|
||||
}, doubleTap = { x, y ->
|
||||
doSkip(false)
|
||||
})
|
||||
binding.videoBrightnessController.initialize(
|
||||
this,
|
||||
binding.slideInfo,
|
||||
true,
|
||||
binding.videoPlayerHolder,
|
||||
singleTap = { x, y ->
|
||||
toggleFullscreen()
|
||||
},
|
||||
doubleTap = { x, y ->
|
||||
doSkip(false)
|
||||
})
|
||||
|
||||
binding.videoVolumeController.initialize(this, binding.slideInfo, false, binding.videoPlayerHolder, singleTap = { x, y ->
|
||||
toggleFullscreen()
|
||||
}, doubleTap = { x, y ->
|
||||
doSkip(true)
|
||||
})
|
||||
binding.videoVolumeController.initialize(
|
||||
this,
|
||||
binding.slideInfo,
|
||||
false,
|
||||
binding.videoPlayerHolder,
|
||||
singleTap = { x, y ->
|
||||
toggleFullscreen()
|
||||
},
|
||||
doubleTap = { x, y ->
|
||||
doSkip(true)
|
||||
})
|
||||
} else {
|
||||
binding.videoBrightnessController.beGone()
|
||||
binding.videoVolumeController.beGone()
|
||||
|
@ -239,12 +321,6 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
}
|
||||
|
||||
mDragThreshold = DRAG_THRESHOLD * resources.displayMetrics.density
|
||||
mVolumeController = VolumeController(this) { isMuted ->
|
||||
val icon = if (isMuted) R.drawable.ic_vector_speaker_off else R.drawable.ic_vector_speaker_on
|
||||
binding.bottomVideoTimeHolder.videoToggleMute.setImageDrawable(
|
||||
AppCompatResources.getDrawable(this, icon)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun initExoPlayer() {
|
||||
|
@ -261,7 +337,12 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
.createMediaSource(MediaItem.fromUri(fileDataSource.uri!!))
|
||||
|
||||
val loadControl = DefaultLoadControl.Builder()
|
||||
.setBufferDurationsMs(EXOPLAYER_MIN_BUFFER_MS, EXOPLAYER_MAX_BUFFER_MS, EXOPLAYER_MIN_BUFFER_MS, EXOPLAYER_MIN_BUFFER_MS)
|
||||
.setBufferDurationsMs(
|
||||
EXOPLAYER_MIN_BUFFER_MS,
|
||||
EXOPLAYER_MAX_BUFFER_MS,
|
||||
EXOPLAYER_MIN_BUFFER_MS,
|
||||
EXOPLAYER_MIN_BUFFER_MS
|
||||
)
|
||||
.setPrioritizeTimeOverSizeThresholds(true)
|
||||
.build()
|
||||
|
||||
|
@ -285,11 +366,17 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
prepare()
|
||||
initListeners()
|
||||
}
|
||||
|
||||
updatePlayerMuteState()
|
||||
}
|
||||
|
||||
private fun ExoPlayer.initListeners() {
|
||||
addListener(object : Player.Listener {
|
||||
override fun onPositionDiscontinuity(oldPosition: Player.PositionInfo, newPosition: Player.PositionInfo, @Player.DiscontinuityReason reason: Int) {
|
||||
override fun onPositionDiscontinuity(
|
||||
oldPosition: Player.PositionInfo,
|
||||
newPosition: Player.PositionInfo,
|
||||
@Player.DiscontinuityReason reason: Int
|
||||
) {
|
||||
// Reset progress views when video loops.
|
||||
if (reason == Player.DISCONTINUITY_REASON_AUTO_TRANSITION) {
|
||||
binding.bottomVideoTimeHolder.videoSeekbar.progress = 0
|
||||
|
@ -313,7 +400,7 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
override fun onPlayerErrorChanged(error: PlaybackException?) {
|
||||
binding.errorMessageHolder.errorMessage.apply {
|
||||
if (error != null) {
|
||||
text = error.localizedMessage ?: getString(R.string.failed_to_load_media)
|
||||
text = error.getFriendlyMessage(context)
|
||||
setTextColor(if (context.config.blackBackground) Color.WHITE else context.getProperTextColor())
|
||||
fadeIn()
|
||||
} else {
|
||||
|
@ -329,7 +416,8 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
binding.bottomVideoTimeHolder.videoTogglePlayPause.beVisible()
|
||||
binding.bottomVideoTimeHolder.videoPlaybackSpeed.beVisible()
|
||||
binding.bottomVideoTimeHolder.videoToggleMute.beVisible()
|
||||
binding.bottomVideoTimeHolder.videoPlaybackSpeed.text = "${DecimalFormat("#.##").format(config.playbackSpeed)}x"
|
||||
binding.bottomVideoTimeHolder.videoPlaybackSpeed.text =
|
||||
"${DecimalFormat("#.##").format(config.playbackSpeed)}x"
|
||||
mDuration = (mExoPlayer!!.duration / 1000).toInt()
|
||||
binding.bottomVideoTimeHolder.videoSeekbar.max = mDuration
|
||||
binding.bottomVideoTimeHolder.videoDuration.text = mDuration.getFormattedDuration()
|
||||
|
@ -397,6 +485,21 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
}
|
||||
}
|
||||
|
||||
private fun updatePlayerMuteState() {
|
||||
val isMuted = config.muteVideos
|
||||
val drawableId = if (isMuted) {
|
||||
mExoPlayer?.mute()
|
||||
R.drawable.ic_vector_speaker_off
|
||||
} else {
|
||||
mExoPlayer?.unmute()
|
||||
R.drawable.ic_vector_speaker_on
|
||||
}
|
||||
|
||||
binding.bottomVideoTimeHolder.videoToggleMute.setImageDrawable(
|
||||
AppCompatResources.getDrawable(this, drawableId)
|
||||
)
|
||||
}
|
||||
|
||||
private fun setPosition(seconds: Int) {
|
||||
mExoPlayer?.seekTo(seconds * 1000L)
|
||||
binding.bottomVideoTimeHolder.videoSeekbar.progress = seconds
|
||||
|
@ -417,7 +520,8 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
|
||||
clearLastVideoSavedProgress()
|
||||
mCurrTime = (mExoPlayer!!.duration / 1000).toInt()
|
||||
binding.bottomVideoTimeHolder.videoSeekbar.progress = binding.bottomVideoTimeHolder.videoSeekbar.max
|
||||
binding.bottomVideoTimeHolder.videoSeekbar.progress =
|
||||
binding.bottomVideoTimeHolder.videoSeekbar.max
|
||||
binding.bottomVideoTimeHolder.videoCurrTime.text = mDuration.getFormattedDuration()
|
||||
pauseVideo()
|
||||
}
|
||||
|
@ -430,7 +534,10 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
|
||||
private fun saveVideoProgress() {
|
||||
if (!didVideoEnd()) {
|
||||
config.saveLastVideoPosition(mUri.toString(), mExoPlayer!!.currentPosition.toInt() / 1000)
|
||||
config.saveLastVideoPosition(
|
||||
mUri.toString(),
|
||||
mExoPlayer!!.currentPosition.toInt() / 1000
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -476,11 +583,12 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
|
||||
private fun changeOrientation() {
|
||||
mIsOrientationLocked = true
|
||||
requestedOrientation = if (resources.configuration.orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
|
||||
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
|
||||
} else {
|
||||
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
|
||||
}
|
||||
requestedOrientation =
|
||||
if (resources.configuration.orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
|
||||
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
|
||||
} else {
|
||||
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
|
||||
}
|
||||
}
|
||||
|
||||
private fun toggleFullscreen() {
|
||||
|
@ -540,13 +648,20 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
if (isSlow != binding.bottomVideoTimeHolder.videoPlaybackSpeed.tag as? Boolean) {
|
||||
binding.bottomVideoTimeHolder.videoPlaybackSpeed.tag = isSlow
|
||||
|
||||
val drawableId = if (isSlow) R.drawable.ic_playback_speed_slow_vector else R.drawable.ic_playback_speed_vector
|
||||
val drawableId =
|
||||
if (isSlow) R.drawable.ic_playback_speed_slow_vector else R.drawable.ic_playback_speed_vector
|
||||
binding.bottomVideoTimeHolder.videoPlaybackSpeed
|
||||
.setDrawablesRelativeWithIntrinsicBounds(AppCompatResources.getDrawable(this, drawableId))
|
||||
.setDrawablesRelativeWithIntrinsicBounds(
|
||||
AppCompatResources.getDrawable(
|
||||
this,
|
||||
drawableId
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
binding.bottomVideoTimeHolder.videoPlaybackSpeed.text = "${DecimalFormat("#.##").format(speed)}x"
|
||||
binding.bottomVideoTimeHolder.videoPlaybackSpeed.text =
|
||||
"${DecimalFormat("#.##").format(speed)}x"
|
||||
mExoPlayer?.setPlaybackSpeed(speed)
|
||||
}
|
||||
|
||||
|
@ -577,7 +692,8 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
if (mExoPlayer != null && !mIsDragged && mIsPlaying) {
|
||||
mCurrTime = (mExoPlayer!!.currentPosition / 1000).toInt()
|
||||
binding.bottomVideoTimeHolder.videoSeekbar.progress = mCurrTime
|
||||
binding.bottomVideoTimeHolder.videoCurrTime.text = mCurrTime.getFormattedDuration()
|
||||
binding.bottomVideoTimeHolder.videoCurrTime.text =
|
||||
mCurrTime.getFormattedDuration()
|
||||
}
|
||||
|
||||
mTimerHandler.postDelayed(this, 1000)
|
||||
|
@ -591,9 +707,11 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
}
|
||||
|
||||
val curr = mExoPlayer!!.currentPosition
|
||||
val newProgress = if (forward) curr + FAST_FORWARD_VIDEO_MS else curr - FAST_FORWARD_VIDEO_MS
|
||||
val newProgress =
|
||||
if (forward) curr + FAST_FORWARD_VIDEO_MS else curr - FAST_FORWARD_VIDEO_MS
|
||||
val roundProgress = Math.round(newProgress / 1000f)
|
||||
val limitedProgress = Math.max(Math.min(mExoPlayer!!.duration.toInt() / 1000, roundProgress), 0)
|
||||
val limitedProgress =
|
||||
Math.max(Math.min(mExoPlayer!!.duration.toInt() / 1000, roundProgress), 0)
|
||||
setPosition(limitedProgress)
|
||||
if (!mIsPlaying) {
|
||||
togglePlayPause()
|
||||
|
@ -614,7 +732,10 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
val diffX = event.rawX - mTouchDownX
|
||||
val diffY = event.rawY - mTouchDownY
|
||||
|
||||
if (mIsDragged || (Math.abs(diffX) > mDragThreshold && Math.abs(diffX) > Math.abs(diffY)) && binding.videoSurfaceFrame.controller.state.zoom == 1f) {
|
||||
if (mIsDragged || (Math.abs(diffX) > mDragThreshold && Math.abs(diffX) > Math.abs(
|
||||
diffY
|
||||
)) && binding.videoSurfaceFrame.controller.state.zoom == 1f
|
||||
) {
|
||||
if (!mIsDragged) {
|
||||
arrayOf(
|
||||
binding.bottomVideoTimeHolder.videoCurrTime,
|
||||
|
@ -631,7 +752,8 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
|
|||
|
||||
val skipLength = (mDuration * 1000f) * (percent / 100f)
|
||||
var newProgress = mProgressAtDown + skipLength
|
||||
newProgress = Math.max(Math.min(mExoPlayer!!.duration.toFloat(), newProgress), 0f)
|
||||
newProgress =
|
||||
Math.max(Math.min(mExoPlayer!!.duration.toFloat(), newProgress), 0f)
|
||||
val newSeconds = (newProgress / 1000).toInt()
|
||||
setPosition(newSeconds)
|
||||
resetPlayWhenReady()
|
||||
|
|
|
@ -189,7 +189,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
|
|||
currentMedium.isFavorite && visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE == 0 && !currentMedium.getIsInRecycleBin()
|
||||
|
||||
findItem(R.id.menu_restore_file).isVisible = currentMedium.path.startsWith(recycleBinPath)
|
||||
findItem(R.id.menu_create_shortcut).isVisible = isOreoPlus()
|
||||
findItem(R.id.menu_create_shortcut).isVisible = true
|
||||
findItem(R.id.menu_change_orientation).isVisible = rotationDegrees == 0 && visibleBottomActions and BOTTOM_ACTION_CHANGE_ORIENTATION == 0
|
||||
findItem(R.id.menu_change_orientation).icon = resources.getDrawable(getChangeOrientationIcon())
|
||||
findItem(R.id.menu_rotate).setShowAsAction(
|
||||
|
@ -402,7 +402,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
|
|||
window.decorView.setOnSystemUiVisibilityChangeListener { visibility ->
|
||||
mIsFullScreen = if (isUpsideDownCakePlus()) {
|
||||
visibility and View.SYSTEM_UI_FLAG_LOW_PROFILE != 0
|
||||
} else if (isNougatPlus() && isInMultiWindowMode) {
|
||||
} else if (isInMultiWindowMode) {
|
||||
visibility and View.SYSTEM_UI_FLAG_LOW_PROFILE != 0
|
||||
} else if (visibility and View.SYSTEM_UI_FLAG_LOW_PROFILE == 0) {
|
||||
false
|
||||
|
@ -756,10 +756,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
|
|||
}
|
||||
|
||||
private fun createShortcut() {
|
||||
if (!isOreoPlus()) {
|
||||
return
|
||||
}
|
||||
|
||||
val manager = getSystemService(ShortcutManager::class.java)
|
||||
if (manager.isRequestPinShortcutSupported) {
|
||||
val medium = getCurrentMedium() ?: return
|
||||
|
|
|
@ -5,7 +5,6 @@ import android.content.pm.ShortcutInfo
|
|||
import android.content.pm.ShortcutManager
|
||||
import android.graphics.drawable.ColorDrawable
|
||||
import android.graphics.drawable.Icon
|
||||
import android.os.Build
|
||||
import android.text.TextUtils
|
||||
import android.view.Menu
|
||||
import android.view.MotionEvent
|
||||
|
@ -13,7 +12,6 @@ import android.view.View
|
|||
import android.view.ViewGroup
|
||||
import android.widget.ImageView
|
||||
import android.widget.RelativeLayout
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.appcompat.content.res.AppCompatResources
|
||||
import androidx.recyclerview.widget.ItemTouchHelper
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
|
@ -23,9 +21,43 @@ import com.google.gson.Gson
|
|||
import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
|
||||
import org.fossify.commons.activities.BaseSimpleActivity
|
||||
import org.fossify.commons.adapters.MyRecyclerViewAdapter
|
||||
import org.fossify.commons.dialogs.*
|
||||
import org.fossify.commons.extensions.*
|
||||
import org.fossify.commons.helpers.*
|
||||
import org.fossify.commons.dialogs.ConfirmationDialog
|
||||
import org.fossify.commons.dialogs.FolderLockingNoticeDialog
|
||||
import org.fossify.commons.dialogs.PropertiesDialog
|
||||
import org.fossify.commons.dialogs.RenameItemDialog
|
||||
import org.fossify.commons.dialogs.RenameItemsDialog
|
||||
import org.fossify.commons.dialogs.SecurityDialog
|
||||
import org.fossify.commons.extensions.applyColorFilter
|
||||
import org.fossify.commons.extensions.beGone
|
||||
import org.fossify.commons.extensions.beVisible
|
||||
import org.fossify.commons.extensions.beVisibleIf
|
||||
import org.fossify.commons.extensions.containsNoMedia
|
||||
import org.fossify.commons.extensions.convertToBitmap
|
||||
import org.fossify.commons.extensions.doesThisOrParentHaveNoMedia
|
||||
import org.fossify.commons.extensions.getContrastColor
|
||||
import org.fossify.commons.extensions.getFilenameFromPath
|
||||
import org.fossify.commons.extensions.getProperBackgroundColor
|
||||
import org.fossify.commons.extensions.getTimeFormat
|
||||
import org.fossify.commons.extensions.handleDeletePasswordProtection
|
||||
import org.fossify.commons.extensions.handleLockedFolderOpening
|
||||
import org.fossify.commons.extensions.isAStorageRootFolder
|
||||
import org.fossify.commons.extensions.isExternalStorageManager
|
||||
import org.fossify.commons.extensions.isGif
|
||||
import org.fossify.commons.extensions.isImageFast
|
||||
import org.fossify.commons.extensions.isMediaFile
|
||||
import org.fossify.commons.extensions.isRawFast
|
||||
import org.fossify.commons.extensions.isSvg
|
||||
import org.fossify.commons.extensions.isVideoFast
|
||||
import org.fossify.commons.extensions.isVisible
|
||||
import org.fossify.commons.extensions.rescanPaths
|
||||
import org.fossify.commons.extensions.showErrorToast
|
||||
import org.fossify.commons.extensions.toast
|
||||
import org.fossify.commons.helpers.FAVORITES
|
||||
import org.fossify.commons.helpers.SHOW_ALL_TABS
|
||||
import org.fossify.commons.helpers.SORT_BY_CUSTOM
|
||||
import org.fossify.commons.helpers.VIEW_TYPE_LIST
|
||||
import org.fossify.commons.helpers.ensureBackgroundThread
|
||||
import org.fossify.commons.helpers.isRPlus
|
||||
import org.fossify.commons.interfaces.ItemMoveCallback
|
||||
import org.fossify.commons.interfaces.ItemTouchHelperContract
|
||||
import org.fossify.commons.interfaces.StartReorderDragListener
|
||||
|
@ -39,8 +71,38 @@ import org.fossify.gallery.databinding.DirectoryItemListBinding
|
|||
import org.fossify.gallery.dialogs.ConfirmDeleteFolderDialog
|
||||
import org.fossify.gallery.dialogs.ExcludeFolderDialog
|
||||
import org.fossify.gallery.dialogs.PickMediumDialog
|
||||
import org.fossify.gallery.extensions.*
|
||||
import org.fossify.gallery.helpers.*
|
||||
import org.fossify.gallery.extensions.addNoMedia
|
||||
import org.fossify.gallery.extensions.checkAppendingHidden
|
||||
import org.fossify.gallery.extensions.config
|
||||
import org.fossify.gallery.extensions.directoryDB
|
||||
import org.fossify.gallery.extensions.emptyAndDisableTheRecycleBin
|
||||
import org.fossify.gallery.extensions.emptyTheRecycleBin
|
||||
import org.fossify.gallery.extensions.favoritesDB
|
||||
import org.fossify.gallery.extensions.fixDateTaken
|
||||
import org.fossify.gallery.extensions.getShortcutImage
|
||||
import org.fossify.gallery.extensions.isThisOrParentFolderHidden
|
||||
import org.fossify.gallery.extensions.loadImage
|
||||
import org.fossify.gallery.extensions.mediaDB
|
||||
import org.fossify.gallery.extensions.removeNoMedia
|
||||
import org.fossify.gallery.extensions.showRecycleBinEmptyingDialog
|
||||
import org.fossify.gallery.extensions.tryCopyMoveFilesTo
|
||||
import org.fossify.gallery.helpers.DIRECTORY
|
||||
import org.fossify.gallery.helpers.FOLDER_MEDIA_CNT_BRACKETS
|
||||
import org.fossify.gallery.helpers.FOLDER_MEDIA_CNT_LINE
|
||||
import org.fossify.gallery.helpers.FOLDER_STYLE_ROUNDED_CORNERS
|
||||
import org.fossify.gallery.helpers.FOLDER_STYLE_SQUARE
|
||||
import org.fossify.gallery.helpers.LOCATION_INTERNAL
|
||||
import org.fossify.gallery.helpers.LOCATION_SD
|
||||
import org.fossify.gallery.helpers.PATH
|
||||
import org.fossify.gallery.helpers.RECYCLE_BIN
|
||||
import org.fossify.gallery.helpers.ROUNDED_CORNERS_BIG
|
||||
import org.fossify.gallery.helpers.ROUNDED_CORNERS_NONE
|
||||
import org.fossify.gallery.helpers.ROUNDED_CORNERS_SMALL
|
||||
import org.fossify.gallery.helpers.TYPE_GIFS
|
||||
import org.fossify.gallery.helpers.TYPE_IMAGES
|
||||
import org.fossify.gallery.helpers.TYPE_RAWS
|
||||
import org.fossify.gallery.helpers.TYPE_SVGS
|
||||
import org.fossify.gallery.helpers.TYPE_VIDEOS
|
||||
import org.fossify.gallery.interfaces.DirectoryOperationsListener
|
||||
import org.fossify.gallery.models.AlbumCover
|
||||
import org.fossify.gallery.models.Directory
|
||||
|
@ -48,10 +110,16 @@ import java.io.File
|
|||
import java.util.Collections
|
||||
|
||||
class DirectoryAdapter(
|
||||
activity: BaseSimpleActivity, var dirs: ArrayList<Directory>, val listener: DirectoryOperationsListener?, recyclerView: MyRecyclerView,
|
||||
val isPickIntent: Boolean, val swipeRefreshLayout: SwipeRefreshLayout? = null, itemClick: (Any) -> Unit
|
||||
activity: BaseSimpleActivity,
|
||||
var dirs: ArrayList<Directory>,
|
||||
val listener: DirectoryOperationsListener?,
|
||||
recyclerView: MyRecyclerView,
|
||||
val isPickIntent: Boolean,
|
||||
val swipeRefreshLayout: SwipeRefreshLayout? = null,
|
||||
itemClick: (Any) -> Unit
|
||||
) :
|
||||
MyRecyclerViewAdapter(activity, recyclerView, itemClick), ItemTouchHelperContract, RecyclerViewFastScroller.OnPopupTextUpdate {
|
||||
MyRecyclerViewAdapter(activity, recyclerView, itemClick), ItemTouchHelperContract,
|
||||
RecyclerViewFastScroller.OnPopupTextUpdate {
|
||||
|
||||
private val config = activity.config
|
||||
private val isListViewType = config.viewTypeFolders == VIEW_TYPE_LIST
|
||||
|
@ -119,7 +187,7 @@ class DirectoryAdapter(
|
|||
findItem(R.id.cab_empty_recycle_bin).isVisible = isOneItemSelected && selectedPaths.first() == RECYCLE_BIN
|
||||
findItem(R.id.cab_empty_disable_recycle_bin).isVisible = isOneItemSelected && selectedPaths.first() == RECYCLE_BIN
|
||||
|
||||
findItem(R.id.cab_create_shortcut).isVisible = isOreoPlus() && isOneItemSelected
|
||||
findItem(R.id.cab_create_shortcut).isVisible = isOneItemSelected
|
||||
|
||||
checkHideBtnVisibility(this, selectedPaths)
|
||||
checkPinBtnVisibility(this, selectedPaths)
|
||||
|
@ -549,10 +617,6 @@ class DirectoryAdapter(
|
|||
}
|
||||
|
||||
private fun tryCreateShortcut() {
|
||||
if (!isOreoPlus()) {
|
||||
return
|
||||
}
|
||||
|
||||
activity.handleLockedFolderOpening(getFirstSelectedItemPath() ?: "") { success ->
|
||||
if (success) {
|
||||
createShortcut()
|
||||
|
@ -560,7 +624,6 @@ class DirectoryAdapter(
|
|||
}
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.O)
|
||||
private fun createShortcut() {
|
||||
val manager = activity.getSystemService(ShortcutManager::class.java)
|
||||
if (manager.isRequestPinShortcutSupported) {
|
||||
|
@ -821,6 +884,14 @@ class DirectoryAdapter(
|
|||
else -> ROUNDED_CORNERS_BIG
|
||||
}
|
||||
|
||||
dirThumbnail.setBackgroundResource(
|
||||
when (roundedCorners) {
|
||||
ROUNDED_CORNERS_SMALL -> R.drawable.placeholder_rounded_small
|
||||
ROUNDED_CORNERS_BIG -> R.drawable.placeholder_rounded_big
|
||||
else -> R.drawable.placeholder_square
|
||||
}
|
||||
)
|
||||
|
||||
activity.loadImage(
|
||||
type = thumbnailType,
|
||||
path = directory.tmb,
|
||||
|
|
|
@ -4,8 +4,6 @@ import android.content.Intent
|
|||
import android.content.pm.ShortcutInfo
|
||||
import android.content.pm.ShortcutManager
|
||||
import android.graphics.drawable.Icon
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.view.Menu
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
|
@ -20,29 +18,92 @@ import org.fossify.commons.adapters.MyRecyclerViewAdapter
|
|||
import org.fossify.commons.dialogs.PropertiesDialog
|
||||
import org.fossify.commons.dialogs.RenameDialog
|
||||
import org.fossify.commons.dialogs.RenameItemDialog
|
||||
import org.fossify.commons.extensions.*
|
||||
import org.fossify.commons.helpers.*
|
||||
import org.fossify.commons.extensions.applyColorFilter
|
||||
import org.fossify.commons.extensions.beGone
|
||||
import org.fossify.commons.extensions.beVisible
|
||||
import org.fossify.commons.extensions.beVisibleIf
|
||||
import org.fossify.commons.extensions.convertToBitmap
|
||||
import org.fossify.commons.extensions.formatSize
|
||||
import org.fossify.commons.extensions.getFilenameFromPath
|
||||
import org.fossify.commons.extensions.getFormattedDuration
|
||||
import org.fossify.commons.extensions.getOTGPublicPath
|
||||
import org.fossify.commons.extensions.getParentPath
|
||||
import org.fossify.commons.extensions.getTimeFormat
|
||||
import org.fossify.commons.extensions.handleDeletePasswordProtection
|
||||
import org.fossify.commons.extensions.hasOTGConnected
|
||||
import org.fossify.commons.extensions.internalStoragePath
|
||||
import org.fossify.commons.extensions.isAStorageRootFolder
|
||||
import org.fossify.commons.extensions.isAccessibleWithSAFSdk30
|
||||
import org.fossify.commons.extensions.isExternalStorageManager
|
||||
import org.fossify.commons.extensions.isImageFast
|
||||
import org.fossify.commons.extensions.isPathOnOTG
|
||||
import org.fossify.commons.extensions.isRestrictedWithSAFSdk30
|
||||
import org.fossify.commons.extensions.needsStupidWritePermissions
|
||||
import org.fossify.commons.extensions.recycleBinPath
|
||||
import org.fossify.commons.extensions.rescanPaths
|
||||
import org.fossify.commons.extensions.toast
|
||||
import org.fossify.commons.helpers.FAVORITES
|
||||
import org.fossify.commons.helpers.VIEW_TYPE_LIST
|
||||
import org.fossify.commons.helpers.ensureBackgroundThread
|
||||
import org.fossify.commons.helpers.isRPlus
|
||||
import org.fossify.commons.helpers.sumByLong
|
||||
import org.fossify.commons.models.FileDirItem
|
||||
import org.fossify.commons.views.MyRecyclerView
|
||||
import org.fossify.gallery.R
|
||||
import org.fossify.gallery.activities.ViewPagerActivity
|
||||
import org.fossify.gallery.databinding.*
|
||||
import org.fossify.gallery.databinding.PhotoItemGridBinding
|
||||
import org.fossify.gallery.databinding.PhotoItemListBinding
|
||||
import org.fossify.gallery.databinding.ThumbnailSectionBinding
|
||||
import org.fossify.gallery.databinding.VideoItemGridBinding
|
||||
import org.fossify.gallery.databinding.VideoItemListBinding
|
||||
import org.fossify.gallery.dialogs.DeleteWithRememberDialog
|
||||
import org.fossify.gallery.extensions.*
|
||||
import org.fossify.gallery.helpers.*
|
||||
import org.fossify.gallery.extensions.config
|
||||
import org.fossify.gallery.extensions.fixDateTaken
|
||||
import org.fossify.gallery.extensions.getShortcutImage
|
||||
import org.fossify.gallery.extensions.handleMediaManagementPrompt
|
||||
import org.fossify.gallery.extensions.launchResizeImageDialog
|
||||
import org.fossify.gallery.extensions.launchResizeMultipleImagesDialog
|
||||
import org.fossify.gallery.extensions.loadImage
|
||||
import org.fossify.gallery.extensions.openEditor
|
||||
import org.fossify.gallery.extensions.openPath
|
||||
import org.fossify.gallery.extensions.rescanFolderMedia
|
||||
import org.fossify.gallery.extensions.restoreRecycleBinPaths
|
||||
import org.fossify.gallery.extensions.saveRotatedImageToFile
|
||||
import org.fossify.gallery.extensions.setAs
|
||||
import org.fossify.gallery.extensions.shareMediaPaths
|
||||
import org.fossify.gallery.extensions.shareMediumPath
|
||||
import org.fossify.gallery.extensions.toggleFileVisibility
|
||||
import org.fossify.gallery.extensions.tryCopyMoveFilesTo
|
||||
import org.fossify.gallery.extensions.updateDBMediaPath
|
||||
import org.fossify.gallery.extensions.updateFavorite
|
||||
import org.fossify.gallery.extensions.updateFavoritePaths
|
||||
import org.fossify.gallery.helpers.PATH
|
||||
import org.fossify.gallery.helpers.RECYCLE_BIN
|
||||
import org.fossify.gallery.helpers.ROUNDED_CORNERS_BIG
|
||||
import org.fossify.gallery.helpers.ROUNDED_CORNERS_NONE
|
||||
import org.fossify.gallery.helpers.ROUNDED_CORNERS_SMALL
|
||||
import org.fossify.gallery.helpers.SHOW_ALL
|
||||
import org.fossify.gallery.helpers.SHOW_FAVORITES
|
||||
import org.fossify.gallery.helpers.SHOW_RECYCLE_BIN
|
||||
import org.fossify.gallery.helpers.TYPE_GIFS
|
||||
import org.fossify.gallery.helpers.TYPE_RAWS
|
||||
import org.fossify.gallery.interfaces.MediaOperationsListener
|
||||
import org.fossify.gallery.models.Medium
|
||||
import org.fossify.gallery.models.ThumbnailItem
|
||||
import org.fossify.gallery.models.ThumbnailSection
|
||||
|
||||
class MediaAdapter(
|
||||
activity: BaseSimpleActivity, var media: ArrayList<ThumbnailItem>, val listener: MediaOperationsListener?, val isAGetIntent: Boolean,
|
||||
val allowMultiplePicks: Boolean, val path: String, recyclerView: MyRecyclerView, itemClick: (Any) -> Unit
|
||||
) :
|
||||
MyRecyclerViewAdapter(activity, recyclerView, itemClick), RecyclerViewFastScroller.OnPopupTextUpdate {
|
||||
activity: BaseSimpleActivity,
|
||||
var media: ArrayList<ThumbnailItem>,
|
||||
val listener: MediaOperationsListener?,
|
||||
val isAGetIntent: Boolean,
|
||||
val allowMultiplePicks: Boolean,
|
||||
val path: String,
|
||||
recyclerView: MyRecyclerView,
|
||||
itemClick: (Any) -> Unit
|
||||
) : MyRecyclerViewAdapter(activity, recyclerView, itemClick),
|
||||
RecyclerViewFastScroller.OnPopupTextUpdate {
|
||||
|
||||
private val INSTANT_LOAD_DURATION = 2000L
|
||||
private val IMAGE_LOAD_DELAY = 100L
|
||||
private val ITEM_SECTION = 0
|
||||
private val ITEM_MEDIUM_VIDEO_PORTRAIT = 1
|
||||
private val ITEM_MEDIUM_PHOTO = 2
|
||||
|
@ -50,10 +111,7 @@ class MediaAdapter(
|
|||
private val config = activity.config
|
||||
private val viewType = config.getFolderViewType(if (config.showAll) SHOW_ALL else path)
|
||||
private val isListViewType = viewType == VIEW_TYPE_LIST
|
||||
private var visibleItemPaths = ArrayList<String>()
|
||||
private var rotatedImagePaths = ArrayList<String>()
|
||||
private var loadImageInstantly = false
|
||||
private var delayHandler = Handler(Looper.getMainLooper())
|
||||
private var currentMediaHash = media.hashCode()
|
||||
private val hasOTGConnected = activity.hasOTGConnected()
|
||||
|
||||
|
@ -69,7 +127,6 @@ class MediaAdapter(
|
|||
|
||||
init {
|
||||
setupDragListener(true)
|
||||
enableInstantLoad()
|
||||
}
|
||||
|
||||
override fun getActionMenuId() = R.menu.cab_media
|
||||
|
@ -97,10 +154,6 @@ class MediaAdapter(
|
|||
|
||||
override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
|
||||
val tmbItem = media.getOrNull(position) ?: return
|
||||
if (tmbItem is Medium) {
|
||||
visibleItemPaths.add(tmbItem.path)
|
||||
}
|
||||
|
||||
val allowLongPress = (!isAGetIntent || allowMultiplePicks) && tmbItem is Medium
|
||||
holder.bindView(tmbItem, tmbItem is Medium, allowLongPress) { itemView, adapterPosition ->
|
||||
if (tmbItem is Medium) {
|
||||
|
@ -143,7 +196,7 @@ class MediaAdapter(
|
|||
findItem(R.id.cab_resize).isVisible = canResize(selectedItems)
|
||||
findItem(R.id.cab_confirm_selection).isVisible = isAGetIntent && allowMultiplePicks && selectedKeys.isNotEmpty()
|
||||
findItem(R.id.cab_restore_recycle_bin_files).isVisible = selectedPaths.all { it.startsWith(activity.recycleBinPath) }
|
||||
findItem(R.id.cab_create_shortcut).isVisible = isOreoPlus() && isOneItemSelected
|
||||
findItem(R.id.cab_create_shortcut).isVisible = isOneItemSelected
|
||||
|
||||
checkHideBtnVisibility(this, selectedItems)
|
||||
checkFavoriteBtnVisibility(this, selectedItems)
|
||||
|
@ -197,7 +250,6 @@ class MediaAdapter(
|
|||
super.onViewRecycled(holder)
|
||||
if (!activity.isDestroyed) {
|
||||
val itemView = holder.itemView
|
||||
visibleItemPaths.remove(itemView.allViews.firstOrNull { it.id == R.id.medium_name }?.tag)
|
||||
val tmb = itemView.allViews.firstOrNull { it.id == R.id.medium_thumbnail }
|
||||
if (tmb != null) {
|
||||
Glide.with(activity).clear(tmb)
|
||||
|
@ -254,7 +306,6 @@ class MediaAdapter(
|
|||
activity.updateDBMediaPath(firstPath, it)
|
||||
|
||||
activity.runOnUiThread {
|
||||
enableInstantLoad()
|
||||
listener?.refreshItems()
|
||||
finishActMode()
|
||||
}
|
||||
|
@ -262,7 +313,6 @@ class MediaAdapter(
|
|||
}
|
||||
} else {
|
||||
RenameDialog(activity, getSelectedPaths(), true) {
|
||||
enableInstantLoad()
|
||||
listener?.refreshItems()
|
||||
finishActMode()
|
||||
}
|
||||
|
@ -433,10 +483,6 @@ class MediaAdapter(
|
|||
}
|
||||
|
||||
private fun createShortcut() {
|
||||
if (!isOreoPlus()) {
|
||||
return
|
||||
}
|
||||
|
||||
val manager = activity.getSystemService(ShortcutManager::class.java)
|
||||
if (manager.isRequestPinShortcutSupported) {
|
||||
val path = getSelectedPaths().first()
|
||||
|
@ -572,7 +618,6 @@ class MediaAdapter(
|
|||
if (thumbnailItems.hashCode() != currentMediaHash) {
|
||||
currentMediaHash = thumbnailItems.hashCode()
|
||||
media = thumbnailItems
|
||||
enableInstantLoad()
|
||||
notifyDataSetChanged()
|
||||
finishActMode()
|
||||
}
|
||||
|
@ -580,7 +625,6 @@ class MediaAdapter(
|
|||
|
||||
fun updateDisplayFilenames(displayFilenames: Boolean) {
|
||||
this.displayFilenames = displayFilenames
|
||||
enableInstantLoad()
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
|
@ -599,13 +643,6 @@ class MediaAdapter(
|
|||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
private fun enableInstantLoad() {
|
||||
loadImageInstantly = true
|
||||
delayHandler.postDelayed({
|
||||
loadImageInstantly = false
|
||||
}, INSTANT_LOAD_DURATION)
|
||||
}
|
||||
|
||||
private fun setupThumbnail(view: View, medium: Medium) {
|
||||
val isSelected = selectedKeys.contains(medium.path.hashCode())
|
||||
bindItem(view, medium).apply {
|
||||
|
@ -681,46 +718,29 @@ class MediaAdapter(
|
|||
else -> ROUNDED_CORNERS_NONE
|
||||
}
|
||||
|
||||
if (loadImageInstantly) {
|
||||
activity.loadImage(
|
||||
type = medium.type,
|
||||
path = path,
|
||||
target = mediumThumbnail,
|
||||
horizontalScroll = scrollHorizontally,
|
||||
animateGifs = animateGifs,
|
||||
cropThumbnails = cropThumbnails,
|
||||
roundCorners = roundedCorners,
|
||||
signature = medium.getKey(),
|
||||
skipMemoryCacheAtPaths = rotatedImagePaths,
|
||||
onError = {
|
||||
mediumThumbnail.scaleType = ImageView.ScaleType.CENTER
|
||||
mediumThumbnail.setImageDrawable(AppCompatResources.getDrawable(activity, R.drawable.ic_vector_warning_colored))
|
||||
}
|
||||
)
|
||||
} else {
|
||||
mediumThumbnail.setImageDrawable(null)
|
||||
mediumThumbnail.isHorizontalScrolling = scrollHorizontally
|
||||
delayHandler.postDelayed({
|
||||
val isVisible = visibleItemPaths.contains(medium.path)
|
||||
if (isVisible) {
|
||||
activity.loadImage(
|
||||
type = medium.type,
|
||||
path = path,
|
||||
target = mediumThumbnail,
|
||||
horizontalScroll = scrollHorizontally,
|
||||
animateGifs = animateGifs,
|
||||
cropThumbnails = cropThumbnails,
|
||||
roundCorners = roundedCorners,
|
||||
signature = medium.getKey(),
|
||||
skipMemoryCacheAtPaths = rotatedImagePaths,
|
||||
onError = {
|
||||
mediumThumbnail.scaleType = ImageView.ScaleType.CENTER
|
||||
mediumThumbnail.setImageDrawable(AppCompatResources.getDrawable(activity, R.drawable.ic_vector_warning_colored))
|
||||
}
|
||||
)
|
||||
}
|
||||
}, IMAGE_LOAD_DELAY)
|
||||
}
|
||||
mediumThumbnail.setBackgroundResource(
|
||||
when (roundedCorners) {
|
||||
ROUNDED_CORNERS_SMALL -> R.drawable.placeholder_rounded_small
|
||||
ROUNDED_CORNERS_BIG -> R.drawable.placeholder_rounded_big
|
||||
else -> R.drawable.placeholder_square
|
||||
}
|
||||
)
|
||||
|
||||
activity.loadImage(
|
||||
type = medium.type,
|
||||
path = path,
|
||||
target = mediumThumbnail,
|
||||
horizontalScroll = scrollHorizontally,
|
||||
animateGifs = animateGifs,
|
||||
cropThumbnails = cropThumbnails,
|
||||
roundCorners = roundedCorners,
|
||||
signature = medium.getKey(),
|
||||
skipMemoryCacheAtPaths = rotatedImagePaths,
|
||||
onError = {
|
||||
mediumThumbnail.scaleType = ImageView.ScaleType.CENTER
|
||||
mediumThumbnail.setImageDrawable(AppCompatResources.getDrawable(activity, R.drawable.ic_vector_warning_colored))
|
||||
}
|
||||
)
|
||||
|
||||
if (isListViewType) {
|
||||
mediumName.setTextColor(textColor)
|
||||
|
|
|
@ -2,16 +2,32 @@ package org.fossify.gallery.dialogs
|
|||
|
||||
import android.content.DialogInterface
|
||||
import org.fossify.commons.activities.BaseSimpleActivity
|
||||
import org.fossify.commons.extensions.*
|
||||
import org.fossify.commons.helpers.*
|
||||
import org.fossify.commons.extensions.beGoneIf
|
||||
import org.fossify.commons.extensions.beVisibleIf
|
||||
import org.fossify.commons.extensions.getAlertDialogBuilder
|
||||
import org.fossify.commons.extensions.isVisible
|
||||
import org.fossify.commons.extensions.setupDialogStuff
|
||||
import org.fossify.commons.helpers.SORT_BY_COUNT
|
||||
import org.fossify.commons.helpers.SORT_BY_CUSTOM
|
||||
import org.fossify.commons.helpers.SORT_BY_DATE_MODIFIED
|
||||
import org.fossify.commons.helpers.SORT_BY_DATE_TAKEN
|
||||
import org.fossify.commons.helpers.SORT_BY_NAME
|
||||
import org.fossify.commons.helpers.SORT_BY_PATH
|
||||
import org.fossify.commons.helpers.SORT_BY_RANDOM
|
||||
import org.fossify.commons.helpers.SORT_BY_SIZE
|
||||
import org.fossify.commons.helpers.SORT_DESCENDING
|
||||
import org.fossify.commons.helpers.SORT_USE_NUMERIC_VALUE
|
||||
import org.fossify.gallery.R
|
||||
import org.fossify.gallery.databinding.DialogChangeSortingBinding
|
||||
import org.fossify.gallery.extensions.config
|
||||
import org.fossify.gallery.helpers.SHOW_ALL
|
||||
|
||||
class ChangeSortingDialog(
|
||||
val activity: BaseSimpleActivity, val isDirectorySorting: Boolean, val showFolderCheckbox: Boolean,
|
||||
val path: String = "", val callback: () -> Unit
|
||||
val activity: BaseSimpleActivity,
|
||||
val isDirectorySorting: Boolean,
|
||||
val showFolderCheckbox: Boolean,
|
||||
val path: String = "",
|
||||
val callback: () -> Unit
|
||||
) :
|
||||
DialogInterface.OnClickListener {
|
||||
private var currSorting = 0
|
||||
|
@ -20,11 +36,24 @@ class ChangeSortingDialog(
|
|||
private val binding: DialogChangeSortingBinding
|
||||
|
||||
init {
|
||||
currSorting = if (isDirectorySorting) config.directorySorting else config.getFolderSorting(pathToUse)
|
||||
binding = DialogChangeSortingBinding.inflate(activity.layoutInflater).apply {
|
||||
sortingDialogOrderDivider.beVisibleIf(showFolderCheckbox || (currSorting and SORT_BY_NAME != 0 || currSorting and SORT_BY_PATH != 0))
|
||||
currSorting = if (isDirectorySorting) {
|
||||
config.directorySorting
|
||||
} else {
|
||||
config.getFolderSorting(pathToUse)
|
||||
}
|
||||
|
||||
binding = DialogChangeSortingBinding.inflate(activity.layoutInflater).apply {
|
||||
sortingDialogRadioNumberOfItems.beVisibleIf(isDirectorySorting)
|
||||
sortingDialogOrderDivider.beVisibleIf(
|
||||
beVisible = showFolderCheckbox
|
||||
|| (currSorting and SORT_BY_NAME != 0 || currSorting and SORT_BY_PATH != 0)
|
||||
)
|
||||
|
||||
sortingDialogNumericSorting.beVisibleIf(
|
||||
beVisible = showFolderCheckbox
|
||||
&& (currSorting and SORT_BY_NAME != 0 || currSorting and SORT_BY_PATH != 0)
|
||||
)
|
||||
|
||||
sortingDialogNumericSorting.beVisibleIf(showFolderCheckbox && (currSorting and SORT_BY_NAME != 0 || currSorting and SORT_BY_PATH != 0))
|
||||
sortingDialogNumericSorting.isChecked = currSorting and SORT_USE_NUMERIC_VALUE != 0
|
||||
|
||||
sortingDialogUseForThisFolder.beVisibleIf(showFolderCheckbox)
|
||||
|
@ -47,11 +76,20 @@ class ChangeSortingDialog(
|
|||
private fun setupSortRadio() {
|
||||
val sortingRadio = binding.sortingDialogRadioSorting
|
||||
sortingRadio.setOnCheckedChangeListener { _, checkedId ->
|
||||
val isSortingByNameOrPath = checkedId == binding.sortingDialogRadioName.id || checkedId == binding.sortingDialogRadioPath.id
|
||||
binding.sortingDialogNumericSorting.beVisibleIf(isSortingByNameOrPath)
|
||||
binding.sortingDialogOrderDivider.beVisibleIf(binding.sortingDialogNumericSorting.isVisible() || binding.sortingDialogUseForThisFolder.isVisible())
|
||||
val isSortingByNameOrPath =
|
||||
checkedId == binding.sortingDialogRadioName.id
|
||||
|| checkedId == binding.sortingDialogRadioPath.id
|
||||
|
||||
binding.sortingDialogNumericSorting.beVisibleIf(isSortingByNameOrPath)
|
||||
binding.sortingDialogOrderDivider.beVisibleIf(
|
||||
binding.sortingDialogNumericSorting.isVisible()
|
||||
|| binding.sortingDialogUseForThisFolder.isVisible()
|
||||
)
|
||||
|
||||
val hideSortOrder =
|
||||
checkedId == binding.sortingDialogRadioCustom.id
|
||||
|| checkedId == binding.sortingDialogRadioRandom.id
|
||||
|
||||
val hideSortOrder = checkedId == binding.sortingDialogRadioCustom.id || checkedId == binding.sortingDialogRadioRandom.id
|
||||
binding.sortingDialogRadioOrder.beGoneIf(hideSortOrder)
|
||||
binding.sortingDialogSortingDivider.beGoneIf(hideSortOrder)
|
||||
}
|
||||
|
@ -59,6 +97,7 @@ class ChangeSortingDialog(
|
|||
val sortBtn = when {
|
||||
currSorting and SORT_BY_PATH != 0 -> binding.sortingDialogRadioPath
|
||||
currSorting and SORT_BY_SIZE != 0 -> binding.sortingDialogRadioSize
|
||||
currSorting and SORT_BY_COUNT != 0 -> binding.sortingDialogRadioNumberOfItems
|
||||
currSorting and SORT_BY_DATE_MODIFIED != 0 -> binding.sortingDialogRadioLastModified
|
||||
currSorting and SORT_BY_DATE_TAKEN != 0 -> binding.sortingDialogRadioDateTaken
|
||||
currSorting and SORT_BY_RANDOM != 0 -> binding.sortingDialogRadioRandom
|
||||
|
@ -83,6 +122,7 @@ class ChangeSortingDialog(
|
|||
R.id.sorting_dialog_radio_name -> SORT_BY_NAME
|
||||
R.id.sorting_dialog_radio_path -> SORT_BY_PATH
|
||||
R.id.sorting_dialog_radio_size -> SORT_BY_SIZE
|
||||
R.id.sorting_dialog_radio_number_of_items -> SORT_BY_COUNT
|
||||
R.id.sorting_dialog_radio_last_modified -> SORT_BY_DATE_MODIFIED
|
||||
R.id.sorting_dialog_radio_random -> SORT_BY_RANDOM
|
||||
R.id.sorting_dialog_radio_custom -> SORT_BY_CUSTOM
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
package org.fossify.gallery.dialogs
|
||||
|
||||
import android.graphics.Color
|
||||
import android.view.KeyEvent
|
||||
import android.view.KeyEvent.ACTION_UP
|
||||
import android.view.KeyEvent.KEYCODE_BACK
|
||||
import android.view.inputmethod.EditorInfo
|
||||
import android.widget.Toast
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
|
@ -54,10 +55,12 @@ class PickDirectoryDialog(
|
|||
.setPositiveButton(org.fossify.commons.R.string.ok, null)
|
||||
.setNegativeButton(org.fossify.commons.R.string.cancel, null)
|
||||
.setOnKeyListener { dialogInterface, i, keyEvent ->
|
||||
if (keyEvent.action == KeyEvent.ACTION_UP && i == KeyEvent.KEYCODE_BACK) {
|
||||
return@setOnKeyListener if (keyEvent.action == ACTION_UP && i == KEYCODE_BACK) {
|
||||
backPressed()
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
if (showOtherFolderButton) {
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package org.fossify.gallery.extensions
|
||||
|
||||
import android.annotation.TargetApi
|
||||
import android.app.Activity
|
||||
import android.content.ContentProviderOperation
|
||||
import android.content.ContentValues
|
||||
|
@ -12,7 +11,6 @@ import android.graphics.Point
|
|||
import android.graphics.drawable.Drawable
|
||||
import android.graphics.drawable.LayerDrawable
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Environment
|
||||
import android.provider.MediaStore
|
||||
import android.provider.MediaStore.Files
|
||||
|
@ -689,7 +687,6 @@ fun BaseSimpleActivity.saveRotatedImageToFile(oldPath: String, newPath: String,
|
|||
}
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.N)
|
||||
fun Activity.tryRotateByExif(path: String, degrees: Int, showToasts: Boolean, callback: () -> Unit): Boolean {
|
||||
return try {
|
||||
val file = File(path)
|
||||
|
@ -830,10 +827,8 @@ fun BaseSimpleActivity.launchResizeImageDialog(path: String, callback: (() -> Un
|
|||
|
||||
fun BaseSimpleActivity.resizeImage(oldPath: String, newPath: String, size: Point, callback: (success: Boolean) -> Unit) {
|
||||
var oldExif: ExifInterface? = null
|
||||
if (isNougatPlus()) {
|
||||
val inputStream = contentResolver.openInputStream(Uri.fromFile(File(oldPath)))
|
||||
oldExif = ExifInterface(inputStream!!)
|
||||
}
|
||||
val inputStream = contentResolver.openInputStream(Uri.fromFile(File(oldPath)))
|
||||
oldExif = ExifInterface(inputStream!!)
|
||||
|
||||
val newBitmap = Glide.with(applicationContext).asBitmap().load(oldPath).submit(size.x, size.y).get()
|
||||
|
||||
|
@ -845,10 +840,8 @@ fun BaseSimpleActivity.resizeImage(oldPath: String, newPath: String, size: Point
|
|||
try {
|
||||
newBitmap.compress(newFile.absolutePath.getCompressionFormat(), 90, out)
|
||||
|
||||
if (isNougatPlus()) {
|
||||
val newExif = ExifInterface(newFile.absolutePath)
|
||||
oldExif?.copyNonDimensionAttributesTo(newExif)
|
||||
}
|
||||
val newExif = ExifInterface(newFile.absolutePath)
|
||||
oldExif.copyNonDimensionAttributesTo(newExif)
|
||||
} catch (ignored: Exception) {
|
||||
}
|
||||
|
||||
|
@ -907,10 +900,9 @@ fun Activity.getShortcutImage(tmb: String, drawable: Drawable, callback: () -> U
|
|||
}
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.N)
|
||||
fun Activity.showFileOnMap(path: String) {
|
||||
val exif = try {
|
||||
if (path.startsWith("content://") && isNougatPlus()) {
|
||||
if (path.startsWith("content://")) {
|
||||
ExifInterface(contentResolver.openInputStream(Uri.parse(path))!!)
|
||||
} else {
|
||||
ExifInterface(path)
|
||||
|
|
|
@ -28,29 +28,96 @@ import com.bumptech.glide.load.engine.GlideException
|
|||
import com.bumptech.glide.load.resource.bitmap.CenterCrop
|
||||
import com.bumptech.glide.load.resource.bitmap.FitCenter
|
||||
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
|
||||
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
|
||||
import com.bumptech.glide.request.RequestListener
|
||||
import com.bumptech.glide.request.RequestOptions
|
||||
import com.bumptech.glide.request.target.Target
|
||||
import com.bumptech.glide.signature.ObjectKey
|
||||
import com.squareup.picasso.Picasso
|
||||
import org.fossify.commons.extensions.*
|
||||
import org.fossify.commons.helpers.*
|
||||
import org.fossify.commons.extensions.doesThisOrParentHaveNoMedia
|
||||
import org.fossify.commons.extensions.getDocumentFile
|
||||
import org.fossify.commons.extensions.getDoesFilePathExist
|
||||
import org.fossify.commons.extensions.getDuration
|
||||
import org.fossify.commons.extensions.getFilenameFromPath
|
||||
import org.fossify.commons.extensions.getLongValue
|
||||
import org.fossify.commons.extensions.getOTGPublicPath
|
||||
import org.fossify.commons.extensions.getParentPath
|
||||
import org.fossify.commons.extensions.getStringValue
|
||||
import org.fossify.commons.extensions.humanizePath
|
||||
import org.fossify.commons.extensions.internalStoragePath
|
||||
import org.fossify.commons.extensions.isGif
|
||||
import org.fossify.commons.extensions.isPathOnOTG
|
||||
import org.fossify.commons.extensions.isPathOnSD
|
||||
import org.fossify.commons.extensions.isPng
|
||||
import org.fossify.commons.extensions.isPortrait
|
||||
import org.fossify.commons.extensions.isRawFast
|
||||
import org.fossify.commons.extensions.isSvg
|
||||
import org.fossify.commons.extensions.isVideoFast
|
||||
import org.fossify.commons.extensions.isWebP
|
||||
import org.fossify.commons.extensions.normalizeString
|
||||
import org.fossify.commons.extensions.otgPath
|
||||
import org.fossify.commons.extensions.recycleBinPath
|
||||
import org.fossify.commons.extensions.sdCardPath
|
||||
import org.fossify.commons.extensions.toast
|
||||
import org.fossify.commons.helpers.AlphanumericComparator
|
||||
import org.fossify.commons.helpers.FAVORITES
|
||||
import org.fossify.commons.helpers.NOMEDIA
|
||||
import org.fossify.commons.helpers.SORT_BY_COUNT
|
||||
import org.fossify.commons.helpers.SORT_BY_CUSTOM
|
||||
import org.fossify.commons.helpers.SORT_BY_DATE_MODIFIED
|
||||
import org.fossify.commons.helpers.SORT_BY_DATE_TAKEN
|
||||
import org.fossify.commons.helpers.SORT_BY_NAME
|
||||
import org.fossify.commons.helpers.SORT_BY_PATH
|
||||
import org.fossify.commons.helpers.SORT_BY_RANDOM
|
||||
import org.fossify.commons.helpers.SORT_BY_SIZE
|
||||
import org.fossify.commons.helpers.SORT_DESCENDING
|
||||
import org.fossify.commons.helpers.SORT_USE_NUMERIC_VALUE
|
||||
import org.fossify.commons.helpers.ensureBackgroundThread
|
||||
import org.fossify.commons.helpers.sumByLong
|
||||
import org.fossify.commons.views.MySquareImageView
|
||||
import org.fossify.gallery.R
|
||||
import org.fossify.gallery.asynctasks.GetMediaAsynctask
|
||||
import org.fossify.gallery.databases.GalleryDatabase
|
||||
import org.fossify.gallery.helpers.*
|
||||
import org.fossify.gallery.interfaces.*
|
||||
import org.fossify.gallery.models.*
|
||||
import org.fossify.gallery.helpers.Config
|
||||
import org.fossify.gallery.helpers.GROUP_BY_DATE_TAKEN_DAILY
|
||||
import org.fossify.gallery.helpers.GROUP_BY_DATE_TAKEN_MONTHLY
|
||||
import org.fossify.gallery.helpers.GROUP_BY_LAST_MODIFIED_DAILY
|
||||
import org.fossify.gallery.helpers.GROUP_BY_LAST_MODIFIED_MONTHLY
|
||||
import org.fossify.gallery.helpers.IsoTypeReader
|
||||
import org.fossify.gallery.helpers.LOCATION_INTERNAL
|
||||
import org.fossify.gallery.helpers.LOCATION_OTG
|
||||
import org.fossify.gallery.helpers.LOCATION_SD
|
||||
import org.fossify.gallery.helpers.MediaFetcher
|
||||
import org.fossify.gallery.helpers.MyWidgetProvider
|
||||
import org.fossify.gallery.helpers.PicassoRoundedCornersTransformation
|
||||
import org.fossify.gallery.helpers.RECYCLE_BIN
|
||||
import org.fossify.gallery.helpers.ROUNDED_CORNERS_NONE
|
||||
import org.fossify.gallery.helpers.ROUNDED_CORNERS_SMALL
|
||||
import org.fossify.gallery.helpers.SHOW_ALL
|
||||
import org.fossify.gallery.helpers.THUMBNAIL_FADE_DURATION_MS
|
||||
import org.fossify.gallery.helpers.TYPE_GIFS
|
||||
import org.fossify.gallery.helpers.TYPE_IMAGES
|
||||
import org.fossify.gallery.helpers.TYPE_PORTRAITS
|
||||
import org.fossify.gallery.helpers.TYPE_RAWS
|
||||
import org.fossify.gallery.helpers.TYPE_SVGS
|
||||
import org.fossify.gallery.helpers.TYPE_VIDEOS
|
||||
import org.fossify.gallery.interfaces.DateTakensDao
|
||||
import org.fossify.gallery.interfaces.DirectoryDao
|
||||
import org.fossify.gallery.interfaces.FavoritesDao
|
||||
import org.fossify.gallery.interfaces.MediumDao
|
||||
import org.fossify.gallery.interfaces.WidgetsDao
|
||||
import org.fossify.gallery.models.AlbumCover
|
||||
import org.fossify.gallery.models.Directory
|
||||
import org.fossify.gallery.models.Favorite
|
||||
import org.fossify.gallery.models.Medium
|
||||
import org.fossify.gallery.models.ThumbnailItem
|
||||
import org.fossify.gallery.svg.SvgSoftwareLayerSetter
|
||||
import java.io.File
|
||||
import java.io.FileInputStream
|
||||
import java.nio.ByteBuffer
|
||||
import java.nio.channels.FileChannel
|
||||
import java.util.Locale
|
||||
import kotlin.collections.set
|
||||
import kotlin.math.max
|
||||
import kotlin.math.min
|
||||
|
||||
val Context.audioManager get() = getSystemService(Context.AUDIO_SERVICE) as AudioManager
|
||||
|
||||
|
@ -61,15 +128,19 @@ fun Context.getHumanizedFilename(path: String): String {
|
|||
|
||||
val Context.config: Config get() = Config.newInstance(applicationContext)
|
||||
|
||||
val Context.widgetsDB: WidgetsDao get() = GalleryDatabase.getInstance(applicationContext).WidgetsDao()
|
||||
val Context.widgetsDB: WidgetsDao
|
||||
get() = GalleryDatabase.getInstance(applicationContext).WidgetsDao()
|
||||
|
||||
val Context.mediaDB: MediumDao get() = GalleryDatabase.getInstance(applicationContext).MediumDao()
|
||||
|
||||
val Context.directoryDB: DirectoryDao get() = GalleryDatabase.getInstance(applicationContext).DirectoryDao()
|
||||
val Context.directoryDB: DirectoryDao
|
||||
get() = GalleryDatabase.getInstance(applicationContext).DirectoryDao()
|
||||
|
||||
val Context.favoritesDB: FavoritesDao get() = GalleryDatabase.getInstance(applicationContext).FavoritesDao()
|
||||
val Context.favoritesDB: FavoritesDao
|
||||
get() = GalleryDatabase.getInstance(applicationContext).FavoritesDao()
|
||||
|
||||
val Context.dateTakensDB: DateTakensDao get() = GalleryDatabase.getInstance(applicationContext).DateTakensDao()
|
||||
val Context.dateTakensDB: DateTakensDao
|
||||
get() = GalleryDatabase.getInstance(applicationContext).DateTakensDao()
|
||||
|
||||
val Context.recycleBin: File get() = filesDir
|
||||
|
||||
|
@ -125,7 +196,7 @@ fun Context.getSortedDirectories(source: ArrayList<Directory>): ArrayList<Direct
|
|||
return newDirsOrdered
|
||||
}
|
||||
|
||||
dirs.sortWith(Comparator { o1, o2 ->
|
||||
dirs.sortWith { o1, o2 ->
|
||||
o1 as Directory
|
||||
o2 as Directory
|
||||
|
||||
|
@ -141,11 +212,12 @@ fun Context.getSortedDirectories(source: ArrayList<Directory>): ArrayList<Direct
|
|||
|
||||
if (sorting and SORT_USE_NUMERIC_VALUE != 0) {
|
||||
AlphanumericComparator().compare(
|
||||
o1.sortValue.normalizeString().lowercase(Locale.getDefault()),
|
||||
o2.sortValue.normalizeString().lowercase(Locale.getDefault())
|
||||
string1 = o1.sortValue.normalizeString().lowercase(Locale.getDefault()),
|
||||
string2 = o2.sortValue.normalizeString().lowercase(Locale.getDefault())
|
||||
)
|
||||
} else {
|
||||
o1.sortValue.normalizeString().lowercase(Locale.getDefault()).compareTo(o2.sortValue.normalizeString().lowercase(Locale.getDefault()))
|
||||
o1.sortValue.normalizeString().lowercase(Locale.getDefault())
|
||||
.compareTo(o2.sortValue.normalizeString().lowercase(Locale.getDefault()))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -159,19 +231,17 @@ fun Context.getSortedDirectories(source: ArrayList<Directory>): ArrayList<Direct
|
|||
}
|
||||
|
||||
if (sorting and SORT_USE_NUMERIC_VALUE != 0) {
|
||||
AlphanumericComparator().compare(o1.sortValue.lowercase(Locale.getDefault()), o2.sortValue.lowercase(Locale.getDefault()))
|
||||
AlphanumericComparator().compare(
|
||||
string1 = o1.sortValue.lowercase(Locale.getDefault()),
|
||||
string2 = o2.sortValue.lowercase(Locale.getDefault())
|
||||
)
|
||||
} else {
|
||||
o1.sortValue.lowercase(Locale.getDefault()).compareTo(o2.sortValue.lowercase(Locale.getDefault()))
|
||||
o1.sortValue.lowercase(Locale.getDefault())
|
||||
.compareTo(o2.sortValue.lowercase(Locale.getDefault()))
|
||||
}
|
||||
}
|
||||
|
||||
sorting and SORT_BY_PATH != 0 -> AlphanumericComparator().compare(
|
||||
o1.sortValue.lowercase(Locale.getDefault()),
|
||||
o2.sortValue.lowercase(Locale.getDefault())
|
||||
)
|
||||
|
||||
sorting and SORT_BY_SIZE != 0 -> (o1.sortValue.toLongOrNull() ?: 0).compareTo(o2.sortValue.toLongOrNull() ?: 0)
|
||||
sorting and SORT_BY_DATE_MODIFIED != 0 -> (o1.sortValue.toLongOrNull() ?: 0).compareTo(o2.sortValue.toLongOrNull() ?: 0)
|
||||
// SORT_BY_SIZE, SORT_BY_COUNT, SORT_BY_DATE_MODIFIED are numerical
|
||||
else -> (o1.sortValue.toLongOrNull() ?: 0).compareTo(o2.sortValue.toLongOrNull() ?: 0)
|
||||
}
|
||||
|
||||
|
@ -179,12 +249,16 @@ fun Context.getSortedDirectories(source: ArrayList<Directory>): ArrayList<Direct
|
|||
result *= -1
|
||||
}
|
||||
result
|
||||
})
|
||||
}
|
||||
|
||||
return movePinnedDirectoriesToFront(dirs)
|
||||
}
|
||||
|
||||
fun Context.getDirsToShow(dirs: ArrayList<Directory>, allDirs: ArrayList<Directory>, currentPathPrefix: String): ArrayList<Directory> {
|
||||
fun Context.getDirsToShow(
|
||||
dirs: ArrayList<Directory>,
|
||||
allDirs: ArrayList<Directory>,
|
||||
currentPathPrefix: String
|
||||
): ArrayList<Directory> {
|
||||
return if (config.groupDirectSubfolders) {
|
||||
dirs.forEach {
|
||||
it.subfoldersCount = 0
|
||||
|
@ -197,8 +271,12 @@ fun Context.getDirsToShow(dirs: ArrayList<Directory>, allDirs: ArrayList<Directo
|
|||
|
||||
// show the current folder as an available option too, not just subfolders
|
||||
if (currentPathPrefix.isNotEmpty()) {
|
||||
val currentFolder =
|
||||
allDirs.firstOrNull { parentDirs.firstOrNull { it.path.equals(currentPathPrefix, true) } == null && it.path.equals(currentPathPrefix, true) }
|
||||
val currentFolder = allDirs.firstOrNull {
|
||||
parentDirs.firstOrNull {
|
||||
it.path.equals(currentPathPrefix, true)
|
||||
} == null && it.path.equals(currentPathPrefix, true)
|
||||
}
|
||||
|
||||
currentFolder?.apply {
|
||||
subfoldersCount = 1
|
||||
parentDirs.add(this)
|
||||
|
@ -235,17 +313,17 @@ private fun Context.addParentWithoutMediaFiles(into: ArrayList<Directory>, path:
|
|||
}
|
||||
|
||||
val directory = Directory(
|
||||
newDirId + 1,
|
||||
path,
|
||||
subDirs.first().tmb,
|
||||
getFolderNameFromPath(path),
|
||||
subDirs.sumOf { it.mediaCnt },
|
||||
lastModified,
|
||||
dateTaken,
|
||||
subDirs.sumByLong { it.size },
|
||||
getPathLocation(path),
|
||||
mediaTypes,
|
||||
""
|
||||
id = newDirId + 1,
|
||||
path = path,
|
||||
tmb = subDirs.first().tmb,
|
||||
name = getFolderNameFromPath(path),
|
||||
mediaCnt = subDirs.sumOf { it.mediaCnt },
|
||||
modified = lastModified,
|
||||
taken = dateTaken,
|
||||
size = subDirs.sumByLong { it.size },
|
||||
location = getPathLocation(path),
|
||||
types = mediaTypes,
|
||||
sortValue = ""
|
||||
)
|
||||
|
||||
directory.containsMediaFilesDirectly = false
|
||||
|
@ -275,7 +353,10 @@ fun Context.fillWithSharedDirectParents(dirs: ArrayList<Directory>): ArrayList<D
|
|||
return allDirs
|
||||
}
|
||||
|
||||
fun Context.getDirectParentSubfolders(dirs: ArrayList<Directory>, currentPathPrefix: String): ArrayList<Directory> {
|
||||
fun Context.getDirectParentSubfolders(
|
||||
dirs: ArrayList<Directory>,
|
||||
currentPathPrefix: String
|
||||
): ArrayList<Directory> {
|
||||
val folders = dirs.map { it.path }.sorted().toMutableSet() as HashSet<String>
|
||||
val currentPaths = LinkedHashSet<String>()
|
||||
val foldersWithoutMediaFiles = ArrayList<String>()
|
||||
|
@ -295,15 +376,28 @@ fun Context.getDirectParentSubfolders(dirs: ArrayList<Directory>, currentPathPre
|
|||
}
|
||||
}
|
||||
|
||||
if (currentPathPrefix.isNotEmpty() && path.equals(currentPathPrefix, true) || File(path).parent.equals(currentPathPrefix, true)) {
|
||||
if (
|
||||
currentPathPrefix.isNotEmpty() &&
|
||||
path.equals(currentPathPrefix, true)
|
||||
|| File(path).parent.equals(currentPathPrefix, true)
|
||||
) {
|
||||
currentPaths.add(path)
|
||||
} else if (folders.any { !it.equals(path, true) && (File(path).parent.equals(it, true) || File(it).parent.equals(File(path).parent, true)) }) {
|
||||
} else if (
|
||||
folders.any {
|
||||
!it.equals(path, true) && (File(path).parent.equals(it, true)
|
||||
|| File(it).parent.equals(File(path).parent, true))
|
||||
}
|
||||
) {
|
||||
// if we have folders like
|
||||
// /storage/emulated/0/Pictures/Images and
|
||||
// /storage/emulated/0/Pictures/Screenshots,
|
||||
// but /storage/emulated/0/Pictures is empty, still Pictures with the first folders thumbnails and proper other info
|
||||
val parent = File(path).parent
|
||||
if (parent != null && !folders.contains(parent) && dirs.none { it.path.equals(parent, true) }) {
|
||||
if (
|
||||
parent != null
|
||||
&& !folders.contains(parent)
|
||||
&& dirs.none { it.path.equals(parent, true) }
|
||||
) {
|
||||
currentPaths.add(parent)
|
||||
if (addParentWithoutMediaFiles(dirs, parent)) {
|
||||
foldersWithoutMediaFiles.add(parent)
|
||||
|
@ -318,7 +412,11 @@ fun Context.getDirectParentSubfolders(dirs: ArrayList<Directory>, currentPathPre
|
|||
currentPaths.forEach {
|
||||
val path = it
|
||||
currentPaths.forEach {
|
||||
if (!foldersWithoutMediaFiles.contains(it) && !it.equals(path, true) && File(it).parent?.equals(path, true) == true) {
|
||||
if (
|
||||
!foldersWithoutMediaFiles.contains(it)
|
||||
&& !it.equals(path, true)
|
||||
&& File(it).parent?.equals(path, true) == true
|
||||
) {
|
||||
areDirectSubfoldersAvailable = true
|
||||
}
|
||||
}
|
||||
|
@ -347,7 +445,10 @@ fun Context.getDirectParentSubfolders(dirs: ArrayList<Directory>, currentPathPre
|
|||
}
|
||||
}
|
||||
|
||||
fun Context.updateSubfolderCounts(children: ArrayList<Directory>, parentDirs: ArrayList<Directory>) {
|
||||
fun Context.updateSubfolderCounts(
|
||||
children: ArrayList<Directory>,
|
||||
parentDirs: ArrayList<Directory>
|
||||
) {
|
||||
for (child in children) {
|
||||
var longestSharedPath = ""
|
||||
for (parentDir in parentDirs) {
|
||||
|
@ -356,14 +457,21 @@ fun Context.updateSubfolderCounts(children: ArrayList<Directory>, parentDirs: Ar
|
|||
continue
|
||||
}
|
||||
|
||||
if (child.path.startsWith(parentDir.path, true) && parentDir.path.length > longestSharedPath.length) {
|
||||
if (
|
||||
child.path.startsWith(parentDir.path, true)
|
||||
&& parentDir.path.length > longestSharedPath.length
|
||||
) {
|
||||
longestSharedPath = parentDir.path
|
||||
}
|
||||
}
|
||||
|
||||
// make sure we count only the proper direct subfolders, grouped the same way as on the main screen
|
||||
parentDirs.firstOrNull { it.path == longestSharedPath }?.apply {
|
||||
if (path.equals(child.path, true) || path.equals(File(child.path).parent, true) || children.any { it.path.equals(File(child.path).parent, true) }) {
|
||||
if (
|
||||
path.equals(child.path, true)
|
||||
|| path.equals(File(child.path).parent, true)
|
||||
|| children.any { it.path.equals(File(child.path).parent, true) }
|
||||
) {
|
||||
if (child.containsMediaFilesDirectly) {
|
||||
subfoldersCount++
|
||||
}
|
||||
|
@ -399,7 +507,10 @@ fun Context.getNoMediaFoldersSync(): ArrayList<String> {
|
|||
do {
|
||||
val path = cursor.getStringValue(Files.FileColumns.DATA) ?: continue
|
||||
val noMediaFile = File(path)
|
||||
if (getDoesFilePathExist(noMediaFile.absolutePath, OTGPath) && noMediaFile.name == NOMEDIA) {
|
||||
if (
|
||||
getDoesFilePathExist(noMediaFile.absolutePath, OTGPath)
|
||||
&& noMediaFile.name == NOMEDIA
|
||||
) {
|
||||
folders.add(noMediaFile.parent)
|
||||
}
|
||||
} while (cursor.moveToNext())
|
||||
|
@ -420,7 +531,13 @@ fun Context.rescanFolderMedia(path: String) {
|
|||
|
||||
fun Context.rescanFolderMediaSync(path: String) {
|
||||
getCachedMedia(path) { cached ->
|
||||
GetMediaAsynctask(applicationContext, path, isPickImage = false, isPickVideo = false, showAll = false) { newMedia ->
|
||||
GetMediaAsynctask(
|
||||
context = applicationContext,
|
||||
mPath = path,
|
||||
isPickImage = false,
|
||||
isPickVideo = false,
|
||||
showAll = false
|
||||
) { newMedia ->
|
||||
ensureBackgroundThread {
|
||||
val media = newMedia.filterIsInstance<Medium>() as ArrayList<Medium>
|
||||
try {
|
||||
|
@ -447,14 +564,22 @@ fun Context.storeDirectoryItems(items: ArrayList<Directory>) {
|
|||
}
|
||||
}
|
||||
|
||||
fun Context.checkAppendingHidden(path: String, hidden: String, includedFolders: MutableSet<String>, noMediaFolders: ArrayList<String>): String {
|
||||
fun Context.checkAppendingHidden(
|
||||
path: String,
|
||||
hidden: String,
|
||||
includedFolders: MutableSet<String>,
|
||||
noMediaFolders: ArrayList<String>
|
||||
): String {
|
||||
val dirName = getFolderNameFromPath(path)
|
||||
val folderNoMediaStatuses = HashMap<String, Boolean>()
|
||||
noMediaFolders.forEach { folder ->
|
||||
folderNoMediaStatuses["$folder/$NOMEDIA"] = true
|
||||
}
|
||||
|
||||
return if (path.doesThisOrParentHaveNoMedia(folderNoMediaStatuses, null) && !path.isThisOrParentIncluded(includedFolders)) {
|
||||
return if (
|
||||
path.doesThisOrParentHaveNoMedia(folderNoMediaStatuses, null)
|
||||
&& !path.isThisOrParentIncluded(includedFolders)
|
||||
) {
|
||||
"$dirName $hidden"
|
||||
} else {
|
||||
dirName
|
||||
|
@ -512,7 +637,19 @@ fun Context.addTempFolderIfNeeded(dirs: ArrayList<Directory>): ArrayList<Directo
|
|||
val tempFolderPath = config.tempFolderPath
|
||||
return if (tempFolderPath.isNotEmpty()) {
|
||||
val directories = ArrayList<Directory>()
|
||||
val newFolder = Directory(null, tempFolderPath, "", tempFolderPath.getFilenameFromPath(), 0, 0, 0, 0L, getPathLocation(tempFolderPath), 0, "")
|
||||
val newFolder = Directory(
|
||||
id = null,
|
||||
path = tempFolderPath,
|
||||
tmb = "",
|
||||
name = tempFolderPath.getFilenameFromPath(),
|
||||
mediaCnt = 0,
|
||||
modified = 0,
|
||||
taken = 0,
|
||||
size = 0L,
|
||||
location = getPathLocation(tempFolderPath),
|
||||
types = 0,
|
||||
sortValue = ""
|
||||
)
|
||||
directories.add(newFolder)
|
||||
directories.addAll(dirs)
|
||||
directories
|
||||
|
@ -551,7 +688,10 @@ fun Context.loadImageBase(
|
|||
|
||||
if (cropThumbnails) {
|
||||
options.optionalTransform(CenterCrop())
|
||||
options.optionalTransform(WebpDrawable::class.java, WebpDrawableTransformation(CenterCrop()))
|
||||
options.optionalTransform(
|
||||
WebpDrawable::class.java,
|
||||
WebpDrawableTransformation(CenterCrop())
|
||||
)
|
||||
} else {
|
||||
options.optionalTransform(FitCenter())
|
||||
options.optionalTransform(WebpDrawable::class.java, WebpDrawableTransformation(FitCenter()))
|
||||
|
@ -559,7 +699,6 @@ fun Context.loadImageBase(
|
|||
|
||||
// animation is only supported without rounded corners and the file must be a GIF or WEBP.
|
||||
// Glide doesn't support animated AVIF: https://bumptech.github.io/glide/int/avif.html
|
||||
// TODO: animate JXL
|
||||
if (animate && roundCorners == ROUNDED_CORNERS_NONE && (path.isGif() || path.isWebP())) {
|
||||
// this is required to make glide cache aware of changes
|
||||
options.decode(Drawable::class.java)
|
||||
|
@ -577,7 +716,10 @@ fun Context.loadImageBase(
|
|||
options.optionalTransform(MultiTransformation(CenterCrop(), roundedCornersTransform))
|
||||
options.optionalTransform(
|
||||
WebpDrawable::class.java,
|
||||
MultiTransformation(WebpDrawableTransformation(CenterCrop()), WebpDrawableTransformation(roundedCornersTransform))
|
||||
MultiTransformation(
|
||||
WebpDrawableTransformation(CenterCrop()),
|
||||
WebpDrawableTransformation(roundedCornersTransform)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -586,10 +728,15 @@ fun Context.loadImageBase(
|
|||
.load(path)
|
||||
.apply(options)
|
||||
.set(WebpDownsampler.USE_SYSTEM_DECODER, false) // CVE-2023-4863
|
||||
.transition(DrawableTransitionOptions.withCrossFade(crossFadeDuration))
|
||||
.transition(getOptionalCrossFadeTransition(crossFadeDuration))
|
||||
|
||||
builder = builder.listener(object : RequestListener<Drawable> {
|
||||
override fun onLoadFailed(e: GlideException?, model: Any?, targetBitmap: Target<Drawable>, isFirstResource: Boolean): Boolean {
|
||||
override fun onLoadFailed(
|
||||
e: GlideException?,
|
||||
model: Any?,
|
||||
targetBitmap: Target<Drawable>,
|
||||
isFirstResource: Boolean
|
||||
): Boolean {
|
||||
if (tryLoadingWithPicasso) {
|
||||
tryLoadingWithPicasso(path, target, cropThumbnails, roundCorners, signature)
|
||||
} else {
|
||||
|
@ -619,7 +766,11 @@ fun Context.loadSVG(
|
|||
signature: ObjectKey,
|
||||
crossFadeDuration: Int = THUMBNAIL_FADE_DURATION_MS,
|
||||
) {
|
||||
target.scaleType = if (cropThumbnails) ImageView.ScaleType.CENTER_CROP else ImageView.ScaleType.FIT_CENTER
|
||||
target.scaleType = if (cropThumbnails) {
|
||||
ImageView.ScaleType.CENTER_CROP
|
||||
} else {
|
||||
ImageView.ScaleType.FIT_CENTER
|
||||
}
|
||||
|
||||
val options = RequestOptions().signature(signature)
|
||||
var builder = Glide.with(applicationContext)
|
||||
|
@ -627,11 +778,14 @@ fun Context.loadSVG(
|
|||
.listener(SvgSoftwareLayerSetter())
|
||||
.load(path)
|
||||
.apply(options)
|
||||
.transition(DrawableTransitionOptions.withCrossFade(crossFadeDuration))
|
||||
.transition(getOptionalCrossFadeTransition(crossFadeDuration))
|
||||
|
||||
if (roundCorners != ROUNDED_CORNERS_NONE) {
|
||||
val cornerSize =
|
||||
if (roundCorners == ROUNDED_CORNERS_SMALL) org.fossify.commons.R.dimen.rounded_corner_radius_small else org.fossify.commons.R.dimen.rounded_corner_radius_big
|
||||
val cornerSize = when (roundCorners) {
|
||||
ROUNDED_CORNERS_SMALL -> org.fossify.commons.R.dimen.rounded_corner_radius_small
|
||||
else -> org.fossify.commons.R.dimen.rounded_corner_radius_big
|
||||
}
|
||||
|
||||
val cornerRadius = resources.getDimension(cornerSize).toInt()
|
||||
builder = builder.transform(CenterCrop(), RoundedCorners(cornerRadius))
|
||||
}
|
||||
|
@ -640,7 +794,13 @@ fun Context.loadSVG(
|
|||
}
|
||||
|
||||
// intended mostly for Android 11 issues, that fail loading PNG files bigger than 10 MB
|
||||
fun Context.tryLoadingWithPicasso(path: String, view: MySquareImageView, cropThumbnails: Boolean, roundCorners: Int, signature: ObjectKey) {
|
||||
fun Context.tryLoadingWithPicasso(
|
||||
path: String,
|
||||
view: MySquareImageView,
|
||||
cropThumbnails: Boolean,
|
||||
roundCorners: Int,
|
||||
signature: ObjectKey
|
||||
) {
|
||||
var pathToLoad = "file://$path"
|
||||
pathToLoad = pathToLoad.replace("%", "%25").replace("#", "%23")
|
||||
|
||||
|
@ -706,22 +866,27 @@ fun Context.getCachedDirectories(
|
|||
}
|
||||
|
||||
var filteredDirectories = directories.filter {
|
||||
it.path.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden, folderNoMediaStatuses) { path, hasNoMedia ->
|
||||
it.path.shouldFolderBeVisible(
|
||||
excludedPaths = excludedPaths,
|
||||
includedPaths = includedPaths,
|
||||
showHidden = shouldShowHidden,
|
||||
folderNoMediaStatuses = folderNoMediaStatuses
|
||||
) { path, hasNoMedia ->
|
||||
folderNoMediaStatuses[path] = hasNoMedia
|
||||
}
|
||||
} as ArrayList<Directory>
|
||||
val filterMedia = config.filterMedia
|
||||
|
||||
val filterMedia = config.filterMedia
|
||||
filteredDirectories = (when {
|
||||
getVideosOnly -> filteredDirectories.filter { it.types and TYPE_VIDEOS != 0 }
|
||||
getImagesOnly -> filteredDirectories.filter { it.types and TYPE_IMAGES != 0 }
|
||||
else -> filteredDirectories.filter {
|
||||
(filterMedia and TYPE_IMAGES != 0 && it.types and TYPE_IMAGES != 0) ||
|
||||
(filterMedia and TYPE_VIDEOS != 0 && it.types and TYPE_VIDEOS != 0) ||
|
||||
(filterMedia and TYPE_GIFS != 0 && it.types and TYPE_GIFS != 0) ||
|
||||
(filterMedia and TYPE_RAWS != 0 && it.types and TYPE_RAWS != 0) ||
|
||||
(filterMedia and TYPE_SVGS != 0 && it.types and TYPE_SVGS != 0) ||
|
||||
(filterMedia and TYPE_PORTRAITS != 0 && it.types and TYPE_PORTRAITS != 0)
|
||||
(filterMedia and TYPE_IMAGES != 0 && it.types and TYPE_IMAGES != 0)
|
||||
|| (filterMedia and TYPE_VIDEOS != 0 && it.types and TYPE_VIDEOS != 0)
|
||||
|| (filterMedia and TYPE_GIFS != 0 && it.types and TYPE_GIFS != 0)
|
||||
|| (filterMedia and TYPE_RAWS != 0 && it.types and TYPE_RAWS != 0)
|
||||
|| (filterMedia and TYPE_SVGS != 0 && it.types and TYPE_SVGS != 0)
|
||||
|| (filterMedia and TYPE_PORTRAITS != 0 && it.types and TYPE_PORTRAITS != 0)
|
||||
}
|
||||
}) as ArrayList<Directory>
|
||||
|
||||
|
@ -752,10 +917,20 @@ fun Context.getCachedDirectories(
|
|||
}
|
||||
}
|
||||
|
||||
fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, callback: (ArrayList<ThumbnailItem>) -> Unit) {
|
||||
fun Context.getCachedMedia(
|
||||
path: String,
|
||||
getVideosOnly: Boolean = false,
|
||||
getImagesOnly: Boolean = false,
|
||||
callback: (ArrayList<ThumbnailItem>) -> Unit
|
||||
) {
|
||||
ensureBackgroundThread {
|
||||
val mediaFetcher = MediaFetcher(this)
|
||||
val foldersToScan = if (path.isEmpty()) mediaFetcher.getFoldersToScan() else arrayListOf(path)
|
||||
val foldersToScan = if (path.isEmpty()) {
|
||||
mediaFetcher.getFoldersToScan()
|
||||
} else {
|
||||
arrayListOf(path)
|
||||
}
|
||||
|
||||
var media = ArrayList<Medium>()
|
||||
if (path == FAVORITES) {
|
||||
media.addAll(mediaDB.getFavorites())
|
||||
|
@ -794,12 +969,12 @@ fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImag
|
|||
getVideosOnly -> media.filter { it.type == TYPE_VIDEOS }
|
||||
getImagesOnly -> media.filter { it.type == TYPE_IMAGES }
|
||||
else -> media.filter {
|
||||
(filterMedia and TYPE_IMAGES != 0 && it.type == TYPE_IMAGES) ||
|
||||
(filterMedia and TYPE_VIDEOS != 0 && it.type == TYPE_VIDEOS) ||
|
||||
(filterMedia and TYPE_GIFS != 0 && it.type == TYPE_GIFS) ||
|
||||
(filterMedia and TYPE_RAWS != 0 && it.type == TYPE_RAWS) ||
|
||||
(filterMedia and TYPE_SVGS != 0 && it.type == TYPE_SVGS) ||
|
||||
(filterMedia and TYPE_PORTRAITS != 0 && it.type == TYPE_PORTRAITS)
|
||||
(filterMedia and TYPE_IMAGES != 0 && it.type == TYPE_IMAGES)
|
||||
|| (filterMedia and TYPE_VIDEOS != 0 && it.type == TYPE_VIDEOS)
|
||||
|| (filterMedia and TYPE_GIFS != 0 && it.type == TYPE_GIFS)
|
||||
|| (filterMedia and TYPE_RAWS != 0 && it.type == TYPE_RAWS)
|
||||
|| (filterMedia and TYPE_SVGS != 0 && it.type == TYPE_SVGS)
|
||||
|| (filterMedia and TYPE_PORTRAITS != 0 && it.type == TYPE_PORTRAITS)
|
||||
}
|
||||
}) as ArrayList<Medium>
|
||||
|
||||
|
@ -840,7 +1015,12 @@ fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImag
|
|||
fun Context.removeInvalidDBDirectories(dirs: ArrayList<Directory>? = null) {
|
||||
val dirsToCheck = dirs ?: directoryDB.getAll()
|
||||
val OTGPath = config.OTGPath
|
||||
dirsToCheck.filter { !it.areFavorites() && !it.isRecycleBin() && !getDoesFilePathExist(it.path, OTGPath) && it.path != config.tempFolderPath }.forEach {
|
||||
dirsToCheck.filter {
|
||||
!it.areFavorites()
|
||||
&& !it.isRecycleBin()
|
||||
&& !getDoesFilePathExist(it.path, OTGPath)
|
||||
&& it.path != config.tempFolderPath
|
||||
}.forEach {
|
||||
try {
|
||||
directoryDB.deleteDirPath(it.path)
|
||||
} catch (ignored: Exception) {
|
||||
|
@ -861,14 +1041,14 @@ fun Context.updateDBMediaPath(oldPath: String, newPath: String) {
|
|||
fun Context.updateDBDirectory(directory: Directory) {
|
||||
try {
|
||||
directoryDB.updateDirectory(
|
||||
directory.path,
|
||||
directory.tmb,
|
||||
directory.mediaCnt,
|
||||
directory.modified,
|
||||
directory.taken,
|
||||
directory.size,
|
||||
directory.types,
|
||||
directory.sortValue
|
||||
path = directory.path,
|
||||
thumbnail = directory.tmb,
|
||||
mediaCnt = directory.mediaCnt,
|
||||
lastModified = directory.modified,
|
||||
dateTaken = directory.taken,
|
||||
size = directory.size,
|
||||
mediaTypes = directory.types,
|
||||
sortValue = directory.sortValue
|
||||
)
|
||||
} catch (ignored: Exception) {
|
||||
}
|
||||
|
@ -876,7 +1056,9 @@ fun Context.updateDBDirectory(directory: Directory) {
|
|||
|
||||
fun Context.getOTGFolderChildren(path: String) = getDocumentFile(path)?.listFiles()
|
||||
|
||||
fun Context.getOTGFolderChildrenNames(path: String) = getOTGFolderChildren(path)?.map { it.name }?.toMutableList()
|
||||
fun Context.getOTGFolderChildrenNames(path: String): MutableList<String?>? {
|
||||
return getOTGFolderChildren(path)?.map { it.name }?.toMutableList()
|
||||
}
|
||||
|
||||
fun Context.getFavoritePaths(): ArrayList<String> {
|
||||
return try {
|
||||
|
@ -886,7 +1068,9 @@ fun Context.getFavoritePaths(): ArrayList<String> {
|
|||
}
|
||||
}
|
||||
|
||||
fun Context.getFavoriteFromPath(path: String) = Favorite(null, path, path.getFilenameFromPath(), path.getParentPath())
|
||||
fun Context.getFavoriteFromPath(path: String): Favorite {
|
||||
return Favorite(null, path, path.getFilenameFromPath(), path.getParentPath())
|
||||
}
|
||||
|
||||
fun Context.updateFavorite(path: String, isFavorite: Boolean) {
|
||||
try {
|
||||
|
@ -926,8 +1110,10 @@ fun Context.deleteMediumWithPath(path: String) {
|
|||
}
|
||||
|
||||
fun Context.updateWidgets() {
|
||||
val widgetIDs = AppWidgetManager.getInstance(applicationContext)?.getAppWidgetIds(ComponentName(applicationContext, MyWidgetProvider::class.java))
|
||||
val widgetIDs = AppWidgetManager.getInstance(applicationContext)
|
||||
?.getAppWidgetIds(ComponentName(applicationContext, MyWidgetProvider::class.java))
|
||||
?: return
|
||||
|
||||
if (widgetIDs.isNotEmpty()) {
|
||||
Intent(applicationContext, MyWidgetProvider::class.java).apply {
|
||||
action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
|
||||
|
@ -938,8 +1124,15 @@ fun Context.updateWidgets() {
|
|||
}
|
||||
|
||||
// based on https://github.com/sannies/mp4parser/blob/master/examples/src/main/java/com/google/code/mp4parser/example/PrintStructure.java
|
||||
fun Context.parseFileChannel(path: String, fc: FileChannel, level: Int, start: Long, end: Long, callback: () -> Unit) {
|
||||
val FILE_CHANNEL_CONTAINERS = arrayListOf("moov", "trak", "mdia", "minf", "udta", "stbl")
|
||||
fun Context.parseFileChannel(
|
||||
path: String,
|
||||
fc: FileChannel,
|
||||
level: Int,
|
||||
start: Long,
|
||||
end: Long,
|
||||
callback: () -> Unit
|
||||
) {
|
||||
val fileChannelContainers = arrayListOf("moov", "trak", "mdia", "minf", "udta", "stbl")
|
||||
try {
|
||||
var iteration = 0
|
||||
var currEnd = end
|
||||
|
@ -978,13 +1171,16 @@ fun Context.parseFileChannel(path: String, fc: FileChannel, level: Int, start: L
|
|||
}
|
||||
|
||||
val xmlString = sb.toString().lowercase(Locale.getDefault())
|
||||
if (xmlString.contains("gspherical:projectiontype>equirectangular") || xmlString.contains("gspherical:projectiontype=\"equirectangular\"")) {
|
||||
if (
|
||||
xmlString.contains("gspherical:projectiontype>equirectangular")
|
||||
|| xmlString.contains("gspherical:projectiontype=\"equirectangular\"")
|
||||
) {
|
||||
callback.invoke()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if (FILE_CHANNEL_CONTAINERS.contains(type)) {
|
||||
if (fileChannelContainers.contains(type)) {
|
||||
parseFileChannel(path, fc, level + 1, begin + 8, newEnd, callback)
|
||||
}
|
||||
|
||||
|
@ -1013,8 +1209,18 @@ fun Context.addPathToDB(path: String) {
|
|||
val isFavorite = favoritesDB.isFavorite(path)
|
||||
val videoDuration = if (type == TYPE_VIDEOS) getDuration(path) ?: 0 else 0
|
||||
val medium = Medium(
|
||||
null, path.getFilenameFromPath(), path, path.getParentPath(), System.currentTimeMillis(), System.currentTimeMillis(),
|
||||
File(path).length(), type, videoDuration, isFavorite, 0L, 0L
|
||||
id = null,
|
||||
name = path.getFilenameFromPath(),
|
||||
path = path,
|
||||
parentPath = path.getParentPath(),
|
||||
modified = System.currentTimeMillis(),
|
||||
taken = System.currentTimeMillis(),
|
||||
size = File(path).length(),
|
||||
type = type,
|
||||
videoDuration = videoDuration,
|
||||
isFavorite = isFavorite,
|
||||
deletedTS = 0L,
|
||||
mediaStoreId = 0L
|
||||
)
|
||||
|
||||
mediaDB.insert(medium)
|
||||
|
@ -1056,20 +1262,50 @@ fun Context.createDirectoryFromMedia(
|
|||
val firstItem = curMedia.firstOrNull() ?: defaultMedium
|
||||
val lastItem = curMedia.lastOrNull() ?: defaultMedium
|
||||
val dirName = checkAppendingHidden(path, hiddenString, includedFolders, noMediaFolders)
|
||||
val lastModified = if (isSortingAscending) Math.min(firstItem.modified, lastItem.modified) else Math.max(firstItem.modified, lastItem.modified)
|
||||
val dateTaken = if (isSortingAscending) Math.min(firstItem.taken, lastItem.taken) else Math.max(firstItem.taken, lastItem.taken)
|
||||
val lastModified = if (isSortingAscending) {
|
||||
min(firstItem.modified, lastItem.modified)
|
||||
} else {
|
||||
max(firstItem.modified, lastItem.modified)
|
||||
}
|
||||
|
||||
val dateTaken = if (isSortingAscending) {
|
||||
min(firstItem.taken, lastItem.taken)
|
||||
} else {
|
||||
max(firstItem.taken, lastItem.taken)
|
||||
}
|
||||
|
||||
val size = if (getProperFileSize) curMedia.sumByLong { it.size } else 0L
|
||||
val mediaTypes = curMedia.getDirMediaTypes()
|
||||
val sortValue = getDirectorySortingValue(curMedia, path, dirName, size)
|
||||
return Directory(null, path, thumbnail!!, dirName, curMedia.size, lastModified, dateTaken, size, getPathLocation(path), mediaTypes, sortValue)
|
||||
val count = curMedia.size
|
||||
val sortValue = getDirectorySortingValue(curMedia, path, dirName, size, count)
|
||||
return Directory(
|
||||
id = null,
|
||||
path = path,
|
||||
tmb = thumbnail!!,
|
||||
name = dirName,
|
||||
mediaCnt = curMedia.size,
|
||||
modified = lastModified,
|
||||
taken = dateTaken,
|
||||
size = size,
|
||||
location = getPathLocation(path),
|
||||
types = mediaTypes,
|
||||
sortValue = sortValue
|
||||
)
|
||||
}
|
||||
|
||||
fun Context.getDirectorySortingValue(media: ArrayList<Medium>, path: String, name: String, size: Long): String {
|
||||
fun Context.getDirectorySortingValue(
|
||||
media: ArrayList<Medium>,
|
||||
path: String,
|
||||
name: String,
|
||||
size: Long,
|
||||
count: Int
|
||||
): String {
|
||||
val sorting = config.directorySorting
|
||||
val sorted = when {
|
||||
sorting and SORT_BY_NAME != 0 -> return name
|
||||
sorting and SORT_BY_PATH != 0 -> return path
|
||||
sorting and SORT_BY_SIZE != 0 -> return size.toString()
|
||||
sorting and SORT_BY_COUNT != 0 -> return count.toString()
|
||||
sorting and SORT_BY_DATE_MODIFIED != 0 -> media.sortedBy { it.modified }
|
||||
sorting and SORT_BY_DATE_TAKEN != 0 -> media.sortedBy { it.taken }
|
||||
else -> media
|
||||
|
@ -1101,26 +1337,48 @@ fun Context.updateDirectoryPath(path: String) {
|
|||
|
||||
val sorting = config.getFolderSorting(path)
|
||||
val grouping = config.getFolderGrouping(path)
|
||||
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 ||
|
||||
sorting and SORT_BY_DATE_TAKEN != 0 ||
|
||||
grouping and GROUP_BY_DATE_TAKEN_DAILY != 0 ||
|
||||
grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0
|
||||
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0
|
||||
|| sorting and SORT_BY_DATE_TAKEN != 0
|
||||
|| grouping and GROUP_BY_DATE_TAKEN_DAILY != 0
|
||||
|| grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0
|
||||
|
||||
val getProperLastModified = config.directorySorting and SORT_BY_DATE_MODIFIED != 0 ||
|
||||
sorting and SORT_BY_DATE_MODIFIED != 0 ||
|
||||
grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 ||
|
||||
grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0
|
||||
val getProperLastModified = config.directorySorting and SORT_BY_DATE_MODIFIED != 0
|
||||
|| sorting and SORT_BY_DATE_MODIFIED != 0
|
||||
|| grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0
|
||||
|| grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0
|
||||
|
||||
val getProperFileSize = config.directorySorting and SORT_BY_SIZE != 0
|
||||
|
||||
val lastModifieds = if (getProperLastModified) mediaFetcher.getFolderLastModifieds(path) else HashMap()
|
||||
val lastModifieds = if (getProperLastModified) {
|
||||
mediaFetcher.getFolderLastModifieds(path)
|
||||
} else {
|
||||
HashMap()
|
||||
}
|
||||
|
||||
val dateTakens = mediaFetcher.getFolderDateTakens(path)
|
||||
val favoritePaths = getFavoritePaths()
|
||||
val curMedia = mediaFetcher.getFilesFrom(
|
||||
path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified, getProperFileSize,
|
||||
favoritePaths, false, lastModifieds, dateTakens, null
|
||||
curPath = path,
|
||||
isPickImage = getImagesOnly,
|
||||
isPickVideo = getVideosOnly,
|
||||
getProperDateTaken = getProperDateTaken,
|
||||
getProperLastModified = getProperLastModified,
|
||||
getProperFileSize = getProperFileSize,
|
||||
favoritePaths = favoritePaths,
|
||||
getVideoDurations = false,
|
||||
lastModifieds = lastModifieds,
|
||||
dateTakens = dateTakens,
|
||||
android11Files = null
|
||||
)
|
||||
val directory = createDirectoryFromMedia(
|
||||
path = path,
|
||||
curMedia = curMedia,
|
||||
albumCovers = albumCovers,
|
||||
hiddenString = hiddenString,
|
||||
includedFolders = includedFolders,
|
||||
getProperFileSize = getProperFileSize,
|
||||
noMediaFolders = noMediaFolders
|
||||
)
|
||||
val directory = createDirectoryFromMedia(path, curMedia, albumCovers, hiddenString, includedFolders, getProperFileSize, noMediaFolders)
|
||||
updateDBDirectory(directory)
|
||||
}
|
||||
|
||||
|
|
19
app/src/main/kotlin/org/fossify/gallery/extensions/Glide.kt
Normal file
19
app/src/main/kotlin/org/fossify/gallery/extensions/Glide.kt
Normal file
|
@ -0,0 +1,19 @@
|
|||
package org.fossify.gallery.extensions
|
||||
|
||||
import com.bumptech.glide.load.DataSource
|
||||
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
|
||||
import com.bumptech.glide.request.transition.DrawableCrossFadeFactory
|
||||
import com.bumptech.glide.request.transition.TransitionFactory
|
||||
|
||||
/**
|
||||
* Cross fade transition option that disabled fading when loading from cache.
|
||||
*/
|
||||
fun getOptionalCrossFadeTransition(duration: Int): DrawableTransitionOptions {
|
||||
return DrawableTransitionOptions.with(
|
||||
TransitionFactory { dataSource, isFirstResource ->
|
||||
if (dataSource == DataSource.RESOURCE_DISK_CACHE) return@TransitionFactory null
|
||||
DrawableCrossFadeFactory.Builder(duration).build().build(dataSource, isFirstResource)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
41
app/src/main/kotlin/org/fossify/gallery/extensions/Player.kt
Normal file
41
app/src/main/kotlin/org/fossify/gallery/extensions/Player.kt
Normal file
|
@ -0,0 +1,41 @@
|
|||
package org.fossify.gallery.extensions
|
||||
|
||||
import android.content.Context
|
||||
import androidx.media3.common.PlaybackException
|
||||
import androidx.media3.common.PlaybackException.ERROR_CODE_DECODER_INIT_FAILED
|
||||
import androidx.media3.common.PlaybackException.ERROR_CODE_DECODING_FAILED
|
||||
import androidx.media3.common.PlaybackException.ERROR_CODE_DECODING_FORMAT_EXCEEDS_CAPABILITIES
|
||||
import androidx.media3.common.PlaybackException.ERROR_CODE_DECODING_FORMAT_UNSUPPORTED
|
||||
import androidx.media3.common.PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED
|
||||
import androidx.media3.common.PlaybackException.ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED
|
||||
import androidx.media3.common.PlaybackException.ERROR_CODE_PARSING_MANIFEST_MALFORMED
|
||||
import androidx.media3.common.PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED
|
||||
import androidx.media3.common.Player
|
||||
import org.fossify.gallery.R
|
||||
|
||||
fun Player.mute() {
|
||||
volume = 0f
|
||||
}
|
||||
|
||||
fun Player.unmute() {
|
||||
volume = 1f
|
||||
}
|
||||
|
||||
fun PlaybackException.getFriendlyMessage(context: Context): String {
|
||||
val resource = when (errorCode) {
|
||||
ERROR_CODE_PARSING_CONTAINER_MALFORMED,
|
||||
ERROR_CODE_PARSING_MANIFEST_MALFORMED -> R.string.file_is_malformed_or_corrupted
|
||||
|
||||
ERROR_CODE_DECODER_INIT_FAILED,
|
||||
ERROR_CODE_DECODING_FAILED,
|
||||
ERROR_CODE_DECODING_FORMAT_EXCEEDS_CAPABILITIES -> R.string.media_exceeds_device_capabilities
|
||||
|
||||
ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED,
|
||||
ERROR_CODE_DECODING_FORMAT_UNSUPPORTED,
|
||||
ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED -> R.string.unsupported_format
|
||||
|
||||
else -> return localizedMessage ?: context.getString(R.string.failed_to_load_media)
|
||||
}
|
||||
|
||||
return context.getString(resource)
|
||||
}
|
|
@ -6,6 +6,8 @@ import android.view.LayoutInflater
|
|||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.core.content.res.ResourcesCompat
|
||||
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||
import org.fossify.commons.extensions.*
|
||||
import org.fossify.commons.views.MySeekBar
|
||||
|
@ -49,6 +51,7 @@ class PlaybackSpeedFragment : BottomSheetDialogFragment() {
|
|||
initSeekbar(playbackSpeedSeekbar, playbackSpeedLabel, config)
|
||||
}
|
||||
|
||||
(dialog as? BottomSheetDialog)?.behavior?.state = BottomSheetBehavior.STATE_EXPANDED
|
||||
return binding.root
|
||||
}
|
||||
|
||||
|
|
|
@ -9,14 +9,26 @@ import android.net.Uri
|
|||
import android.os.Bundle
|
||||
import android.os.Handler
|
||||
import android.util.DisplayMetrics
|
||||
import android.view.*
|
||||
import android.view.GestureDetector
|
||||
import android.view.LayoutInflater
|
||||
import android.view.MotionEvent
|
||||
import android.view.Surface
|
||||
import android.view.TextureView
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.WindowManager
|
||||
import android.widget.ImageView
|
||||
import android.widget.RelativeLayout
|
||||
import android.widget.SeekBar
|
||||
import android.widget.TextView
|
||||
import androidx.appcompat.content.res.AppCompatResources
|
||||
import androidx.core.view.children
|
||||
import androidx.media3.common.*
|
||||
import androidx.media3.common.AudioAttributes
|
||||
import androidx.media3.common.C
|
||||
import androidx.media3.common.MediaItem
|
||||
import androidx.media3.common.PlaybackException
|
||||
import androidx.media3.common.Player
|
||||
import androidx.media3.common.VideoSize
|
||||
import androidx.media3.common.util.UnstableApi
|
||||
import androidx.media3.datasource.ContentDataSource
|
||||
import androidx.media3.datasource.DataSource
|
||||
|
@ -29,15 +41,42 @@ import androidx.media3.exoplayer.source.DefaultMediaSourceFactory
|
|||
import androidx.media3.exoplayer.source.MediaSource
|
||||
import androidx.media3.exoplayer.source.ProgressiveMediaSource
|
||||
import com.bumptech.glide.Glide
|
||||
import org.fossify.commons.extensions.*
|
||||
import org.fossify.commons.extensions.beGone
|
||||
import org.fossify.commons.extensions.beGoneIf
|
||||
import org.fossify.commons.extensions.beInvisible
|
||||
import org.fossify.commons.extensions.beInvisibleIf
|
||||
import org.fossify.commons.extensions.beVisible
|
||||
import org.fossify.commons.extensions.beVisibleIf
|
||||
import org.fossify.commons.extensions.fadeIn
|
||||
import org.fossify.commons.extensions.getDuration
|
||||
import org.fossify.commons.extensions.getFormattedDuration
|
||||
import org.fossify.commons.extensions.getProperTextColor
|
||||
import org.fossify.commons.extensions.getVideoResolution
|
||||
import org.fossify.commons.extensions.isGone
|
||||
import org.fossify.commons.extensions.isVisible
|
||||
import org.fossify.commons.extensions.navigationBarHeight
|
||||
import org.fossify.commons.extensions.navigationBarWidth
|
||||
import org.fossify.commons.extensions.onGlobalLayout
|
||||
import org.fossify.commons.extensions.realScreenSize
|
||||
import org.fossify.commons.extensions.setDrawablesRelativeWithIntrinsicBounds
|
||||
import org.fossify.commons.extensions.showErrorToast
|
||||
import org.fossify.commons.extensions.updateTextColors
|
||||
import org.fossify.commons.helpers.ensureBackgroundThread
|
||||
import org.fossify.gallery.R
|
||||
import org.fossify.gallery.activities.VideoActivity
|
||||
import org.fossify.gallery.databinding.PagerVideoItemBinding
|
||||
import org.fossify.gallery.extensions.config
|
||||
import org.fossify.gallery.extensions.getFriendlyMessage
|
||||
import org.fossify.gallery.extensions.hasNavBar
|
||||
import org.fossify.gallery.extensions.mute
|
||||
import org.fossify.gallery.extensions.parseFileChannel
|
||||
import org.fossify.gallery.helpers.*
|
||||
import org.fossify.gallery.extensions.unmute
|
||||
import org.fossify.gallery.helpers.Config
|
||||
import org.fossify.gallery.helpers.EXOPLAYER_MAX_BUFFER_MS
|
||||
import org.fossify.gallery.helpers.EXOPLAYER_MIN_BUFFER_MS
|
||||
import org.fossify.gallery.helpers.FAST_FORWARD_VIDEO_MS
|
||||
import org.fossify.gallery.helpers.MEDIUM
|
||||
import org.fossify.gallery.helpers.SHOULD_INIT_FRAGMENT
|
||||
import org.fossify.gallery.interfaces.PlaybackSpeedListener
|
||||
import org.fossify.gallery.models.Medium
|
||||
import org.fossify.gallery.views.MediaSideScroll
|
||||
|
@ -46,7 +85,8 @@ import java.io.FileInputStream
|
|||
import java.text.DecimalFormat
|
||||
|
||||
@UnstableApi
|
||||
class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, SeekBar.OnSeekBarChangeListener, PlaybackSpeedListener {
|
||||
class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener,
|
||||
SeekBar.OnSeekBarChangeListener, PlaybackSpeedListener {
|
||||
private val PROGRESS = "progress"
|
||||
|
||||
private var mIsFullscreen = false
|
||||
|
@ -87,9 +127,11 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
private lateinit var mPlayPauseButton: ImageView
|
||||
private lateinit var mSeekBar: SeekBar
|
||||
|
||||
private var mVolumeController: VolumeController? = null
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View {
|
||||
val context = requireContext()
|
||||
val activity = requireActivity()
|
||||
val arguments = requireArguments()
|
||||
|
@ -103,7 +145,11 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
videoHolder.setOnClickListener { toggleFullscreen() }
|
||||
videoPreview.setOnClickListener { toggleFullscreen() }
|
||||
bottomVideoTimeHolder.videoPlaybackSpeed.setOnClickListener { showPlaybackSpeedPicker() }
|
||||
bottomVideoTimeHolder.videoToggleMute.setOnClickListener { mVolumeController?.toggleMute() }
|
||||
bottomVideoTimeHolder.videoToggleMute.setOnClickListener {
|
||||
mConfig.muteVideos = !mConfig.muteVideos
|
||||
updatePlayerMuteState()
|
||||
}
|
||||
|
||||
videoSurfaceFrame.controller.settings.swallowDoubleTaps = true
|
||||
|
||||
videoPlayOutline.setOnClickListener {
|
||||
|
@ -131,29 +177,30 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
mTextureView = videoSurface
|
||||
mTextureView.surfaceTextureListener = this@VideoFragment
|
||||
|
||||
val gestureDetector = GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
|
||||
override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
|
||||
if (!mConfig.allowInstantChange) {
|
||||
toggleFullscreen()
|
||||
val gestureDetector =
|
||||
GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
|
||||
override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
|
||||
if (!mConfig.allowInstantChange) {
|
||||
toggleFullscreen()
|
||||
return true
|
||||
}
|
||||
|
||||
val viewWidth = root.width
|
||||
val instantWidth = viewWidth / 7
|
||||
val clickedX = e.rawX
|
||||
when {
|
||||
clickedX <= instantWidth -> listener?.goToPrevItem()
|
||||
clickedX >= viewWidth - instantWidth -> listener?.goToNextItem()
|
||||
else -> toggleFullscreen()
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
val viewWidth = root.width
|
||||
val instantWidth = viewWidth / 7
|
||||
val clickedX = e.rawX
|
||||
when {
|
||||
clickedX <= instantWidth -> listener?.goToPrevItem()
|
||||
clickedX >= viewWidth - instantWidth -> listener?.goToNextItem()
|
||||
else -> toggleFullscreen()
|
||||
override fun onDoubleTap(e: MotionEvent): Boolean {
|
||||
handleDoubleTap(e.rawX)
|
||||
return true
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
override fun onDoubleTap(e: MotionEvent): Boolean {
|
||||
handleDoubleTap(e.rawX)
|
||||
return true
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
videoPreview.setOnTouchListener { view, event ->
|
||||
handleEvent(event)
|
||||
|
@ -183,7 +230,8 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
mIsFragmentVisible = true
|
||||
}
|
||||
|
||||
mIsFullscreen = activity.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN
|
||||
mIsFullscreen =
|
||||
activity.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN
|
||||
initTimeHolder()
|
||||
// checkIfPanorama() TODO: Implement panorama using a FOSS library
|
||||
|
||||
|
@ -213,25 +261,37 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
setVideoSize()
|
||||
|
||||
binding.apply {
|
||||
mBrightnessSideScroll.initialize(activity, slideInfo, true, container, singleTap = { x, y ->
|
||||
if (mConfig.allowInstantChange) {
|
||||
listener?.goToPrevItem()
|
||||
} else {
|
||||
toggleFullscreen()
|
||||
}
|
||||
}, doubleTap = { x, y ->
|
||||
doSkip(false)
|
||||
})
|
||||
mBrightnessSideScroll.initialize(
|
||||
activity,
|
||||
slideInfo,
|
||||
true,
|
||||
container,
|
||||
singleTap = { x, y ->
|
||||
if (mConfig.allowInstantChange) {
|
||||
listener?.goToPrevItem()
|
||||
} else {
|
||||
toggleFullscreen()
|
||||
}
|
||||
},
|
||||
doubleTap = { x, y ->
|
||||
doSkip(false)
|
||||
})
|
||||
|
||||
mVolumeSideScroll.initialize(activity, slideInfo, false, container, singleTap = { x, y ->
|
||||
if (mConfig.allowInstantChange) {
|
||||
listener?.goToNextItem()
|
||||
} else {
|
||||
toggleFullscreen()
|
||||
}
|
||||
}, doubleTap = { x, y ->
|
||||
doSkip(true)
|
||||
})
|
||||
mVolumeSideScroll.initialize(
|
||||
activity,
|
||||
slideInfo,
|
||||
false,
|
||||
container,
|
||||
singleTap = { x, y ->
|
||||
if (mConfig.allowInstantChange) {
|
||||
listener?.goToNextItem()
|
||||
} else {
|
||||
toggleFullscreen()
|
||||
}
|
||||
},
|
||||
doubleTap = { x, y ->
|
||||
doSkip(true)
|
||||
})
|
||||
|
||||
videoSurface.onGlobalLayout {
|
||||
if (mIsFragmentVisible && mConfig.autoplayVideos && !mConfig.openVideosOnSeparateScreen) {
|
||||
|
@ -246,19 +306,13 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
restoreLastVideoSavedPosition()
|
||||
}
|
||||
|
||||
mVolumeController = VolumeController(context) { isMuted ->
|
||||
val icon = if (isMuted) R.drawable.ic_vector_speaker_off else R.drawable.ic_vector_speaker_on
|
||||
binding.bottomVideoTimeHolder.videoToggleMute.setImageDrawable(
|
||||
AppCompatResources.getDrawable(context, icon)
|
||||
)
|
||||
}
|
||||
|
||||
return mView
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
mConfig = requireContext().config // make sure we get a new config, in case the user changed something in the app settings
|
||||
mConfig =
|
||||
requireContext().config // make sure we get a new config, in case the user changed something in the app settings
|
||||
requireActivity().updateTextColors(binding.videoHolder)
|
||||
val allowVideoGestures = mConfig.allowVideoGestures
|
||||
mTextureView.beGoneIf(mConfig.openVideosOnSeparateScreen || mIsPanorama)
|
||||
|
@ -328,7 +382,10 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
private fun saveVideoProgress() {
|
||||
if (!videoEnded()) {
|
||||
if (mExoPlayer != null) {
|
||||
mConfig.saveLastVideoPosition(mMedium.path, mExoPlayer!!.currentPosition.toInt() / 1000)
|
||||
mConfig.saveLastVideoPosition(
|
||||
mMedium.path,
|
||||
mExoPlayer!!.currentPosition.toInt() / 1000
|
||||
)
|
||||
} else {
|
||||
mConfig.saveLastVideoPosition(mMedium.path, mPositionAtPause.toInt() / 1000)
|
||||
}
|
||||
|
@ -394,7 +451,12 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
mPlayOnPrepared = true
|
||||
|
||||
val loadControl = DefaultLoadControl.Builder()
|
||||
.setBufferDurationsMs(EXOPLAYER_MIN_BUFFER_MS, EXOPLAYER_MAX_BUFFER_MS, EXOPLAYER_MIN_BUFFER_MS, EXOPLAYER_MIN_BUFFER_MS)
|
||||
.setBufferDurationsMs(
|
||||
EXOPLAYER_MIN_BUFFER_MS,
|
||||
EXOPLAYER_MAX_BUFFER_MS,
|
||||
EXOPLAYER_MIN_BUFFER_MS,
|
||||
EXOPLAYER_MIN_BUFFER_MS
|
||||
)
|
||||
.setPrioritizeTimeOverSizeThresholds(true)
|
||||
.build()
|
||||
|
||||
|
@ -423,6 +485,8 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
|
||||
initListeners()
|
||||
}
|
||||
|
||||
updatePlayerMuteState()
|
||||
}
|
||||
|
||||
private fun ExoPlayer.initListeners() {
|
||||
|
@ -455,8 +519,9 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
override fun onPlayerErrorChanged(error: PlaybackException?) {
|
||||
binding.errorMessageHolder.errorMessage.apply {
|
||||
if (error != null) {
|
||||
binding.videoPreview.beGone()
|
||||
binding.videoPlayOutline.beGone()
|
||||
text = error.localizedMessage ?: getString(R.string.failed_to_load_media)
|
||||
text = error.getFriendlyMessage(context)
|
||||
setTextColor(if (context.config.blackBackground) Color.WHITE else context.getProperTextColor())
|
||||
fadeIn()
|
||||
} else {
|
||||
|
@ -574,7 +639,8 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
|
||||
private fun showPlaybackSpeedPicker() {
|
||||
val fragment = PlaybackSpeedFragment()
|
||||
childFragmentManager.beginTransaction().add(fragment, fragment::class.java.simpleName).commit()
|
||||
childFragmentManager.beginTransaction().add(fragment, fragment::class.java.simpleName)
|
||||
.commit()
|
||||
fragment.setListener(this)
|
||||
}
|
||||
|
||||
|
@ -583,19 +649,28 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
if (isSlow != binding.bottomVideoTimeHolder.videoPlaybackSpeed.tag as? Boolean) {
|
||||
binding.bottomVideoTimeHolder.videoPlaybackSpeed.tag = isSlow
|
||||
|
||||
val drawableId = if (isSlow) R.drawable.ic_playback_speed_slow_vector else R.drawable.ic_playback_speed_vector
|
||||
val drawableId =
|
||||
if (isSlow) R.drawable.ic_playback_speed_slow_vector else R.drawable.ic_playback_speed_vector
|
||||
binding.bottomVideoTimeHolder.videoPlaybackSpeed
|
||||
.setDrawablesRelativeWithIntrinsicBounds(AppCompatResources.getDrawable(requireContext(), drawableId))
|
||||
.setDrawablesRelativeWithIntrinsicBounds(
|
||||
AppCompatResources.getDrawable(
|
||||
requireContext(),
|
||||
drawableId
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
binding.bottomVideoTimeHolder.videoPlaybackSpeed.text = "${DecimalFormat("#.##").format(speed)}x"
|
||||
binding.bottomVideoTimeHolder.videoPlaybackSpeed.text =
|
||||
"${DecimalFormat("#.##").format(speed)}x"
|
||||
mExoPlayer?.setPlaybackSpeed(speed)
|
||||
}
|
||||
|
||||
private fun getExtendedDetailsY(height: Int): Float {
|
||||
val smallMargin = context?.resources?.getDimension(org.fossify.commons.R.dimen.small_margin) ?: return 0f
|
||||
val fullscreenOffset = smallMargin + if (mIsFullscreen) 0 else requireContext().navigationBarHeight
|
||||
val smallMargin =
|
||||
context?.resources?.getDimension(org.fossify.commons.R.dimen.small_margin) ?: return 0f
|
||||
val fullscreenOffset =
|
||||
smallMargin + if (mIsFullscreen) 0 else requireContext().navigationBarHeight
|
||||
var actionsHeight = 0f
|
||||
if (!mIsFullscreen) {
|
||||
if (binding.bottomVideoTimeHolder.root.children.any { isVisible }) {
|
||||
|
@ -627,9 +702,11 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
}
|
||||
|
||||
val curr = mExoPlayer!!.currentPosition
|
||||
val newProgress = if (forward) curr + FAST_FORWARD_VIDEO_MS else curr - FAST_FORWARD_VIDEO_MS
|
||||
val newProgress =
|
||||
if (forward) curr + FAST_FORWARD_VIDEO_MS else curr - FAST_FORWARD_VIDEO_MS
|
||||
val roundProgress = Math.round(newProgress / 1000f)
|
||||
val limitedProgress = Math.max(Math.min(mExoPlayer!!.duration.toInt() / 1000, roundProgress), 0)
|
||||
val limitedProgress =
|
||||
Math.max(Math.min(mExoPlayer!!.duration.toInt() / 1000, roundProgress), 0)
|
||||
setPosition(limitedProgress)
|
||||
if (!mIsPlaying) {
|
||||
togglePlayPause()
|
||||
|
@ -692,6 +769,22 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
}
|
||||
}
|
||||
|
||||
private fun updatePlayerMuteState() {
|
||||
val context = context ?: return
|
||||
val isMuted = mConfig.muteVideos
|
||||
val drawableId = if (isMuted) {
|
||||
mExoPlayer?.mute()
|
||||
R.drawable.ic_vector_speaker_off
|
||||
} else {
|
||||
mExoPlayer?.unmute()
|
||||
R.drawable.ic_vector_speaker_on
|
||||
}
|
||||
|
||||
binding.bottomVideoTimeHolder.videoToggleMute.setImageDrawable(
|
||||
AppCompatResources.getDrawable(context, drawableId)
|
||||
)
|
||||
}
|
||||
|
||||
fun playVideo() {
|
||||
if (mExoPlayer == null) {
|
||||
initExoPlayer()
|
||||
|
@ -722,7 +815,8 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
mPlayPauseButton.beVisible()
|
||||
binding.bottomVideoTimeHolder.videoToggleMute.beVisible()
|
||||
binding.bottomVideoTimeHolder.videoPlaybackSpeed.beVisible()
|
||||
binding.bottomVideoTimeHolder.videoPlaybackSpeed.text = "${DecimalFormat("#.##").format(mConfig.playbackSpeed)}x"
|
||||
binding.bottomVideoTimeHolder.videoPlaybackSpeed.text =
|
||||
"${DecimalFormat("#.##").format(mConfig.playbackSpeed)}x"
|
||||
}
|
||||
|
||||
mWasVideoStarted = true
|
||||
|
@ -822,7 +916,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
private fun cleanup() {
|
||||
pauseVideo()
|
||||
releaseExoPlayer()
|
||||
mVolumeController?.destroy()
|
||||
|
||||
if (mWasFragmentInit) {
|
||||
mCurrTimeView.text = 0.getFormattedDuration()
|
||||
|
|
|
@ -205,6 +205,10 @@ class Config(context: Context) : BaseConfig(context) {
|
|||
get() = prefs.getBoolean(LOOP_VIDEOS, false)
|
||||
set(loop) = prefs.edit().putBoolean(LOOP_VIDEOS, loop).apply()
|
||||
|
||||
var muteVideos: Boolean
|
||||
get() = prefs.getBoolean(MUTE_VIDEOS, false)
|
||||
set(muteVideos) = prefs.edit().putBoolean(MUTE_VIDEOS, muteVideos).apply()
|
||||
|
||||
var openVideosOnSeparateScreen: Boolean
|
||||
get() = prefs.getBoolean(OPEN_VIDEOS_ON_SEPARATE_SCREEN, false)
|
||||
set(openVideosOnSeparateScreen) = prefs.edit().putBoolean(OPEN_VIDEOS_ON_SEPARATE_SCREEN, openVideosOnSeparateScreen).apply()
|
||||
|
|
|
@ -16,6 +16,7 @@ const val IS_THIRD_PARTY_INTENT = "is_third_party_intent"
|
|||
const val AUTOPLAY_VIDEOS = "autoplay_videos"
|
||||
const val REMEMBER_LAST_VIDEO_POSITION = "remember_last_video_position"
|
||||
const val LOOP_VIDEOS = "loop_videos"
|
||||
const val MUTE_VIDEOS = "mute_videos"
|
||||
const val OPEN_VIDEOS_ON_SEPARATE_SCREEN = "open_videos_on_separate_screen"
|
||||
const val ANIMATE_GIFS = "animate_gifs"
|
||||
const val MAX_BRIGHTNESS = "max_brightness"
|
||||
|
|
|
@ -13,7 +13,7 @@ class FilterThumbnailsManager {
|
|||
|
||||
fun processThumbs(): ArrayList<FilterItem> {
|
||||
for (filterItem in filterThumbnails) {
|
||||
filterItem.bitmap = filterItem.filter.processFilter(Bitmap.createBitmap(filterItem.bitmap))
|
||||
filterItem.bitmap = filterItem.filter.processFilter(Bitmap.createBitmap(filterItem.bitmap))!!
|
||||
processedThumbnails.add(filterItem)
|
||||
}
|
||||
return processedThumbnails
|
||||
|
|
|
@ -1,58 +0,0 @@
|
|||
package org.fossify.gallery.helpers
|
||||
|
||||
import android.content.Context
|
||||
import android.database.ContentObserver
|
||||
import android.media.AudioManager
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.provider.Settings
|
||||
import org.fossify.gallery.extensions.audioManager
|
||||
|
||||
class VolumeController(
|
||||
private val context: Context,
|
||||
private val streamType: Int = AudioManager.STREAM_MUSIC,
|
||||
private val onVolumeChanged: (isMuted: Boolean) -> Unit
|
||||
) {
|
||||
private var audioManager = context.audioManager
|
||||
private var savedVolume = audioManager.getStreamMaxVolume(streamType)
|
||||
|
||||
private val currentVolume: Int
|
||||
get() = audioManager.getStreamVolume(streamType)
|
||||
|
||||
private val volumeObserver = object : ContentObserver(Handler(Looper.getMainLooper())) {
|
||||
override fun onChange(selfChange: Boolean) {
|
||||
super.onChange(selfChange)
|
||||
onVolumeChanged(isMuted())
|
||||
}
|
||||
}
|
||||
|
||||
init {
|
||||
context.contentResolver.registerContentObserver(Settings.System.CONTENT_URI, true, volumeObserver)
|
||||
onVolumeChanged(isMuted())
|
||||
}
|
||||
|
||||
private fun isMuted() = currentVolume == 0
|
||||
|
||||
private fun mute() {
|
||||
savedVolume = audioManager.getStreamVolume(streamType)
|
||||
audioManager.setStreamVolume(streamType, 0, 0)
|
||||
}
|
||||
|
||||
private fun unmute() {
|
||||
audioManager.setStreamVolume(streamType, savedVolume, 0)
|
||||
}
|
||||
|
||||
fun toggleMute() {
|
||||
if (isMuted()) {
|
||||
unmute()
|
||||
onVolumeChanged(false)
|
||||
} else {
|
||||
mute()
|
||||
onVolumeChanged(true)
|
||||
}
|
||||
}
|
||||
|
||||
fun destroy() {
|
||||
context.contentResolver.unregisterContentObserver(volumeObserver)
|
||||
}
|
||||
}
|
|
@ -1,6 +1,5 @@
|
|||
package org.fossify.gallery.jobs
|
||||
|
||||
import android.annotation.TargetApi
|
||||
import android.app.job.JobInfo
|
||||
import android.app.job.JobInfo.TriggerContentUri
|
||||
import android.app.job.JobParameters
|
||||
|
@ -10,7 +9,6 @@ import android.content.ComponentName
|
|||
import android.content.Context
|
||||
import android.database.Cursor
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Handler
|
||||
import android.provider.MediaStore
|
||||
import android.provider.MediaStore.Images
|
||||
|
@ -22,7 +20,6 @@ import org.fossify.gallery.extensions.addPathToDB
|
|||
import org.fossify.gallery.extensions.updateDirectoryPath
|
||||
|
||||
// based on https://developer.android.com/reference/android/app/job/JobInfo.Builder.html#addTriggerContentUri(android.app.job.JobInfo.TriggerContentUri)
|
||||
@TargetApi(Build.VERSION_CODES.N)
|
||||
class NewPhotoFetcher : JobService() {
|
||||
companion object {
|
||||
const val PHOTO_VIDEO_CONTENT_JOB = 1
|
||||
|
|
5
app/src/main/res/drawable/placeholder_rounded_big.xml
Normal file
5
app/src/main/res/drawable/placeholder_rounded_big.xml
Normal file
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<solid android:color="@color/md_grey_black" />
|
||||
<corners android:radius="@dimen/rounded_corner_radius_big" />
|
||||
</shape>
|
5
app/src/main/res/drawable/placeholder_rounded_small.xml
Normal file
5
app/src/main/res/drawable/placeholder_rounded_small.xml
Normal file
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<solid android:color="@color/md_grey_black" />
|
||||
<corners android:radius="@dimen/rounded_corner_radius_small" />
|
||||
</shape>
|
4
app/src/main/res/drawable/placeholder_square.xml
Normal file
4
app/src/main/res/drawable/placeholder_square.xml
Normal file
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<solid android:color="@color/md_grey_black" />
|
||||
</shape>
|
|
@ -1,6 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/media_coordinator"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
@ -10,6 +11,18 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
<com.google.android.material.progressindicator.CircularProgressIndicator
|
||||
android:id="@+id/loading_indicator"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:indeterminate="true"
|
||||
android:visibility="gone"
|
||||
app:hideAnimationBehavior="inward"
|
||||
app:showAnimationBehavior="outward"
|
||||
app:showDelay="500"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/media_holder"
|
||||
android:layout_width="match_parent"
|
||||
|
|
|
@ -37,6 +37,12 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:text="@string/size" />
|
||||
|
||||
<org.fossify.commons.views.MyCompatRadioButton
|
||||
android:id="@+id/sorting_dialog_radio_number_of_items"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/number_of_items" />
|
||||
|
||||
<org.fossify.commons.views.MyCompatRadioButton
|
||||
android:id="@+id/sorting_dialog_radio_last_modified"
|
||||
android:layout_width="match_parent"
|
||||
|
|
|
@ -28,24 +28,10 @@
|
|||
android:textSize="@dimen/bigger_text_size"
|
||||
android:visibility="gone" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/favorite"
|
||||
android:layout_width="@dimen/selection_check_size"
|
||||
android:layout_height="@dimen/selection_check_size"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_margin="@dimen/small_margin"
|
||||
android:background="@drawable/circle_black_background"
|
||||
android:gravity="end"
|
||||
android:padding="@dimen/small_margin"
|
||||
android:src="@drawable/ic_star_vector"
|
||||
android:visibility="gone" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/medium_check"
|
||||
android:layout_width="@dimen/selection_check_size"
|
||||
android:layout_height="@dimen/selection_check_size"
|
||||
android:layout_alignEnd="@+id/medium_name"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_margin="@dimen/medium_margin"
|
||||
|
@ -53,26 +39,42 @@
|
|||
android:contentDescription="@null"
|
||||
android:padding="@dimen/tiny_margin"
|
||||
android:src="@drawable/ic_check_vector"
|
||||
android:visibility="gone" />
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/medium_name"
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignStart="@+id/medium_thumbnail"
|
||||
android:layout_alignEnd="@+id/medium_thumbnail"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:background="@drawable/gradient_background"
|
||||
android:ellipsize="end"
|
||||
android:gravity="bottom"
|
||||
android:maxLines="3"
|
||||
android:paddingLeft="@dimen/small_margin"
|
||||
android:paddingRight="@dimen/small_margin"
|
||||
android:paddingBottom="@dimen/small_margin"
|
||||
android:shadowColor="@color/default_background_color"
|
||||
android:shadowRadius="4"
|
||||
android:textColor="@android:color/white"
|
||||
android:textSize="@dimen/smaller_text_size"
|
||||
tools:text="My photo" />
|
||||
android:layout_alignBottom="@id/medium_thumbnail"
|
||||
android:orientation="vertical"
|
||||
android:gravity="end">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/favorite"
|
||||
android:layout_width="@dimen/selection_check_size"
|
||||
android:layout_height="@dimen/selection_check_size"
|
||||
android:layout_margin="@dimen/smaller_margin"
|
||||
android:background="@drawable/circle_black_background"
|
||||
android:padding="@dimen/small_margin"
|
||||
android:src="@drawable/ic_star_vector"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/medium_name"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/gradient_background"
|
||||
android:ellipsize="end"
|
||||
android:gravity="bottom"
|
||||
android:maxLines="3"
|
||||
android:paddingLeft="@dimen/small_margin"
|
||||
android:paddingRight="@dimen/small_margin"
|
||||
android:paddingBottom="@dimen/small_margin"
|
||||
android:shadowColor="@color/default_background_color"
|
||||
android:shadowRadius="4"
|
||||
android:textColor="@android:color/white"
|
||||
android:textSize="@dimen/smaller_text_size"
|
||||
tools:text="My photo" />
|
||||
</LinearLayout>
|
||||
</RelativeLayout>
|
||||
|
|
|
@ -23,14 +23,14 @@
|
|||
android:id="@+id/favorite"
|
||||
android:layout_width="@dimen/favorite_list_icon_size"
|
||||
android:layout_height="@dimen/favorite_list_icon_size"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_margin="@dimen/smaller_margin"
|
||||
android:layout_alignEnd="@id/medium_thumbnail"
|
||||
android:layout_alignBottom="@id/medium_thumbnail"
|
||||
android:layout_margin="@dimen/small_margin"
|
||||
android:background="@drawable/circle_black_background"
|
||||
android:gravity="end"
|
||||
android:padding="@dimen/tiny_margin"
|
||||
android:src="@drawable/ic_star_vector"
|
||||
android:visibility="gone" />
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/medium_check"
|
||||
|
|
|
@ -13,20 +13,6 @@
|
|||
android:layout_height="match_parent"
|
||||
tools:src="@mipmap/ic_launcher" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/favorite"
|
||||
android:layout_width="@dimen/selection_check_size"
|
||||
android:layout_height="@dimen/selection_check_size"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_margin="@dimen/small_margin"
|
||||
android:background="@drawable/circle_black_background"
|
||||
android:gravity="end"
|
||||
android:padding="@dimen/small_margin"
|
||||
android:src="@drawable/ic_star_vector"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/play_icon_holder"
|
||||
android:layout_width="wrap_content"
|
||||
|
@ -69,7 +55,6 @@
|
|||
android:id="@+id/medium_check"
|
||||
android:layout_width="@dimen/selection_check_size"
|
||||
android:layout_height="@dimen/selection_check_size"
|
||||
android:layout_alignEnd="@+id/medium_name"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_margin="@dimen/medium_margin"
|
||||
|
@ -80,24 +65,39 @@
|
|||
android:visibility="gone"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/medium_name"
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignStart="@+id/medium_thumbnail"
|
||||
android:layout_alignEnd="@+id/medium_thumbnail"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:background="@drawable/gradient_background"
|
||||
android:ellipsize="end"
|
||||
android:gravity="bottom"
|
||||
android:maxLines="3"
|
||||
android:paddingLeft="@dimen/small_margin"
|
||||
android:paddingRight="@dimen/small_margin"
|
||||
android:paddingBottom="@dimen/small_margin"
|
||||
android:shadowColor="@color/default_background_color"
|
||||
android:shadowRadius="4"
|
||||
android:textColor="@android:color/white"
|
||||
android:textSize="@dimen/smaller_text_size"
|
||||
tools:text="My photo" />
|
||||
android:layout_alignBottom="@id/medium_thumbnail"
|
||||
android:orientation="vertical"
|
||||
android:gravity="end">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/favorite"
|
||||
android:layout_width="@dimen/selection_check_size"
|
||||
android:layout_height="@dimen/selection_check_size"
|
||||
android:layout_margin="@dimen/smaller_margin"
|
||||
android:background="@drawable/circle_black_background"
|
||||
android:padding="@dimen/small_margin"
|
||||
android:src="@drawable/ic_star_vector"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/medium_name"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/gradient_background"
|
||||
android:ellipsize="end"
|
||||
android:gravity="bottom"
|
||||
android:maxLines="3"
|
||||
android:paddingLeft="@dimen/small_margin"
|
||||
android:paddingRight="@dimen/small_margin"
|
||||
android:paddingBottom="@dimen/small_margin"
|
||||
android:shadowColor="@color/default_background_color"
|
||||
android:shadowRadius="4"
|
||||
android:textColor="@android:color/white"
|
||||
android:textSize="@dimen/smaller_text_size"
|
||||
tools:text="My photo" />
|
||||
</LinearLayout>
|
||||
</RelativeLayout>
|
||||
|
|
|
@ -22,11 +22,10 @@
|
|||
android:id="@+id/favorite"
|
||||
android:layout_width="@dimen/favorite_list_icon_size"
|
||||
android:layout_height="@dimen/favorite_list_icon_size"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_margin="@dimen/smaller_margin"
|
||||
android:layout_alignEnd="@id/medium_thumbnail"
|
||||
android:layout_alignBottom="@id/medium_thumbnail"
|
||||
android:layout_margin="@dimen/small_margin"
|
||||
android:background="@drawable/circle_black_background"
|
||||
android:gravity="end"
|
||||
android:padding="@dimen/tiny_margin"
|
||||
android:src="@drawable/ic_star_vector"
|
||||
android:visibility="gone"
|
||||
|
|
|
@ -5,62 +5,60 @@
|
|||
<string name="open_camera">Камера</string>
|
||||
<string name="hidden">(скрито)</string>
|
||||
<string name="excluded">(изключено)</string>
|
||||
<string name="pin_folder">Закачете папката</string>
|
||||
<string name="unpin_folder">Откачете папката</string>
|
||||
<string name="pin_to_the_top">Закачете отгоре</string>
|
||||
<string name="show_all">Покажете съдържанието на всички папки</string>
|
||||
<string name="pin_folder">Закачане на папката</string>
|
||||
<string name="unpin_folder">Премахване от закачените</string>
|
||||
<string name="pin_to_the_top">Закачане най-горе</string>
|
||||
<string name="show_all">Показване на всички медийни файлове</string>
|
||||
<string name="all_folders">Всички папки</string>
|
||||
<string name="folder_view">Папки</string>
|
||||
<string name="folder_view">Показване на папки</string>
|
||||
<string name="other_folder">Избор на папка</string>
|
||||
<string name="show_on_map">Показване на картата</string>
|
||||
<string name="unknown_location">Неизвестно местоположение</string>
|
||||
<string name="volume">Сила на звука</string>
|
||||
<string name="brightness">Осветеност</string>
|
||||
<string name="lock_orientation">Блокиране на ориентацията</string>
|
||||
<string name="unlock_orientation">Разблокиране на ориентацията</string>
|
||||
<string name="brightness">Яркост</string>
|
||||
<string name="lock_orientation">Заключване на ориентацията</string>
|
||||
<string name="unlock_orientation">Отключване на ориентацията</string>
|
||||
<string name="change_orientation">Промяна на ориентацията</string>
|
||||
<string name="force_portrait">Портрет</string>
|
||||
<string name="force_landscape">Албум</string>
|
||||
<string name="force_landscape">Пейзаж</string>
|
||||
<string name="use_default_orientation">Използване на основната ориентация</string>
|
||||
<string name="fix_date_taken">Поправка на датата на заснемане</string>
|
||||
<string name="fixing">Поправяне…</string>
|
||||
<string name="dates_fixed_successfully">Датата е успешно поправена</string>
|
||||
<string name="no_date_takens_found">Не са открити стойности за дата на заснемане</string>
|
||||
<string name="share_resized">Споделете преоразмерена версия</string>
|
||||
<string name="dates_fixed_successfully">Датата е поправена</string>
|
||||
<string name="no_date_takens_found">Липсва дата на заснемане</string>
|
||||
<string name="share_resized">Споделяне на преоразмерен вариант</string>
|
||||
<string name="switch_to_file_search">Превключване към търсене на файлове във всички видими папки</string>
|
||||
<string name="set_as_default_folder">Задаване като основна папка</string>
|
||||
<string name="unset_as_default_folder">Отхвърляне като основна папка</string>
|
||||
<string name="reorder_by_dragging">Пренаредете папките с влачене</string>
|
||||
<string name="reorder_by_dragging_pro">Пренаредете папките с влачене (Pro)</string>
|
||||
<string name="restore_to_path">Възстановяване в \'%s\'</string>
|
||||
<string name="filter_media">Филтър на медия</string>
|
||||
<string name="set_as_default_folder">Задаване като подразбирана папка</string>
|
||||
<string name="unset_as_default_folder">Нулиране на подразбираната папка</string>
|
||||
<string name="reorder_by_dragging">Подреждане на папките с влачене</string>
|
||||
<string name="reorder_by_dragging_pro">Подреждане на папките с влачене (про)</string>
|
||||
<string name="restore_to_path">Възстановяване в „%s“</string>
|
||||
<string name="filter_media">Филтриране</string>
|
||||
<string name="images">Изображения</string>
|
||||
<string name="videos">Видеоклипове</string>
|
||||
<string name="videos">Видео</string>
|
||||
<string name="gifs">GIF</string>
|
||||
<string name="raw_images">RAW</string>
|
||||
<string name="svgs">SVG</string>
|
||||
<string name="portraits">Портрети</string>
|
||||
<string name="no_media_with_filters">С избраните филтри не са открити медийни файлове.</string>
|
||||
<string name="change_filters_underlined"><u>Смени филтрите</u></string>
|
||||
<string name="hide_folder_description">Тази функция скрива папката чрез добавяне на \'.nomedia\' файл в нея; това също ще скрие и папките в нея. Можете да ги видите чрез превключване на \'Показване на скритите елементи\' в настройките. Напред\?</string>
|
||||
<string name="exclude_folder_parent">Вместо това, изключване на папката от горното ниво\?</string>
|
||||
<string name="no_media_with_filters">На зададените филтри не отговарят файлове.</string>
|
||||
<string name="change_filters_underlined"><u>Променяне на филтрите</u></string>
|
||||
<string name="hide_folder_description">По този начин ще бъде добавен файл „.nomedia“, който скрива папката и нейното съдържание от приложението. Можете да прегледате скритото съдържание като изберете „Показване на скрити елементи“ от настройките. Продължаване?</string>
|
||||
<string name="exclude_folder_parent">Изключване на родителската папката?</string>
|
||||
<string name="hidden_folders">Скрити папки</string>
|
||||
<string name="manage_hidden_folders">Управление на скритите папки</string>
|
||||
<string name="hidden_folders_placeholder">Изглежда нямате папки скрити чрез \'.nomedia\' файл.</string>
|
||||
<string name="hidden_all_files">Трябва да предоставите на приложението достъп до всички файлове, за да видите скритите файлове, в противен случай то не може да работи.</string>
|
||||
<string name="cant_unhide_folder">Ако папка или една от нейните родителски папки има точка преди името си, тя е скрита и не може да бъде разкрита по този начин. Трябва да премахнете точката, като я преименувате.</string>
|
||||
<string name="manage_hidden_folders">Управление на скрити папки</string>
|
||||
<string name="hidden_folders_placeholder">Изглежда нямате папки скрити чрез „.nomedia“.</string>
|
||||
<string name="hidden_all_files">За да виждате скритите файлове, трябва да разрешите на приложението достъп до всички файлове.</string>
|
||||
<string name="cant_unhide_folder">Ако папка или една от нейните родителски папки има точка пред името, тя е скрита и не може да бъде показана по този начин. Трябва да премахнете точката, като преименувате папката.</string>
|
||||
<string name="include_folders">Включени папки</string>
|
||||
<string name="manage_included_folders">Управление на включените папки</string>
|
||||
<string name="add_folder">Добавяне на папка</string>
|
||||
<string name="included_activity_placeholder">Ако имате папки с медия, които обаче не са били автоматично разпознати от програмата, може да ги добавите въчно тук.
|
||||
\n
|
||||
\nДобавянето на елементи тук няма да изключи никакви други папки.</string>
|
||||
<string name="no_media_add_included">Не са открити медийни файлове. Можете да го поправите чрез ръчно добавяне на папки с медия.</string>
|
||||
<string name="included_activity_placeholder">Ако има папки с медия, които обаче не са били автоматично разпознати от приложението, може да ги добавите ръчно тук.\n\nДобавянето на елементи тук няма да изключи други папки.</string>
|
||||
<string name="no_media_add_included">Не са открити медийни файлове. Можете ръчно да добавите папки с медия.</string>
|
||||
<string name="resize_and_save">Преоразмеряване на избраното и запазване</string>
|
||||
<string name="width">Широчина</string>
|
||||
<string name="width">Ширина</string>
|
||||
<string name="height">Височина</string>
|
||||
<string name="keep_aspect_ratio">Запазете съотношението на страните</string>
|
||||
<string name="invalid_values">Моля въведете валидна резолюция</string>
|
||||
<string name="keep_aspect_ratio">Запазване съотнош. на страните</string>
|
||||
<string name="invalid_values">Въведете действителна разделителна способност</string>
|
||||
<string name="resize_multiple_images">Преоразмеряване на няколко изображения</string>
|
||||
<string name="resize_factor">Коефициент на преоразмеряване</string>
|
||||
<string name="resize_factor_info">Преоразмерете изображенията до дадения процент, стойността трябва да е в рамките на 10 и 90.</string>
|
||||
|
@ -69,7 +67,7 @@
|
|||
<item quantity="one">Преоразмеряването неуспешно за %d изображение</item>
|
||||
<item quantity="other">Преоразмеряването неуспешно за %d изображения</item>
|
||||
</plurals>
|
||||
<string name="images_resized_successfully">Изображенията са преоразмерени успешно</string>
|
||||
<string name="images_resized_successfully">Изображенията са преоразмерени</string>
|
||||
<string name="editor">Редактор</string>
|
||||
<string name="basic_editor">Базов редактор</string>
|
||||
<string name="advanced_editor">Разширен редактор</string>
|
||||
|
@ -83,18 +81,18 @@
|
|||
<string name="file_edited_successfully">Успешна редакция на файла</string>
|
||||
<string name="image_edited_successfully">Успешна редакция на изображението</string>
|
||||
<string name="video_edited_successfully">Успешна редакция на видеото</string>
|
||||
<string name="edit_image_with">Редакция на изображението с:</string>
|
||||
<string name="edit_video_with">Редакция на видеото с:</string>
|
||||
<string name="no_image_editor_found">Не е открита програма за редактиране на изображения</string>
|
||||
<string name="no_video_editor_found">Не е открита програма за редактиране на видео</string>
|
||||
<string name="edit_image_with">Редакция на изображението от:</string>
|
||||
<string name="edit_video_with">Редакция на видеото от:</string>
|
||||
<string name="no_image_editor_found">Не е открито приложение за работа с изображения</string>
|
||||
<string name="no_video_editor_found">Не е открито приложение за работа с видео</string>
|
||||
<string name="unknown_file_location">Неизвестно местоположение на файл</string>
|
||||
<string name="error_saving_file">Неуспешно презаписване на изходния файл</string>
|
||||
<string name="rotate_left">Завъртане наляво</string>
|
||||
<string name="rotate_right">Завъртане надясно</string>
|
||||
<string name="rotate_one_eighty">Завъртане на 180º</string>
|
||||
<string name="transform">Трансформирай</string>
|
||||
<string name="crop">Изрежи</string>
|
||||
<string name="draw">Рисувай</string>
|
||||
<string name="transform">Трансформиране</string>
|
||||
<string name="crop">Изрязване</string>
|
||||
<string name="draw">Рисуване</string>
|
||||
<string name="flip">Oбръщане</string>
|
||||
<string name="flip_horizontally">Хоризонтално обръщане</string>
|
||||
<string name="flip_vertically">Вертикално обръщане</string>
|
||||
|
@ -102,123 +100,123 @@
|
|||
<string name="other_aspect_ratio">Друго</string>
|
||||
<string name="set_as_wallpaper">Задаване като тапет</string>
|
||||
<string name="set_as_wallpaper_failed">Неуспешно задаване като тапет</string>
|
||||
<string name="set_as_wallpaper_with">Задаване като тапет с:</string>
|
||||
<string name="set_as_wallpaper_with">Задаване като тапет от:</string>
|
||||
<string name="setting_wallpaper">Задаване на тапет…</string>
|
||||
<string name="wallpaper_set_successfully">Успешно задаване на тапет</string>
|
||||
<string name="portrait_aspect_ratio">Портретен формат</string>
|
||||
<string name="landscape_aspect_ratio">Албумен формат</string>
|
||||
<string name="wallpaper_set_successfully">Тапетът е зададен</string>
|
||||
<string name="portrait_aspect_ratio">Портретен изглед</string>
|
||||
<string name="landscape_aspect_ratio">Пейзажен изглед</string>
|
||||
<string name="home_screen">Начален екран</string>
|
||||
<string name="lock_screen">Заключен екран</string>
|
||||
<string name="home_and_lock_screen">Начален и заключен екран</string>
|
||||
<string name="allow_changing_aspect_ratio">Разрешаване на промяна на съотношението на страните</string>
|
||||
<string name="slideshow">Слайдшоу</string>
|
||||
<string name="interval">Интервал</string>
|
||||
<string name="include_photos">Добавяне на снимки</string>
|
||||
<string name="include_videos">Добавяне на видео</string>
|
||||
<string name="include_gifs">Добавяне на GIF</string>
|
||||
<string name="include_photos">Снимки</string>
|
||||
<string name="include_videos">Видео</string>
|
||||
<string name="include_gifs">GIF</string>
|
||||
<string name="random_order">Случаен ред</string>
|
||||
<string name="move_backwards">Движение назад</string>
|
||||
<string name="loop_slideshow">Цикличност на слайдшоу</string>
|
||||
<string name="animation">Анимация</string>
|
||||
<string name="no_animation">Няма</string>
|
||||
<string name="move_backwards">В обратен ред</string>
|
||||
<string name="loop_slideshow">Повтаряне отначало</string>
|
||||
<string name="animation">Вид на анимацията</string>
|
||||
<string name="no_animation">Без анимация</string>
|
||||
<string name="fade">Избледняване</string>
|
||||
<string name="slide">Плъзгане</string>
|
||||
<string name="slideshow_ended">Край на слайдшоу</string>
|
||||
<string name="no_media_for_slideshow">Не са открити медийни файлове за слайдшоу</string>
|
||||
<string name="group_direct_subfolders">Групиране на вътрешни папки</string>
|
||||
<string name="group_by">Групиране чрез</string>
|
||||
<string name="do_not_group_files">Без групиране на файлове</string>
|
||||
<string name="group_direct_subfolders">Групиране по вложени папки</string>
|
||||
<string name="group_by">Групиране по…</string>
|
||||
<string name="do_not_group_files">Без групиране</string>
|
||||
<string name="by_folder">Папка</string>
|
||||
<string name="by_last_modified">Последно изменение</string>
|
||||
<string name="by_last_modified_daily">Последно изменение (дневно)</string>
|
||||
<string name="by_last_modified_monthly">Последно изменение (месечно)</string>
|
||||
<string name="by_last_modified">Дата на промяна</string>
|
||||
<string name="by_last_modified_daily">ПослДата на промяна (ден)</string>
|
||||
<string name="by_last_modified_monthly">Дата на промяна (месец)</string>
|
||||
<string name="by_date_taken">Дата на заснемане</string>
|
||||
<string name="by_date_taken_daily">Дата на заснемане (дневно)</string>
|
||||
<string name="by_date_taken_monthly">Дата на заснемане (месечно)</string>
|
||||
<string name="by_date_taken_daily">Дата на заснемане (ден)</string>
|
||||
<string name="by_date_taken_monthly">Дата на заснемане (месец)</string>
|
||||
<string name="by_file_type">Вид на файла</string>
|
||||
<string name="by_extension">Разширение</string>
|
||||
<string name="show_file_count_section_header">Показване на броя файлове в хедърите на разделите</string>
|
||||
<string name="grouping_and_sorting">Обърнете внимание, че групирането и сортирането са 2 независими полета</string>
|
||||
<string name="show_file_count_section_header">Показване на броя файлове в заглавките на разделите</string>
|
||||
<string name="grouping_and_sorting">Обърнете внимание, че групирането и сортирането са две независими полета</string>
|
||||
<string name="folder_on_widget">Папка показана на приспособлението:</string>
|
||||
<string name="show_folder_name">Покажи името на папката</string>
|
||||
<string name="autoplay_videos">Автоматично стартиране на видео</string>
|
||||
<string name="remember_last_video_position">Запомняне на последната времева позиция на видеото</string>
|
||||
<string name="loop_videos">Цикличност на видеото</string>
|
||||
<string name="animate_gifs">Анимиране на миниатюрните GIF изображения</string>
|
||||
<string name="max_brightness">Максимална осветеност при гледане на цял екран</string>
|
||||
<string name="crop_thumbnails">Отрязване на миниатюрните изображения на квадрати</string>
|
||||
<string name="show_thumbnail_video_duration">Показване на дължината на видеото</string>
|
||||
<string name="screen_rotation_by">Завъртане на медията на цял екран с</string>
|
||||
<string name="screen_rotation_system_setting">Системна настройка</string>
|
||||
<string name="screen_rotation_device_rotation">Завъртане на устройството</string>
|
||||
<string name="screen_rotation_aspect_ratio">По размера на изображението</string>
|
||||
<string name="black_background_at_fullscreen">Черен фон при медия на цял екран</string>
|
||||
<string name="scroll_thumbnails_horizontally">Хоризонтално превъртане на миниатюрните изображения</string>
|
||||
<string name="hide_system_ui_at_fullscreen">Автоматично скриване на системния интерфейс при гледане на цял екран</string>
|
||||
<string name="delete_empty_folders">Изтриване на празни папки след делене на тяхното съдържание</string>
|
||||
<string name="allow_photo_gestures">Позволете контролиране на осветеността на изображенията с вертикални жестове</string>
|
||||
<string name="allow_video_gestures">Позволете контролиране на звука и осветеността на видеото с вертикални жестове</string>
|
||||
<string name="show_media_count">Показване на количеството на файловете в папките</string>
|
||||
<string name="show_extended_details">Показване на сведения за файла при гледане на цял екран</string>
|
||||
<string name="show_folder_name">Показване имената на папките</string>
|
||||
<string name="autoplay_videos">втоматично възпроизвеждане на видео</string>
|
||||
<string name="remember_last_video_position">Запомняне на времето във видеото</string>
|
||||
<string name="loop_videos">Повтаряне отначало</string>
|
||||
<string name="animate_gifs">Анимиране на миниатюрите на GIF</string>
|
||||
<string name="max_brightness">Максимална яркост при преглед на цял екран</string>
|
||||
<string name="crop_thumbnails">Изрязване на миниатюрите до квадрати</string>
|
||||
<string name="show_thumbnail_video_duration">Показване дължината на видеото</string>
|
||||
<string name="screen_rotation_by">Завъртане при преглед на цял екран</string>
|
||||
<string name="screen_rotation_system_setting">Според системата</string>
|
||||
<string name="screen_rotation_device_rotation">При завъртане на устройството</string>
|
||||
<string name="screen_rotation_aspect_ratio">Според размера на изображението</string>
|
||||
<string name="black_background_at_fullscreen">Черен фон при преглед на цял екран</string>
|
||||
<string name="scroll_thumbnails_horizontally">Хоризонтално прелистване на миниатюрите</string>
|
||||
<string name="hide_system_ui_at_fullscreen">Без системен интерфейс при преглед на цял екран</string>
|
||||
<string name="delete_empty_folders">Премахване на празните папки при премахване на съдържание</string>
|
||||
<string name="allow_photo_gestures">Управление на яркостта при преглед с вертикални жестове</string>
|
||||
<string name="allow_video_gestures">Управление на яркостта и звука при преглед с вертикални жестове</string>
|
||||
<string name="show_media_count">Показване на броя файлове в папките</string>
|
||||
<string name="show_extended_details">Показване на сведения за файла при преглед на цял екран</string>
|
||||
<string name="manage_extended_details">Управление на сведенията за файла</string>
|
||||
<string name="one_finger_zoom">Увеличаване на мащаба с един пръст при гледане на цял екран</string>
|
||||
<string name="allow_instant_change">Моментална смяна на медията чрез кликване отстрани на екрана</string>
|
||||
<string name="one_finger_zoom">Мащабиране с един пръст при преглед на цял екран</string>
|
||||
<string name="allow_instant_change">Смяна на медията чрез докосване страните на екрана</string>
|
||||
<string name="allow_deep_zooming_images">Пълна промяна на мащаба на изображенията</string>
|
||||
<string name="hide_extended_details">Скриване на сведения за файла когато е скрита информацията за състоянието</string>
|
||||
<string name="show_at_bottom">Показване на някои бутони за действия в долната част екрана</string>
|
||||
<string name="show_recycle_bin">Показване на кошче на екрана с папките</string>
|
||||
<string name="hide_extended_details">Без сведения за файла при скрита лента за състоянието</string>
|
||||
<string name="show_at_bottom">Показване на бутони в долната част екрана</string>
|
||||
<string name="show_recycle_bin">Показване на кошчето редом с папките</string>
|
||||
<string name="deep_zoomable_images">Промяна мащаба на изображения</string>
|
||||
<string name="show_highest_quality">Показване на изображения с най-високото възможно качество</string>
|
||||
<string name="show_recycle_bin_last">Показване на кошчето като последен елемент на главния екран</string>
|
||||
<string name="allow_down_gesture">Излизане от режим на цял екран с жест надолу</string>
|
||||
<string name="show_highest_quality">Показване на изображенията в най-високото качество</string>
|
||||
<string name="show_recycle_bin_last">Кошчето да е последен елемент на главния екран</string>
|
||||
<string name="allow_down_gesture">Излизане от цял екран с дърпане надолу</string>
|
||||
<string name="allow_one_to_one_zoom">Мащабиране 1:1 с две двойни потупвания</string>
|
||||
<string name="open_videos_on_separate_screen">Отваряне на видео на отделен екран с нов хоризонтален жест</string>
|
||||
<string name="show_notch">Показване на етикет, ако е наличен</string>
|
||||
<string name="show_notch">Показване на прорез на екрана, ако е наличен</string>
|
||||
<string name="allow_rotating_gestures">Завъртане на изображения с жестове</string>
|
||||
<string name="file_loading_priority">Приоритет на зареждане на файлове</string>
|
||||
<string name="speed">Скорост</string>
|
||||
<string name="compromise">Компромис</string>
|
||||
<string name="avoid_showing_invalid_files">Показване само на валидни файлове</string>
|
||||
<string name="show_image_file_types">Показване на вида на файла на изображението</string>
|
||||
<string name="allow_zooming_videos">Увеличаване мащаба на видеото с двойно тупване</string>
|
||||
<string name="folder_thumbnail_style">Стил на папката на миниатюрните изображения</string>
|
||||
<string name="file_thumbnail_style">Стил на файла на миниатюрното изображение</string>
|
||||
<string name="mark_favorite_items">Отбелязване на любими елементи</string>
|
||||
<string name="thumbnail_spacing">Празно пространство между миниатюрните изображения</string>
|
||||
<string name="show_file_count_line">Показване на брояча на отделна линия</string>
|
||||
<string name="show_file_count_brackets">Показване на броя файлове в скоби</string>
|
||||
<string name="avoid_showing_invalid_files">Пропускане на файловете с грешки</string>
|
||||
<string name="show_image_file_types">Показване на вида на файла на изображенията</string>
|
||||
<string name="allow_zooming_videos">Увеличаване мащаба на видеото с двойно потупване</string>
|
||||
<string name="folder_thumbnail_style">Вид на миниатюрите на папки</string>
|
||||
<string name="file_thumbnail_style">Вид на миниатюрите на файлове</string>
|
||||
<string name="mark_favorite_items">Отбелязване на избраните елементи</string>
|
||||
<string name="thumbnail_spacing">Пространство между миниатюрите</string>
|
||||
<string name="show_file_count_line">Показване броя файлове на отделен ред</string>
|
||||
<string name="show_file_count_brackets">Показване броя файлове в скоби</string>
|
||||
<string name="show_file_count_none">Без показване на броя файлове</string>
|
||||
<string name="limit_folder_title">Ограничаване на заглавията на папките до един ред</string>
|
||||
<string name="square">Квадрат</string>
|
||||
<string name="square">Квадратни</string>
|
||||
<string name="rounded_corners">Заоблени ъгли</string>
|
||||
<string name="export_favorite_paths">Експортиране на любимите</string>
|
||||
<string name="import_favorite_paths">Импортиране на любими</string>
|
||||
<string name="paths_imported_successfully">Пътищата са импортирани успешно</string>
|
||||
<string name="media_management_prompt">За да работят надеждно всички операции, моля задайте това приложение да управлява медията в настройките на вашето устройство.</string>
|
||||
<string name="password_protect_excluded">Защита на изключена папка с парола</string>
|
||||
<string name="export_favorite_paths">Изнасяне на избраните</string>
|
||||
<string name="import_favorite_paths">Внасяне на избраните</string>
|
||||
<string name="paths_imported_successfully">Пътищата са внесени</string>
|
||||
<string name="media_management_prompt">За да работят надеждно всички действия, задайте приложението да управлява медията в настройките на устройството.</string>
|
||||
<string name="password_protect_excluded">Защита с парола изключените папки</string>
|
||||
<string name="media_management_manual">Нещо се обърка, моля, влезте в Настройки на вашето устройство - Приложения - Достъп до специални приложения - Приложения за управление на медии и разрешете на това приложение да управлява медиите.</string>
|
||||
<string name="media_management_note">Ако пренасочването не работи, моля, влезте в Настройки на вашето устройство - Приложения - Достъп до специални приложения - Приложения за управление на медии и разрешете на това приложение да управлява медиите.</string>
|
||||
<string name="media_management_alternative">Ако не искате да го направите, можете също да отидете в Настройки на вашето устройство - Приложения - Специален достъп до приложения - Приложения за управление на медии и да разрешите на това приложение да управлява медии.</string>
|
||||
<string name="alternative_media_access">Като алтернатива можете да разрешите достъп само до медийни файлове. В този случай обаче няма да можете да работите със скрити файлове.</string>
|
||||
<string name="media_only">Само медия</string>
|
||||
<string name="all_files">Всички файлове</string>
|
||||
<string name="search_all_files">Търсете всички файлове вместо папки на главния екран</string>
|
||||
<string name="show_all_folders">Показване на бутон на менюто за бързо превключване на Показване на съдържанието на всички папки</string>
|
||||
<string name="search_all_files">Търсене на файлове, не само папки от главния екран</string>
|
||||
<string name="show_all_folders">Показване на бутон, превключващ „Показване на всички медийни файлове“</string>
|
||||
<string name="thumbnails">Миниатюри</string>
|
||||
<string name="fullscreen_media">Медия на цял екран</string>
|
||||
<string name="fullscreen_media">Преглед на цял екран</string>
|
||||
<string name="extended_details">Подробности</string>
|
||||
<string name="bottom_actions">Действия от долния край на екрана</string>
|
||||
<string name="manage_bottom_actions">Управление на видимите действия в долния край на екрана</string>
|
||||
<string name="manage_bottom_actions">Управление на бутоните в долния край на екрана</string>
|
||||
<string name="toggle_favorite">Превключване на любимите</string>
|
||||
<string name="toggle_file_visibility">Превключване на видимост на файл</string>
|
||||
<string name="faq_2_title">Заключих програмата с парола, но я забравих. Какво мога да направя\?</string>
|
||||
<string name="faq_2_text">Можете да разрешите проблема по два начина. Можете или да преинсталирате програмата, или да намерите програмата в настройките на вашето устройство и да изберете \"Изчистване на данните\". Това ще нулира всички ваши настройки, няма да изтрие никакви медийни файлове.</string>
|
||||
<string name="toggle_file_visibility">Превключване видимостта на файловете</string>
|
||||
<string name="faq_2_title">Заключих приложението с парола, но я забравих. Какво мога да направя?</string>
|
||||
<string name="faq_2_text">Можете да разрешите проблема по два начина. Можете или да преинсталирате приложението, или да го намерите в настройките на устройството и да изберете „Изчистване на данните“. По този начин ще нулирате настройките му, но няма да засегне медийните файлове.</string>
|
||||
<string name="faq_4_title">Как мога да превъртя напред видео\?</string>
|
||||
<string name="faq_5_title">Каква е разликата между скриване и изключване на папка\?</string>
|
||||
<string name="faq_3_title">Как мога да накарам някой албум да се показва винаги отгоре\?</string>
|
||||
<string name="faq_3_title">Как да накарам даден албум да се показва винаги отгоре?</string>
|
||||
<string name="faq_4_text">Можете да тупнете отстрани на екрана или да тупнете върху текстовете за текуща или максимална продължителност близо до полето за търсене. Ако включите отварянето на видео на отделен екран в настройките на приложението, можете също да използвате хоризонтални жестове.</string>
|
||||
<string name="faq_3_text">Можете да натиснете дълго избрания албум и да изберете \"Закачване\" в менюто с действията, това ще го закачи отгоре. Можете да закачите множество папки, като закачените папки ще бъдат сортирани с основния начин за сортиране.</string>
|
||||
<string name="faq_6_title">Защо се показват папки с музикални албуми или стикери\?</string>
|
||||
<string name="faq_3_text">Можете да задържите върху албума и да изберете „Закачане“ от менюто. По този начин ожете да закачите множество папки, които ще бъдат сортирани по подразбирания признак.</string>
|
||||
<string name="faq_6_title">Защо се показват папки с обложки на музикални албуми?</string>
|
||||
<string name="faq_6_text">Може да видите да се показват някои необичайни албуми. Можете да ги изключите като ги натиснете продължително и после изберете Изключване. В следващия диалог можете да изберете папката от по-горно ниво, като има вероятност това да скрие и други свързани албуми.</string>
|
||||
<string name="faq_7_title">Папка с изображения не се показва, или не показва всички елементи. Какво мога да направя\?</string>
|
||||
<string name="faq_7_text">Може да има множество причини за това, но решението е лесно. Просто идете в Настройки -> Управление на Включените Папки, изберете Плюс и навигирайте до исканата папка.</string>
|
||||
|
@ -227,12 +225,12 @@
|
|||
<string name="faq_10_title">Мога ли да изрязвам изображения с това приложение\?</string>
|
||||
<string name="faq_10_text">Да, можете да изрежете изображения в редактора, като плъзкате ъглите на изображението. Можете да стигнете до редактора като натиснете продължително миниатюра на изображение и изберете Редактиране, или изберете Редактиране от изгледа на цял екран.</string>
|
||||
<string name="faq_11_title">Мога ли да групирам миниатюри на медийни файлове\?</string>
|
||||
<string name="faq_11_text">Разбира се, просто използвайте елемента от менюто „Групиране по“, докато сте в изгледа с миниатюри. Можете да групирате файлове по множество критерии, включително Дата на заснемане. Ако използвате функцията „Показване на съдържанието на всички папки“, можете да ги групирате и по папки.</string>
|
||||
<string name="faq_11_text">Разбира се, просто използвайте елемента от менюто „Групиране по“, докато сте в изгледа с миниатюри. Можете да групирате файлове по множество критерии, включително Дата на заснемане. Ако е отметнато „Показване на съдържанието на всички папки“, можете да ги групирате и по папки.</string>
|
||||
<string name="faq_12_title">Сортирането по дата на заснемане изглежда не работи правилно, как мога да го поправя\?</string>
|
||||
<string name="faq_12_text">Най-вероятно е причинено от копирането на файлове от някъде. Можете да го поправите, като изберете миниатюрите на файла и изберете \"Поправяне стойност на датата на заснемане\".</string>
|
||||
<string name="faq_13_title">Виждам някои цветни ленти на изображенията. Как мога да подобря качеството\?</string>
|
||||
<string name="faq_13_text">Настоящото решение за показване на изображения работи добре в по-голямата част от случаите, но ако искате още по-добро качество на изображението, можете да активирате „Показване на изображения с възможно най-високо качество“ в настройките на приложението, в секцията „Изображения с дълбоко мащабиране“ .</string>
|
||||
<string name="faq_14_title">Скрих файл/папка. Как мога да го/я разкрия\?</string>
|
||||
<string name="faq_13_text">Настоящото решение за показване на изображения работи добре в по-голямата част от случаите, но ако искате още по-добро качество на изображението, можете да включите „Показване на изображения с възможно най-високо качество“ от настройките, в секцията „Изображения с дълбоко мащабиране“ .</string>
|
||||
<string name="faq_14_title">Скрих файл/папка. Как мога да го/я видя?</string>
|
||||
<string name="faq_14_text">Можете или да натиснете елемента от менюто „Временно показване на скрити елементи“ на главния екран, или да превключите „Показване на скрити елементи“ в настройките на приложението, за да видите скрития елемент. Ако искате да го покажете, просто го натиснете дълго и изберете „Показване“. Папките се скриват чрез добавяне на скрит \".nomedia\" файл в тях, можете да изтриете файла и с всеки файлов мениджър. Имайте предвид, че скриването работи рекурсивно, така че ако скриете папка, всички подпапки също ще станат скрити. Така че, за да разкриете подпапките, трябва да разкриете родителската папка.</string>
|
||||
<string name="faq_15_title">Защо приложението заема толкова много място\?</string>
|
||||
<string name="faq_15_text">Кешът на приложението може да отнеме до 250 MB, което гарантира по-бързо зареждане на изображението. Ако приложението заема още повече място, най-вероятно това е причинено от това, че имате елементи в кошчето. Тези файлове се броят към размера на приложението. Можете да изчистите кошчето, като го отворите и изтриете всички файлове или от настройките на приложението. Всеки файл в кошчето се изтрива автоматично след 30 дни.</string>
|
||||
|
@ -242,5 +240,17 @@
|
|||
<string name="faq_17_title">Защо вече не мога да добавя липсващи папки\?</string>
|
||||
<string name="faq_17_text">Това спря да работи поради системните промени, които дойдоха и с Android 11, приложението вече не може да преглежда истински папки, разчита на така наречения MediaStore при извличане на данни.</string>
|
||||
<string name="faq_18_title">Защо виждам реклами по време на възпроизвеждане на видео\?</string>
|
||||
<string name="faq_18_text">Приложенията ни нямат никакви реклами. Ако ги видите по време на възпроизвеждане на видео, явно използвате видеоплейър от други приложения. Опитайте да намерите подразбирания видеоплейър в настройките на устройството, след което направете „Изчистване на настройките по подразбиране“ върху него. Следващия път, когато извикате някакъв видеоплейър, ще видите диалог за избор на приложение, където можете да изберете кое приложение искате да използвате.</string>
|
||||
<string name="faq_18_text">Приложенията ни нямат реклами. Ако видите реклама по време на възпроизвеждане на видео, явно използвате видеоплейър от други приложения. Опитайте да намерите подразбирания видеоплейър в настройките на устройството, след което направете „Изчистване на настройките по подразбиране“ върху него. Следващия път, когато извикате някакъв видеоплейър, ще видите диалог за избор на приложение, където можете да изберете кое приложение искате да използвате.</string>
|
||||
<string name="wallpaper">Тапет</string>
|
||||
<string name="full_storage_permission_required">За да може да покаже всички снимки и видеофайлове Fossify Gallery се нуждае от пълен достъп.</string>
|
||||
<string name="playback_speed">Скорост на възпроизвеждане</string>
|
||||
<string name="failed_to_load_media">Файлът с медия не може да бъде зяреден.</string>
|
||||
<string name="file_is_malformed_or_corrupted">Файлът е с неправилен формат или е повреден.</string>
|
||||
<string name="media_exceeds_device_capabilities">Файлът надхвърля възможностите на устройството.</string>
|
||||
<string name="unsupported_format">Неподдържан формат.</string>
|
||||
<string name="exclude_folder_description">По този начин ще изключите избраните папки и тяхното съдържание само от Fossify Gallery. Управлението на изключени папки се намира в настройките.</string>
|
||||
<string name="excluded_activity_placeholder">Изключването на папките ще скрие тях и вложените папки, само от Fossify Gallery – в други приложения папките ще бъдат видими.\n\nАко искате да ги скриете и от тях, използвайте Скриване.</string>
|
||||
<string name="faq_1_title">Как да направя Fossify Gallery подразбираната галерия на устройството?</string>
|
||||
<string name="faq_5_text">Изключването предотвратява показването на папката само във Fossify Gallery, докато скриването работи на ниво система и скрива папката и от други галерии. Това става чрез създаване на празен файл с име „nomedia“ в дадената папка, който след това можете да премахнете с всяко приложение за работа с файлове. Имайте предвид, че някои устройства не позволяват скриване на папките Камера, Екранни снимки, Изтегляния и подобни.</string>
|
||||
<string name="faq_1_text">Първо трябва да намерите галерията по подразбиране в настройките, секция Приложения, потърсете бутон, който казва нещо като „Отваряне по подразбиране“, докоснете го, след това изберете „Изчистване на настройките по подразбиране“. Следващия път, когато отворите изображение или видеоклип, трябва да видите инструмент за избор на приложение, там можете да изберете Fossify Gallery и да направите приложението подразбирано.</string>
|
||||
</resources>
|
|
@ -1,2 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources></resources>
|
||||
<resources>
|
||||
<string name="videos">Videoioù</string>
|
||||
<string name="images">Skeudennoù</string>
|
||||
</resources>
|
||||
|
|
|
@ -230,7 +230,7 @@
|
|||
<string name="faq_12_title">L\'ordenació per la data de presa no sembla funcionar correctament, com puc solucionar-ho\?</string>
|
||||
<string name="faq_12_text">Probablement, els fitxers s\'han copiat des de qualsevol lloc. Podeu arreglar-ho seleccionant les miniatures de fitxer i seleccionant «Corregeix el valor de la data de presa».</string>
|
||||
<string name="faq_13_title">Veig algunes bandes de colors a les imatges. Com puc millorar la qualitat\?</string>
|
||||
<string name="faq_13_text">La solució actual per mostrar imatges funciona bé en la gran majoria dels casos, però si voleu obtenir una qualitat d\'imatge millor, podeu activar «Mostra les imatges amb la màxima qualitat possible» a la configuració de l\'aplicació, a la secció «Imatges ampliables profundament».</string>
|
||||
<string name="faq_13_text">La solució actual per a mostrar imatges funciona bé en la gran majoria dels casos, però si voleu obtenir una qualitat d\'imatge millor, podeu activar «Mostra les imatges amb la màxima qualitat possible» a la configuració de l\'aplicació, a la secció «Imatges ampliables profundament».</string>
|
||||
<string name="faq_14_title">He ocultat un fitxer/carpeta. Com puc mostrar-ho\?</string>
|
||||
<string name="faq_14_text">Podeu prémer l\'element de menú «Mostra temporalment els elements ocults» a la pantalla principal o canviar «Mostra els elements ocults» a la configuració de l\'aplicació per a veure l\'element ocult. Si el voleu mostrar, premeu-lo i seleccioneu «Mostra». Les carpetes s\'oculten afegint un fitxer «.nomedia» ocult en elles, també podeu eliminar el fitxer amb qualsevol gestor de fitxers. Tingueu en compte que l\'ocultació funciona recursivament, així que si oculteu una carpeta, totes les subcarpetes també esdevindran ocultes. Per tant, per a fer visibles les subcarpetes cal mostrar la carpeta superior.</string>
|
||||
<string name="faq_15_title">Per què l\'aplicació ocupa tant espai\?</string>
|
||||
|
@ -245,14 +245,17 @@
|
|||
<string name="faq_1_title">Com puc fer que la Fossify Gallery sigui la galeria predeterminada del dispositiu?</string>
|
||||
<string name="editor">Editor</string>
|
||||
<string name="wallpaper">Fons de pantalla</string>
|
||||
<string name="faq_5_text">Exclou impedeix mostrar la carpeta només a Fossify Gallery, mentre que Oculta funciona a nivell del sistema i també oculta la carpeta d\'altres galeries. Funciona creant un fitxer «.nomedia» buit a la carpeta indicada, que després podreu eliminar amb qualsevol gestor de fitxers. Tingueu en compte que alguns dispositius no permeten amagar carpetes com ara Camera/Càmera, Screenshots/Captures de pantalla o Downloads/Descàrregues.</string>
|
||||
<string name="faq_5_text">Exclou impedeix mostrar la carpeta només a Fossify Gallery, mentre que Oculta funciona en l\'àmbit del sistema i també oculta la carpeta d\'altres galeries. Funciona creant un fitxer «.nomedia» buit a la carpeta indicada, que després podreu eliminar amb qualsevol gestor de fitxers. Tingueu en compte que alguns dispositius no permeten amagar carpetes com ara Camera/Càmera, Screenshots/Captures de pantalla o Downloads/Descàrregues.</string>
|
||||
<string name="exclude_folder_description">Això exclourà la selecció juntament amb les seves subcarpetes només de la Fossify Gallery. Podeu gestionar les carpetes excloses a la configuració.</string>
|
||||
<string name="excluded_activity_placeholder">L\'exclusió de les carpetes es farà juntament amb les seves subcarpetes amagades només a la Fossify Gallery, però encara seran visibles en les altres aplicacions.
|
||||
\n
|
||||
\nSi també voleu amagar-les de les altres apps, utilitzeu la funció Amagar.</string>
|
||||
<string name="faq_1_text">Primer heu de trobar la galeria predeterminada a la secció d\'Aplicacions de la configuració del dispositiu, busqueu un botó que digui alguna cosa com «Obre per defecte», feu-hi clic i seleccioneu «Neteja els valors per defecte». La pròxima vegada que intenteu obrir una imatge o un vídeo veureu un selector d\'aplicacions, on podreu seleccionar Fossify Gallery i convertir-la en l\'aplicació predeterminada.</string>
|
||||
<string name="interval">Interval</string>
|
||||
<string name="full_storage_permission_required">La Fossify Gallery necessita d\'accés complet accés a totes les vostres fotografies i vídeos. Aneu a Configuració > Permisos > Fotos i vídeos > Permet-ho tot.</string>
|
||||
<string name="full_storage_permission_required">La Fossify Gallery necessita accés complet a totes les vostres fotografies i vídeos. Aneu a Configuració > Permisos > Fotos i vídeos > Permet-ho tot.</string>
|
||||
<string name="playback_speed">Velocitat de reproducció</string>
|
||||
<string name="failed_to_load_media">Ha fallat en carregar elements multimèdia.</string>
|
||||
</resources>
|
||||
<string name="media_exceeds_device_capabilities">Els elements multimèdia excedeixen les capacitats del dispositiu.</string>
|
||||
<string name="file_is_malformed_or_corrupted">El fitxer està malmès o s\'ha corromput.</string>
|
||||
<string name="unsupported_format">Format no admès.</string>
|
||||
</resources>
|
||||
|
|
|
@ -255,4 +255,7 @@
|
|||
<string name="full_storage_permission_required">Galerie Fossify potřebuje plný přístup ke zobrazení všech vašich fotek a videí. Přejděte do Nastavení > Oprávnění > Fotky a videa > Povolit vše.</string>
|
||||
<string name="playback_speed">Rychlost přehrávání</string>
|
||||
<string name="failed_to_load_media">Nepodařilo se načíst média.</string>
|
||||
<string name="media_exceeds_device_capabilities">Média přesahují schopnosti zařízení.</string>
|
||||
<string name="file_is_malformed_or_corrupted">Soubor je poškozen.</string>
|
||||
<string name="unsupported_format">Nepodporovaný formát.</string>
|
||||
</resources>
|
|
@ -6,7 +6,7 @@
|
|||
<string name="open_camera">Agor y camera</string>
|
||||
<string name="hidden">(cudd)</string>
|
||||
<string name="show_all">Dangos cynnwys o bob ffolder</string>
|
||||
<string name="excluded">(wedi\'i allgáu)</string>
|
||||
<string name="excluded">(wedi\'i eithrio)</string>
|
||||
<string name="pin_folder">Pinio\'r ffolder</string>
|
||||
<string name="unpin_folder">Dadbinio\'r ffolder</string>
|
||||
<string name="all_folders">Pob ffolder</string>
|
||||
|
@ -134,8 +134,47 @@
|
|||
<string name="slideshow_ended">Daeth y sleidsioe i ben</string>
|
||||
<string name="do_not_group_files">Peidio â grwpio ffeiliau</string>
|
||||
<string name="show_thumbnail_video_duration">Dangos hyd fideo</string>
|
||||
<string name="deep_zoomable_images">Galluogi chwyddo dwfn ar ddelweddau</string>
|
||||
<string name="deep_zoomable_images">Chwyddo delwedd dwfn</string>
|
||||
<string name="show_highest_quality">Dangos delweddau yn yr ansawdd uchaf posibl</string>
|
||||
<string name="mark_favorite_items">Dynodi ffefrynnau</string>
|
||||
<string name="thumbnail_spacing">Bylchiad rhwng cryno-luniau</string>
|
||||
<string name="image_edited_successfully">Wedi golygu\'r delwedd yn llwyddiannus</string>
|
||||
<string name="video_edited_successfully">Wedi golygu\'r fideo\'n llwyddiannus</string>
|
||||
<string name="no_image_editor_found">Ni chanfuwyd golygydd delwedd</string>
|
||||
<string name="no_video_editor_found">Ni chanfuwyd golygydd fideo</string>
|
||||
<string name="unknown_file_location">Lleoliad ffeil anhysbys</string>
|
||||
<string name="wallpaper_set_successfully">Wedi gosod y papur wal yn llwyddiannus</string>
|
||||
<string name="portrait_aspect_ratio">Cymhareb agwedd portread</string>
|
||||
<string name="landscape_aspect_ratio">Cymhareb agwedd tirlun</string>
|
||||
<string name="screen_rotation_by">Troi cyfryngau sgrin lawn yn ôl</string>
|
||||
<string name="exclude_folder_parent">Eithrio rhiant yn hytrach?</string>
|
||||
<string name="animate_gifs">Animeiddio GIFs mewn cryno-luniau</string>
|
||||
<string name="allow_deep_zooming_images">Galluogi chwyddo dwfn ar ddelweddau</string>
|
||||
<string name="folder_thumbnail_style">Arddull cryno-lun ffolder</string>
|
||||
<string name="show_file_count_none">Peidio â dangos cyfanswm ffeiliau</string>
|
||||
<string name="failed_to_load_media">Wedi methu â llwytho cyfryngau</string>
|
||||
<string name="file_edited_successfully">Wedi golygu\'r ffeil yn llwyddiannus</string>
|
||||
<string name="group_direct_subfolders">Grwpio is-ffolderi uniongyrchol</string>
|
||||
<string name="autoplay_videos">Chwarae fideos yn awtomatig</string>
|
||||
<string name="show_notch">Dangos notch os yw ar gael</string>
|
||||
<string name="file_loading_priority">Blaenoriaeth llwytho ffeiliau</string>
|
||||
<string name="show_image_file_types">Dangos estyniadau ffeil ar ddelweddau</string>
|
||||
<string name="file_thumbnail_style">Arddull cryno-lun ffeil</string>
|
||||
<string name="reorder_by_dragging">Aildrefnu ffolderi drwy lusgo</string>
|
||||
<string name="paths_imported_successfully">Wedi mewnforio\'r llwybrau\'n llwyddiannus</string>
|
||||
<string name="toggle_file_visibility">Newid gwelededd y ffeil</string>
|
||||
<string name="no_media_with_filters">Ni chanfuwyd unrhyw ffeiliau cyfryngau gyda\'r hidlyddion a ddewiswyd.</string>
|
||||
<string name="show_media_count">Dangos nifer y cyfryngau mewn ffolderi ar y prif olyg</string>
|
||||
<string name="allow_changing_aspect_ratio">Caniatáu i newid cymhareb yr agwedd</string>
|
||||
<string name="by_last_modified">Wedi\'i addasu yn ddiwethaf</string>
|
||||
<string name="by_last_modified_daily">Wedi\'i addasu yn ddiwethaf (dyddiol)</string>
|
||||
<string name="folder_on_widget">Ffolder sydd yn cael ei ddangos ar y teclyn:</string>
|
||||
<string name="by_last_modified_monthly">Wedi\'i addasu yn ddiwethaf (misol)</string>
|
||||
<string name="show_file_count_section_header">Dangos nifer y ffeiliau mewn penawdau</string>
|
||||
<string name="show_at_bottom">Dangos rhai botymau gweithredu ar waelod y sgrin</string>
|
||||
<string name="unsupported_format">Fformat heb ei cefnogi.</string>
|
||||
<string name="show_file_count_brackets">Dangos nifer y ffeiliau mewn cromfach</string>
|
||||
<string name="allow_down_gesture">Caniatáu cau\'r olyg sgrin lawn gydag ystum i lawr</string>
|
||||
<string name="avoid_showing_invalid_files">Osgoi dangos ffeiliau annilys</string>
|
||||
<string name="show_file_count_line">Dangos nifer y ffeiliau ar ei linell ei hunan</string>
|
||||
</resources>
|
|
@ -228,7 +228,7 @@
|
|||
<string name="faq_13_title">Ich sehe Banding (streifiger Farbverlauf) auf den Bildern. Wie kann ich die Qualität verbessern\?</string>
|
||||
<string name="faq_13_text">Die jetzige Methode für die Anzeige von Bildern funktioniert in den allermeisten Fällen gut, aber für eine noch bessere Bildqualität kann die Einstellung „Bilder in der höchstmöglichen Qualität zeigen“ im Menü unter „Stark vergrößerbare Bilder“ gesetzt werden.</string>
|
||||
<string name="faq_14_title">Ich habe eine versteckte Datei bzw. einen versteckten Ordner. Wie kann ich diese/n sichtbar stellen\?</string>
|
||||
<string name="faq_14_text">Man kann entweder auf den Menüpunkt „Ausgeblendete Elemente vorübergehend anzeigen“ auf dem Hauptbildschirm drücken oder „Versteckte Elemente anzeigen“ in den Einstellungen einschalten, um das ausgeblendete Element zu sehen. Um es dauerhaft wieder einzublenden, drückt man einfach lange darauf und wählt „Nicht verstecken“. Ordner werden durch Hinzufügen einer versteckten .nomedia-Datei ausgeblendet; man kann die Datei auch mit einem beliebigen Dateiverwaltungsprogramm löschen. Bitte beachten, dass das Verstecken rekursiv funktioniert, d. h. wenn man einen Ordner versteckt, werden auch alle Unterordner versteckt. Um die Unterordner wieder sichtbar zu machen, muss man also den übergeordneten Ordner sichtbar machen.</string>
|
||||
<string name="faq_14_text">Man kann entweder auf den Menüpunkt „Ausgeblendete Elemente vorübergehend anzeigen“ auf dem Hauptbildschirm drücken oder „Versteckte Elemente anzeigen“ in den Einstellungen einschalten, um das ausgeblendete Element zu sehen. Um es dauerhaft wieder einzublenden, drückt man einfach lange darauf und wählt „Nicht verstecken“. Ordner werden durch Hinzufügen einer versteckten „.nomedia“-Datei ausgeblendet; man kann die Datei auch mit einem beliebigen Dateiverwaltungsprogramm löschen. Bitte beachten, dass das Verstecken rekursiv funktioniert, d. h. wenn man einen Ordner versteckt, werden auch alle Unterordner versteckt. Um die Unterordner wieder sichtbar zu machen, muss man also den übergeordneten Ordner sichtbar machen.</string>
|
||||
<string name="faq_15_title">Warum beansprucht die App so viel Speicherplatz\?</string>
|
||||
<string name="faq_15_text">Der App-Cache kann bis zu 250 MB groß werden, er sorgt für ein schnelleres Laden der Bilder. Wenn die App darüber hinaus Speicherplatz beansprucht, liegt das wahrscheinlich an Dateien im Papierkorb. Diese Dateien werden dem Speicherplatz der App zugerechnet. Man kann den Papierkorb leeren, indem man ihn öffnet und alle Dateien darin löscht, oder den entsprechenden Menüeintrag in den Einstellungen wählt. Jede Datei im Papierkorb wird nach 30 Tagen automatisch gelöscht.</string>
|
||||
<string name="faq_16_title">Was ist mit dem Ausblenden von Dateien und Ordnern passiert und warum kann ich versteckte Elemente nicht mehr sehen\?</string>
|
||||
|
@ -254,4 +254,7 @@
|
|||
<string name="playback_speed">Wiedergabegeschwindigkeit</string>
|
||||
<string name="full_storage_permission_required">Fossify Gallery benötigt vollen Zugriff, um alle Fotos und Videos anzuzeigen. Gehe zu Einstellungen > Berechtigungen > Fotos und Videos > Zugelassen.</string>
|
||||
<string name="failed_to_load_media">Medien konnten nicht geladen werden.</string>
|
||||
<string name="unsupported_format">Nicht unterstütztes Format.</string>
|
||||
<string name="file_is_malformed_or_corrupted">Datei ist fehlerhaft oder beschädigt.</string>
|
||||
<string name="media_exceeds_device_capabilities">Medien überschreiten die Gerätekapazitäten.</string>
|
||||
</resources>
|
|
@ -16,11 +16,241 @@
|
|||
<string name="lock_orientation">Ŝlosi orientiĝon</string>
|
||||
<string name="unlock_orientation">Malŝlosi orientiĝon</string>
|
||||
<string name="change_orientation">Ŝanĝi orientiĝon</string>
|
||||
<string name="fixing">Riparante…</string>
|
||||
<string name="fixing">Korektado…</string>
|
||||
<string name="images">Bildoj</string>
|
||||
<string name="videos">Filmoj</string>
|
||||
<string name="videos">Filmetoj</string>
|
||||
<string name="gifs">GIF-filmetoj</string>
|
||||
<string name="raw_images">RAW-bildoj</string>
|
||||
<string name="svgs">SVG-bildoj</string>
|
||||
<string name="portraits">Portretoj</string>
|
||||
<string name="thumbnails">Bildetoj</string>
|
||||
<string name="toggle_favorite">Baskuligi plej ŝatatan</string>
|
||||
<string name="playback_speed">Legada rapideco</string>
|
||||
<string name="excluded">(ekskluzivita)</string>
|
||||
<string name="show_all">Montri enhavon de ĉiuj dosierujoj</string>
|
||||
<string name="folder_view">Ŝanĝiĝi al dosieruja vido</string>
|
||||
<string name="force_portrait">Ĉiam uzi vertikalan orientiĝon</string>
|
||||
<string name="full_storage_permission_required">Fossify Galerio bezonas tutan atingon por montri viajn fotojn kaj filmetojn. Iru al Agordoj > Permesoj > Fotoj kaj filmetoj > Permesi ĉion.</string>
|
||||
<string name="use_default_orientation">Uzi defaŭltan orientiĝon</string>
|
||||
<string name="no_date_takens_found">Neniu prenodato estis trovita</string>
|
||||
<string name="force_landscape">Ĉiam uzi horizontalan orientiĝon</string>
|
||||
<string name="fix_date_taken">Korekti prenodaton</string>
|
||||
<string name="dates_fixed_successfully">Datoj sukcese korektitaj</string>
|
||||
<string name="share_resized">Kunhavigi regrandigitan version</string>
|
||||
<string name="exclude_folder_parent">Anstataŭe ekskluzivi patron?</string>
|
||||
<string name="no_media_with_filters">Neniu aŭdvidaĵo estis trovita kun la elektitaj filtroj.</string>
|
||||
<string name="change_filters_underlined"><u>Ŝanĝi filtrojn</u></string>
|
||||
<string name="switch_to_file_search">Ŝanĝiĝi al serĉo je ĉiuj videblaj dosierujoj</string>
|
||||
<string name="set_as_default_folder">Difini kiel defaŭlta dosierujo</string>
|
||||
<string name="unset_as_default_folder">Maldifini kiel defaŭlta dosierujo</string>
|
||||
<string name="reorder_by_dragging">Reordigi dosierujojn per treni</string>
|
||||
<string name="reorder_by_dragging_pro">Reordigi dosierujojn per treni (Pro)</string>
|
||||
<string name="restore_to_path">Restaŭrado al \"%s\"</string>
|
||||
<string name="filter_media">Filtri aŭdvidaĵojn</string>
|
||||
<string name="hide_folder_description">Ĉi tiu funkcio kaŝas dosierujon per aldoni al ĝi dosieron nomitan \".nomedia\", kaj ankaŭ kaŝas ĉiujn subdosierujojn. Vi povos vidi ilin per baskuligi la opcion \"Montri kaŝitajn elementojn\" en la agordoj. Ĉu vi ŝatus adi?</string>
|
||||
<string name="exclude_folder_description">Tio ĉi ekskluzivos la elekton kaj ĝiajn subdosierujojn el nur Fossify Galario. Vi povas administri ekskluzivitajn dosierujojn en la agordoj.</string>
|
||||
<string name="keep_aspect_ratio">Gardi bildformaton</string>
|
||||
<string name="invalid_values">Bonvolu enigi validan distingivon</string>
|
||||
<string name="resize_multiple_images">Regrandigi multajn bildojn</string>
|
||||
<string name="resize_factor">Regrandiga faktoro</string>
|
||||
<string name="included_activity_placeholder">Se vi havas dosierujojn kun aŭdvidaĵoj kiuj ne estis rekonataj pro la aplikaĵo, vi povas permane aldoni ilin ĉi tie.\n\nAldoni elementojn ĉi tie ne ekskluzivos iun ajn alian dosierujon.</string>
|
||||
<string name="resize_factor_error">Enigu nombron inter 10 kaj 90</string>
|
||||
<string name="hidden_folders">Kaŝitaj dosierujoj</string>
|
||||
<string name="hidden_folders_placeholder">Ŝajnas, ke vi havas neniun kaŝitan dosierujon kun \".nomedia\"-dosiero.</string>
|
||||
<string name="manage_included_folders">Administri inkluzivitajn dosierujojn</string>
|
||||
<string name="resize_and_save">Regrandigi elekton kaj konservi</string>
|
||||
<string name="width">Larĝo</string>
|
||||
<string name="height">Alto</string>
|
||||
<string name="resize_factor_info">Regrandigi bildojn al donata procento, kiu devas esti inter 10 kaj 90.</string>
|
||||
<string name="basic_editor">Simple redaktilo</string>
|
||||
<string name="manage_hidden_folders">Administri kaŝitajn dosierujojn</string>
|
||||
<string name="advanced_editor">Altnivela redaktilo</string>
|
||||
<string name="rotate">Turni</string>
|
||||
<string name="invalid_image_path">Nevalida vojo de bildo</string>
|
||||
<string name="excluded_activity_placeholder">Ekskluzivi dosierujojn kaŝos ilin kaj iliajn subdosierujojn nur en Fossify Galerio, sed ili restos videble en aliaj aplikaĵoj.\n\nSe vi ankaŭ volas kaŝi ilin en aliaj aplikaĵoj, uzu la funkcion Kaŝi.</string>
|
||||
<string name="hidden_all_files">Endas koncedi al la aplikaĵo atingon al ĉiuj dosieroj por vidi kaŝitajn dosierojn, aŭ ĝi ne funkcios.</string>
|
||||
<string name="cant_unhide_folder">Se dosierujo aŭ ties patro havas punkton antaŭ sia nomo, ĝi estas kaŝita kaj ne povas esti malkaŝita ĉi tiel. Vi devas forigi la punkton per renomi ĝin.</string>
|
||||
<string name="include_folders">Inkluzivitaj dosierujoj</string>
|
||||
<string name="add_folder">Aldoni dosierujon</string>
|
||||
<string name="no_media_add_included">Neniu aŭdvidaĵa dosiero estis trovita. Vi povas tion solvi per aldoni permane dosierujojn kun aŭdvidaĵoj.</string>
|
||||
<string name="invalid_video_path">Nevalida vojo de filmeto</string>
|
||||
<string name="images_resized_successfully">Bildoj sukcese regrandigitaj</string>
|
||||
<string name="editor">Redaktilo</string>
|
||||
<plurals name="failed_to_resize_images">
|
||||
<item quantity="one">Malsukcesis regrandigi %d bildon</item>
|
||||
<item quantity="other">Malsukcesis regrandigi %d bildojn</item>
|
||||
</plurals>
|
||||
<string name="image_editing_failed">Malsukcesis la redakto de bildo</string>
|
||||
<string name="image_editing_cancelled">Redakto de bildo nuligita</string>
|
||||
<string name="video_editing_cancelled">Redakto de filmeto nuligita</string>
|
||||
<string name="error_saving_file">Ne povis superskribi la fontan dosieron</string>
|
||||
<string name="transform">Transformi</string>
|
||||
<string name="draw">Desegni</string>
|
||||
<string name="flip">Renversi</string>
|
||||
<string name="set_as_wallpaper_failed">Malsukcesis difini kiel ekranfono</string>
|
||||
<string name="free_aspect_ratio">Libera</string>
|
||||
<string name="other_aspect_ratio">Alia</string>
|
||||
<string name="wallpaper">Ekranfono</string>
|
||||
<string name="set_as_wallpaper">Difini kiel ekranfono</string>
|
||||
<string name="flip_vertically">Renversi vertikale</string>
|
||||
<string name="flip_horizontally">Renversi horizontale</string>
|
||||
<string name="video_editing_failed">Malsukcesis la redakto de filmeto</string>
|
||||
<string name="file_edited_successfully">Dosiero sukcese redaktita</string>
|
||||
<string name="edit_video_with">Redakti filmeton per:</string>
|
||||
<string name="no_image_editor_found">Neniu bildoredaktilo estis trovita</string>
|
||||
<string name="no_video_editor_found">Neniu filmoredaktilo estis trovita</string>
|
||||
<string name="unknown_file_location">Nekonata dosierloko</string>
|
||||
<string name="image_edited_successfully">Bildo sukcese redaktita</string>
|
||||
<string name="video_edited_successfully">Filmeto sukcese redaktita</string>
|
||||
<string name="edit_image_with">Redakti bildon per:</string>
|
||||
<string name="rotate_right">Turni dekstre</string>
|
||||
<string name="rotate_one_eighty">Turni 180°</string>
|
||||
<string name="crop">Tondi</string>
|
||||
<string name="rotate_left">Turni maldekstre</string>
|
||||
<string name="portrait_aspect_ratio">Vertikala bildformato</string>
|
||||
<string name="set_as_wallpaper_with">Difini kiel ekranfono kun:</string>
|
||||
<string name="lock_screen">Ŝlosekrano</string>
|
||||
<string name="allow_changing_aspect_ratio">Permesi ŝanĝi bildformaton</string>
|
||||
<string name="home_and_lock_screen">Hejma kaj ŝlosa ekranoj</string>
|
||||
<string name="include_photos">Inkluzivi fotojn</string>
|
||||
<string name="include_videos">Inkluzivi filmetojn</string>
|
||||
<string name="include_gifs">Inkluzivi GIF-bildojn</string>
|
||||
<string name="setting_wallpaper">Difinado kiel ekranfono…</string>
|
||||
<string name="slideshow">Bildserio</string>
|
||||
<string name="move_backwards">Moviĝi malantaŭe</string>
|
||||
<string name="animation">Animacio</string>
|
||||
<string name="loop_slideshow">Ripeti bildserion</string>
|
||||
<string name="by_last_modified_daily">Laste modifita (tage)</string>
|
||||
<string name="landscape_aspect_ratio">Horizontala bildformato</string>
|
||||
<string name="wallpaper_set_successfully">Ekranfono sukcese difinita</string>
|
||||
<string name="home_screen">Hejmekrano</string>
|
||||
<string name="interval">Intervalo</string>
|
||||
<string name="fade">Dissolvo</string>
|
||||
<string name="by_folder">Dosierujo</string>
|
||||
<string name="random_order">Hazarda ordo</string>
|
||||
<string name="no_animation">Neniu</string>
|
||||
<string name="by_last_modified">Laste modifita</string>
|
||||
<string name="by_last_modified_monthly">Laste modifita (monate)</string>
|
||||
<string name="slide">Glito</string>
|
||||
<string name="no_media_for_slideshow">Neniu aŭdvidaĵo por la bildserio estis trovita</string>
|
||||
<string name="group_direct_subfolders">Grupigi rektajn subdosierujojn</string>
|
||||
<string name="group_by">Grupigi laŭ</string>
|
||||
<string name="slideshow_ended">La bildserio finiĝis</string>
|
||||
<string name="do_not_group_files">Ne grupigi dosierojn</string>
|
||||
<string name="by_file_type">Dosiertipo</string>
|
||||
<string name="by_date_taken">Kreodato</string>
|
||||
<string name="by_date_taken_daily">Kreodato (tage)</string>
|
||||
<string name="by_date_taken_monthly">Kreodato (monate)</string>
|
||||
<string name="by_extension">Dosiersufikso</string>
|
||||
<string name="grouping_and_sorting">Bonvolu rimarki, ke grupigado kaj ordigado estas du apartaj kampoj</string>
|
||||
<string name="folder_on_widget">Dosierujo montrita en la fenestraĵo:</string>
|
||||
<string name="show_file_count_section_header">Montri nombron de dosieroj en sekciokapoj</string>
|
||||
<string name="autoplay_videos">Aŭtomate legi filmetojn</string>
|
||||
<string name="remember_last_video_position">Memori lastan pozicion de legado de filmeto</string>
|
||||
<string name="loop_videos">Ripeti filmetojn</string>
|
||||
<string name="animate_gifs">Ŝalti animacion de GIF-aj bildetoj</string>
|
||||
<string name="show_folder_name">Montri nomon de dosierujo</string>
|
||||
<string name="max_brightness">Maksimuma heleco dum montrado de plenekranaj aŭdvidaĵoj</string>
|
||||
<string name="crop_thumbnails">Kvadrate tondi bildetojn</string>
|
||||
<string name="screen_rotation_device_rotation">Orientiĝo de aparato</string>
|
||||
<string name="screen_rotation_aspect_ratio">Bildformato</string>
|
||||
<string name="screen_rotation_by">Turni plenekranajn aŭdvidaĵojn laŭ</string>
|
||||
<string name="screen_rotation_system_setting">Sistema agordo</string>
|
||||
<string name="show_thumbnail_video_duration">Montri daŭrojn de filmetoj</string>
|
||||
<string name="delete_empty_folders">Forigi malplenajn dosierujojn post forigi ilian enhavon</string>
|
||||
<string name="black_background_at_fullscreen">Nigra fono por plenekranaj aŭdvidaĵoj</string>
|
||||
<string name="scroll_thumbnails_horizontally">Rulumi bildetojn horizontale</string>
|
||||
<string name="hide_system_ui_at_fullscreen">Aŭtomate kaŝi sisteman interfacon por plenekranaj aŭdvidaĵoj</string>
|
||||
<string name="allow_photo_gestures">Permesi regi fotan helecon per vertikalaj moviĝoj</string>
|
||||
<string name="allow_video_gestures">Permesi regi filmetajn sonfortecon kaj helecon per vertikalaj moviĝoj</string>
|
||||
<string name="show_image_file_types">Montri dosiertipojn de bildoj</string>
|
||||
<string name="thumbnail_spacing">Interspaco de bildetoj</string>
|
||||
<string name="mark_favorite_items">Marki plej ŝatatajn elementojn</string>
|
||||
<string name="show_file_count_line">Montri nombron de dosieroj en aparta linio</string>
|
||||
<string name="show_recycle_bin">Montri rubujojn sur la ekrano de dosierujoj</string>
|
||||
<string name="one_finger_zoom">Permesi zomadon per unu fingro por plenekranaj aŭdvidaĵoj</string>
|
||||
<string name="allow_instant_change">Permesi tuje ŝanĝi aŭdvidaĵojn per alklaki flankojn de la ekrano</string>
|
||||
<string name="allow_one_to_one_zoom">Permesi 1:1-an zomon per duobla frapeto</string>
|
||||
<string name="open_videos_on_separate_screen">Ĉiam malfermi filmetojn sur alia ekrano per novaj horizontalaj moviĝoj</string>
|
||||
<string name="file_loading_priority">Prioritato de ŝargo de dosieroj</string>
|
||||
<string name="speed">Rapido</string>
|
||||
<string name="compromise">Kompromiso</string>
|
||||
<string name="show_extended_details">Montri pliajn detalojn sur plenekranaj aŭdvidaĵoj</string>
|
||||
<string name="manage_extended_details">Administri pliajn detalojn</string>
|
||||
<string name="show_media_count">Montri nombron de aŭdvidaĵoj en dosieroj en la ĉefa vido</string>
|
||||
<string name="show_at_bottom">Montri kelkajn butonojn de akcio je la malsupro de la ekrano</string>
|
||||
<string name="allow_deep_zooming_images">Permesi profundan zomadon de bildoj</string>
|
||||
<string name="deep_zoomable_images">Profunde zomeblaj bildoj</string>
|
||||
<string name="show_highest_quality">Montri bildojn kun laŭeble plej alta kvalito</string>
|
||||
<string name="show_recycle_bin_last">Montri rubujon kiel lasta elemento sur la ĉefa ekrano</string>
|
||||
<string name="show_notch">Montri noĉon se disponebla</string>
|
||||
<string name="allow_rotating_gestures">Permesi turni bildojn per moviĝoj</string>
|
||||
<string name="avoid_showing_invalid_files">Eviti montri nevalidajn dosierojn</string>
|
||||
<string name="allow_zooming_videos">Permesi zomi sur filmetoj per duobla frapeto</string>
|
||||
<string name="folder_thumbnail_style">Stilo de dosierujaj bildetoj</string>
|
||||
<string name="file_thumbnail_style">Stiloj de dosieraj bildetoj</string>
|
||||
<string name="hide_extended_details">Kaŝi pliajn detalojn kiam la stata breto estas kaŝita</string>
|
||||
<string name="allow_down_gesture">Permesi fermi plenekranan vidon per malsupra moviĝo</string>
|
||||
<string name="show_file_count_brackets">Montri nombron de dosieroj inter krampoj</string>
|
||||
<string name="show_file_count_none">Ne montri nombron de dosieroj</string>
|
||||
<string name="limit_folder_title">Limi longajn nomojn de dosierujoj al unu linio</string>
|
||||
<string name="import_favorite_paths">Importi plej ŝatatajn</string>
|
||||
<string name="export_favorite_paths">Eksporti plej ŝatatajn</string>
|
||||
<string name="square">Kvadrato</string>
|
||||
<string name="rounded_corners">Rondaj anguloj</string>
|
||||
<string name="media_management_prompt">Por certigi, ke ĉiuj operacioj sur dosieroj ĝuste funkcias, bonvolu igi tiun ĉi aplikaĵon aplikaĵo de administrado de aŭdvidaĵoj en viaj aparataj agordoj.</string>
|
||||
<string name="paths_imported_successfully">Vojoj sukcese importitaj</string>
|
||||
<string name="password_protect_excluded">Protekti per pasvorto videblecon de ekskluzivitaj dosierujoj</string>
|
||||
<string name="all_files">Ĉiuj dosieroj</string>
|
||||
<string name="media_management_note">Se la alidirekto ne funkcias, bonvolu iri al viaj aparataj Agordoj - Aplikaĵoj - Specialaj permesoj de aplikaĵoj - Aplikaĵoj de administrado de aŭdvidaĵoj kaj permesi, ke tiu ĉi aplikaĵo administru aŭdvidaĵojn.</string>
|
||||
<string name="extended_details">Pliaj detaloj</string>
|
||||
<string name="bottom_actions">Malsupraj akcioj</string>
|
||||
<string name="manage_bottom_actions">Administri videblajn malsuprajn akciojn</string>
|
||||
<string name="failed_to_load_media">Malsukceso de ŝargi aŭdvidaĵo.</string>
|
||||
<string name="file_is_malformed_or_corrupted">La dosiero estas misformita aŭ difektita.</string>
|
||||
<string name="media_exceeds_device_capabilities">La aŭdvidaĵo superas la kapablojn de la aparato.</string>
|
||||
<string name="unsupported_format">Nesubtenita dosiertipo.</string>
|
||||
<string name="media_only">Nur aŭdvidaĵoj</string>
|
||||
<string name="media_management_manual">Io malĝustas. Bonvolu iri al viaj aparataj Agordoj - Aplikaĵoj - Specialaj permesoj de aplikaĵoj - Aplikaĵoj de administrado de aŭdvidaĵoj kaj permesi, ke tiu ĉi aplikaĵo administru aŭdvidaĵojn.</string>
|
||||
<string name="alternative_media_access">Alia, vi povas permesi atingon nur al aŭdvidaĵaj dosieroj. Tiukaze, vi tamen ne povos interagi kun kaŝitaj dosieroj.</string>
|
||||
<string name="search_all_files">Serĉi ĉiujn dosierojn anstataŭ dosierujojn je la ĉefekrano</string>
|
||||
<string name="show_all_folders">Montri menubutonon por rapide baskuligi \"Montri enhavon de ĉiuj dosierujoj\"</string>
|
||||
<string name="toggle_file_visibility">Baskuligi videblecon de dosieroj</string>
|
||||
<string name="faq_1_title">Kiel mi povas igi Fossify Galerio la defaŭlta aparata galerio?</string>
|
||||
<string name="media_management_alternative">Se vi ne volas tion fari, vi ankaŭ povus iri al viaj aparataj Agordoj - Aplikaĵoj - Specialaj permesoj de aplikaĵoj - Aplikaĵoj de administrado de aŭdvidaĵoj kaj permesi, ke tiu ĉi aplikaĵo administru aŭdvidaĵoj.</string>
|
||||
<string name="fullscreen_media">Plenekranaj aŭdvidaĵoj</string>
|
||||
<string name="faq_2_title">Mi ŝlosis la aplikaĵon per pasvorto, sed mi forgesis ĝin. Kion mi povas fari?</string>
|
||||
<string name="faq_1_text">Unue, vi devas trovi la aktualan defaŭltan galerion en la sekcio de aplikaĵoj de viaj aparataj agordoj. Serĉu butonon kiu ion diras kiel \"Malfermi defaŭlte\", alklaku ĝin, kaj elektu \"Forviŝi defaŭltojn\". La sekvan fojon, ke vi provas malfermi bildon aŭ filmeton, vi devus vidi elektilon de aplikaĵoj kie vi povas elekti Fossify Galerio kaj igi ĝin la defaŭlta aplikaĵo.</string>
|
||||
<string name="faq_4_title">Kiel mi povas plirapidigi filmetojn?</string>
|
||||
<string name="faq_3_title">Kiel mi povas igi, ke albumo ĉiam aperu je la supro?</string>
|
||||
<string name="faq_3_text">Vi povas longe premi la deziratan albumon kaj elekti la pinglan bildsimbolon en la meno de akcioj por alpingli ĝin al la supro. Ankaŭ eblas alpingli plurajn dosierujoj, kaj la alpinglitaj elementoj estos ordigitaj laŭ la defaŭlta ordigoreĝimo.</string>
|
||||
<string name="faq_2_text">Estas du eblaj solvoj. Aŭ vi povas reinstali la aplikaĵon, aŭ vi povas trovi la aplikaĵon en viaj aparataj agordoj aj elekti \"forviŝi datumojn\". Tio rekomencigos ĉiujn viajn agordojn sen forigi iun ajn dosieron.</string>
|
||||
<string name="faq_4_text">Vi povas aŭ duoble frapeti la flankon de la ekrano aŭ frapeti la tekston de aktuala aŭ maksimuma daŭroj proksime de la serĉobreto. Se vi ŝaltas la malfermadon de filmetoj en alia ekrano en la aplikaĵaj agordoj, vi ankaŭ povas uzi horizontalajn moviĝojn.</string>
|
||||
<string name="faq_10_title">Ĉu mi povas tondi bildojn helpe de tiu ĉi aplikaĵo?</string>
|
||||
<string name="faq_11_text">Kompreneble, nur uzi la opcion \"Grupigi laŭ\" en la bildeta vido. Eblas grupigi dosierojn laŭ pluraj kriterioj kiel prenodato. Se vi uzas la funkcion \"Montri enhavon de ĉiuj dosierujoj\", vi ankaŭ povas grupigi ilin laŭ dosierujoj.</string>
|
||||
<string name="faq_5_title">Kio estas la diferenco inter kaŝi kaj ekskluzivi dosierujon?</string>
|
||||
<string name="faq_13_text">La nuna solvo por montri bildojn kutime funkcias bone, sed se vi volas eĉ pli bonan kvaliton de bildoj, vi povas ŝalti \"Montri bildojn kun laŭeble plej alta kvalito\" en la aplikaĵaj agordoj en la sekcio \"Profunde zomeblaj bildoj\".</string>
|
||||
<string name="faq_7_title">Dosierujo kun bildoj ne aperas aŭ ne montras ĉiujn bildojn. Kion mi povas fari?</string>
|
||||
<string name="faq_8_title">Kion mi faras se mi nur volas, ke kelkaj specifaj dosierujoj aperu?</string>
|
||||
<string name="faq_6_text">Eblas, ke kelkaj nekutimaj albumoj aperas. Vi povas facile ekskluzivi ilin per longe premi ilin kaj elekti Ekskluzivi. Tiam vi povas elekti la patran dosierujon, kaj tio ankaŭ verŝajne evitos, ke aliaj rilataj albumoj aperu.</string>
|
||||
<string name="faq_6_title">Kial aperas dosierujoj kun albumartoj aŭ glumarkoj?</string>
|
||||
<string name="faq_5_text">Ekskluzivi evitas montri la dosierujon nur en Fossify Galerio, kaj kaŝi funkcias tutsisteme por ankaŭ kaŝi la dosierujon el aliaj galerioj. Ĝi tion faras per krei malplenan dosieron \".nomedia\" en la dosierujo, kiun oni ankaŭ povas forigi per iu ajn dosieradministrilo. Rimarku, ke kelkaj aparatoj ne permesas kaŝi dosierujojn kiel Kamerao, Ekrankopioj kaj Elŝutoj.</string>
|
||||
<string name="faq_10_text">Jes, vi povas tondi bildojn en la redaktilo per treni la angulojn de la bildo. Vi povas atingi la redaktilon per aŭ longe premi bildeton kaj elekti Redakti aŭ elekti Redakti el la plenekrana vido.</string>
|
||||
<string name="faq_7_text">Estas pluraj eblaj kaŭzoj, sed facilas solvi ĝin. Nur iru al Agordoj -> Administri inkluzivitajn dosierujojn, frapetu la + kaj iru al la dezirata dosierujo.</string>
|
||||
<string name="faq_11_title">Ĉu eblas iel grupigi bildetojn de aŭdvidaĵaj dosierujoj?</string>
|
||||
<string name="faq_12_title">Ordigi laŭ prenodato ne ŝajnas ĝuste funkcii. Kiel mi povas tion korekti?</string>
|
||||
<string name="faq_8_text">Aldoni dosierujon al la inkluzivitaj dosierujoj nenion ajn aŭtomate ekskluzivas. Tio kion vi povas fari estas iri al Agordoj -> Administri ekskluzivitajn dosierujojn, ekskluzivi la radikan dosierujon \"/\" kaj aldoni la deziratajn dosierujojn je Agordoj -> Administri inkluzivitajn dosierujojn. Tiel, nur la elektitaj dosierujoj videblos, ĉar ekskluzivi kaj inkluzivi estas rikuraj, kaj dosierujoj kiuj estas samtempe ekskluzivitaj kaj inkluzivitaj aperas en la aplikaĵo.</string>
|
||||
<string name="faq_13_title">Mi vidas striojn de koloroj en la bildoj. Kiel mi povas plibonigi la kvaliton?</string>
|
||||
<string name="faq_12_text">Verŝajne estas ĉar la dosieroj estis kopiitaj el alia loko. Vi povas tion korekti per elekti la bildetojn de la dosieroj kaj elekti \"Korekti prenodaton\".</string>
|
||||
<string name="faq_14_title">Mi kaŝis dosier(uj)on. Kiel mi povas malkaŝi ĝin?</string>
|
||||
<string name="faq_14_text">Vi povas aŭ elekti \"Dume montri kaŝitajn elementojn\" je la ĉefekrano aŭ baskuligi \"Montri kaŝitajn elementojn\" en la aplikaĵaj agordoj por vidi la kaŝitan elementon. Se vi volas malkaŝi ĝin, nur longe premu ĝin kaj elektu \"Malkaŝi\". Dosierujoj estas kaŝitaj per aldoni kaŝitan dosieron \".nomedia\" al ili, do vi ankaŭ povus forigi tiun dosieron helpe de iu ajn dosieradministrilo. Tamen rimarku, ke la kaŝado estas rikura, do se vi kaŝas dosierujon, ĉiuj subdosierujoj ankaŭ estos kaŝitaj. Do, por malkaŝi subdosierujojn, endas malkaŝi la patran dosierujon.</string>
|
||||
<string name="faq_15_text">La aplikaĵa kaŝmemoro povas okupi ĝis 250 MB por ebligi pli rapidan ŝargadon de bildoj. Se la aplikaĵo okupas eĉ pli da spaco, verŝajne estas pro elementoj en la rubujo. Tiuj dosieroj estas inkluzivitaj en la grandeco de la aplikaĵo. Vi povas forviŝi la rubujon per malfermi ĝin kaj forigi ĉiujn dosierojn aŭ el la aplikaĵaj agordoj. Ĉiu dosiero en la rubujo estas aŭtomate forigita post 30 tagoj.</string>
|
||||
<string name="faq_15_title">Kial la aplikaĵo okupas tiom da spaco?</string>
|
||||
<string name="faq_17_text">Tio ankaŭ ĉesis funkcii pro la sistemaj ŝanĝoj de Android 11. La aplikaĵo ne plu kapablas atingi verajn dosierujojn, sed dependas de la nomata MediaStore por ricevi datumojn.</string>
|
||||
<string name="faq_16_text_extra">Aŭ vi povas koncedi al tiu ĉi galerio atingon al ĉiuj dosieroj per viaj aparataj agordoj, kiu permesos al ni montri kaŝitajn elementojn kaj pli ĝenerale igos pli fidebla dosierajn operaciojn.</string>
|
||||
<string name="faq_16_title">Kio okazis al la kaŝado de dosier(uj)oj kaj kial mi ne plu povas vidi kaŝitajn elementojn?</string>
|
||||
<string name="faq_16_text">Ekde Android 11, pro sistemaj limigoj, ne plu eblas (mal)kaŝi dosier(uj)ojn aŭ vidi kaŝitajn elementojn en galeriaj aplikaĵoj. Por tio endos iu dosieradministrilo.</string>
|
||||
<string name="faq_17_title">Kial mi ne plu povas inkluzivi mankantajn dosierujojn?</string>
|
||||
<string name="faq_18_title">Kial mi vidas reklamojn dum la legado de filmetoj?</string>
|
||||
<string name="faq_18_text">Niaj aplikaĵoj enhavas neniun ajn reklamon. Se vi vidas reklamojn dum la legado de filmetoj, tio devas signifi, ke vi uzas la legilon de iu alia aplikaĵo. Provu trovi vian defaŭltan legilon de filmetoj en la aparataj agordoj kaj elekti \"Forviŝi defaŭltojn\". La sekva fojo, ke vi malfermos iun filmeton, vi vidos elektilon de aplikaĵoj kie vi povas elekti la aplikaĵon kiun vi volas uzi.</string>
|
||||
</resources>
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
<string name="app_launcher_name">Galería</string>
|
||||
<string name="edit">Editar</string>
|
||||
<string name="open_camera">Abrir la cámara</string>
|
||||
<string name="hidden">(Oculto)</string>
|
||||
<string name="hidden">(oculto)</string>
|
||||
<string name="excluded">(no incluido)</string>
|
||||
<string name="pin_folder">Fijar carpeta</string>
|
||||
<string name="unpin_folder">No fijar carpeta</string>
|
||||
|
@ -22,7 +22,7 @@
|
|||
<string name="force_portrait">Forzar retrato</string>
|
||||
<string name="force_landscape">Forzar paisaje</string>
|
||||
<string name="use_default_orientation">Usar la orientación por defecto</string>
|
||||
<string name="fix_date_taken">Fijar la fecha toma</string>
|
||||
<string name="fix_date_taken">Arreglar fecha de la toma</string>
|
||||
<string name="fixing">Fijando…</string>
|
||||
<string name="dates_fixed_successfully">Fecha fijada correctamente</string>
|
||||
<string name="no_date_takens_found">No se han encontrado valores de fechas tomadas</string>
|
||||
|
@ -196,9 +196,9 @@
|
|||
<string name="paths_imported_successfully">Rutas importadas correctamente</string>
|
||||
<string name="media_management_prompt">Para asegurarse de que todas las operaciones en ficheros funcionan de forma segura, por favor haga esta aplicación una aplicación de manejo de medios en los ajustes de su dispositivo.</string>
|
||||
<string name="password_protect_excluded">Proteger con contraseña la visibilidad de las carpetas excluidas</string>
|
||||
<string name="media_management_manual">Algo ha ido mal, por favor vaya a los Ajustes de su dispositivo - Aplicaciones - Acceso a aplicaciones especiales - Aplicaciones de gestión de medios y permita que esta aplicación gestione los medios.</string>
|
||||
<string name="media_management_note">Si la redirección no funciona, ve a los Ajustes de tu dispositivo - Aplicaciones - Acceso a aplicaciones especiales - Aplicaciones de gestión de medios y permite que esta aplicación gestione los medios.</string>
|
||||
<string name="media_management_alternative">Si no quieres hacerlo, también puedes ir a los Ajustes de tu dispositivo - Aplicaciones - Acceso a aplicaciones especiales - Aplicaciones de gestión de medios y permitir que esta aplicación gestione los medios.</string>
|
||||
<string name="media_management_manual">Algo ha ido mal, por favor vaya a los Ajustes de su dispositivo - Aplicaciones - Acceso especial de aplicaciones - Aplicaciones de gestión de multimedia y permita que esta aplicación gestione los medios.</string>
|
||||
<string name="media_management_note">Si la redirección no funciona, ve a los Ajustes de tu dispositivo - Aplicaciones - Acceso especial de aplicaciones - Aplicaciones de gestión de multimedia y permite que esta aplicación gestione los medios.</string>
|
||||
<string name="media_management_alternative">Si no quieres hacerlo, también puedes ir a los Ajustes de tu dispositivo - Aplicaciones - Acceso especial de aplicaciones - Aplicaciones de gestión de multimedia y permitir que esta aplicación gestione los medios.</string>
|
||||
<string name="alternative_media_access">Alternativamente, puede permitir el acceso a los archivos multimedia solamente. Sin embargo, en ese caso no podrá trabajar con los archivos ocultos.</string>
|
||||
<string name="media_only">Sólo archivos multimedia</string>
|
||||
<string name="all_files">Todos los archivos</string>
|
||||
|
@ -229,7 +229,7 @@
|
|||
<string name="faq_11_title">¿Puedo de alguna manera agrupar miniaturas de archivos multimedia\?</string>
|
||||
<string name="faq_11_text">Claro, solo use el elemento de menú \"Agrupar por \" mientras esté en la vista de miniaturas. Puede agrupar archivos según varios criterios, incluida la Fecha de toma. Si usa la función \"Mostrar todo el contenido de las carpetas\" también puede agruparlas por carpetas.</string>
|
||||
<string name="faq_12_title">La ordenación por fecha tomada no parece funcionar correctamente, ¿cómo puedo solucionarlo\?</string>
|
||||
<string name="faq_12_text">Lo más probable es que sea causado por los archivos que se copian de algún lugar. Puede solucionarlo seleccionando las miniaturas de archivo y seleccionando \"Fijar fecha de toma\".</string>
|
||||
<string name="faq_12_text">Lo más probable es que sea causado por los archivos que se copian de algún lugar. Puedes arreglarlo seleccionando las miniaturas de archivo y seleccionando \"Arreglar fecha de la toma\".</string>
|
||||
<string name="faq_13_title">Veo algunas bandas de color en las imágenes. ¿Cómo puedo mejorar la calidad\?</string>
|
||||
<string name="faq_13_text">La solución actual para mostrar imágenes funciona bien en la gran mayoría de los casos, pero si desea una calidad de imagen aún mejor, puede habilitar \"Mostrar imágenes con la mayor calidad posible\" en la configuración de la aplicación, en la sección \"Imágenes ampliables con zoom\".</string>
|
||||
<string name="faq_14_title">He ocultado un archivo/carpeta. ¿Cómo puedo desocultarlo\?</string>
|
||||
|
@ -255,4 +255,7 @@
|
|||
<string name="full_storage_permission_required">La galería de Fossify necesita acceso total para mostrar todas tus fotos y videos. Ve a Configuración > Permisos > Fotos y videos > Permitir todo.</string>
|
||||
<string name="playback_speed">Velocidad de reproducción</string>
|
||||
<string name="failed_to_load_media">Error al cargar el medio.</string>
|
||||
</resources>
|
||||
<string name="media_exceeds_device_capabilities">Los medios superan las capacidades del dispositivo.</string>
|
||||
<string name="file_is_malformed_or_corrupted">El archivo está malformado o dañado.</string>
|
||||
<string name="unsupported_format">Formato no soportado.</string>
|
||||
</resources>
|
||||
|
|
|
@ -227,7 +227,7 @@
|
|||
<string name="faq_10_title">Kas ma saan selle rakendusega pilte kärpida\?</string>
|
||||
<string name="faq_10_text">Jah, sa saad pilte redaktoris kärpida, lohistades pildi nurki. Redaktorisse pääseb, kui vajutate pikalt pildi pisipildile ja valite käsu Edit või valite täisekraani vaates käsu Edit.</string>
|
||||
<string name="faq_11_title">Kas ma saan kuidagi rühmitada meediafailide pisipilte\?</string>
|
||||
<string name="faq_11_text">Muidugi, kasutage pisipiltide vaates lihtsalt menüüelementi \"Group by\". Saate grupeerida faile mitme kriteeriumi, sealhulgas pildistamise kuupäeva järgi. Kui kasutate funktsiooni \"Show all folders content\" saate neid kaustade järgi rühmitada.</string>
|
||||
<string name="faq_11_text">Muidugi, kasuta pisipiltide vaates lihtsalt menüüvalikut „Rühmituse alus“. Saad grupeerida faile mitme kriteeriumi, sealhulgas pildistamise kuupäeva järgi. Kui kasutad funktsiooni „Näita kõikide kaustade sisu“ saad neid kaustade järgi rühmitada.</string>
|
||||
<string name="faq_12_title">Sorteerimine võetud kuupäeva järgi ei tundu korralikult toimivat, kuidas seda parandada\?</string>
|
||||
<string name="faq_12_text">Tõenäoliselt on selle põhjuseks kuskilt kopeeritud failid. Saate selle parandada, valides faili pisipildid ja valides \"Fix Date Taken väärtus\".</string>
|
||||
<string name="faq_13_title">Ma näen piltidel mõningaid värviribasid. Kuidas ma saan kvaliteeti parandada\?</string>
|
||||
|
@ -254,4 +254,7 @@
|
|||
<string name="full_storage_permission_required">Fossify Galerii vajab kõikide sinu fotode ja videote näitamiseks täisõigusi. Ava Seadistused > Õigused > Fotod ja videod > Luba kõik.</string>
|
||||
<string name="playback_speed">Taasesituse kiirus</string>
|
||||
<string name="failed_to_load_media">Meedia laadimine ei õnnestunud.</string>
|
||||
<string name="media_exceeds_device_capabilities">Meedia ületab selle seadme suutlikkuse.</string>
|
||||
<string name="unsupported_format">Vorming pole toetatud.</string>
|
||||
<string name="file_is_malformed_or_corrupted">Fail on kas vigasena loodud või hiljem katki läinud.</string>
|
||||
</resources>
|
|
@ -254,4 +254,7 @@
|
|||
<string name="full_storage_permission_required">Fossify Galeriak baimen guztiak behar ditu zure argazki eta bideo guztiak erakusteko. Joan Ezarpenak > Baimenak > Argazki eta bideaok > Baimendu guztia aukerara.</string>
|
||||
<string name="failed_to_load_media">Errorea gertatu da fitxategia kargatzean.</string>
|
||||
<string name="playback_speed">Jotzeko abiadura</string>
|
||||
<string name="file_is_malformed_or_corrupted">Fitxategia ez da zuzena edo kaltetuta dago.</string>
|
||||
<string name="media_exceeds_device_capabilities">Mediek gailuaren ezaugarriak gainditzen dituzte.</string>
|
||||
<string name="unsupported_format">Fitxategi ezin da erakutsi.</string>
|
||||
</resources>
|
|
@ -244,4 +244,7 @@
|
|||
<string name="faq_18_title">Miksi näen mainoksia videon toiston aikana\?</string>
|
||||
<string name="faq_18_text">Sovelluksissamme ei ole lainkaan mainoksia. Jos näet niitä videon toiston aikana, sinun täytyy käyttää jotain muuta sovellusta videosoittimena. Yritä etsiä oletusarvoinen videosoittimesi laitteen asetuksista ja tee sitten ”Tyhjenä oletusasetukset” sille. Seuraavan kerran, kun kutsut jonkin videon aikomuksen, näet sovelluksen valintakehotuksen, jossa voit valita, mitä sovellusta haluat käyttää.</string>
|
||||
<string name="wallpaper">Taustakuva</string>
|
||||
<string name="playback_speed">Toistonopeus</string>
|
||||
<string name="failed_to_load_media">Median lataus epäonnistui.</string>
|
||||
<string name="file_is_malformed_or_corrupted">Tiedosto on epäkelpo tai korruptoitunut.</string>
|
||||
</resources>
|
|
@ -197,9 +197,9 @@
|
|||
<string name="paths_imported_successfully">Favoris importés</string>
|
||||
<string name="media_management_prompt">Pour vous assurer que toutes les opérations de fichiers fonctionnent de manière fiable, veuillez faire de cette application l\'application de gestion des médias dans les paramètres de votre appareil.</string>
|
||||
<string name="password_protect_excluded">Protection par mot de passe de la visibilité des dossiers exclus</string>
|
||||
<string name="media_management_manual">Quelque chose s\'est mal passé, veuillez aller dans les paramètres de votre appareil - Applis - Accès aux applications spéciales - Applis de gestion des médias et autorisez cette application à gérer les médias.</string>
|
||||
<string name="media_management_note">Si la redirection ne fonctionne pas, allez dans les paramètres de votre appareil - Applis - Accès aux applications spéciales - Applis de gestion des médias et autorisez cette application à gérer les médias.</string>
|
||||
<string name="media_management_alternative">Si vous ne voulez pas le faire, vous pouvez aussi aller dans les Paramètres de votre appareil - Applis - Accès aux applications spéciales - Applis de gestion des médias et autoriser cette application à gérer les médias.</string>
|
||||
<string name="media_management_manual">Quelque chose s\'est mal passé, veuillez aller dans les paramètres de votre appareil - Applis - Accès spécial des applis - Applis de gestion des fichiers multimédias et autorisez cette application à gérer les médias.</string>
|
||||
<string name="media_management_note">Si la redirection ne fonctionne pas, allez dans les paramètres de votre appareil - Applis - Accès spécial des applis - Applis de gestion des fichiers multimédias et autorisez cette application à gérer les médias.</string>
|
||||
<string name="media_management_alternative">Si vous ne voulez pas le faire, vous pouvez aussi aller dans les Paramètres de votre appareil - Applis - Accès spécial des applis - Applis de gestion des fichiers multimédias et autoriser cette application à gérer les médias.</string>
|
||||
<string name="alternative_media_access">Vous pouvez également n\'autoriser que l\'accès aux fichiers multimédias. Dans ce cas, vous ne pourrez cependant pas travailler avec les fichiers cachés.</string>
|
||||
<string name="media_only">Médias uniquement</string>
|
||||
<string name="all_files">Tous les fichiers</string>
|
||||
|
@ -213,7 +213,7 @@
|
|||
<string name="toggle_favorite">Activer/désactiver le favori</string>
|
||||
<string name="toggle_file_visibility">Visibilité du fichier</string>
|
||||
<string name="faq_1_title">Comment puis-je faire de Fossify Gallery la galerie par défaut ?</string>
|
||||
<string name="faq_1_text">D\'abord, vous devez trouver la galerie actuellement par défaut dans la section Applis de vos paramètres de périphérique, cherchez un bouton qui dit quelque chose comme « Ouvrir par défaut », cliquez dessus, puis sélectionnez « Par défaut de clavier ». La prochaine fois que vous tenterez d\'ouvrir une image ou une vidéo, vous devriez voir un récupérateur d\'application, où vous pouvez sélectionner Fossify Gallery et en faire l\'application par défaut.</string>
|
||||
<string name="faq_1_text">D\'abord, vous devez trouver la galerie actuellement par défaut dans la section Applications de vos paramètres de périphérique, cherchez un bouton qui dit quelque chose comme \"Ouvrir par défaut\", cliquez dessus, puis sélectionnez \"Effacer les valeurs par défaut\". La prochaine fois que vous tenterez d\'ouvrir une image ou une vidéo, vous devriez voir apparaître un sélecteur d\'application, où vous pouvez sélectionner Fossify Gallery et en faire l\'application par défaut.</string>
|
||||
<string name="faq_2_title">J\'ai verrouillé l\'application avec un mot de passe et je ne m\'en rappelle plus. Que faire \?</string>
|
||||
<string name="faq_2_text">Il y a deux façons de procéder. Soit vous réinstallez l\'application, soit vous recherchez l\'application dans les paramètres de l\'appareil et appuyez sur "Supprimer les données". Ceci réinitialisera seulement les paramètres de l\'application et ne supprimera pas vos fichiers.</string>
|
||||
<string name="faq_3_title">Comment faire pour qu\'un dossier soit toujours affiché tout en haut \?</string>
|
||||
|
@ -221,7 +221,7 @@
|
|||
<string name="faq_4_title">Comment avancer rapidement dans les vidéos \?</string>
|
||||
<string name="faq_4_text">Appuyez deux fois sur le côté de l\'écran, ou appuyez sur la valeur de durée actuelle ou maximale près de la barre de recherche. Si vous activez l\'ouverture des vidéos sur un écran séparé dans les paramètres de l\'application, vous pouvez également utiliser des gestes horizontaux.</string>
|
||||
<string name="faq_5_title">Quelle est la différence entre le masquage et l\'exclusion d\'un dossier ?</string>
|
||||
<string name="faq_5_text">Exclure empêche l\'affichage du dossier seulement dans la galerie Fossify, tandis que Masquer fonctionne selon le système et il cache le dossier d\'autres galeries aussi. Il fonctionne en créant un fichier vide « .nomedia » dans le dossier donné, que vous pouvez ensuite supprimer avec n\'importe quel gestionnaire de fichier aussi. Notez que certains appareils ne permettent pas de cacher des dossiers comme Appareil photo, Captures d\'écran et Téléchargements.</string>
|
||||
<string name="faq_5_text">Exclure empêche l\'affichage du dossier seulement dans la galerie Fossify, tandis que Masquer fonctionne selon le système et cache le dossier d\'autres galeries également. Il fonctionne en créant un fichier vide \".nomedia\" dans le dossier donné, que vous pouvez ensuite supprimer avec n\'importe quel gestionnaire de fichier aussi. Notez que certains appareils ne permettent pas de cacher des dossiers comme Appareil photo, Captures d\'écran et Téléchargements.</string>
|
||||
<string name="faq_6_title">Pourquoi des dossiers avec des pochettes d\'albums musicaux ou des miniatures d\'images sont affichés ?</string>
|
||||
<string name="faq_6_text">Il est possible que des dossiers qui ne devraient pas être affichés le soient. Vous pouvez les exclure facilement en les sélectionnant par un appui prolongé, puis en choisissant l\'option "Exclure le dossier", après quoi vous pouvez aussi sélectionner le dossier parent, ce qui devrait éviter l\'apparition de dossiers similaires.</string>
|
||||
<string name="faq_7_title">Un dossier avec des images n\'apparaît pas. Que faire \?</string>
|
||||
|
@ -252,4 +252,10 @@
|
|||
<string name="portraits">Portraits</string>
|
||||
<string name="by_extension">Extension</string>
|
||||
<string name="animation">Animation</string>
|
||||
</resources>
|
||||
<string name="full_storage_permission_required">La Galerie Fossify a besoin d\'un accès complet pour afficher toutes vos photos et vidéos. Allez dans Paramètres > Autorisations > Photos et vidéos > Autoriser tout.</string>
|
||||
<string name="file_is_malformed_or_corrupted">Le fichier est altéré ou corrompu.</string>
|
||||
<string name="media_exceeds_device_capabilities">Le support dépasse les capacités de l\'appareil.</string>
|
||||
<string name="unsupported_format">Format non pris en charge.</string>
|
||||
<string name="playback_speed">Vitesse de lecture</string>
|
||||
<string name="failed_to_load_media">Échec de chargement du média.</string>
|
||||
</resources>
|
||||
|
|
259
app/src/main/res/values-ga/strings.xml
Normal file
259
app/src/main/res/values-ga/strings.xml
Normal file
|
@ -0,0 +1,259 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="other_folder">Fillteán eile</string>
|
||||
<string name="show_on_map">Taispeáin ar an léarscáil</string>
|
||||
<string name="unknown_location">Suíomh anaithnid</string>
|
||||
<string name="unset_as_default_folder">Díshocraigh mar fhillteán réamhshocraithe</string>
|
||||
<string name="reorder_by_dragging">Athordaigh fillteáin trí tharraingt</string>
|
||||
<string name="reorder_by_dragging_pro">Athordaigh fillteáin trí tharraingt (Pro)</string>
|
||||
<string name="full_storage_permission_required">Teastaíonn rochtain iomlán ó Ghailearaí Fossify chun do ghrianghraif agus físeáin go léir a thaispeáint. Téigh go Socruithe > Ceadanna > Grianghraif agus físeáin > Ceadaigh gach rud.</string>
|
||||
<string name="change_filters_underlined"><u>Athraigh na scagairí</u></string>
|
||||
<string name="exclude_folder_parent">Tuismitheoir a eisiamh ina ionad?</string>
|
||||
<string name="excluded_activity_placeholder">Gan fillteáin a áireamh, beidh siad mar aon lena bhfofhillteáin i bhfolach díreach i nGailearaí Fossify, beidh siad fós le feiceáil in iarratais eile.\n\nMás mian leat iad a cheilt ó fheidhmchláir eile freisin, bain úsáid as an bhfeidhm Folaigh.</string>
|
||||
<string name="hidden_folders">Fillteáin fholaithe</string>
|
||||
<string name="height">Airde</string>
|
||||
<string name="keep_aspect_ratio">Coinnigh cóimheas treoíochta</string>
|
||||
<plurals name="failed_to_resize_images">
|
||||
<item quantity="one">Theip ar athrú méide %d íomhá</item>
|
||||
<item quantity="two">Theip ar athrú méide %d íomhánna</item>
|
||||
<item quantity="few">Theip ar athrú méide %d íomhánna</item>
|
||||
<item quantity="many">Theip ar athrú méide %d íomhánna</item>
|
||||
<item quantity="other">Theip ar athrú méide %d íomhánna</item>
|
||||
</plurals>
|
||||
<string name="basic_editor">Eagarthóir Bunúsach</string>
|
||||
<string name="advanced_editor">Ard-Eagarthóir</string>
|
||||
<string name="rotate">Rothlaigh</string>
|
||||
<string name="invalid_image_path">Conair neamhbhailí íomhá</string>
|
||||
<string name="invalid_video_path">Conair neamhbhailí físe</string>
|
||||
<string name="video_editing_cancelled">Eagarthóireacht físe curtha ar ceal</string>
|
||||
<string name="file_edited_successfully">D\' éirigh le heagarthóireachta an chomhaid</string>
|
||||
<string name="image_edited_successfully">D\' éirigh le híomhá a chur in eagar</string>
|
||||
<string name="rotate_left">Rothlaigh ar chlé</string>
|
||||
<string name="rotate_right">Rothlaigh ar dheis</string>
|
||||
<string name="animation">Beochan</string>
|
||||
<string name="no_animation">Ceann ar bith</string>
|
||||
<string name="group_direct_subfolders">Fofhillteáin dhíreacha grúpa</string>
|
||||
<string name="group_by">Grúpa de réir</string>
|
||||
<string name="screen_rotation_device_rotation">Rothlú an ghléis</string>
|
||||
<string name="screen_rotation_aspect_ratio">Cóimheas treoíochta</string>
|
||||
<string name="show_notch">Taispeáin nóta má tá sé ar fáil</string>
|
||||
<string name="square">Cearnóg</string>
|
||||
<string name="media_management_prompt">Chun a chinntiú go n-oibríonn gach oibríocht comhad go hiontaofa, déan feidhmchlár bainistíochta Meán den aip seo i socruithe do ghléis.</string>
|
||||
<string name="failed_to_load_media">Theip ar luchtú na meán.</string>
|
||||
<string name="faq_2_text">Is féidir leat é a réiteach ar bhealaí 2. Is féidir leat an feidhmchlár a athshuiteáil, nó an aip a aimsiú i socruithe do ghléis agus \"Glan sonraí\" a roghnú. Athshocróidh sé do shocruithe go léir, ní bhainfidh sé aon chomhaid meán.</string>
|
||||
<string name="faq_8_title">Cad a tharlaíonn más mian liom ach cúpla fillteán ar leith le feiceáil?</string>
|
||||
<string name="faq_10_title">An féidir liom íomhánna a bharrú leis an aip seo?</string>
|
||||
<string name="faq_7_text">Is féidir go mbeadh cúiseanna éagsúla leis sin, ach tá sé éasca é a réiteach. Just dul i Socruithe -> Bainistigh Fillteáin Áirithe, roghnaigh Plus agus nascleanúint chuig an bhfillteán riachtanach.</string>
|
||||
<string name="faq_10_text">Sea, is féidir leat íomhánna barr san eagarthóir, trí na coirnéil íomhá a tharraingt. Is féidir leat dul chuig an eagarthóir trí mhionsamhail íomhá a bhrú le fada agus Edit a roghnú, nó Edit a roghnú ón amharc lánscáileáin.</string>
|
||||
<string name="faq_13_text">Oibríonn an réiteach reatha chun íomhánna a thaispeáint go breá i bhformhór mór na gcásanna, ach más mian leat cáilíocht íomhá níos fearr fós, is féidir leat an \"Taispeáin íomhánna sa chaighdeán is airde is féidir\" a chumasú ag socruithe an fheidhmchláir, sa rannán \"Íomhánna domhain zúmáilte\".</string>
|
||||
<string name="faq_14_title">Tá comhad/fillteán curtha i bhfolach agam. Conas is féidir liom é a unhide?</string>
|
||||
<string name="faq_15_title">Cén fáth a dtógann an aip an oiread sin spáis?</string>
|
||||
<string name="faq_18_text">Níl aon fhógraí ar bith ag ár n-aipeanna. Má fheiceann tú iad le linn athsheinm físe, ní mór duit a bheith ag baint úsáide as roinnt seinnteoir físe apps eile. Bain triail as do sheinnteoir físe réamhshocraithe a aimsiú i socruithe an ghléis, ansin déan \"Réamhshocruithe soiléire\" air. An chéad uair eile a agraíonn tú roinnt rún físe feicfidh tú leid roghnóir feidhmchláir, áit ar féidir leat an aip is mian leat a úsáid a roghnú.</string>
|
||||
<string name="open_camera">Oscail ceamara</string>
|
||||
<string name="hidden">(folaithe)</string>
|
||||
<string name="app_launcher_name">Gailearaí</string>
|
||||
<string name="edit">Cuir in eagar</string>
|
||||
<string name="excluded">(eisiata)</string>
|
||||
<string name="pin_folder">Fillteán bioráin</string>
|
||||
<string name="unpin_folder">Díphionnáil fillteán</string>
|
||||
<string name="pin_to_the_top">Bioráin go dtí an barr</string>
|
||||
<string name="show_all">Taispeáin inneachar gach fillteáin</string>
|
||||
<string name="all_folders">Gach fillteán</string>
|
||||
<string name="folder_view">Athraigh go hamharc an fhillteáin</string>
|
||||
<string name="volume">Imleabhar</string>
|
||||
<string name="brightness">Gile</string>
|
||||
<string name="lock_orientation">Cuir treoshuíomh faoi ghlas</string>
|
||||
<string name="unlock_orientation">Díghlasáil treoshuíomh</string>
|
||||
<string name="change_orientation">Athraigh treoshuíomh</string>
|
||||
<string name="force_portrait">Fórsáil portráid</string>
|
||||
<string name="force_landscape">Fórsa tírdhreach</string>
|
||||
<string name="use_default_orientation">Úsáid treoshuíomh réamhshocraithe</string>
|
||||
<string name="fixing">Ag socrú…</string>
|
||||
<string name="dates_fixed_successfully">Dátaí socraithe go rathúil</string>
|
||||
<string name="no_date_takens_found">Gan Dáta Aimsíodh luachanna glactha</string>
|
||||
<string name="fix_date_taken">Deisigh Dáta Luach glactha</string>
|
||||
<string name="share_resized">Comhroinn leagan athraithe</string>
|
||||
<string name="switch_to_file_search">Athraigh go cuardach comhad i ngach fillteán infheicthe</string>
|
||||
<string name="set_as_default_folder">Socraigh mar fhillteán réamhshocraithe</string>
|
||||
<string name="restore_to_path">Ag aischur go \'%s\'</string>
|
||||
<string name="filter_media">Scag meáin</string>
|
||||
<string name="images">Íomhánna</string>
|
||||
<string name="videos">Físeáin</string>
|
||||
<string name="gifs">GIFanna</string>
|
||||
<string name="raw_images">Íomhánna RAW</string>
|
||||
<string name="svgs">SVGanna</string>
|
||||
<string name="portraits">Portráidí</string>
|
||||
<string name="no_media_with_filters">Níor aimsíodh aon chomhaid meán leis na scagairí roghnaithe.</string>
|
||||
<string name="exclude_folder_description">Ní fhágfaidh sé seo an roghnú mar aon lena fofhillteáin ó Ghailearaí Fossify amháin. Is féidir leat fillteáin eisiata a bhainistiú i Socruithe.</string>
|
||||
<string name="manage_hidden_folders">Bainistigh fillteáin fholaithe</string>
|
||||
<string name="hidden_folders_placeholder">Dealraíonn sé cosúil nach bhfuil aon fillteáin i bhfolach le comhad \".nomedia\".</string>
|
||||
<string name="hide_folder_description">Folaíonn an fheidhm seo an fillteán trí chomhad \'.nomedia\' a chur isteach ann, cuirfidh sé gach fofhillteán i bhfolach freisin. Is féidir leat iad a fheiceáil tríd an rogha \'Taispeáin míreanna folaithe\' a chlibeáil in Socruithe. Lean ar aghaidh?</string>
|
||||
<string name="hidden_all_files">Caithfidh tú rochtain a thabhairt don aip All Files chun comhaid fholaithe a fheiceáil, rud eile nach féidir leis oibriú.</string>
|
||||
<string name="cant_unhide_folder">Má tá ponc ag fillteán nó ceann dá mháthairfhillteáin roimh a ainm, tá sé i bhfolach agus ní féidir é a unhidden mar seo. Caithfidh tú an ponc a bhaint trí é a athainmniú.</string>
|
||||
<string name="include_folders">Fillteáin san áireamh</string>
|
||||
<string name="manage_included_folders">Bainistigh fillteáin san áireamh</string>
|
||||
<string name="add_folder">Cuir fillteán leis</string>
|
||||
<string name="included_activity_placeholder">Má tá roinnt fillteáin agat ina bhfuil meáin, ach nár aithin an aip iad, is féidir leat iad a chur leis de láimh anseo.\n\nMá chuirtear roinnt míreanna anseo, ní chuirfear aon fhillteán eile as an áireamh.</string>
|
||||
<string name="no_media_add_included">Níor aimsíodh aon chomhaid meán. Is féidir leat é a réiteach trí na fillteáin ina bhfuil comhaid meán a chur leis de láimh.</string>
|
||||
<string name="resize_and_save">Athraigh méid an roghnaithe agus sábháil</string>
|
||||
<string name="width">Leithead</string>
|
||||
<string name="invalid_values">Iontráil taifeach bailí le do thoil</string>
|
||||
<string name="resize_multiple_images">Athraigh méid na n-íomhánna iomadúla</string>
|
||||
<string name="resize_factor">Athraigh méid an fhachtóra</string>
|
||||
<string name="resize_factor_info">Athraigh méid na n-íomhánna go dtí an céatadán áirithe, ní mór luach a bheith laistigh de 10 agus 90.</string>
|
||||
<string name="resize_factor_error">Iontráil uimhir idir 10 agus 90</string>
|
||||
<string name="images_resized_successfully">D\' éirigh le híomhánna a athrú</string>
|
||||
<string name="editor">Eagarthóir</string>
|
||||
<string name="image_editing_failed">Theip ar eagarthóireacht íomhánna</string>
|
||||
<string name="video_editing_failed">Theip ar eagarthóireacht físe</string>
|
||||
<string name="image_editing_cancelled">Cealaíodh eagarthóireacht íomhánna</string>
|
||||
<string name="video_edited_successfully">D\' éirigh leis an bhfíseán a chur in eagar</string>
|
||||
<string name="edit_image_with">Cuir íomhá in eagar le:</string>
|
||||
<string name="edit_video_with">Cuir físeán in eagar le:</string>
|
||||
<string name="no_image_editor_found">Níor aimsíodh eagarthóir íomhá ar bith</string>
|
||||
<string name="no_video_editor_found">Níor aimsíodh eagarthóir físe ar bith</string>
|
||||
<string name="unknown_file_location">Suíomh anaithnid an chomhaid</string>
|
||||
<string name="error_saving_file">Níorbh fhéidir an comhad foinseach a fhorscríobh</string>
|
||||
<string name="rotate_one_eighty">Rothlaigh faoi 180º</string>
|
||||
<string name="transform">Trasfhoirmigh</string>
|
||||
<string name="crop">Bearr</string>
|
||||
<string name="draw">Tarraing</string>
|
||||
<string name="flip">Smeach</string>
|
||||
<string name="set_as_wallpaper">Socraigh mar Chúlbhrat</string>
|
||||
<string name="set_as_wallpaper_failed">Theip ar shocrú mar chúlbhrat</string>
|
||||
<string name="set_as_wallpaper_with">Socraigh mar pháipéar balla le:</string>
|
||||
<string name="setting_wallpaper">Cúlbhrat á shocrú…</string>
|
||||
<string name="flip_horizontally">Smeach go cothrománach</string>
|
||||
<string name="flip_vertically">Smeach go hingearach</string>
|
||||
<string name="free_aspect_ratio">Saor in aisce</string>
|
||||
<string name="other_aspect_ratio">Eile</string>
|
||||
<string name="wallpaper_set_successfully">D\' éirigh le socrú cúlbhrat</string>
|
||||
<string name="portrait_aspect_ratio">Cóimheas treoíochta portráide</string>
|
||||
<string name="wallpaper">Cúlbhrat</string>
|
||||
<string name="landscape_aspect_ratio">Cóimheas treoíochta tírdhreacha</string>
|
||||
<string name="home_screen">Scáileán baile</string>
|
||||
<string name="lock_screen">Cuir an scáileán faoi ghlas</string>
|
||||
<string name="home_and_lock_screen">Baile agus glasáil scáileán</string>
|
||||
<string name="allow_changing_aspect_ratio">Ceadaigh an cóimheas treoíochta a athrú</string>
|
||||
<string name="slideshow">Taispeántas Sleamhnán</string>
|
||||
<string name="interval">Eatramh</string>
|
||||
<string name="include_photos">Cuir grianghraif san áireamh</string>
|
||||
<string name="include_videos">Cuir físeáin san áireamh</string>
|
||||
<string name="include_gifs">Cuir GIFanna san áireamh</string>
|
||||
<string name="random_order">Ord randamach</string>
|
||||
<string name="move_backwards">Bog siar</string>
|
||||
<string name="loop_slideshow">Taispeántas sleamhnán lúibe</string>
|
||||
<string name="fade">Céimnigh</string>
|
||||
<string name="slide">Sleamhnán</string>
|
||||
<string name="slideshow_ended">Chríochnaigh an taispeántas sleamhnán</string>
|
||||
<string name="no_media_for_slideshow">Níor aimsíodh aon mheán don taispeántas sleamhnán</string>
|
||||
<string name="do_not_group_files">Ná grúpáil comhaid</string>
|
||||
<string name="by_folder">Fillteán</string>
|
||||
<string name="by_last_modified">Mionathraithe go deireanach</string>
|
||||
<string name="by_last_modified_daily">Mionathraithe go deireanach (laethúil)</string>
|
||||
<string name="by_last_modified_monthly">Mionathraithe go deireanach (míosúil)</string>
|
||||
<string name="by_date_taken">Dáta a glacadh</string>
|
||||
<string name="by_date_taken_daily">Dáta tógtha (laethúil)</string>
|
||||
<string name="by_date_taken_monthly">Dáta tógtha (míosúil)</string>
|
||||
<string name="by_file_type">Cineál comhaid</string>
|
||||
<string name="by_extension">Síneadh</string>
|
||||
<string name="show_file_count_section_header">Taispeáin líon na gcomhad ag ceanntásca rannáin</string>
|
||||
<string name="grouping_and_sorting">Tabhair do d\'aire gur 2 réimse neamhspleácha iad grúpáil agus sórtáil</string>
|
||||
<string name="folder_on_widget">Fillteán a thaispeántar ar an ngiuirléid:</string>
|
||||
<string name="show_folder_name">Taispeáin ainm an fhillteáin</string>
|
||||
<string name="autoplay_videos">Seinn físeáin go huathoibríoch</string>
|
||||
<string name="remember_last_video_position">Cuimhnigh ar an suíomh athsheinm físe deireanach</string>
|
||||
<string name="loop_videos">Físeáin lúb</string>
|
||||
<string name="animate_gifs">Beochan GIFanna ag mionsamhlacha</string>
|
||||
<string name="max_brightness">Max gile agus tú ag féachaint ar mheáin lánscáileáin</string>
|
||||
<string name="crop_thumbnails">Mionsamhlacha barr i gcearnóga</string>
|
||||
<string name="show_thumbnail_video_duration">Taispeáin fad an fhíseáin</string>
|
||||
<string name="screen_rotation_by">Rothlaigh meáin lánscáileáin de réir</string>
|
||||
<string name="screen_rotation_system_setting">Socrú córais</string>
|
||||
<string name="black_background_at_fullscreen">Cúlra dubh ag na meáin lánscáileáin</string>
|
||||
<string name="scroll_thumbnails_horizontally">Scrollaigh mionsamhlacha go cothrománach</string>
|
||||
<string name="show_extended_details">Taispeáin sonraí breisithe thar mheáin lánscáileáin</string>
|
||||
<string name="manage_extended_details">Bainistigh sonraí breisithe</string>
|
||||
<string name="hide_system_ui_at_fullscreen">Folaigh Chomhéadain an chórais go huathoibríoch ag meáin lánscáileáin</string>
|
||||
<string name="delete_empty_folders">Scrios fillteáin fholmha tar éis a n-inneachar a scriosadh</string>
|
||||
<string name="allow_photo_gestures">Ceadaigh gile grianghraf a rialú le gothaí ingearacha</string>
|
||||
<string name="allow_video_gestures">Ceadaigh toirt físe agus gile a rialú le gothaí ingearacha</string>
|
||||
<string name="playback_speed">Luas athsheinm</string>
|
||||
<string name="show_media_count">Taispeáin líon na meán fillteáin ar an bpríomhamharc</string>
|
||||
<string name="one_finger_zoom">Ceadaigh zúmáil méar amháin ag meáin lánscáileáin</string>
|
||||
<string name="allow_instant_change">Ceadaigh meáin a athrú láithreach trí chliceáil ar thaobhanna scáileáin</string>
|
||||
<string name="allow_deep_zooming_images">Ceadaigh íomhánna zúmála doimhne</string>
|
||||
<string name="hide_extended_details">Folaigh sonraí breisithe nuair atá an barra stádais i bhfolach</string>
|
||||
<string name="show_at_bottom">Taispeáin roinnt cnaipí aicsin ag bun an scáileáin</string>
|
||||
<string name="show_recycle_bin">Taispeáin an bosca athchúrsála ag scáileán na bhfillteán</string>
|
||||
<string name="deep_zoomable_images">Íomhánna domhain zúmáilte</string>
|
||||
<string name="show_highest_quality">Taispeáin íomhánna den chaighdeán is airde is féidir</string>
|
||||
<string name="show_recycle_bin_last">Taispeáin an bosca athchúrsála mar an mhír dheireanach ar an bpríomhscáileán</string>
|
||||
<string name="allow_down_gesture">Ceadaigh an t-amharc lánscáileáin a dhúnadh le gotha síos</string>
|
||||
<string name="allow_one_to_one_zoom">Ceadaigh zúmáil isteach 1:1 le dhá sconna dúbailte</string>
|
||||
<string name="open_videos_on_separate_screen">Oscail físeáin i gcónaí ar scáileán ar leith le gothaí cothrománacha nua</string>
|
||||
<string name="allow_rotating_gestures">Ceadaigh íomhánna rothlacha le gothaí</string>
|
||||
<string name="folder_thumbnail_style">Stíl mhionsamhlacha fillteáin</string>
|
||||
<string name="file_thumbnail_style">Stíl mhionsamhlacha an chomhaid</string>
|
||||
<string name="mark_favorite_items">Marcáil na míreanna is fearr leat</string>
|
||||
<string name="thumbnail_spacing">Spásáil mionsamhlacha</string>
|
||||
<string name="show_file_count_line">Taispeáin líon na gcomhad ar líne ar leith</string>
|
||||
<string name="show_file_count_brackets">Taispeáin líon na gcomhad idir lúibíní</string>
|
||||
<string name="show_file_count_none">Ná taispeáin líon na gcomhad</string>
|
||||
<string name="limit_folder_title">Cuir teorainn le teidil fillteáin fhada go líne 1</string>
|
||||
<string name="rounded_corners">Cúinní cruinn</string>
|
||||
<string name="export_favorite_paths">Easpórtáil ceanáin</string>
|
||||
<string name="file_loading_priority">Tosaíocht luchtaithe comhad</string>
|
||||
<string name="speed">Luas</string>
|
||||
<string name="compromise">Comhréiteach</string>
|
||||
<string name="avoid_showing_invalid_files">Seachain comhaid neamhbhailí a thaispeáint</string>
|
||||
<string name="show_image_file_types">Taispeáin cineálacha comhaid íomhá</string>
|
||||
<string name="allow_zooming_videos">Ceadaigh físeáin zúmála le cnagadh dúbailte orthu</string>
|
||||
<string name="import_favorite_paths">Iompórtáil ceanáin</string>
|
||||
<string name="paths_imported_successfully">D\' éirigh le cosáin a iompórtáladh</string>
|
||||
<string name="password_protect_excluded">Pasfhocal a chosaint infheictheacht fillteán eisiata</string>
|
||||
<string name="media_management_manual">Chuaigh rud éigin mícheart, téigh isteach i Socruithe do ghléis - Feidhmchláir - Rochtain speisialta ar fheidhmchláir - Feidhmchláir bhainistíochta meán agus lig don aip seo na meáin a bhainistiú.</string>
|
||||
<string name="media_management_note">Mura n-oibríonn an atreorú, téigh isteach i Socruithe do ghléis - Feidhmchláir - Rochtain speisialta ar fheidhmchláir - Feidhmchláir bhainistíochta meán agus lig don aip seo na meáin a bhainistiú.</string>
|
||||
<string name="media_management_alternative">Mura mian leat é a dhéanamh, is féidir leat dul isteach i Socruithe do ghléis - Feidhmchláir - Rochtain speisialta ar fheidhmchláir - Feidhmchláir bhainistíochta meán agus ligean don aip seo na meáin a bhainistiú.</string>
|
||||
<string name="alternative_media_access">De rogha air sin, is féidir leat rochtain a fháil ar chomhaid meán amháin. Sa chás sin ní bheidh tú in ann oibriú le comhaid i bhfolach áfach.</string>
|
||||
<string name="media_only">Na Meáin amháin</string>
|
||||
<string name="all_files">Gach comhad</string>
|
||||
<string name="search_all_files">Cuardaigh gach comhad in ionad fillteáin ar an bpríomhscáileán</string>
|
||||
<string name="show_all_folders">Taispeáin cnaipe roghchláir le haghaidh toggling Taispeáin Gach Fillteán Ábhar go tapa</string>
|
||||
<string name="thumbnails">Mionsamhlacha</string>
|
||||
<string name="fullscreen_media">Meáin lánscáileáin</string>
|
||||
<string name="extended_details">Sonraí breisithe</string>
|
||||
<string name="bottom_actions">Gníomhartha bun</string>
|
||||
<string name="manage_bottom_actions">Bainistigh gníomhartha bun infheicthe</string>
|
||||
<string name="toggle_file_visibility">Scoránaigh infheictheacht an chomhaid</string>
|
||||
<string name="file_is_malformed_or_corrupted">Tá an comhad míchumtha nó truaillithe.</string>
|
||||
<string name="unsupported_format">Formáid gan tacaíocht.</string>
|
||||
<string name="faq_1_title">Conas is féidir liom gailearaí gléas réamhshocraithe a dhéanamh de Ghailearaí Fossify?</string>
|
||||
<string name="media_exceeds_device_capabilities">Sáraíonn na meáin cumais an ghléis.</string>
|
||||
<string name="faq_1_text">Ar dtús caithfidh tú an gailearaí réamhshocraithe atá ann faoi láthair a aimsiú sa rannán Apps de do shocruithe gléis, cuardaigh cnaipe a deir rud éigin cosúil le \"Oscail de réir réamhshocraithe\", cliceáil air, ansin roghnaigh \"Réamhshocruithe soiléire\". An chéad uair eile a dhéanfaidh tú iarracht íomhá nó físeán a oscailt ba chóir duit roghnóir feidhmchláir a fheiceáil, áit ar féidir leat Gailearaí Fossify a roghnú agus an feidhmchlár réamhshocraithe a dhéanamh de.</string>
|
||||
<string name="faq_2_title">Chuir mé an aip faoi ghlas le pasfhocal, ach rinne mé dearmad air. Céard is féidir liom a dhéanamh?</string>
|
||||
<string name="faq_3_title">Conas is féidir liom albam a dhéanamh i gcónaí ag an mbarr?</string>
|
||||
<string name="faq_3_text">Is féidir leat an t-albam atá ag teastáil a bhrú le fada agus an deilbhín Pin a roghnú ag an roghchlár gníomhartha, a chuirfidh go dtí an barr é. Is féidir leat bioráin fillteáin il freisin, beidh míreanna pinned a shórtáil ag an modh sórtála réamhshocraithe.</string>
|
||||
<string name="faq_4_title">Conas is féidir liom físeáin a chur ar aghaidh go tapa?</string>
|
||||
<string name="faq_4_text">Is féidir leat é a dhéanamh trí thaobh an scáileáin a chnagadh faoi dhó, nó trí na téacsanna reatha nó uastréimhse a thapáil in aice leis an mbarra lorga. Má chumasaíonn tú físeáin a oscailt ar scáileán ar leith i socruithe na haipe, is féidir leat gothaí cothrománacha a úsáid freisin.</string>
|
||||
<string name="faq_5_title">Cad é an difríocht idir fillteán a chur i bhfolach agus gan é a áireamh?</string>
|
||||
<string name="faq_5_text">Ná cuir cosc ar an bhfillteán a thaispeáint ach amháin i nGailearaí Fossify, agus oibríonn Hide córas-ciallmhar agus folaíonn sé an fillteán ó ghailearaithe eile freisin. Oibríonn sé trí chomhad folamh \".nomedia\" a chruthú san fhillteán a thugtar, ar féidir leat a bhaint ansin le haon bhainisteoir comhad freisin. Tabhair faoi deara nach gceadaíonn roinnt feistí fillteáin a chur i bhfolach cosúil le Ceamara, Screenshots agus Íoslódálacha.</string>
|
||||
<string name="faq_6_title">Cén fáth a dtaispeánann fillteáin le healaín chlúdaigh ceoil nó greamáin?</string>
|
||||
<string name="faq_6_text">D\'fhéadfadh sé tarlú go bhfeicfidh tú roinnt albam neamhghnách á dtaispeáint. Is féidir leat iad a eisiamh go héasca trí iad a bhrú fada agus Eisiamh a roghnú. Sa chéad dialóg eile is féidir leat an máthairfhillteán a roghnú ansin, seans maith go gcuirfidh sé cosc ar na halbaim ghaolmhara eile a thaispeáint freisin.</string>
|
||||
<string name="faq_7_title">Níl fillteán le híomhánna á thaispeáint, nó ní thaispeánann sé gach mír. Céard is féidir liom a dhéanamh?</string>
|
||||
<string name="faq_11_title">An féidir liom mionsamhlacha comhaid meán a ghrúpáil ar bhealach?</string>
|
||||
<string name="faq_11_text">Cinnte, bain úsáid as an mír roghchláir \"Grúpa de réir\" agus tú ag amharc mionsamhlacha. Is féidir leat comhaid a ghrúpáil de réir critéir éagsúla, lena n-áirítear Dáta Tógtha. Má úsáideann tú an fheidhm \"Taispeáin ábhar gach fillteán\" is féidir leat iad a ghrúpáil le fillteáin freisin.</string>
|
||||
<string name="faq_12_title">Ní sórtáil de réir Dáta Tógtha cosúil a bheith ag obair i gceart, conas is féidir liom é a shocrú?</string>
|
||||
<string name="faq_12_text">Is dócha gurb iad na comhaid atá á gcóipeáil ó áit éigin is cúis leis. Is féidir leat é a shocrú trí mhionsamhlacha an chomhaid a roghnú agus \"Fix Date Taken value\" a roghnú.</string>
|
||||
<string name="faq_13_title">Feicim roinnt bandáil datha ar na híomhánna. Conas is féidir liom an caighdeán a fheabhsú?</string>
|
||||
<string name="faq_14_text">Is féidir leat an mhír roghchláir \"Taispeáin míreanna folaithe go sealadach\" a bhrú ag an bpríomhscáileán, nó scoránaigh \"Taispeáin míreanna i bhfolach\" i socruithe an fheidhmchláir chun an mhír fholaithe a fheiceáil. Más mian leat é a unhide, brúigh ach fada é agus roghnaigh \"Unhide\". Tá fillteáin i bhfolach trí chomhad \".nomedia\" i bhfolach a chur isteach iontu, is féidir leat an comhad a scriosadh le haon bhainisteoir comhad freisin. Tabhair faoi deara go n-oibríonn hiding go hathchúrsach áfach, mar sin má cheilt tú fillteán, beidh gach fofhillteán i bhfolach freisin. Mar sin, chun unhiding na fofhillteáin a bhfuil tú a unhide an máthairfhillteán.</string>
|
||||
<string name="faq_16_title">Cad a tharla do chomhad agus fillteán i bhfolach agus cén fáth nach féidir liom míreanna i bhfolach a fheiceáil níos mó?</string>
|
||||
<string name="faq_15_text">Is féidir le taisce app suas le 250MB a ghlacadh, cinntíonn sé luchtú íomhá níos tapúla. Má tá níos mó spáis á thógáil ag an aip, is dóichí gurb é is cúis leis ná go bhfuil míreanna agat sa Bhosca Athchúrsála. Áirítear na comhaid sin ar mhéid an fheidhmchláir. Is féidir leat an bosca athchúrsála a ghlanadh trína oscailt agus gach comhad a scriosadh, nó ó shocruithe na haipe. Scriostar gach comhad sa bhosca bruscair go huathoibríoch tar éis 30 lá.</string>
|
||||
<string name="faq_16_text">Ag tosú le Android 11 ní féidir leat comhaid nó fillteáin a cheilt nó a cheilt níos mó, ní féidir leat na cinn i bhfolach a fheiceáil in aipeanna gailearaí mar gheall ar shrianta córais ach an oiread. Beidh ort bainisteoir comhad éigin a úsáid chuige sin.</string>
|
||||
<string name="faq_16_text_extra">Nó is féidir leat rochtain a thabhairt don ghailearaí seo ar Gach Comhad trí do shocruithe gléis, rud a ligfidh dúinn míreanna folaithe a thaispeáint agus oibríochtaí comhaid a dhéanamh níos iontaofa go ginearálta.</string>
|
||||
<string name="faq_17_title">Cén fáth nach féidir liom fillteáin atá ar iarraidh a chur san áireamh níos mó?</string>
|
||||
<string name="faq_17_text">Stop sé sin ag obair mar gheall ar na hathruithe córais a tháinig le Android 11 freisin, ní féidir leis an aip fillteáin fíor a bhrabhsáil níos mó, braitheann sé ar an MediaStore mar a thugtar air ag fáil sonraí.</string>
|
||||
<string name="faq_18_title">Cén fáth a bhfeicim fógraí le linn athsheinm físe?</string>
|
||||
<string name="faq_8_text">Má chuirtear fillteán leis na Fillteáin Áirithe, ní fhágann sin rud ar bith as an áireamh go huathoibríoch. Cad is féidir leat a dhéanamh ná dul i Socruithe -> Bainistigh Fillteáin Eisiata, eisiamh an fillteán fréimhe \"/\", ansin cuir na fillteáin atá ag teastáil ag Socruithe -> Bainistigh Fillteáin Áirithe. Ní dhéanfaidh sé sin ach na fillteáin roghnaithe a fheiceáil, mar go bhfuil an dá eisiamh agus lena n-áirítear athfhillteach agus má tá fillteán eisiata agus san áireamh, beidh sé a thaispeáint suas.</string>
|
||||
<string name="toggle_favorite">Scoránaigh is fearr leat</string>
|
||||
</resources>
|
|
@ -40,11 +40,9 @@
|
|||
<string name="no_media_with_filters">Non se atopou multimedia do tipo indicado polo filtro.</string>
|
||||
<string name="change_filters_underlined"><u>Cambiar filtro</u></string>
|
||||
<string name="hide_folder_description">Esta función oculta o cartafol engadíndolle ficheiro \'.nomedia\', tamén ocultará os subcartafoles. Podes velos premendo a opción \'Mostrar elementos ocultos\' nos Axustes. Continuar?</string>
|
||||
<string name="exclude_folder_description">Isto só excluirá de Galería Fossify a selección e os seus subcartafoles. Podes xestionar os cartafoles excluídos nos Axustes.</string>
|
||||
<string name="exclude_folder_description">Isto só excluirá de Fossify Gallery a selección e os seus subcartafoles. Podes xestionar os cartafoles excluídos nos Axustes.</string>
|
||||
<string name="exclude_folder_parent">Excluír o cartafol pai no seu lugar\?</string>
|
||||
<string name="excluded_activity_placeholder">Ao excluír un cartafol xunto cos seus cartafoles farás que non sexan visibles só en Galería Fossify, serán aínda visibles noutras aplicacións.
|
||||
\n
|
||||
\nSe queres ocultalos tamén doutras apps, usa a función Ocultar.</string>
|
||||
<string name="excluded_activity_placeholder">Ao excluír un cartafol xunto cos seus cartafoles farás que non sexan visibles só en Fossify Gallery, serán aínda visibles noutras aplicacións.\n\nSe queres ocultalos tamén doutras apps, usa a función Ocultar.</string>
|
||||
<string name="hidden_folders">Cartafoles ocultos</string>
|
||||
<string name="manage_hidden_folders">Xestionar cartafoles ocultos</string>
|
||||
<string name="hidden_folders_placeholder">Semella que non tes ningún cartafol oculto cun ficheiro \".nomedia\".</string>
|
||||
|
@ -212,8 +210,8 @@
|
|||
<string name="manage_bottom_actions">Xestionar accións visibles do fondo</string>
|
||||
<string name="toggle_favorite">Engadir como favorito</string>
|
||||
<string name="toggle_file_visibility">Alternar visibilidade do ficheiro</string>
|
||||
<string name="faq_1_title">Como fago para que Galería Fossify sexa a galería por defecto no móbil?</string>
|
||||
<string name="faq_1_text">Primeiro tes que atopar a galería predeterminada actual na sección Aplicacións nos axustes do teu dispositivo, busca un botón que poña algo como \"Abrir por defecto\", preme nel, marca \"Restablecer predeterminada\". A próxima vez que intentes abrir unha imaxe ou vídeo deberás escoller a aplicación para abrila, e aí podes elixir Galería Fossify e poñela como app predeterminada.</string>
|
||||
<string name="faq_1_title">Como facer que Fossify Gallery sexa a galería predeterminada no móbil?</string>
|
||||
<string name="faq_1_text">Primeiro tes que atopar a galería predeterminada actual na sección Aplicacións nos axustes do teu dispositivo, busca un botón que poña algo como \"Abrir por defecto\", preme nel, marca \"Restablecer predeterminada\". A próxima vez que intentes abrir unha imaxe ou vídeo deberás escoller a aplicación para abrila, e aí podes elixir Fossify Gallery e poñela como app predeterminada.</string>
|
||||
<string name="faq_2_title">Protexín a aplicación cun contrasinal, pero esquecino. Que podo facer?</string>
|
||||
<string name="faq_2_text">Podes solucionalo de dous xeitos. Ou ben reinstalar a aplicación ou buscar a aplicación nos axustes do dispositivo e escoller \"Limpar datos\". Restablecerá todos os seus axustes, mais non eliminará ficheiros de medios.</string>
|
||||
<string name="faq_3_title">Como podo facer que un álbum apareza sempre arriba de todo\?</string>
|
||||
|
@ -221,7 +219,7 @@
|
|||
<string name="faq_4_title">Como podo aumentala velocidade da reprodución do vídeo\?</string>
|
||||
<string name="faq_4_text">Pode facelo tocando dúas veces o lateral da pantalla, ou tocando os textos de duración máxima ou actual preto da barra de avance. Se activa abrir os vídeos nunha pantalla separada, tamén pode usar xestos horizontais.</string>
|
||||
<string name="faq_5_title">Cal é a diferenza entre ocultar e excluír un cartafol?</string>
|
||||
<string name="faq_5_text">A exclusión só evita que se mostre o cartafol en Galería Fossify, mentras Ocultar funciona para todo o sistema e agocha o cartafol para outras galerías tamén. Funciona creando un ficheiro baleiro \".nomedia\" no cartafol dado, que podes eliminar posteriormente desde calquera xestor de ficheiros. Ten en conta que algúns dispositivos non permiten ocultar cartafoles, como a Cámara, Captura de Pantall ou Descargas.</string>
|
||||
<string name="faq_5_text">A exclusión só evita que se mostre o cartafol en Fossify Gallery, mentras Ocultar funciona para todo o sistema e agocha o cartafol para outras galerías tamén. Funciona creando un ficheiro baleiro \".nomedia\" no cartafol dado, que podes eliminar posteriormente desde calquera xestor de ficheiros. Ten en conta que algúns dispositivos non permiten ocultar cartafoles, como a Cámara, Captura de Pantall ou Descargas.</string>
|
||||
<string name="faq_6_title">Por que aparecen cartafoles de música con portadas ou pegatinas\?</string>
|
||||
<string name="faq_6_text">Pode acontecer que vexa que aparecen álbumes raros. Pode excluílos con facilidade mantendo premidos e escollendo Excluír. No seguinte diálogo pode escoller o cartafol pai, esto probablemente agoche outros álbumes relacionados.</string>
|
||||
<string name="faq_7_title">Un cartafol con imaxes non aparece, que podo facer\?</string>
|
||||
|
@ -251,4 +249,10 @@
|
|||
<string name="svgs">SVGs</string>
|
||||
<string name="editor">Editor</string>
|
||||
<string name="gifs">GIFs</string>
|
||||
<string name="playback_speed">Velocidade de reprodución</string>
|
||||
<string name="full_storage_permission_required">Fossify Gallery precisa acceso completo para poder mostrar todas as fotos e vídeos. Vai a Axustes > Permisos > Fotos e Vídeos > Permitir todo.</string>
|
||||
<string name="file_is_malformed_or_corrupted">O ficheiro está corrupto ou mal formado.</string>
|
||||
<string name="media_exceeds_device_capabilities">O multimedia supera as capacidades do dispositivo.</string>
|
||||
<string name="unsupported_format">Formato non compatible.</string>
|
||||
<string name="failed_to_load_media">Fallou a carga do multimedia.</string>
|
||||
</resources>
|
54
app/src/main/res/values-gu/strings.xml
Normal file
54
app/src/main/res/values-gu/strings.xml
Normal file
|
@ -0,0 +1,54 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_launcher_name">ગેલેરી</string>
|
||||
<string name="edit">ફેરફાર કરો</string>
|
||||
<string name="open_camera">કેમેરા ખોલો</string>
|
||||
<string name="hidden">(ચૂપૈલું)</string>
|
||||
<string name="excluded">(બાકાત)</string>
|
||||
<string name="pin_folder">ફોલ્ડર પિન કરો</string>
|
||||
<string name="unpin_folder">ફોલ્ડર નું પિન કાઢી નાંખો</string>
|
||||
<string name="pin_to_the_top">એકદમ ઉપર પિન કરો</string>
|
||||
<string name="set_as_default_folder">આને ડિફૌલ્ટ ફોલ્ડર મા સેટ કરો</string>
|
||||
<string name="lock_orientation">સ્ક્રીન ફેરવો નઈ</string>
|
||||
<string name="reorder_by_dragging_pro">ફોલ્ડરો નો ક્રમ એને ખેંચીને બદલો (પ્રો)</string>
|
||||
<string name="full_storage_permission_required">ફોસિફાઈ ગેલેરી ને ફોટા અને વિડિયો દેખાડવા માટે પૂરી અનુમતિ જોડે. તો સેટિંગ > પરવાંગી > ફોટો અને વિડિયો > બધાને મંજૂરી આપો.</string>
|
||||
<string name="videos">વિડિયો</string>
|
||||
<string name="resize_and_save">સિલેક્ટ કરેલા ની સાઈઝ બદલો અને સાચવો</string>
|
||||
<string name="resize_factor_error">૧૦ થી ૯૦ વચ્ચે ના અંક નાખો</string>
|
||||
<string name="folder_view">ફોલ્ડર વ્યુ મા બદલો</string>
|
||||
<string name="unlock_orientation">સ્ક્રીન ફેરવી સકો</string>
|
||||
<string name="hidden_folders">છુપાઈલા ફોલ્ડરો</string>
|
||||
<string name="show_folder_name">ફોલ્ડર ઓ નું નામ દેખાળો</string>
|
||||
<string name="force_landscape">આદિ સ્ક્રીન રાખો</string>
|
||||
<string name="dates_fixed_successfully">તારીખ સુધારવાનું સફળ થયું</string>
|
||||
<string name="show_all">બધા ફોલ્ડર ની વસ્તુઓ દેખાડો</string>
|
||||
<string name="all_folders">બધા ફોલ્ડરો</string>
|
||||
<string name="other_folder">બીજા ફોલ્ડરો</string>
|
||||
<string name="show_on_map">નકશા પર દેખાડો</string>
|
||||
<string name="unknown_location">સ્થાન અજ્ઞાત છે</string>
|
||||
<string name="volume">અવાજ</string>
|
||||
<string name="brightness">પ્રકાશ</string>
|
||||
<string name="change_orientation">સ્ક્રીન ફેરવો</string>
|
||||
<string name="force_portrait">ઉભી સ્ક્રીન રાખો</string>
|
||||
<string name="use_default_orientation">ફોન ના રીતે સ્ક્રીન ફેરવો</string>
|
||||
<string name="fixing">સુધરે છે…</string>
|
||||
<string name="share_resized">સાઇઝ બદલેલી આવૃત્તિ શૈર કરો</string>
|
||||
<string name="reorder_by_dragging">ફોલ્ડરો નો ક્રમ એને ખેંચીને બદલો</string>
|
||||
<string name="restore_to_path">\'%s\' પર પુનઃસ્થાપિત કરી રહ્યું છે</string>
|
||||
<string name="filter_media">મીડિયા ફિલ્ટર કરો</string>
|
||||
<string name="images">ફોટા</string>
|
||||
<string name="gifs">જીયાઇએફો</string>
|
||||
<string name="no_media_with_filters">પસંદ કરેલા ફિલ્ટર થી કઈ ના મળ્યું.</string>
|
||||
<string name="change_filters_underlined"><u>ફિલ્ટર બદલો</u></string>
|
||||
<string name="manage_hidden_folders">છુપાઈલા ફોલ્ડરો મેનેજ કરો</string>
|
||||
<string name="manage_included_folders">સમાવિષ્ટ ફોલ્ડરો મેનેજ કરો</string>
|
||||
<string name="add_folder">ફોલ્ડર જોડો</string>
|
||||
<string name="width">પહોળાઈ</string>
|
||||
<string name="height">લંબાઈ</string>
|
||||
<string name="keep_aspect_ratio">પહોળાઈ ને લંબાઈ એક સરખી રાખો</string>
|
||||
<string name="editor">ફેરફાર કરતા</string>
|
||||
<string name="rotate">ફેરવો</string>
|
||||
<string name="image_editing_failed">ફોટો ફેરફાર સફળ ના થયું</string>
|
||||
<string name="include_folders">સમાવિષ્ટ ફોલ્ડરો</string>
|
||||
<string name="unset_as_default_folder">સેટ ડિફૌલ્ટ ફોલ્ડર કદી દો</string>
|
||||
</resources>
|
|
@ -252,4 +252,10 @@
|
|||
<string name="slide">Prijelaz</string>
|
||||
<string name="faq_1_text">Najprije moraš pronaći trenutačno zadanu galeriju u odjeljku aplikacija u postavkama tvog uređaja. Potraži gumb koji kaže nešto poput „Standardno otvori”, pritisni ga, a zatim odaberi „Očisti standardne postavke“. Kada sljedeći put pokušaš otvoriti sliku ili video vidjet ćeš birač aplikacija, gdje možeš odabrati aplikaciju „Fossify galerija” i postaviti je kao standardnu aplikaciju.</string>
|
||||
<string name="faq_5_text">Opcija „Isključi” sprječava prikazivanje mape samo u Fossify galeriji, dok opcija „Sakrij” funkcionira za cijeli sustav te skriva mapu i od drugih galerija. Radi tako što stvara praznu datoteku „.nomedia” u zadnoj mapi, koju zatim možeš ukloniti s bilo kojim upravljačem datoteka. Imaj na umu da neki uređaji ne dopuštaju skrivanje mapa kao što su Kamera, Slike ekrana i Preuzimanja.</string>
|
||||
<string name="full_storage_permission_required">Fossify galerija treba puni pristup za prikaz svih tvojih fotografija i videa. Idi na Postavke > Dozvole > Fotografije i videa > Dozvoli sve.</string>
|
||||
<string name="playback_speed">Brzina reprodukcije</string>
|
||||
<string name="unsupported_format">Nepodržan format.</string>
|
||||
<string name="file_is_malformed_or_corrupted">Datoteka je neispravna ili oštećena.</string>
|
||||
<string name="media_exceeds_device_capabilities">Medij premašuje mogućnosti uređaja.</string>
|
||||
<string name="failed_to_load_media">Neuspjelo učitavanje medija.</string>
|
||||
</resources>
|
|
@ -253,4 +253,8 @@
|
|||
<string name="faq_1_text">Először meg kell találnia az aktuálisan alapértelmezett galériát az Alkalmazások részében az eszközbeállítások között, keressen egy gombot, amely olyasmit ír, hogy \"Alapértelmezés szerinti megnyitás\", kattintson rá, majd válassza ki az \"Alapértelmezések törlése\" lehetőséget. Amikor legközelebb megpróbál megnyitni egy képet vagy videót, látnia kell egy alkalmazásválasztót, ahol kiválaszthatja a Fossify Galériát, és beállíthatja alapértelmezett alkalmazásnak.</string>
|
||||
<string name="full_storage_permission_required">A Fossify Galéria teljes hozzáférést igényel az összes fénykép és videó megjelenítéséhez. Válassza a Beállítások > Engedélyek > Fényképek és videók > Mindent engedélyez.</string>
|
||||
<string name="playback_speed">Lejátszási sebesség</string>
|
||||
<string name="failed_to_load_media">A média betöltése sikertelen.</string>
|
||||
<string name="media_exceeds_device_capabilities">A médiafájl meghaladja az eszköz képességeit.</string>
|
||||
<string name="file_is_malformed_or_corrupted">Hibás vagy sérült fájl.</string>
|
||||
<string name="unsupported_format">Nem támogatott formátum.</string>
|
||||
</resources>
|
|
@ -142,17 +142,17 @@
|
|||
<string name="show_media_count">Tampilkan jumlah media di tampilan utama</string>
|
||||
<string name="show_extended_details">Tampilkan detail tambahan saat layar penuh</string>
|
||||
<string name="manage_extended_details">Kelola detail tambahan</string>
|
||||
<string name="one_finger_zoom">Izinkan zum dengan satu jari di layar penuh</string>
|
||||
<string name="one_finger_zoom">Izinkan zoom dengan satu jari di layar penuh</string>
|
||||
<string name="allow_instant_change">Izinkan mengganti media dengan mengklik sisi layar</string>
|
||||
<string name="allow_deep_zooming_images">Izinkan zum gambar lebih dalam</string>
|
||||
<string name="allow_deep_zooming_images">Izinkan zoom gambar lebih dalam</string>
|
||||
<string name="hide_extended_details">Sembunyikan detail tambahan ketika bilah status disembunyikan</string>
|
||||
<string name="show_at_bottom">Tampilkan tombol tindakan di layar bagian bawah</string>
|
||||
<string name="show_recycle_bin">Tampilkan Keranjang Sampah di layar folder</string>
|
||||
<string name="deep_zoomable_images">Zum gambar mendalam</string>
|
||||
<string name="deep_zoomable_images">Zoom gambar mendalam</string>
|
||||
<string name="show_highest_quality">Tampilkan gambar dalam kualitas tertinggi</string>
|
||||
<string name="show_recycle_bin_last">Tampilkan Keranjang Sampah sebagai item terakhir di layar utama</string>
|
||||
<string name="allow_down_gesture">Izinkan keluar dari layar penuh dengan menggeser ke bawah</string>
|
||||
<string name="allow_one_to_one_zoom">Izinkan zum 1:1 dengan dua kali ketuk</string>
|
||||
<string name="allow_one_to_one_zoom">Izinkan zoom 1:1 dengan dua kali ketuk</string>
|
||||
<string name="open_videos_on_separate_screen">Selalu buka video pada layar terpisah dengan gestur horizontal baru</string>
|
||||
<string name="show_notch">Tampilkan notch jika tersedia</string>
|
||||
<string name="allow_rotating_gestures">Izinkan memutar gambar dengan gestur</string>
|
||||
|
@ -161,13 +161,13 @@
|
|||
<string name="compromise">Kompromi</string>
|
||||
<string name="avoid_showing_invalid_files">Hindari menampilkan file yang tidak valid</string>
|
||||
<string name="show_image_file_types">Tampilkan jenis file gambar</string>
|
||||
<string name="allow_zooming_videos">Perbolehkan perbesaran video dengan menekan dua kali</string>
|
||||
<string name="allow_zooming_videos">Perbolehkan zoom video dengan mengetuk dua kali</string>
|
||||
<string name="folder_thumbnail_style">Gaya thumbnail folder</string>
|
||||
<string name="file_thumbnail_style">Gaya thumbnail file</string>
|
||||
<string name="mark_favorite_items">Tandai item favorit</string>
|
||||
<string name="thumbnail_spacing">Spasi thumbnail</string>
|
||||
<string name="show_file_count_line">Tampilkan jumlah file di baris terpisah</string>
|
||||
<string name="show_file_count_brackets">Tampilkah jumlah file di kotak</string>
|
||||
<string name="show_file_count_brackets">Tampilkah jumlah file di dalam kurung</string>
|
||||
<string name="show_file_count_none">Jangan tampilkan jumlah file</string>
|
||||
<string name="limit_folder_title">Batasi judul folder panjang ke 1 baris</string>
|
||||
<string name="square">Kotak</string>
|
||||
|
@ -180,7 +180,7 @@
|
|||
<string name="media_management_manual">Ada yang salah, silakan menuju ke Pengaturan - Aplikasi - Akses aplikasi khusus - Aplikasi manajemen media dan perbolehkan aplikasi ini untuk mengelola media.</string>
|
||||
<string name="media_management_note">Jika perubahan arah tidak bekerja, silakan menuju ke Pengaturan - Aplikasi - Akses aplikasi khusus - Aplikasi manajemen media dan perbolehkan aplikasi ini untuk mengelola media.</string>
|
||||
<string name="media_management_alternative">Jika Anda tidak ingin melakukannya, Anda juga dapat menuju ke Pengaturan - Aplikasi - Akses aplikasi khusus - Aplikasi manajemen media dan perbolehkan aplikasi ini untuk mengelola media.</string>
|
||||
<string name="alternative_media_access">Secara alternatif, Anda dapat memperbolehkan mengakses file media saja. Jika demikian, Anda tidak akan dapat melakukan apa pun dengan file tersembunyi.</string>
|
||||
<string name="alternative_media_access">Sebagai alternatif, Anda dapat memperbolehkan mengakses file media saja. Jika demikian, Anda tidak akan dapat melakukan apa pun dengan file tersembunyi.</string>
|
||||
<string name="media_only">Hanya media</string>
|
||||
<string name="all_files">Semua file</string>
|
||||
<string name="search_all_files">Cari semua file daripada folder di layar utama</string>
|
||||
|
@ -212,9 +212,9 @@
|
|||
<string name="faq_12_title">Tidak bisa mengurutkan berdasarkan Tanggal Diambil, bagaimana cara memperbaikinya\?</string>
|
||||
<string name="faq_12_text">Itu umumnya disebabkan karena file yang disalin dari tempat lain. Anda bisa memperbaikinya dengan memilih file thumbnail dan pilih \"Perbaiki Tanggal Diambil\".</string>
|
||||
<string name="faq_13_title">Saya melihat beberapa pita warna pada gambar. Bagaimana saya meningkatkan kualitasnya\?</string>
|
||||
<string name="faq_13_text">Solusi saat ini untuk menampilkan gambar berfungsi dengan baik dalam sebagian besar kasus, namun jika anda ingin kualitas gambar yang lebih baik, anda bisa mengaktifkan \"Tampilkan gambar dalam kualitas tertinggi\" di pengaturan aplikasi, pada bagian \"Zum gambar mendalam\".</string>
|
||||
<string name="faq_13_text">Solusi saat ini untuk menampilkan gambar berfungsi baik dalam sebagian besar kasus, namun jika anda ingin kualitas gambar yang lebih baik, anda bisa mengaktifkan \"Tampilkan gambar dalam kualitas tertinggi\" di pengaturan aplikasi, pada bagian \"Zoom gambar mendalam\".</string>
|
||||
<string name="faq_14_title">Saya punya file/folder tersembunyi. Bagaimana cara memunculkannya?</string>
|
||||
<string name="faq_14_text">Anda bisa memilih menu \"Tampilkan sementara file tersembunyi\" di layar utama, atau \"Tampilkan file tersembunyi\" di pengaturan aplikasi untuk menampilkannya. Jika anda tidak ingin menyembunyikannya, tekan lama dan pilih \"Jangan sembunyikan\". Folder disembunyikan dengan cara menambahkan file bertajuk \".nomedia\" di dalamnya, dan Anda bisa menghapus file tersebut dengan aplikasi pengelola file. Peelu diingat bahwa proses penyembunyikan file bekerja secara beruntun, jadi jika Anda menyembunyikan sebuah folder, seluruh subfoldernya juga akan disembunyikan. Jadi untuk memunculkan subfolder, Anda harus memunculkan folder induknya.</string>
|
||||
<string name="faq_14_text">Anda bisa memilih menu \"Tampilkan sementara file tersembunyi\" di layar utama, atau \"Tampilkan file tersembunyi\" di pengaturan aplikasi untuk menampilkannya. Jika Anda tidak ingin menyembunyikannya, tekan lama dan pilih \"Jangan sembunyikan\". Folder disembunyikan dengan cara menambahkan file bernama \".nomedia\" di dalamnya, dan Anda bisa menghapus file tersebut dengan aplikasi pengelola file. Peelu diingat bahwa proses penyembunyikan file bekerja secara beruntun, jadi jika Anda menyembunyikan sebuah folder, seluruh subfoldernya juga akan disembunyikan. Jadi untuk memunculkan subfolder, Anda harus memunculkan folder induknya.</string>
|
||||
<string name="faq_15_title">Kenapa aplikasi menggunakan sangat banyak ruang kosong\?</string>
|
||||
<string name="faq_15_text">Cache aplikasi bisa mencapai 250MB, ini untuk menjamin pemuatan gambar yang lebih cepat. Jika aplikasi menggunakan lebih banyak lagi ruang kosong, sangat memungkinkan anda memiliki item di dalam Keranjang Sampah. File tersebut akan menambah ukuran aplikasi. Anda bisa mengosongkan Keranjang sampah dengan cara membukanya dan menghapus semua file, atau dari pengaturan aplikasi. Semua file di dalam keranjang sampah akan dihapus secara otomatis setelah 30 hari.</string>
|
||||
<string name="faq_16_title">Apa yang terjadi pada penyembunyian file dan folder, dan mengapa saya tidak bisa melihat item yang tersembunyi lagi\?</string>
|
||||
|
@ -250,4 +250,10 @@
|
|||
<string name="slide">Geser</string>
|
||||
<string name="by_folder">Folder</string>
|
||||
<string name="cant_unhide_folder">Jika folder atau salah satu folder induknya memiliki titik di depan namanya, maka folder tersebut tersembunyi dan tidak dapat dimunculkan seperti ini. Anda harus menghapus titik dengan mengganti namanya.</string>
|
||||
<string name="full_storage_permission_required">Fossify Gallery perlu akses penuh untuk menampilkan semua foto dan video. Buka Pengaturan > Izin > Foto dan video > Izinkan semua.</string>
|
||||
<string name="playback_speed">Kecepatan pemutaran</string>
|
||||
<string name="file_is_malformed_or_corrupted">File rusak atau korup.</string>
|
||||
<string name="media_exceeds_device_capabilities">Media melebihi kemampuan perangkat.</string>
|
||||
<string name="unsupported_format">Format tidak didukung.</string>
|
||||
<string name="failed_to_load_media">Gagal memuat media.</string>
|
||||
</resources>
|
|
@ -255,4 +255,7 @@
|
|||
<string name="full_storage_permission_required">Galleria Fossify ha bisogno dell\'accesso completo per visualizzare tutte le foto e i video. Vai su Impostazioni > Autorizzazioni > Foto e video > Consenti tutti.</string>
|
||||
<string name="playback_speed">Velocità di riproduzione</string>
|
||||
<string name="failed_to_load_media">Impossibile caricare i media.</string>
|
||||
<string name="file_is_malformed_or_corrupted">Il file è malformato o corrotto.</string>
|
||||
<string name="media_exceeds_device_capabilities">Il media supera le capacità del dispositivo.</string>
|
||||
<string name="unsupported_format">Formato non supportato.</string>
|
||||
</resources>
|
|
@ -182,4 +182,5 @@
|
|||
<string name="manage_bottom_actions">נהל פעולות תחתונות גלויות</string>
|
||||
<string name="toggle_favorite">החלף מועדף</string>
|
||||
<string name="toggle_file_visibility">החלף את נראות הקובץ</string>
|
||||
<string name="hidden_all_files">אתה צריך להעניק לאפליקציה גישה לכל הקבצים כדי לראות קבצים מוסתרים, אחרת זה לא יכול לעבוד.</string>
|
||||
</resources>
|
||||
|
|
|
@ -212,10 +212,10 @@
|
|||
<string name="faq_7_text">理由はいくつかありますが、解決は簡単です。[設定] → [追加フォルダーの管理] に移動して、プラスボタン(+ボタン)を押し、表示したいフォルダーを選択して追加します。</string>
|
||||
<string name="faq_8_title">特定のフォルダーのみ表示にしたい場合はどうすればいいですか?</string>
|
||||
<string name="faq_8_text">追加フォルダーにフォルダーを追加しても、自動的に除外されるわけではありません。[設定] → [除外フォルダーの管理] に移動し、ルートフォルダーを除外し、 [設定] → [追加フォルダーの管理] で目的のフォルダーを追加すれば可能です。除外と包含は両方再帰的なので、フォルダーが含まれており除外もされている場合、選択したフォルダーのみ表示されるようになります。</string>
|
||||
<string name="faq_10_title">このアプリで画像のトリミングは出来ますか?</string>
|
||||
<string name="faq_10_text">はい、「編集」で画像をトリミング出来ます。編集画面で画像の隅をドラッグしてください。「編集」は、画像のサムネイルを長押しして編集を選択するか、全画面表示で編集を選択することにより出来ます。</string>
|
||||
<string name="faq_10_title">このアプリで画像をトリミングできますか?</string>
|
||||
<string name="faq_10_text">はい、エディターで画像をトリミングできます。編集画面で画像の隅をドラッグしてください。エディターは、画像のサムネイルを長押しして編集を選択するか、全画面表示で編集を選択すると開けます。</string>
|
||||
<string name="faq_11_title">どうすればメディアファイルのサムネイルをグループ化できますか?</string>
|
||||
<string name="faq_11_text">サムネイル表示中に「グループ分け」メニューを使用してください。撮影日を含めた、複数の条件でグループ化することが出来ます。「すべてを表示」機能を使えば、フォルダーごとにグループ化することも出来ます。</string>
|
||||
<string name="faq_11_text">サムネイル表示中に「グループ分け」メニューを使用してください。撮影日を含めた、複数の条件でグループ化できます。「すべてを表示」機能を使えば、フォルダーごとにグループ化することもできます。</string>
|
||||
<string name="faq_12_title">撮影日による並べ替えがうまく機能しないようです。どうすれば直せますか?</string>
|
||||
<string name="faq_12_text">おそらく、ファイルがコピーされたものであることが原因でしょう。ファイルサムネイルを選択し、「撮影日の値を修正」を選択することにより直せます。</string>
|
||||
<string name="faq_13_title">画像にバンディング(濃淡の縞模様)が見られます。どうすれば画質を上げられますか?</string>
|
||||
|
@ -243,4 +243,5 @@
|
|||
</plurals>
|
||||
<string name="images_resized_successfully">画像のサイズを変更しました</string>
|
||||
<string name="wallpaper">壁紙</string>
|
||||
<string name="exclude_folder_description">選択したフォルダーとその子フォルダーをFossifyギャラリーから除外します。除外したフォルダーは設定画面で管理できます。</string>
|
||||
</resources>
|
|
@ -254,4 +254,7 @@
|
|||
<string name="full_storage_permission_required">Fossify Galerij heeft volledige toegang nodig al je foto\'s en video\'s te kunnen tonen. Ga naar de app-instellingen > Rechten > Foto\'s en video\'s > Alles toestaan.</string>
|
||||
<string name="playback_speed">Afspeelsnelheid</string>
|
||||
<string name="failed_to_load_media">Fout bij het laden van het bestand.</string>
|
||||
<string name="file_is_malformed_or_corrupted">Bestand is onvolledig of beschadigd.</string>
|
||||
<string name="unsupported_format">Niet-ondersteund formaat.</string>
|
||||
<string name="media_exceeds_device_capabilities">Dit apparaat kan deze video niet afspelen.</string>
|
||||
</resources>
|
|
@ -256,4 +256,7 @@
|
|||
<string name="full_storage_permission_required">Fossify Gallery potrzebuje pełnego dostępu, aby wyświetlać wszystkie Twoje zdjęcia i wideo. Przejdź do Ustawień > Uprawnienia > Zdjęcia i filmy > Zezwalaj.</string>
|
||||
<string name="playback_speed">Prędkość odtwarzania</string>
|
||||
<string name="failed_to_load_media">Nie udało się załadować multimediów.</string>
|
||||
<string name="media_exceeds_device_capabilities">Plik przekracza możliwości urządzenia.</string>
|
||||
<string name="unsupported_format">Nieobsługiwany format.</string>
|
||||
<string name="file_is_malformed_or_corrupted">Plik jest wadliwy lub uszkodzony.</string>
|
||||
</resources>
|
|
@ -252,4 +252,7 @@
|
|||
<string name="svgs">SVGs</string>
|
||||
<string name="volume">Volume</string>
|
||||
<string name="editor">Editor</string>
|
||||
<string name="unsupported_format">Formato não suportado.</string>
|
||||
<string name="media_exceeds_device_capabilities">A mídia excede as capacidades do dispositivo.</string>
|
||||
<string name="failed_to_load_media">Falha ao carregar mídia.</string>
|
||||
</resources>
|
|
@ -5,12 +5,12 @@
|
|||
<string name="open_camera">Abrir câmara</string>
|
||||
<string name="hidden">(oculta)</string>
|
||||
<string name="excluded">(excluída)</string>
|
||||
<string name="pin_folder">Fixar pasta</string>
|
||||
<string name="pin_folder">Afixar pasta</string>
|
||||
<string name="unpin_folder">Desafixar pasta</string>
|
||||
<string name="pin_to_the_top">Fixar no topo</string>
|
||||
<string name="show_all">Mostrar conteúdo de todas as pastas</string>
|
||||
<string name="all_folders">Todas as pastas</string>
|
||||
<string name="folder_view">Alternar para a vista de pastas</string>
|
||||
<string name="folder_view">Trocar para vista de pastas</string>
|
||||
<string name="other_folder">Outra pasta</string>
|
||||
<string name="show_on_map">Mostrar no mapa</string>
|
||||
<string name="unknown_location">Localização desconhecida</string>
|
||||
|
@ -24,7 +24,7 @@
|
|||
<string name="fix_date_taken">Corrigir data de captura</string>
|
||||
<string name="fixing">A corrigir…</string>
|
||||
<string name="dates_fixed_successfully">Dados corrigidos com sucesso</string>
|
||||
<string name="no_date_takens_found">Não foram encontrados dados para a data de captura</string>
|
||||
<string name="no_date_takens_found">Data de captura não encontrada</string>
|
||||
<string name="share_resized">Partilhar foto redimensionada</string>
|
||||
<string name="switch_to_file_search">Trocar para pesquisa de ficheiros em todas as pastas visíveis</string>
|
||||
<string name="set_as_default_folder">Utilizar como pasta padrão</string>
|
||||
|
@ -41,7 +41,7 @@
|
|||
<string name="portraits">Retratos</string>
|
||||
<string name="no_media_with_filters">Não foram encontrados ficheiros que cumpram os requisitos.</string>
|
||||
<string name="change_filters_underlined"><u>Alterar filtros</u></string>
|
||||
<string name="hide_folder_description">Esta função oculta a pasta, adicionando-lhe um ficheiro \'.nomedia\' e ocultará também todas as subpastas nela existentes. Pode ver as pastas com a opção \'Mostrar pastas ocultas\'. Continuar\?</string>
|
||||
<string name="hide_folder_description">Esta função oculta a pasta, adicionando-lhe um ficheiro \'.nomedia\' e ocultará também todas as sub-pastas existentes. Pode ver as pastas com a opção \'Mostrar pastas ocultas\'. Continuar?</string>
|
||||
<string name="exclude_folder_parent">Excluir antes a pasta superior\?</string>
|
||||
<string name="hidden_folders">Pastas ocultas</string>
|
||||
<string name="manage_hidden_folders">Gerir pastas ocultas</string>
|
||||
|
@ -122,7 +122,7 @@
|
|||
<string name="slide">Deslizar</string>
|
||||
<string name="slideshow_ended">Apresentação terminada</string>
|
||||
<string name="no_media_for_slideshow">Não foram encontrados ficheiros para a apresentação</string>
|
||||
<string name="group_direct_subfolders">Agrupar subpastas</string>
|
||||
<string name="group_direct_subfolders">Agrupar sub-pastas</string>
|
||||
<string name="group_by">Agrupar por</string>
|
||||
<string name="do_not_group_files">Não agrupar ficheiros</string>
|
||||
<string name="by_folder">Pasta</string>
|
||||
|
@ -134,7 +134,7 @@
|
|||
<string name="by_date_taken_monthly">Tirada em (por mês)</string>
|
||||
<string name="by_file_type">Tipo de ficheiro</string>
|
||||
<string name="by_extension">Extensão</string>
|
||||
<string name="show_file_count_section_header">Mostrar contagem no título da secção</string>
|
||||
<string name="show_file_count_section_header">Mostrar número de ficheiros no título da secção</string>
|
||||
<string name="grouping_and_sorting">Tenha em atenção de que agrupamento e ordenação são campos independentes</string>
|
||||
<string name="folder_on_widget">Pasta mostrada no widget:</string>
|
||||
<string name="show_folder_name">Mostrar nome da pasta</string>
|
||||
|
@ -176,7 +176,7 @@
|
|||
<string name="speed">Velocidade</string>
|
||||
<string name="compromise">Qualidade</string>
|
||||
<string name="avoid_showing_invalid_files">Não mostrar ficheiros inválidos</string>
|
||||
<string name="show_image_file_types">Mostrar o tipo da imagem</string>
|
||||
<string name="show_image_file_types">Mostrar tipo de imagem</string>
|
||||
<string name="allow_zooming_videos">Permitir ampliação de vídeos com dois toques</string>
|
||||
<string name="folder_thumbnail_style">Estilo de miniatura das pastas</string>
|
||||
<string name="file_thumbnail_style">Estilo de miniaturas dos ficheiros</string>
|
||||
|
@ -208,14 +208,14 @@
|
|||
<string name="manage_bottom_actions">Gerir exibição dos botões de ação</string>
|
||||
<string name="toggle_favorite">Alternar favorito</string>
|
||||
<string name="toggle_file_visibility">Alternar visibilidade dos ficheiros</string>
|
||||
<string name="faq_2_title">Bloqueei a aplicação com uma palavra-passe mas agora esqueci-me dela. O que posso fazer\?</string>
|
||||
<string name="faq_2_text">Existem duas soluções. Reinstala a aplicação ou, nas Definições do sistema –> Gerir aplicações –> Informações da aplicação, seleccone Limpar dados. Reiniciará assim todas as suas definições na aplicação mas não apagará os seus ficheiros multimedia.</string>
|
||||
<string name="faq_2_title">Bloqueei a aplicação com palavra-passe mas agora esqueci-me dela. O que posso fazer?</string>
|
||||
<string name="faq_2_text">Existem duas soluções. Reinstale a aplicação ou nas Definiçõe –> Gerir aplicações –> Informações da aplicação, selecione Limpar dados. Reiniciará assim todas as suas definições na aplicação mas não apagará os seus ficheiros multimedia.</string>
|
||||
<string name="faq_3_title">Como posso fazer para que um álbum seja sempre mostrado no topo\?</string>
|
||||
<string name="faq_3_text">Prima longamente o álbum, seleccione Fixar no topo a partir do menu e será apresentado no topo. Pode também fixar diversas pastas em simultâneo. A ordem de apresentação é a da ordenação padrão.</string>
|
||||
<string name="faq_4_title">Como posso fazer avançar rápido os videos\?</string>
|
||||
<string name="faq_3_text">Prima longamente no álbum e seleccione Fixar no topo. Pode também afixar diversas pastas em simultâneo. A ordem de apresentação é a da ordenação padrão.</string>
|
||||
<string name="faq_4_title">Como posso avançar rapidamente os videos?</string>
|
||||
<string name="faq_4_text">Dando dois toques nas margens ecrã ou então dando um toque em cima da indicação de duração junto à barra de pesquisa. E, se a opção de abrir videos noutro ecrã estiver habilitada, pode também fazê-lo por gestos.</string>
|
||||
<string name="faq_5_title">Qual a diferença entre ocultar e excluir uma pasta\?</string>
|
||||
<string name="faq_6_title">Porque são apresentadas capas de albuns ou stickers\?</string>
|
||||
<string name="faq_6_title">Porque são mostradas as pastas com imagens de álbuns ou stickers?</string>
|
||||
<string name="faq_6_text">Pode dar-se o caso de alguns items invulgares aparecerem. Consegue exclui-los premindo longamente e seleccionando Excluir. Na caixa de diálogo seguinte, escolha a pasta superior na hierarquia. Provavelmente, isso irá impedir que outros itens semelhantes sejam apresentados também.</string>
|
||||
<string name="faq_7_title">Uma pasta com imagens não é apresentada ou não mostra todos os itens lá contidos. O que posso fazer\?</string>
|
||||
<string name="faq_7_text">Pode haver diversos motivos mas a solução é simples. Em Definições–> Gerir Pastas Incluídas, seleccione \'+\' e siga até à pasta pretendida.</string>
|
||||
|
@ -240,19 +240,20 @@
|
|||
<string name="faq_17_text">Isso parou de funcionar devido às mudanças no sistema que vieram com o Android 11, o aplicativo não pode mais navegar em pastas reais, ele depende do chamado MediaStore para buscar dados.</string>
|
||||
<string name="faq_18_title">Por que vejo anúncios durante a reprodução de vídeo\?</string>
|
||||
<string name="faq_18_text">As nossas aplicações não têm anúncios. Se você vê-os durante a reprodução de um vídeo, deve estar a usar outra aplicação . Tente encontrar o reprodutor de vídeo padrão nas definições do dispositivo e, em seguida, faça um \"Limpar dados\". Da próxima vez quiser reproduzir um vídeo, surgirá uma opção para escolher a aplicação utilizada.</string>
|
||||
<string name="faq_1_text">Primeiro, tens que encontrar a galeria padrão no menu de Aplicações nas Definições do teu dispositivo, procura por uma opção que diga algo como \"Abrir como padrão\", clica nesta opção e seleciona \"Remover padrões\". Da próxima vez que tentares abrir uma imagem ou um vídeo, deves aparecer um selecionador de aplicações onde podes escolher a Galeria Fossify e torna-la a aplicação de galeria padrão.</string>
|
||||
<string name="faq_1_text">Primeiro, tem que encontrar a galeria padrão na secção Aplicações das Definições do dispositivo, procure por uma opção que diga algo como \"Abrir como padrão\", toque nesta opção e selecione \"Limpar predefinições\". Da próxima vez que tentar abrir uma imagem ou vídeo, deve aparecer um seletor de aplicações, no qual pode escolher Galeria Fossify paia utilizar por omissão.</string>
|
||||
<string name="editor">Editor</string>
|
||||
<string name="exclude_folder_description">Isto excluirá a seleção juntamente com as suas sub-pastas apenas da Galeria Fossify. Podes gerir as pastas excluídas na Preferências.</string>
|
||||
<string name="excluded_activity_placeholder">Excluir pastas vai escondê-las juntamente com as suas sub-pastas apenas na Galeria Fossify, elas continuaram visíveis noutras aplicações.
|
||||
\n
|
||||
\nSe quiseres escondê-las igualmente noutras aplicações, usa a função Hide.</string>
|
||||
<string name="cant_unhide_folder">Se uma pasta ou alguma das pastas que contêm esta tiver um ponto antes do seu nome, esta pasta está escondida e não pode ser revelada desta forma. Tens que remover o ponto dando um novo nome à pasta.</string>
|
||||
<string name="exclude_folder_description">Isto excluirá a seleção juntamente com as suas sub-pastas apenas da Galeria Fossify. Pode gerir as pastas excluídas na Definições.</string>
|
||||
<string name="excluded_activity_placeholder">Excluir pastas oculta a pasta e as sub-pastas na Galeria Fossify. No entanto , as pastas serão mostradas nas outras aplicações.\n\nSe quiser ocultar globalmente, utilize a função Ocultar.</string>
|
||||
<string name="cant_unhide_folder">Se uma pasta ou alguma das pastas superiores tiverem um ficheiro .nomedia, esta pasta estará oculta e não pode ser mostrada desta forma. Tem que eliminar o ficheiro primeiro.</string>
|
||||
<string name="resize_factor_info">Redimensionar as imagens por um dada percentagem, o valor deve ser entre 10 e 90.</string>
|
||||
<string name="faq_1_title">Como posso tornar a Galeria Fossify a galeria padrão do meu dispositivo?</string>
|
||||
<string name="faq_5_text">Excluir esconde a pasta apenas na Galeria Fossify, enquanto que a função Hide funciona em todos o sistema e esconde a pasta igualmente noutras aplicações. Esta opção cria um ficheiro vazio \".nomedia\" na pasta em questão, o qual pode ser removido com um gestor de ficheiros. Repara que alguns dispositivos não permite esconder ficheiros com as pastas Camera, Captura de Ecra e Transferências.</string>
|
||||
<string name="faq_5_text">Excluir oculta a pasta na Galeria Fossify mas a função Ocultar funciona globalmente e esconde a pasta de todas as aplicações. Esta opção cria um ficheiro \".nomedia\" na pasta, o qual pode ser eliminado com um gestor de ficheiros. Tenha em atenção de que alguns dispositivos não permitem esconder algumas pastas tais como, por exemplo, as pastas Camera, Screenshot e Downloads.</string>
|
||||
<string name="volume">Volume</string>
|
||||
<string name="wallpaper">Papel de Parede</string>
|
||||
<string name="failed_to_load_media">Erro ao carregar os dados.</string>
|
||||
<string name="playback_speed">Velocidade de reprodução</string>
|
||||
<string name="full_storage_permission_required">Fossify Gallery precisa de acessso total para mostrar as fotos e os vídeos. Aceda a Definições > Permissões > Fotos e vídeos > Permitir.</string>
|
||||
<string name="full_storage_permission_required">Fossify Gallery precisa de acesso total para mostrar as fotos e os vídeos. Aceda a Definições > Permissões > Fotos e vídeos > Permitir.</string>
|
||||
<string name="file_is_malformed_or_corrupted">Ficheiro inválido ou danificado.</string>
|
||||
<string name="media_exceeds_device_capabilities">O ficheiro excede as capacidades do dispositivo.</string>
|
||||
<string name="unsupported_format">Formato não suportado.</string>
|
||||
</resources>
|
|
@ -236,4 +236,8 @@
|
|||
<string name="faq_1_title">Cum pot face ca Galeria Fossify să fie galeria implicită a dispozitivului?</string>
|
||||
<string name="crop">Decupare</string>
|
||||
<string name="slide">Glisare</string>
|
||||
<string name="hidden_all_files">Trebuie să acorzi aplicației acces la Toate fișierele pentru a vedea fișierele ascunse, altfel nu poate funcționa.</string>
|
||||
<string name="excluded_activity_placeholder">Excluderea dosarelor se va face împreună cu sub-dosarele lor ascunse doar în Fossify Gallery, ele vor fi în continuare vizibile în alte aplicații.\n\nDacă dorești să le ascunzi și de alte aplicații, utilizează funcția Ascundere.</string>
|
||||
<string name="cant_unhide_folder">Dacă un dosar sau unul dintre dosarele părinte are un punct înaintea numelui său, acesta este ascuns și nu poate fi dezvăluit astfel. Trebuie să elimini punctul redenumindu-l.</string>
|
||||
<string name="full_storage_permission_required">Fossify Gallery are nevoie de acces complet pentru a fișa toate fotografiile și videoclipurile. Accesează Setări > Permisiuni > Fotografii și videoclipuri > Permite toate.</string>
|
||||
</resources>
|
|
@ -256,4 +256,7 @@
|
|||
<string name="playback_speed">Скорость воспроизведения</string>
|
||||
<string name="failed_to_load_media">Невозможно загрузить медиафайлы.</string>
|
||||
<string name="full_storage_permission_required">Fossify Gallery необходим полный доступ для отображения всех ваших фотографий и видео. Откройте \"Настройки\" → \"Разрешения\" → \"Фото и видео\" → \"Разрешить все\".</string>
|
||||
<string name="unsupported_format">Неподдерживаемый формат.</string>
|
||||
<string name="file_is_malformed_or_corrupted">Файл имеет неправильный формат или повреждён.</string>
|
||||
<string name="media_exceeds_device_capabilities">Медиафайл превосходит возможности устройства.</string>
|
||||
</resources>
|
|
@ -4,7 +4,7 @@
|
|||
<string name="edit">Redigera</string>
|
||||
<string name="open_camera">Öppna kameran</string>
|
||||
<string name="hidden">(dold)</string>
|
||||
<string name="excluded">(exkluderad)</string>
|
||||
<string name="excluded">(utesluten)</string>
|
||||
<string name="pin_folder">Fäst mapp</string>
|
||||
<string name="unpin_folder">Lossa mapp</string>
|
||||
<string name="pin_to_the_top">Fäst högst upp</string>
|
||||
|
@ -32,7 +32,7 @@
|
|||
<string name="unset_as_default_folder">Ta bort som standardmapp</string>
|
||||
<string name="reorder_by_dragging">Ändra mappordning genom att dra</string>
|
||||
<string name="reorder_by_dragging_pro">Ändra mappordning genom att dra (Pro)</string>
|
||||
<string name="restore_to_path">Återställ till \'%s\'</string>
|
||||
<string name="restore_to_path">Återställer till \'%s\'</string>
|
||||
<string name="filter_media">Filtrera media</string>
|
||||
<string name="images">Bilder</string>
|
||||
<string name="videos">Videor</string>
|
||||
|
@ -175,7 +175,7 @@
|
|||
<string name="open_videos_on_separate_screen">Öppna alltid videor i en separat vy med nya horisontella gester</string>
|
||||
<string name="show_notch">Visa notch om tillgängligt</string>
|
||||
<string name="allow_rotating_gestures">Tillåt bildrotation med gester</string>
|
||||
<string name="file_loading_priority">Filladdningsprioritet</string>
|
||||
<string name="file_loading_priority">Filinläsningsprioritet</string>
|
||||
<string name="speed">Hastighet</string>
|
||||
<string name="compromise">Kompromiss</string>
|
||||
<string name="avoid_showing_invalid_files">Undvik att visa ogiltiga filer</string>
|
||||
|
@ -245,10 +245,14 @@
|
|||
<string name="faq_18_title">Varför ser jag annonser under videouppspelning\?</string>
|
||||
<string name="faq_18_text">Våra appar har inga som helst annonser. Om du ser dem under videouppspelning använder du någon annan videospelare. Försök att hitta din standardvideospelare i enhetsinställningarna och gör sedan en \"Rensa standardinställningar\" på den. Nästa gång du vill öppna en video kommer du att se ett appväljarfönster, där du kan välja vilken app du vill använda.</string>
|
||||
<string name="wallpaper">Bakgrund</string>
|
||||
<string name="excluded_activity_placeholder">Att exkludera mappar kommer göra de och deras undermappar dolda i Fossify Gallery, de kommer dock fortfarande vara synliga i andra appar.
|
||||
\n
|
||||
\nOn du vill dölja de från andra appar, använd Döljfunktionen.</string>
|
||||
<string name="exclude_folder_description">Detta kommer att bara exkludera de valda mapparna och deras undermappar från Fossify Gallery. Du kan hantera exkludeerade mappar i Inställningar.</string>
|
||||
<string name="excluded_activity_placeholder">Att utesluta mappar döljer bara dem och deras undermappar i Fossify Gallery, de kommer fortfarande vara synliga i andra appar.\n\nOm du vill dölja dem från andra appar också använder du funktionen Dölj.</string>
|
||||
<string name="exclude_folder_description">Detta utesluter bara de valda mapparna och deras undermappar från Fossify Gallery. Du kan hantera uteslutna mappar i Inställningar.</string>
|
||||
<string name="faq_1_text">Först måste du hitta din enhets standardgalleri app i appsektionen i enhetsinställningarna. Leta efter en knapp som säger \"Systemstandard\", tryck på den och välj sedan rensa inställningar. Nästa gång du öppnar en bild eller videofil bör du se en appväljare där du kan väljs Fossify Galleri som göra den till systemstandard.</string>
|
||||
<string name="faq_5_text">Uteslut förhindrar att mappen endast visas i Fossify Gallery, medan Dölj fungerar på systemnivå och den döljer även mappen för andra gallerier. Det fungerar genom att skapa en tom \".nomedia\"-fil i den givna mappen, som du sedan kan ta bort med vilken filhanterare som helst. Observera att vissa enheter inte tillåter att dölja mappar som Kamera, Skärmdumpar och Nedladdningar.</string>
|
||||
<string name="playback_speed">Uppspelningshastighet</string>
|
||||
<string name="failed_to_load_media">Det gick inte att läsa in media.</string>
|
||||
<string name="file_is_malformed_or_corrupted">Filen är felformaterad eller skadad.</string>
|
||||
<string name="media_exceeds_device_capabilities">Media överskrider enhetens funktioner.</string>
|
||||
<string name="unsupported_format">Formatet stöds inte.</string>
|
||||
<string name="full_storage_permission_required">Fossify Gallery behöver fullständig åtkomst för att visa alla dina foton och videor. Gå till Inställningar > Behörigheter > Foton och videor > Tillåt alla.</string>
|
||||
</resources>
|
|
@ -254,4 +254,7 @@
|
|||
<string name="full_storage_permission_required">Fossify Galeri tüm fotoğraf ve videolarınızı görüntülemek için tam erişime ihtiyaç duyar. Ayarlar > İzinler > Fotoğraf ve videolar > Tümüne izin ver bölümüne gidin.</string>
|
||||
<string name="playback_speed">Oynatma hızı</string>
|
||||
<string name="failed_to_load_media">Medya yüklenemedi.</string>
|
||||
<string name="file_is_malformed_or_corrupted">Dosya hatalı biçimlendirilmiş veya bozuk.</string>
|
||||
<string name="media_exceeds_device_capabilities">Medya aygıt kapasitesini aşıyor.</string>
|
||||
<string name="unsupported_format">Desteklenmeyen biçim.</string>
|
||||
</resources>
|
|
@ -256,4 +256,7 @@
|
|||
<string name="full_storage_permission_required">Галерея Fossify потребує повного доступу, щоб показувати всі ваші фотографії та відео. Перейдіть до Налаштування > Дозволи > Фото та відео > Дозволити все.</string>
|
||||
<string name="playback_speed">Швидкість відтворення</string>
|
||||
<string name="failed_to_load_media">Не вдалося завантажити медіа.</string>
|
||||
<string name="media_exceeds_device_capabilities">Файл перевищує місткість пристрою.</string>
|
||||
<string name="unsupported_format">Непідтримуваний формат.</string>
|
||||
<string name="file_is_malformed_or_corrupted">Файл неправильно сформовано або пошкоджено.</string>
|
||||
</resources>
|
|
@ -34,7 +34,7 @@
|
|||
<string name="reorder_by_dragging_pro">通过拖动重新排列文件夹 (专业版)</string>
|
||||
<string name="restore_to_path">还原到“%s”</string>
|
||||
<string name="filter_media">过滤显示的文件</string>
|
||||
<string name="images">图像</string>
|
||||
<string name="images">图片</string>
|
||||
<string name="videos">视频</string>
|
||||
<string name="gifs">GIF</string>
|
||||
<string name="raw_images">RAW 图像</string>
|
||||
|
@ -143,7 +143,7 @@
|
|||
<string name="by_extension">扩展名</string>
|
||||
<string name="show_file_count_section_header">在栏目标题上显示文件数</string>
|
||||
<string name="grouping_and_sorting">请注意:分组和排序是两种相互独立的文件组织方式</string>
|
||||
<string name="folder_on_widget">显示在挂件中的文件夹:</string>
|
||||
<string name="folder_on_widget">显示在微件中的文件夹:</string>
|
||||
<string name="show_folder_name">显示文件夹名称</string>
|
||||
<string name="autoplay_videos">自动播放视频</string>
|
||||
<string name="remember_last_video_position">记住视频上一次播放时的位置</string>
|
||||
|
@ -253,4 +253,7 @@
|
|||
<string name="full_storage_permission_required">Fossify 图库需要完全访问权限才能显示您的所有照片和视频。前往“设置”>“权限”>“照片和视频”>“全部允许”。</string>
|
||||
<string name="playback_speed">播放速度</string>
|
||||
<string name="failed_to_load_media">加载媒体失败。</string>
|
||||
</resources>
|
||||
<string name="unsupported_format">不支持的格式。</string>
|
||||
<string name="file_is_malformed_or_corrupted">文件格式错误或已损坏。</string>
|
||||
<string name="media_exceeds_device_capabilities">媒体超出了设备容量。</string>
|
||||
</resources>
|
||||
|
|
|
@ -52,9 +52,7 @@
|
|||
<string name="include_folders">包含資料夾</string>
|
||||
<string name="manage_included_folders">管理包含的資料夾</string>
|
||||
<string name="add_folder">新增資料夾</string>
|
||||
<string name="included_activity_placeholder">如要新增包含媒體文件但未被應用程式辨識的資料夾,可在此處手動新增。
|
||||
\n
|
||||
\n新增項目不會排除其他資料夾。</string>
|
||||
<string name="included_activity_placeholder">如要新增包含媒體檔案但未被應用程式辨識的資料夾,可在此處手動新增。 \n \n新增項目不會排除其他資料夾。</string>
|
||||
<string name="no_media_add_included">未發現媒體檔案。您可以手動加入包含媒體檔案的資料夾來解決。</string>
|
||||
<string name="resize_and_save">調整選取項目尺寸並儲存</string>
|
||||
<string name="width">寬度</string>
|
||||
|
@ -210,8 +208,8 @@
|
|||
<string name="manage_bottom_actions">管理要顯示的底部操作</string>
|
||||
<string name="toggle_favorite">切換我的最愛</string>
|
||||
<string name="toggle_file_visibility">檔案顯示</string>
|
||||
<string name="faq_2_title">用密碼把這個 APP 上鎖後忘記密碼該怎麼辦?</string>
|
||||
<string name="faq_2_text">有兩種解決方法。一是重新安裝本 APP。一是在裝置的設定中找到本 APP,然後按「清除資料」(或「清除儲存空間」等類似的字眼),APP 的設定將會被重設,但不會移除任何媒體檔案。</string>
|
||||
<string name="faq_2_title">用密碼把這個 app 上鎖後忘記密碼該怎麼辦?</string>
|
||||
<string name="faq_2_text">有兩種解決方法。一是重新安裝本 app。一是在裝置的設定中找到本 app,然後按「清除資料」(或「清除儲存空間」等類似的字眼),app 的設定將會被重設,但不會移除任何媒體檔案。</string>
|
||||
<string name="faq_3_title">如何使某個相簿顯示在最頂端?</string>
|
||||
<string name="faq_3_text">長按該相簿,接著按圖釘圖示或選單中的「釘選在頂端」。您可以同時釘選數個相簿,它們將會依照預設排序方式排序。</string>
|
||||
<string name="faq_4_title">如何快轉影片?</string>
|
||||
|
@ -223,7 +221,7 @@
|
|||
<string name="faq_7_text">可能有很多種原因,但解法很簡單。前往「設定」 -> 「管理包含資料夾」、按加號(+)、選擇該資料夾即可。</string>
|
||||
<string name="faq_8_title">如果只想顯示特定資料夾呢?</string>
|
||||
<string name="faq_8_text">如果只將某資料夾加入至「包含資料夾」的話,其他的資料夾並不會被自動排除。請前往「設定」->「管理排除資料夾」、將根資料夾「/」排除,並在「設定」->「管理包含資料夾」中加入欲顯示的資料夾。 這樣就只會顯示所選的資料夾,因為排除與包含都是遞迴的,所以若某資料夾同時被包含及排除,其將會顯示。</string>
|
||||
<string name="faq_10_title">這個 APP 可以裁剪圖片嗎?</string>
|
||||
<string name="faq_10_title">這個 app 可以裁剪圖片嗎?</string>
|
||||
<string name="faq_10_text">可以,在編輯工具中拖動圖片的角落即可裁剪圖片。對縮圖長按並選擇編輯,或者在全螢幕檢視時選擇編輯皆可進入編輯工具。</string>
|
||||
<string name="faq_11_title">有辦法分類縮圖嗎?</string>
|
||||
<string name="faq_11_text">可以,在檢視縮圖時使用選單中的「分組方式」即可,有多種分類方式可供選擇,包含拍攝日期等。若使用了「資料夾內容全部顯示」功能,則也可以依資料夾來分類。</string>
|
||||
|
@ -233,7 +231,7 @@
|
|||
<string name="faq_13_text">目前顯示圖片的方式在大多數情況下都能正常運作,但若想要更好的畫質,可以啟用「設定」->「可強制放大的圖片」段落中的「以最高品質顯示圖片」。</string>
|
||||
<string name="faq_14_title">如何取消隱藏檔案/資料夾?</string>
|
||||
<string name="faq_14_text">按主畫面選單中的「暫時顯示隱藏的檔案」或設定中的「顯示隱藏的項目」就能看到隱藏的項目。若要取消隱藏,長按並選擇「取消隱藏」即可。資料夾隱藏的原理是在其內新增一個「.nomedia」檔案,因此可用任意檔案管理器將其刪除。檔案/資料夾是以遞迴的方式被隱藏的,因此若某資料夾被隱藏,其子資料夾也會被隱藏。若要取消隱藏子資料夾,其上層資料夾需先被取消隱藏。</string>
|
||||
<string name="faq_15_title">這個 APP 怎麼佔用了這麼多空間?</string>
|
||||
<string name="faq_15_title">這個 app 怎麼佔用了這麼多空間?</string>
|
||||
<string name="faq_15_text">應用程式快取可協助圖片載入更快,最高僅佔 250 MB。如果此應用程式佔用超過 250 MB 空間,可能是回收桶中的檔案仍在佔用空間。您可刪除回收桶中的所有檔案,或在設定中快速清除。檔案進入回收桶的 30 天後將自動刪除。</string>
|
||||
<string name="faq_16_title">檔案/資料夾隱藏怎麼了?為什麼我看不到隱藏的項目了?</string>
|
||||
<string name="faq_16_text">自 Android 11 開始,因系統限制,無法隱藏或解除隱藏檔案或資料夾,也無法在相簿 app 中看到已隱藏的項目。請使用檔案管理程式達成上述操作。</string>
|
||||
|
@ -253,4 +251,7 @@
|
|||
<string name="full_storage_permission_required">Fossify 圖庫需要完整存取權限才能顯示您所有的照片與影片。請到「設定」→「隱私權」→「應用程式權限」→「相片和影片」→「一律全部允許」。</string>
|
||||
<string name="playback_speed">播放速度</string>
|
||||
<string name="failed_to_load_media">載入媒體失敗。</string>
|
||||
</resources>
|
||||
<string name="file_is_malformed_or_corrupted">檔案格式錯誤或損毀。</string>
|
||||
<string name="media_exceeds_device_capabilities">媒體超出裝置的播放能力。</string>
|
||||
<string name="unsupported_format">不支援的格式。</string>
|
||||
</resources>
|
||||
|
|
|
@ -34,7 +34,6 @@
|
|||
<string name="reorder_by_dragging_pro">Reorder folders by dragging (Pro)</string>
|
||||
<string name="restore_to_path">Restoring to \'%s\'</string>
|
||||
<string name="full_storage_permission_required">Fossify Gallery needs full access to display all your photos and videos. Go to Settings > Permissions > Photos and videos > Allow all.</string>
|
||||
<string name="failed_to_load_media">Failed to load media.</string>
|
||||
|
||||
<!-- Filter -->
|
||||
<string name="filter_media">Filter media</string>
|
||||
|
@ -242,6 +241,12 @@
|
|||
<string name="toggle_favorite">Toggle favorite</string>
|
||||
<string name="toggle_file_visibility">Toggle file visibility</string>
|
||||
|
||||
<!-- Errors -->
|
||||
<string name="failed_to_load_media">Failed to load media.</string>
|
||||
<string name="file_is_malformed_or_corrupted">File is malformed or corrupted.</string>
|
||||
<string name="media_exceeds_device_capabilities">Media exceeds device capabilities.</string>
|
||||
<string name="unsupported_format">Unsupported format.</string>
|
||||
|
||||
<!-- FAQ -->
|
||||
<string name="faq_1_title">How can I make Fossify Gallery the default device gallery?</string>
|
||||
<string name="faq_1_text">First you have to find the currently default gallery in the Apps section of your device settings, look for a button that says something like \"Open by default\", click on it, then select \"Clear defaults\".
|
||||
|
|
|
@ -2,4 +2,5 @@ plugins {
|
|||
alias(libs.plugins.android).apply(false)
|
||||
alias(libs.plugins.kotlinAndroid).apply(false)
|
||||
alias(libs.plugins.ksp).apply(false)
|
||||
alias(libs.plugins.detekt).apply(false)
|
||||
}
|
||||
|
|
27
fastlane/metadata/android/bg/full_description.txt
Normal file
27
fastlane/metadata/android/bg/full_description.txt
Normal file
|
@ -0,0 +1,27 @@
|
|||
Разкрийте спомени, не лични данни. Fossify Gallery е страхотно приложение за снимки и видеоклипове – мощно и напълно поверително. Без реклами, без излишни права – само безпроблемно изживяване, създадено за вас.
|
||||
|
||||
🖼️ ФОТО РЕДАКТИРАНЕ НА ВЪРХА НА ПРЪСТИТЕ ВИ
|
||||
Подобрете снимките си с обикновен, но мощен редактор за снимки. Изрязвайте, преоразмерявайте, завъртайте, обръщайте, рисувайте и прилагайте зашеметяващи филтри, всичко това без компромис с поверителността. Вземете контрола върху спомените си както никога досега.
|
||||
|
||||
🌐 ПОВЕРИТЕЛНОСТТА НА ПЪРВО МЯСТО, ВИНАГИ
|
||||
Вашата поверителност е от значение. Забравете за жадните за данни корпорации. Fossify Gallery ви дава контрол. Премахнете описателните данни на EXIF като GPS координати и данни за камерата, за да останат спомените ви само ваши.
|
||||
|
||||
🔒 ВЪРХОВНА СИГУРНОСТ
|
||||
Защитете спомените си с ПИН, шаблон или пръстов отпечатък. Заключете конкретни снимки, видеоклипове или цялото приложение – вие решавате кой има достъп. Спокойствието е гарантирано.
|
||||
|
||||
🔄 ЛЕСНО ВЪЗСТАНОВЯВАНЕ
|
||||
Дишайте спокойно – грешки се случват! Вграденото кошче на Fossify Gallery ви позволява да възстановите изтрити снимки и видеа за секунди. Никакви изгубени съкровища, само чисто облекчение.
|
||||
|
||||
🎨 ВАШАТА ГАЛЕРИЯ, ВАШИЯТ СТИЛ
|
||||
Персонализирайте визията, усещането и функциите според вашия стил. От теми на интерфейса до функционални бутони – Fossify Gallery ви дава свободата да творите.
|
||||
|
||||
📷 СВОБОДА НА ФОРМАТИТЕ
|
||||
JPEG, JPEG XL, PNG, MP4, MKV, RAW, SVG, GIF, видеа и още – покриваме всичките ви спомени, независимо от форма̀та. Без ограничения, само безкрайни възможности.
|
||||
|
||||
✨ МАТЕРИАЛЕН ДИЗАЙН С ДИНАМИЧНИ ТЕМИ
|
||||
Насладете се на интуитивен материален дизайн с динамични теми. Искате повече? Разгледайте персонализираните теми и направете галерията си наистина единствена.
|
||||
|
||||
Разгледайте още приложения на Fossify: https://www.fossify.org
|
||||
Отворен изходен код: https://www.github.com/FossifyOrg
|
||||
Присъединете се към общността в Reddit: https://www.reddit.com/r/Fossify
|
||||
Свържете се в Telegram: https://t.me/Fossify
|
1
fastlane/metadata/android/bg/short_description.txt
Normal file
1
fastlane/metadata/android/bg/short_description.txt
Normal file
|
@ -0,0 +1 @@
|
|||
Галерия с редактор на снимки. Свободна, поверителна, без реклами, без уловки.
|
|
@ -1 +0,0 @@
|
|||
Фосифай Галерия
|
|
@ -1 +0,0 @@
|
|||
* S'han afegit algunes traduccions, s'ha corregit l'enllaç a la política de privadesa.
|
|
@ -1,2 +0,0 @@
|
|||
* S'ha corregit el zoom en les imatges d'alta resolució
|
||||
* S'han afegit algunes traduccions
|
|
@ -1,2 +0,0 @@
|
|||
* S'ha eliminat la biblioteca propietària de panorames
|
||||
* S'han afegit algunes traduccions
|
|
@ -1,2 +0,0 @@
|
|||
* S'ha eliminat el missatge d'aplicació falsa en fer servir l'editor.
|
||||
* S'han afegit algunes traduccions
|
|
@ -1,6 +0,0 @@
|
|||
* S'ha corregit una fallada en reproduir vídeos.
|
||||
* S'ha corregit la presentació de diapositives a l'Android 14.
|
||||
* S'ha afegit suport per a AVIF.
|
||||
* S'ha corregit el restabliment de la posició després de girar el dispositiu.
|
||||
* S'han corregit les captures de pantalla d'ampliació quan s'ha activat un zoom d'un a doble toc.
|
||||
* S'han afegit traduccions
|
|
@ -1,2 +0,0 @@
|
|||
* S'han corregit les miniatures negres de diverses imatges.
|
||||
* S'han afegit diverses traduccions
|
|
@ -16,7 +16,7 @@ Respireu, hi ha accidents! La paperera de reciclatge integrada de la Galeria Fos
|
|||
Personalitzeu l'aspecte, el comportament i la funcionalitat perquè coincideixi amb el vostre estil. Des de temes d'interfície d'usuari fins a botons de funció, la Fossify Gallery us dona la llibertat creativa que anheleu.
|
||||
|
||||
📷 LLIBERTAT DE FORMATS UNIVERSALS:
|
||||
JPEG, PNG, MP4, MKV, RAW, SVG, GIF, vídeos i més. Tenim els vostres records coberts, en qualsevol format que trieu. Sense restriccions, només possibilitats il·limitades.
|
||||
JPEG, JPEG XL, PNG, MP4, MKV, RAW, SVG, GIF, vídeos i més. Tenim els vostres records coberts, en qualsevol format que trieu. Sense restriccions, només possibilitats il·limitades.
|
||||
|
||||
✨ MATERIAL DESIGN AMB TEMES DINÀMICS:
|
||||
Experimenteu la bellesa del «material design» intuïtiu amb temes dinàmics. En voleu més? Submergiu-vos en els temes personalitzats i feu que la galeria sigui realment única.
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
Fossify Gallery
|
|
@ -1 +0,0 @@
|
|||
* Added some translations, fixed privacy policy link.
|
|
@ -1,2 +0,0 @@
|
|||
* Fixed zooming in high-res images
|
||||
* Added some translations
|
|
@ -1,2 +0,0 @@
|
|||
* Removed proprietary panorama library
|
||||
* Added some translations
|
|
@ -1,2 +0,0 @@
|
|||
* Removed fake app message when using the editor.
|
||||
* Added some translations
|
|
@ -1,6 +0,0 @@
|
|||
* Opraven pád při přehrávání videa.
|
||||
* Opravena prezentace na Androidu 14.
|
||||
* Přidána podpora pro AVIF.
|
||||
* Opraveno obnovení pozice po otočení zařízení.
|
||||
* Opraveno zvětšování snímků obrazovky při zapnutém přiblížení jedním až dvěma klepnutími.
|
||||
* Přidány některé překlady
|
|
@ -1,2 +0,0 @@
|
|||
* Opraveny černé náhledy u některých obrázků.
|
||||
* Přidány překlady
|
|
@ -1 +0,0 @@
|
|||
Galerie Fossify
|
|
@ -1 +0,0 @@
|
|||
Galleri med fotoredigering. Ingen reklamer, Open Source, Privat. Ingen bindinger.
|
|
@ -1 +0,0 @@
|
|||
Fossify Galleri
|
|
@ -1 +0,0 @@
|
|||
* Einige Übersetzungen hinzugefügt, Link zur Datenschutzrichtlinie korrigiert.
|
|
@ -1,2 +0,0 @@
|
|||
* Das Zoomen in hochauflösenden Bildern korrigiert.
|
||||
* Einige Übersetzungen hinzugefügt
|
|
@ -1,2 +0,0 @@
|
|||
* Proprietäre Panorama-Bibliothek entfernt
|
||||
* Einige Übersetzungen hinzugefügt
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue