mirror of
https://github.com/gsantner/dandelion
synced 2024-09-28 19:00:11 +02:00
Compare commits
35 commits
Author | SHA1 | Date | |
---|---|---|---|
774c5bec59 | |||
c65aab3840 | |||
c2bea7bec0 | |||
36bd1af0b9 | |||
67b0bbbfd2 | |||
b80cc3ab04 | |||
37f586912f | |||
de378b8adc | |||
8161353de7 | |||
c42b4995b3 | |||
5a5d1d66b3 | |||
ceb0002546 | |||
0cf003ea38 | |||
904f2af20a | |||
d923630b42 | |||
a76a463cd4 | |||
c9c10a6fd4 | |||
e5866ffb2b | |||
97d9bf434e | |||
f1464b5f8f | |||
369abf14a5 | |||
ceb98c4258 | |||
4ebd393250 | |||
f3b3c6a160 | |||
ff62aa5a07 | |||
6fbd399a4b | |||
fa7e37ccba | |||
20d75acd39 | |||
7b1897b2e0 | |||
93aadae64b | |||
a7dd4a6166 | |||
cf1f0100ba | |||
875f613cd9 | |||
ea1ee6bc40 | |||
a66d7bf3b2 |
3
.github/ISSUE_TEMPLATE.md
vendored
3
.github/ISSUE_TEMPLATE.md
vendored
|
@ -21,7 +21,4 @@
|
||||||
Description:
|
Description:
|
||||||
What this is about, what happens and what is expected to happen. What needs to be done for it to happen.
|
What this is about, what happens and what is expected to happen. What needs to be done for it to happen.
|
||||||
If a crash is happening a log is needed. Screenshots or demonstration videos are always helpful too.
|
If a crash is happening a log is needed. Screenshots or demonstration videos are always helpful too.
|
||||||
|
|
||||||
About logging:
|
|
||||||
https://gsantner.net/android-contribution-guide/?packageid=com.github.dfa.diaspora_android&name=dandelion&web=https://github.com/gsantner/dandelion#logcat
|
|
||||||
-->
|
-->
|
||||||
|
|
68
.github/workflows/build-android-project.yml
vendored
Normal file
68
.github/workflows/build-android-project.yml
vendored
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
##############################################################################################################################
|
||||||
|
# # Cleanup:
|
||||||
|
#const sleep = ms => () => new Promise((resolve, reject) => window.setTimeout(resolve, ms));
|
||||||
|
#Promise.resolve()
|
||||||
|
#.then(() => { document.getElementsByClassName("details-overlay details-reset position-relative d-inline-block ")[3].children[0].click(); })
|
||||||
|
#.then(sleep(500))
|
||||||
|
#.then(() => { document.getElementsByClassName("dropdown-item btn-link menu-item-danger")[0].click(); })
|
||||||
|
#.then(sleep(1000))
|
||||||
|
#.then(() => { document.getElementsByClassName("btn btn-block btn-danger")[0].click();});
|
||||||
|
#
|
||||||
|
# while [ 1 ] ; do sleep 4; xdotool key Up; sleep 0.1; xdotool key Return; done
|
||||||
|
##############################################################################################################################
|
||||||
|
|
||||||
|
name: "CI"
|
||||||
|
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
if: "!contains(github.event.head_commit.message, 'ci skip') && (!contains(github.event_name, 'pull_request') || (contains(github.event_name, 'pull_request') && github.event.pull_request.head.repo.full_name != github.repository))"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
|
||||||
|
- name: "Checkout: Code"
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
|
||||||
|
- name: "Checkout: Code (PR)"
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
if: "contains(github.event_name, 'pull_request')"
|
||||||
|
with:
|
||||||
|
ref: ${{github.event.pull_request.head.ref}}
|
||||||
|
repository: ${{github.event.pull_request.head.repo.full_name}}
|
||||||
|
|
||||||
|
- name: "Setup: Java"
|
||||||
|
uses: actions/setup-java@v1
|
||||||
|
with:
|
||||||
|
java-version: 1.8
|
||||||
|
|
||||||
|
- name: "Cache: Gradle"
|
||||||
|
uses: actions/cache@v2
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.gradle
|
||||||
|
.gradle
|
||||||
|
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('gradle/wrapper/gradle-wrapper.*') }}
|
||||||
|
|
||||||
|
- name: "Build: Project with make"
|
||||||
|
run: make clean all
|
||||||
|
|
||||||
|
- name: "Build: List dist files"
|
||||||
|
if: always()
|
||||||
|
run: find dist -type f -maxdepth 2
|
||||||
|
|
||||||
|
- name: "Artifacts: All"
|
||||||
|
if: always()
|
||||||
|
uses: actions/upload-artifact@v2.2.1
|
||||||
|
with:
|
||||||
|
name: "all"
|
||||||
|
path: dist
|
||||||
|
retention-days: 5
|
||||||
|
|
||||||
|
- name: "Artifacts: Android APK"
|
||||||
|
uses: actions/upload-artifact@v2.2.1
|
||||||
|
with:
|
||||||
|
name: "android-apk"
|
||||||
|
path: |
|
||||||
|
dist/*.apk
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -36,6 +36,7 @@ tmp/
|
||||||
### Gradle ###
|
### Gradle ###
|
||||||
.gradle
|
.gradle
|
||||||
build/
|
build/
|
||||||
|
dist/
|
||||||
gradle-app.setting
|
gradle-app.setting
|
||||||
|
|
||||||
# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
|
# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
|
||||||
|
|
48
.travis.yml
48
.travis.yml
|
@ -1,48 +0,0 @@
|
||||||
language: android
|
|
||||||
jdk: oraclejdk8
|
|
||||||
|
|
||||||
before_cache:
|
|
||||||
# Do not cache a few Gradle files/directories (see https://docs.travis-ci.com/user/languages/java/#Caching)
|
|
||||||
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
|
|
||||||
- rm -fr $HOME/.gradle/caches/*/plugin-resolution/
|
|
||||||
|
|
||||||
cache:
|
|
||||||
directories:
|
|
||||||
# Android SDK
|
|
||||||
- $HOME/android-sdk-dl
|
|
||||||
- $HOME/android-sdk
|
|
||||||
|
|
||||||
# Gradle dependencies
|
|
||||||
- $HOME/.gradle/caches/
|
|
||||||
- $HOME/.gradle/wrapper/
|
|
||||||
|
|
||||||
# Android build cache (see http://tools.android.com/tech-docs/build-cache)
|
|
||||||
- $HOME/.android/build-cache
|
|
||||||
|
|
||||||
install:
|
|
||||||
# Download and unzip the Android SDK tools (if not already there thanks to the cache mechanism)
|
|
||||||
# Latest version available here: https://developer.android.com/studio/index.html#downloads
|
|
||||||
- if test ! -e $HOME/android-sdk-dl/sdk-tools.zip ; then curl https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip > $HOME/android-sdk-dl/sdk-tools.zip ; fi
|
|
||||||
- unzip -qq -n $HOME/android-sdk-dl/sdk-tools.zip -d $HOME/android-sdk
|
|
||||||
|
|
||||||
# Install or update Android SDK components (will not do anything if already up to date thanks to the cache mechanism)
|
|
||||||
- echo y | $HOME/android-sdk/tools/bin/sdkmanager 'tools' > /dev/null
|
|
||||||
- echo y | $HOME/android-sdk/tools/bin/sdkmanager 'platform-tools' > /dev/null
|
|
||||||
- echo y | $HOME/android-sdk/tools/bin/sdkmanager 'build-tools;26.0.2' > /dev/null
|
|
||||||
- echo y | $HOME/android-sdk/tools/bin/sdkmanager 'platforms;android-27' > /dev/null
|
|
||||||
- echo y | $HOME/android-sdk/tools/bin/sdkmanager 'extras;google;m2repository' > /dev/null
|
|
||||||
|
|
||||||
branches:
|
|
||||||
except:
|
|
||||||
- gh-pages
|
|
||||||
- l10n_master
|
|
||||||
- crowdin
|
|
||||||
|
|
||||||
env:
|
|
||||||
global:
|
|
||||||
- ANDROID_HOME=$HOME/android-sdk
|
|
||||||
matrix:
|
|
||||||
- TASK="clean lintFlavorDefaultDebug --stacktrace"
|
|
||||||
- TASK="clean build check -x lint --stacktrace"
|
|
||||||
|
|
||||||
script: "./gradlew --no-daemon --parallel $TASK"
|
|
|
@ -1,9 +1,11 @@
|
||||||
![](https://test.gsantner.net/matomo/piwik.php?action_name=inapp_changelog&idsite=2&rec=1&urlref=https%3A%2F%2Fgithub.com%2Fgsantner%2Fdandelion%2FCHANGELOG.md&_cvar=%7B%221%22%3A%5B%22source%22%2C%22changelog%22%5D%2C%222%22%3A%5B%22project%22%2C%22dandelion%22%5D%2C%223%22%3A%5B%22packageid%22%2C%22com.github.dfa.diaspora_android%22%5D%2C%224%22%3A%5B%22referrer%22%2C%22https%3A%2F%2Fgithub.com%2Fgsantner%2Fdandelion%2FCHANGELOG.md%22%5D%7D)
|
### Recent changes
|
||||||
|
- See [Discussions](https://github.com/gsantner/dandelion/discussions), [Issues](https://github.com/gsantner/dandelion/issues) and [Project page](https://github.com/gsantner/dandelion#readme) to see what is going on.
|
||||||
|
|
||||||
|
### v1.4.0
|
||||||
### v1.3.x
|
- Add seconds to 'save picture' date format
|
||||||
- Updated translations
|
- Updated translations
|
||||||
- Added german F-Droid description translation
|
- Added german F-Droid description translation
|
||||||
|
- Update to Android SDK 29
|
||||||
|
|
||||||
### v1.3.0
|
### v1.3.0
|
||||||
- Add option to open youtube links external/in YouTube app (optional)
|
- Add option to open youtube links external/in YouTube app (optional)
|
||||||
|
@ -21,7 +23,6 @@
|
||||||
|
|
||||||
**New features:**
|
**New features:**
|
||||||
- All new Aspects and Tags, using a searchable dialog
|
- All new Aspects and Tags, using a searchable dialog
|
||||||
- A new home - project blog/page: <https://gsantner.net/project/dandelion.html>
|
|
||||||
|
|
||||||
**Fixed:**
|
**Fixed:**
|
||||||
- Sometimes the Stream went white, which is due an still (>3 years) unfixed Android Support library bug. It should not occur very often anymore due less use of fragments.
|
- Sometimes the Stream went white, which is due an still (>3 years) unfixed Android Support library bug. It should not occur very often anymore due less use of fragments.
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
<!--
|
<!--
|
||||||
This file contains references to people who contributed to the app.
|
This file contains references to people who contributed to the app.
|
||||||
You can also send a mail to [gsantner AT mailbox DOT org](http://gsantner.net#contact) to get included.
|
|
||||||
|
|
||||||
Schema: **[Name](Reference)**<br/>~° Text
|
Schema: **[Name](Reference)**<br/>~° Text
|
||||||
|
|
||||||
|
@ -13,7 +12,7 @@ Where:
|
||||||
|
|
||||||
## LIST OF CONTRIBUTORS
|
## LIST OF CONTRIBUTORS
|
||||||
-->
|
-->
|
||||||
* **[Gregor Santner](http://gsantner.net)**<br/>~° Current developer of dandelion
|
* **[Gregor Santner](http://github.com/gsantner)**<br/>~° Development of dandelion
|
||||||
* **[Paul Schaub](https://github.com/vanitasvitae)**<br/>~° Development of dandelion
|
* **[Paul Schaub](https://github.com/vanitasvitae)**<br/>~° Development of dandelion
|
||||||
* **[Martín Vukovic](martinvukovic AT protonmail DOT com)**<br/>~° Diaspora Native WebApp
|
* **[Martín Vukovic](martinvukovic AT protonmail DOT com)**<br/>~° Diaspora Native WebApp
|
||||||
* **[Gaukler Faun](https://github.com/scoute-dich)**<br/>~° Diaspora Native WebApp additions
|
* **[Gaukler Faun](https://github.com/scoute-dich)**<br/>~° Diaspora Native WebApp additions
|
||||||
|
|
99
Makefile
Normal file
99
Makefile
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
# License of Makefile: Public Domain / CC0
|
||||||
|
.PHONY: $(shell sed -n -e '/^$$/ { n ; /^[^ .\#][^ ]*:/ { s/:.*$$// ; p ; } ; }' $(MAKEFILE_LIST))
|
||||||
|
.NOTPARALLEL: clean
|
||||||
|
.DEFAULT_GOAL := all
|
||||||
|
|
||||||
|
env-%:
|
||||||
|
@: $(if ${${*}},,$(error Environment variable $* not set))
|
||||||
|
####################################################################################
|
||||||
|
|
||||||
|
DIST_DIR = dist
|
||||||
|
MOVE = mv
|
||||||
|
|
||||||
|
all: $(DIST_DIR) spellcheck lint deptree test build aapt_dump_badging
|
||||||
|
|
||||||
|
####################################################################################
|
||||||
|
|
||||||
|
$(DIST_DIR):
|
||||||
|
mkdir -p ${DIST_DIR}
|
||||||
|
|
||||||
|
ANDROID_BUILD_TOOLS := $(shell test -n "$ANDROID_SDK_ROOT" && find "${ANDROID_SDK_ROOT}/build-tools" -iname "aapt" | sort -r | head -n1 | xargs dirname)
|
||||||
|
TOOL_SPELLCHECKING_ISPELL := $(shell command -v ispell 2> /dev/null)
|
||||||
|
|
||||||
|
FLAVOR := $(or ${FLAVOR},${FLAVOR},Atest)
|
||||||
|
|
||||||
|
.NOTPARALLEL: gradle gradle-analyze-log
|
||||||
|
gradle: env-ANDROID_SDK_ROOT
|
||||||
|
mkdir -p $(DIST_DIR)/log/
|
||||||
|
chmod +x gradlew
|
||||||
|
./gradlew --no-daemon --parallel --stacktrace $A 2>&1 | tee "$(DIST_DIR)/log/gradle.log"
|
||||||
|
@echo "-----------------------------------------------------------------------------------"
|
||||||
|
|
||||||
|
gradle-analyze-log:
|
||||||
|
mv "$(DIST_DIR)/log/gradle.log" "$(DIST_DIR)/log/gradle$A.log"
|
||||||
|
cat "$(DIST_DIR)/log/gradle$A.log" | grep "BUILD " | tail -n1 | grep -q "BUILD SUCCESSFUL in"
|
||||||
|
|
||||||
|
adb: env-ANDROID_SDK_ROOT
|
||||||
|
"${ANDROID_SDK_ROOT}/platform-tools/adb" $A 2>&1 | tee "$(DIST_DIR)/log/adb-$L.log"
|
||||||
|
|
||||||
|
aapt: env-ANDROID_SDK_ROOT
|
||||||
|
"${ANDROID_BUILD_TOOLS}/aapt" $A 2>&1 | grep -v 'application-label-' | tee "$(DIST_DIR)/log/aapt$L.log"
|
||||||
|
|
||||||
|
build:
|
||||||
|
rm -f $(DIST_DIR)/*.apk
|
||||||
|
$(MAKE) A="clean assembleFlavor$(FLAVOR) -x lint" gradle
|
||||||
|
find app -type f -newermt '-300 seconds' -iname '*.apk' -not -iname '*unsigned.apk' | xargs cp -R -t $(DIST_DIR)/
|
||||||
|
$(MAKE) A="-build" gradle-analyze-log
|
||||||
|
|
||||||
|
lint:
|
||||||
|
rm -Rf $(DIST_DIR)/lint
|
||||||
|
mkdir -p $(DIST_DIR)/lint/
|
||||||
|
$(MAKE) A="lintFlavorDefaultDebug" gradle
|
||||||
|
find app -type f -iname 'lint-results-*' | grep -v 'intermediates' | xargs cp -R -t $(DIST_DIR)/lint
|
||||||
|
$(MAKE) A="-lint" gradle-analyze-log
|
||||||
|
|
||||||
|
test:
|
||||||
|
rm -Rf $(DIST_DIR)/tests
|
||||||
|
$(MAKE) A="testFlavorDefaultDebugUnitTest -x lint" gradle
|
||||||
|
mkdir -p app/build/test-results/testFlavorDefaultDebugUnitTest && echo 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHRlc3RzdWl0ZSBuYW1lPSJkdW1teSIgdGVzdHM9IjEiIHNraXBwZWQ9IjAiIGZhaWx1cmVzPSIwIiBlcnJvcnM9IjAiIHRpbWVzdGFtcD0iMjAyMC0xMi0wOFQwMDowMDowMCIgaG9zdG5hbWU9ImxvY2FsaG9zdCIgdGltZT0iMC4wMSI+CiAgPHByb3BlcnRpZXMvPgogIDx0ZXN0Y2FzZSBuYW1lPSJkdW1teSIgY2xhc3NuYW1lPSJkdW1teSIgdGltZT0iMC4wMSIvPgogIDxzeXN0ZW0tb3V0PjwhW0NEQVRBW11dPjwvc3lzdGVtLW91dD4KICA8c3lzdGVtLWVycj48IVtDREFUQVtdXT48L3N5c3RlbS1lcnI+CjwvdGVzdHN1aXRlPgo=' | base64 -d > 'app/build/test-results/testFlavorDefaultDebugUnitTest/TEST-dummy.xml'
|
||||||
|
find app -type d -iname 'testFlavorDefaultDebugUnitTest' | xargs cp -R -t $(DIST_DIR)/
|
||||||
|
mv ${DIST_DIR}/testFlavorDefaultDebugUnitTest $(DIST_DIR)/tests
|
||||||
|
$(MAKE) A="-test" gradle-analyze-log
|
||||||
|
|
||||||
|
deptree:
|
||||||
|
$(MAKE) A="app:dependencies --configuration flavor$(FLAVOR)DebugRuntimeClasspath" gradle
|
||||||
|
$(MAKE) A="-dependency-tree" gradle-analyze-log
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(MAKE) A="clean" gradle
|
||||||
|
rm -Rf $(DIST_DIR) app/build app/flavor* .idea dist
|
||||||
|
find . -type f -iname "*.iml" -delete
|
||||||
|
$(MAKE) $(DIST_DIR)
|
||||||
|
@echo "-----------------------------------------------------------------------------------"
|
||||||
|
|
||||||
|
install:
|
||||||
|
$(MAKE) A="install -r $(DIST_DIR)/*.apk" L="install" adb
|
||||||
|
|
||||||
|
run:
|
||||||
|
$(MAKE) A="shell monkey -p $$(aapt dump badging $(DIST_DIR)/*.apk | grep package: | sed 's@.* name=@@' | sed 's@ .*@@' | xargs | head -n1) -c android.intent.category.LAUNCHER 1" L="run" adb
|
||||||
|
|
||||||
|
aapt_dump_badging:
|
||||||
|
$(MAKE) A="dump badging $(DIST_DIR)/*.apk" aapt
|
||||||
|
@echo "-----------------------------------------------------------------------------------"
|
||||||
|
|
||||||
|
spellcheck:
|
||||||
|
mkdir -p "$(DIST_DIR)/lint/"
|
||||||
|
ifndef TOOL_SPELLCHECKING_ISPELL
|
||||||
|
@echo "Tool ispell (spellcheck) not found in PATH. Spellcheck skipped." > "$(DIST_DIR)/lint/stringsxml-spellcheck.txt"
|
||||||
|
else
|
||||||
|
@echo "Use ispell for spellchecking the original values/strings.xml"
|
||||||
|
find . -iname "strings.xml" -path "*/main*/values/*" | head -n1 | xargs cat \
|
||||||
|
| grep "<string name=" | sed 's@.*">@@' | sed 's@</string>@@' | sed 's@\\n@ @g' | sed 's@\\@@g' \
|
||||||
|
| ispell -W3 -a | grep ^\& | sed 's@[0-9]@@g' | sort | uniq | cut -d, -f1-4 \
|
||||||
|
| sed 's@^..@- @' | column -t -s: \
|
||||||
|
> "$(DIST_DIR)/lint/stringsxml-spellcheck.txt"
|
||||||
|
@echo "\nPotential words with bad spelling:"
|
||||||
|
endif
|
||||||
|
@cat "$(DIST_DIR)/lint/stringsxml-spellcheck.txt"
|
||||||
|
@echo "-----------------------------------------------------------------------------------"
|
||||||
|
|
96
NEWS.md
Normal file
96
NEWS.md
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
# dandelion - News
|
||||||
|
|
||||||
|
## General
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
You can install and update from [F-Droid](https://f-droid.org/repository/browse/?fdid=com.github.dfa.diaspora_android) or [GitHub](https://github.com/gsantner/dandelion/releases/latest).
|
||||||
|
|
||||||
|
F-Droid is a store for free & open source apps.
|
||||||
|
The *.apk's available for download are signed by the F-Droid team and guaranteed to correspond to the (open source) source code of dandelion.
|
||||||
|
Generally this is the recommended way to install dandelion & keep it updated.
|
||||||
|
|
||||||
|
|
||||||
|
### Get informed
|
||||||
|
* Check the [project readme](https://github.com/gsantner/dandelion/tree/news#readme) for general project information.
|
||||||
|
* Check the [project news](https://github.com/gsantner/dandelion/blob/master/NEWS.md#readme) for more details on what is going on.
|
||||||
|
* Check the [project git history](https://github.com/gsantner/dandelion/commits/master) for most recent code changes.
|
||||||
|
|
||||||
|
### The right place to ask
|
||||||
|
If you have questions or found an issue please head to the [dandelion project](https://github.com/gsantner/dandelion/issues/new/choose) and ask there.
|
||||||
|
[Search](https://github.com/gsantner/dandelion/issues?q=#js-issues-search) for same/similar and related issues/questions before, it might be already answered or resolved.
|
||||||
|
|
||||||
|
|
||||||
|
### Navigation
|
||||||
|
* [dandelion v1.2 - Add dandelior - Searchable Tags and Aspects](#dandelion-v12---add-dandelior---searchable-tags-and-aspects)
|
||||||
|
* [dandelion v0.1.2 - Aspekte, Pod wechseln](#dandelion-v012---aspekte-pod-wechseln)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
# dandelion\* v1.2 - Add dandelior\* - Searchable Tags and Aspects
|
||||||
|
_12. August 2018_
|
||||||
|
|
||||||
|
## dandelior\* is a rebranded version of dandelion\*
|
||||||
|
dandelior\* is based 100% on the same code and resources as dandelion\*. Its from the same code repository, just a different build flavor.
|
||||||
|
The main purpose of dandelior\* is the most requested feature till date - to support multiple accounts / another account at dandelion\*.
|
||||||
|
|
||||||
|
- Added an (rebranded) flavor of dandelion: dandelior
|
||||||
|
- Only differenties in use are other (black) icon and AMOLED colors by default enabled
|
||||||
|
- Already available on F-Droid
|
||||||
|
|
||||||
|
**New features:**
|
||||||
|
- All new Aspects and Tags, using a searchable dialog
|
||||||
|
|
||||||
|
**Fixed:**
|
||||||
|
- Sometimes the Stream went white, which is due an still (3+ years) unfixed Android Support library bug. It should not occur very often anymore due less use of fragments.
|
||||||
|
|
||||||
|
**Improved:**
|
||||||
|
- Various small tweaks
|
||||||
|
- Updated translation files
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
# dandelion v0.1.2 - Aspekte, Pod wechseln
|
||||||
|
_05. Juni 2016_
|
||||||
|
|
||||||
|
In den letzten Tagen hat @gsantner viel Zeit in die inoffizielle diaspora\* Android App ([dandelion\*](https://github.com/gsantner/dandelion)) investiert.
|
||||||
|
|
||||||
|
Dabei wurden unter anderem folgende Änderungen beigesteuert:
|
||||||
|
|
||||||
|
- Allgemeines zur Usability
|
||||||
|
- Animationen für den Activity-Wechsel und Startup, WebView-Scroll-Top
|
||||||
|
- Podliste caching
|
||||||
|
- Aspekt-Liste und Aspekte hinzugefügt
|
||||||
|
- Verbessertes Sharing aus der App
|
||||||
|
- Material Progressbar
|
||||||
|
- Suche verbessert
|
||||||
|
- Collapsing top menu
|
||||||
|
- toolbar/actions/menu geändert, fab entfernt
|
||||||
|
- Refactoring layout & menu files, dialogs
|
||||||
|
- Überarbeitete Main,Splash,PodSelectionActivity
|
||||||
|
- Pod wechseln
|
41
README.md
41
README.md
|
@ -1,9 +1,9 @@
|
||||||
[![GitHub release](https://img.shields.io/github/tag/gsantner/dandelion.svg)](https://github.com/gsantner/dandelion/releases)
|
[![GitHub releases](https://img.shields.io/github/tag/gsantner/dandelion.svg)](https://github.com/gsantner/dandelion/releases)
|
||||||
[![Build Status](https://travis-ci.org/gsantner/dandelion.svg?branch=master)](https://travis-ci.org/gsantner/dandelion)
|
[![GitHub downloads](https://img.shields.io/github/downloads/gsantner/dandelion/total.svg?logo=github&logoColor=lime)](https://github.com/gsantner/dandelion/releases)
|
||||||
[![Translate - with Stringlate](https://img.shields.io/badge/stringlate-translate-green.svg)](https://lonamiwebs.github.io/stringlate/translate?git=https%3A%2F%2Fgithub.com%2Fgsantner%2Fdandelion.git&mail=gro.xobliam@@rentnasg)
|
[![Translate on Crowdin](https://img.shields.io/badge/translate-crowdin-green.svg)](https://crowdin.com/project/diaspora-for-android/invite)
|
||||||
[![Chat - Matrix](https://img.shields.io/badge/chat-on%20matrix-blue.svg)](https://matrix.to/#/#dandelion:matrix.org) [![Chat - FreeNode IRC](https://img.shields.io/badge/chat-on%20irc-blue.svg)](https://kiwiirc.com/client/irc.freenode.net/?nick=dandelion-anon|?##dandelion)
|
[![Chat on Matrix](https://img.shields.io/badge/chat-matrix-blue.svg)](https://matrix.to/#/#dandelion:matrix.org)
|
||||||
[![Donate](https://img.shields.io/badge/donate-appreciation-orange.svg)](https://gsantner.net/supportme/?project=dandelion&source=readme)
|
[![GitHub CI](https://github.com/gsantner/dandelion/workflows/CI/badge.svg)](https://github.com/gsantner/dandelion/actions)
|
||||||
[![Donate LiberaPay](https://img.shields.io/badge/donate-liberapay-orange.svg)](https://liberapay.com/gsantner/donate) ![](https://test.gsantner.net/matomo/piwik.php?action_name=readme&idsite=2&rec=1&urlref=https%3A%2F%2Fgithub.com%2Fgsantner%2Fdandelion%2FREADME.md&_cvar=%7B%221%22%3A%5B%22source%22%2C%22readme%22%5D%2C%222%22%3A%5B%22project%22%2C%22dandelion%22%5D%2C%223%22%3A%5B%22packageid%22%2C%22com.github.dfa.diaspora_android%22%5D%2C%224%22%3A%5B%22referrer%22%2C%22https%3A%2F%2Fgithub.com%2Fgsantner%2Fdandelion%2FREADME.md%22%5D%7D)
|
[![Codacy code quality](https://img.shields.io/codacy/grade/aff869c440bc48b7bd64680e97cbc453)](https://www.codacy.com/app/gsantner/dandelion)
|
||||||
|
|
||||||
# dandelion\*
|
# dandelion\*
|
||||||
<img src="/app/src/main/ic_launcher-web.png" align="left" width="100" hspace="10" vspace="10">
|
<img src="/app/src/main/ic_launcher-web.png" align="left" width="100" hspace="10" vspace="10">
|
||||||
|
@ -39,12 +39,11 @@ dandelion\* requires access to the Internet and to external storage to be able t
|
||||||
|
|
||||||
## Contributions
|
## Contributions
|
||||||
The project is always open for contributions and accepts pull requests.
|
The project is always open for contributions and accepts pull requests.
|
||||||
The project uses [AOSP Java Code Style](https://source.android.com/source/code-style#follow-field-naming-conventions), with one exception: private members are `_camelCase` instead of `mBigCamel`. You may use Android Studios _auto reformat feature_ before sending a PR. See [gsantner's android contribution guide](https://gsantner.net/android-contribution-guide/?packageid=com.github.dfa.diaspora_android&name=dandelion&web=https://github.com/gsantner/dandelion&source=readme#logcat) for more information.
|
The project uses [AOSP Java Code Style](https://source.android.com/source/code-style#follow-field-naming-conventions), with one exception: private members are `_camelCase` instead of `mBigCamel`. You may use Android Studios _auto reformat feature_ before sending a PR.
|
||||||
|
|
||||||
Translations can be contributed on GitHub or via [E-Mail](https://gsantner.net/#contact). You can use Stringlate ([![Translate - with Stringlate](https://img.shields.io/badge/stringlate-translate-green.svg)](https://lonamiwebs.github.io/stringlate/translate?git=https%3A%2F%2Fgithub.com%2Fgsantner%2Fdandelion.git)) to translate the project directly on your Android phone. It allows you to export as E-Mail attachement and to post on GitHub.
|
Translations can be contributed on GitHub. You can use Stringlate ([![Translate - with Stringlate](https://img.shields.io/badge/stringlate-translate-green.svg)](https://lonamiwebs.github.io/stringlate/translate?git=https%3A%2F%2Fgithub.com%2Fgsantner%2Fdandelion.git)) to translate the project directly on your Android phone. It allows you to export as E-Mail attachement and to post on GitHub.
|
||||||
|
|
||||||
Join our IRC or Matrix channel (bridged) and say hello! Don't be afraid to start talking. [![Chat - Matrix](https://img.shields.io/badge/chat-on%20matrix-blue.svg)](https://matrix.to/#/#dandelion:matrix.org) [![Chat - FreeNode IRC](https://img.shields.io/badge/chat-on%20irc-blue.svg)](https://kiwiirc.com/client/irc.freenode.net/?nick=dandelion-anon|?##dandelion)
|
|
||||||
|
|
||||||
|
Join our Matrix channel and say hello! Don't be afraid to start talking. [![Chat - Matrix](https://img.shields.io/badge/chat-on%20matrix-blue.svg)](https://matrix.to/#/#dandelion:matrix.org)
|
||||||
Note that the main project members are working on this project for free during leisure time, are mostly busy with their job/university/school, and may not react or start coding immediately.
|
Note that the main project members are working on this project for free during leisure time, are mostly busy with their job/university/school, and may not react or start coding immediately.
|
||||||
|
|
||||||
|
|
||||||
|
@ -62,23 +61,21 @@ For more licensing informations, see [`3rd party licenses`](/app/src/main/res/ra
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||
<div style="display:flex;" >
|
<div style="display:flex;" >
|
||||||
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/01.png" width="19%" >
|
<img src="https://raw.githubusercontent.com/gsantner/dandelion/master/metadata/en-US/phoneScreenshots/01.png" width="19%" >
|
||||||
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/02.png" width="19%" style="margin-left:10px;" >
|
<img src="https://raw.githubusercontent.com/gsantner/dandelion/master/metadata/en-US/phoneScreenshots/02.png" width="19%" style="margin-left:10px;" >
|
||||||
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/03.png" width="19%" style="margin-left:10px;" >
|
<img src="https://raw.githubusercontent.com/gsantner/dandelion/master/metadata/en-US/phoneScreenshots/03.png" width="19%" style="margin-left:10px;" >
|
||||||
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/04.png" width="19%" style="margin-left:10px;" >
|
<img src="https://raw.githubusercontent.com/gsantner/dandelion/master/metadata/en-US/phoneScreenshots/04.png" width="19%" style="margin-left:10px;" >
|
||||||
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/05.png" width="19%" style="margin-left:10px;" >
|
<img src="https://raw.githubusercontent.com/gsantner/dandelion/master/metadata/en-US/phoneScreenshots/05.png" width="19%" style="margin-left:10px;" >
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style="display:flex;" >
|
<div style="display:flex;" >
|
||||||
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/06.png" width="19%" >
|
<img src="https://raw.githubusercontent.com/gsantner/dandelion/master/metadata/en-US/phoneScreenshots/06.png" width="19%" >
|
||||||
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/07.png" width="19%" style="margin-left:10px;" >
|
<img src="https://raw.githubusercontent.com/gsantner/dandelion/master/metadata/en-US/phoneScreenshots/07.png" width="19%" style="margin-left:10px;" >
|
||||||
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/08.png" width="19%" style="margin-left:10px;" >
|
<img src="https://raw.githubusercontent.com/gsantner/dandelion/master/metadata/en-US/phoneScreenshots/08.png" width="19%" style="margin-left:10px;" >
|
||||||
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/09.png" width="19%" style="margin-left:10px;" >
|
<img src="https://raw.githubusercontent.com/gsantner/dandelion/master/metadata/en-US/phoneScreenshots/09.png" width="19%" style="margin-left:10px;" >
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
### Notice
|
### Notice
|
||||||
#### Maintainers
|
#### Maintainers
|
||||||
- gsantner ([GitHub](https://github.com/gsantner), [Web](https://gsantner.net/supportme/?project=dandelion&source=readme), [diaspora*](https://pod.geraspora.de/people/d1cbdd70095301341e834860008dbc6c))
|
- gsantner ([GitHub](https://github.com/gsantner), [diaspora*](https://pod.geraspora.de/people/d1cbdd70095301341e834860008dbc6c))
|
||||||
- Bitcoin: [1B9ZyYdQoY9BxMe9dRUEKaZbJWsbQqfXU5](https://gsantner.net/supportme/?project=dandelion&source=readme)
|
|
||||||
- vanitasvitae ([GitHub](https://github.com/vanitasvitae), [diaspora*](https://pod.geraspora.de/people/bbd7af90fbec013213e34860008dbc6c))
|
- vanitasvitae ([GitHub](https://github.com/vanitasvitae), [diaspora*](https://pod.geraspora.de/people/bbd7af90fbec013213e34860008dbc6c))
|
||||||
- Bitcoin: 1Ao3W6NaQv3xKppviB7RSFKjHo6PGd8RTy
|
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
## Screenshots
|
|
||||||
|
|
||||||
<div style="display:flex;" >
|
|
||||||
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/01.png" width="19%" >
|
|
||||||
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/02.png" width="19%" style="margin-left:10px;" >
|
|
||||||
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/03.png" width="19%" style="margin-left:10px;" >
|
|
||||||
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/04.png" width="19%" style="margin-left:10px;" >
|
|
||||||
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/05.png" width="19%" style="margin-left:10px;" >
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div style="display:flex;" >
|
|
||||||
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/06.png" width="19%" >
|
|
||||||
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/07.png" width="19%" style="margin-left:10px;" >
|
|
||||||
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/08.png" width="19%" style="margin-left:10px;" >
|
|
||||||
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/09.png" width="19%" style="margin-left:10px;" >
|
|
||||||
</div>
|
|
|
@ -12,8 +12,8 @@ android {
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
resValue "string", "manifest_package_id", "com.github.dfa.diaspora_android"
|
resValue "string", "manifest_package_id", "com.github.dfa.diaspora_android"
|
||||||
applicationId "com.github.dfa.diaspora_android"
|
applicationId "com.github.dfa.diaspora_android"
|
||||||
versionName "1.3.4"
|
versionName "1.3.5"
|
||||||
versionCode 45
|
versionCode 46
|
||||||
vectorDrawables.useSupportLibrary = true
|
vectorDrawables.useSupportLibrary = true
|
||||||
|
|
||||||
minSdkVersion rootProject.ext.version_minSdk
|
minSdkVersion rootProject.ext.version_minSdk
|
||||||
|
@ -21,6 +21,7 @@ android {
|
||||||
buildConfigField "boolean", "IS_TEST_BUILD", "false"
|
buildConfigField "boolean", "IS_TEST_BUILD", "false"
|
||||||
buildConfigField "boolean", "IS_GPLAY_BUILD", "false"
|
buildConfigField "boolean", "IS_GPLAY_BUILD", "false"
|
||||||
buildConfigField "String[]", "DETECTED_ANDROID_LOCALES", "${findUsedAndroidLocales()}"
|
buildConfigField "String[]", "DETECTED_ANDROID_LOCALES", "${findUsedAndroidLocales()}"
|
||||||
|
buildConfigField "String", "BUILD_DATE", "\"${getBuildDate()}\""
|
||||||
buildConfigField "String", "GITHASH", "\"${getGitHash()}\""
|
buildConfigField "String", "GITHASH", "\"${getGitHash()}\""
|
||||||
setProperty("archivesBaseName", applicationId + "-v" + versionCode + "-" + versionName)
|
setProperty("archivesBaseName", applicationId + "-v" + versionCode + "-" + versionName)
|
||||||
}
|
}
|
||||||
|
@ -89,8 +90,7 @@ android {
|
||||||
}
|
}
|
||||||
|
|
||||||
lintOptions {
|
lintOptions {
|
||||||
disable 'MissingTranslation'
|
disable 'MissingTranslation', 'InvalidPackage', 'ObsoleteLintCustomCheck', 'DefaultLocale', 'UnusedAttribute', 'VectorRaster', 'InflateParams', 'IconLocation', 'UnusedResources', 'TypographyEllipsis'
|
||||||
disable 'InvalidPackage'
|
|
||||||
abortOnError false
|
abortOnError false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -118,9 +118,10 @@ dependencies {
|
||||||
implementation 'commons-io:commons-io:2.6'
|
implementation 'commons-io:commons-io:2.6'
|
||||||
implementation "info.guardianproject.netcipher:netcipher:${version_library_netcipher}"
|
implementation "info.guardianproject.netcipher:netcipher:${version_library_netcipher}"
|
||||||
implementation "info.guardianproject.netcipher:netcipher-webkit:${version_library_netcipher}"
|
implementation "info.guardianproject.netcipher:netcipher-webkit:${version_library_netcipher}"
|
||||||
|
//noinspection AnnotationProcessorOnCompilePath
|
||||||
implementation "com.jakewharton:butterknife:${version_library_butterknife}"
|
implementation "com.jakewharton:butterknife:${version_library_butterknife}"
|
||||||
if (enable_plugin_kotlin) {
|
if (enable_plugin_kotlin) {
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$version_plugin_kotlin"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${version_plugin_kotlin}"
|
||||||
}
|
}
|
||||||
|
|
||||||
// Processors
|
// Processors
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
android:allowBackup="false"
|
android:allowBackup="false"
|
||||||
android:icon="@drawable/ic_launcher"
|
android:icon="@drawable/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
|
android:requestLegacyExternalStorage="true"
|
||||||
android:theme="@style/DiasporaLight">
|
android:theme="@style/DiasporaLight">
|
||||||
|
|
||||||
<provider
|
<provider
|
||||||
|
@ -59,7 +60,8 @@
|
||||||
android:theme="@style/DiasporaLight.NoActionBar"
|
android:theme="@style/DiasporaLight.NoActionBar"
|
||||||
android:windowSoftInputMode="adjustResize">
|
android:windowSoftInputMode="adjustResize">
|
||||||
|
|
||||||
<meta-data android:name="android.app.shortcuts"
|
<meta-data
|
||||||
|
android:name="android.app.shortcuts"
|
||||||
android:resource="@xml/shortcuts" />
|
android:resource="@xml/shortcuts" />
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
|
@ -68,6 +70,7 @@
|
||||||
<action android:name="sc_aspects" />
|
<action android:name="sc_aspects" />
|
||||||
<action android:name="sc_activities" />
|
<action android:name="sc_activities" />
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@ import com.github.dfa.diaspora_android.util.DiasporaUrlHelper;
|
||||||
|
|
||||||
import net.gsantner.opoc.util.AdBlock;
|
import net.gsantner.opoc.util.AdBlock;
|
||||||
import net.gsantner.opoc.util.ContextUtils;
|
import net.gsantner.opoc.util.ContextUtils;
|
||||||
|
import net.gsantner.opoc.util.ShareUtil;
|
||||||
|
|
||||||
public class App extends Application {
|
public class App extends Application {
|
||||||
private volatile static App app;
|
private volatile static App app;
|
||||||
|
@ -51,6 +52,7 @@ public class App extends Application {
|
||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
|
ShareUtil.setFileProviderAuthority(BuildConfig.APPLICATION_ID);
|
||||||
app = this;
|
app = this;
|
||||||
final Context c = getApplicationContext();
|
final Context c = getApplicationContext();
|
||||||
appSettings = AppSettings.get();
|
appSettings = AppSettings.get();
|
||||||
|
|
|
@ -128,7 +128,7 @@ public class DiasporaStreamFragment extends BrowserFragment {
|
||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
AppLog.d(this, "StreamFragment.onOptionsItemSelected()");
|
AppLog.d(this, "StreamFragment.onOptionsItemSelected()");
|
||||||
ShareUtil shu = new ShareUtil(getContext()).setFileProviderAuthority(BuildConfig.APPLICATION_ID);
|
ShareUtil shu = new ShareUtil(getContext());
|
||||||
PermissionChecker permc = new PermissionChecker(getActivity());
|
PermissionChecker permc = new PermissionChecker(getActivity());
|
||||||
switch (item.getItemId()) {
|
switch (item.getItemId()) {
|
||||||
case R.id.action_reload: {
|
case R.id.action_reload: {
|
||||||
|
@ -185,7 +185,7 @@ public class DiasporaStreamFragment extends BrowserFragment {
|
||||||
if (permc.mkdirIfStoragePermissionGranted(fileSaveDirectory)) {
|
if (permc.mkdirIfStoragePermissionGranted(fileSaveDirectory)) {
|
||||||
Bitmap bmp = ShareUtil.getBitmapFromWebView(webView);
|
Bitmap bmp = ShareUtil.getBitmapFromWebView(webView);
|
||||||
String filename = "dandelion-" + ShareUtil.SDF_SHORT.format(new Date()) + ".jpg";
|
String filename = "dandelion-" + ShareUtil.SDF_SHORT.format(new Date()) + ".jpg";
|
||||||
_cu.writeImageToFileJpeg(new File(fileSaveDirectory, filename), bmp);
|
_cu.writeImageToFile(new File(fileSaveDirectory, filename), bmp);
|
||||||
Snackbar.make(webView, getString(R.string.saving_screenshot_as)
|
Snackbar.make(webView, getString(R.string.saving_screenshot_as)
|
||||||
+ " " + filename, Snackbar.LENGTH_LONG).show();
|
+ " " + filename, Snackbar.LENGTH_LONG).show();
|
||||||
}
|
}
|
||||||
|
@ -195,7 +195,7 @@ public class DiasporaStreamFragment extends BrowserFragment {
|
||||||
|
|
||||||
case R.id.action_share_screenshot: {
|
case R.id.action_share_screenshot: {
|
||||||
if (permc.doIfExtStoragePermissionGranted(getString(R.string.screenshot_permission__appspecific))) {
|
if (permc.doIfExtStoragePermissionGranted(getString(R.string.screenshot_permission__appspecific))) {
|
||||||
shu.shareImage(ShareUtil.getBitmapFromWebView(webView), Bitmap.CompressFormat.JPEG);
|
shu.shareImage(ShareUtil.getBitmapFromWebView(webView));
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,7 +90,6 @@ import com.github.dfa.diaspora_android.web.WebHelper;
|
||||||
import com.github.dfa.diaspora_android.web.custom_tab.CustomTabActivityHelper;
|
import com.github.dfa.diaspora_android.web.custom_tab.CustomTabActivityHelper;
|
||||||
|
|
||||||
import net.gsantner.opoc.format.markdown.SimpleMarkdownParser;
|
import net.gsantner.opoc.format.markdown.SimpleMarkdownParser;
|
||||||
import net.gsantner.opoc.util.AndroidSupportMeWrapper;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@ -664,7 +663,6 @@ public class MainActivity extends ThemedActivity
|
||||||
protected void onResume() {
|
protected void onResume() {
|
||||||
AppLog.v(this, "onResume()");
|
AppLog.v(this, "onResume()");
|
||||||
super.onResume();
|
super.onResume();
|
||||||
new AndroidSupportMeWrapper(this).mainOnResume();
|
|
||||||
AppLog.v(this, "Register BroadcastReceivers");
|
AppLog.v(this, "Register BroadcastReceivers");
|
||||||
LocalBroadcastManager.getInstance(this).registerReceiver(brSetTitle, new IntentFilter(ACTION_UPDATE_TITLE_FROM_URL));
|
LocalBroadcastManager.getInstance(this).registerReceiver(brSetTitle, new IntentFilter(ACTION_UPDATE_TITLE_FROM_URL));
|
||||||
LocalBroadcastManager.getInstance(this).registerReceiver(brOpenExternalLink, new IntentFilter(ACTION_OPEN_EXTERNAL_URL));
|
LocalBroadcastManager.getInstance(this).registerReceiver(brOpenExternalLink, new IntentFilter(ACTION_OPEN_EXTERNAL_URL));
|
||||||
|
|
|
@ -13,7 +13,7 @@ import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by gsantner (https://gsantner.net/ on 30.09.16.
|
* Created by gsantner (gsantner AT mailbox DOT org on 30.09.16.
|
||||||
* DiasporaPodList - List container for DiasporaPod's, with methods to merge with other DiasporaPodLists
|
* DiasporaPodList - List container for DiasporaPod's, with methods to merge with other DiasporaPodLists
|
||||||
* DiasporaPod - Data container for a Pod, can include N DiasporaPodUrl's
|
* DiasporaPod - Data container for a Pod, can include N DiasporaPodUrl's
|
||||||
* DiasporaPodUrl - A Url of an DiasporaPod
|
* DiasporaPodUrl - A Url of an DiasporaPod
|
||||||
|
|
|
@ -32,7 +32,7 @@ import org.json.JSONObject;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User profile
|
* User profile
|
||||||
* Created by gsantner (https://gsantner.net/) on 24.03.16. Part of dandelion*.
|
* Created by gsantner (gsantner AT mailbox DOT org) on 24.03.16. Part of dandelion*.
|
||||||
*/
|
*/
|
||||||
public class DiasporaUserProfile {
|
public class DiasporaUserProfile {
|
||||||
private static final int MINIMUM_USERPROFILE_LOAD_TIMEDIFF = 5000;
|
private static final int MINIMUM_USERPROFILE_LOAD_TIMEDIFF = 5000;
|
||||||
|
|
|
@ -21,7 +21,7 @@ package com.github.dfa.diaspora_android.listener;
|
||||||
import com.github.dfa.diaspora_android.data.DiasporaUserProfile;
|
import com.github.dfa.diaspora_android.data.DiasporaUserProfile;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by gsantner (https://gsantner.net/) on 26.03.16.
|
* Created by gsantner (gsantner AT mailbox DOT org) on 26.03.16.
|
||||||
* Interface that needs to be implemented by classes that listen for Profile related changes
|
* Interface that needs to be implemented by classes that listen for Profile related changes
|
||||||
*/
|
*/
|
||||||
public interface DiasporaUserProfileChangedListener {
|
public interface DiasporaUserProfileChangedListener {
|
||||||
|
|
|
@ -37,7 +37,7 @@ import butterknife.OnItemSelected;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dialog that helps the user configure a pod
|
* Dialog that helps the user configure a pod
|
||||||
* Created by gsantner (http://gsantner.net) on 06.10.16.
|
* Created by gsantner on 06.10.16.
|
||||||
*/
|
*/
|
||||||
public class PodSelectionDialog extends ThemedAppCompatDialogFragment {
|
public class PodSelectionDialog extends ThemedAppCompatDialogFragment {
|
||||||
public static final String TAG = "com.github.dfa.diaspora_android.ui.PodSelectionDialog";
|
public static final String TAG = "com.github.dfa.diaspora_android.ui.PodSelectionDialog";
|
||||||
|
|
|
@ -37,7 +37,7 @@ import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Settings
|
* Settings
|
||||||
* Created by gsantner (https://gsantner.net/) on 20.03.16. Part of dandelion*.
|
* Created by gsantner (gsantner AT mailbox DOT org) on 20.03.16. Part of dandelion*.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("ConstantConditions")
|
@SuppressWarnings("ConstantConditions")
|
||||||
public class AppSettings extends SharedPreferencesPropertyBackend {
|
public class AppSettings extends SharedPreferencesPropertyBackend {
|
||||||
|
|
|
@ -78,7 +78,7 @@ public class ContextMenuWebView extends NestedWebView {
|
||||||
public boolean onMenuItemClick(MenuItem item) {
|
public boolean onMenuItemClick(MenuItem item) {
|
||||||
HitTestResult result = getHitTestResult();
|
HitTestResult result = getHitTestResult();
|
||||||
String url = result.getExtra();
|
String url = result.getExtra();
|
||||||
final ShareUtil shu = new ShareUtil(context).setFileProviderAuthority(BuildConfig.APPLICATION_ID);
|
final ShareUtil shu = new ShareUtil(context);
|
||||||
final PermissionChecker permc = new PermissionChecker(parentActivity);
|
final PermissionChecker permc = new PermissionChecker(parentActivity);
|
||||||
final AppSettings appSettings = new AppSettings(context);
|
final AppSettings appSettings = new AppSettings(context);
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,6 @@ import com.github.dfa.diaspora_android.activity.MainActivity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Gregor Santner on 07.08.16.
|
* Created by Gregor Santner on 07.08.16.
|
||||||
* http://gsantner.net
|
|
||||||
*/
|
*/
|
||||||
public class WebHelper {
|
public class WebHelper {
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
/*#######################################################
|
/*#######################################################
|
||||||
*
|
*
|
||||||
* Maintained by Gregor Santner, 2017-
|
* Maintained 2017-2023 by Gregor Santner <gsantner AT mailbox DOT org>
|
||||||
* https://gsantner.net/
|
|
||||||
*
|
*
|
||||||
* License: Apache 2.0 / Commercial
|
* License: Apache 2.0
|
||||||
* https://github.com/gsantner/opoc/#licensing
|
* https://github.com/gsantner/opoc/#licensing
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
|
@ -24,6 +23,7 @@ import android.view.MenuInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
import net.gsantner.opoc.android.dummy.MenuItemDummy;
|
||||||
import net.gsantner.opoc.util.ContextUtils;
|
import net.gsantner.opoc.util.ContextUtils;
|
||||||
|
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
|
@ -37,7 +37,7 @@ public abstract class GsFragmentBase extends Fragment {
|
||||||
|
|
||||||
protected ContextUtils _cu;
|
protected ContextUtils _cu;
|
||||||
protected Bundle _savedInstanceState = null;
|
protected Bundle _savedInstanceState = null;
|
||||||
protected Menu _fragmentMenu;
|
protected Menu _fragmentMenu = new MenuItemDummy.Menu();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
|
|
@ -0,0 +1,351 @@
|
||||||
|
/*
|
||||||
|
* Maintained 2017-2023 by Gregor Santner <gsantner AT mailbox DOT org>
|
||||||
|
* License: Creative Commons Zero (CC0 1.0) / Public Domain
|
||||||
|
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||||
|
*
|
||||||
|
* You can do whatever you want with this. If we meet some day, and you think it is worth it,
|
||||||
|
* you can buy me a drink in return. Provided as is without any kind of warranty. Do not blame
|
||||||
|
* or ask for support if something goes wrong. - Gregor Santner
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package net.gsantner.opoc.android.dummy;
|
||||||
|
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.view.ActionProvider;
|
||||||
|
import android.view.ContextMenu;
|
||||||
|
import android.view.KeyEvent;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.view.SubMenu;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
public class MenuItemDummy implements MenuItem {
|
||||||
|
private final int _itemId;
|
||||||
|
|
||||||
|
public MenuItemDummy(final int itemId) {
|
||||||
|
_itemId = itemId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemId() {
|
||||||
|
return _itemId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getGroupId() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getOrder() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem setTitle(CharSequence title) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem setTitle(int title) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CharSequence getTitle() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem setTitleCondensed(CharSequence title) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CharSequence getTitleCondensed() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem setIcon(Drawable icon) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem setIcon(int iconRes) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Drawable getIcon() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem setIntent(Intent intent) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Intent getIntent() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem setShortcut(char numericChar, char alphaChar) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem setNumericShortcut(char numericChar) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public char getNumericShortcut() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem setAlphabeticShortcut(char alphaChar) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public char getAlphabeticShortcut() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem setCheckable(boolean checkable) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCheckable() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem setChecked(boolean checked) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isChecked() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem setVisible(boolean visible) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isVisible() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem setEnabled(boolean enabled) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasSubMenu() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SubMenu getSubMenu() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ContextMenu.ContextMenuInfo getMenuInfo() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setShowAsAction(int actionEnum) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem setShowAsActionFlags(int actionEnum) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem setActionView(View view) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem setActionView(int resId) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View getActionView() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem setActionProvider(ActionProvider actionProvider) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ActionProvider getActionProvider() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean expandActionView() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean collapseActionView() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isActionViewExpanded() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem setOnActionExpandListener(OnActionExpandListener listener) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static class Menu implements android.view.Menu {
|
||||||
|
@Override
|
||||||
|
public MenuItem add(CharSequence title) {
|
||||||
|
return add(0, 0, 0, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem add(int titleRes) {
|
||||||
|
return add(0, 0, 0, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem add(int groupId, int itemId, int order, CharSequence title) {
|
||||||
|
return new MenuItemDummy(itemId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem add(int groupId, int itemId, int order, int titleRes) {
|
||||||
|
return add(0, 0, 0, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SubMenu addSubMenu(CharSequence title) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SubMenu addSubMenu(int titleRes) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SubMenu addSubMenu(int groupId, int itemId, int order, CharSequence title) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SubMenu addSubMenu(int groupId, int itemId, int order, int titleRes) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int addIntentOptions(int groupId, int itemId, int order, ComponentName caller, Intent[] specifics, Intent intent, int flags, MenuItem[] outSpecificItems) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeItem(int id) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeGroup(int groupId) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clear() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setGroupCheckable(int group, boolean checkable, boolean exclusive) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setGroupVisible(int group, boolean visible) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setGroupEnabled(int group, boolean enabled) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasVisibleItems() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem findItem(int id) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int size() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MenuItem getItem(int index) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean performShortcut(int keyCode, KeyEvent event, int flags) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isShortcutKey(int keyCode, KeyEvent event) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean performIdentifierAction(int id, int flags) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setQwertyMode(boolean isQwerty) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
* Maintained 2017-2023 by Gregor Santner <gsantner AT mailbox DOT org>
|
||||||
|
* License: Creative Commons Zero (CC0 1.0) / Public Domain
|
||||||
|
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||||
|
*
|
||||||
|
* You can do whatever you want with this. If we meet some day, and you think it is worth it,
|
||||||
|
* you can buy me a drink in return. Provided as is without any kind of warranty. Do not blame
|
||||||
|
* or ask for support if something goes wrong. - Gregor Santner
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package net.gsantner.opoc.android.dummy;
|
||||||
|
|
||||||
|
import android.text.Editable;
|
||||||
|
import android.text.TextWatcher;
|
||||||
|
|
||||||
|
import net.gsantner.opoc.util.Callback;
|
||||||
|
|
||||||
|
@SuppressWarnings({"unused", "SpellCheckingInspection"})
|
||||||
|
public class TextWatcherDummy implements TextWatcher {
|
||||||
|
@Override
|
||||||
|
public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterTextChanged(final Editable s) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TextWatcher before(final Callback.a4<CharSequence, Integer, Integer, Integer> impl) {
|
||||||
|
return new TextWatcherDummy() {
|
||||||
|
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
||||||
|
impl.callback(s, start, count, after);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TextWatcher on(final Callback.a4<CharSequence, Integer, Integer, Integer> impl) {
|
||||||
|
return new TextWatcherDummy() {
|
||||||
|
public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
|
||||||
|
impl.callback(s, start, before, count);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TextWatcher after(final Callback.a1<Editable> impl) {
|
||||||
|
return new TextWatcherDummy() {
|
||||||
|
public void afterTextChanged(final Editable s) {
|
||||||
|
impl.callback(s);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,9 +1,8 @@
|
||||||
/*#######################################################
|
/*#######################################################
|
||||||
*
|
*
|
||||||
* Maintained by Gregor Santner, 2018-
|
* Maintained 2018-2023 by Gregor Santner <gsantner AT mailbox DOT org>
|
||||||
* https://gsantner.net/
|
|
||||||
*
|
*
|
||||||
* License: Apache 2.0 / Commercial
|
* License: Apache 2.0
|
||||||
* https://github.com/gsantner/opoc/#licensing
|
* https://github.com/gsantner/opoc/#licensing
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
|
@ -125,6 +124,20 @@ public class SimpleMarkdownParser {
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
public final static SmpFilter FILTER_H_TO_SUP = new SmpFilter() {
|
||||||
|
@Override
|
||||||
|
public String filter(String text) {
|
||||||
|
text = text
|
||||||
|
.replace("<h1>", "<sup><sup><sup>")
|
||||||
|
.replace("</h1>", "</sup></sup></sup>")
|
||||||
|
.replace("<h2>", "<sup><sup>")
|
||||||
|
.replace("</h2>", "</sup></sup>")
|
||||||
|
.replace("<h3>", "<sup>")
|
||||||
|
.replace("</h3>", "</sup>")
|
||||||
|
;
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
};
|
||||||
public final static SmpFilter FILTER_NONE = new SmpFilter() {
|
public final static SmpFilter FILTER_NONE = new SmpFilter() {
|
||||||
@Override
|
@Override
|
||||||
public String filter(String text) {
|
public String filter(String text) {
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
/*#######################################################
|
/*#######################################################
|
||||||
*
|
*
|
||||||
* Maintained by Gregor Santner, 2018-
|
* Maintained 2018-2023 by Gregor Santner <gsantner AT mailbox DOT org>
|
||||||
* https://gsantner.net/
|
|
||||||
*
|
*
|
||||||
* License: Apache 2.0 / Commercial
|
* License: Apache 2.0
|
||||||
* https://github.com/gsantner/opoc/#licensing
|
* https://github.com/gsantner/opoc/#licensing
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
/*#######################################################
|
/*#######################################################
|
||||||
*
|
*
|
||||||
* Maintained by Gregor Santner, 2016-
|
* Maintained 2016-2023 by Gregor Santner <gsantner AT mailbox DOT org>
|
||||||
* https://gsantner.net/
|
|
||||||
*
|
*
|
||||||
* License: Apache 2.0 / Commercial
|
* License: Apache 2.0
|
||||||
* https://github.com/gsantner/opoc/#licensing
|
* https://github.com/gsantner/opoc/#licensing
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
|
@ -42,6 +41,7 @@ import android.support.annotation.StringRes;
|
||||||
import android.support.v4.content.ContextCompat;
|
import android.support.v4.content.ContextCompat;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
|
@ -201,11 +201,15 @@ public class SharedPreferencesPropertyBackend implements PropertyBackend<String,
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getString(String key, String defaultValue, final SharedPreferences... pref) {
|
public String getString(String key, String defaultValue, final SharedPreferences... pref) {
|
||||||
|
try {
|
||||||
return gp(pref).getString(key, defaultValue);
|
return gp(pref).getString(key, defaultValue);
|
||||||
|
} catch (ClassCastException e) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getString(@StringRes int keyResourceId, String defaultValue, @StringRes int keyResourceIdDefaultValue, final SharedPreferences... pref) {
|
public String getString(@StringRes int keyResourceId, String defaultValue, @StringRes int keyResourceIdDefaultValue, final SharedPreferences... pref) {
|
||||||
return gp(pref).getString(rstr(keyResourceId), rstr(keyResourceIdDefaultValue));
|
return getString(rstr(keyResourceId), rstr(keyResourceIdDefaultValue), pref);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setStringListOne(String key, List<String> values, final SharedPreferences pref) {
|
private void setStringListOne(String key, List<String> values, final SharedPreferences pref) {
|
||||||
|
@ -219,9 +223,7 @@ public class SharedPreferencesPropertyBackend implements PropertyBackend<String,
|
||||||
|
|
||||||
private ArrayList<String> getStringListOne(String key, final SharedPreferences pref) {
|
private ArrayList<String> getStringListOne(String key, final SharedPreferences pref) {
|
||||||
ArrayList<String> ret = new ArrayList<>();
|
ArrayList<String> ret = new ArrayList<>();
|
||||||
String value = pref
|
String value = getString(key, ARRAY_SEPARATOR).replace(ARRAY_SEPARATOR_SUBSTITUTE, ARRAY_SEPARATOR);
|
||||||
.getString(key, ARRAY_SEPARATOR)
|
|
||||||
.replace(ARRAY_SEPARATOR_SUBSTITUTE, ARRAY_SEPARATOR);
|
|
||||||
if (value.equals(ARRAY_SEPARATOR) || TextUtils.isEmpty(value)) {
|
if (value.equals(ARRAY_SEPARATOR) || TextUtils.isEmpty(value)) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -277,11 +279,15 @@ public class SharedPreferencesPropertyBackend implements PropertyBackend<String,
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getInt(@StringRes int keyResourceId, int defaultValue, final SharedPreferences... pref) {
|
public int getInt(@StringRes int keyResourceId, int defaultValue, final SharedPreferences... pref) {
|
||||||
return gp(pref).getInt(rstr(keyResourceId), defaultValue);
|
return getInt(rstr(keyResourceId), defaultValue, pref);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getInt(String key, int defaultValue, final SharedPreferences... pref) {
|
public int getInt(String key, int defaultValue, final SharedPreferences... pref) {
|
||||||
|
try {
|
||||||
return gp(pref).getInt(key, defaultValue);
|
return gp(pref).getInt(key, defaultValue);
|
||||||
|
} catch (ClassCastException e) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getIntOfStringPref(@StringRes int keyResId, int defaultValue, final SharedPreferences... pref) {
|
public int getIntOfStringPref(@StringRes int keyResId, int defaultValue, final SharedPreferences... pref) {
|
||||||
|
@ -304,7 +310,7 @@ public class SharedPreferencesPropertyBackend implements PropertyBackend<String,
|
||||||
|
|
||||||
private ArrayList<Integer> getIntListOne(String key, final SharedPreferences pref) {
|
private ArrayList<Integer> getIntListOne(String key, final SharedPreferences pref) {
|
||||||
ArrayList<Integer> ret = new ArrayList<>();
|
ArrayList<Integer> ret = new ArrayList<>();
|
||||||
String value = pref.getString(key, ARRAY_SEPARATOR);
|
String value = getString(key, ARRAY_SEPARATOR);
|
||||||
if (value.equals(ARRAY_SEPARATOR)) {
|
if (value.equals(ARRAY_SEPARATOR)) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -361,11 +367,15 @@ public class SharedPreferencesPropertyBackend implements PropertyBackend<String,
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getLong(@StringRes int keyResourceId, long defaultValue, final SharedPreferences... pref) {
|
public long getLong(@StringRes int keyResourceId, long defaultValue, final SharedPreferences... pref) {
|
||||||
return gp(pref).getLong(rstr(keyResourceId), defaultValue);
|
return getLong(rstr(keyResourceId), defaultValue, pref);
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getLong(String key, long defaultValue, final SharedPreferences... pref) {
|
public long getLong(String key, long defaultValue, final SharedPreferences... pref) {
|
||||||
|
try {
|
||||||
return gp(pref).getLong(key, defaultValue);
|
return gp(pref).getLong(key, defaultValue);
|
||||||
|
} catch (ClassCastException e) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -380,11 +390,15 @@ public class SharedPreferencesPropertyBackend implements PropertyBackend<String,
|
||||||
}
|
}
|
||||||
|
|
||||||
public float getFloat(@StringRes int keyResourceId, float defaultValue, final SharedPreferences... pref) {
|
public float getFloat(@StringRes int keyResourceId, float defaultValue, final SharedPreferences... pref) {
|
||||||
return gp(pref).getFloat(rstr(keyResourceId), defaultValue);
|
return getFloat(rstr(keyResourceId), defaultValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
public float getFloat(String key, float defaultValue, final SharedPreferences... pref) {
|
public float getFloat(String key, float defaultValue, final SharedPreferences... pref) {
|
||||||
|
try {
|
||||||
return gp(pref).getFloat(key, defaultValue);
|
return gp(pref).getFloat(key, defaultValue);
|
||||||
|
} catch (ClassCastException e) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -418,22 +432,26 @@ public class SharedPreferencesPropertyBackend implements PropertyBackend<String,
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean getBool(@StringRes int keyResourceId, boolean defaultValue, final SharedPreferences... pref) {
|
public boolean getBool(@StringRes int keyResourceId, boolean defaultValue, final SharedPreferences... pref) {
|
||||||
return gp(pref).getBoolean(rstr(keyResourceId), defaultValue);
|
return getBool(rstr(keyResourceId), defaultValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean getBool(String key, boolean defaultValue, final SharedPreferences... pref) {
|
public boolean getBool(String key, boolean defaultValue, final SharedPreferences... pref) {
|
||||||
|
try {
|
||||||
return gp(pref).getBoolean(key, defaultValue);
|
return gp(pref).getBoolean(key, defaultValue);
|
||||||
|
} catch (ClassCastException e) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Getter & Setter for Color
|
// Getter & Setter for Color
|
||||||
//
|
//
|
||||||
public int getColor(String key, @ColorRes int defaultColor, final SharedPreferences... pref) {
|
public int getColor(String key, @ColorRes int defaultColor, final SharedPreferences... pref) {
|
||||||
return gp(pref).getInt(key, rcolor(defaultColor));
|
return getInt(key, rcolor(defaultColor));
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getColor(@StringRes int keyResourceId, @ColorRes int defaultColor, final SharedPreferences... pref) {
|
public int getColor(@StringRes int keyResourceId, @ColorRes int defaultColor, final SharedPreferences... pref) {
|
||||||
return gp(pref).getInt(rstr(keyResourceId), rcolor(defaultColor));
|
return getColor(rstr(keyResourceId), defaultColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -588,4 +606,12 @@ public class SharedPreferencesPropertyBackend implements PropertyBackend<String,
|
||||||
public static synchronized void appendDebugLog(String text) {
|
public static synchronized void appendDebugLog(String text) {
|
||||||
_debugLog += "[" + new Date().toString() + "] " + text + "\n";
|
_debugLog += "[" + new Date().toString() + "] " + text + "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean ne(final String str) {
|
||||||
|
return str != null && !str.trim().isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean fexists(final String fp) {
|
||||||
|
return ne(fp) && (new File(fp)).exists();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
/*#######################################################
|
/*#######################################################
|
||||||
*
|
*
|
||||||
* Maintained by Gregor Santner, 2017-
|
* Maintained 2017-2023 by Gregor Santner <gsantner AT mailbox DOT org>
|
||||||
* https://gsantner.net/
|
|
||||||
*
|
*
|
||||||
* License: Apache 2.0
|
* License: Apache 2.0
|
||||||
* https://github.com/gsantner/opoc/#licensing
|
* https://github.com/gsantner/opoc/#licensing
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
/*#######################################################
|
/*#######################################################
|
||||||
*
|
*
|
||||||
* Maintained by Gregor Santner, 2017-
|
* Maintained 2017-2023 by Gregor Santner <gsantner AT mailbox DOT org>
|
||||||
* https://gsantner.net/
|
|
||||||
*
|
*
|
||||||
* License: Apache 2.0
|
* License: Apache 2.0
|
||||||
* https://github.com/gsantner/opoc/#licensing
|
* https://github.com/gsantner/opoc/#licensing
|
||||||
|
@ -10,64 +9,87 @@
|
||||||
#########################################################*/
|
#########################################################*/
|
||||||
package net.gsantner.opoc.ui;
|
package net.gsantner.opoc.ui;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.app.Dialog;
|
||||||
|
import android.content.Context;
|
||||||
import android.content.res.ColorStateList;
|
import android.content.res.ColorStateList;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.graphics.Typeface;
|
import android.graphics.Typeface;
|
||||||
import android.os.AsyncTask;
|
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.support.annotation.ColorInt;
|
import android.support.annotation.ColorInt;
|
||||||
|
import android.support.annotation.DrawableRes;
|
||||||
|
import android.support.annotation.LayoutRes;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.support.annotation.StringRes;
|
import android.support.annotation.StringRes;
|
||||||
import android.support.design.widget.Snackbar;
|
|
||||||
import android.support.v7.app.AlertDialog;
|
import android.support.v7.app.AlertDialog;
|
||||||
import android.support.v7.widget.AppCompatEditText;
|
import android.support.v7.widget.AppCompatEditText;
|
||||||
import android.text.Editable;
|
import android.support.v7.widget.TooltipCompat;
|
||||||
|
import android.text.InputType;
|
||||||
|
import android.text.Spannable;
|
||||||
|
import android.text.SpannableString;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.text.TextWatcher;
|
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.Window;
|
import android.view.Window;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
import android.widget.ArrayAdapter;
|
import android.widget.ArrayAdapter;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.Checkable;
|
||||||
import android.widget.Filter;
|
import android.widget.Filter;
|
||||||
|
import android.widget.ImageView;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.ListView;
|
import android.widget.ListView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import net.gsantner.opoc.util.ActivityUtils;
|
import net.gsantner.opoc.android.dummy.TextWatcherDummy;
|
||||||
import net.gsantner.opoc.util.Callback;
|
import net.gsantner.opoc.util.Callback;
|
||||||
import net.gsantner.opoc.util.ContextUtils;
|
import net.gsantner.opoc.util.ContextUtils;
|
||||||
|
|
||||||
import org.apache.commons.io.FileUtils;
|
|
||||||
import org.apache.commons.io.filefilter.IOFileFilter;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.lang.ref.WeakReference;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@SuppressWarnings("WeakerAccess")
|
@SuppressLint("SetTextI18n")
|
||||||
public class SearchOrCustomTextDialog {
|
public class SearchOrCustomTextDialog {
|
||||||
|
|
||||||
public static class DialogOptions {
|
public static class DialogOptions {
|
||||||
public Callback.a1<String> callback;
|
|
||||||
public List<? extends CharSequence> data = new ArrayList<>();
|
// Callback for search text or text of single item
|
||||||
public List<? extends CharSequence> highlightData = new ArrayList<>();
|
@Nullable
|
||||||
public List<Integer> iconsForData = new ArrayList<>();
|
public Callback.a1<String> callback = null;
|
||||||
|
|
||||||
|
// Callback for indices of selected items.
|
||||||
|
// List will contain single item if isMultiSelectEnabled == false;
|
||||||
|
@Nullable
|
||||||
|
public Callback.a1<List<Integer>> positionCallback = null;
|
||||||
|
|
||||||
|
public boolean isMultiSelectEnabled = false;
|
||||||
|
public List<? extends CharSequence> data = null;
|
||||||
|
public List<? extends CharSequence> highlightData = null;
|
||||||
|
public List<Integer> iconsForData;
|
||||||
public String messageText = "";
|
public String messageText = "";
|
||||||
|
public String defaultText = "";
|
||||||
public boolean isSearchEnabled = true;
|
public boolean isSearchEnabled = true;
|
||||||
public boolean isDarkDialog = false;
|
public boolean isDarkDialog = false;
|
||||||
public int dialogWidthDp = WindowManager.LayoutParams.MATCH_PARENT;
|
public int dialogWidthDp = WindowManager.LayoutParams.MATCH_PARENT;
|
||||||
public int dialogHeightDp = WindowManager.LayoutParams.WRAP_CONTENT;
|
public int dialogHeightDp = WindowManager.LayoutParams.WRAP_CONTENT;
|
||||||
public int gravity = Gravity.NO_GRAVITY;
|
public int gravity = Gravity.NO_GRAVITY;
|
||||||
public int searchInputType = 0;
|
public int searchInputType = InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS;
|
||||||
|
public boolean searchIsRegex = false;
|
||||||
|
public Callback.a1<Spannable> highlighter = null;
|
||||||
|
public String extraFilter = null;
|
||||||
|
public List<Integer> preSelected = null;
|
||||||
|
|
||||||
|
public Callback.a0 neutralButtonCallback = null;
|
||||||
|
|
||||||
@ColorInt
|
@ColorInt
|
||||||
public int textColor = 0xFF000000;
|
public int textColor = 0xFF000000;
|
||||||
|
@ -76,138 +98,219 @@ public class SearchOrCustomTextDialog {
|
||||||
@StringRes
|
@StringRes
|
||||||
public int cancelButtonText = android.R.string.cancel;
|
public int cancelButtonText = android.R.string.cancel;
|
||||||
@StringRes
|
@StringRes
|
||||||
|
public int neutralButtonText = 0;
|
||||||
|
@StringRes
|
||||||
public int okButtonText = android.R.string.ok;
|
public int okButtonText = android.R.string.ok;
|
||||||
@StringRes
|
@StringRes
|
||||||
public int titleText = android.R.string.untitled;
|
public int titleText = 0;
|
||||||
@StringRes
|
@StringRes
|
||||||
public int searchHintText = android.R.string.search_go;
|
public int searchHintText = android.R.string.search_go;
|
||||||
|
@DrawableRes
|
||||||
|
public int clearInputIcon = android.R.drawable.ic_input_delete;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void showMultiChoiceDialogWithSearchFilterUI(final Activity activity, final DialogOptions dopt) {
|
private static class Adapter extends ArrayAdapter<Integer> {
|
||||||
final List<CharSequence> allItems = new ArrayList<>(dopt.data);
|
@LayoutRes
|
||||||
final List<CharSequence> filteredItems = new ArrayList<>(allItems);
|
private final int _layout;
|
||||||
final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(activity, dopt.isDarkDialog
|
private final int _layoutHeight;
|
||||||
? android.support.v7.appcompat.R.style.Theme_AppCompat_Dialog
|
private final LayoutInflater _inflater;
|
||||||
: android.support.v7.appcompat.R.style.Theme_AppCompat_Light_Dialog
|
private final DialogOptions _dopt;
|
||||||
);
|
private final List<Integer> _filteredItems;
|
||||||
|
private final Set<Integer> _selectedItems;
|
||||||
|
private final Pattern _extraPattern;
|
||||||
|
|
||||||
|
public static Adapter create(final Context context, final DialogOptions dopt) {
|
||||||
|
return new Adapter(context, dopt, dopt.isMultiSelectEnabled ? android.R.layout.simple_list_item_multiple_choice : android.R.layout.simple_list_item_1, new ArrayList<>());
|
||||||
|
}
|
||||||
|
|
||||||
|
private Adapter(final Context context, final DialogOptions dopt, final int layout, final List<Integer> filteredItems) {
|
||||||
|
super(context, layout, filteredItems);
|
||||||
|
_layout = layout;
|
||||||
|
_filteredItems = filteredItems;
|
||||||
|
_inflater = LayoutInflater.from(context);
|
||||||
|
_dopt = dopt;
|
||||||
|
_extraPattern = (_dopt.extraFilter == null ? null : Pattern.compile(_dopt.extraFilter));
|
||||||
|
_selectedItems = new HashSet<>(_dopt.preSelected != null ? _dopt.preSelected : Collections.emptyList());
|
||||||
|
ContextUtils cu = new ContextUtils(context);
|
||||||
|
_layoutHeight = (int) cu.convertDpToPx(36);
|
||||||
|
cu.freeContextRef();
|
||||||
|
}
|
||||||
|
|
||||||
final ArrayAdapter<CharSequence> listAdapter = new ArrayAdapter<CharSequence>(activity, android.R.layout.simple_list_item_1, filteredItems) {
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public View getView(int pos, @Nullable View convertView, @NonNull ViewGroup parent) {
|
public View getView(int pos, @Nullable View convertView, @NonNull ViewGroup parent) {
|
||||||
TextView textView = (TextView) super.getView(pos, convertView, parent);
|
final int index = getItem(pos);
|
||||||
String text = textView.getText().toString();
|
|
||||||
|
|
||||||
int posInOriginalList = dopt.data.indexOf(text);
|
final TextView textView;
|
||||||
if (posInOriginalList >= 0 && dopt.iconsForData != null && posInOriginalList < dopt.iconsForData.size() && dopt.iconsForData.get(posInOriginalList) != 0) {
|
if (convertView == null) {
|
||||||
textView.setCompoundDrawablesWithIntrinsicBounds(dopt.iconsForData.get(posInOriginalList), 0, 0, 0);
|
textView = (TextView) _inflater.inflate(_layout, parent, false);
|
||||||
|
textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
|
||||||
|
textView.setMinHeight(_layoutHeight);
|
||||||
|
} else {
|
||||||
|
textView = (TextView) convertView;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (textView instanceof Checkable) {
|
||||||
|
((Checkable) textView).setChecked(_selectedItems.contains(index));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index >= 0 && _dopt.iconsForData != null && index < _dopt.iconsForData.size() && _dopt.iconsForData.get(index) != 0) {
|
||||||
|
textView.setCompoundDrawablesWithIntrinsicBounds(_dopt.iconsForData.get(index), 0, 0, 0);
|
||||||
textView.setCompoundDrawablePadding(32);
|
textView.setCompoundDrawablePadding(32);
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
textView.setCompoundDrawableTintList(ColorStateList.valueOf(dopt.isDarkDialog ? Color.WHITE : Color.BLACK));
|
textView.setCompoundDrawableTintList(ColorStateList.valueOf(_dopt.isDarkDialog ? Color.WHITE : Color.BLACK));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
textView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
|
textView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean hl = dopt.highlightData.contains(text);
|
final CharSequence text = _dopt.data.get(index).toString();
|
||||||
textView.setTextColor(hl ? dopt.highlightColor : dopt.textColor);
|
if (_dopt.highlightData != null) {
|
||||||
|
final boolean hl = _dopt.highlightData.contains(text);
|
||||||
|
textView.setTextColor(hl ? _dopt.highlightColor : _dopt.textColor);
|
||||||
textView.setTypeface(null, hl ? Typeface.BOLD : Typeface.NORMAL);
|
textView.setTypeface(null, hl ? Typeface.BOLD : Typeface.NORMAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_dopt.highlighter != null) {
|
||||||
|
Spannable s = new SpannableString(text);
|
||||||
|
_dopt.highlighter.callback(s);
|
||||||
|
textView.setText(s);
|
||||||
|
} else {
|
||||||
|
textView.setText(text);
|
||||||
|
}
|
||||||
|
|
||||||
return textView;
|
return textView;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public Filter getFilter() {
|
public Filter getFilter() {
|
||||||
return new Filter() {
|
return new Filter() {
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@Override
|
@Override
|
||||||
protected void publishResults(final CharSequence constraint, final FilterResults results) {
|
protected void publishResults(final CharSequence constraint, final FilterResults results) {
|
||||||
filteredItems.clear();
|
_filteredItems.clear();
|
||||||
filteredItems.addAll((List<String>) results.values);
|
_filteredItems.addAll((List<Integer>) results.values);
|
||||||
notifyDataSetChanged();
|
notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected FilterResults performFiltering(final CharSequence constraint) {
|
protected FilterResults performFiltering(final CharSequence constraint) {
|
||||||
final FilterResults res = new FilterResults();
|
final List<Integer> resList = new ArrayList<>();
|
||||||
final ArrayList<CharSequence> resList = new ArrayList<>();
|
|
||||||
final String fil = constraint.toString();
|
|
||||||
|
|
||||||
for (final CharSequence str : allItems) {
|
if (_dopt.data != null) {
|
||||||
if ("".equals(fil) || str.toString().toLowerCase(Locale.getDefault()).contains(fil.toLowerCase(Locale.getDefault()))) {
|
final String fil = constraint.toString();
|
||||||
resList.add(str);
|
final boolean emptySearch = fil.isEmpty();
|
||||||
|
for (int i = 0; i < _dopt.data.size(); i++) {
|
||||||
|
final String str = _dopt.data.get(i).toString();
|
||||||
|
final boolean matchExtra = (_extraPattern == null) || _extraPattern.matcher(str).find();
|
||||||
|
final Locale locale = Locale.getDefault();
|
||||||
|
final boolean matchNormal = str.toLowerCase(locale).contains(fil.toLowerCase(locale));
|
||||||
|
final boolean matchRegex = _dopt.searchIsRegex && (str.matches(fil));
|
||||||
|
if (matchExtra && (matchNormal || matchRegex || emptySearch)) {
|
||||||
|
resList.add(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final FilterResults res = new FilterResults();
|
||||||
res.values = resList;
|
res.values = resList;
|
||||||
res.count = resList.size();
|
res.count = resList.size();
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
|
public static void showMultiChoiceDialogWithSearchFilterUI(final Activity activity, final DialogOptions dopt) {
|
||||||
|
final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(activity, dopt.isDarkDialog
|
||||||
|
? android.support.v7.appcompat.R.style.Theme_AppCompat_Dialog
|
||||||
|
: android.support.v7.appcompat.R.style.Theme_AppCompat_Light_Dialog
|
||||||
|
);
|
||||||
|
final Adapter listAdapter = Adapter.create(activity, dopt);
|
||||||
|
|
||||||
final AppCompatEditText searchEditText = new AppCompatEditText(activity);
|
final AppCompatEditText searchEditText = new AppCompatEditText(activity);
|
||||||
|
searchEditText.setText(dopt.defaultText);
|
||||||
searchEditText.setSingleLine(true);
|
searchEditText.setSingleLine(true);
|
||||||
searchEditText.setMaxLines(1);
|
searchEditText.setMaxLines(1);
|
||||||
searchEditText.setTextColor(dopt.textColor);
|
searchEditText.setTextColor(dopt.textColor);
|
||||||
searchEditText.setHintTextColor((dopt.textColor & 0x00FFFFFF) | 0x99000000);
|
searchEditText.setHintTextColor((dopt.textColor & 0x00FFFFFF) | 0x99000000);
|
||||||
searchEditText.setHint(dopt.searchHintText);
|
searchEditText.setHint(dopt.searchHintText);
|
||||||
searchEditText.setInputType(dopt.searchInputType == 0 ? searchEditText.getInputType() : dopt.searchInputType);
|
searchEditText.setInputType(dopt.searchInputType == 0 ? searchEditText.getInputType() : dopt.searchInputType);
|
||||||
|
searchEditText.addTextChangedListener(TextWatcherDummy.after((cbEditable) -> listAdapter.getFilter().filter(cbEditable)));
|
||||||
|
|
||||||
searchEditText.addTextChangedListener(new TextWatcher() {
|
final ContextUtils cu = new ContextUtils(activity);
|
||||||
@Override
|
final int margin = (int) cu.convertDpToPx(8);
|
||||||
public void afterTextChanged(final Editable arg0) {
|
cu.freeContextRef();
|
||||||
listAdapter.getFilter().filter(searchEditText.getText());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
final LinearLayout searchLayout = new LinearLayout(activity);
|
||||||
public void onTextChanged(final CharSequence arg0, final int arg1, final int arg2, final int arg3) {
|
searchLayout.setOrientation(LinearLayout.HORIZONTAL);
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
LinearLayout.LayoutParams lp;
|
||||||
public void beforeTextChanged(final CharSequence arg0, final int arg1, final int arg2, final int arg3) {
|
lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT, 1);
|
||||||
}
|
lp.gravity = Gravity.START | Gravity.BOTTOM;
|
||||||
});
|
searchLayout.addView(searchEditText, lp);
|
||||||
|
|
||||||
|
// 'Button to clear the search box'
|
||||||
|
final ImageView clearButton = new ImageView(activity);
|
||||||
|
clearButton.setImageResource(dopt.clearInputIcon);
|
||||||
|
TooltipCompat.setTooltipText(clearButton, activity.getString(android.R.string.cancel));
|
||||||
|
clearButton.setColorFilter(dopt.isDarkDialog ? Color.WHITE : Color.parseColor("#ff505050"));
|
||||||
|
lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT, 0);
|
||||||
|
lp.gravity = Gravity.END | Gravity.CENTER_VERTICAL;
|
||||||
|
lp.setMargins(margin, 0, (int) (margin * 1.5), 0);
|
||||||
|
searchLayout.addView(clearButton, lp);
|
||||||
|
clearButton.setOnClickListener((v) -> searchEditText.setText(""));
|
||||||
|
|
||||||
final ListView listView = new ListView(activity);
|
final ListView listView = new ListView(activity);
|
||||||
final LinearLayout linearLayout = new LinearLayout(activity);
|
final LinearLayout linearLayout = new LinearLayout(activity);
|
||||||
listView.setAdapter(listAdapter);
|
listView.setAdapter(listAdapter);
|
||||||
listView.setVisibility(dopt.data != null && !dopt.data.isEmpty() ? View.VISIBLE : View.GONE);
|
listView.setVisibility(dopt.data != null && !dopt.data.isEmpty() ? View.VISIBLE : View.GONE);
|
||||||
linearLayout.setOrientation(LinearLayout.VERTICAL);
|
linearLayout.setOrientation(LinearLayout.VERTICAL);
|
||||||
|
|
||||||
if (dopt.isSearchEnabled) {
|
if (dopt.isSearchEnabled) {
|
||||||
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
|
lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
|
||||||
int px = (int) (new ContextUtils(listView.getContext()).convertDpToPx(8));
|
lp.setMargins(margin, margin / 2, margin, margin / 2);
|
||||||
lp.setMargins(px, px / 2, px, px / 2);
|
linearLayout.addView(searchLayout, lp);
|
||||||
linearLayout.addView(searchEditText, lp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0);
|
final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0);
|
||||||
layoutParams.weight = 1;
|
layoutParams.weight = 1;
|
||||||
linearLayout.addView(listView, layoutParams);
|
linearLayout.addView(listView, layoutParams);
|
||||||
if (!TextUtils.isEmpty(dopt.messageText)) {
|
if (!TextUtils.isEmpty(dopt.messageText)) {
|
||||||
dialogBuilder.setMessage(dopt.messageText);
|
dialogBuilder.setMessage(dopt.messageText);
|
||||||
}
|
}
|
||||||
|
|
||||||
dialogBuilder.setView(linearLayout)
|
dialogBuilder.setView(linearLayout)
|
||||||
.setOnCancelListener(null)
|
.setOnCancelListener(null)
|
||||||
.setNegativeButton(dopt.cancelButtonText, (dialogInterface, i) -> dialogInterface.dismiss());
|
.setNegativeButton(dopt.cancelButtonText, (dialogInterface, i) -> dialogInterface.dismiss());
|
||||||
|
|
||||||
if (dopt.titleText != 0) {
|
if (dopt.titleText != 0) {
|
||||||
dialogBuilder.setTitle(dopt.titleText);
|
dialogBuilder.setTitle(dopt.titleText);
|
||||||
}
|
}
|
||||||
if (dopt.isSearchEnabled) {
|
|
||||||
|
// Ok button action
|
||||||
|
if ((dopt.isSearchEnabled && dopt.callback != null) || (dopt.isMultiSelectEnabled)) {
|
||||||
dialogBuilder.setPositiveButton(dopt.okButtonText, (dialogInterface, i) -> {
|
dialogBuilder.setPositiveButton(dopt.okButtonText, (dialogInterface, i) -> {
|
||||||
dialogInterface.dismiss();
|
final String searchText = dopt.isSearchEnabled ? searchEditText.getText().toString() : null;
|
||||||
if (dopt.callback != null && !TextUtils.isEmpty(searchEditText.getText().toString())) {
|
if (dopt.positionCallback != null && !listAdapter._selectedItems.isEmpty()) {
|
||||||
dopt.callback.callback(searchEditText.getText().toString());
|
final List<Integer> sel = new ArrayList<>(listAdapter._selectedItems);
|
||||||
|
Collections.sort(sel);
|
||||||
|
dopt.positionCallback.callback(sel);
|
||||||
|
} else if (dopt.callback != null && !TextUtils.isEmpty(searchText)) {
|
||||||
|
dopt.callback.callback(searchText);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
final AlertDialog dialog = dialogBuilder.create();
|
// Setup neutralbutton
|
||||||
listView.setOnItemClickListener((parent, view, position, id) -> {
|
if (dopt.neutralButtonCallback != null && dopt.neutralButtonText != 0) {
|
||||||
dialog.dismiss();
|
dialogBuilder.setNeutralButton(dopt.neutralButtonText, (dialogInterface, i) -> {
|
||||||
if (dopt.callback != null) {
|
dopt.neutralButtonCallback.callback();
|
||||||
dopt.callback.callback(filteredItems.get(position).toString());
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
final AlertDialog dialog = dialogBuilder.create();
|
||||||
|
|
||||||
searchEditText.setOnKeyListener((keyView, keyCode, keyEvent) -> {
|
searchEditText.setOnKeyListener((keyView, keyCode, keyEvent) -> {
|
||||||
if ((keyEvent.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
|
if ((keyEvent.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
|
||||||
|
@ -220,7 +323,6 @@ public class SearchOrCustomTextDialog {
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
Window w;
|
Window w;
|
||||||
if ((w = dialog.getWindow()) != null && dopt.isSearchEnabled) {
|
if ((w = dialog.getWindow()) != null && dopt.isSearchEnabled) {
|
||||||
w.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
|
w.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
|
||||||
|
@ -241,117 +343,52 @@ public class SearchOrCustomTextDialog {
|
||||||
if (dopt.isSearchEnabled) {
|
if (dopt.isSearchEnabled) {
|
||||||
searchEditText.requestFocus();
|
searchEditText.requestFocus();
|
||||||
}
|
}
|
||||||
|
if (dopt.defaultText != null) {
|
||||||
|
listAdapter.getFilter().filter(searchEditText.getText());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Helper function to trigger callback with single item
|
||||||
public static SearchFilesTask recursiveFileSearch(Activity activity, File searchDir, String query, Callback.a1<List<String>> callback) {
|
final Callback.b1<Integer> directActivate = (position) -> {
|
||||||
query = query.replaceAll("(?<![.])[*]", ".*");
|
final int index = listAdapter._filteredItems.get(position);
|
||||||
SearchFilesTask task = new SearchFilesTask(activity, searchDir, query, callback, query.startsWith("^") || query.contains("*"));
|
dialog.dismiss();
|
||||||
task.execute();
|
if (dopt.callback != null) {
|
||||||
return task;
|
dopt.callback.callback(dopt.data.get(index).toString());
|
||||||
}
|
}
|
||||||
|
if (dopt.positionCallback != null) {
|
||||||
public static class SearchFilesTask extends AsyncTask<Void, File, List<String>> implements IOFileFilter {
|
dopt.positionCallback.callback(Collections.singletonList(index));
|
||||||
private final Callback.a1<List<String>> _callback;
|
|
||||||
private final File _searchDir;
|
|
||||||
private final String _query;
|
|
||||||
private final boolean _isRegex;
|
|
||||||
private final WeakReference<Activity> _activityRef;
|
|
||||||
|
|
||||||
private final Pattern _regex;
|
|
||||||
private Snackbar _snackBar;
|
|
||||||
|
|
||||||
public SearchFilesTask(Activity activity, File searchDir, String query, Callback.a1<List<String>> callback, boolean isRegex) {
|
|
||||||
_searchDir = searchDir;
|
|
||||||
_query = isRegex ? query : query.toLowerCase();
|
|
||||||
_callback = callback;
|
|
||||||
_isRegex = isRegex;
|
|
||||||
_regex = isRegex ? Pattern.compile(_query) : null;
|
|
||||||
_activityRef = new WeakReference<>(activity);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Called for both, file and folder filter
|
|
||||||
@Override
|
|
||||||
public boolean accept(File file) {
|
|
||||||
return isMatching(file, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Not called
|
|
||||||
@Override
|
|
||||||
public boolean accept(File dir, String name) {
|
|
||||||
return isMatching(new File(dir, name), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// In iterateFilesAndDirs, subdirs are only scanned when returning true on it
|
|
||||||
// But those dirs will also occur in iterator
|
|
||||||
// Hence call this aagain with alwaysMatchDir=false
|
|
||||||
public boolean isMatching(File file, boolean alwaysMatchDir) {
|
|
||||||
if (file.isDirectory()) {
|
|
||||||
// Do never scan .git directories, lots of files, lots of time
|
|
||||||
if (file.getName().equals(".git")) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (alwaysMatchDir) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
};
|
||||||
}
|
|
||||||
String name = file.getName();
|
|
||||||
file = file.getParentFile();
|
|
||||||
return _isRegex ? _regex.matcher(name).matches() : name.toLowerCase().contains(_query);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
// Helper function to append selection count to OK button
|
||||||
protected void onPreExecute() {
|
final Button okButton = dialog.getButton(Dialog.BUTTON_POSITIVE);
|
||||||
super.onPreExecute();
|
final String okText = activity.getString(dopt.okButtonText) + (dopt.isMultiSelectEnabled ? " (%d)" : "");
|
||||||
if (_activityRef.get() != null) {
|
final Callback.a0 setOkButtonState = () -> {
|
||||||
_snackBar = Snackbar.make(_activityRef.get().findViewById(android.R.id.content), _query + "...", Snackbar.LENGTH_INDEFINITE);
|
okButton.setText(okText.replace("%d", Integer.toString(listAdapter._selectedItems.size())));
|
||||||
_snackBar.setAction(android.R.string.cancel, (v) -> {
|
};
|
||||||
_snackBar.dismiss();
|
|
||||||
cancel(true);
|
|
||||||
}).show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
// Set ok button text initially
|
||||||
protected List<String> doInBackground(Void... voidp) {
|
setOkButtonState.callback();
|
||||||
List<String> ret = new ArrayList<>();
|
|
||||||
|
|
||||||
boolean first = true;
|
// Item click action
|
||||||
Iterator<File> iter = null;
|
listView.setOnItemClickListener((parent, textView, pos, id) -> {
|
||||||
try {
|
if (dopt.isMultiSelectEnabled) {
|
||||||
iter = FileUtils.iterateFilesAndDirs(_searchDir, this, this);
|
final int index = listAdapter._filteredItems.get(pos);
|
||||||
} catch (Exception ex) {
|
if (listAdapter._selectedItems.contains(index)) {
|
||||||
// Iterator may throw an error at creation
|
listAdapter._selectedItems.remove(index);
|
||||||
return ret;
|
} else {
|
||||||
|
listAdapter._selectedItems.add(index);
|
||||||
}
|
}
|
||||||
while (iter.hasNext() && !isCancelled()) {
|
if (textView instanceof Checkable) {
|
||||||
File f = iter.next();
|
((Checkable) textView).setChecked(listAdapter._selectedItems.contains(index));
|
||||||
if (first) {
|
|
||||||
first = false;
|
|
||||||
if (f.equals(_searchDir)) {
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
setOkButtonState.callback();
|
||||||
|
} else {
|
||||||
|
directActivate.callback(pos);
|
||||||
}
|
}
|
||||||
if (f.isFile() || (f.isDirectory() && isMatching(f, false))) {
|
});
|
||||||
ret.add(f.getAbsolutePath().replace(_searchDir.getAbsolutePath() + "/", ""));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
// long click always activates
|
||||||
protected void onPostExecute(List<String> ret) {
|
listView.setOnItemLongClickListener((parent, view, pos, id) -> directActivate.callback(pos));
|
||||||
super.onPostExecute(ret);
|
|
||||||
if (_snackBar != null) {
|
|
||||||
_snackBar.dismiss();
|
|
||||||
}
|
|
||||||
if (_callback != null) {
|
|
||||||
try {
|
|
||||||
_callback.callback(ret);
|
|
||||||
} catch (Exception ignored) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
new ActivityUtils(_activityRef.get()).hideSoftKeyboard().freeContextRef();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
/*#######################################################
|
/*#######################################################
|
||||||
*
|
*
|
||||||
* Maintained by Gregor Santner, 2016-
|
* Maintained 2016-2023 by Gregor Santner <gsantner AT mailbox DOT org>
|
||||||
* https://gsantner.net/
|
|
||||||
*
|
*
|
||||||
* License of this file: Apache 2.0 (Commercial upon request)
|
* License of this file: Apache 2.0
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
* https://github.com/gsantner/opoc/#licensing
|
* https://github.com/gsantner/opoc/#licensing
|
||||||
*
|
*
|
||||||
|
@ -11,6 +10,7 @@
|
||||||
package net.gsantner.opoc.util;
|
package net.gsantner.opoc.util;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.app.ActivityManager;
|
||||||
import android.content.ActivityNotFoundException;
|
import android.content.ActivityNotFoundException;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
@ -38,8 +38,10 @@ import android.view.inputmethod.InputMethodManager;
|
||||||
import android.webkit.WebView;
|
import android.webkit.WebView;
|
||||||
import android.widget.ScrollView;
|
import android.widget.ScrollView;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@SuppressWarnings({"WeakerAccess", "unused", "SameParameterValue", "SpellCheckingInspection"})
|
|
||||||
|
@SuppressWarnings({"WeakerAccess", "unused", "SameParameterValue", "SpellCheckingInspection", "rawtypes", "UnusedReturnValue"})
|
||||||
public class ActivityUtils extends net.gsantner.opoc.util.ContextUtils {
|
public class ActivityUtils extends net.gsantner.opoc.util.ContextUtils {
|
||||||
//########################
|
//########################
|
||||||
//## Members, Constructors
|
//## Members, Constructors
|
||||||
|
@ -239,13 +241,22 @@ public class ActivityUtils extends net.gsantner.opoc.util.ContextUtils {
|
||||||
}
|
}
|
||||||
|
|
||||||
public ActivityUtils setLauncherActivityEnabled(Class activityClass, boolean enable) {
|
public ActivityUtils setLauncherActivityEnabled(Class activityClass, boolean enable) {
|
||||||
Context context = _context.getApplicationContext();
|
try {
|
||||||
PackageManager pkg = context.getPackageManager();
|
ComponentName component = new ComponentName(_context, activityClass);
|
||||||
ComponentName component = new ComponentName(context, activityClass);
|
_context.getPackageManager().setComponentEnabledSetting(component, enable ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
|
||||||
pkg.setComponentEnabledSetting(component, enable ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isLauncherEnabled(Class activityClass) {
|
||||||
|
try {
|
||||||
|
ComponentName component = new ComponentName(_context, activityClass);
|
||||||
|
return _context.getPackageManager().getComponentEnabledSetting(component) != PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@ColorInt
|
@ColorInt
|
||||||
public Integer getCurrentPrimaryColor() {
|
public Integer getCurrentPrimaryColor() {
|
||||||
|
@ -316,4 +327,20 @@ public class ActivityUtils extends net.gsantner.opoc.util.ContextUtils {
|
||||||
} catch (Exception ignored) {
|
} catch (Exception ignored) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Make activity/app not show up in the recents history - call before finish / System.exit
|
||||||
|
public ActivityUtils removeActivityFromHistory() {
|
||||||
|
try {
|
||||||
|
ActivityManager am = (ActivityManager) _activity.getSystemService(Context.ACTIVITY_SERVICE);
|
||||||
|
if (am != null && android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
|
||||||
|
List<ActivityManager.AppTask> tasks = am.getAppTasks();
|
||||||
|
if (tasks != null && !tasks.isEmpty()) {
|
||||||
|
tasks.get(0).setExcludeFromRecents(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
/*#######################################################
|
/*#######################################################
|
||||||
*
|
*
|
||||||
* Maintained by Gregor Santner, 2017-
|
* Maintained 2017-2023 by Gregor Santner <gsantner AT mailbox DOT org>
|
||||||
* https://gsantner.net/
|
|
||||||
*
|
*
|
||||||
* License: Apache 2.0
|
* License: Apache 2.0
|
||||||
* https://github.com/gsantner/opoc/#licensing
|
* https://github.com/gsantner/opoc/#licensing
|
||||||
|
@ -46,8 +45,9 @@ import java.util.Set;
|
||||||
/**
|
/**
|
||||||
* Simple Host-Based AdBlocker
|
* Simple Host-Based AdBlocker
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings({"WeakerAccess", "SpellCheckingInspection", "unused"})
|
@SuppressWarnings({"WeakerAccess", "SpellCheckingInspection", "unused", "TryFinallyCanBeTryWithResources"})
|
||||||
public class AdBlock {
|
public class AdBlock {
|
||||||
|
private static final Object synchronizeObj = new Object();
|
||||||
private static final AdBlock instance = new AdBlock();
|
private static final AdBlock instance = new AdBlock();
|
||||||
|
|
||||||
public static AdBlock getInstance() {
|
public static AdBlock getInstance() {
|
||||||
|
@ -61,7 +61,9 @@ public class AdBlock {
|
||||||
//########################
|
//########################
|
||||||
private final Set<String> _adblockHostsFromRaw = new HashSet<>();
|
private final Set<String> _adblockHostsFromRaw = new HashSet<>();
|
||||||
private final Set<String> _adblockHosts = new HashSet<>();
|
private final Set<String> _adblockHosts = new HashSet<>();
|
||||||
private boolean _isLoaded;
|
private final List<Callback.b3<URI, String, String>> _customBlockCallbacks = new ArrayList<>();
|
||||||
|
private boolean _isLoaded = false;
|
||||||
|
private boolean _isAdblockLogging = false;
|
||||||
|
|
||||||
//########################
|
//########################
|
||||||
//##
|
//##
|
||||||
|
@ -72,25 +74,47 @@ public class AdBlock {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isAdHost(String urlS) {
|
public boolean isAdHost(String urlS) {
|
||||||
|
boolean block = false;
|
||||||
if (urlS != null && !urlS.isEmpty() && urlS.startsWith("http")) {
|
if (urlS != null && !urlS.isEmpty() && urlS.startsWith("http")) {
|
||||||
try {
|
try {
|
||||||
URI url = new URI(urlS);
|
URI url;
|
||||||
|
try {
|
||||||
|
url = new URI(urlS);
|
||||||
|
} catch (Exception e) {
|
||||||
|
url = new URI(urlS.replaceFirst("[?].*", ""));
|
||||||
|
}
|
||||||
String host = url.getHost().trim();
|
String host = url.getHost().trim();
|
||||||
if (host.startsWith("www.") && host.length() >= 4) {
|
if (host.startsWith("www.") && host.length() >= 4) {
|
||||||
host = host.substring(4);
|
host = host.substring(4);
|
||||||
}
|
}
|
||||||
return _adblockHosts.contains(host) || _adblockHosts.contains("www." + host);
|
block = _adblockHosts.contains(host) || _adblockHosts.contains("www." + host);
|
||||||
|
for (Callback.b3<URI, String, String> cb : _customBlockCallbacks) {
|
||||||
|
if (block) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
block = cb.callback(url, urlS, host);
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
|
}
|
||||||
} catch (URISyntaxException e) {
|
} catch (URISyntaxException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
|
if (_isAdblockLogging) {
|
||||||
|
Log.d(getClass().getSimpleName(), "UrlAllowed-" + (block ? "N" : "Y") + " " + urlS);
|
||||||
|
}
|
||||||
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AdBlock reset() {
|
public AdBlock reset() {
|
||||||
|
synchronized (synchronizeObj) {
|
||||||
_adblockHosts.clear();
|
_adblockHosts.clear();
|
||||||
_adblockHosts.addAll(_adblockHostsFromRaw);
|
_adblockHosts.addAll(_adblockHostsFromRaw);
|
||||||
|
_customBlockCallbacks.clear();
|
||||||
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,7 +126,7 @@ public class AdBlock {
|
||||||
return new WebResourceResponse("text/plain", "utf-8", new ByteArrayInputStream("".getBytes()));
|
return new WebResourceResponse("text/plain", "utf-8", new ByteArrayInputStream("".getBytes()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addBlockedHosts(String... hosts) {
|
public AdBlock addBlockedHosts(String... hosts) {
|
||||||
for (String host : hosts) {
|
for (String host : hosts) {
|
||||||
if (host != null) {
|
if (host != null) {
|
||||||
host = host.trim();
|
host = host.trim();
|
||||||
|
@ -110,24 +134,30 @@ public class AdBlock {
|
||||||
host = host.substring(4);
|
host = host.substring(4);
|
||||||
}
|
}
|
||||||
if (!host.startsWith("#") && !host.startsWith("\"")) {
|
if (!host.startsWith("#") && !host.startsWith("\"")) {
|
||||||
|
synchronized (synchronizeObj) {
|
||||||
_adblockHosts.add(host);
|
_adblockHosts.add(host);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void loadHostsFromRawAssetsAsync(final Context context) {
|
public void loadHostsFromRawAssetsAsync(final Context context, final boolean... debugIgnoreAssets) {
|
||||||
new Thread(new Runnable() {
|
if (debugIgnoreAssets != null && debugIgnoreAssets.length > 0 && debugIgnoreAssets[0]) {
|
||||||
@Override
|
_isLoaded = true;
|
||||||
public void run() {
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
new Thread(() -> {
|
||||||
try {
|
try {
|
||||||
|
synchronized (synchronizeObj) {
|
||||||
loadHostsFromRawAssets(context);
|
loadHostsFromRawAssets(context);
|
||||||
_isLoaded = true;
|
_isLoaded = true;
|
||||||
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}).start();
|
}).start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,4 +202,17 @@ public class AdBlock {
|
||||||
}
|
}
|
||||||
return adblockResIds;
|
return adblockResIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// URI uri, String url, String host
|
||||||
|
public AdBlock addCustomBlockCallback(Callback.b3<URI, String, String> cb) {
|
||||||
|
synchronized (synchronizeObj) {
|
||||||
|
_customBlockCallbacks.add(cb);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdBlock setLogEnabled(boolean isAdblockLogging) {
|
||||||
|
_isAdblockLogging = isAdblockLogging;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,72 +0,0 @@
|
||||||
/*#######################################################
|
|
||||||
*
|
|
||||||
* Maintained by Gregor Santner, 2018-
|
|
||||||
* https://gsantner.net/
|
|
||||||
*
|
|
||||||
* License of this file: Apache 2.0 (Commercial upon request)
|
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* https://github.com/gsantner/opoc/#licensing
|
|
||||||
*
|
|
||||||
#########################################################*/
|
|
||||||
package net.gsantner.opoc.util;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.support.v7.app.AlertDialog;
|
|
||||||
|
|
||||||
import com.github.dfa.diaspora_android.R;
|
|
||||||
|
|
||||||
import net.gsantner.opoc.preference.SharedPreferencesPropertyBackend;
|
|
||||||
|
|
||||||
public class AndroidSupportMeWrapper extends ActivityUtils {
|
|
||||||
private LocalSettingsImpl _localSettingsImpl;
|
|
||||||
|
|
||||||
public AndroidSupportMeWrapper(Activity activity) {
|
|
||||||
super(activity);
|
|
||||||
_localSettingsImpl = new LocalSettingsImpl(_context.getApplicationContext());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void openPayPalDonationPage() {
|
|
||||||
String id = getPackageIdManifest();
|
|
||||||
String url = "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=TVV24QBGMN23C&source=self.gsantner.net%2F" + id;
|
|
||||||
openWebpageInExternalBrowser(url);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void openGeneralDonatePage() {
|
|
||||||
openWebpageInExternalBrowser(_context.getString(R.string.app_donate_url));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void mainOnResume() {
|
|
||||||
if (_localSettingsImpl.all14dRequest()) {
|
|
||||||
AlertDialog.Builder dialog = new AlertDialog.Builder(_context);
|
|
||||||
dialog.setTitle(R.string.donate_)
|
|
||||||
.setCancelable(false)
|
|
||||||
.setNegativeButton(R.string.close, (dialogInterface, i) -> dialogInterface.dismiss())
|
|
||||||
.setPositiveButton("PayPal", (dialogInterface, i) -> {
|
|
||||||
openPayPalDonationPage();
|
|
||||||
dialogInterface.dismiss();
|
|
||||||
})
|
|
||||||
.setNeutralButton(R.string.donate_, (dialogInterface, i) -> {
|
|
||||||
openGeneralDonatePage();
|
|
||||||
dialogInterface.dismiss();
|
|
||||||
})
|
|
||||||
.setMessage(R.string.do_you_like_this_project_want_donate_to_keep_alive);
|
|
||||||
dialog.show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class LocalSettingsImpl extends SharedPreferencesPropertyBackend {
|
|
||||||
private final SharedPreferences _prefCache;
|
|
||||||
|
|
||||||
public LocalSettingsImpl(Context _context) {
|
|
||||||
super(_context, "AndroidSupportMeWrapper.LocalSettingsImpl");
|
|
||||||
_prefCache = _context.getSharedPreferences("cache", Context.MODE_PRIVATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean all14dRequest() {
|
|
||||||
return afterDaysTrue("all14dRequest", 31, 3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,9 +1,8 @@
|
||||||
/*#######################################################
|
/*#######################################################
|
||||||
*
|
*
|
||||||
* Maintained by Gregor Santner, 2018-
|
* Maintained 2018-2023 by Gregor Santner <gsantner AT mailbox DOT org>
|
||||||
* https://gsantner.net/
|
|
||||||
*
|
*
|
||||||
* License of this file: Apache 2.0 (Commercial upon request)
|
* License of this file: Apache 2.0
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
* https://github.com/gsantner/opoc/#licensing
|
* https://github.com/gsantner/opoc/#licensing
|
||||||
*
|
*
|
||||||
|
@ -37,6 +36,10 @@ public class Callback {
|
||||||
void callback(A arg1, B arg2, C arg3, D arg4, E arg5);
|
void callback(A arg1, B arg2, C arg3, D arg4, E arg5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface b0 {
|
||||||
|
boolean callback();
|
||||||
|
}
|
||||||
|
|
||||||
public interface b1<A> {
|
public interface b1<A> {
|
||||||
boolean callback(A arg1);
|
boolean callback(A arg1);
|
||||||
}
|
}
|
||||||
|
@ -56,4 +59,28 @@ public class Callback {
|
||||||
public interface b5<A, B, C, D, E> {
|
public interface b5<A, B, C, D, E> {
|
||||||
boolean callback(A arg1, B arg2, C arg3, D arg4, E arg5);
|
boolean callback(A arg1, B arg2, C arg3, D arg4, E arg5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface s0 {
|
||||||
|
String callback();
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface s1<A> {
|
||||||
|
String callback(A arg1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface s2<A, B> {
|
||||||
|
String callback(A arg1, B arg2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface s3<A, B, C> {
|
||||||
|
String callback(A arg1, B arg2, C arg3);
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface s4<A, B, C, D> {
|
||||||
|
String callback(A arg1, B arg2, C arg3, D arg4);
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface s5<A, B, C, D, E> {
|
||||||
|
String callback(A arg1, B arg2, C arg3, D arg4, E arg5);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
/*#######################################################
|
/*#######################################################
|
||||||
*
|
*
|
||||||
* Maintained by Gregor Santner, 2016-
|
* Maintained 2016-2023 by Gregor Santner <gsantner AT mailbox DOT org>
|
||||||
* https://gsantner.net/
|
|
||||||
*
|
*
|
||||||
* License of this file: Apache 2.0 (Commercial upon request)
|
* License of this file: Apache 2.0
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
* https://github.com/gsantner/opoc/#licensing
|
* https://github.com/gsantner/opoc/#licensing
|
||||||
*
|
*
|
||||||
|
@ -67,7 +66,9 @@ import android.util.Log;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
|
import android.view.Surface;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.view.WindowManager;
|
||||||
import android.webkit.MimeTypeMap;
|
import android.webkit.MimeTypeMap;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
@ -76,10 +77,10 @@ import net.gsantner.opoc.format.markdown.SimpleMarkdownParser;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -90,7 +91,7 @@ import static android.content.Context.VIBRATOR_SERVICE;
|
||||||
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
|
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
|
||||||
import static android.graphics.Bitmap.CompressFormat;
|
import static android.graphics.Bitmap.CompressFormat;
|
||||||
|
|
||||||
@SuppressWarnings({"WeakerAccess", "unused", "SameParameterValue", "ObsoleteSdkInt", "deprecation", "SpellCheckingInspection", "TryFinallyCanBeTryWithResources", "UnusedAssignment"})
|
@SuppressWarnings({"WeakerAccess", "unused", "SameParameterValue", "ObsoleteSdkInt", "deprecation", "SpellCheckingInspection", "TryFinallyCanBeTryWithResources", "UnusedAssignment", "UnusedReturnValue"})
|
||||||
public class ContextUtils {
|
public class ContextUtils {
|
||||||
//
|
//
|
||||||
// Members, Constructors
|
// Members, Constructors
|
||||||
|
@ -144,11 +145,11 @@ public class ContextUtils {
|
||||||
/**
|
/**
|
||||||
* Get String by given string ressource identifier (textual)
|
* Get String by given string ressource identifier (textual)
|
||||||
*/
|
*/
|
||||||
public String rstr(final String strResKey) {
|
public String rstr(final String strResKey, Object... a0getResKeyAsFallback) {
|
||||||
try {
|
try {
|
||||||
return rstr(getResId(ResType.STRING, strResKey));
|
return rstr(getResId(ResType.STRING, strResKey));
|
||||||
} catch (Resources.NotFoundException e) {
|
} catch (Resources.NotFoundException e) {
|
||||||
return null;
|
return a0getResKeyAsFallback != null && a0getResKeyAsFallback.length > 0 ? strResKey : null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -257,7 +258,7 @@ public class ContextUtils {
|
||||||
* Send a {@link Intent#ACTION_VIEW} Intent with given paramter
|
* Send a {@link Intent#ACTION_VIEW} Intent with given paramter
|
||||||
* If the parameter is an string a browser will get triggered
|
* If the parameter is an string a browser will get triggered
|
||||||
*/
|
*/
|
||||||
public void openWebpageInExternalBrowser(final String url) {
|
public ContextUtils openWebpageInExternalBrowser(final String url) {
|
||||||
try {
|
try {
|
||||||
Uri uri = Uri.parse(url);
|
Uri uri = Uri.parse(url);
|
||||||
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
|
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
|
||||||
|
@ -266,6 +267,7 @@ public class ContextUtils {
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -292,14 +294,27 @@ public class ContextUtils {
|
||||||
* Falls back to applicationId of the app which may differ from manifest.
|
* Falls back to applicationId of the app which may differ from manifest.
|
||||||
*/
|
*/
|
||||||
public Object getBuildConfigValue(final String fieldName) {
|
public Object getBuildConfigValue(final String fieldName) {
|
||||||
String pkg = getPackageIdManifest() + ".BuildConfig";
|
final String pkg = getPackageIdManifest() + ".BuildConfig";
|
||||||
try {
|
try {
|
||||||
Class<?> c = Class.forName(pkg);
|
Class<?> c = Class.forName(pkg);
|
||||||
return c.getField(fieldName).get(null);
|
return c.getField(fieldName).get(null);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<String> getBuildConfigFields() {
|
||||||
|
final String pkg = getPackageIdManifest() + ".BuildConfig";
|
||||||
|
final List<String> fields = new ArrayList<>();
|
||||||
|
try {
|
||||||
|
for (Field f : Class.forName(pkg).getFields()) {
|
||||||
|
fields.add(f.getName());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return fields;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -349,26 +364,6 @@ public class ContextUtils {
|
||||||
return bcbool("IS_FOSS_BUILD", false);
|
return bcbool("IS_FOSS_BUILD", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Request a bitcoin donation with given details.
|
|
||||||
* All parameters are awaited as string resource ids
|
|
||||||
*/
|
|
||||||
public void showDonateBitcoinRequest(@StringRes final int srBitcoinId, @StringRes final int srBitcoinAmount, @StringRes final int srBitcoinMessage, @StringRes final int srAlternativeDonateUrl) {
|
|
||||||
if (!isGooglePlayBuild()) {
|
|
||||||
String btcUri = String.format("bitcoin:%s?amount=%s&label=%s&message=%s",
|
|
||||||
rstr(srBitcoinId), rstr(srBitcoinAmount),
|
|
||||||
rstr(srBitcoinMessage), rstr(srBitcoinMessage));
|
|
||||||
Intent intent = new Intent(Intent.ACTION_VIEW);
|
|
||||||
intent.setData(Uri.parse(btcUri));
|
|
||||||
intent.addFlags(FLAG_ACTIVITY_NEW_TASK);
|
|
||||||
try {
|
|
||||||
_context.startActivity(intent);
|
|
||||||
} catch (ActivityNotFoundException e) {
|
|
||||||
openWebpageInExternalBrowser(rstr(srAlternativeDonateUrl));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String readTextfileFromRawRes(@RawRes int rawResId, String linePrefix, String linePostfix) {
|
public String readTextfileFromRawRes(@RawRes int rawResId, String linePrefix, String linePostfix) {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
BufferedReader br = null;
|
BufferedReader br = null;
|
||||||
|
@ -742,44 +737,27 @@ public class ContextUtils {
|
||||||
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
|
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Write the given {@link Bitmap} to {@code imageFile}, in {@link CompressFormat#JPEG} format
|
|
||||||
*/
|
|
||||||
public boolean writeImageToFileJpeg(final File imageFile, final Bitmap image) {
|
|
||||||
return writeImageToFile(imageFile, image, Bitmap.CompressFormat.JPEG, 95);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write the given {@link Bitmap} to filesystem
|
* Write the given {@link Bitmap} to filesystem
|
||||||
*
|
*
|
||||||
* @param targetFile The file to be written in
|
* @param targetFile The file to be written in
|
||||||
* @param image The image as android {@link Bitmap}
|
* @param image Android {@link Bitmap}
|
||||||
* @param format One format of {@link CompressFormat}, null will determine based on filename
|
|
||||||
* @param quality Quality level, defaults to 95
|
|
||||||
* @return True if writing was successful
|
* @return True if writing was successful
|
||||||
*/
|
*/
|
||||||
public boolean writeImageToFile(final File targetFile, final Bitmap image, CompressFormat format, Integer quality) {
|
public boolean writeImageToFile(final File targetFile, final Bitmap image, Integer... a0quality) {
|
||||||
|
final int quality = (a0quality != null && a0quality.length > 0 && a0quality[0] >= 0 && a0quality[0] <= 100) ? a0quality[0] : 70;
|
||||||
|
final String lc = targetFile.getAbsolutePath().toLowerCase(Locale.ROOT);
|
||||||
|
final CompressFormat format = lc.endsWith(".webp") ? CompressFormat.WEBP : (lc.endsWith(".png") ? CompressFormat.PNG : CompressFormat.JPEG);
|
||||||
|
|
||||||
|
boolean ok = false;
|
||||||
File folder = new File(targetFile.getParent());
|
File folder = new File(targetFile.getParent());
|
||||||
if (quality == null || quality < 0 || quality > 100) {
|
|
||||||
quality = 95;
|
|
||||||
}
|
|
||||||
if (format == null) {
|
|
||||||
format = CompressFormat.JPEG;
|
|
||||||
String lc = targetFile.getAbsolutePath().toLowerCase(Locale.ROOT);
|
|
||||||
if (lc.endsWith(".png")) {
|
|
||||||
format = CompressFormat.PNG;
|
|
||||||
}
|
|
||||||
if (lc.endsWith(".webp")) {
|
|
||||||
format = CompressFormat.WEBP;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (folder.exists() || folder.mkdirs()) {
|
if (folder.exists() || folder.mkdirs()) {
|
||||||
FileOutputStream stream = null;
|
FileOutputStream stream = null;
|
||||||
try {
|
try {
|
||||||
stream = new FileOutputStream(targetFile); // overwrites this image every time
|
stream = new FileOutputStream(targetFile);
|
||||||
image.compress(format, quality, stream);
|
image.compress(format, quality, stream);
|
||||||
return true;
|
ok = true;
|
||||||
} catch (FileNotFoundException ignored) {
|
} catch (Exception ignored) {
|
||||||
} finally {
|
} finally {
|
||||||
try {
|
try {
|
||||||
if (stream != null) {
|
if (stream != null) {
|
||||||
|
@ -789,7 +767,11 @@ public class ContextUtils {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
try {
|
||||||
|
image.recycle();
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -893,7 +875,7 @@ public class ContextUtils {
|
||||||
public CharSequence filter(CharSequence src, int start, int end, Spanned dest, int dstart, int dend) {
|
public CharSequence filter(CharSequence src, int start, int end, Spanned dest, int dstart, int dend) {
|
||||||
if (src.length() < 1) return null;
|
if (src.length() < 1) return null;
|
||||||
char last = src.charAt(src.length() - 1);
|
char last = src.charAt(src.length() - 1);
|
||||||
String illegal = "|\\?*<\":>+[]/'";
|
String illegal = "|\\?*<\":>[]/'";
|
||||||
if (illegal.indexOf(last) > -1) return src.subSequence(0, src.length() - 1);
|
if (illegal.indexOf(last) > -1) return src.subSequence(0, src.length() - 1);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -935,7 +917,11 @@ public class ContextUtils {
|
||||||
ContentResolver cr = _context.getContentResolver();
|
ContentResolver cr = _context.getContentResolver();
|
||||||
mimeType = cr.getType(uri);
|
mimeType = cr.getType(uri);
|
||||||
} else {
|
} else {
|
||||||
String ext = MimeTypeMap.getFileExtensionFromUrl(uri.toString());
|
String filename = uri.toString();
|
||||||
|
if (filename.endsWith(".jenc")) {
|
||||||
|
filename = filename.replace(".jenc", "");
|
||||||
|
}
|
||||||
|
String ext = MimeTypeMap.getFileExtensionFromUrl(filename);
|
||||||
mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext.toLowerCase());
|
mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext.toLowerCase());
|
||||||
|
|
||||||
// Try to guess if the recommended methods fail
|
// Try to guess if the recommended methods fail
|
||||||
|
@ -1007,6 +993,25 @@ public class ContextUtils {
|
||||||
vibrator.vibrate(ms_v);
|
vibrator.vibrate(ms_v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Check if Wifi is connected. Requires these permissions in AndroidManifest:
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||||
|
*/
|
||||||
|
@SuppressLint("MissingPermission")
|
||||||
|
public boolean isWifiConnected(boolean... enabledOnly) {
|
||||||
|
final boolean doEnabledCheckOnly = enabledOnly != null && enabledOnly.length > 0 && enabledOnly[0];
|
||||||
|
final ConnectivityManager connectivityManager = (ConnectivityManager) _context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||||
|
final NetworkInfo wifiInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
|
||||||
|
return wifiInfo != null && (doEnabledCheckOnly ? wifiInfo.isAvailable() : wifiInfo.isConnected());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns if the device is currently in portrait orientation (landscape=false)
|
||||||
|
public boolean isDeviceOrientationPortrait() {
|
||||||
|
final int rotation = ((WindowManager) _context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();
|
||||||
|
return (rotation == Surface.ROTATION_0) || (rotation == Surface.ROTATION_180);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
/*#######################################################
|
/*#######################################################
|
||||||
*
|
*
|
||||||
* Maintained by Gregor Santner, 2017-
|
* Maintained 2017-2023 by Gregor Santner <gsantner AT mailbox DOT org>
|
||||||
* https://gsantner.net/
|
|
||||||
*
|
*
|
||||||
* License of this file: Apache 2.0 (Commercial upon request)
|
* License of this file: Apache 2.0
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
* https://github.com/gsantner/opoc/#licensing
|
* https://github.com/gsantner/opoc/#licensing
|
||||||
*
|
*
|
||||||
|
@ -11,6 +10,8 @@
|
||||||
package net.gsantner.opoc.util;
|
package net.gsantner.opoc.util;
|
||||||
|
|
||||||
|
|
||||||
|
import android.text.TextUtils;
|
||||||
|
|
||||||
import java.io.BufferedInputStream;
|
import java.io.BufferedInputStream;
|
||||||
import java.io.BufferedOutputStream;
|
import java.io.BufferedOutputStream;
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
|
@ -37,7 +38,7 @@ import java.util.UUID;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@SuppressWarnings({"WeakerAccess", "unused", "SameParameterValue", "SpellCheckingInspection", "deprecation"})
|
@SuppressWarnings({"WeakerAccess", "unused", "SameParameterValue", "SpellCheckingInspection", "deprecation", "TryFinallyCanBeTryWithResources"})
|
||||||
public class FileUtils {
|
public class FileUtils {
|
||||||
// Used on methods like copyFile(src, dst)
|
// Used on methods like copyFile(src, dst)
|
||||||
private static final int BUFFER_SIZE = 4096;
|
private static final int BUFFER_SIZE = 4096;
|
||||||
|
@ -391,27 +392,27 @@ public class FileUtils {
|
||||||
*/
|
*/
|
||||||
public static String getMimeType(File file) {
|
public static String getMimeType(File file) {
|
||||||
String guess = null;
|
String guess = null;
|
||||||
if (file != null && file.exists() && file.isFile()) {
|
if (file != null) {
|
||||||
|
if (file.exists() && file.isFile()) {
|
||||||
InputStream is = null;
|
InputStream is = null;
|
||||||
try {
|
try {
|
||||||
is = new BufferedInputStream(new FileInputStream(file));
|
is = new BufferedInputStream(new FileInputStream(file));
|
||||||
guess = URLConnection.guessContentTypeFromStream(is);
|
guess = URLConnection.guessContentTypeFromStream(is);
|
||||||
} catch (IOException e) {
|
} catch (Exception ignored) {
|
||||||
e.printStackTrace();
|
|
||||||
} finally {
|
} finally {
|
||||||
if (is != null) {
|
if (is != null) {
|
||||||
try {
|
try {
|
||||||
is.close();
|
is.close();
|
||||||
} catch (IOException ignored) {
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (guess == null || guess.isEmpty()) {
|
String filename = file.getName().replace(".jenc", "");
|
||||||
guess = "*/*";
|
int dot = filename.lastIndexOf(".") + 1;
|
||||||
int dot = file.getName().lastIndexOf(".") + 1;
|
if (dot > 0 && dot < filename.length()) {
|
||||||
if (dot > 0 && dot < file.getName().length()) {
|
switch (filename.substring(dot)) {
|
||||||
switch (file.getName().substring(dot)) {
|
|
||||||
case "md":
|
case "md":
|
||||||
case "markdown":
|
case "markdown":
|
||||||
case "mkd":
|
case "mkd":
|
||||||
|
@ -424,11 +425,25 @@ public class FileUtils {
|
||||||
case "txt":
|
case "txt":
|
||||||
guess = "text/plain";
|
guess = "text/plain";
|
||||||
break;
|
break;
|
||||||
|
case "webp":
|
||||||
|
guess = "image/webp";
|
||||||
|
break;
|
||||||
|
case "jpg":
|
||||||
|
case "jpeg":
|
||||||
|
guess = "image/jpeg";
|
||||||
|
break;
|
||||||
|
case "png":
|
||||||
|
guess = "image/png";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (TextUtils.isEmpty(guess)) {
|
||||||
|
guess = URLConnection.guessContentTypeFromName(filename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return guess;
|
|
||||||
|
return TextUtils.isEmpty(guess) ? "*/*" : guess;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isTextFile(File file) {
|
public static boolean isTextFile(File file) {
|
||||||
|
@ -488,4 +503,25 @@ public class FileUtils {
|
||||||
ret[2] = (int) (diff / 1000) % 60; // sec
|
ret[2] = (int) (diff / 1000) % 60; // sec
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String getHumanReadableByteCountSI(final long bytes) {
|
||||||
|
if (bytes < 1000) {
|
||||||
|
return String.format(Locale.getDefault(), "%d%s", bytes, "B");
|
||||||
|
} else if (bytes < 1000000) {
|
||||||
|
return String.format(Locale.getDefault(), "%.2f%s", (bytes / 1000f), "KB");
|
||||||
|
} else if (bytes < 1000000000) {
|
||||||
|
return String.format(Locale.getDefault(), "%.2f%s", (bytes / 1000000f), "MB");
|
||||||
|
} else if (bytes < 1000000000000L) {
|
||||||
|
return String.format(Locale.getDefault(), "%.2f%s", (bytes / 1000000000f), "GB");
|
||||||
|
} else {
|
||||||
|
return String.format(Locale.getDefault(), "%.2f%s", (bytes / 1000000000000f), "TB");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static File join(File file, String... childSegments) {
|
||||||
|
for (final String s : childSegments != null ? childSegments : new String[0]) {
|
||||||
|
file = new File(file, s);
|
||||||
|
}
|
||||||
|
return file;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
/*#######################################################
|
/*#######################################################
|
||||||
*
|
*
|
||||||
* Maintained by Gregor Santner, 2017-
|
* Maintained 2017-2023 by Gregor Santner <gsantner AT mailbox DOT org>
|
||||||
* https://gsantner.net/
|
|
||||||
*
|
*
|
||||||
* License of this file: Apache 2.0 (Commercial upon request)
|
* License of this file: Apache 2.0
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
* https://github.com/gsantner/opoc/#licensing
|
* https://github.com/gsantner/opoc/#licensing
|
||||||
*
|
*
|
||||||
|
@ -150,6 +149,7 @@ public class NetworkUtils {
|
||||||
return performCall(url, method, data, null);
|
return performCall(url, method, data, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("CharsetObjectCanBeUsed")
|
||||||
private static String performCall(final URL url, final String method, final String data, final HttpURLConnection existingConnection) {
|
private static String performCall(final URL url, final String method, final String data, final HttpURLConnection existingConnection) {
|
||||||
try {
|
try {
|
||||||
final HttpURLConnection connection = existingConnection != null
|
final HttpURLConnection connection = existingConnection != null
|
||||||
|
@ -160,7 +160,7 @@ public class NetworkUtils {
|
||||||
if (data != null && !data.isEmpty()) {
|
if (data != null && !data.isEmpty()) {
|
||||||
connection.setDoOutput(true);
|
connection.setDoOutput(true);
|
||||||
final OutputStream output = connection.getOutputStream();
|
final OutputStream output = connection.getOutputStream();
|
||||||
output.write(data.getBytes(Charset.forName(UTF8)));
|
output.write(data.getBytes(Charset.forName("UTF-8")));
|
||||||
output.flush();
|
output.flush();
|
||||||
output.close();
|
output.close();
|
||||||
}
|
}
|
||||||
|
@ -220,4 +220,14 @@ public class NetworkUtils {
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void httpGetAsync(final String url, final Callback.a1<String> callback) {
|
||||||
|
new Thread(() -> {
|
||||||
|
try {
|
||||||
|
String c = NetworkUtils.performCall(url, GET);
|
||||||
|
callback.callback(c);
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
/*#######################################################
|
/*#######################################################
|
||||||
*
|
*
|
||||||
* Maintained by Gregor Santner, 2017-
|
* Maintained 2017-2023 by Gregor Santner <gsantner AT mailbox DOT org>
|
||||||
* https://gsantner.net/
|
|
||||||
*
|
*
|
||||||
* License of this file: Apache 2.0 (Commercial upon request)
|
* License of this file: Apache 2.0
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
* https://github.com/gsantner/opoc/#licensing
|
* https://github.com/gsantner/opoc/#licensing
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
/*#######################################################
|
/*#######################################################
|
||||||
*
|
*
|
||||||
* Maintained by Gregor Santner, 2017-
|
* Maintained 2017-2023 by Gregor Santner <gsantner AT mailbox DOT org>
|
||||||
* https://gsantner.net/
|
|
||||||
*
|
*
|
||||||
* License of this file: Apache 2.0 (Commercial upon request)
|
* License of this file: Apache 2.0
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
* https://github.com/gsantner/opoc/#licensing
|
* https://github.com/gsantner/opoc/#licensing
|
||||||
*
|
*
|
||||||
|
@ -78,11 +77,12 @@ import static android.app.Activity.RESULT_OK;
|
||||||
* Also allows to parse/fetch information out of shared information.
|
* Also allows to parse/fetch information out of shared information.
|
||||||
* (M)Permissions are not checked, wrap ShareUtils methods if neccessary
|
* (M)Permissions are not checked, wrap ShareUtils methods if neccessary
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings({"UnusedReturnValue", "WeakerAccess", "SameParameterValue", "unused", "deprecation", "ConstantConditions", "ObsoleteSdkInt", "SpellCheckingInspection", "JavadocReference"})
|
@SuppressWarnings({"UnusedReturnValue", "WeakerAccess", "SameParameterValue", "unused", "deprecation", "ConstantConditions", "ObsoleteSdkInt", "SpellCheckingInspection", "JavadocReference", "ConstantLocale"})
|
||||||
public class ShareUtil {
|
public class ShareUtil {
|
||||||
public final static String EXTRA_FILEPATH = "real_file_path_2";
|
public final static String EXTRA_FILEPATH = "real_file_path_2";
|
||||||
public final static SimpleDateFormat SDF_RFC3339_ISH = new SimpleDateFormat("yyyy-MM-dd'T'HH-mm-ss", Locale.getDefault());
|
public final static SimpleDateFormat SDF_RFC3339_ISH = new SimpleDateFormat("yyyy-MM-dd'T'HH-mm-ss", Locale.getDefault());
|
||||||
public final static SimpleDateFormat SDF_SHORT = new SimpleDateFormat("yyMMdd-HHmmss", Locale.getDefault());
|
public final static SimpleDateFormat SDF_SHORT = new SimpleDateFormat("yyMMdd-HHmmss", Locale.getDefault());
|
||||||
|
public final static SimpleDateFormat SDF_IMAGES = new SimpleDateFormat("yyyyMMdd-HHmmss", Locale.getDefault()); //20190511-230845
|
||||||
public final static String MIME_TEXT_PLAIN = "text/plain";
|
public final static String MIME_TEXT_PLAIN = "text/plain";
|
||||||
public final static String PREF_KEY__SAF_TREE_URI = "pref_key__saf_tree_uri";
|
public final static String PREF_KEY__SAF_TREE_URI = "pref_key__saf_tree_uri";
|
||||||
|
|
||||||
|
@ -90,10 +90,12 @@ public class ShareUtil {
|
||||||
public final static int REQUEST_PICK_PICTURE = 50002;
|
public final static int REQUEST_PICK_PICTURE = 50002;
|
||||||
public final static int REQUEST_SAF = 50003;
|
public final static int REQUEST_SAF = 50003;
|
||||||
|
|
||||||
|
public final static int MIN_OVERWRITE_LENGTH = 5;
|
||||||
|
|
||||||
protected static String _lastCameraPictureFilepath;
|
protected static String _lastCameraPictureFilepath;
|
||||||
|
protected static String _fileProviderAuthority;
|
||||||
|
|
||||||
protected Context _context;
|
protected Context _context;
|
||||||
protected String _fileProviderAuthority;
|
|
||||||
protected String _chooserTitle;
|
protected String _chooserTitle;
|
||||||
|
|
||||||
public ShareUtil(final Context context) {
|
public ShareUtil(final Context context) {
|
||||||
|
@ -116,9 +118,8 @@ public class ShareUtil {
|
||||||
return _fileProviderAuthority;
|
return _fileProviderAuthority;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ShareUtil setFileProviderAuthority(final String fileProviderAuthority) {
|
public static void setFileProviderAuthority(final String fileProviderAuthority) {
|
||||||
_fileProviderAuthority = fileProviderAuthority;
|
_fileProviderAuthority = fileProviderAuthority;
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -228,9 +229,9 @@ public class ShareUtil {
|
||||||
intent.putExtra(Intent.EXTRA_STREAM, fileUri);
|
intent.putExtra(Intent.EXTRA_STREAM, fileUri);
|
||||||
showChooser(intent, null);
|
showChooser(intent, null);
|
||||||
return true;
|
return true;
|
||||||
} catch (Exception e) { // FileUriExposed(API24) / IllegalArgument
|
} catch (Exception ignored) { // FileUriExposed(API24) / IllegalArgument
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -318,17 +319,6 @@ public class ShareUtil {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Share the given bitmap with given format
|
|
||||||
*
|
|
||||||
* @param bitmap Image
|
|
||||||
* @param format A {@link Bitmap.CompressFormat}, supporting JPEG,PNG,WEBP
|
|
||||||
* @return if success, true
|
|
||||||
*/
|
|
||||||
public boolean shareImage(final Bitmap bitmap, final Bitmap.CompressFormat format) {
|
|
||||||
return shareImage(bitmap, format, 95, "SharedImage");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Share the given bitmap with given format
|
* Share the given bitmap with given format
|
||||||
*
|
*
|
||||||
|
@ -338,20 +328,36 @@ public class ShareUtil {
|
||||||
* @param quality Quality of the exported image [0-100]
|
* @param quality Quality of the exported image [0-100]
|
||||||
* @return if success, true
|
* @return if success, true
|
||||||
*/
|
*/
|
||||||
public boolean shareImage(final Bitmap bitmap, final Bitmap.CompressFormat format, final int quality, final String imageName) {
|
public boolean shareImage(final Bitmap bitmap, final Integer... quality) {
|
||||||
try {
|
try {
|
||||||
String ext = format.name().toLowerCase();
|
File file = new File(_context.getCacheDir(), getFilenameWithTimestamp());
|
||||||
File file = File.createTempFile(imageName, "." + ext.replace("jpeg", "jpg"), _context.getExternalCacheDir());
|
if (bitmap != null && new ContextUtils(_context).writeImageToFile(file, bitmap, quality)) {
|
||||||
if (bitmap != null && new ContextUtils(_context).writeImageToFile(file, bitmap, format, quality)) {
|
String x = FileUtils.getMimeType(file);
|
||||||
shareStream(file, "image/" + ext);
|
shareStream(file, FileUtils.getMimeType(file));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (Exception ignored) {
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a filename based off current datetime in filename (year, month, day, hour, minute, second)
|
||||||
|
* Examples: Screenshot_20210208-184301_Trebuchet.png IMG_20190511-230845.jpg
|
||||||
|
*
|
||||||
|
* @param A0prefixA1postfixA2ext All arguments are optional and default values are taken for null
|
||||||
|
* [0] = Prefix [Screenshot/IMG]
|
||||||
|
* [1] = Postfix [Trebuchet]
|
||||||
|
* [2] = File extensions [jpg/png/txt]
|
||||||
|
* @return Filename
|
||||||
|
*/
|
||||||
|
public static String getFilenameWithTimestamp(String... A0prefixA1postfixA2ext) {
|
||||||
|
final String prefix = (((A0prefixA1postfixA2ext != null && A0prefixA1postfixA2ext.length > 0 && !TextUtils.isEmpty(A0prefixA1postfixA2ext[0])) ? A0prefixA1postfixA2ext[0] : "Screenshot") + "_").trim().replaceFirst("^_$", "");
|
||||||
|
final String postfix = ("_" + ((A0prefixA1postfixA2ext != null && A0prefixA1postfixA2ext.length > 1 && !TextUtils.isEmpty(A0prefixA1postfixA2ext[1])) ? A0prefixA1postfixA2ext[1] : "")).trim().replaceFirst("^_$", "");
|
||||||
|
final String ext = (A0prefixA1postfixA2ext != null && A0prefixA1postfixA2ext.length > 2 && !TextUtils.isEmpty(A0prefixA1postfixA2ext[2])) ? A0prefixA1postfixA2ext[2] : "jpg";
|
||||||
|
return String.format("%s%s%s.%s", prefix.trim(), SDF_IMAGES.format(new Date()), postfix.trim(), ext.toLowerCase().replace(".", "").replace("jpeg", "jpg"));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Print a {@link WebView}'s contents, also allows to create a PDF
|
* Print a {@link WebView}'s contents, also allows to create a PDF
|
||||||
*
|
*
|
||||||
|
@ -403,21 +409,21 @@ public class ShareUtil {
|
||||||
* @return A {@link Bitmap} or null
|
* @return A {@link Bitmap} or null
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
public static Bitmap getBitmapFromWebView(final WebView webView) {
|
public static Bitmap getBitmapFromWebView(final WebView webView, final boolean... a0fullpage) {
|
||||||
try {
|
try {
|
||||||
//Measure WebView's content
|
//Measure WebView's content
|
||||||
|
if (a0fullpage != null && a0fullpage.length > 0 && a0fullpage[0]) {
|
||||||
int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
|
int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
|
||||||
int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
|
int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
|
||||||
webView.measure(widthMeasureSpec, heightMeasureSpec);
|
webView.measure(widthMeasureSpec, heightMeasureSpec);
|
||||||
webView.layout(0, 0, webView.getMeasuredWidth(), webView.getMeasuredHeight());
|
webView.layout(0, 0, webView.getMeasuredWidth(), webView.getMeasuredHeight());
|
||||||
|
}
|
||||||
|
|
||||||
//Build drawing cache and store its size
|
//Build drawing cache and store its size
|
||||||
webView.buildDrawingCache();
|
webView.buildDrawingCache();
|
||||||
int measuredWidth = webView.getMeasuredWidth();
|
|
||||||
int measuredHeight = webView.getMeasuredHeight();
|
|
||||||
|
|
||||||
//Creates the bitmap and draw WebView's content on in
|
//Creates the bitmap and draw WebView's content on in
|
||||||
Bitmap bitmap = Bitmap.createBitmap(measuredWidth, measuredHeight, Bitmap.Config.ARGB_8888);
|
Bitmap bitmap = Bitmap.createBitmap(webView.getMeasuredWidth(), webView.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
|
||||||
Canvas canvas = new Canvas(bitmap);
|
Canvas canvas = new Canvas(bitmap);
|
||||||
canvas.drawBitmap(bitmap, 0, bitmap.getHeight(), new Paint());
|
canvas.drawBitmap(bitmap, 0, bitmap.getHeight(), new Paint());
|
||||||
|
|
||||||
|
@ -1132,7 +1138,9 @@ public class ShareUtil {
|
||||||
try {
|
try {
|
||||||
FileOutputStream fileOutputStream = null;
|
FileOutputStream fileOutputStream = null;
|
||||||
ParcelFileDescriptor pfd = null;
|
ParcelFileDescriptor pfd = null;
|
||||||
if (file.canWrite() || (!file.exists() && file.getParentFile().canWrite())) {
|
final boolean existingEmptyFile = file.canWrite() && file.length() < MIN_OVERWRITE_LENGTH;
|
||||||
|
final boolean nonExistingCreatableFile = !file.exists() && file.getParentFile().canWrite();
|
||||||
|
if (existingEmptyFile || nonExistingCreatableFile) {
|
||||||
if (isDirectory) {
|
if (isDirectory) {
|
||||||
file.mkdirs();
|
file.mkdirs();
|
||||||
} else {
|
} else {
|
||||||
|
@ -1144,7 +1152,7 @@ public class ShareUtil {
|
||||||
if (isDirectory) {
|
if (isDirectory) {
|
||||||
// Nothing to do
|
// Nothing to do
|
||||||
} else {
|
} else {
|
||||||
pfd = _context.getContentResolver().openFileDescriptor(dof.getUri(), "w");
|
pfd = _context.getContentResolver().openFileDescriptor(dof.getUri(), "rwt");
|
||||||
fileOutputStream = new FileOutputStream(pfd.getFileDescriptor());
|
fileOutputStream = new FileOutputStream(pfd.getFileDescriptor());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
* Gregor Santner (gsantner)
|
* Gregor Santner (gsantner)
|
||||||
~° http://gsantner.net
|
~° https://github.com/gsantner
|
||||||
|
|
||||||
* Paul Schaub (vanitasvitae)
|
* Paul Schaub (vanitasvitae)
|
||||||
~° https://github.com/vanitasvitae
|
~° https://github.com/vanitasvitae
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">Maak navigasie balk oop</string>
|
<string name="open_navdrawer">Maak navigasie balk oop</string>
|
||||||
|
@ -155,5 +154,4 @@
|
||||||
<string name="youtube_links">Youtube links</string>
|
<string name="youtube_links">Youtube links</string>
|
||||||
<string name="change_the_theme_of_your_account">Verander die tema van jou rekening</string>
|
<string name="change_the_theme_of_your_account">Verander die tema van jou rekening</string>
|
||||||
<string name="pull_to_refresh">Trek om te verfris</string>
|
<string name="pull_to_refresh">Trek om te verfris</string>
|
||||||
<string name="donate">Skenk</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<!-- Common Words -->
|
<!-- Common Words -->
|
||||||
|
@ -39,5 +38,4 @@
|
||||||
<string name="license">ترخيص</string>
|
<string name="license">ترخيص</string>
|
||||||
<!-- License & help (large amount of text) -->
|
<!-- License & help (large amount of text) -->
|
||||||
<string name="contributors">المساهمون</string>
|
<string name="contributors">المساهمون</string>
|
||||||
<string name="donate">تبرع</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
24
app/src/main/res/values-az/strings.xml
Normal file
24
app/src/main/res/values-az/strings.xml
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<!-- Application -->
|
||||||
|
<!-- Common Words -->
|
||||||
|
<!-- Notifications dropdown menu -->
|
||||||
|
<!-- Pod Activity -->
|
||||||
|
<!-- Drawer, Menu, Toolbar, ContextMenu -->
|
||||||
|
<!-- More from MainActivity -->
|
||||||
|
<!-- Permissions -->
|
||||||
|
<!-- Operability -->
|
||||||
|
<!-- Category Titles -->
|
||||||
|
<!-- Visuals -->
|
||||||
|
<!-- Navigiation Slider -->
|
||||||
|
<!-- Themes -->
|
||||||
|
<!-- Notifications dropdown -->
|
||||||
|
<!-- Font size -->
|
||||||
|
<!-- Load images -->
|
||||||
|
<!-- Screen rotation -->
|
||||||
|
<!-- Proxy -->
|
||||||
|
<!-- Chrome custom tabs -->
|
||||||
|
<!-- Diaspora Settings -->
|
||||||
|
<!-- More -->
|
||||||
|
<!-- License & help (large amount of text) -->
|
||||||
|
</resources>
|
24
app/src/main/res/values-bg/strings.xml
Normal file
24
app/src/main/res/values-bg/strings.xml
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<!-- Application -->
|
||||||
|
<!-- Common Words -->
|
||||||
|
<!-- Notifications dropdown menu -->
|
||||||
|
<!-- Pod Activity -->
|
||||||
|
<!-- Drawer, Menu, Toolbar, ContextMenu -->
|
||||||
|
<!-- More from MainActivity -->
|
||||||
|
<!-- Permissions -->
|
||||||
|
<!-- Operability -->
|
||||||
|
<!-- Category Titles -->
|
||||||
|
<!-- Visuals -->
|
||||||
|
<!-- Navigiation Slider -->
|
||||||
|
<!-- Themes -->
|
||||||
|
<!-- Notifications dropdown -->
|
||||||
|
<!-- Font size -->
|
||||||
|
<!-- Load images -->
|
||||||
|
<!-- Screen rotation -->
|
||||||
|
<!-- Proxy -->
|
||||||
|
<!-- Chrome custom tabs -->
|
||||||
|
<!-- Diaspora Settings -->
|
||||||
|
<!-- More -->
|
||||||
|
<!-- License & help (large amount of text) -->
|
||||||
|
</resources>
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<!-- Common Words -->
|
<!-- Common Words -->
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">Otvori navigacijsku ladicu</string>
|
<string name="open_navdrawer">Otvori navigacijsku ladicu</string>
|
||||||
|
@ -39,6 +38,4 @@
|
||||||
<string name="about">O programu</string>
|
<string name="about">O programu</string>
|
||||||
<!-- License & help (large amount of text) -->
|
<!-- License & help (large amount of text) -->
|
||||||
<string name="contributors">Saradnici</string>
|
<string name="contributors">Saradnici</string>
|
||||||
<string name="donate">Doniraj</string>
|
|
||||||
<string name="do_you_like_this_project_want_donate_to_keep_alive">Sviđa li Vam se ovaj projekat? Želite li da napreduje a problemi budu otklonjeni?\n\nRazvijanje aplikacija i pisanje članaka o njima uzima puno vremena! Ako biste voljeli pomoći da projekat opstane, molimo Vas da razmislite o skromnoj donaciji!\n\nRad na ovom projektu odvija se u slobodno vrijeme, a program je besplatan i ne sadrži nikakav vid reklama!</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">Obre el calaix de navegació</string>
|
<string name="open_navdrawer">Obre el calaix de navegació</string>
|
||||||
|
@ -207,6 +206,4 @@ diaspora*. Si voleu contribuir, endavant! Actualment som un equip molt petit, de
|
||||||
<string name="change_the_theme_of_your_account">Canvia el tema del vostre compte</string>
|
<string name="change_the_theme_of_your_account">Canvia el tema del vostre compte</string>
|
||||||
<string name="pull_to_refresh">Feu lliscar per actualitzar</string>
|
<string name="pull_to_refresh">Feu lliscar per actualitzar</string>
|
||||||
<string name="pulling_down_on_top_of_page_to_refresh">S\'està lliscant cap avall a la part superior de la pàgina per actualitzar.\nCal que reinicieu l\'aplicació perquè els canvis tinguin efecte.</string>
|
<string name="pulling_down_on_top_of_page_to_refresh">S\'està lliscant cap avall a la part superior de la pàgina per actualitzar.\nCal que reinicieu l\'aplicació perquè els canvis tinguin efecte.</string>
|
||||||
<string name="donate">Fes un donatiu</string>
|
|
||||||
<string name="do_you_like_this_project_want_donate_to_keep_alive">Us agrada aquest projecte? Voleu que encara sigui millor i es solucionin els problemes?\n\nDesenvolupar aplicacions i escriure publicacions relacionades als blogs costa molt de temps! Si voleu ajudar perquè el projecte pugui continuar, considereu aportar una petita donació!\n\nAquest projecte es desenvolupa durant el temps lliure, completament gratis i sense publicitat!</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
24
app/src/main/res/values-ckb/strings.xml
Normal file
24
app/src/main/res/values-ckb/strings.xml
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<!-- Application -->
|
||||||
|
<!-- Common Words -->
|
||||||
|
<!-- Notifications dropdown menu -->
|
||||||
|
<!-- Pod Activity -->
|
||||||
|
<!-- Drawer, Menu, Toolbar, ContextMenu -->
|
||||||
|
<!-- More from MainActivity -->
|
||||||
|
<!-- Permissions -->
|
||||||
|
<!-- Operability -->
|
||||||
|
<!-- Category Titles -->
|
||||||
|
<!-- Visuals -->
|
||||||
|
<!-- Navigiation Slider -->
|
||||||
|
<!-- Themes -->
|
||||||
|
<!-- Notifications dropdown -->
|
||||||
|
<!-- Font size -->
|
||||||
|
<!-- Load images -->
|
||||||
|
<!-- Screen rotation -->
|
||||||
|
<!-- Proxy -->
|
||||||
|
<!-- Chrome custom tabs -->
|
||||||
|
<!-- Diaspora Settings -->
|
||||||
|
<!-- More -->
|
||||||
|
<!-- License & help (large amount of text) -->
|
||||||
|
</resources>
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">Otevøít navigaèní panel</string>
|
<string name="open_navdrawer">Otevøít navigaèní panel</string>
|
||||||
|
@ -201,5 +200,4 @@
|
||||||
<string name="youtube_links">Youtube odkazy</string>
|
<string name="youtube_links">Youtube odkazy</string>
|
||||||
<string name="change_the_theme_of_your_account">Změňte téma vašeho účtu</string>
|
<string name="change_the_theme_of_your_account">Změňte téma vašeho účtu</string>
|
||||||
<string name="pull_to_refresh">Pull osvěžit</string>
|
<string name="pull_to_refresh">Pull osvěžit</string>
|
||||||
<string name="donate">Krátce</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="reload">Genindlæs</string>
|
<string name="reload">Genindlæs</string>
|
||||||
|
@ -91,5 +90,4 @@
|
||||||
<!-- License & help (large amount of text) -->
|
<!-- License & help (large amount of text) -->
|
||||||
<string name="maintainers">Udviklere</string>
|
<string name="maintainers">Udviklere</string>
|
||||||
<string name="contributors">Bidragsydere</string>
|
<string name="contributors">Bidragsydere</string>
|
||||||
<string name="donate">Donér</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">NavDrawer öffnen</string>
|
<string name="open_navdrawer">NavDrawer öffnen</string>
|
||||||
|
@ -210,6 +209,4 @@ nachträglich erteilen. Öffne dafür: Systemeinstellungen - Apps - dandelion*.
|
||||||
<string name="change_the_theme_of_your_account">Thema des Accounts ändern</string>
|
<string name="change_the_theme_of_your_account">Thema des Accounts ändern</string>
|
||||||
<string name="pull_to_refresh">Pull-To-Refresh</string>
|
<string name="pull_to_refresh">Pull-To-Refresh</string>
|
||||||
<string name="pulling_down_on_top_of_page_to_refresh">In der Website von ganz oben nach unten ziehen um zu aktualisieren.\nDu musst die App neu starten damit die Änderungen wirksam werden.</string>
|
<string name="pulling_down_on_top_of_page_to_refresh">In der Website von ganz oben nach unten ziehen um zu aktualisieren.\nDu musst die App neu starten damit die Änderungen wirksam werden.</string>
|
||||||
<string name="donate">Spenden</string>
|
|
||||||
<string name="do_you_like_this_project_want_donate_to_keep_alive">Gefällt dir dieses Projekt? Möchtest du, dass es verbessert wird und Probleme behoben werden?\n\nDie Entwicklung von Apps und das schreiben von relevanten Blog-Einträgen kostet viel Zeit! Wenn du helfen möchtest, so dass das Projekt weitergehen kann, ziehe bitte eine kleine Spende in Betracht!\n\nDieses Projekt wird in der Freizeit, völlig kostenlos und ohne jegliche Werbeeinblendungen entwickelt & angeboten!</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<!-- Common Words -->
|
<!-- Common Words -->
|
||||||
|
|
24
app/src/main/res/values-eo/strings.xml
Normal file
24
app/src/main/res/values-eo/strings.xml
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<!-- Application -->
|
||||||
|
<!-- Common Words -->
|
||||||
|
<!-- Notifications dropdown menu -->
|
||||||
|
<!-- Pod Activity -->
|
||||||
|
<!-- Drawer, Menu, Toolbar, ContextMenu -->
|
||||||
|
<!-- More from MainActivity -->
|
||||||
|
<!-- Permissions -->
|
||||||
|
<!-- Operability -->
|
||||||
|
<!-- Category Titles -->
|
||||||
|
<!-- Visuals -->
|
||||||
|
<!-- Navigiation Slider -->
|
||||||
|
<!-- Themes -->
|
||||||
|
<!-- Notifications dropdown -->
|
||||||
|
<!-- Font size -->
|
||||||
|
<!-- Load images -->
|
||||||
|
<!-- Screen rotation -->
|
||||||
|
<!-- Proxy -->
|
||||||
|
<!-- Chrome custom tabs -->
|
||||||
|
<!-- Diaspora Settings -->
|
||||||
|
<!-- More -->
|
||||||
|
<!-- License & help (large amount of text) -->
|
||||||
|
</resources>
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">Abrir el panel de navegación</string>
|
<string name="open_navdrawer">Abrir el panel de navegación</string>
|
||||||
|
@ -205,6 +204,4 @@
|
||||||
<string name="change_the_theme_of_your_account">Cambiar el tema de tu cuenta</string>
|
<string name="change_the_theme_of_your_account">Cambiar el tema de tu cuenta</string>
|
||||||
<string name="pull_to_refresh">Tirar para refrescar</string>
|
<string name="pull_to_refresh">Tirar para refrescar</string>
|
||||||
<string name="pulling_down_on_top_of_page_to_refresh">Deslizar hacia abajo la parte superior de la página para refrescar.\n Necesita reiniciar la aplicación para que los cambios surtan efecto.</string>
|
<string name="pulling_down_on_top_of_page_to_refresh">Deslizar hacia abajo la parte superior de la página para refrescar.\n Necesita reiniciar la aplicación para que los cambios surtan efecto.</string>
|
||||||
<string name="donate">Donar</string>
|
|
||||||
<string name="do_you_like_this_project_want_donate_to_keep_alive">¿Te gusta este proyecto? ¿Quieres que se mejore y se corrijan problemas?\n\nEl desarrollo de aplicaciones y la escritura de entradas relacionadas del blog cuesta mucho tiempo. Si quieres ayudar a que el proyecto pueda continuar, por favor considera una pequeña donación!\n\nEste proyecto se desarrolla en tiempo de ocio, completamente gratis y sin publicidad!</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
24
app/src/main/res/values-et/strings.xml
Normal file
24
app/src/main/res/values-et/strings.xml
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<!-- Application -->
|
||||||
|
<!-- Common Words -->
|
||||||
|
<!-- Notifications dropdown menu -->
|
||||||
|
<!-- Pod Activity -->
|
||||||
|
<!-- Drawer, Menu, Toolbar, ContextMenu -->
|
||||||
|
<!-- More from MainActivity -->
|
||||||
|
<!-- Permissions -->
|
||||||
|
<!-- Operability -->
|
||||||
|
<!-- Category Titles -->
|
||||||
|
<!-- Visuals -->
|
||||||
|
<!-- Navigiation Slider -->
|
||||||
|
<!-- Themes -->
|
||||||
|
<!-- Notifications dropdown -->
|
||||||
|
<!-- Font size -->
|
||||||
|
<!-- Load images -->
|
||||||
|
<!-- Screen rotation -->
|
||||||
|
<!-- Proxy -->
|
||||||
|
<!-- Chrome custom tabs -->
|
||||||
|
<!-- Diaspora Settings -->
|
||||||
|
<!-- More -->
|
||||||
|
<!-- License & help (large amount of text) -->
|
||||||
|
</resources>
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<!-- Common Words -->
|
<!-- Common Words -->
|
||||||
|
@ -33,5 +32,4 @@
|
||||||
<string name="about">درباره مارکور</string>
|
<string name="about">درباره مارکور</string>
|
||||||
<!-- License & help (large amount of text) -->
|
<!-- License & help (large amount of text) -->
|
||||||
<string name="contributors">همکاران</string>
|
<string name="contributors">همکاران</string>
|
||||||
<string name="donate">کمک مالی</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<!-- Common Words -->
|
<!-- Common Words -->
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<!-- Common Words -->
|
<!-- Common Words -->
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">Ouvrir le tiroir de navigation</string>
|
<string name="open_navdrawer">Ouvrir le tiroir de navigation</string>
|
||||||
|
@ -205,6 +204,4 @@
|
||||||
<string name="change_the_theme_of_your_account">Changer le thème de votre compte</string>
|
<string name="change_the_theme_of_your_account">Changer le thème de votre compte</string>
|
||||||
<string name="pull_to_refresh">Tirer vers le bas pour mettre à jour</string>
|
<string name="pull_to_refresh">Tirer vers le bas pour mettre à jour</string>
|
||||||
<string name="pulling_down_on_top_of_page_to_refresh">Tirez depuis le haut de la page vers le bas pour l\'actualiser.\nVous devez redémarrer l\'application pour que ces changements prennent effet.</string>
|
<string name="pulling_down_on_top_of_page_to_refresh">Tirez depuis le haut de la page vers le bas pour l\'actualiser.\nVous devez redémarrer l\'application pour que ces changements prennent effet.</string>
|
||||||
<string name="donate">Donner</string>
|
|
||||||
<string name="do_you_like_this_project_want_donate_to_keep_alive">Vous aimez ce projet ? Vous voulez participer à son amélioration et corriger ses problèmes ?\n\nDévelopper des applications et écrire les posts de blog correspondants demande beaucoup de temps ! Si vous voulez aider à la poursuite du projet, merci de considérer une petite donation.\n\nCe projet est développé sur du temps libre, complètement gratuitement et sans publicité !</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">Abrir cadro de navegación</string>
|
<string name="open_navdrawer">Abrir cadro de navegación</string>
|
||||||
|
@ -56,7 +55,7 @@
|
||||||
<string name="share_dotdotdot">Compartir…</string>
|
<string name="share_dotdotdot">Compartir…</string>
|
||||||
<string name="by_tags">Etiquetas</string>
|
<string name="by_tags">Etiquetas</string>
|
||||||
<string name="by_people">Persoas</string>
|
<string name="by_people">Persoas</string>
|
||||||
<string name="please_add_a_name">Por favor, engada un nome</string>
|
<string name="please_add_a_name">Por favor, engade un nome</string>
|
||||||
<string name="share_link_address">Compartir ligazón</string>
|
<string name="share_link_address">Compartir ligazón</string>
|
||||||
<string name="save_image">Gardar imaxe</string>
|
<string name="save_image">Gardar imaxe</string>
|
||||||
<string name="share_image">Compartir imaxe</string>
|
<string name="share_image">Compartir imaxe</string>
|
||||||
|
@ -66,19 +65,19 @@
|
||||||
<!-- More from MainActivity -->
|
<!-- More from MainActivity -->
|
||||||
<string name="unable_to_load_image">Non se cargou a imaxe</string>
|
<string name="unable_to_load_image">Non se cargou a imaxe</string>
|
||||||
<!-- Permissions -->
|
<!-- Permissions -->
|
||||||
<string name="screenshot_permission__appspecific">Debe permitir \"Permiso de acceso a almacenamento\" para gardar capturas. Pode
|
<string name="screenshot_permission__appspecific">Debes permitir \"Permiso de acceso a almacenamento\" para gardar capturas. Podes
|
||||||
pechar a aplicación ou reiniciar o dispositivo. Se non permite acceder ao almacenamento pero que utilizar máis tarde a captura de pantalla, poderá permitir posteriormente o acceso na sección de permisos do dispositivo onde pode activar o \"permiso de acceso a almacenamento\" para dandelion*.</string>
|
pechar a aplicación ou reiniciar o dispositivo. Se non permites acceder ao almacenamento pero queres utilizar máis tarde a captura de pantalla, poderás permitir posteriormente o acceso na sección de permisos do dispositivo onde podes activar o \"permiso de acceso a almacenamento\" para dandelion*.</string>
|
||||||
<string name="image_permission_description__appspecific">Ten que permitir \"Permiso de acceso a almacenamento\" para gardar/subir imaxes. Despois de iso debería
|
<string name="image_permission_description__appspecific">Tes que permitir \"Permiso de acceso a almacenamento\" para gardar/subir imaxes. Despois de iso deberías
|
||||||
pechar a aplicación ou reiniciar o dispositivo. Se non permite acceder ao almacenamento, para poder gardar imaxes posteriormente, deberá abrir: preferencias do sistema - apps - dandelion* no dispositivo.
|
pechar a aplicación ou reiniciar o dispositivo. Se non permites acceder ao almacenamento, para poder gardar imaxes posteriormente, deberás abrir: preferencias do sistema - apps - dandelion* no dispositivo.
|
||||||
Na sección de permisos pode activar o \"permiso de escritura no almacenamento\".</string>
|
Na sección de permisos podes activar o \"permiso de escritura no almacenamento\".</string>
|
||||||
<string name="permission_denied">Permiso denegado.</string>
|
<string name="permission_denied">Permiso denegado.</string>
|
||||||
<string name="permission_granted_try_again">Permiso concedido. Inténteo de novo.</string>
|
<string name="permission_granted_try_again">Permiso concedido. Inténtao de novo.</string>
|
||||||
<string name="custom_pod">Nodo personalizado</string>
|
<string name="custom_pod">Nodo personalizado</string>
|
||||||
<string name="pod_name">Nome do nodo</string>
|
<string name="pod_name">Nome do nodo</string>
|
||||||
<string name="protocol">Protocolo</string>
|
<string name="protocol">Protocolo</string>
|
||||||
<string name="pod_address">Enderezo do nodo</string>
|
<string name="pod_address">Enderezo do nodo</string>
|
||||||
<string name="missing_value">Faltan datos</string>
|
<string name="missing_value">Faltan datos</string>
|
||||||
<string name="jump_to_last_visited_page_in_stream__appspecific">Ir a última paxina lida na conversa?</string>
|
<string name="jump_to_last_visited_page_in_stream__appspecific">Ir a última páxina lida na conversa?</string>
|
||||||
<string name="hide_statusbar_in_mainview">Agochar a barra de estado na vista principal</string>
|
<string name="hide_statusbar_in_mainview">Agochar a barra de estado na vista principal</string>
|
||||||
<string name="hide_statusbar">Agochar barra de estado</string>
|
<string name="hide_statusbar">Agochar barra de estado</string>
|
||||||
<string name="show_title_in_main_view">Mostrar título na vista principal</string>
|
<string name="show_title_in_main_view">Mostrar título na vista principal</string>
|
||||||
|
@ -86,7 +85,7 @@
|
||||||
<string name="launcher_shortcut">Atallo do lanzador</string>
|
<string name="launcher_shortcut">Atallo do lanzador</string>
|
||||||
<!-- Operability -->
|
<!-- Operability -->
|
||||||
<string name="top_toolbar_loads_stream__appsp">A barra superior carga a conversa</string>
|
<string name="top_toolbar_loads_stream__appsp">A barra superior carga a conversa</string>
|
||||||
<string name="click_empty_space_top_toolbar_load_stream__appspecific">Pulse nun espazo baldeiro na barra superior para abrir a conversa</string>
|
<string name="click_empty_space_top_toolbar_load_stream__appspecific">Preme nun espazo baleiro na barra superior para abrir a conversa</string>
|
||||||
<!-- Category Titles -->
|
<!-- Category Titles -->
|
||||||
<string name="appearance">Aparencia</string>
|
<string name="appearance">Aparencia</string>
|
||||||
<string name="network">Rede</string>
|
<string name="network">Rede</string>
|
||||||
|
@ -95,13 +94,13 @@
|
||||||
<!-- Visuals -->
|
<!-- Visuals -->
|
||||||
<!-- Navigiation Slider -->
|
<!-- Navigiation Slider -->
|
||||||
<string name="navigation_drawer">Cadro de navegación</string>
|
<string name="navigation_drawer">Cadro de navegación</string>
|
||||||
<string name="control_visibility_of_entries_nav_drawer">Controle a visibiidade das entradas no cadro de navegación</string>
|
<string name="control_visibility_of_entries_nav_drawer">Controla a visibiidade das entradas no cadro de navegación</string>
|
||||||
<string name="user">Usuaria</string>
|
<string name="user">Usuaria</string>
|
||||||
<string name="general">Xeral</string>
|
<string name="general">Xeral</string>
|
||||||
<string name="admin">Admin</string>
|
<string name="admin">Admin</string>
|
||||||
<!-- Themes -->
|
<!-- Themes -->
|
||||||
<string name="theme_and_colors">Decorado e cores</string>
|
<string name="theme_and_colors">Decorado e cores</string>
|
||||||
<string name="control_which_colors_are_used_in_app">Estableza qué cores se utilizan na aplicación</string>
|
<string name="control_which_colors_are_used_in_app">Escolle qué cores se utilizan na aplicación</string>
|
||||||
<string name="primary_colors">Cor primaria</string>
|
<string name="primary_colors">Cor primaria</string>
|
||||||
<string name="colors_of_toolbars">Cor das barras de ferramentas</string>
|
<string name="colors_of_toolbars">Cor das barras de ferramentas</string>
|
||||||
<string name="accent_color">Cor de énfase</string>
|
<string name="accent_color">Cor de énfase</string>
|
||||||
|
@ -111,7 +110,7 @@
|
||||||
<!-- Notifications dropdown -->
|
<!-- Notifications dropdown -->
|
||||||
<string name="extended_notifications">Notificacións extendidas</string>
|
<string name="extended_notifications">Notificacións extendidas</string>
|
||||||
<string name="extendend_notifications_bell_description__appspecific">Extender a icona da campá de notificación con un menú desplegable que mostre a categoría das notificacións</string>
|
<string name="extendend_notifications_bell_description__appspecific">Extender a icona da campá de notificación con un menú desplegable que mostre a categoría das notificacións</string>
|
||||||
<string name="language_change_restart_description">Cambiar o idioma de esta aplicación. Reinicie para que se aplique o troco</string>
|
<string name="language_change_restart_description">Cambiar o idioma de esta aplicación. Reinicia para que se aplique o troco</string>
|
||||||
<string name="language">Idioma</string>
|
<string name="language">Idioma</string>
|
||||||
<string name="system_language">Idioma do sistema</string>
|
<string name="system_language">Idioma do sistema</string>
|
||||||
<!-- Font size -->
|
<!-- Font size -->
|
||||||
|
@ -135,7 +134,7 @@
|
||||||
<string name="load_proxy_settins_for_tor">Cargar axustes proxy para Tor (Orbot) HTTP Proxy</string>
|
<string name="load_proxy_settins_for_tor">Cargar axustes proxy para Tor (Orbot) HTTP Proxy</string>
|
||||||
<string name="proxy">Proxy</string>
|
<string name="proxy">Proxy</string>
|
||||||
<string name="enable_proxy">Habilitar Proxy</string>
|
<string name="enable_proxy">Habilitar Proxy</string>
|
||||||
<string name="proxy_dandelion_traffic__appspecific">Proxy para o tráfico de dandelion* para saltar cortalumes.\nPodería precisar reinicio. Esto podería non funcionar en algúns móbiles.</string>
|
<string name="proxy_dandelion_traffic__appspecific">Proxy para o tráfico de dandelion* para saltar cortalumes.\nPodería precisar reinicio. Esto podería non funcionar nalgúns móbiles.</string>
|
||||||
<string name="host">Servidor</string>
|
<string name="host">Servidor</string>
|
||||||
<string name="port">Porto</string>
|
<string name="port">Porto</string>
|
||||||
<string name="app_needs_restart_to_disable_proxy_usage">Precisa reiniciar a app para desactivar o uso do proxy</string>
|
<string name="app_needs_restart_to_disable_proxy_usage">Precisa reiniciar a app para desactivar o uso do proxy</string>
|
||||||
|
@ -145,12 +144,12 @@
|
||||||
<!-- Diaspora Settings -->
|
<!-- Diaspora Settings -->
|
||||||
<string name="personal_settings">Axustes personais</string>
|
<string name="personal_settings">Axustes personais</string>
|
||||||
<string name="open_diaspora_account_settings__appspecific">Abrir os axustes da conta diaspora*</string>
|
<string name="open_diaspora_account_settings__appspecific">Abrir os axustes da conta diaspora*</string>
|
||||||
<string name="manage_your_contact_list">Xestione a súa lista de contactos</string>
|
<string name="manage_your_contact_list">Xestiona a lista de contactos</string>
|
||||||
<string name="manage_hashtags">Xestionar etiquetas</string>
|
<string name="manage_hashtags">Xestionar etiquetas</string>
|
||||||
<string name="unfollow_already_followed_hashtags__appspecific">Deixar de seguir etiquetas que segue</string>
|
<string name="unfollow_already_followed_hashtags__appspecific">Deixar de seguir etiquetas que segues</string>
|
||||||
<string name="change_account">Mudar de conta</string>
|
<string name="change_account">Mudar de conta</string>
|
||||||
<string name="loug_warning_description__appspecific">Eliminar os datos locais da sesión e cambiar a outro nodo/conta de diaspora*</string>
|
<string name="loug_warning_description__appspecific">Eliminar os datos locais da sesión e cambiar a outro nodo/conta de diaspora*</string>
|
||||||
<string name="logout_warning_description">Esto eliminará todas as cookies e datos de sesión. Seguro que quere mudar de conta?</string>
|
<string name="logout_warning_description">Esto eliminará todas as cookies e datos de sesión. Seguro que queres mudar de conta?</string>
|
||||||
<string name="clear_cache">Limpar cache</string>
|
<string name="clear_cache">Limpar cache</string>
|
||||||
<string name="clear_webview_cache">Limpar a cache da VistaWeb</string>
|
<string name="clear_webview_cache">Limpar a cache da VistaWeb</string>
|
||||||
<string name="intellihide_toolbars__appspecific">Agochar automáticamente as barras superior e inferior mentras desplaza</string>
|
<string name="intellihide_toolbars__appspecific">Agochar automáticamente as barras superior e inferior mentras desplaza</string>
|
||||||
|
@ -160,8 +159,8 @@
|
||||||
<!-- More -->
|
<!-- More -->
|
||||||
<string name="miscellaneous">Varios</string>
|
<string name="miscellaneous">Varios</string>
|
||||||
<string name="full_reset">Restablecer completamente</string>
|
<string name="full_reset">Restablecer completamente</string>
|
||||||
<string name="wipe_settings_and_logout">Eliminar todas os axustes locais do app e desconectar todas as contas</string>
|
<string name="wipe_settings_and_logout">Eliminar todolos axustes locais da app e desconectar todas as contas</string>
|
||||||
<string name="wipe_settings_warning__appspecific">Esto restablecerá todos os axustes da aplicación ao valor por omisión e desconectarao de todos os nodos. As súas imaxes descargadas permanecerán. Seguro que quere proceder?</string>
|
<string name="wipe_settings_warning__appspecific">Esto restablecerá todos os axustes da aplicación ao valor por omisión e desconectarate de todolos nodos. As imaxes descargadas permanecerán. Seguro que queres proceder?</string>
|
||||||
<string name="enable_basic_adblocker_description">Activar un AdBlocker básico. Poderían verse anuncios por exemplo en vistas incrustadas</string>
|
<string name="enable_basic_adblocker_description">Activar un AdBlocker básico. Poderían verse anuncios por exemplo en vistas incrustadas</string>
|
||||||
<string name="block_advertisments">Bloquear publicidade</string>
|
<string name="block_advertisments">Bloquear publicidade</string>
|
||||||
<string name="about">Sobre</string>
|
<string name="about">Sobre</string>
|
||||||
|
@ -179,19 +178,19 @@
|
||||||
<string name="pod_profile_name_witharg__appspecific">Nome do perfil do nodo: %1$s</string>
|
<string name="pod_profile_name_witharg__appspecific">Nome do perfil do nodo: %1$s</string>
|
||||||
<string name="pod_domain_witharg__appspecific">Dominio do nodo: %1$s</string>
|
<string name="pod_domain_witharg__appspecific">Dominio do nodo: %1$s</string>
|
||||||
<string name="debug_log_copied_to_clipboard">Ficheiro de depuración copiado ao portapapeis</string>
|
<string name="debug_log_copied_to_clipboard">Ficheiro de depuración copiado ao portapapeis</string>
|
||||||
<string name="dandelion_is_your_companion__appspecific">dandelion* é a súa aplicación para a rede social diaspora*. Engade características como barras de ferramentas e soporte para servidores proxy como a rede Tor para a súa experiencia social.</string>
|
<string name="dandelion_is_your_companion__appspecific">dandelion* é a túa aplicación para a rede social diaspora*. Engade características como barras de ferramentas e soporte para servidores proxy como a rede Tor.</string>
|
||||||
<string name="contribute_code">Contribúa ao código!</string>
|
<string name="contribute_code">Contribúa ao código!</string>
|
||||||
<string name="dandelion_is_developed_as_foss__appspecific">dandelion* é desenvolto libre, libre de Liberdade, e segue o espíritu que marca o proxecto diaspora*. Se quere contribuír, adiante! Por agora somos un equipo pequeno, así que agradecemos calquer tipo de axuda!</string>
|
<string name="dandelion_is_developed_as_foss__appspecific">dandelion* é desenvolta libre, libre de Liberdade, e segue o espíritu que marca o proxecto diaspora*. Se queres contribuír, adiante! Por agora somos un equipo pequeno, así que agradecemos calquer tipo de axuda!</string>
|
||||||
<string name="get_the_source">Obteña as fontes</string>
|
<string name="get_the_source">Aquí as fontes</string>
|
||||||
<string name="translate_the_app">Traduza a app!</string>
|
<string name="translate_the_app">Traduce a app!</string>
|
||||||
<string name="app_not_available_in_your_lang_translate_with_stringlate">Non está a aplicación no seu idioma? Pode cambiar eso! Por qué non nos axuda traducíndoa? Utilizamos a plataforma Crowdin para que calquera poida traducir a app.</string>
|
<string name="app_not_available_in_your_lang_translate_with_stringlate">Non está a aplicación no teu idioma? Podes cambiar eso! Por qué non nos axudas traducíndoa? Utilizamos a plataforma Crowdin para que calquera poida traducir a app.</string>
|
||||||
<string name="let_me_translate">Deixame traducir</string>
|
<string name="let_me_translate">Deixame traducir</string>
|
||||||
<string name="give_feedback">Qué lle parece!</string>
|
<string name="give_feedback">Danos a túa opinión!</string>
|
||||||
<string name="dandelion_still_in_development__appspecific">dandelion* aínda está en desenvolvemento, asi que si ten suxerencias de calquer tipo o valoración, por favor utilice o noso xestor de erros para facérnolo saber!</string>
|
<string name="dandelion_still_in_development__appspecific">dandelion* aínda está en desenvolvemento, asi que se tes suxestións de calquer tipo ou valoración, por favor usa o noso xestor de errros para facérnolo saber!</string>
|
||||||
<string name="report_bugs">Reporte erros</string>
|
<string name="report_bugs">Reporte erros</string>
|
||||||
<string name="spread_the_word">Difunda!</string>
|
<string name="spread_the_word">Difunde!</string>
|
||||||
<string name="tell_your_friends_about_diaspora__appspecific">Dígalle aos seus amigos e familiares que utiliza diaspora* e #dandelion! Por qué no escribir sobre a experiencia? Encantaríanos saber de vostede!</string>
|
<string name="tell_your_friends_about_diaspora__appspecific">Dille aos teus amigos e familiares que utilizas diaspora* e #dandelion! Por qué non escribir sobre a experiencia? Encantaríanos saber de ti!</string>
|
||||||
<string name="share_the_app">Comparta a aplicación</string>
|
<string name="share_the_app">Comparte a aplicación</string>
|
||||||
<string name="hey_checkout_dandelion_tag__appspecific">Ei!! Olla #dandelion! %1$s</string>
|
<string name="hey_checkout_dandelion_tag__appspecific">Ei!! Olla #dandelion! %1$s</string>
|
||||||
<!-- License & help (large amount of text) -->
|
<!-- License & help (large amount of text) -->
|
||||||
<string name="maintainers">Mantedores</string>
|
<string name="maintainers">Mantedores</string>
|
||||||
|
@ -205,9 +204,7 @@
|
||||||
<string name="tell_me_more">Cóntame máis</string>
|
<string name="tell_me_more">Cóntame máis</string>
|
||||||
<string name="enable_to_open_youtube_links_on_external_app">Activar para abrir vídeos YouTube nunha app externa</string>
|
<string name="enable_to_open_youtube_links_on_external_app">Activar para abrir vídeos YouTube nunha app externa</string>
|
||||||
<string name="youtube_links">Ligazóns YouTube</string>
|
<string name="youtube_links">Ligazóns YouTube</string>
|
||||||
<string name="change_the_theme_of_your_account">Cambiar o decorado da súa conta</string>
|
<string name="change_the_theme_of_your_account">Cambiar o decorado da túa conta</string>
|
||||||
<string name="pull_to_refresh">Tire para actualizar</string>
|
<string name="pull_to_refresh">Tira para actualizar</string>
|
||||||
<string name="pulling_down_on_top_of_page_to_refresh">Tirar hacia abaixo na parte superior da páxina.\nDebe reiniciar a app para que os cambios se apliquen.</string>
|
<string name="pulling_down_on_top_of_page_to_refresh">Tirar hacia abaixo na parte superior da páxina.\nDebes reiniciar a app para que os cambios se apliquen.</string>
|
||||||
<string name="donate">Doar</string>
|
|
||||||
<string name="do_you_like_this_project_want_donate_to_keep_alive">Gústache este proxecto? Queres que siga mellorando e resolvendo os problemas?\n\nDesenvolver aplicacións e escribir a documentación leva moito tempo! Se queres apoiar ao proxecto para que continúe, por favor, considera facer unha pequena doazón!\n\nEste proxecto desenvólvese no tempo libre, ofrécese libre e gratuitamente e sen publicidade!</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">नेविगेशन ड्रॉवर खोलें</string>
|
<string name="open_navdrawer">नेविगेशन ड्रॉवर खोलें</string>
|
||||||
|
@ -39,5 +38,4 @@
|
||||||
<string name="license">लाइसेंस</string>
|
<string name="license">लाइसेंस</string>
|
||||||
<!-- License & help (large amount of text) -->
|
<!-- License & help (large amount of text) -->
|
||||||
<string name="contributors">योगदान कर्ता</string>
|
<string name="contributors">योगदान कर्ता</string>
|
||||||
<string name="donate">दान करें</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
24
app/src/main/res/values-hr/strings.xml
Normal file
24
app/src/main/res/values-hr/strings.xml
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<!-- Application -->
|
||||||
|
<!-- Common Words -->
|
||||||
|
<!-- Notifications dropdown menu -->
|
||||||
|
<!-- Pod Activity -->
|
||||||
|
<!-- Drawer, Menu, Toolbar, ContextMenu -->
|
||||||
|
<!-- More from MainActivity -->
|
||||||
|
<!-- Permissions -->
|
||||||
|
<!-- Operability -->
|
||||||
|
<!-- Category Titles -->
|
||||||
|
<!-- Visuals -->
|
||||||
|
<!-- Navigiation Slider -->
|
||||||
|
<!-- Themes -->
|
||||||
|
<!-- Notifications dropdown -->
|
||||||
|
<!-- Font size -->
|
||||||
|
<!-- Load images -->
|
||||||
|
<!-- Screen rotation -->
|
||||||
|
<!-- Proxy -->
|
||||||
|
<!-- Chrome custom tabs -->
|
||||||
|
<!-- Diaspora Settings -->
|
||||||
|
<!-- More -->
|
||||||
|
<!-- License & help (large amount of text) -->
|
||||||
|
</resources>
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="reload">Újratölt</string>
|
<string name="reload">Újratölt</string>
|
||||||
|
@ -191,5 +190,4 @@
|
||||||
<string name="the_following_libraries_are_used">A következő könyvtárak vannak használatban:</string>
|
<string name="the_following_libraries_are_used">A következő könyvtárak vannak használatban:</string>
|
||||||
<string name="inspiration_from_leafpic__appspecific">A LeafPicből merítettünk némi inspirációt és programkódot. Próbáld ki, ez is szabad szoftver!</string>
|
<string name="inspiration_from_leafpic__appspecific">A LeafPicből merítettünk némi inspirációt és programkódot. Próbáld ki, ez is szabad szoftver!</string>
|
||||||
<string name="tell_me_more">Tudj meg többet</string>
|
<string name="tell_me_more">Tudj meg többet</string>
|
||||||
<string name="donate">Adományozás</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<!-- Common Words -->
|
<!-- Common Words -->
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">Apri barra di navigazione</string>
|
<string name="open_navdrawer">Apri barra di navigazione</string>
|
||||||
|
@ -211,6 +210,4 @@
|
||||||
<string name="change_the_theme_of_your_account">Cambia il tema del tuo account</string>
|
<string name="change_the_theme_of_your_account">Cambia il tema del tuo account</string>
|
||||||
<string name="pull_to_refresh">Trascina per aggiornare</string>
|
<string name="pull_to_refresh">Trascina per aggiornare</string>
|
||||||
<string name="pulling_down_on_top_of_page_to_refresh">Trascina dall\'alto al basso per aggiornare la pagina.\nDevi riavviare l\'app affinchè le modifiche abbiano effetto.</string>
|
<string name="pulling_down_on_top_of_page_to_refresh">Trascina dall\'alto al basso per aggiornare la pagina.\nDevi riavviare l\'app affinchè le modifiche abbiano effetto.</string>
|
||||||
<string name="donate">Dona</string>
|
|
||||||
<string name="do_you_like_this_project_want_donate_to_keep_alive">Ti piace questo progetto? Vuoi vederlo ancora migliore e con i problemi risolti?\n\nSviluppare applicazioni e documentarle sul blog costa un sacco di tempo! Se vuoi aiutare lo sviluppo del progetto, puoi fare una piccola donazione!\n\nQuesto progetto è sviluppato nel tempo libero, completamente gratis e senza alcuna pubblicità!</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<!-- Common Words -->
|
<!-- Common Words -->
|
||||||
|
@ -35,5 +34,4 @@
|
||||||
<string name="about">אודות</string>
|
<string name="about">אודות</string>
|
||||||
<!-- License & help (large amount of text) -->
|
<!-- License & help (large amount of text) -->
|
||||||
<string name="contributors">תורמים</string>
|
<string name="contributors">תורמים</string>
|
||||||
<string name="donate">תרום</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">ナビゲーションドロワーを開く</string>
|
<string name="open_navdrawer">ナビゲーションドロワーを開く</string>
|
||||||
|
@ -205,6 +204,4 @@
|
||||||
<string name="change_the_theme_of_your_account">アカウントのテーマを変更</string>
|
<string name="change_the_theme_of_your_account">アカウントのテーマを変更</string>
|
||||||
<string name="pull_to_refresh">引き下げて更新</string>
|
<string name="pull_to_refresh">引き下げて更新</string>
|
||||||
<string name="pulling_down_on_top_of_page_to_refresh">ページの上から下に引き下げて更新します。\n変更を反映するため、アプリを再起動する必要があります。</string>
|
<string name="pulling_down_on_top_of_page_to_refresh">ページの上から下に引き下げて更新します。\n変更を反映するため、アプリを再起動する必要があります。</string>
|
||||||
<string name="donate">寄付</string>
|
|
||||||
<string name="do_you_like_this_project_want_donate_to_keep_alive">このプロジェクトを気に入っていただけましたか? 改善したい、あるいは問題を修正したいですか?\n\nアプリの開発や、関連するブログの記事を書くに多くの時間がかかります! プロジェクトを進めるために、支援をしていただける場合は、少しの寄付をご検討ください!\n\nこのプロジェクトは余暇に開発していて、完全に無料で、広告はありません!</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<!-- Common Words -->
|
<!-- Common Words -->
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">Ldi umuɣ n tunigin</string>
|
<string name="open_navdrawer">Ldi umuɣ n tunigin</string>
|
||||||
|
@ -201,5 +200,4 @@
|
||||||
<string name="the_following_libraries_are_used">Tinedlisin-agi ttwaseqdacent:</string>
|
<string name="the_following_libraries_are_used">Tinedlisin-agi ttwaseqdacent:</string>
|
||||||
<string name="inspiration_from_leafpic__appspecific">Newwi kra n tiktiwin akked tengat si LeafPic. Duu ad ten-twaliḍ. D aseɣẓan ilellil!</string>
|
<string name="inspiration_from_leafpic__appspecific">Newwi kra n tiktiwin akked tengat si LeafPic. Duu ad ten-twaliḍ. D aseɣẓan ilellil!</string>
|
||||||
<string name="tell_me_more">Ini-yid ugar</string>
|
<string name="tell_me_more">Ini-yid ugar</string>
|
||||||
<string name="donate">Mudd</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
24
app/src/main/res/values-kmr/strings.xml
Normal file
24
app/src/main/res/values-kmr/strings.xml
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<!-- Application -->
|
||||||
|
<!-- Common Words -->
|
||||||
|
<!-- Notifications dropdown menu -->
|
||||||
|
<!-- Pod Activity -->
|
||||||
|
<!-- Drawer, Menu, Toolbar, ContextMenu -->
|
||||||
|
<!-- More from MainActivity -->
|
||||||
|
<!-- Permissions -->
|
||||||
|
<!-- Operability -->
|
||||||
|
<!-- Category Titles -->
|
||||||
|
<!-- Visuals -->
|
||||||
|
<!-- Navigiation Slider -->
|
||||||
|
<!-- Themes -->
|
||||||
|
<!-- Notifications dropdown -->
|
||||||
|
<!-- Font size -->
|
||||||
|
<!-- Load images -->
|
||||||
|
<!-- Screen rotation -->
|
||||||
|
<!-- Proxy -->
|
||||||
|
<!-- Chrome custom tabs -->
|
||||||
|
<!-- Diaspora Settings -->
|
||||||
|
<!-- More -->
|
||||||
|
<!-- License & help (large amount of text) -->
|
||||||
|
</resources>
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">사이드 메뉴 열기</string>
|
<string name="open_navdrawer">사이드 메뉴 열기</string>
|
||||||
|
@ -194,5 +193,4 @@
|
||||||
<string name="inspiration_from_leafpic__appspecific">LeafPic에서 약간의 영감을 받았으며, 코드들도 일부 차용했습니다.
|
<string name="inspiration_from_leafpic__appspecific">LeafPic에서 약간의 영감을 받았으며, 코드들도 일부 차용했습니다.
|
||||||
한번 사용해보세요! 무료 소프트웨어 입니다!</string>
|
한번 사용해보세요! 무료 소프트웨어 입니다!</string>
|
||||||
<string name="tell_me_more">더 자세히 보기</string>
|
<string name="tell_me_more">더 자세히 보기</string>
|
||||||
<string name="donate">후원하기</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
24
app/src/main/res/values-mk/strings.xml
Normal file
24
app/src/main/res/values-mk/strings.xml
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<!-- Application -->
|
||||||
|
<!-- Common Words -->
|
||||||
|
<!-- Notifications dropdown menu -->
|
||||||
|
<!-- Pod Activity -->
|
||||||
|
<!-- Drawer, Menu, Toolbar, ContextMenu -->
|
||||||
|
<!-- More from MainActivity -->
|
||||||
|
<!-- Permissions -->
|
||||||
|
<!-- Operability -->
|
||||||
|
<!-- Category Titles -->
|
||||||
|
<!-- Visuals -->
|
||||||
|
<!-- Navigiation Slider -->
|
||||||
|
<!-- Themes -->
|
||||||
|
<!-- Notifications dropdown -->
|
||||||
|
<!-- Font size -->
|
||||||
|
<!-- Load images -->
|
||||||
|
<!-- Screen rotation -->
|
||||||
|
<!-- Proxy -->
|
||||||
|
<!-- Chrome custom tabs -->
|
||||||
|
<!-- Diaspora Settings -->
|
||||||
|
<!-- More -->
|
||||||
|
<!-- License & help (large amount of text) -->
|
||||||
|
</resources>
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="reload">വീണ്ടും ലോഡ് ചെയ്യുക</string>
|
<string name="reload">വീണ്ടും ലോഡ് ചെയ്യുക</string>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<!-- Common Words -->
|
<!-- Common Words -->
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">Åpne navigasjonsskuff</string>
|
<string name="open_navdrawer">Åpne navigasjonsskuff</string>
|
||||||
|
@ -38,5 +37,4 @@
|
||||||
<string name="about">Om</string>
|
<string name="about">Om</string>
|
||||||
<!-- License & help (large amount of text) -->
|
<!-- License & help (large amount of text) -->
|
||||||
<string name="contributors">Bidragsytere</string>
|
<string name="contributors">Bidragsytere</string>
|
||||||
<string name="donate">Doner</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">Open navigatiemenu</string>
|
<string name="open_navdrawer">Open navigatiemenu</string>
|
||||||
|
@ -205,5 +204,4 @@
|
||||||
<string name="change_the_theme_of_your_account">Wijzig het thema van uw account</string>
|
<string name="change_the_theme_of_your_account">Wijzig het thema van uw account</string>
|
||||||
<string name="pull_to_refresh">Trek om te vernieuwen</string>
|
<string name="pull_to_refresh">Trek om te vernieuwen</string>
|
||||||
<string name="pulling_down_on_top_of_page_to_refresh">Trek omlaag op de bovenkant van de pagina om te vernieuwen.\nU moet de app opnieuw opstarten om wijzigingen door te voeren.</string>
|
<string name="pulling_down_on_top_of_page_to_refresh">Trek omlaag op de bovenkant van de pagina om te vernieuwen.\nU moet de app opnieuw opstarten om wijzigingen door te voeren.</string>
|
||||||
<string name="donate">Doneer</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<!-- Common Words -->
|
<!-- Common Words -->
|
||||||
|
|
118
app/src/main/res/values-or/strings.xml
Normal file
118
app/src/main/res/values-or/strings.xml
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<!-- Application -->
|
||||||
|
<string name="open_navdrawer">ନେଭିଗେସନ୍ ଡ୍ରୟର୍ ଖୋଲନ୍ତୁ</string>
|
||||||
|
<string name="close_navdrawer">ନେଭିଗେସନ୍ ଡ୍ରୟର୍ ବନ୍ଦ କରନ୍ତୁ</string>
|
||||||
|
<string name="reload">ପୁନଃଲୋଡ୍ କରନ୍ତୁ</string>
|
||||||
|
<string name="close">ବନ୍ଦ କରନ୍ତୁ</string>
|
||||||
|
<string name="cancel">ବାତିଲ୍ କର</string>
|
||||||
|
<!-- Common Words -->
|
||||||
|
<string name="settings">ସେଟିଂସମୂହ</string>
|
||||||
|
<string name="notifications">ବିଜ୍ଞପ୍ତି</string>
|
||||||
|
<string name="conversations">ବାର୍ତ୍ତାଳାପ</string>
|
||||||
|
<string name="profile">ପ୍ରୋଫାଇଲ୍</string>
|
||||||
|
<string name="search">ସନ୍ଧାନ କରନ୍ତୁ</string>
|
||||||
|
<string name="changelog">ପରିବର୍ତ୍ତନ ଲଗ୍</string>
|
||||||
|
<string name="statistics">ପରିସଂଖ୍ୟାନ</string>
|
||||||
|
<!-- Notifications dropdown menu -->
|
||||||
|
<string name="all_notifications">ସବୁ ବିଜ୍ଞପ୍ତି</string>
|
||||||
|
<!-- Pod Activity -->
|
||||||
|
<string name="confirmation">ନିଶ୍ଚିତକରଣ</string>
|
||||||
|
<!-- Drawer, Menu, Toolbar, ContextMenu -->
|
||||||
|
<string name="more">ଅଧିକ</string>
|
||||||
|
<string name="help_license">ବିଷୟରେ | ସହାୟତା</string>
|
||||||
|
<string name="share_link_as_text">ପାଠ୍ୟ ଭାବରେ ଲିଙ୍କ୍ ଅଂଶୀଦାର କରନ୍ତୁ</string>
|
||||||
|
<string name="share_screenshot_of_webpage">ୱେବପୃଷ୍ଠାର ସ୍କ୍ରିନସଟ୍ ଅଂଶୀଦାର କରନ୍ତୁ</string>
|
||||||
|
<string name="take_screenshot_of_webpage">ୱେବପୃଷ୍ଠାର ସ୍କ୍ରିନସଟ୍ ନିଅନ୍ତୁ</string>
|
||||||
|
<string name="saving_image_to">ଏଥିରେ ପ୍ରତିଛବି ସଞ୍ଚୟ କରୁଛି</string>
|
||||||
|
<string name="link_adress_copied">ଲିଙ୍କ୍ ଠିକଣା କପି ହୋଇଛି …</string>
|
||||||
|
<string name="go_to_top">ଶୀର୍ଷକୁ ଯାଆନ୍ତୁ</string>
|
||||||
|
<string name="exit_app">ଆପ୍ ବାହାରକୁ ଯାଆନ୍ତୁ</string>
|
||||||
|
<string name="toggle_mobile_desktop_view">ମୋବାଇଲ୍/ଡେସ୍କଟପ୍ ଦର୍ଶନ ଟୋଗଲ୍ କରନ୍ତୁ</string>
|
||||||
|
<string name="share_dotdotdot">ଅଂଶୀଦାର…</string>
|
||||||
|
<string name="please_add_a_name">ଦୟାକରି ଏକ ନାମ ଯୋଡ଼ନ୍ତୁ</string>
|
||||||
|
<string name="share_link_address">ଲିଙ୍କ୍ ଠିକଣା ଅଂଶୀଦାର କରନ୍ତୁ</string>
|
||||||
|
<string name="save_image">ପ୍ରତିଛବି ସଞ୍ଚୟ କରନ୍ତୁ</string>
|
||||||
|
<string name="share_image">ପ୍ରତିଛବି ଅଂଶୀଦାର କରନ୍ତୁ</string>
|
||||||
|
<!-- More from MainActivity -->
|
||||||
|
<string name="unable_to_load_image">ପ୍ରତିଛବି ଲୋଡ୍ କରିବାରେ ଅସମର୍ଥ</string>
|
||||||
|
<!-- Permissions -->
|
||||||
|
<string name="protocol">ପ୍ରୋଟୋକଲ୍</string>
|
||||||
|
<string name="hide_statusbar_in_mainview">ମୁଖ୍ୟ ଦର୍ଶନରେ ସ୍ଥିତି ଦଣ୍ଡିକା ଲୁଚାନ୍ତୁ</string>
|
||||||
|
<string name="hide_statusbar">ସ୍ଥିତି ଦଣ୍ଡିକା ଲୁଚାଅ</string>
|
||||||
|
<string name="show_title_in_main_view">ମୁଖ୍ୟ ଦର୍ଶନରେ ଆଖ୍ୟା ଦେଖାନ୍ତୁ</string>
|
||||||
|
<string name="show_title">ଆଖ୍ୟା ଦେଖାନ୍ତୁ</string>
|
||||||
|
<string name="launcher_shortcut">ଉନ୍ମୋଚକ ସର୍ଟକଟ୍</string>
|
||||||
|
<!-- Operability -->
|
||||||
|
<!-- Category Titles -->
|
||||||
|
<string name="appearance">ରୂପ</string>
|
||||||
|
<string name="network">ନେଟୱର୍କ</string>
|
||||||
|
<!-- Visuals -->
|
||||||
|
<!-- Navigiation Slider -->
|
||||||
|
<string name="user">ଉପଭୋକ୍ତା</string>
|
||||||
|
<string name="general">ସାଧାରଣ</string>
|
||||||
|
<string name="admin">ବ୍ୟବସ୍ଥାପକ</string>
|
||||||
|
<!-- Themes -->
|
||||||
|
<string name="theme_and_colors">ଥିମ୍ ଏବଂ ରଙ୍ଗ</string>
|
||||||
|
<!-- Notifications dropdown -->
|
||||||
|
<string name="language_change_restart_description">ଏହି ଆପ୍ ର ଭାଷା ବଦଳାନ୍ତୁ। ପରିବର୍ତ୍ତନଗୁଡ଼ିକ କାର୍ଯ୍ୟକାରୀ ହେବା ପାଇଁ ଆପ୍ ପୁନଃଆରମ୍ଭ କରନ୍ତୁ</string>
|
||||||
|
<string name="language">ଭାଷା</string>
|
||||||
|
<string name="system_language">ସିଷ୍ଟମ୍ ଭାଷା</string>
|
||||||
|
<!-- Font size -->
|
||||||
|
<string name="font_size">ଫଣ୍ଟ ଆକାର</string>
|
||||||
|
<string name="normal">ସାଧାରଣ</string>
|
||||||
|
<string name="large">ବଡ଼</string>
|
||||||
|
<string name="huge">ବିରାଟ</string>
|
||||||
|
<!-- Load images -->
|
||||||
|
<string name="load_images">ପ୍ରତିଛବିଗୁଡ଼ିକୁ ଧାରଣ କରନ୍ତୁ</string>
|
||||||
|
<!-- Screen rotation -->
|
||||||
|
<string name="screen_rotation">ସ୍କ୍ରିନ୍ ଘୂର୍ଣ୍ଣନ</string>
|
||||||
|
<string name="default_">ଡିଫଲ୍ଟ</string>
|
||||||
|
<string name="portrait">ପୋର୍ଟ୍ରେଟ୍</string>
|
||||||
|
<string name="landscape">ଲ୍ୟାଣ୍ଡସ୍କେପ୍</string>
|
||||||
|
<!-- Proxy -->
|
||||||
|
<string name="proxy">ପ୍ରକ୍ସି</string>
|
||||||
|
<string name="enable_proxy">ପ୍ରକ୍ସି ସକ୍ଷମ କରନ୍ତୁ</string>
|
||||||
|
<!-- Chrome custom tabs -->
|
||||||
|
<!-- Diaspora Settings -->
|
||||||
|
<string name="change_account">ଆକାଉଣ୍ଟ୍ ବଦଳାନ୍ତୁ</string>
|
||||||
|
<string name="logout_warning_description">ଏହା ସମସ୍ତ କୁକୀ ଏବଂ ଅଧିବେଶନ ଡାଟା ଲିଭାଇଦେବ। ଆପଣ ପ୍ରକୃତରେ ଆପଣଙ୍କ ଆକାଉଣ୍ଟ୍ ପରିବର୍ତ୍ତନ କରିବାକୁ ଚାହାଁନ୍ତି କି?</string>
|
||||||
|
<!-- More -->
|
||||||
|
<string name="miscellaneous">ଵିଵିଧ</string>
|
||||||
|
<string name="full_reset">ପୂର୍ଣ୍ଣ ପୁନଃସେଟ୍</string>
|
||||||
|
<string name="enable_basic_adblocker_description">ମୌଳିକ AdBlocker ସକ୍ଷମ କରନ୍ତୁ। ବିଜ୍ଞାପନଗୁଡ଼ିକ ଗ୍ରଥିତ ଦର୍ଶନରେ ଅନ୍ତର୍ଭୁକ୍ତ ହୋଇପାରେ</string>
|
||||||
|
<string name="block_advertisments">ବିଜ୍ଞାପନଗୁଡ଼ିକୁ ଅବରୋଧ କରନ୍ତୁ</string>
|
||||||
|
<string name="about">ବିଷୟରେ</string>
|
||||||
|
<string name="license">ଲାଇସେନ୍ସ</string>
|
||||||
|
<string name="application">ଆପ୍ଲିକେସନ୍</string>
|
||||||
|
<string name="device">ଡିଭାଇସ୍</string>
|
||||||
|
<string name="app_version_with_arg">ଆପ୍ ସଂସ୍କରଣ: %1$s</string>
|
||||||
|
<string name="android_version_witharg">ଆଣ୍ଡ୍ରଏଡ୍ ସଂସ୍କରଣ: %1$s</string>
|
||||||
|
<string name="device_name_witharg">ଡିଭାଇସ୍ ନାମ: %1$s</string>
|
||||||
|
<string name="code_name_witharg">କୋଡ୍ ନାମ: %1$s</string>
|
||||||
|
<string name="get_the_source">ଉତ୍ସ ପ୍ରାପ୍ତ କରନ୍ତୁ</string>
|
||||||
|
<string name="translate_the_app">ଆପ୍ ଅନୁବାଦ କରନ୍ତୁ!</string>
|
||||||
|
<string name="app_not_available_in_your_lang_translate_with_stringlate">ଆପ୍ ଆପଣଙ୍କ ଭାଷାରେ ଉପଲବ୍ଧ ନାହିଁ କି? ଆପଣ ଏହା ବଦଳାଇପାରିବେ! ଆପଣ ଏହାକୁ ଅନୁବାଦ କରି ଆମକୁ କାହିଁକି ସାହାଯ୍ୟ କରୁନାହାଁନ୍ତି? ଆପ୍ ଅନୁବାଦ କରିବାରେ ଯେକୌଣସି ବ୍ୟକ୍ତିଙ୍କୁ ସକ୍ଷମ କରିବା ପାଇଁ ଆମେ Crowdin ବ୍ୟବହାର କରୁ।</string>
|
||||||
|
<string name="let_me_translate">ମୋତେ ଅନୁବାଦ କରିବାକୁ ଦିଅ</string>
|
||||||
|
<string name="give_feedback">ମତାମତ ଦିଅନ୍ତୁ!</string>
|
||||||
|
<string name="dandelion_still_in_development__appspecific">dandelion* ଏପର୍ଯ୍ୟନ୍ତ ବିକାଶରେ ଅଛି, ତେଣୁ ଯଦି ଆପଣଙ୍କର ପରାମର୍ଶ କିମ୍ୱା କୌଣସି ପ୍ରକାରର ମତାମତ ରହିଛି, ତେବେ ଦୟାକରି ଆମକୁ ଜଣାଇବା ପାଇଁ ଆମର ବଗ୍ ଟ୍ରାକର୍ ବ୍ୟବହାର କରନ୍ତୁ!</string>
|
||||||
|
<string name="report_bugs">ବଗ୍ ରିପୋର୍ଟ୍ କରନ୍ତୁ</string>
|
||||||
|
<string name="spread_the_word">ଶବ୍ଦ ବିସ୍ତାର କରନ୍ତୁ!</string>
|
||||||
|
<string name="tell_your_friends_about_diaspora__appspecific">diaspora* ଏବଂ #dandelion ବିଷୟରେ ଆପଣଙ୍କ ବନ୍ଧୁ ଏବଂ ପରିବାରକୁ କୁହନ୍ତୁ! ଆପଣ ଆପଣଙ୍କର ଅନୁଭୂତି ବିଷୟରେ କାହିଁକି ବ୍ଲଗ୍ କରୁନାହଁ? ଆମେ ଆପଣଙ୍କଠାରୁ ଶୁଣିବାକୁ ପସନ୍ଦ କରିବୁ!</string>
|
||||||
|
<string name="share_the_app">ଆପ୍ ଅଂଶୀଦାର କରନ୍ତୁ</string>
|
||||||
|
<string name="hey_checkout_dandelion_tag__appspecific">ଆଜ୍ଞା! #dandelion କୁ ଥରେ ଦେଖିଯାଆନ୍ତୁ! %1$s</string>
|
||||||
|
<!-- License & help (large amount of text) -->
|
||||||
|
<string name="maintainers">ରକ୍ଷଣାବେକ୍ଷଣକାରୀ</string>
|
||||||
|
<string name="this_app_is_currently_developed_and_maintained_by_witharg">ଏହି ଆପ୍ ବର୍ତ୍ତମାନ <br><br>%1$sଙ୍କ ଦ୍ୱାରା ବିକାଶ ଓ ରକ୍ଷଣାବେକ୍ଷଣ କରାଯାଉଛି</string>
|
||||||
|
<string name="contributors">ଯୋଗଦାନକାରୀ</string>
|
||||||
|
<string name="thank_you_witharg">%1$s<br><br>ଧନ୍ୟବାଦ!</string>
|
||||||
|
<string name="gnu_gplv3_license">GNU GPLv3+ ଲାଇସେନ୍ସ</string>
|
||||||
|
<string name="show_third_party_licenses">ତୃତୀୟ-ପକ୍ଷ ଲାଇବ୍ରେରୀ</string>
|
||||||
|
<string name="the_following_libraries_are_used">ନିମ୍ନଲିଖିତ ଲାଇବ୍ରେରୀଗୁଡ଼ିକ ବ୍ୟବହାର ହୋଇଛି:</string>
|
||||||
|
<string name="inspiration_from_leafpic__appspecific">ଆମେ LeafPic ରୁ କିଛି ପ୍ରେରଣା ଏବଂ କୋଡ୍ ନେଇଛୁ। ଯାଆନ୍ତୁ ଏହାକୁ ଥରେ ଦେଖି ଆସନ୍ତୁ, ଏହା ବି ଏକ ମାଗଣା ସଫ୍ଟୱେର୍!</string>
|
||||||
|
<string name="tell_me_more">ମୋତେ ଆହୁରି କୁହନ୍ତୁ</string>
|
||||||
|
<string name="enable_to_open_youtube_links_on_external_app">ବାହ୍ୟ ଆପରେ YouTube ଲିଙ୍କ୍ ଖୋଲିବା ପାଇଁ ସକ୍ଷମ କରନ୍ତୁ</string>
|
||||||
|
<string name="youtube_links">YouTube ଲିଙ୍କଗୁଡ଼ିକ</string>
|
||||||
|
<string name="change_the_theme_of_your_account">ଆପଣଙ୍କ ଆକାଉଣ୍ଟର ଥିମ୍ ପରିବର୍ତ୍ତନ କରନ୍ତୁ</string>
|
||||||
|
<string name="pull_to_refresh">ସତେଜ କରିବାକୁ ଟାଣନ୍ତୁ</string>
|
||||||
|
</resources>
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<!-- Common Words -->
|
<!-- Common Words -->
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">Otwórz panel nawigacyjny</string>
|
<string name="open_navdrawer">Otwórz panel nawigacyjny</string>
|
||||||
|
@ -204,5 +203,4 @@
|
||||||
<string name="youtube_links">Linki YouTube</string>
|
<string name="youtube_links">Linki YouTube</string>
|
||||||
<string name="change_the_theme_of_your_account">Zmień motyw konta</string>
|
<string name="change_the_theme_of_your_account">Zmień motyw konta</string>
|
||||||
<string name="pull_to_refresh">Pociągnij aby odświeżyć</string>
|
<string name="pull_to_refresh">Pociągnij aby odświeżyć</string>
|
||||||
<string name="donate">Wspomóż</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">Abra o painel de navegação</string>
|
<string name="open_navdrawer">Abra o painel de navegação</string>
|
||||||
|
@ -175,6 +174,4 @@
|
||||||
<string name="show_third_party_licenses">Bibliotecas de Terceiros</string>
|
<string name="show_third_party_licenses">Bibliotecas de Terceiros</string>
|
||||||
<string name="the_following_libraries_are_used">São usadas as seguintes bibliotecas:</string>
|
<string name="the_following_libraries_are_used">São usadas as seguintes bibliotecas:</string>
|
||||||
<string name="tell_me_more">Conte-me mais</string>
|
<string name="tell_me_more">Conte-me mais</string>
|
||||||
<string name="donate">Doar</string>
|
|
||||||
<string name="do_you_like_this_project_want_donate_to_keep_alive">Você gosta deste projeto? Você quer que ele fica melhor e com problemas corrigidos?\n\nDesenvolver aplicativos e escrever postagens relacionado em blog custa muito tempo! Se você quiser ajudar na continuação do projeto, por favor considere uma pequena doação!\n\nEsse projeto é desenvolvido durante o tempo de lazer, totalmente gratuito e sem propagandas!</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">Abrir menu de navegação</string>
|
<string name="open_navdrawer">Abrir menu de navegação</string>
|
||||||
|
@ -203,6 +202,4 @@
|
||||||
<string name="change_the_theme_of_your_account">Altera o tema da sua conta</string>
|
<string name="change_the_theme_of_your_account">Altera o tema da sua conta</string>
|
||||||
<string name="pull_to_refresh">Puxar para atualizar</string>
|
<string name="pull_to_refresh">Puxar para atualizar</string>
|
||||||
<string name="pulling_down_on_top_of_page_to_refresh">Deslize de cima para baixo para recarregar.\nTem que reiniciar a aplicação para aplicar as alterações.</string>
|
<string name="pulling_down_on_top_of_page_to_refresh">Deslize de cima para baixo para recarregar.\nTem que reiniciar a aplicação para aplicar as alterações.</string>
|
||||||
<string name="donate">Donativos</string>
|
|
||||||
<string name="do_you_like_this_project_want_donate_to_keep_alive">Gosta deste projeto? Deseja ajudar a melhorar a aplicação e a corrigir erros?\n\nO desenvolvimento de aplicações custa-me imenso tempo! Se quiser ajudar a manter o projeto, por favor considere a hipótese de um donativo!\n\nEsta aplicação é desenvolvida durante o meu tempo livre, é completamente livre e não tem anúncios!</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="reload">Reîncarcă</string>
|
<string name="reload">Reîncarcă</string>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">Открыть панель навигации</string>
|
<string name="open_navdrawer">Открыть панель навигации</string>
|
||||||
|
@ -205,6 +204,4 @@
|
||||||
<string name="change_the_theme_of_your_account">Изменить тему вашей учётной записи</string>
|
<string name="change_the_theme_of_your_account">Изменить тему вашей учётной записи</string>
|
||||||
<string name="pull_to_refresh">Потяните для обновления</string>
|
<string name="pull_to_refresh">Потяните для обновления</string>
|
||||||
<string name="pulling_down_on_top_of_page_to_refresh">Потяните вниз, чтобы обновить страницу.\nВам нужно перезапустить приложение, чтобы изменения вступили в силу.</string>
|
<string name="pulling_down_on_top_of_page_to_refresh">Потяните вниз, чтобы обновить страницу.\nВам нужно перезапустить приложение, чтобы изменения вступили в силу.</string>
|
||||||
<string name="donate">Поддержать проект</string>
|
|
||||||
<string name="do_you_like_this_project_want_donate_to_keep_alive">Вам нравится этот проект? Вы хотите поддержать дальнейшие улучшения и исправления ошибок?\n\nРазработка приложений и написание связанных блогов занимает много времени! Если вы хотите помочь проекту продолжить, пожалуйста, рассмотрите возможность небольшого пожертвования!\n\nЭтот проект развивается в свободное время, полностью бесплатно и без рекламы!</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">Aberi su pannellu de nàvigu</string>
|
<string name="open_navdrawer">Aberi su pannellu de nàvigu</string>
|
||||||
|
@ -208,6 +207,4 @@
|
||||||
<string name="change_the_theme_of_your_account">Muda su tema de su contu tuo</string>
|
<string name="change_the_theme_of_your_account">Muda su tema de su contu tuo</string>
|
||||||
<string name="pull_to_refresh">Tira cara a bassu pro annoare</string>
|
<string name="pull_to_refresh">Tira cara a bassu pro annoare</string>
|
||||||
<string name="pulling_down_on_top_of_page_to_refresh">Tira cara a bassu pro annoare sa pàgina.\nDepes torrare a allùghere s\'aplicatzione pro fàghere in modu chi sas modìficas tèngiant efetu.</string>
|
<string name="pulling_down_on_top_of_page_to_refresh">Tira cara a bassu pro annoare sa pàgina.\nDepes torrare a allùghere s\'aplicatzione pro fàghere in modu chi sas modìficas tèngiant efetu.</string>
|
||||||
<string name="donate">Dona</string>
|
|
||||||
<string name="do_you_like_this_project_want_donate_to_keep_alive">T\'agradat custu progetu? Cheres chi bèngiat megioradu e chi sos problemas bèngiant isortos?\n\nS\'isvilupu de aplicatziones e s\'iscritura de publicatziones curreladas in sos blogs pigat unu muntone de tempus! Si cheres agiudare, pro fàghere in modu chi su progetu potzat sighire, pro praghere piga in cunsìderu s\'idea de fàghere una donatzione, fintzas si minore!\n\nCustu progetu est isvilupadu in su tempus lìberu, totu de badas e chene annùntzios publitzitàrios!</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
81
app/src/main/res/values-si/strings.xml
Normal file
81
app/src/main/res/values-si/strings.xml
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<!-- Application -->
|
||||||
|
<string name="reload">නැවත පූරණය</string>
|
||||||
|
<string name="close">වසන්න</string>
|
||||||
|
<string name="cancel">අවලංගු</string>
|
||||||
|
<!-- Common Words -->
|
||||||
|
<string name="settings">සැකසුම්</string>
|
||||||
|
<string name="notifications">දැනුම්දීම්</string>
|
||||||
|
<string name="conversations">සංවාද</string>
|
||||||
|
<string name="profile">පැතිකඩ</string>
|
||||||
|
<string name="activities">ක්රියාකාරකම්</string>
|
||||||
|
<string name="commented">අදහස් දැක්විණි</string>
|
||||||
|
<string name="mentions">සැඳහුම්</string>
|
||||||
|
<string name="public_">ප්රසිද්ධ</string>
|
||||||
|
<string name="search">සොයන්න</string>
|
||||||
|
<string name="contacts">සබඳතා</string>
|
||||||
|
<string name="statistics">සංඛ්යාලේඛන</string>
|
||||||
|
<!-- Notifications dropdown menu -->
|
||||||
|
<string name="all_notifications">සියළුම දැනුම්දීම්</string>
|
||||||
|
<string name="also_commented">එවගේම අදහස් දැක්විණි</string>
|
||||||
|
<!-- Pod Activity -->
|
||||||
|
<string name="do_you_want_to_exit">ඔබට පිටවීමට ඇවැසිද?</string>
|
||||||
|
<!-- Drawer, Menu, Toolbar, ContextMenu -->
|
||||||
|
<string name="more">තව</string>
|
||||||
|
<string name="help_license">පිළිබඳව | උපකාර</string>
|
||||||
|
<string name="public_activities">ප්රසිද්ධ ක්රියාකාරකම්</string>
|
||||||
|
<string name="reports">වාර්තා</string>
|
||||||
|
<string name="share_screenshot_of_webpage">වියමන පිටුවෙහි තිරසේයාවක් බෙදාගන්න</string>
|
||||||
|
<string name="take_screenshot_of_webpage">වියමන පිටුවෙහි තිර සේයාවක් අරගන්න</string>
|
||||||
|
<string name="saving_screenshot_as">ලෙස තිරසේයාව සුරකින්න:</string>
|
||||||
|
<string name="link_adress_copied">සබැඳියේ ලිපිනය පිටපත් විය…</string>
|
||||||
|
<string name="exit_app">යෙදුමෙන් පිටවන්න</string>
|
||||||
|
<string name="share_dotdotdot">බෙදාගන්න…</string>
|
||||||
|
<string name="please_add_a_name">නමක් එකතු කරන්න</string>
|
||||||
|
<string name="share_link_address">සබැඳියේ ලිපිනය බෙදාගන්න</string>
|
||||||
|
<string name="open_in_external_browser">බාහිර අතිරික්සුවකින් විවෘත කරන්න…</string>
|
||||||
|
<string name="copy_link_adress_to_clipboard">සබැඳිය පසුරුපුවරුවට පිටපත් කරන්න</string>
|
||||||
|
<!-- More from MainActivity -->
|
||||||
|
<!-- Permissions -->
|
||||||
|
<string name="protocol">කෙටුම්පත</string>
|
||||||
|
<string name="show_title">සිරැසිය පෙන්වන්න</string>
|
||||||
|
<!-- Operability -->
|
||||||
|
<!-- Category Titles -->
|
||||||
|
<string name="network">ජාලය</string>
|
||||||
|
<!-- Visuals -->
|
||||||
|
<!-- Navigiation Slider -->
|
||||||
|
<string name="user">පරිශීලක</string>
|
||||||
|
<string name="admin">පරිපාලක</string>
|
||||||
|
<!-- Themes -->
|
||||||
|
<string name="theme_and_colors">තේමාව සහ වර්ණ</string>
|
||||||
|
<!-- Notifications dropdown -->
|
||||||
|
<string name="language">භාෂාව</string>
|
||||||
|
<string name="system_language">පද්ධතියේ භාෂාව</string>
|
||||||
|
<!-- Font size -->
|
||||||
|
<string name="font_size">මුද්රණඅකුරේ ප්රමාණය</string>
|
||||||
|
<string name="normal">සාමාන්ය</string>
|
||||||
|
<!-- Load images -->
|
||||||
|
<!-- Screen rotation -->
|
||||||
|
<string name="default_">පෙරනිමි</string>
|
||||||
|
<!-- Proxy -->
|
||||||
|
<string name="proxy">පෙරකලාසිය</string>
|
||||||
|
<string name="enable_proxy">පෙරකලාසිය සබල කරන්න</string>
|
||||||
|
<!-- Chrome custom tabs -->
|
||||||
|
<!-- Diaspora Settings -->
|
||||||
|
<string name="change_account">ගිණුම වෙනස් කරන්න</string>
|
||||||
|
<!-- More -->
|
||||||
|
<string name="about">පිලිබඳව</string>
|
||||||
|
<string name="license">බලපත්රය</string>
|
||||||
|
<string name="application">යෙදුම</string>
|
||||||
|
<string name="device">උපාංගය</string>
|
||||||
|
<string name="android_version_witharg">ඇන්ඩ්රොයිඩ් අනුවාදය: %1$s</string>
|
||||||
|
<string name="device_name_witharg">උපාංගයේ නම: %1$s</string>
|
||||||
|
<string name="code_name_witharg">කේතනාමය: %1$s</string>
|
||||||
|
<string name="get_the_source">මූලාශ්රය ගන්න</string>
|
||||||
|
<string name="translate_the_app">යෙදුම පරිවර්තනය කරන්න!</string>
|
||||||
|
<string name="share_the_app">යෙදුම බෙදාගන්න</string>
|
||||||
|
<!-- License & help (large amount of text) -->
|
||||||
|
<string name="gnu_gplv3_license">ජීඑන්යූ ජීපීඑල්v3+ බලපත්රය</string>
|
||||||
|
<string name="youtube_links">යූටියුබ් සබැඳිය</string>
|
||||||
|
</resources>
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<!-- Common Words -->
|
<!-- Common Words -->
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<!-- Common Words -->
|
<!-- Common Words -->
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">Otvori navigacioni panel</string>
|
<string name="open_navdrawer">Otvori navigacioni panel</string>
|
||||||
|
@ -36,5 +35,4 @@
|
||||||
<string name="contributors">Pomo\'nici</string>
|
<string name="contributors">Pomo\'nici</string>
|
||||||
<string name="gnu_gplv3_license">Prikazi GNU GPLv3 licence</string>
|
<string name="gnu_gplv3_license">Prikazi GNU GPLv3 licence</string>
|
||||||
<string name="show_third_party_licenses">Prikaz licence trecih lica</string>
|
<string name="show_third_party_licenses">Prikaz licence trecih lica</string>
|
||||||
<string name="donate">Doniraj</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<!-- Common Words -->
|
<!-- Common Words -->
|
||||||
|
@ -38,5 +37,4 @@
|
||||||
<!-- License & help (large amount of text) -->
|
<!-- License & help (large amount of text) -->
|
||||||
<string name="maintainers">Програмери</string>
|
<string name="maintainers">Програмери</string>
|
||||||
<string name="contributors">Сарадници</string>
|
<string name="contributors">Сарадници</string>
|
||||||
<string name="donate">Doniraj</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">Stäng navigeringsmenyn</string>
|
<string name="open_navdrawer">Öppna navigeringslådan</string>
|
||||||
<string name="close_navdrawer">Stäng navigeringslådan</string>
|
<string name="close_navdrawer">Stäng navigeringslådan</string>
|
||||||
<string name="reload">Ladda om</string>
|
<string name="reload">Ladda om</string>
|
||||||
<string name="close">Avsluta</string>
|
<string name="close">Avsluta</string>
|
||||||
|
@ -47,7 +46,7 @@
|
||||||
<string name="take_screenshot_of_webpage">Ta skärmdump av en webbsida</string>
|
<string name="take_screenshot_of_webpage">Ta skärmdump av en webbsida</string>
|
||||||
<string name="saving_image_to">Sparar bild som</string>
|
<string name="saving_image_to">Sparar bild som</string>
|
||||||
<string name="saving_screenshot_as">Sparar skärmdump som:</string>
|
<string name="saving_screenshot_as">Sparar skärmdump som:</string>
|
||||||
<string name="link_adress_copied">Länkadress kopierad…</string>
|
<string name="link_adress_copied">Länkadressen kopierades ...</string>
|
||||||
<string name="new_post">Nytt inlägg</string>
|
<string name="new_post">Nytt inlägg</string>
|
||||||
<string name="go_to_top">Till toppen</string>
|
<string name="go_to_top">Till toppen</string>
|
||||||
<string name="search_by_tags_or_persons__appspecific">Sök på taggar eller personer</string>
|
<string name="search_by_tags_or_persons__appspecific">Sök på taggar eller personer</string>
|
||||||
|
@ -60,7 +59,7 @@
|
||||||
<string name="share_link_address">Dela länkadress</string>
|
<string name="share_link_address">Dela länkadress</string>
|
||||||
<string name="save_image">Spara bild</string>
|
<string name="save_image">Spara bild</string>
|
||||||
<string name="share_image">Dela bild</string>
|
<string name="share_image">Dela bild</string>
|
||||||
<string name="open_in_external_browser">Öppna i en extern webbläsare…</string>
|
<string name="open_in_external_browser">Öppna i en extern webbläsare...</string>
|
||||||
<string name="copy_link_adress_to_clipboard">Kopiera länkadress</string>
|
<string name="copy_link_adress_to_clipboard">Kopiera länkadress</string>
|
||||||
<string name="copy_image_address_to_clipboard">Kopiera bildadressen</string>
|
<string name="copy_image_address_to_clipboard">Kopiera bildadressen</string>
|
||||||
<!-- More from MainActivity -->
|
<!-- More from MainActivity -->
|
||||||
|
@ -206,6 +205,9 @@
|
||||||
<string name="the_following_libraries_are_used">Följande bibliotek används:</string>
|
<string name="the_following_libraries_are_used">Följande bibliotek används:</string>
|
||||||
<string name="inspiration_from_leafpic__appspecific">Vi hämtade inspiration och kod från LeafPic. Kika på det, det är också fri programvara!</string>
|
<string name="inspiration_from_leafpic__appspecific">Vi hämtade inspiration och kod från LeafPic. Kika på det, det är också fri programvara!</string>
|
||||||
<string name="tell_me_more">Berätta mer</string>
|
<string name="tell_me_more">Berätta mer</string>
|
||||||
<string name="donate">Donera</string>
|
<string name="enable_to_open_youtube_links_on_external_app">Aktivera för att öppna Youtube-länkar i en extern app</string>
|
||||||
<string name="do_you_like_this_project_want_donate_to_keep_alive">Gillar du detta projektet? Vill du att det förbättras och att buggar åtgärdas snabbt?\n\nAtt utveckla appar och skriva relaterade blogginlägg tar mycket tid! Om du vill hjälpa till så att projektet kan fortgå så kan du överväga att ge en liten donation!\n\nDetta projektet utvecklas av volontärer på fritiden och är helt utan reklam!</string>
|
<string name="youtube_links">Youtube-länkar</string>
|
||||||
|
<string name="change_the_theme_of_your_account">Ändra temat för ditt konto</string>
|
||||||
|
<string name="pull_to_refresh">Dra för att uppdatera</string>
|
||||||
|
<string name="pulling_down_on_top_of_page_to_refresh">Dra ner på toppen av sidan för att uppdatera.\nDu måste starta om appen för att ändringarna ska träda i kraft.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<!-- Common Words -->
|
<!-- Common Words -->
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<!-- Common Words -->
|
<!-- Common Words -->
|
||||||
|
|
24
app/src/main/res/values-th/strings.xml
Normal file
24
app/src/main/res/values-th/strings.xml
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<!-- Application -->
|
||||||
|
<!-- Common Words -->
|
||||||
|
<!-- Notifications dropdown menu -->
|
||||||
|
<!-- Pod Activity -->
|
||||||
|
<!-- Drawer, Menu, Toolbar, ContextMenu -->
|
||||||
|
<!-- More from MainActivity -->
|
||||||
|
<!-- Permissions -->
|
||||||
|
<!-- Operability -->
|
||||||
|
<!-- Category Titles -->
|
||||||
|
<!-- Visuals -->
|
||||||
|
<!-- Navigiation Slider -->
|
||||||
|
<!-- Themes -->
|
||||||
|
<!-- Notifications dropdown -->
|
||||||
|
<!-- Font size -->
|
||||||
|
<!-- Load images -->
|
||||||
|
<!-- Screen rotation -->
|
||||||
|
<!-- Proxy -->
|
||||||
|
<!-- Chrome custom tabs -->
|
||||||
|
<!-- Diaspora Settings -->
|
||||||
|
<!-- More -->
|
||||||
|
<!-- License & help (large amount of text) -->
|
||||||
|
</resources>
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">Gezinme çekmecesini aç</string>
|
<string name="open_navdrawer">Gezinme çekmecesini aç</string>
|
||||||
|
@ -208,6 +207,4 @@
|
||||||
<string name="change_the_theme_of_your_account">Hesabınızın temasını değiştirin</string>
|
<string name="change_the_theme_of_your_account">Hesabınızın temasını değiştirin</string>
|
||||||
<string name="pull_to_refresh">Yenilemek için çek</string>
|
<string name="pull_to_refresh">Yenilemek için çek</string>
|
||||||
<string name="pulling_down_on_top_of_page_to_refresh">Yenilemek için sayfanın üst kısmından çekin\nDeğişikliklerin geçerli olması için uygulamayı yeniden başlat.</string>
|
<string name="pulling_down_on_top_of_page_to_refresh">Yenilemek için sayfanın üst kısmından çekin\nDeğişikliklerin geçerli olması için uygulamayı yeniden başlat.</string>
|
||||||
<string name="donate">Bağış yap</string>
|
|
||||||
<string name="do_you_like_this_project_want_donate_to_keep_alive">Bu projeyi beğendiniz mi? Projenin iyileştirilmesini ve sorunların çözülmesini istiyor musunuz?\n\nUygulama geliştirmek ve onunla ilgili blog gönderileri yazmak çok zaman alıyor! Projenin devam edebilmesi için yardım etmek istiyorsanız, lütfen küçük bir bağış yapmayı düşünün!\n\nBu proje boş zamanlarımda, tamamen ücretsiz ve reklamsız olarak geliştirilmiştir!</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">Відкрити панель навігації</string>
|
<string name="open_navdrawer">Відкрити панель навігації</string>
|
||||||
<string name="close_navdrawer">Закрити панель навігації</string>
|
<string name="close_navdrawer">Закрити панель навігації</string>
|
||||||
<string name="reload">Перезавантажити</string>
|
<string name="reload">Перезавантажити</string>
|
||||||
|
<string name="close">Закрити</string>
|
||||||
|
<string name="cancel">Скасувати</string>
|
||||||
<!-- Common Words -->
|
<!-- Common Words -->
|
||||||
<string name="settings">Налаштування</string>
|
<string name="settings">Налаштування</string>
|
||||||
<string name="notifications">Сповіщення</string>
|
<string name="notifications">Сповіщення</string>
|
||||||
|
@ -58,7 +59,7 @@
|
||||||
<string name="share_link_address">Поширити посилання</string>
|
<string name="share_link_address">Поширити посилання</string>
|
||||||
<string name="save_image">Зберегти зображення</string>
|
<string name="save_image">Зберегти зображення</string>
|
||||||
<string name="share_image">Поділитися зображенням</string>
|
<string name="share_image">Поділитися зображенням</string>
|
||||||
<string name="open_in_external_browser">Відкрити у зовнішньому браузері…</string>
|
<string name="open_in_external_browser">Відкрити у зовнішньому браузері…</string>
|
||||||
<string name="copy_link_adress_to_clipboard">Копіювати адресу посилання у буфер обміну</string>
|
<string name="copy_link_adress_to_clipboard">Копіювати адресу посилання у буфер обміну</string>
|
||||||
<string name="copy_image_address_to_clipboard">Копіювати зображення у буфер обміну</string>
|
<string name="copy_image_address_to_clipboard">Копіювати зображення у буфер обміну</string>
|
||||||
<!-- More from MainActivity -->
|
<!-- More from MainActivity -->
|
||||||
|
@ -204,5 +205,9 @@
|
||||||
<string name="the_following_libraries_are_used">Використовуються такі бібліотеки:</string>
|
<string name="the_following_libraries_are_used">Використовуються такі бібліотеки:</string>
|
||||||
<string name="inspiration_from_leafpic__appspecific">Ми взяли трохи натхнення і коду з LeafPic. Це також вільне програмне забезпечення, тож користуйтеся!</string>
|
<string name="inspiration_from_leafpic__appspecific">Ми взяли трохи натхнення і коду з LeafPic. Це також вільне програмне забезпечення, тож користуйтеся!</string>
|
||||||
<string name="tell_me_more">Хочу знати більше</string>
|
<string name="tell_me_more">Хочу знати більше</string>
|
||||||
<string name="donate">Пожертвувати</string>
|
<string name="enable_to_open_youtube_links_on_external_app">Увімкнути для відкриття посилань Youtube у зовнішньому застосунку</string>
|
||||||
|
<string name="youtube_links">Youtube посилання</string>
|
||||||
|
<string name="change_the_theme_of_your_account">Змінити тему вашого облікового запису</string>
|
||||||
|
<string name="pull_to_refresh">Потягніть, щоб оновити</string>
|
||||||
|
<string name="pulling_down_on_top_of_page_to_refresh">Потягніть сторінку згори вниз, щоб оновити.\nВам потрібно перезавантажити застосунок, щоб зміни набрали сили.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<!-- Common Words -->
|
<!-- Common Words -->
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<!-- Common Words -->
|
<!-- Common Words -->
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">打开导航栏</string>
|
<string name="open_navdrawer">打开导航栏</string>
|
||||||
|
@ -211,6 +210,4 @@
|
||||||
<string name="change_the_theme_of_your_account">更改您的帐户的主题</string>
|
<string name="change_the_theme_of_your_account">更改您的帐户的主题</string>
|
||||||
<string name="pull_to_refresh">下拉刷新</string>
|
<string name="pull_to_refresh">下拉刷新</string>
|
||||||
<string name="pulling_down_on_top_of_page_to_refresh">在页面顶部下拉刷新。\n您需要重新启动应用程序以使更改生效。</string>
|
<string name="pulling_down_on_top_of_page_to_refresh">在页面顶部下拉刷新。\n您需要重新启动应用程序以使更改生效。</string>
|
||||||
<string name="donate">捐赠</string>
|
|
||||||
<string name="do_you_like_this_project_want_donate_to_keep_alive">你喜欢这个项目吗?你想要它得到改善并解决问题吗?\n\n开发应用并撰写相关博客文章需要花费大量时间!如果你想要帮助项目继续进行,请考虑小额捐赠!\n\n这个项目是在闲暇时间开发的,完全免费且没有任何广告!</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Application -->
|
<!-- Application -->
|
||||||
<string name="open_navdrawer">開啟側邊導覽選單</string>
|
<string name="open_navdrawer">開啟側邊導覽選單</string>
|
||||||
|
@ -203,6 +202,7 @@
|
||||||
<string name="tell_me_more">再多說一些</string>
|
<string name="tell_me_more">再多說一些</string>
|
||||||
<string name="enable_to_open_youtube_links_on_external_app">使用其他應用程式來開啟 Youtube 連結</string>
|
<string name="enable_to_open_youtube_links_on_external_app">使用其他應用程式來開啟 Youtube 連結</string>
|
||||||
<string name="youtube_links">Youtube 連結</string>
|
<string name="youtube_links">Youtube 連結</string>
|
||||||
<string name="donate">贊助</string>
|
<string name="change_the_theme_of_your_account">修改帳號的佈景主題</string>
|
||||||
<string name="do_you_like_this_project_want_donate_to_keep_alive">喜歡這個專案嗎?希望它繼續改善而且問題得到解決嗎?\n\n開發應用程式以及撰寫相關部落格文章都需要很多時間!如果你想要幫忙讓專案可以繼續,請考慮小額捐款!\n\n這個專案是在閒暇時間開發的,完全免費,並且沒有任何廣告!</string>
|
<string name="pull_to_refresh">下拉可更新</string>
|
||||||
|
<string name="pulling_down_on_top_of_page_to_refresh">從頁面的上方下拉一下可以更新內容。\n這個設定修改後需要重啟應用程式才會生效。</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue