diff --git a/.atomignore b/.atomignore
new file mode 100755
index 00000000..033e25f6
--- /dev/null
+++ b/.atomignore
@@ -0,0 +1,23 @@
+.git
+.github
+.gradle
+.idea
+build
+gradle
+.gitlab-ci.yml
+*.iml
+local.properties
+settings.gradle
+gradlew
+gradlew.bat
+LICENSE.md
+app/build
+app/.gitignore
+app/pom.xml
+app/proguard-rules.pro
+.hidden
+.travis.yml
+circle.yml
+CODE_OF_CONDUCT*
+gradle.properties
+LICENSE*
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
index 8fc720b8..5ac91667 100644
--- a/.github/ISSUE_TEMPLATE.md
+++ b/.github/ISSUE_TEMPLATE.md
@@ -1,42 +1,24 @@
#### General information
-* **Device:** eg Nexus 5
-* **Android Version:** eg Android 6.0.1
-* **Pod:** eg pod.geraspora.de
-* **Diaspora pod version:** eg 0.5.99.0-p9bd2337c (can be found on the bottom)
-* **App source:** F-Droid, self build (latest HEAD)
-* **App version:** eg 0.1.5, or commit
+* **App version:**
+* **System:**
+* **Pod:**
+#### Description
+
+
+#### Log
-
-#### Steps to reproduce
-
-1. …
-2. …
-3. …
-
-
-#### Expected result
-
-What is the expected output?
-
-What do you see instead?
-
-Upload screenshots via drag&drop if needed and apply resizing:
-``
-
-
-#### Debug output
-
-Please post the output of adb logcat. The log should begin with the start of Diaspora for Android and include all the steps it takes to reproduce the problem.
-
-````
-adb logcat -s com.github.dfa.diaspora_android
-````
diff --git a/.github/PULL_REQUEST_TEMPLATE b/.github/PULL_REQUEST_TEMPLATE
new file mode 100644
index 00000000..863cd426
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
diff --git a/.github/workflows/build-android-project.yml b/.github/workflows/build-android-project.yml
new file mode 100644
index 00000000..07923101
--- /dev/null
+++ b/.github/workflows/build-android-project.yml
@@ -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
diff --git a/.gitignore b/.gitignore
index 8f72a53d..59057232 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,48 +1,76 @@
-*~
+##############
+### Common ###
+*~*
+tmp/
+*.tmp
+*.bak
+*.log
-# Project specific
-app/src/main/res/raw/changelog.md
-app/src/main/res/raw/contributors.md
-app/src/main/res/raw/license.md
-app/src/main/res/raw/readme.md
-app/src/main/res/raw/contributors.txt
+################
+### Intellij ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio
+*.iml
+/out/
+.idea/
+# if you remove the above rule, at least ignore the following:
+## User-specific stuff:
+# .idea/workspace.xml
+# .idea/tasks.xml
+# .idea/dictionaries
+## Sensitive or high-churn files:
+# .idea/dataSources.ids
+# .idea/dataSources.xml
+# .idea/sqlDataSources.xml
+# .idea/dynamic.xml
+# .idea/uiDesigner.xml
+# Gradle:
+# .idea/gradle.xml
+# .idea/libraries
-# Gradle
-.gradle/
+## File-based project format:
+*.ipr
+*.iws
+
+### Gradle ###
.gradle
build/
-/*/build/
+dist/
+gradle-app.setting
-# User-specific configurations
-local.properties
-crowdin.yaml
+# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
+!gradle-wrapper.jar
-.idea
-.idea/libraries/
-.idea/runConfigurations.xml
-.idea/gradle.xml
-.idea/workspace.xml
-.idea/tasks.xml
-.idea/.name
-.idea/compiler.xml
-.idea/copyright/profiles_settings.xml
-.idea/encodings.xml
-.idea/misc.xml
-.idea/modules.xml
-.idea/scopes/scope_settings.xml
-.idea/vcs.xml
-*.iml
+###############
+### Eclipse ###
+#.project
+*.pydevproject
+.metadata
+*.swp
+*~.nib
+.settings/
+.loadpath
+.externalToolBuilders/
+*.launch
+.cproject
+.classpath
+.factorypath
+.buildpath
+.target
+.texlipse
-# OS-specific files
-.DS_Store
-.DS_Store?
-._*
-.Trashes
-ehthumbs.db
-Thumbs.db
+############
+### Java ###
+*.class
+.mtj.tmp/
+*.jar
+*.war
+*.ear
+hs_err_pid*
+###############
+### Android ###
# Built application files
*.apk
*.ap_
@@ -50,14 +78,27 @@ Thumbs.db
# Files for the Dalvik VM
*.dex
-# Java class files
-*.class
-
# Generated files
bin/
gen/
+# Local configuration file (sdk path, etc)
local.properties
+
+# Proguard
proguard/
-*.log
+
+# Android Studio Stuff
.navigation/
+gen-external-apklibs
+
+### Project ##
+app/src/main/res/raw/changelog.*
+app/src/main/res/raw/license.*
+app/src/main/res/raw/readme.*
+app/src/main/res/raw/contributors.*
+app/flavor*
+
+# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
+!gradle-wrapper.jar
+
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 74b79b85..00000000
--- a/.travis.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-language: android
-jdk:
- - oraclejdk8
-android:
- components:
- - tools
- - tools # TODO https://github.com/travis-ci/travis-ci/issues/6193
- - platform-tools
- - build-tools-24.0.1
- - android-24
- - extra-android-m2repository
-before_cache:
- - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
-cache:
- directories:
- - $HOME/.gradle/caches/
- - $HOME/.gradle/wrapper/
-script: "./gradlew $TASK"
-env:
- - TASK="lintDebug"
- - TASK="build check --stacktrace"
-
-branches:
- except:
- - l10n_master
-notifications:
- webhooks:
- urls:
- - https://webhooks.gitter.im/e/e462044d3105a7bb4b4f
- on_success: change # options: [always|never|change] default: always
- on_failure: always # options: [always|never|change] default: always
- on_start: never # options: [always|never|change] default: always
diff --git a/CHANGELOG.md b/CHANGELOG.md
index bf15a05f..a5861d19 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,150 @@
-# v0.1.6
+### 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
+- Add seconds to 'save picture' date format
+- Updated translations
+- Added german F-Droid description translation
+- Update to Android SDK 29
+
+### v1.3.0
+- Add option to open youtube links external/in YouTube app (optional)
+- Pull to refresh
+
+### v1.2.3
+**Improved:**
+- More supported languages, more complete translations!
+
+### v1.2.1
+**App release: dandelior**
+- 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
+
+### v1.1.3
+- Improve sharing *a lot*, add support for multiple filetypes
+- Support for downloading GIFs ;)
+- Rework screenshot saving and sharing; add new share options:
+- Merge license and changelog dialog on first start
+
+### v1.1.2
+- Fix: loading non-pod links outside customtab/external browser
+- Fix: webview-js dialog not dismissing correctly
+
+### v1.1.0
+- Added: App shortcuts (Android 7+)
+- Updated: podlist
+- More supported languages
+- File sharing fixes
+
+### v1.0.8
+- Modified: Navigation - Merge bottom toolbar into top
+- Updated: Build for Android O/27
+- Updated: Language change preference
+- Added: B/W coloring of toolbar popup
+
+### v1.0.5
+- Updated: Language preference
+
+### v1.0.4
+- Updated: README
+- Added: Hide statusbar option
+- Fixed: Language list
+- Added: Sardinian,Malayalam,Turkish translation
+
+### v1.0.3
+- Update opoc
+- Better visibility for counter badge
+- Refactor DiasporaPod model
+- Update PodList (many new pods!)
+- Fix CustomTab bug
+
+### v1.0.2 (2017-08-05)
+- Improve build script
+- Update translation file license
+
+### v1.0.1 (2017-07-30)
+- Update SimpleMarkdownParser
+- Move untranslatable strings
+
+### v1.0.0 (2017-06-14)
+- Added AMOLED mode
+- Improve NavDrawer
+- Improve Shared by notice
+- Use opoc/Helpers,AdBlock
+
+### v0.2.7 (2017-05-26)
+- Small improvements
+
+### v0.2.6 (2017-05-03)
+- Fixed #156 #158 #159
+- Added chinese traditional language
+- Added NavSlider option: Statistics
+- Changed shared-by-notice text
+- Fix bottom bar hint text background color (Fix #157)
+- Color improvements
+
+### v0.2.5 (2017-04-10)
+- Introduce minimalistic Markdown Parser
+- Show LICENSE at first start
+- Show CHANGELOG after update
+- Convert existing Markup files to Markdown
+- Update existing markdown files
+- Update AboutActivity to use new Parser
+- Added translations: Danish, Korean, Galician
+
+### v0.2.4 (2017-03-19)
+- Different icon and color for secondlion
+- Language switcher
+- Handle dia.so links
+- Improve security at internal browser decision
+- More icons for notification dropdown
+- Update gradle build scripts
+- Added CircleCI
+
+### v0.2.3 (2017-02-24)
+- Add Czech translation (thanks @bezcitu)
+- Add option to copy image urls to clipboard
+- Fixed some bugs related to image upload/download
+- Published secondlion\* (nighly version of dandelion\*)
+
+### v0.2.2
+- Move "toggle mobile/deskop" to nav-slider
+- Reduce messages sent via broadcast
+- Allow to jump to last visited page on stream
+- New language: Hungarian
+- FIX NullPtr in shared text methods
+- FIX #117 - Reset NavHeader on change account, reset web profile
+- FIX #92 Roation settings
+- FIX #111 Remove legacy code
+
+### v0.2.1
+- App name changed to **dandelion***
+- Rotation options
+- Top toolbar loads screen again (toggleable in settings)
+- Fixed overlapping fragments
+- Visual rework of the About-section of the app
+
+### v0.2.0a
+- Added: Customizable Theme Colors!
+- Improved account setup with easy tor hidden service configuration
+- Eye candy for the settings activity
+- Added: "Contacts" shortcut in the navigation slider
+- Increased the overall performance by using Fragments
+- Lots of bugfixes
+- Fixes for the bugfixes!
+
+### v0.1.6
- Added: New languages
- Changed: New delicious visual style + launcher icon
- Changed: Notifications-/Messages-indicator does now display number of events!
@@ -10,7 +156,7 @@
- Fixed: Image upload for older devices
- Added: Option to open external links in Chrome CustomTab
-# v0.1.5
+### v0.1.5
- Update title depending on what the user is doing
- New greenish color scheme
- Replaced SwipeToRefresh functionality with refresh button
@@ -25,7 +171,7 @@
- Allow slider customization
- Show aspect name after selection
-# v0.1.4 (2016-07-31)
+### v0.1.4 (2016-07-31)
- by @vanitasvitae, @gsantner, @di72nn
- Allow turning off toolbar intellihide
- Handle links from browseable intent filter #38
@@ -40,7 +186,7 @@
- Share screenshot fix; Minor Aspects rework
- Update to SDK 24 (Android N)
-# v0.1.3 (2016-07-04)
+### v0.1.3 (2016-07-04)
- Added titles on top toolbar (by @scoute-dich)
- Made bottom toolbar automatically disappear
- Added option to share images to external app
@@ -51,7 +197,7 @@
- Removed swipe-to-refresh functionality in some places
- Big thanks and good luck to @scoute-dich and @martinchodev for accompanying this project :)
-# v0.1.2 (2016-06-05)
+### v0.1.2 (2016-06-05)
- Extract and show aspects (by @gsantner)
- Cache last podlist
- Better sharing from app
@@ -64,7 +210,7 @@
- Lots of refactoring; Reworked Splash,PodSelectionActivity; Switch Pod; Clear settings;
- Activity transitions, usability MainActivity, green accent color
-# v0.1.1
+### v0.1.1
- Sharing updated (by @scoute-dich)
- Screenshotting updated
- Gitter integration (by @gsantner)
@@ -74,8 +220,8 @@
- Travis CI integration
- Bump Gradle, Build-Tools, Libs to Android Studio 2.1 defaults
-# v0.1.0 (Diaspora for Android)
-First version of the organization *Diaspora for Android*
+### v0.1.0 (Diaspora for Android)
+First version of the organization *Diaspora for Android*
Consists mostly of code from:
- Diaspora-Native-Webapp (by @martinchodev )
- scoutedich additions (by @scoute-dich)
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 00000000..47984ecf
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,74 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, gender identity and expression, level of experience,
+nationality, personal appearance, race, religion, or sexual identity and
+orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+ address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an appointed
+representative at an online or offline event. Representation of a project may be
+further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at . All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at [http://contributor-covenant.org/version/1/4][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/4/
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
index 71824d42..00000000
--- a/CONTRIBUTING.md
+++ /dev/null
@@ -1,6 +0,0 @@
-We are always open for any kind of contribution. (PR's, bug reports, feature requests, translations, ..)
-If you got any questions feel free to join our XMPP/Jabber conference at `diaspora-android@conference.jabberhead.tk` or [Gitter](https://gitter.im/Diaspora-for-Android/diaspora-android).
-Note that the main project members are mostly busy with their job/university/school and may not react or start coding immediately.
-
-We use Crowdin to translate Diaspora for Android. Join our project here:
-If your desired language is not listed please contact the maintainers/owner.
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
new file mode 100644
index 00000000..16e6a136
--- /dev/null
+++ b/CONTRIBUTORS.md
@@ -0,0 +1,32 @@
+
+* **[Gregor Santner](http://github.com/gsantner)** ~° Development of dandelion
+* **[Paul Schaub](https://github.com/vanitasvitae)** ~° Development of dandelion
+* **[Martín Vukovic](martinvukovic AT protonmail DOT com)** ~° Diaspora Native WebApp
+* **[Gaukler Faun](https://github.com/scoute-dich)** ~° Diaspora Native WebApp additions
+* **[Airon90](https://diasp.eu/u/airon90)** ~° Italian translation
+* **[Nacho Fernández](nacho_f AT joindiaspora DOT com)** ~° Spanish translation
+* **[Naofumi Fukue](https://github.com/naofum)** ~° Japanese translation
+* **[pskosinski](email AT pskosinski DOT pl)** ~° Polish translation
+* **[SansPseudoFix](https://github.com/SansPseudoFix)** ~° French translation
+* **[Zsolt Szakács](maxigaz AT diaspora DOT zone)** ~° Hungarian translation
+* **[Luís F.S. Rosa](https://github.com/luisfsr)** ~° Brazilian Portuguese translation
+* **[Danilo Raffaelli](https://crowdin.com/profile/Daraf)** ~° Italian translation
+* **[Âng Iōngchun](https://pubpod.alqualonde.org/u/iongchun)** ~° Chinese traditional translation
+* **[Mikkel Kirkgaard Nielsen](http://www.mikini.dk)** ~° Danish translation
+* **[Jean Lucas](jean AT 4ray DOT co)** ~° Spanish translation
+* **[asereze](https://github.com/asereze)** ~° Sardinian translation
+* **[Xosé M. Lamas](http://xmgz.eu)** ~° Galician translation
+* **[massimiliano](https://framagit.org/massimiliano)** ~° Contributor
diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt
deleted file mode 100644
index e842d61a..00000000
--- a/CONTRIBUTORS.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-00l>> This file contains references to people who contributed to the app.
-01l>> Send a message to [gdev AT live to de](https://gsantner.github.io/about/email/) to get included
-02l>> If you helped by translating the app, please send a message on crowdin
-03l>>
-04l>> Schemes:
-05l>> Firstname Lastname (Link): Text
-06l>> Firstname Lastname (E-Mail): Text
-07l>> Username (Link): Text
-08l>> Username (E-Mail): Text
-## 99l CONTRIBUTORS
-Abhijith Balan (abhijithb21 AT openmailbox DOT org): Malayalam translation
-Airon90 (https://diasp.eu/u/airon90): Italian translation
-SansPseudoFix (https://github.com/SansPseudoFix): French translation
diff --git a/LICENSE.md b/LICENSE.md
index d1628af1..4292c03f 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -1,19 +1,25 @@
-# App
-
-This program is free software: you can redistribute it and/or modify
+# dandelion\*
+`---------------`
+This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
+GNU General Public License for more details.
You should have received a copy of the GNU General Public License
-along with this program. If not, see https://www.gnu.org/licenses/.
+along with this program. If not, see https://www.gnu.org/licenses/.
+`---------------`
+If you want to publish dandelion\* in an app store, you have to change the app name (dandelion\*), package name & launcher icon (blue). See "7. Additional Terms" of GPL.
+You also have to provide the modifications in source code somewhere online for free. This is explicitly not about building the app and sharing with some friends, it's about app stores.
+The reason is, that most app stores allow an app id just once, which would block our uploads if somebody else uploaded. Also, we want to keep control on where the app is published, and want to make sure there is no malware in it.
+The F-Droid project team is explicitly allowed to publish dandelion\* without listed required modifications above at official F-Droid repository.
-# Splashscreen-Images
+## Miscellaneous
-The splashscreen images can be found on [flickr](https://www.flickr.com/photos/129581906@N06/sets/72157651933980136/with/16594947123/).
+We took some inspiration and code from LeafPic. Go check it out, its free software as well!
+
diff --git a/Makefile b/Makefile
new file mode 100644
index 00000000..09b21c00
--- /dev/null
+++ b/Makefile
@@ -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 "@@' | sed 's@@@' | 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 "-----------------------------------------------------------------------------------"
+
diff --git a/NEWS.md b/NEWS.md
new file mode 100644
index 00000000..6139d132
--- /dev/null
+++ b/NEWS.md
@@ -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
diff --git a/README.md b/README.md
index a2696020..a061ee60 100644
--- a/README.md
+++ b/README.md
@@ -1,42 +1,81 @@
-[](https://f-droid.org/repository/browse/?fdid=com.github.dfa.diaspora_android)
+[](https://github.com/gsantner/dandelion/releases)
+[](https://github.com/gsantner/dandelion/releases)
+[](https://crowdin.com/project/diaspora-for-android/invite)
+[](https://matrix.to/#/#dandelion:matrix.org)
+[](https://github.com/gsantner/dandelion/actions)
+[](https://www.codacy.com/app/gsantner/dandelion)
-[](https://travis-ci.org/Diaspora-for-Android/diaspora-android)
-[](https://crowdin.com/project/diaspora-for-android)
-[](https://gitter.im/Diaspora-for-Android/diaspora-android?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+# dandelion\*
+
+This is an unofficial webview based client for the community-run, distributed social network diaspora*.
+
+
-# Diaspora for Android
+## Description
+This is an unofficial webview based client for the community-run, distributed social network diaspora*.
+It's currently under development and should be used with that in mind. Please submit any bugs you might find.
-This is an unofficial webview based client for the community-run, distributed social network **[Diaspora*](https://diasporafoundation.org/)**. It's currently under development and should be used with that in mind. Please submit any bugs you might find.
+#### WebApp
+The app is developed as a WebApp because currently diaspora\* doesn't have an functional API that can be used to create a native interface to retrieve the user's data, publications, direct messages and so on. That's why there are currently only WebApps for diaspora\* out there.
+[Stay tuned on diaspora\* issues](https://github.com/diaspora/diaspora/labels/api) about API.
-- Download ([F-Droid](https://f-droid.org/repository/browse/?fdid=com.github.dfa.diaspora_android), [Release Archive](https://github.com/Diaspora-for-Android/diaspora-android/releases))
-- Watch [Changelog](https://github.com/Diaspora-for-Android/diaspora-android/blob/master/CHANGELOG.md)
-- See [Screenshots](https://github.com/Diaspora-for-Android/diaspora-android/blob/master/SCREENSHOTS.md)
-
-## Contributions
-We are always open for any kind of contribution. (PR's, bug reports, feature requests, translations, ..)
-If you got any questions feel free to join our XMPP/Jabber conference at `diaspora-android@conference.jabberhead.tk` or [Gitter](https://gitter.im/Diaspora-for-Android/diaspora-android).
-Note that the main project members are mostly busy with their job/university/school and may not react or start coding immediately.
-
-We use Crowdin to translate Diaspora for Android. Join our project here:
-If your desired language is not listed please contact the maintainers/owner.
-
-### License
-It's released under GNU GENERAL PUBLIC LICENSE (see [LICENCE](https://github.com/Diaspora-for-Android/diaspora-android/blob/master/LICENSE.md)).
-
-### WebApp
-The app is developed as an WebApp because currently Diaspora doesn't have an API that can be used to create a native interface to retrieve the user's data, publications, direct messages and so on, that's why there are only WebApps for Diaspora out there.
-[Stay tuned on Diaspora* Issues](https://github.com/diaspora/diaspora/labels/api) about API.
-
-Why a WebApp is better than using the mobile site on a browser?
+Why is a WebApp better than using the mobile site on a browser?
Basically it provides better integration with the system (events coming into and going out of the app), notifications, customized interface and functions and a nice little icon that takes you directly to your favorite social network :)
-### Device Requirements
-The minimum version supported is Jelly Bean, Android v4.2.0 / API 17
+#### Device Requirements
+The minimum Android version supported is Jelly Bean, Android v4.2.0 / API 17
-### App Permissions
-It requires access to the Internet and to external storage to be able to upload photos when creating a new post and for taking screenshots.
+### Privacy & Permissions
+dandelion\* requires access to the Internet and to external storage to be able to upload photos when creating a new post and for taking screenshots.
-## Maintainers
-- gsantner ([GitHub](https://github.com/gsantner), [Web](https://gsantner.github.io))
-- vanitasvitae ([GitHub](https://github.com/vanitasvitae))
+
+## Contributions
+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.
+
+Translations can be contributed on GitHub. You can use Stringlate ([](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 Matrix channel and say hello! Don't be afraid to start talking. [](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.
+
+
+#### Resources
+* Project: [Changelog](/CHANGELOG.md) | [Issues level/beginner](https://github.com/gsantner/dandelion/issues?q=is%3Aissue+is%3Aopen+label%3Alevel%2Fbeginner) | [License](/LICENSE.txt) | [CoC](/CODE_OF_CONDUCT.md)
+* Project diaspora\* account: [dandelion00@diasp.org](https://diasp.org/people/48b78420923501341ef3782bcb452bd5)
+* diaspora\*: [GitHub](https://github.com/diaspora/diaspora) | [Web](https://diasporafoundation.org) | [d\* HQ account](https://pod.diaspora.software/people/7bca7c80311b01332d046c626dd55703)
+* App on F-Droid: [Metadata](https://gitlab.com/fdroid/fdroiddata/blob/master/metadata/com.github.dfa.diaspora_android.txt) | [Page](https://f-droid.org/packages/com.github.dfa.diaspora_android/) | [Wiki](https://f-droid.org/wiki/page/com.github.dfa.diaspora_android) | [Build log](https://f-droid.org/wiki/page/com.github.dfa.diaspora_android/lastbuild)
+
+
+## Licensing
+dandelion\* is released under GNU GENERAL PUBLIC LICENSE (see [LICENCE](https://github.com/gsantner/dandelion/blob/master/LICENSE.md)).
+The app is licensed GPL v3. Localization files and resources (strings\*.xml) are licensed CC0 1.0.
+For more licensing informations, see [`3rd party licenses`](/app/src/main/res/raw/licenses_3rd_party.md).
+
+## Screenshots
+
" + getString(R.string.licenses) + " " + smp.parse(getResources().openRawResource(R.raw.licenses_3rd_party), "").getHtml();
+ ActivityUtils _au = new ActivityUtils(this);
+ _au.showDialogWithHtmlTextView(R.string.licenses, html);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
}
- private void setupUI(Bundle savedInstanceState) {
+ /**
+ * Setup the user interface. Set up both toolbars and initialize the snackbars.
+ * Initialize the navigation drawer and apply intellihide settings.
+ */
+ private void setupUI() {
AppLog.i(this, "setupUI()");
- ButterKnife.bind(this);
- if (webviewPlaceholder.getChildCount() != 0) {
- AppLog.v(this, "remove child views from webViewPlaceholder");
- webviewPlaceholder.removeAllViews();
- } else {
- AppLog.v(this, "webViewPlaceholder had no child views");
- }
- boolean newWebView = (webView == null);
- if (newWebView) {
- AppLog.v(this, "WebView was null. Create new one.");
- View webviewHolder = getLayoutInflater().inflate(R.layout.webview, this.contentLayout, false);
- this.webView = (ContextMenuWebView) webviewHolder.findViewById(R.id.webView);
- ((LinearLayout) webView.getParent()).removeView(webView);
- setupWebView(savedInstanceState);
- } else {
- AppLog.v(this, "Reuse old WebView to avoid reloading page");
- }
-
- AppLog.v(this, "Add WebView to placeholder");
- webviewPlaceholder.addView(webView);
- // Setup toolbar
+ // Setup _toolbar
setSupportActionBar(toolbarTop);
- getMenuInflater().inflate(R.menu.main__menu_bottom, toolbarBottom.getMenu());
- toolbarBottom.setOnMenuItemClickListener(new ActionMenuView.OnMenuItemClickListener() {
- public boolean onMenuItemClick(MenuItem item) {
- return MainActivity.this.onOptionsItemSelected(item);
- }
- });
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
setTitle(R.string.app_name);
//Setup snackbar
snackbarExitApp = Snackbar
- .make(contentLayout, R.string.confirm_exit, Snackbar.LENGTH_LONG)
+ .make(fragmentContainer, R.string.do_you_want_to_exit, Snackbar.LENGTH_LONG)
.setAction(android.R.string.yes, new View.OnClickListener() {
- @Override
public void onClick(View view) {
finish();
moveTaskToBack(true);
}
});
- snackbarNewNotification = Snackbar
- .make(contentLayout, R.string.new_notifications, Snackbar.LENGTH_LONG)
- .setAction(android.R.string.yes, new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- if (WebHelper.isOnline(MainActivity.this)) {
- webView.loadUrlNew(urls.getNotificationsUrl());
- } else {
- Snackbar.make(contentLayout, R.string.no_internet, Snackbar.LENGTH_LONG).show();
- }
- }
- });
- snackbarNoInternet = Snackbar.make(contentLayout, R.string.no_internet, Snackbar.LENGTH_LONG);
+ snackbarLastVisitedTimestampInStream =
+ Snackbar.make(fragmentContainer,
+ R.string.jump_to_last_visited_page_in_stream__appspecific, Snackbar.LENGTH_LONG)
+ .setAction(android.R.string.yes, new View.OnClickListener() {
+ public void onClick(View view) {
+ openDiasporaUrl(urls.getStreamWithTimestampUrl(diasporaUserProfile.getLastVisitedPositionInStream()));
+ }
+ });
+ snackbarNoInternet = Snackbar.make(fragmentContainer, R.string.sorry_need_to_be_connected_to_internet, Snackbar.LENGTH_LONG);
// Load app settings
setupNavigationSlider();
-
- progressBar = (ProgressBar) findViewById(R.id.progressBar);
-
- String url = urls.getPodUrl();
- if (newWebView) {
- if (WebHelper.isOnline(MainActivity.this)) {
- AppLog.v(this, "setupUI: reload url");
- webView.loadData("", "text/html", null);
- webView.loadUrlNew(url);
- } else {
- snackbarNoInternet.show();
- }
- }
-
- if (!appSettings.isIntellihideToolbars()) {
- AppLog.v(this, "Disable intelligent hiding of toolbars");
- AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) toolbarTop.getLayoutParams();
- params.setScrollFlags(0); // clear all scroll flags
- }
-
AppLog.v(this, "UI successfully set up");
- handleIntent(getIntent());
}
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- AppLog.i(this, "onConfigurationChanged()");
- if (webView != null) {
- // Remove the WebView from the old placeholder
- AppLog.v(this, "removeView from placeholder in order to prevent recreation");
- webviewPlaceholder.removeView(webView);
+ /**
+ * Get an instance of the ThemedFragment with the tag fragmentTag.
+ * If there was no instance so far, create a new one and add it to the FragmentManagers pool.
+ * If there is no Fragment with the corresponding Tag, return the top fragment.
+ *
+ * @param fragmentTag tag
+ * @return corresponding Fragment
+ */
+ protected ThemedFragment getFragment(String fragmentTag) {
+ ThemedFragment fragment = (ThemedFragment) fm.findFragmentByTag(fragmentTag);
+ if (fragment != null) {
+ return fragment;
+ } else {
+ switch (fragmentTag) {
+ case DiasporaStreamFragment.TAG:
+ DiasporaStreamFragment dsf = new DiasporaStreamFragment();
+ fm.beginTransaction().add(dsf, fragmentTag).commit();
+ return dsf;
+ case BrowserFragment.TAG:
+ BrowserFragment bf = new BrowserFragment();
+ fm.beginTransaction().add(bf, fragmentTag).commit();
+ return bf;
+ case PodSelectionFragment.TAG:
+ PodSelectionFragment psf = new PodSelectionFragment();
+ fm.beginTransaction().add(psf, fragmentTag).commit();
+ return psf;
+ default:
+ AppLog.e(this, "Invalid Fragment Tag: " + fragmentTag
+ + "\nAdd Fragments Tag to getFragment()'s switch case.");
+ return getTopFragment();
+ }
}
-
- super.onConfigurationChanged(newConfig);
-
- // Load the layout resource for the new configuration
- setContentView(R.layout.main__activity);
-
- // Reinitialize the UI
- AppLog.v(this, "Rebuild the UI");
- setupUI(null);
}
- private void setupWebView(Bundle savedInstanceState) {
-
- webSettings = webView.getSettings();
- webSettings.setJavaScriptEnabled(true);
- webSettings.setAllowFileAccess(false);
- webSettings.setUseWideViewPort(true);
- webSettings.setLoadWithOverviewMode(true);
- webSettings.setDomStorageEnabled(true);
- webSettings.setMinimumFontSize(appSettings.getMinimumFontSize());
- webSettings.setLoadsImagesAutomatically(appSettings.isLoadImages());
- webSettings.setAppCacheEnabled(true);
-
- if (savedInstanceState != null) {
- AppLog.v(this, "restore WebView state");
- webView.restoreState(savedInstanceState);
+ /**
+ * Show DiasporaStreamFragment if necessary and load URL url
+ *
+ * @param url URL to load in the DiasporaStreamFragment
+ */
+ public void openDiasporaUrl(final String url) {
+ AppLog.v(this, "openDiasporaUrl()");
+ if (url != null && url.startsWith("http://127.0.0.1")) {
+ // This URL seems to be called somehow, but it doesn't make sense ;)
+ toolbarTop.postDelayed(() -> {
+ Intent i = new Intent(ACTION_OPEN_EXTERNAL_URL);
+ i.putExtra(EXTRA_URL, "https://github.com/gsantner/dandelion/blob/master/README.md");
+ LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(i);
+ }, 1000);
+ return;
}
-
- if (android.os.Build.VERSION.SDK_INT >= 21) {
- WebView.enableSlowWholeDocumentDraw();
- webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
+ if (_appSettings.getPod() != null && _appSettings.getPod().getPodUrl() != null && _appSettings.getPod().getPodUrl().getBaseUrl() != null
+ && url.startsWith(_appSettings.getPod().getPodUrl().getBaseUrl()) && !url.startsWith("https://dia.so/")) {
+ DiasporaStreamFragment streamFragment = (DiasporaStreamFragment) getFragment(DiasporaStreamFragment.TAG);
+ showFragment(streamFragment);
+ showLastVisitedTimestampMessageIfNeeded(url);
+ streamFragment.loadUrl(url);
+ } else {
+ toolbarTop.postDelayed(() -> {
+ Intent i = new Intent(ACTION_OPEN_EXTERNAL_URL);
+ i.putExtra(EXTRA_URL, url);
+ LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(i);
+ }, 1000);
}
-
- this.registerForContextMenu(webView);
- webView.setParentActivity(this);
- webView.setOverScrollMode(WebView.OVER_SCROLL_ALWAYS);
-
- // Setup WebView
- webView.addJavascriptInterface(new JavaScriptInterface(), "AndroidBridge");
-
- //Set proxy
- if (appSettings.isProxyEnabled()) {
- if (!setProxy())
- Toast.makeText(this, R.string.toast_set_proxy_failed, Toast.LENGTH_LONG).show();
- }
-
- /*
- * WebViewClient
- */
- webViewClient = new CustomWebViewClient(app, webView);
- webView.setWebViewClient(webViewClient);
-
- /*
- * WebChromeClient
- */
- webView.setWebChromeClient(new WebChromeClient() {
-
- public void onProgressChanged(WebView wv, int progress) {
- progressBar.setProgress(progress);
-
- if (progress > 0 && progress <= 60) {
- WebHelper.getUserProfile(wv);
- WebHelper.optimizeMobileSiteLayout(wv);
- }
-
- if (progress > 60) {
- WebHelper.optimizeMobileSiteLayout(wv);
-
- if (textToBeShared != null) {
- WebHelper.shareTextIntoWebView(wv, textToBeShared);
- }
- }
-
- progressBar.setVisibility(progress == 100 ? View.GONE : View.VISIBLE);
- }
-
- //For Android 4.1/4.2 only. DO NOT REMOVE!
- @SuppressWarnings("unused")
- protected void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture) {
- AppLog.v(this, "openFileChooser(ValCallback, String, String");
- imageUploadFilePathCallbackOld = uploadMsg;
- Intent intent = new Intent();
- intent.setType("image/*");
- intent.setAction(Intent.ACTION_GET_CONTENT);
- intent.putExtra("return-data", true);
- intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
- AppLog.v(this, "startActivityForResult");
- startActivityForResult(Intent.createChooser(intent, "Select Picture"), INPUT_FILE_REQUEST_CODE_OLD);
- }
-
- @Override
- public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, FileChooserParams fileChooserParams) {
- if (Build.VERSION.SDK_INT >= 23) {
- int hasWRITE_EXTERNAL_STORAGE = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
- if (hasWRITE_EXTERNAL_STORAGE != PackageManager.PERMISSION_GRANTED) {
- if (!shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
- new AlertDialog.Builder(MainActivity.this)
- .setMessage(R.string.permissions_image)
- .setNegativeButton(android.R.string.no, null)
- .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- if (android.os.Build.VERSION.SDK_INT >= 23)
- requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
- REQUEST_CODE_ASK_PERMISSIONS);
- }
- })
- .show();
- return false;
- }
- requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
- REQUEST_CODE_ASK_PERMISSIONS);
- return false;
- }
- }
-
- AppLog.v(MainActivity.this, "onOpenFileChooser");
- imageUploadFilePathCallbackNew = filePathCallback;
-
- Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
- if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
- // Create the File where the photo should go
- File photoFile;
- try {
- photoFile = Helpers.createImageFile();
- takePictureIntent.putExtra("PhotoPath", mCameraPhotoPath);
- } catch (IOException ex) {
- AppLog.e(this, "ERROR creating temp file: " + ex.toString());
- // Error occurred while creating the File
- Snackbar.make(contentLayout, R.string.unable_to_load_image, Snackbar.LENGTH_LONG).show();
- return false;
- }
-
- // Continue only if the File was successfully created
- if (photoFile != null) {
- mCameraPhotoPath = "file:" + photoFile.getAbsolutePath();
- takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
- Uri.fromFile(photoFile));
- } else {
- takePictureIntent = null;
- }
- }
-
- Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
- contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
- contentSelectionIntent.setType("image/*");
-
- Intent[] intentArray;
- if (takePictureIntent != null) {
- intentArray = new Intent[]{takePictureIntent};
- } else {
- intentArray = new Intent[0];
- }
-
- Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
- chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
- chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser");
- chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);
-
- AppLog.v(this, "startActivityForResult");
- startActivityForResult(chooserIntent, INPUT_FILE_REQUEST_CODE_NEW);
- return true;
- }
- });
}
+ public void showLastVisitedTimestampMessageIfNeeded(String url) {
+ if (url.equals(urls.getStreamUrl()) && diasporaUserProfile.hasLastVisitedTimestampInStream()) {
+ snackbarLastVisitedTimestampInStream.show();
+ diasporaUserProfile.resetLastVisitedPositionInStream();
+ }
+ }
+
+ /**
+ * Show the Fragment fragment in R.id.fragment_container. If the fragment was already visible, do nothing.
+ *
+ * @param fragment Fragment to show
+ */
+ protected void showFragment(ThemedFragment fragment) {
+ if (PodSelectionFragment.TAG.equals(fragment.getTag())) {
+ Fragment fragment1 = fm.findFragmentByTag(DiasporaStreamFragment.TAG);
+ if (fragment1 != null) {
+ new net.gsantner.opoc.util.ContextUtils(this).restartApp(MainActivity.class);
+ }
+ }
+
+ AppLog.v(this, "showFragment()");
+ ThemedFragment currentTop = (ThemedFragment) fm.findFragmentById(R.id.fragment_container);
+ if (currentTop == null || !currentTop.getFragmentTag().equals(fragment.getFragmentTag())) {
+ AppLog.v(this, "Fragment was not visible. Replace it.");
+ fm.beginTransaction().addToBackStack(null).replace(R.id.fragment_container, fragment, fragment.getFragmentTag()).commit();
+ invalidateOptionsMenu();
+ setToolbarIntellihide(_appSettings.isIntellihideToolbars() && fragment.isAllowedIntellihide());
+ } else {
+ AppLog.v(this, "Fragment was already visible. Do nothing.");
+ }
+ }
+
+ /**
+ * Initialize the navigation slider
+ */
private void setupNavigationSlider() {
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
- this, navDrawer, toolbarTop, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
+ this, navDrawer, toolbarTop, R.string.open_navdrawer, R.string.close_navdrawer);
navDrawer.addDrawerListener(toggle);
toggle.syncState();
@@ -490,15 +396,14 @@ public class MainActivity extends AppCompatActivity
navView.setNavigationItemSelectedListener(this);
View navHeader = navView.getHeaderView(0);
- LinearLayout navheaderProfileSection = ButterKnife.findById(navHeader, R.id.nav_profile_picture);
- navheaderProfileSection.setOnClickListener(new View.OnClickListener() {
- @Override
+ navProfilePictureArea = ButterKnife.findById(navHeader, R.id.nav_profile_picture);
+ navDrawerLayout = ButterKnife.findById(navHeader, R.id.nav_drawer);
+ //Handle clicks on profile picture
+ navProfilePictureArea.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
navDrawer.closeDrawer(GravityCompat.START);
- if (WebHelper.isOnline(MainActivity.this)) {
- webView.loadUrlNew(urls.getProfileUrl());
- } else {
- snackbarNoInternet.show();
+ if (!_appSettings.getProfileId().equals("")) {
+ openDiasporaUrl(urls.getProfileUrl());
}
}
});
@@ -506,13 +411,13 @@ public class MainActivity extends AppCompatActivity
navheaderDescription = ButterKnife.findById(navHeader, R.id.podselection__podupti_notice);
navheaderImage = ButterKnife.findById(navHeader, R.id.navheader_user_image);
- if (!appSettings.getName().equals("")) {
- navheaderTitle.setText(appSettings.getName());
+ if (!_appSettings.getName().equals("")) {
+ navheaderTitle.setText(_appSettings.getName());
}
- if (!appSettings.getPodDomain().equals("")) {
- navheaderDescription.setText(appSettings.getPodDomain());
+ if (_appSettings.getPod() != null) {
+ navheaderDescription.setText(_appSettings.getPod().getName());
}
- String avatarUrl = appSettings.getAvatarUrl();
+ String avatarUrl = _appSettings.getAvatarUrl();
if (!avatarUrl.equals("")) {
//Display app launcher icon instead of default avatar asset
//(Which would by the way not load because of missing pod domain prefix in the url)
@@ -528,34 +433,69 @@ public class MainActivity extends AppCompatActivity
}
}
}
-
- // Set visibility
- Menu navMenu = navView.getMenu();
- navMenu.findItem(R.id.nav_exit).setVisible(appSettings.isVisibleInNavExit());
- navMenu.findItem(R.id.nav_activities).setVisible(appSettings.isVisibleInNavActivities());
- navMenu.findItem(R.id.nav_aspects).setVisible(appSettings.isVisibleInNavAspects());
- navMenu.findItem(R.id.nav_commented).setVisible(appSettings.isVisibleInNavCommented());
- navMenu.findItem(R.id.nav_followed_tags).setVisible(appSettings.isVisibleInNavFollowed_tags());
- navMenu.findItem(R.id.nav_help_license).setVisible(appSettings.isVisibleInNavHelp_license());
- navMenu.findItem(R.id.nav_liked).setVisible(appSettings.isVisibleInNavLiked());
- navMenu.findItem(R.id.nav_mentions).setVisible(appSettings.isVisibleInNavMentions());
- navMenu.findItem(R.id.nav_profile).setVisible(appSettings.isVisibleInNavProfile());
- navMenu.findItem(R.id.nav_public).setVisible(appSettings.isVisibleInNavPublic_activities());
+ updateNavigationViewEntryVisibilities();
}
- @OnClick(R.id.toolbar)
+ protected void updateNavigationViewEntryVisibilities() {
+ Menu navMenu = navView.getMenu();
+
+ // Initially show all items visible when logged in
+ navMenu.setGroupVisible(navMenu.findItem(R.id.nav_exit).getGroupId(), true);
+
+ // Hide by app settings
+ navMenu.findItem(R.id.nav_exit).setVisible(_appSettings.isVisibleInNavExit());
+ navMenu.findItem(R.id.nav_activities).setVisible(_appSettings.isVisibleInNavActivities());
+ navMenu.findItem(R.id.nav_aspects).setVisible(_appSettings.isVisibleInNavAspects());
+ navMenu.findItem(R.id.nav_contacts).setVisible(_appSettings.isVisibleInNavContacts());
+ navMenu.findItem(R.id.nav_commented).setVisible(_appSettings.isVisibleInNavCommented());
+ navMenu.findItem(R.id.nav_followed_tags).setVisible(_appSettings.isVisibleInNavFollowed_tags());
+ navMenu.findItem(R.id.nav_about).setVisible(_appSettings.isVisibleInNavHelp_license());
+ navMenu.findItem(R.id.nav_liked).setVisible(_appSettings.isVisibleInNavLiked());
+ navMenu.findItem(R.id.nav_mentions).setVisible(_appSettings.isVisibleInNavMentions());
+ navMenu.findItem(R.id.nav_profile).setVisible(_appSettings.isVisibleInNavProfile());
+ navMenu.findItem(R.id.nav_public).setVisible(_appSettings.isVisibleInNavPublic_activities());
+ navMenu.findItem(R.id.nav_stream).setVisible(true);
+ navMenu.findItem(R.id.nav_statistics).setVisible(_appSettings.isVisibleInNavStatistics());
+ navMenu.findItem(R.id.nav_reports).setVisible(_appSettings.isVisibleInNavReports());
+ navMenu.findItem(R.id.nav_toggle_desktop_page).setVisible(_appSettings.isVisibleInNavToggleMobileDesktop());
+ navMenu.findItem(R.id.nav_product_support).setVisible(_appSettings.isVisibleInNavGsantnerAccount());
+
+
+ // Hide whole group (for logged in use) if no pod was selected
+ if (!_appSettings.hasPod()) {
+ navMenu.setGroupVisible(navMenu.findItem(R.id.nav_exit).getGroupId(), false);
+ }
+ }
+
+ /**
+ * Open Stream when clicked on top _toolbar AND preference stream shortcut is true
+ *
+ * @param view selected view
+ */
+ @OnClick(R.id.main__topbar)
public void onToolBarClicked(View view) {
AppLog.i(this, "onToolBarClicked()");
- onNavigationItemSelected(navView.getMenu().findItem(R.id.nav_stream));
+ if (_appSettings.isTopbarStreamShortcutEnabled() && _appSettings.hasPod()) {
+ onNavigationItemSelected(navView.getMenu().findItem(R.id.nav_stream));
+ }
}
+ /**
+ * Forward incoming intents to handleIntent()
+ *
+ * @param intent incoming
+ */
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
-
handleIntent(intent);
}
+ /**
+ * Handle intents and execute intent specific actions
+ *
+ * @param intent intent to get handled
+ */
private void handleIntent(Intent intent) {
AppLog.i(this, "handleIntent()");
if (intent == null) {
@@ -567,7 +507,9 @@ public class MainActivity extends AppCompatActivity
String type = intent.getType();
String loadUrl = null;
AppLog.v(this, "Action: " + action + " Type: " + type);
- if (ACTION_OPEN_URL.equals(action)) {
+ if (Intent.ACTION_MAIN.equals(action)) {
+ loadUrl = urls.getStreamUrl();
+ } else if (ACTION_OPEN_URL.equals(action)) {
loadUrl = intent.getStringExtra(URL_MESSAGE);
} else if (Intent.ACTION_VIEW.equals(action) && intent.getDataString() != null) {
Uri data = intent.getData();
@@ -576,18 +518,31 @@ public class MainActivity extends AppCompatActivity
return;
} else {
loadUrl = intent.getDataString();
+ AppLog.v(this, "Intent has a delicious URL for us: " + loadUrl);
}
} else if (ACTION_CHANGE_ACCOUNT.equals(action)) {
- AppLog.v(this, "Reset pod data and animate to PodSelectionActivity");
- app.resetPodData(webView);
- Helpers.animateToActivity(MainActivity.this, PodSelectionActivity.class, true);
+ AppLog.v(this, "Reset pod data and show PodSelectionFragment");
+ _appSettings.setPod(null);
+ runOnUiThread(new Runnable() {
+ public void run() {
+ navheaderTitle.setText(R.string.app_name);
+ navheaderDescription.setText(R.string.app_subtitle);
+ navheaderImage.setImageResource(R.drawable.ic_launcher);
+ app.resetPodData(((DiasporaStreamFragment) getFragment(DiasporaStreamFragment.TAG)).getWebView());
+ }
+ });
+ showFragment(getFragment(PodSelectionFragment.TAG));
} else if (ACTION_CLEAR_CACHE.equals(action)) {
AppLog.v(this, "Clear WebView cache");
- webView.clearCache(true);
- } else if (ACTION_RELOAD_ACTIVITY.equals(action)) {
- AppLog.v(this, "Recreate activity");
- recreate();
- return;
+ runOnUiThread(new Runnable() {
+ public void run() {
+ ContextMenuWebView wv = ((DiasporaStreamFragment) getFragment(DiasporaStreamFragment.TAG)).getWebView();
+ if (wv != null) {
+ wv.clearCache(true);
+ }
+ }
+ });
+
} else if (Intent.ACTION_SEND.equals(action) && type != null) {
switch (type) {
case "text/plain":
@@ -602,101 +557,57 @@ public class MainActivity extends AppCompatActivity
break;
}
} else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) {
- //TODO: Implement and add filter to manifest
+ /* TODO: Implement and add filter to manifest */
+ return;
+ } else if ("sc_new_post".equals(action)) {
+ openDiasporaUrl(urls.getNewPostUrl());
+ return;
+ } else if ("sc_activities".equals(action)) {
+ openDiasporaUrl(urls.getActivityUrl());
+ return;
+ } else if ("sc_contacts".equals(action)) {
+ onNavigationItemSelected(navView.getMenu().findItem(R.id.nav_aspects));
+ return;
+ } else if ("sc_tags".equals(action)) {
+ onNavigationItemSelected(navView.getMenu().findItem(R.id.nav_followed_tags));
+ return;
+ }
+ //Catch split screen recreation
+ if (action != null && action.equals(Intent.ACTION_MAIN) && getTopFragment() != null) {
+ return;
}
if (loadUrl != null) {
- webView.stopLoading();
navDrawer.closeDrawers();
- webView.loadUrlNew(loadUrl);
+ openDiasporaUrl(loadUrl);
}
}
+ /**
+ * Handle activity results
+ *
+ * @param requestCode reqCode
+ * @param resultCode resCode
+ * @param data data
+ */
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
- AppLog.v(this, "onActivityResult()");
- switch (requestCode) {
- case INPUT_FILE_REQUEST_CODE_NEW: {
- AppLog.v(this, "Upload image using recent method (Lollipop+)");
- if (imageUploadFilePathCallbackNew == null || resultCode != Activity.RESULT_OK) {
- AppLog.e(this, "Callback is null: " + (imageUploadFilePathCallbackNew == null)
- + " resultCode: " + resultCode);
- if(imageUploadFilePathCallbackNew != null)
- imageUploadFilePathCallbackNew.onReceiveValue(new Uri[]{});
- return;
- }
- Uri[] results = null;
- if (data == null) {
- if (mCameraPhotoPath != null) {
- AppLog.v(this, "Intent data is null. Try to parse cameraPhotoPath");
- results = new Uri[]{Uri.parse(mCameraPhotoPath)};
- } else {
- AppLog.w(this, "Intent data is null and cameraPhotoPath is null");
- }
- } else {
- String dataString = data.getDataString();
- if (dataString != null) {
- AppLog.v(this, "Intent has data. Try to parse dataString");
- results = new Uri[]{Uri.parse(dataString)};
- }
- AppLog.w(this, "dataString is null");
- }
- AppLog.v(this, "handle received result over to callback");
- imageUploadFilePathCallbackNew.onReceiveValue(results);
- imageUploadFilePathCallbackNew = null;
- return;
- }
- case INPUT_FILE_REQUEST_CODE_OLD: {
- AppLog.v(this, "Upload image using legacy method (Jelly Bean, Kitkat)");
- if (imageUploadFilePathCallbackOld == null || resultCode != Activity.RESULT_OK) {
- AppLog.e(this, "Callback is null: " + (imageUploadFilePathCallbackOld == null)
- + " resultCode: " + resultCode);
- if(imageUploadFilePathCallbackOld != null)
- imageUploadFilePathCallbackOld.onReceiveValue(null);
- return;
- }
- Uri results = null;
- if (data == null) {
- if (mCameraPhotoPath != null) {
- AppLog.v(this, "Intent has no data. Try to parse cameraPhotoPath");
- results = Uri.parse(mCameraPhotoPath);
- } else {
- AppLog.w(this, "Intent has no data and cameraPhotoPath is null");
- }
- } else {
- String dataString = data.getDataString();
- if (dataString != null) {
- AppLog.v(this, "Intent has data. Try to parse dataString");
- results = Uri.parse(dataString);
- } else {
- AppLog.w(this, "dataString is null");
- }
- }
- AppLog.v(this, "handle received result over to callback");
- imageUploadFilePathCallbackOld.onReceiveValue(results);
- imageUploadFilePathCallbackOld = null;
- return;
- }
- }
+ AppLog.v(this, "onActivityResult(): " + requestCode);
super.onActivityResult(requestCode, resultCode, data);
}
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- AppLog.v(this, "onSaveInstanceState()");
- super.onSaveInstanceState(outState);
- AppLog.v(this, "Save WebView state");
- webView.saveState(outState);
- }
-
- @Override
- protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
- AppLog.v(this, "onRestoreInstanceState()");
- super.onRestoreInstanceState(savedInstanceState);
- AppLog.v(this, "Restore state of WebView");
- webView.restoreState(savedInstanceState);
+ /**
+ * Return the fragment which is currently displayed in R.id.fragment_container
+ *
+ * @return top fragment or null if there is none displayed
+ */
+ private ThemedFragment getTopFragment() {
+ return (ThemedFragment) fm.findFragmentById(R.id.fragment_container);
}
+ /**
+ * Handle presses on the back button
+ */
@Override
public void onBackPressed() {
AppLog.v(this, "onBackPressed()");
@@ -704,10 +615,22 @@ public class MainActivity extends AppCompatActivity
navDrawer.closeDrawer(navView);
return;
}
-
- if (webView.canGoBack()) {
- webView.goBack();
- return;
+ ThemedFragment top = getTopFragment();
+ if (top != null) {
+ AppLog.v(this, "Top Fragment is not null");
+ if (!top.onBackPressed()) {
+ AppLog.v(this, "Top Fragment.onBackPressed was false");
+ AppLog.v(this, "BackStackEntryCount: " + fm.getBackStackEntryCount());
+ if (fm.getBackStackEntryCount() > 0) {
+ fm.popBackStack();
+ } else {
+ snackbarExitApp.show();
+ }
+ return;
+ } else {
+ AppLog.v(this, "Top Fragment.onBackPressed was true");
+ return;
+ }
}
if (!snackbarExitApp.isShown()) {
@@ -743,38 +666,154 @@ public class MainActivity extends AppCompatActivity
AppLog.v(this, "Register BroadcastReceivers");
LocalBroadcastManager.getInstance(this).registerReceiver(brSetTitle, new IntentFilter(ACTION_UPDATE_TITLE_FROM_URL));
LocalBroadcastManager.getInstance(this).registerReceiver(brOpenExternalLink, new IntentFilter(ACTION_OPEN_EXTERNAL_URL));
+ invalidateOptionsMenu();
+ _appSettings = getAppSettings();
+ if (_appSettings.isRecreateMainActivity()) {
+ recreate();
+ }
+ setToolbarIntellihide(_appSettings.isIntellihideToolbars());
+ if (getSupportActionBar() != null) {
+ getSupportActionBar().setDisplayShowTitleEnabled(AppSettings.get().isShowTitleInMainView());
+ }
+ updateNavigationViewEntryVisibilities();
}
+ /**
+ * Clear and repopulate top and bottom _toolbar.
+ * Also add menu items of the displayed fragment
+ *
+ * @param menu top _toolbar
+ * @return boolean
+ */
@Override
public boolean onCreateOptionsMenu(Menu menu) {
AppLog.v(this, "onCreateOptionsMenu()");
- getMenuInflater().inflate(R.menu.main__menu_top, menu);
+ boolean cache;
+
+ //Clear the menus
+ menu.clear();
+
+ ThemedFragment top = getTopFragment();
+ if (top != null) {
+ if (!top.getFragmentTag().equals(PodSelectionFragment.TAG)) {
+ cache = _appSettings.isExtendedNotificationsActivated();
+ getMenuInflater().inflate(R.menu.main__menu_top, menu);
+ menu.findItem(R.id.action_notifications).setVisible(!cache);
+ menu.findItem(R.id.action_notifications_extended).setVisible(cache);
+ }
+ }
+
+ ContextUtils cu = ContextUtils.get();
+ final boolean darkBg = cu.get().shouldColorOnTopBeLight(AppSettings.get().getPrimaryColor());
+ cu.tintMenuItems(menu, true, ContextCompat.getColor(this, darkBg ? R.color.white : R.color.black));
+ cu.setSubMenuIconsVisiblity(menu, true);
+
return true;
}
+ /**
+ * Set the notification and messages counter in the top _toolbar
+ *
+ * @param menu menu
+ * @return boolean
+ */
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem item;
+ updateNavigationViewEntryVisibilities();
if ((item = menu.findItem(R.id.action_notifications)) != null) {
LayerDrawable icon = (LayerDrawable) item.getIcon();
- BadgeDrawable.setBadgeCount(this, icon, podUserProfile.getNotificationCount());
+ BadgeDrawable.setBadgeCount(this, icon, diasporaUserProfile.getNotificationCount());
}
if ((item = menu.findItem(R.id.action_conversations)) != null) {
LayerDrawable icon = (LayerDrawable) item.getIcon();
- BadgeDrawable.setBadgeCount(this, icon, podUserProfile.getUnreadMessagesCount());
+ BadgeDrawable.setBadgeCount(this, icon, diasporaUserProfile.getUnreadMessagesCount());
}
return super.onPrepareOptionsMenu(menu);
}
+ /**
+ * Handle clicks on the optionsmenu
+ *
+ * @param item item
+ * @return boolean
+ */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
AppLog.i(this, "onOptionsItemSelected()");
switch (item.getItemId()) {
case R.id.action_notifications: {
+ if (_appSettings.isExtendedNotificationsActivated()) {
+ return true;
+ }
+ //Otherwise we execute the action of action_notifications_all
+ }
+ case R.id.action_notifications_all: {
if (WebHelper.isOnline(MainActivity.this)) {
- webView.loadUrlNew(urls.getNotificationsUrl());
+ openDiasporaUrl(urls.getNotificationsUrl());
+ return true;
+ } else {
+ snackbarNoInternet.show();
+ return false;
+ }
+ }
+
+
+ case R.id.action_notifications_also_commented: {
+ if (WebHelper.isOnline(MainActivity.this)) {
+ openDiasporaUrl(urls.getSuburlNotificationsAlsoCommentedUrl());
+ return true;
+ } else {
+ snackbarNoInternet.show();
+ return false;
+ }
+ }
+
+ case R.id.action_notifications_comment_on_post: {
+ if (WebHelper.isOnline(MainActivity.this)) {
+ openDiasporaUrl(urls.getSuburlNotificationsCommentOnPostUrl());
+ return true;
+ } else {
+ snackbarNoInternet.show();
+ return false;
+ }
+ }
+
+ case R.id.action_notifications_liked: {
+ if (WebHelper.isOnline(MainActivity.this)) {
+ openDiasporaUrl(urls.getSuburlNotificationsLikedUrl());
+ return true;
+ } else {
+ snackbarNoInternet.show();
+ return false;
+ }
+ }
+
+ case R.id.action_notifications_mentioned: {
+ if (WebHelper.isOnline(MainActivity.this)) {
+ openDiasporaUrl(urls.getSuburlNotificationsMentionedUrl());
+ return true;
+ } else {
+ snackbarNoInternet.show();
+ return false;
+ }
+ }
+
+ case R.id.action_notifications_reshared: {
+ if (WebHelper.isOnline(MainActivity.this)) {
+ openDiasporaUrl(urls.getSuburlNotificationsResharedUrl());
+ return true;
+ } else {
+ snackbarNoInternet.show();
+ return false;
+ }
+ }
+
+ case R.id.action_notifications_started_sharing: {
+ if (WebHelper.isOnline(MainActivity.this)) {
+ openDiasporaUrl(urls.getSuburlNotificationsStartedSharingUrl());
return true;
} else {
snackbarNoInternet.show();
@@ -784,7 +823,7 @@ public class MainActivity extends AppCompatActivity
case R.id.action_conversations: {
if (WebHelper.isOnline(MainActivity.this)) {
- webView.loadUrlNew(urls.getConversationsUrl());
+ openDiasporaUrl(urls.getConversationsUrl());
return true;
} else {
snackbarNoInternet.show();
@@ -792,88 +831,43 @@ public class MainActivity extends AppCompatActivity
}
}
- case R.id.action_reload: {
- if (WebHelper.isOnline(MainActivity.this)) {
- webView.reload();
- return true;
- } else {
- snackbarNoInternet.show();
- return false;
- }
- }
-
- case R.id.action_exit: {
- moveTaskToBack(true);
- finish();
- return true;
- }
-
- case R.id.action_toggle_desktop_page: {
- webView.loadUrlNew(urls.getToggleMobileUrl());
- return true;
- }
-
case R.id.action_compose: {
if (WebHelper.isOnline(MainActivity.this)) {
- webView.loadUrlNew(urls.getNewPostUrl());
+ openDiasporaUrl(urls.getNewPostUrl());
} else {
snackbarNoInternet.show();
}
return true;
}
- case R.id.action_go_to_top: {
- // Scroll to top (animated)
- ObjectAnimator anim = ObjectAnimator.ofInt(webView, "scrollY", webView.getScrollY(), 0);
- anim.setDuration(400);
- anim.start();
- return true;
- }
-
- case R.id.action_share_link: {
- Intent sharingIntent = new Intent(Intent.ACTION_SEND);
- sharingIntent.setType("text/plain");
- sharingIntent.putExtra(Intent.EXTRA_SUBJECT, webView.getTitle());
- sharingIntent.putExtra(Intent.EXTRA_TEXT, webView.getUrl());
- startActivity(Intent.createChooser(sharingIntent, getResources().getString(R.string.action_share_dotdotdot)));
- return true;
- }
-
- case R.id.action_take_screenshot: {
- makeScreenshotOfWebView(false);
- return true;
- }
-
- case R.id.action_share_screenshot: {
- makeScreenshotOfWebView(true);
- return true;
- }
-
case R.id.action_search: {
if (WebHelper.isOnline(MainActivity.this)) {
final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
- View layout = getLayoutInflater().inflate(R.layout.dialog_search__people_tags, null, false);
- final EditText input = (EditText) layout.findViewById(R.id.dialog_search__input);
+ @SuppressLint("InflateParams") View layout = getLayoutInflater().inflate(R.layout.ui__dialog_search__people_tags, null, false);
+ final EditText input = layout.findViewById(R.id.dialog_search__input);
+ input.setMaxLines(1);
+ input.setSingleLine(true);
+ ThemeHelper.updateEditTextColor(input);
final DialogInterface.OnClickListener clickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
String query = input.getText().toString().trim().replaceAll((which == DialogInterface.BUTTON_NEGATIVE ? "\\*" : "\\#"), "");
if (query.equals("")) {
- Snackbar.make(contentLayout, R.string.search_alert_bypeople_validate_needsomedata, Snackbar.LENGTH_LONG).show();
+ Snackbar.make(fragmentContainer, R.string.please_add_a_name, Snackbar.LENGTH_LONG).show();
} else {
- webView.loadUrl(which == DialogInterface.BUTTON_NEGATIVE ? urls.getSearchPeopleUrl(query) : urls.getSearchTagsUrl(query));
+ openDiasporaUrl(which == DialogInterface.BUTTON_NEGATIVE ? urls.getSearchPeopleUrl(query) : urls.getSearchTagsUrl(query));
}
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
imm.hideSoftInputFromWindow(input.getWindowToken(), 0);
}
};
- final android.support.v7.app.AlertDialog dialog = new android.support.v7.app.AlertDialog.Builder(this)
+ final AlertDialog dialog = new ThemedAlertDialogBuilder(this, _appSettings)
.setView(layout).setTitle(R.string.search_alert_title)
.setCancelable(true)
- .setPositiveButton(R.string.search_alert_tag, clickListener)
- .setNegativeButton(R.string.search_alert_people, clickListener)
+ .setPositiveButton(R.string.by_tags, clickListener)
+ .setNegativeButton(R.string.by_people, clickListener)
.create();
input.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@@ -903,100 +897,25 @@ public class MainActivity extends AppCompatActivity
return super.onOptionsItemSelected(item);
}
- @SuppressWarnings("ResultOfMethodCallIgnored")
- private boolean makeScreenshotOfWebView(boolean hasToShareScreenshot) {
- AppLog.i(this, "makeScreenshotOfWebView()");
- if (android.os.Build.VERSION.SDK_INT >= 23) {
- int hasWRITE_EXTERNAL_STORAGE = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
- if (hasWRITE_EXTERNAL_STORAGE != PackageManager.PERMISSION_GRANTED) {
- if (!shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
- new AlertDialog.Builder(MainActivity.this)
- .setMessage(R.string.permissions_screenshot)
- .setNegativeButton(android.R.string.no, null)
- .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- if (android.os.Build.VERSION.SDK_INT >= 23)
- requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
- REQUEST_CODE_ASK_PERMISSIONS);
- }
- })
- .show();
- return false;
- }
- requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
- REQUEST_CODE_ASK_PERMISSIONS);
- return false;
- }
- }
-
- Date dateNow = new Date();
- DateFormat dateFormat = new SimpleDateFormat("yy_MM_dd--HH_mm_ss", Locale.getDefault());
- File fileSaveDirectory = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/Diaspora");
-
- String fileSaveName = hasToShareScreenshot ? ".DfA_share.jpg" : String.format("DfA_%s.jpg", dateFormat.format(dateNow));
- if (!fileSaveDirectory.exists()) {
- if (!fileSaveDirectory.mkdirs()) {
- AppLog.w(this, "Could not mkdir " + fileSaveDirectory.getAbsolutePath());
- }
- }
-
- if (!hasToShareScreenshot) {
- Snackbar.make(contentLayout, getString(R.string.share__toast_screenshot) + " " + fileSaveName, Snackbar.LENGTH_LONG).show();
- }
-
- Bitmap bitmap;
- webView.setDrawingCacheEnabled(true);
- bitmap = Bitmap.createBitmap(webView.getDrawingCache());
- webView.setDrawingCacheEnabled(false);
-
- OutputStream bitmapWriter = null;
- try {
- bitmapWriter = new FileOutputStream(new File(fileSaveDirectory, fileSaveName));
- bitmap.compress(Bitmap.CompressFormat.JPEG, 85, bitmapWriter);
- bitmapWriter.flush();
- bitmap.recycle();
- } catch (Exception e) {
- return false;
- } finally {
- if (bitmapWriter != null) {
- try {
- bitmapWriter.close();
- } catch (IOException _ignSaveored) {/* Nothing */}
- }
- }
-
- // Only show share intent when Action Share Screenshot was selected
- if (hasToShareScreenshot) {
- Intent sharingIntent = new Intent(Intent.ACTION_SEND);
- sharingIntent.setType("image/jpeg");
- sharingIntent.putExtra(Intent.EXTRA_SUBJECT, webView.getTitle());
- sharingIntent.putExtra(Intent.EXTRA_TEXT, webView.getUrl());
- Uri bmpUri = Uri.fromFile(new File(fileSaveDirectory, fileSaveName));
- sharingIntent.putExtra(Intent.EXTRA_STREAM, bmpUri);
- startActivity(Intent.createChooser(sharingIntent, getString(R.string.action_share_dotdotdot)));
- } else {
- // Broadcast that this file is indexable
- File file = new File(fileSaveDirectory, fileSaveName);
- Uri uri = Uri.fromFile(file);
- Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
- sendBroadcast(intent);
- }
- return true;
- }
-
@Override
- public void onUserProfileNameChanged(String name) {
+ public void onUserProfileNameChanged(DiasporaUserProfile diasporaUserProfile, String name) {
AppLog.i(this, "onUserProfileNameChanged()");
+ // Update the profile name in the navigation slider
navheaderTitle.setText(name);
}
@Override
- public void onUserProfileAvatarChanged(String avatarUrl) {
+ public void onUserProfileAvatarChanged(DiasporaUserProfile diasporaUserProfile, String avatarUrl) {
AppLog.i(this, "onUserProfileAvatarChanged()");
+ // Update the profile picture in the navigation slider
app.getAvatarImageLoader().startImageDownload(navheaderImage, avatarUrl);
}
+ /**
+ * Handle hashtag clicks. Open the new-post-url and inject the clicked hashtag into the post-editor
+ *
+ * @param intent intent
+ */
private void handleHashtag(Intent intent) {
AppLog.v(this, "handleHashtag()");
try {
@@ -1004,18 +923,22 @@ public class MainActivity extends AppCompatActivity
} catch (Exception e) {
AppLog.e(this, e.toString());
}
- webView.loadUrlNew(urls.getNewPostUrl());
+ openDiasporaUrl(urls.getNewPostUrl());
}
+ /**
+ * Open the new-post-url and inject text that was shared into the app into the post editors text field
+ *
+ * @param intent shareTextIntent
+ */
private void handleSendText(Intent intent) {
AppLog.v(this, "handleSendText()");
try {
setSharedTexts(null, intent.getStringExtra(Intent.EXTRA_TEXT));
+ openDiasporaUrl(urls.getNewPostUrl());
} catch (Exception e) {
AppLog.e(this, e.toString());
}
- webView.loadUrlNew(urls.getBlankUrl());
- webView.loadUrlNew(urls.getNewPostUrl());
}
/**
@@ -1027,14 +950,14 @@ public class MainActivity extends AppCompatActivity
AppLog.v(this, "handleSendSubject()");
try {
setSharedTexts(intent.getStringExtra(Intent.EXTRA_SUBJECT), intent.getStringExtra(Intent.EXTRA_TEXT));
+ openDiasporaUrl(urls.getNewPostUrl());
} catch (Exception e) {
AppLog.e(this, e.toString());
}
- webView.loadUrlNew(urls.getBlankUrl()); //TODO: Necessary?
- webView.loadUrlNew(urls.getNewPostUrl());
}
/**
+ * TODO: MOVE
* Set sharedText variable to escaped and formatted subject + body.
* If subject is null, only the body will be set. Else the subject will be set as header.
* Depending on whether the user has the setting isAppendSharedViaApp set, a reference to
@@ -1046,77 +969,75 @@ public class MainActivity extends AppCompatActivity
private void setSharedTexts(String sharedSubject, String sharedBody) {
AppLog.i(this, "setSharedTexts()");
String body = WebHelper.replaceUrlWithMarkdown(sharedBody);
- if (appSettings.isAppendSharedViaApp()) {
+ if (_appSettings.isAppendSharedViaApp()) {
AppLog.v(this, "Append app reference to shared text");
- body = body + "\n\n" + getString(R.string.shared_by_diaspora_android);
+ body = body + "\n\n" + getString(R.string.shared_via_app);
}
final String escapedBody = WebHelper.escapeHtmlText(body);
if (sharedSubject != null) {
AppLog.v(this, "Append subject to shared text");
String escapedSubject = WebHelper.escapeHtmlText(WebHelper.replaceUrlWithMarkdown(sharedSubject));
+ AppLog.v(this, "Set shared text; Subject: \"" + escapedSubject + "\" Body: \"" + escapedBody + "\"");
textToBeShared = "**" + escapedSubject + "** " + escapedBody;
} else {
- AppLog.v(this, "Set shared text; Subject: \"" + sharedSubject + "\" Body: \"" + sharedBody + "\"");
+ AppLog.v(this, "Set shared text; Subject: \"null\" Body: \"" + sharedBody + "\"");
textToBeShared = escapedBody;
}
-
-
}
- //TODO: Implement?
+ /**
+ * Share an image shared to the app via diaspora
+ *
+ * @param intent shareImageIntent
+ */
+ //TODO: Implement some day
private void handleSendImage(Intent intent) {
AppLog.i(this, "handleSendImage()");
final Uri imageUri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
if (imageUri != null) {
AppLog.v(this, "imageUri is not null. Handle shared image");
- // TODO: Update UI to reflect text being shared
} else {
AppLog.w(this, "imageUri is null. Cannot precede.");
}
Toast.makeText(this, "Not yet implemented.", Toast.LENGTH_SHORT).show();
}
- // TODO: Move from Javascript interface
@Override
- public void onNotificationCountChanged(int notificationCount) {
+ public void onNotificationCountChanged(DiasporaUserProfile diasporaUserProfile, int notificationCount) {
AppLog.i(this, "onNotificationCountChanged()");
- // Count saved in PodUserProfile
+ // Count saved in DiasporaUserProfile
+ // Invalidate the top _toolbar to update the unread messages counter
invalidateOptionsMenu();
-
- if (notificationCount > 0 && !snackbarNewNotification.isShown()
- && !webView.getUrl().equals(urls.getNotificationsUrl())) {
- snackbarNewNotification.show();
- }
}
- // TODO: Move from Javascript interface
+
@Override
- public void onUnreadMessageCountChanged(int unreadMessageCount) {
+ public void onUnreadMessageCountChanged(DiasporaUserProfile diasporaUserProfile, int unreadMessageCount) {
AppLog.i(this, "onUnreadMessageCountChanged()");
- // Count saved in PodUserProfile
+ // Count saved in DiasporaUserProfile
+ // Invalidate the top _toolbar to update the unread messages counter
invalidateOptionsMenu();
- if (unreadMessageCount > 0 && !snackbarNewNotification.isShown()
- && !webView.getUrl().equals(urls.getNotificationsUrl())) {
- snackbarNewNotification.show();
+ }
+
+ @Override
+ public void onCustomTabsConnected() {
+ if (customTabsSession == null) {
+ AppLog.i(this, "CustomTabs warmup: " + customTabActivityHelper.warmup(0));
+ customTabsSession = customTabActivityHelper.getSession();
}
}
- private class JavaScriptInterface {
- @JavascriptInterface
- public void setUserProfile(final String webMessage) throws JSONException {
- AppLog.spam(this, "JavaScriptInterface.setUserProfile()");
- if (podUserProfile.isRefreshNeeded()) {
- AppLog.spam(this, "PodUserProfile needs refresh; Try to parse JSON");
- podUserProfile.parseJson(webMessage);
- } else {
- AppLog.spam(this, "No PodUserProfile refresh needed");
- }
+ @Override
+ public void onPodSelectionDialogResult(DiasporaPodList.DiasporaPod pod, boolean accepted) {
+ if (accepted) {
+ invalidateOptionsMenu();
+ navheaderDescription.setText(pod.getName());
}
+ }
+
+ @Override
+ public void onCustomTabsDisconnected() {
- @JavascriptInterface
- public void contentHasBeenShared() {
- textToBeShared = null;
- }
}
@SuppressWarnings("StatementWithEmptyBody")
@@ -1127,7 +1048,7 @@ public class MainActivity extends AppCompatActivity
switch (item.getItemId()) {
case R.id.nav_stream: {
if (WebHelper.isOnline(MainActivity.this)) {
- webView.loadUrlNew(urls.getStreamUrl());
+ openDiasporaUrl(urls.getStreamUrl());
} else {
snackbarNoInternet.show();
}
@@ -1135,29 +1056,52 @@ public class MainActivity extends AppCompatActivity
break;
case R.id.nav_profile: {
- if (WebHelper.isOnline(MainActivity.this)) {
- webView.loadUrlNew(urls.getProfileUrl());
- } else {
- snackbarNoInternet.show();
+ if (!_appSettings.getProfileId().equals("")) {
+ openDiasporaUrl(urls.getProfileUrl());
}
}
break;
case R.id.nav_followed_tags: {
- if (WebHelper.isOnline(MainActivity.this)) {
- WebHelper.showFollowedTagsList(webView, app);
- setTitle(R.string.nav_followed_tags);
- } else {
- snackbarNoInternet.show();
- }
+ SearchOrCustomTextDialogCreator.showDiasporaTagsDialog(this, arg -> {
+ if (arg.startsWith(SearchOrCustomTextDialogCreator.SPECIAL_PREFIX)) {
+ arg = arg.replace(SearchOrCustomTextDialogCreator.SPECIAL_PREFIX, "").trim();
+ if (arg.equals(getString(R.string.manage_hashtags))) {
+ openDiasporaUrl(urls.getManageTagsUrl());
+ } else {
+ openDiasporaUrl(urls.getAllFollowedTagsUrl());
+ }
+ } else {
+ openDiasporaUrl(urls.getSearchTagsUrl(arg));
+ }
+ });
}
break;
case R.id.nav_aspects: {
+ SearchOrCustomTextDialogCreator.showDiasporaAspectsDialog(this, arg -> {
+ if (arg.startsWith(SearchOrCustomTextDialogCreator.SPECIAL_PREFIX)) {
+ arg = arg.replace(SearchOrCustomTextDialogCreator.SPECIAL_PREFIX, "").trim();
+ if (arg.equals(getString(R.string.manage_your_contact_list))) {
+ openDiasporaUrl(urls.getContactsUrl());
+ } else if (arg.equals(getString(R.string.nav_profile))) {
+ openDiasporaUrl(urls.getProfileUrl());
+ }
+ } else {
+ for (DiasporaAspect daspect : _appSettings.getAspects()) {
+ if (arg.equals(daspect.name)) {
+ openDiasporaUrl(urls.getAspectUrl(Long.toString(daspect.id)));
+ break;
+ }
+ }
+ }
+ });
+ }
+ break;
+
+ case R.id.nav_contacts: {
if (WebHelper.isOnline(MainActivity.this)) {
- webView.loadUrlNew(DiasporaUrlHelper.URL_BLANK);
- WebHelper.showAspectList(webView, app);
- setTitle(R.string.aspects);
+ openDiasporaUrl(urls.getContactsUrl());
} else {
snackbarNoInternet.show();
}
@@ -1166,7 +1110,7 @@ public class MainActivity extends AppCompatActivity
case R.id.nav_activities: {
if (WebHelper.isOnline(MainActivity.this)) {
- webView.loadUrlNew(urls.getActivityUrl());
+ openDiasporaUrl(urls.getActivityUrl());
} else {
snackbarNoInternet.show();
}
@@ -1175,7 +1119,7 @@ public class MainActivity extends AppCompatActivity
case R.id.nav_liked: {
if (WebHelper.isOnline(MainActivity.this)) {
- webView.loadUrlNew(urls.getLikedPostsUrl());
+ openDiasporaUrl(urls.getLikedPostsUrl());
} else {
snackbarNoInternet.show();
}
@@ -1184,7 +1128,7 @@ public class MainActivity extends AppCompatActivity
case R.id.nav_commented: {
if (WebHelper.isOnline(MainActivity.this)) {
- webView.loadUrlNew(urls.getCommentedUrl());
+ openDiasporaUrl(urls.getCommentedUrl());
} else {
snackbarNoInternet.show();
}
@@ -1193,34 +1137,62 @@ public class MainActivity extends AppCompatActivity
case R.id.nav_mentions: {
if (WebHelper.isOnline(MainActivity.this)) {
- webView.loadUrlNew(urls.getMentionsUrl());
+ openDiasporaUrl(urls.getMentionsUrl());
} else {
snackbarNoInternet.show();
}
- break;
}
+ break;
case R.id.nav_public: {
if (WebHelper.isOnline(MainActivity.this)) {
- webView.loadUrlNew(urls.getPublicUrl());
+ openDiasporaUrl(urls.getPublicUrl());
} else {
snackbarNoInternet.show();
}
- break;
}
+ break;
+
+ case R.id.nav_reports: {
+ if (WebHelper.isOnline(MainActivity.this)) {
+ openDiasporaUrl(urls.getReportsUrl());
+ } else {
+ snackbarNoInternet.show();
+ }
+ }
+ break;
+
+ case R.id.nav_statistics: {
+ if (WebHelper.isOnline(MainActivity.this)) {
+ openDiasporaUrl(urls.getStatisticsUrl());
+ } else {
+ snackbarNoInternet.show();
+ }
+ }
+ break;
+
+ case R.id.nav_toggle_desktop_page: {
+ openDiasporaUrl(urls.getToggleMobileUrl());
+ }
+ break;
+
+ case R.id.nav_product_support: {
+ openDiasporaUrl(urls.getProfileUrl("d1cbdd70095301341e834860008dbc6c"));
+ }
+ break;
case R.id.nav_exit: {
moveTaskToBack(true);
finish();
- break;
}
+ break;
case R.id.nav_settings: {
startActivity(new Intent(this, SettingsActivity.class));
}
break;
- case R.id.nav_help_license: {
+ case R.id.nav_about: {
startActivity(new Intent(MainActivity.this, AboutActivity.class));
}
break;
@@ -1230,6 +1202,13 @@ public class MainActivity extends AppCompatActivity
return true;
}
+ /**
+ * React to results of requestPermission
+ *
+ * @param requestCode resCode
+ * @param permissions requested permissions
+ * @param grantResults granted results
+ */
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
@@ -1250,81 +1229,51 @@ public class MainActivity extends AppCompatActivity
}
/**
- * Set proxy according to arguments. host must not be "" or null, port must be positive.
- * Return true on success and update appSettings' proxy related values.
+ * Return the string that will be shared into the new-post-editor
*
- * @param host proxy host (eg. localhost or 127.0.0.1)
- * @param port proxy port (eg. 8118)
- * @return success
- * @throws IllegalArgumentException if arguments do not fit specifications above
+ * @return String
*/
- private boolean setProxy(final String host, final int port) {
- AppLog.v(this, "setProxy()");
- if (host != null && !host.equals("") && port >= 0) {
- AppLog.v(this, "Set proxy to " + host + ":" + port);
- //Temporary change thread policy
- AppLog.v(this, "Set temporary ThreadPolicy");
- StrictMode.ThreadPolicy old = StrictMode.getThreadPolicy();
- StrictMode.ThreadPolicy tmp = new StrictMode.ThreadPolicy.Builder().permitAll().build();
- StrictMode.setThreadPolicy(tmp);
+ public String getTextToBeShared() {
+ return textToBeShared;
+ }
- AppLog.v(this, "Apply NetCipher proxy settings");
- NetCipher.setProxy(host, port); //Proxy for HttpsUrlConnections
- try {
- //Proxy for the webview
- AppLog.v(this, "Apply Webkit proxy settings");
- WebkitProxy.setProxy(MainActivity.class.getName(), getApplicationContext(), null, host, port);
- } catch (Exception e) {
- AppLog.e(this, "Could not apply WebKit proxy settings:\n" + e.toString());
- }
- AppLog.v(this, "Save changes in appSettings");
- appSettings.setProxyEnabled(true);
- appSettings.setProxyWasEnabled(true);
+ /**
+ * Set the string that will be shared into the new-post-editor
+ *
+ * @param textToBeShared text that will be shared into the post-editor
+ */
+ public void setTextToBeShared(String textToBeShared) {
+ this.textToBeShared = textToBeShared;
+ }
+
+ @Override
+ protected void applyColorToViews() {
+ ThemeHelper.updateToolbarColor(toolbarTop);
+ navDrawerLayout.setBackgroundColor(_appSettings.getPrimaryColor());
+ navProfilePictureArea.setBackgroundColor(_appSettings.getPrimaryColor());
+ if (_appSettings.isAmoledColorMode()) {
+ navView.setItemTextColor(ColorStateList.valueOf(Color.GRAY));
+ navView.setItemIconTintList(ColorStateList.valueOf(Color.GRAY));
+ navView.setBackgroundColor(Color.BLACK);
+ navheaderTitle.setTextColor(Color.GRAY);
+ navheaderDescription.setTextColor(Color.DKGRAY);
+ }
+
+ int popupTheme = ContextUtils.get().shouldColorOnTopBeLight(AppSettings.get().getPrimaryColor())
+ ? R.style.AppTheme_PopupOverlay_Dark : R.style.AppTheme_PopupOverlay_Light;
+ toolbarTop.setPopupTheme(popupTheme);
+ }
+
+ public void setToolbarIntellihide(boolean enable) {
+ AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) toolbarTop.getLayoutParams();
+ if (enable) {
+ AppLog.d(this, "Enable Intellihide");
+ params.setScrollFlags(toolbarDefaultScrollFlags);
- AppLog.v(this, "Reset old ThreadPolicy");
- StrictMode.setThreadPolicy(old);
- AppLog.v(this, "Success! Reload WebView");
- webView.reload();
- return true;
} else {
- AppLog.w(this, "Invalid proxy configuration. Host: " + host + " Port: " + port + "\nRefuse to set proxy");
- return false;
+ AppLog.d(this, "Disable Intellihide");
+ params.setScrollFlags(0); // clear all scroll flags
}
- }
-
- private boolean setProxy() {
- return setProxy(appSettings.getProxyHost(), appSettings.getProxyPort());
- }
-
- private void resetProxy() {
- AppLog.i(this, "resetProxy()");
- AppLog.v(this, "write changes to appSettings");
- appSettings.setProxyEnabled(false);
- appSettings.setProxyWasEnabled(false);
-
- //Temporary change thread policy
- AppLog.v(this, "Set temporary ThreadPolicy");
- StrictMode.ThreadPolicy old = StrictMode.getThreadPolicy();
- StrictMode.ThreadPolicy tmp = new StrictMode.ThreadPolicy.Builder().permitAll().build();
- StrictMode.setThreadPolicy(tmp);
-
- AppLog.v(this, "clear NetCipher proxy");
- NetCipher.clearProxy();
- try {
- AppLog.v(this, "clear WebKit proxy");
- WebkitProxy.resetProxy(MainActivity.class.getName(), this);
- } catch (Exception e) {
- AppLog.e(this, "Could not clear WebKit proxy:\n" + e.toString());
- }
- AppLog.v(this, "Reset old ThreadPolicy");
- StrictMode.setThreadPolicy(old);
-
- //Restart app
- AppLog.i(this, "Success! Restart app due to proxy reset");
- Intent restartActivity = new Intent(this, MainActivity.class);
- PendingIntent pendingIntent = PendingIntent.getActivity(this, 12374, restartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
- AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
- mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, pendingIntent);
- System.exit(0);
+ appBarLayout.setExpanded(true, true);
}
}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/activity/PodSelectionActivity.java b/app/src/main/java/com/github/dfa/diaspora_android/activity/PodSelectionActivity.java
deleted file mode 100644
index ec307c92..00000000
--- a/app/src/main/java/com/github/dfa/diaspora_android/activity/PodSelectionActivity.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- This file is part of the Diaspora for Android.
-
- Diaspora for Android is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Diaspora for Android is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with the Diaspora for Android.
-
- If not, see .
- */
-package com.github.dfa.diaspora_android.activity;
-
-import android.app.AlertDialog;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Build;
-import android.os.Bundle;
-import android.support.design.widget.Snackbar;
-import android.support.v4.content.LocalBroadcastManager;
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.Toolbar;
-import android.text.Editable;
-import android.text.SpannableString;
-import android.text.TextWatcher;
-import android.text.util.Linkify;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.webkit.CookieManager;
-import android.widget.ArrayAdapter;
-import android.widget.EditText;
-import android.widget.ListView;
-
-import com.github.dfa.diaspora_android.App;
-import com.github.dfa.diaspora_android.R;
-import com.github.dfa.diaspora_android.task.GetPodsService;
-import com.github.dfa.diaspora_android.util.Helpers;
-import com.github.dfa.diaspora_android.util.WebHelper;
-
-import java.util.ArrayList;
-
-import butterknife.BindView;
-import butterknife.ButterKnife;
-import butterknife.OnClick;
-import butterknife.OnItemClick;
-
-
-public class PodSelectionActivity extends AppCompatActivity {
- private App app;
-
- @BindView(R.id.podselection__edit_filter)
- EditText editFilter;
-
- @BindView(R.id.podselection__listpods)
- ListView listPods;
-
- @BindView(R.id.toolbar)
- Toolbar toolbar;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.podselection__activity);
- ButterKnife.bind(this);
- app = (App) getApplication();
- setSupportActionBar(toolbar);
-
-
- listPods.setTextFilterEnabled(true);
- setListedPods(app.getSettings().getPreviousPodlist());
- LocalBroadcastManager.getInstance(this).registerReceiver(podListReceiver, new IntentFilter(GetPodsService.MESSAGE_PODS_RECEIVED));
-
- if (!WebHelper.isOnline(PodSelectionActivity.this)) {
- Snackbar.make(listPods, R.string.no_internet, Snackbar.LENGTH_LONG).show();
- }
- }
-
-
- private final BroadcastReceiver podListReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (intent.hasExtra("pods")) {
- Bundle extras = intent.getExtras();
- String[] pods = extras.getStringArray("pods");
- if (pods != null && pods.length > 0) {
- app.getSettings().setPreviousPodlist(pods);
- setListedPods(pods);
- } else {
- setListedPods(app.getSettings().getPreviousPodlist());
- Snackbar.make(listPods, R.string.podlist_error, Snackbar.LENGTH_SHORT).show();
- }
- }
- }
- };
-
- @OnClick(R.id.podselection__button_select_pod)
- public void onButtonSelectPodClicked(View view) {
- if (editFilter.getText().length() > 4 && editFilter.getText().toString().contains("")) {
- showPodConfirmationDialog(editFilter.getText().toString());
- } else {
- Snackbar.make(listPods, R.string.valid_pod, Snackbar.LENGTH_LONG).show();
- }
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- Intent i = new Intent(PodSelectionActivity.this, GetPodsService.class);
- startService(i);
- }
-
-
- private void setListedPods(String[] listedPodsArr) {
- final ArrayList listedPodsList = new ArrayList<>();
- for (String pod : listedPodsArr) {
- listedPodsList.add(pod.toLowerCase());
- }
-
- final ArrayAdapter adapter = new ArrayAdapter<>(
- PodSelectionActivity.this,
- android.R.layout.simple_list_item_1,
- listedPodsList);
-
- // save index and top position
- int index = listPods.getFirstVisiblePosition();
- View v = listPods.getChildAt(0);
- int top = (v == null) ? 0 : (v.getTop() - listPods.getPaddingTop());
- listPods.setAdapter(adapter);
- listPods.setSelectionFromTop(index, top);
-
- adapter.getFilter().filter(editFilter.getText());
- editFilter.addTextChangedListener(new TextWatcher() {
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {
- (adapter).getFilter().filter(s.toString());
- }
-
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {
- }
-
- public void afterTextChanged(Editable s) {
- }
- });
- }
-
- @OnItemClick(R.id.podselection__listpods)
- public void onListPodsItemClicked(int position) {
- showPodConfirmationDialog((String) listPods.getAdapter().getItem(position));
- }
-
- private void showPodConfirmationDialog(final String selectedPod) {
- // Make a clickable link
- final SpannableString dialogMessage = new SpannableString(getString(R.string.confirm_pod, selectedPod));
- Linkify.addLinks(dialogMessage, Linkify.ALL);
-
- // Check if online
- if (!WebHelper.isOnline(PodSelectionActivity.this)) {
- Snackbar.make(listPods, R.string.no_internet, Snackbar.LENGTH_LONG).show();
- return;
- }
-
- // Show dialog
- new AlertDialog.Builder(PodSelectionActivity.this)
- .setTitle(getString(R.string.confirmation))
- .setMessage(dialogMessage)
- .setPositiveButton(android.R.string.yes,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- onPodSelectionConfirmed(selectedPod);
- }
- })
- .setNegativeButton(android.R.string.no, null)
- .show();
- }
-
- private void onPodSelectionConfirmed(String selectedPod) {
- app.getSettings().setPodDomain(selectedPod);
-
- try {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- CookieManager.getInstance().removeAllCookies(null);
- CookieManager.getInstance().removeSessionCookies(null);
- } else {
- //noinspection deprecation
- CookieManager.getInstance().removeAllCookie();
- //noinspection deprecation
- CookieManager.getInstance().removeSessionCookie();
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- Helpers.animateToActivity(this, MainActivity.class, true);
- }
-
-
- @Override
- public void onBackPressed() {
- Snackbar.make(listPods, R.string.confirm_exit, Snackbar.LENGTH_LONG)
- .setAction(android.R.string.yes, new View.OnClickListener() {
- public void onClick(View view) {
- finish();
- }
- })
- .show();
- }
-
- @Override
- protected void onDestroy() {
- LocalBroadcastManager.getInstance(this).unregisterReceiver(podListReceiver);
- super.onDestroy();
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.pods__menu, menu);
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.action_reload: {
- if (WebHelper.isOnline(PodSelectionActivity.this)) {
- Intent i = new Intent(PodSelectionActivity.this, GetPodsService.class);
- startService(i);
- return true;
- } else {
- Snackbar.make(listPods, R.string.no_internet, Snackbar.LENGTH_LONG).show();
- return false;
- }
- }
- }
- return super.onOptionsItemSelected(item);
- }
-}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/activity/PodSelectionFragment.java b/app/src/main/java/com/github/dfa/diaspora_android/activity/PodSelectionFragment.java
new file mode 100644
index 00000000..24da3d47
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/activity/PodSelectionFragment.java
@@ -0,0 +1,311 @@
+/*
+ This file is part of the dandelion*.
+
+ dandelion* is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ dandelion* is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the dandelion*.
+
+ If not, see .
+ */
+package com.github.dfa.diaspora_android.activity;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.design.widget.Snackbar;
+import android.support.v4.content.ContextCompat;
+import android.support.v4.content.LocalBroadcastManager;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v7.widget.AppCompatButton;
+import android.support.v7.widget.SearchView;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.webkit.CookieManager;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.github.dfa.diaspora_android.App;
+import com.github.dfa.diaspora_android.R;
+import com.github.dfa.diaspora_android.data.DiasporaPodList;
+import com.github.dfa.diaspora_android.data.DiasporaPodList.DiasporaPod;
+import com.github.dfa.diaspora_android.service.FetchPodsService;
+import com.github.dfa.diaspora_android.ui.PodSelectionDialog;
+import com.github.dfa.diaspora_android.ui.theme.ThemedFragment;
+import com.github.dfa.diaspora_android.util.ActivityUtils;
+import com.github.dfa.diaspora_android.util.AppSettings;
+import com.github.dfa.diaspora_android.util.ContextUtils;
+import com.github.dfa.diaspora_android.util.DiasporaUrlHelper;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+
+/**
+ * Fragment that lets the user choose a Pod
+ * Created by vanitas on 01.10.16.
+ */
+
+public class PodSelectionFragment extends ThemedFragment implements SearchView.OnQueryTextListener, PodSelectionDialog.PodSelectionDialogResultListener {
+ public static final String TAG = "com.github.dfa.diaspora_android.PodSelectionFragment";
+
+ @BindView(R.id.podselection__fragment__listpods)
+ protected ListView listViewPod;
+
+ @BindView(R.id.podselection__fragment__root)
+ RelativeLayout rootView;
+
+ @BindView(R.id.podselection__fragment__button_use_custom_pod)
+ AppCompatButton buttonUseCustomPod;
+
+
+ protected App app;
+ protected AppSettings appSettings;
+ private DiasporaPodList podList;
+ private ArrayAdapter listViewPodAdapter;
+ private String filterString = "";
+
+ @Override
+ protected int getLayoutResId() {
+ return R.layout.podselection__fragment;
+ }
+
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ ButterKnife.bind(this, view);
+ app = (App) getActivity().getApplication();
+ appSettings = app.getSettings();
+
+ // Load local podlist
+ podList = new DiasporaPodList();
+ mergePodlistWithRessources(podList);
+ podList.setTrackMergeChanges(true);
+ updateListedPods();
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ listViewPod.setNestedScrollingEnabled(true);
+ }
+
+ listViewPod.setTextFilterEnabled(true);
+ listViewPod.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ public void onItemClick(AdapterView> adapterView, View view, int i, long l) {
+ String text = ((TextView) view).getText().toString();
+ for (DiasporaPod pod : podList) {
+ if (pod.getPodUrl().getHost().equals(text)) {
+ showPodSelectionDialog(pod);
+ return;
+ }
+ }
+
+ }
+ });
+ LocalBroadcastManager.getInstance(getContext()).registerReceiver(podListReceiver, new IntentFilter(FetchPodsService.MESSAGE_PODS_RECEIVED));
+ ActivityUtils.get(getActivity()).showInfoIfUserNotConnectedToInternet(listViewPod);
+ }
+
+ public void mergePodlistWithRessources(DiasporaPodList podlist) {
+ String sPodlist = ContextUtils.get().readTextfileFromRawRes(R.raw.podlist, "", "");
+ try {
+ JSONObject jPodlist = new JSONObject(sPodlist);
+ podlist.mergeWithNewerEntries(new DiasporaPodList().fromJson(jPodlist));
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @OnClick(R.id.podselection__fragment__button_use_custom_pod)
+ public void onPodButtonClicked(View v) {
+ showPodSelectionDialog(new DiasporaPod());
+ }
+
+ @Override
+ public String getFragmentTag() {
+ return TAG;
+ }
+
+ private final BroadcastReceiver podListReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.hasExtra(FetchPodsService.EXTRA_PODLIST)) {
+ Bundle extras = intent.getExtras();
+ DiasporaPodList newPods = (DiasporaPodList) extras.get(FetchPodsService.EXTRA_PODLIST);
+ if (newPods != null && newPods.getPods().size() > 0) {
+ try {
+ podList.mergeWithNewerEntries(newPods);
+ updateListedPods();
+ } catch (JSONException ignored) {
+ }
+ } else {
+ Snackbar.make(listViewPod, R.string.could_not_retrieve_list_of_pods__appspecific, Snackbar.LENGTH_SHORT).show();
+ }
+ }
+ }
+ };
+
+ @Override
+ protected void applyColorToViews() {
+ int dividerHeight = listViewPod.getDividerHeight();
+ rootView.setBackgroundColor(appSettings.isAmoledColorMode() ? Color.BLACK : Color.WHITE);
+ listViewPod.setDivider(new ColorDrawable(Color.GRAY));
+ listViewPod.setDividerHeight(dividerHeight);
+ int bgcolor = appSettings.isAmoledColorMode() ? Color.DKGRAY : appSettings.getAccentColor();
+ buttonUseCustomPod.setBackgroundColor(bgcolor);
+ buttonUseCustomPod.setTextColor(_cu.shouldColorOnTopBeLight(bgcolor) ? Color.WHITE : Color.BLACK);
+
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ Intent i = new Intent(getContext(), FetchPodsService.class);
+ getContext().startService(i);
+ }
+
+ private void updateListedPods() {
+ final ArrayList listedPodsList = new ArrayList<>();
+ for (DiasporaPod pod : this.podList) {
+ listedPodsList.add(pod.getPodUrl().getHost());
+ }
+
+ listViewPodAdapter = new ArrayAdapter(
+ getContext(),
+ android.R.layout.simple_list_item_1,
+ listedPodsList) {
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ View view = super.getView(position, convertView, parent);
+ TextView textView = view.findViewById(android.R.id.text1);
+ textView.setTextColor(appSettings.isAmoledColorMode() ? Color.GRAY : Color.BLACK);
+ return view;
+ }
+ };
+
+ // save index and top position
+ int index = listViewPod.getFirstVisiblePosition();
+ View v = listViewPod.getChildAt(0);
+ int top = (v == null) ? 0 : (v.getTop() - listViewPod.getPaddingTop());
+ listViewPod.setAdapter(listViewPodAdapter);
+ listViewPod.setSelectionFromTop(index, top);
+
+ listViewPodAdapter.getFilter().filter(filterString);
+ }
+
+ private void showPodSelectionDialog(final DiasporaPod selectedPod) {
+ PodSelectionDialog dialog = PodSelectionDialog.newInstance(selectedPod, this);
+ dialog.show(getFragmentManager(), PodSelectionDialog.TAG);
+ }
+
+ @Override
+ public void onDestroy() {
+ LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(podListReceiver);
+ super.onDestroy();
+ }
+
+ @Override
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ super.onCreateOptionsMenu(menu, inflater);
+ inflater.inflate(R.menu.podselection__menu, menu);
+
+ MenuItem searchItem = menu.findItem(R.id.podselection__action_search);
+ if (searchItem != null) {
+ SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
+ searchView.setOnQueryTextListener(this);
+ }
+
+ final boolean darkBg = ContextUtils.get().shouldColorOnTopBeLight(AppSettings.get().getPrimaryColor());
+ ContextUtils.get().tintMenuItems(menu, true, ContextCompat.getColor(getActivity(), darkBg ? R.color.white : R.color.black));
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.action_reload: {
+ if (!ActivityUtils.get(getActivity()).showInfoIfUserNotConnectedToInternet(listViewPod)) {
+ Intent i = new Intent(getContext(), FetchPodsService.class);
+ getContext().startService(i);
+ return true;
+ }
+ }
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ public boolean onQueryTextChange(String newText) {
+ if (listViewPodAdapter != null) {
+ (listViewPodAdapter).getFilter().filter(newText);
+ }
+ return true;
+ }
+
+ @Override
+ public void onPodSelectionDialogResult(DiasporaPod pod, boolean accepted) {
+ System.out.println(accepted + ": " + pod.toString());
+ if (accepted) {
+ app.getSettings().setPod(pod);
+
+ try {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ CookieManager.getInstance().removeAllCookies(null);
+ CookieManager.getInstance().removeSessionCookies(null);
+ } else {
+ //noinspection deprecation
+ CookieManager.getInstance().removeAllCookie();
+ //noinspection deprecation
+ CookieManager.getInstance().removeSessionCookie();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ MainActivity mainActivity = (MainActivity) getActivity();
+ DiasporaUrlHelper urlHelper = new DiasporaUrlHelper(appSettings);
+ mainActivity.onPodSelectionDialogResult(pod, accepted);
+ mainActivity.openDiasporaUrl(urlHelper.getSignInUrl());
+ }
+ }
+
+
+ /*
+ * Dummy implementations
+ */
+ @Override
+ public boolean onQueryTextSubmit(String query) {
+ return false;
+ }
+
+ @Override
+ public boolean onBackPressed() {
+ return false;
+ }
+
+ @Override
+ public boolean isAllowedIntellihide() {
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/activity/SettingsActivity.java b/app/src/main/java/com/github/dfa/diaspora_android/activity/SettingsActivity.java
index 88f13171..0a38744e 100644
--- a/app/src/main/java/com/github/dfa/diaspora_android/activity/SettingsActivity.java
+++ b/app/src/main/java/com/github/dfa/diaspora_android/activity/SettingsActivity.java
@@ -1,150 +1,232 @@
-/*
- This file is part of the Diaspora for Android.
-
- Diaspora for Android is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Diaspora for Android is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with the Diaspora for Android.
-
- If not, see .
- */
package com.github.dfa.diaspora_android.activity;
-import android.app.AlertDialog;
+import android.annotation.SuppressLint;
+import android.app.AlarmManager;
+import android.app.FragmentTransaction;
+import android.app.PendingIntent;
+import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.os.Build;
import android.os.Bundle;
-import android.preference.EditTextPreference;
-import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceScreen;
-import android.support.v7.app.ActionBar;
-import android.support.v7.app.AppCompatActivity;
-import android.view.MenuItem;
+import android.support.design.widget.AppBarLayout;
+import android.support.v7.widget.Toolbar;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+import android.widget.Toast;
import com.github.dfa.diaspora_android.App;
import com.github.dfa.diaspora_android.R;
-import com.github.dfa.diaspora_android.data.AppSettings;
+import com.github.dfa.diaspora_android.ui.theme.ColorPalette;
+import com.github.dfa.diaspora_android.ui.theme.ThemeHelper;
+import com.github.dfa.diaspora_android.ui.theme.ThemedActivity;
+import com.github.dfa.diaspora_android.ui.theme.ThemedAlertDialogBuilder;
+import com.github.dfa.diaspora_android.ui.theme.ThemedPreferenceFragment;
import com.github.dfa.diaspora_android.util.AppLog;
+import com.github.dfa.diaspora_android.util.AppSettings;
+import com.github.dfa.diaspora_android.util.DiasporaUrlHelper;
+import com.github.dfa.diaspora_android.web.ProxyHandler;
-/**
- * @author vanitas
- */
-public class SettingsActivity extends AppCompatActivity {
- private boolean activityRestartRequired;
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import uz.shift.colorpicker.LineColorPicker;
+import uz.shift.colorpicker.OnColorChangedListener;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ActionBar toolbar = getSupportActionBar();
- if (toolbar != null)
- toolbar.setDisplayHomeAsUpEnabled(true);
- getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
+public class SettingsActivity extends ThemedActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
+
+ //Toolbar
+ @BindView(R.id.settings__appbar)
+ protected AppBarLayout appBarLayout;
+
+ @BindView(R.id.settings__toolbar)
+ protected Toolbar toolbar;
+
+ private ProxyHandler.ProxySettings oldProxySettings;
+
+ public void onCreate(Bundle b) {
+ super.onCreate(b);
+ setContentView(R.layout.settings__activity);
+ ButterKnife.bind(this);
+ toolbar.setTitle(R.string.settings);
+ setSupportActionBar(toolbar);
+
+ toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_arrow_back_white_24px));
+ toolbar.setNavigationOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ SettingsActivity.this.onBackPressed();
+ }
+ });
+ getAppSettings().registerPreferenceChangedListener(this);
+ oldProxySettings = getAppSettings().getProxySettings();
+ showFragment(SettingsFragmentMaster.TAG, false);
+ }
+
+ protected void showFragment(String tag, boolean addToBackStack) {
+ PreferenceFragment fragment = (PreferenceFragment) getFragmentManager().findFragmentByTag(tag);
+ if (fragment == null) {
+ switch (tag) {
+ case SettingsFragmentThemes.TAG:
+ fragment = new SettingsFragmentThemes();
+ break;
+ case SettingsFragmentNavSlider.TAG:
+ fragment = new SettingsFragmentNavSlider();
+ break;
+ case SettingsFragmentProxy.TAG:
+ fragment = new SettingsFragmentProxy();
+ break;
+ case SettingsFragmentDebugging.TAG:
+ fragment = new SettingsFragmentDebugging();
+ break;
+ case SettingsFragmentMaster.TAG:
+ default:
+ fragment = new SettingsFragmentMaster();
+ break;
+ }
+ }
+ FragmentTransaction t = getFragmentManager().beginTransaction();
+ if (addToBackStack) {
+ t.addToBackStack(tag);
+ }
+ t.replace(R.id.settings__fragment_container, fragment, tag).commit();
}
@Override
- public boolean onOptionsItemSelected(MenuItem menuItem) {
- switch (menuItem.getItemId()) {
- case android.R.id.home:
- onBackPressed();
- return true;
- default:
- return super.onOptionsItemSelected(menuItem);
+ public void applyColorToViews() {
+ //Toolbar
+ ThemeHelper.updateToolbarColor(toolbar);
+ }
+
+ @Override
+ protected void onStop() {
+ ProxyHandler.ProxySettings newProxySettings = getAppSettings().getProxySettings();
+ if (!oldProxySettings.equals(newProxySettings)) {
+ AppLog.d(this, "ProxySettings changed.");
+ //Proxy on-off? => Restart app
+ if (oldProxySettings.isEnabled() && !newProxySettings.isEnabled()) {
+ AppLog.d(this, "Proxy deactivated. Restarting app...");
+ Intent restartActivity = new Intent(SettingsActivity.this, MainActivity.class);
+ PendingIntent pendingIntent = PendingIntent.getActivity(SettingsActivity.this, 12374, restartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
+ AlarmManager mgr = (AlarmManager) SettingsActivity.this.getSystemService(Context.ALARM_SERVICE);
+ mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, pendingIntent);
+ System.exit(0);
+ } //Proxy changed? => Update
+ else {
+ ProxyHandler.getInstance().updateProxySettings(this);
+ }
+ }
+ getAppSettings().unregisterPreferenceChangedListener(this);
+ super.onStop();
+ }
+
+ @Override
+ public void onBackPressed() {
+ ThemedPreferenceFragment top = getTopFragment();
+ if (top != null && top.getFragmentTag().equals(SettingsFragmentProxy.TAG)) {
+ ProxyHandler.ProxySettings newProxySettings = getAppSettings().getProxySettings();
+ if (oldProxySettings.isEnabled() && !newProxySettings.isEnabled()) {
+ Toast.makeText(this, R.string.app_needs_restart_to_disable_proxy_usage, Toast.LENGTH_LONG).show();
+ }
+ }
+ super.onBackPressed();
+ }
+
+ /**
+ * Return the fragment which is currently displayed in R.id.fragment_container
+ *
+ * @return top fragment or null if there is none displayed
+ */
+ private ThemedPreferenceFragment getTopFragment() {
+ return (ThemedPreferenceFragment) getFragmentManager().findFragmentById(R.id.settings__fragment_container);
+ }
+
+ @Override
+ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
+ if (key.equals(getString(R.string.pref_key__screen_rotation))) {
+ this.updateScreenRotation();
}
}
- private void setActivityRestartRequired() {
- this.activityRestartRequired = true;
- }
-
- public static class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
- private SharedPreferences sharedPreferences;
+ public static class SettingsFragmentMaster extends ThemedPreferenceFragment {
+ public static final String TAG = "com.github.dfa.diaspora_android.settings.SettingsFragmentMaster";
public void onCreate(Bundle savedInstances) {
super.onCreate(savedInstances);
getPreferenceManager().setSharedPreferencesName("app");
- addPreferencesFromResource(R.xml.preferences);
- sharedPreferences = getPreferenceScreen().getSharedPreferences();
- sharedPreferences.registerOnSharedPreferenceChangeListener(this);
- setPreferenceSummaries();
- sharedPreferences.edit().putBoolean(getString(R.string.pref_key__proxy_was_enabled),
- sharedPreferences.getBoolean(getString(R.string.pref_key__proxy_enabled), false)).apply();
- }
-
- private void setPreferenceSummaries() {
- String[] editTextKeys = new String[]{
- getString(R.string.pref_key__proxy_host), getString(R.string.pref_key__proxy_port)
- };
- for (String key : editTextKeys) {
- EditTextPreference p = (EditTextPreference) findPreference(key);
- p.setSummary(p.getText());
- }
+ addPreferencesFromResource(R.xml.preferences__master);
}
@Override
- public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
- updatePreference(findPreference(key));
- if (key != null && isAdded() && (key.equals(getString(R.string.pref_key__clear_cache)) ||
- key.equals(getString(R.string.pref_key__font_size)) ||
- key.equals(getString(R.string.pref_key__load_images)) ||
- key.equals(getString(R.string.pref_key__intellihide_toolbars)) ||
- key.equals(getString(R.string.pref_key__proxy_enabled)) ||
- key.equals(getString(R.string.pref_key__proxy_host)) ||
- key.equals(getString(R.string.pref_key__proxy_port)) ||
- key.startsWith("pref_key__visibility_nav__"))) {
- ((SettingsActivity) getActivity()).setActivityRestartRequired();
- }
- }
+ public void updateViewColors() {
- private void updatePreference(Preference preference) {
- if (preference == null) {
- return;
- }
- if (preference instanceof EditTextPreference) {
- EditTextPreference textPref = (EditTextPreference) preference;
- textPref.setSummary(textPref.getText());
- return;
- }
- if (preference instanceof ListPreference) {
- ListPreference listPref = (ListPreference) preference;
- listPref.setSummary(listPref.getEntry());
- }
}
@Override
public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
- Intent intent = new Intent(getActivity(), MainActivity.class);
- String podDomain = ((App) getActivity().getApplication()).getSettings().getPodDomain();
- switch (preference.getTitleRes()) {
- case R.string.pref_title__personal_settings: {
- intent.setAction(MainActivity.ACTION_OPEN_URL);
- intent.putExtra(MainActivity.URL_MESSAGE, "https://" + podDomain + "/user/edit");
- break;
+ if (isAdded() && preference.hasKey()) {
+ AppSettings settings = ((App) getActivity().getApplication()).getSettings();
+ DiasporaUrlHelper diasporaUrlHelper = new DiasporaUrlHelper(settings);
+ String key = preference.getKey();
+ /** Sub-Categories */
+ if (settings.isKeyEqual(key, R.string.pref_key__cat_themes)) {
+ ((SettingsActivity) getActivity()).showFragment(SettingsFragmentThemes.TAG, true);
+ return true;
+ } else if (settings.isKeyEqual(key, R.string.pref_key__cat_nav_slider)) {
+ ((SettingsActivity) getActivity()).showFragment(SettingsFragmentNavSlider.TAG, true);
+ return true;
+ } else if (settings.isKeyEqual(key, R.string.pref_key__cat_proxy)) {
+ ((SettingsActivity) getActivity()).showFragment(SettingsFragmentProxy.TAG, true);
+ return true;
+ } else if (settings.isKeyEqual(key, R.string.pref_key__cat_debugging)) {
+ ((SettingsActivity) getActivity()).showFragment(SettingsFragmentDebugging.TAG, true);
+ return true;
}
- case R.string.pref_title__manage_tags: {
- intent.setAction(MainActivity.ACTION_OPEN_URL);
- intent.putExtra(MainActivity.URL_MESSAGE, "https://" + podDomain + "/tag_followings/manage");
- break;
+ /** Usability */
+ else if (settings.isKeyEqual(key, R.string.pref_key__is_overview_statusbar_hidden)) {
+ AppSettings.get().setRecreateMainActivity(true);
+ } else if (settings.isKeyEqual(key, R.string.pref_key__language)) {
+ AppSettings.get().setRecreateMainActivity(true);
}
- case R.string.pref_title__manage_contacts: {
- intent.setAction(MainActivity.ACTION_OPEN_URL);
- intent.putExtra(MainActivity.URL_MESSAGE, "https://" + podDomain + "/contacts");
- break;
+ /** Network */
+ else if (settings.isKeyEqual(key, R.string.pref_key__clear_cache)) {
+ Intent intent = new Intent(getActivity(), MainActivity.class);
+ intent.setAction(MainActivity.ACTION_CLEAR_CACHE);
+ startActivity(intent);
+ getActivity().finish();
+ return true;
}
- case R.string.pref_title__change_account: {
- new AlertDialog.Builder(getActivity())
+ /** Pod Settings */
+ if (settings.isKeyEqual(key, R.string.pref_key__personal_settings)) {
+ Intent intent = new Intent(getActivity(), MainActivity.class);
+ intent.setAction(MainActivity.ACTION_OPEN_URL);
+ intent.putExtra(MainActivity.URL_MESSAGE, diasporaUrlHelper.getPersonalSettingsUrl());
+ startActivity(intent);
+ getActivity().finish();
+ return true;
+ } else if (settings.isKeyEqual(key, R.string.pref_key__manage_tags)) {
+ Intent intent = new Intent(getActivity(), MainActivity.class);
+ intent.setAction(MainActivity.ACTION_OPEN_URL);
+ intent.putExtra(MainActivity.URL_MESSAGE, diasporaUrlHelper.getManageTagsUrl());
+ startActivity(intent);
+ getActivity().finish();
+ return true;
+ } else if (settings.isKeyEqual(key, R.string.pref_key__manage_contacts)) {
+ Intent intent = new Intent(getActivity(), MainActivity.class);
+ intent.setAction(MainActivity.ACTION_OPEN_URL);
+ intent.putExtra(MainActivity.URL_MESSAGE, diasporaUrlHelper.getContactsUrl());
+ startActivity(intent);
+ getActivity().finish();
+ return true;
+ } else if (settings.isKeyEqual(key, R.string.pref_key__change_account)) {
+ new ThemedAlertDialogBuilder(getActivity(), AppSettings.get())
.setTitle(getString(R.string.confirmation))
- .setMessage(getString(R.string.pref_warning__change_account))
+ .setMessage(getString(R.string.logout_warning_description))
.setNegativeButton(android.R.string.no, null)
.setPositiveButton(android.R.string.yes,
new DialogInterface.OnClickListener() {
@@ -157,39 +239,263 @@ public class SettingsActivity extends AppCompatActivity {
})
.show();
return true;
- }
- default: {
- intent = null;
- break;
}
}
- if (intent != null) {
- startActivity(intent);
- getActivity().finish();
- return true;
- }
return super.onPreferenceTreeClick(screen, preference);
}
+
+ @Override
+ public String getFragmentTag() {
+ return TAG;
+ }
}
- @Override
- protected void onPause() {
- super.onPause();
+ public static class SettingsFragmentThemes extends ThemedPreferenceFragment {
+ public static final String TAG = "com.github.dfa.diaspora_android.settings.SettingsFragmentThemes";
- // Reset logging
- AppSettings settings = new AppSettings(getApplicationContext());
- AppLog.setLoggingEnabled(settings.isLoggingEnabled());
- AppLog.setLoggingSpamEnabled(settings.isLoggingSpamEnabled());
+ public void onCreate(Bundle savedInstances) {
+ super.onCreate(savedInstances);
+ getPreferenceManager().setSharedPreferencesName("app");
+ addPreferencesFromResource(R.xml.preferences__sub_themes);
+ }
+
+ @Override
+ public void updateViewColors() {
+ if (isAdded()) {
+ //Trigger redraw of whole preference screen in order to reflect changes
+ setPreferenceScreen(null);
+ addPreferencesFromResource(R.xml.preferences__sub_themes);
+ }
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
+ AppSettings settings = ((App) getActivity().getApplication()).getSettings();
+ DiasporaUrlHelper diasporaUrlHelper = new DiasporaUrlHelper(settings);
+ if (isAdded() && preference.hasKey()) {
+ String key = preference.getKey();
+ if (key.equals(getString(R.string.pref_key__primary_color__preference_click))) {
+ showColorPickerDialog(1);
+ return true;
+ } else if (key.equals(getString(R.string.pref_key__accent_color__preference_click))) {
+ showColorPickerDialog(2);
+ return true;
+ } else if (key.equals(getString(R.string.pref_key__manage_theme))) {
+ Intent intent = new Intent(getActivity(), MainActivity.class);
+ intent.setAction(MainActivity.ACTION_OPEN_URL);
+ intent.putExtra(MainActivity.URL_MESSAGE, diasporaUrlHelper.getThemeUrl());
+ startActivity(intent);
+ getActivity().finish();
+ return true;
+ }
+ }
+ return super.onPreferenceTreeClick(screen, preference);
+ }
+
+ @Override
+ public String getFragmentTag() {
+ return TAG;
+ }
+
+ /**
+ * Show a colorPicker Dialog
+ *
+ * @param type 1 -> Primary Color, 2 -> Accent Color
+ */
+ @SuppressLint("InflateParams")
+ public void showColorPickerDialog(final int type) {
+ final AppSettings appSettings = ((App) getActivity().getApplication()).getSettings();
+ final Context context = getActivity();
+
+ //Inflate dialog layout
+ LayoutInflater inflater = getActivity().getLayoutInflater();
+ View dialogLayout = inflater.inflate(R.layout.ui__dialog__color_picker, null);
+ final ThemedAlertDialogBuilder builder = new ThemedAlertDialogBuilder(context, appSettings);
+ builder.setView(dialogLayout);
+
+ final FrameLayout titleBackground = dialogLayout.findViewById(R.id.color_picker_dialog__title_background);
+ final TextView title = dialogLayout.findViewById(R.id.color_picker_dialog__title);
+ final LineColorPicker base = dialogLayout.findViewById(R.id.color_picker_dialog__base_picker);
+ final LineColorPicker shade = dialogLayout.findViewById(R.id.color_picker_dialog__shade_picker);
+
+ title.setText(type == 1 ? R.string.primary_colors : R.string.accent_color);
+ title.setTextColor(getResources().getColor(R.color.white));
+ final int[] current = (type == 1 ? appSettings.getPrimaryColorSettings() : appSettings.getAccentColorSettings());
+ base.setColors((type == 1 ? ColorPalette.getBaseColors(context) : ColorPalette.getAccentColors(context)));
+ base.setSelectedColor(current[0]);
+ shade.setColors(ColorPalette.getColors(context, current[0]));
+ shade.setSelectedColor(current[1]);
+ titleBackground.setBackgroundColor(shade.getColor());
+ base.setOnColorChangedListener(new OnColorChangedListener() {
+ @Override
+ public void onColorChanged(int i) {
+ shade.setColors(ColorPalette.getColors(context, i));
+ titleBackground.setBackgroundColor(i);
+ if (i == current[0]) {
+ shade.setSelectedColor(current[1]);
+ titleBackground.setBackgroundColor(shade.getColor());
+ } else {
+ shade.setSelectedColor(i);
+ }
+ }
+ });
+ shade.setOnColorChangedListener(new OnColorChangedListener() {
+ @Override
+ public void onColorChanged(int i) {
+ titleBackground.setBackgroundColor(i);
+ }
+ });
+
+ //Build dialog
+ builder
+ .setNegativeButton(android.R.string.cancel, null)
+ .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+ if (type == 1) {
+ appSettings.setPrimaryColorSettings(base.getColor(), shade.getColor());
+ if (Build.VERSION.SDK_INT >= 21) {
+ getActivity().getWindow().setStatusBarColor(ThemeHelper.getPrimaryDarkColor());
+ }
+ ((SettingsActivity) getActivity()).applyColorToViews();
+ } else {
+ appSettings.setAccentColorSettings(base.getColor(), shade.getColor());
+ }
+ updateViewColors();
+ }
+ }).show();
+ }
}
- @Override
- protected void onStop() {
- super.onStop();
- if (activityRestartRequired) {
- Intent intent = new Intent(this, MainActivity.class);
- intent.setAction(MainActivity.ACTION_RELOAD_ACTIVITY);
- startActivity(intent);
+ public static class SettingsFragmentNavSlider extends ThemedPreferenceFragment {
+ public static final String TAG = "com.github.dfa.diaspora_android.settings.SettingsFragmentNavSlider";
+
+ public void onCreate(Bundle savedInstances) {
+ super.onCreate(savedInstances);
+ getPreferenceManager().setSharedPreferencesName("app");
+ addPreferencesFromResource(R.xml.preferences__sub_navslider_vis);
+ }
+
+ @Override
+ public void updateViewColors() {
+
+ }
+
+ @Override
+ public String getFragmentTag() {
+ return TAG;
+ }
+ }
+
+ public static class SettingsFragmentProxy extends ThemedPreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
+ public static final String TAG = "com.github.dfa.diaspora_android.settings.SettingsFragmentProxy";
+
+ public void onCreate(Bundle savedInstances) {
+ super.onCreate(savedInstances);
+ getPreferenceManager().setSharedPreferencesName("app");
+ addPreferencesFromResource(R.xml.preferences__sub_proxy);
+ SharedPreferences sharedPreferences = getPreferenceScreen().getSharedPreferences();
+ sharedPreferences.registerOnSharedPreferenceChangeListener(this);
+ }
+
+ @Override
+ public void onActivityCreated(Bundle bundle) {
+ super.onActivityCreated(bundle);
+ updateSummaries();
+ }
+
+ public void updateSummaries() {
+ if (isAdded()) {
+ AppSettings settings = ((App) getActivity().getApplication()).getSettings();
+ findPreference(settings.rstr(R.string.pref_key__http_proxy_host)).setSummary(settings.getProxyHttpHost());
+ findPreference(settings.rstr(R.string.pref_key__http_proxy_port)).setSummary(Integer.toString(settings.getProxyHttpPort()));
+ }
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
+ if (isAdded() && preference.hasKey()) {
+ AppSettings appSettings = ((App) getActivity().getApplication()).getSettings();
+ String key = preference.getKey();
+ if (appSettings.isKeyEqual(key, R.string.pref_key__http_proxy_load_tor_preset)) {
+ appSettings.setProxyHttpHost("127.0.0.1");
+ appSettings.setProxyHttpPort(8118);
+ Toast.makeText(screen.getContext(), R.string.orbot_proxy_preset_loaded, Toast.LENGTH_SHORT).show();
+ return true;
+ }
+ }
+ return super.onPreferenceTreeClick(screen, preference);
+ }
+
+ @Override
+ public String getFragmentTag() {
+ return TAG;
+ }
+
+ @Override
+ public void updateViewColors() {
+
+ }
+
+ @Override
+ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
+ if (isAdded()) {
+ if (key.equals(getString(R.string.pref_key__http_proxy_host)) ||
+ key.equals(getString(R.string.pref_key__http_proxy_port))) {
+ updateSummaries();
+ }
+ }
+ }
+ }
+
+ public static class SettingsFragmentDebugging extends ThemedPreferenceFragment {
+ public static final String TAG = "com.github.dfa.diaspora_android.settings.SettingsFragmentDebugging";
+
+ public void onCreate(Bundle savedInstances) {
+ super.onCreate(savedInstances);
+ getPreferenceManager().setSharedPreferencesName("app");
+ addPreferencesFromResource(R.xml.preferences__sub_debugging);
+ }
+
+ @Override
+ public void updateViewColors() {
+
+ }
+
+ @Override
+ public String getFragmentTag() {
+ return TAG;
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
+ if (isAdded() && preference.hasKey()) {
+ AppSettings appSettings = ((App) getActivity().getApplication()).getSettings();
+ String key = preference.getKey();
+ if (appSettings.isKeyEqual(key, R.string.pref_key__wipe_settings)) {
+ showWipeSettingsDialog();
+ return true;
+ }
+ }
+ return super.onPreferenceTreeClick(screen, preference);
+ }
+
+ private void showWipeSettingsDialog() {
+ final AppSettings appSettings = AppSettings.get();
+
+ ThemedAlertDialogBuilder builder = new ThemedAlertDialogBuilder(getActivity(), appSettings);
+ builder.setTitle(R.string.confirmation)
+ .setMessage(R.string.wipe_settings_warning__appspecific)
+ .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+ appSettings.resetAppSettings();
+ appSettings.resetPodSettings();
+ new net.gsantner.opoc.util.ContextUtils(appSettings.getContext()).restartApp(MainActivity.class);
+ }
+ }).setNegativeButton(android.R.string.cancel, null)
+ .create().show();
}
}
}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/activity/SplashActivity.java b/app/src/main/java/com/github/dfa/diaspora_android/activity/SplashActivity.java
deleted file mode 100644
index 0eeccd3c..00000000
--- a/app/src/main/java/com/github/dfa/diaspora_android/activity/SplashActivity.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- This file is part of the Diaspora for Android.
-
- Diaspora for Android is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Diaspora for Android is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with the Diaspora for Android.
-
- If not, see .
- */
-
-package com.github.dfa.diaspora_android.activity;
-
-import android.os.Bundle;
-import android.os.Handler;
-import android.support.v7.app.AppCompatActivity;
-
-import com.github.dfa.diaspora_android.App;
-import com.github.dfa.diaspora_android.R;
-import com.github.dfa.diaspora_android.util.Helpers;
-
-import butterknife.ButterKnife;
-
-
-public class SplashActivity extends AppCompatActivity {
- private App app;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.splash__activity);
- ButterKnife.bind(this);
- app = (App) getApplication();
-
- int delay = getResources().getInteger(R.integer.splash_delay);
- new Handler().postDelayed(startActivityRunnable, delay);
- }
-
- private final Runnable startActivityRunnable = new Runnable() {
- public void run() {
- boolean hasPodDomain = app.getSettings().hasPodDomain();
- Helpers.animateToActivity(SplashActivity.this,
- hasPodDomain ? MainActivity.class : PodSelectionActivity.class,
- true
- );
- }
- };
-}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/data/AppSettings.java b/app/src/main/java/com/github/dfa/diaspora_android/data/AppSettings.java
deleted file mode 100644
index b8135e86..00000000
--- a/app/src/main/java/com/github/dfa/diaspora_android/data/AppSettings.java
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- This file is part of the Diaspora for Android.
-
- Diaspora for Android is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Diaspora for Android is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with the Diaspora for Android.
-
- If not, see .
- */
-package com.github.dfa.diaspora_android.data;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.content.SharedPreferences;
-
-import com.github.dfa.diaspora_android.R;
-
-/**
- * Settings
- * Created by gsantner (https://gsantner.github.io/) on 20.03.16. Part of Diaspora for Android.
- */
-public class AppSettings {
- private final SharedPreferences prefApp;
- private final SharedPreferences prefPod;
- private final Context context;
-
- public AppSettings(Context context) {
- this.context = context.getApplicationContext();
- prefApp = this.context.getSharedPreferences("app", Context.MODE_PRIVATE);
- prefPod = this.context.getSharedPreferences("pod0", Context.MODE_PRIVATE);
- }
-
- public Context getApplicationContext() {
- return context;
- }
-
- public void clearPodSettings() {
- prefPod.edit().clear().apply();
- }
-
- public void clearAppSettings() {
- prefApp.edit().clear().apply();
- }
-
- private void setString(SharedPreferences pref, int keyRessourceId, String value) {
- pref.edit().putString(context.getString(keyRessourceId), value).apply();
- }
-
- private void setInt(SharedPreferences pref, int keyRessourceId, int value) {
- pref.edit().putInt(context.getString(keyRessourceId), value).apply();
- }
-
- private void setBool(SharedPreferences pref, int keyRessourceId, boolean value) {
- pref.edit().putBoolean(context.getString(keyRessourceId), value).apply();
- }
-
- private void setStringArray(SharedPreferences pref, int keyRessourceId, Object[] values) {
- StringBuilder sb = new StringBuilder();
- for (Object value : values) {
- sb.append("%%%");
- sb.append(value.toString());
- }
- setString(pref, keyRessourceId, sb.toString().replaceFirst("%%%", ""));
- }
-
- private String[] getStringArray(SharedPreferences pref, int keyRessourceId) {
- String value = pref.getString(context.getString(keyRessourceId), "%%%");
- if (value.equals("%%%")) {
- return new String[0];
- }
- return value.split("%%%");
- }
-
- private String getString(SharedPreferences pref, int ressourceId, String defaultValue) {
- return pref.getString(context.getString(ressourceId), defaultValue);
- }
-
- private boolean getBoolean(SharedPreferences pref, int ressourceId, boolean defaultValue) {
- return pref.getBoolean(context.getString(ressourceId), defaultValue);
- }
-
- private int getInt(SharedPreferences pref, int ressourceId, int defaultValue) {
- return pref.getInt(context.getString(ressourceId), defaultValue);
- }
-
-
- /*
- // Setters & Getters
- */
- public String getProfileId() {
- return getString(prefPod, R.string.pref_key__podprofile_id, "");
- }
-
- public void setProfileId(String profileId) {
- setString(prefPod, R.string.pref_key__podprofile_id, profileId);
- }
-
- public boolean isLoadImages() {
- return getBoolean(prefApp, R.string.pref_key__load_images, true);
- }
-
- public int getMinimumFontSize() {
- switch (getString(prefApp, R.string.pref_key__font_size, "")) {
- case "huge":
- return 20;
- case "large":
- return 16;
- case "normal":
- return 8;
- default:
- setString(prefApp, R.string.pref_key__font_size, "normal");
- return 8;
- }
- }
-
- public String getAvatarUrl() {
- return getString(prefPod, R.string.pref_key__podprofile_avatar_url, "");
- }
-
- public void setAvatarUrl(String avatarUrl) {
- setString(prefPod, R.string.pref_key__podprofile_avatar_url, avatarUrl);
- }
-
- public String getName() {
- return getString(prefPod, R.string.pref_key__podprofile_name, "");
- }
-
- public void setName(String name) {
- setString(prefPod, R.string.pref_key__podprofile_name, name);
- }
-
- public String getPodDomain() {
- return getString(prefPod, R.string.pref_key__poddomain, "");
- }
-
- public void setPodDomain(String podDomain) {
- setString(prefPod, R.string.pref_key__poddomain, podDomain);
- }
-
- public boolean hasPodDomain() {
- return !getString(prefPod, R.string.pref_key__poddomain, "").equals("");
- }
-
- public String[] getPreviousPodlist() {
- return getStringArray(prefApp, R.string.pref_key__previous_podlist);
- }
-
- public void setPreviousPodlist(String[] pods) {
- setStringArray(prefApp, R.string.pref_key__previous_podlist, pods);
- }
-
- public void setPodAspects(PodAspect[] aspects) {
- setStringArray(prefPod, R.string.pref_key__podprofile_aspects, aspects);
- }
-
- public PodAspect[] getPodAspects() {
- String[] s = getStringArray(prefPod, R.string.pref_key__podprofile_aspects);
- PodAspect[] aspects = new PodAspect[s.length];
- for (int i = 0; i < aspects.length; i++) {
- aspects[i] = new PodAspect(s[i]);
- }
- return aspects;
- }
-
- public String[] getFollowedTags() {
- return getStringArray(prefPod, R.string.pref_key__podprofile_followed_tags);
- }
-
- public void setFollowedTags(String[] tags) {
- setStringArray(prefPod, R.string.pref_key__podprofile_followed_tags, tags);
- }
-
- public int getUnreadMessageCount() {
- return getInt(prefPod, R.string.pref_key__podprofile_unread_message_count, 0);
- }
-
- public void setUnreadMessageCount(int unreadMessageCount) {
- setInt(prefPod, R.string.pref_key__podprofile_unread_message_count, unreadMessageCount);
- }
-
- public int getNotificationCount() {
- return getInt(prefPod, R.string.pref_key__podprofile_notification_count, 0);
- }
-
- public void setNotificationCount(int notificationCount) {
- setInt(prefPod, R.string.pref_key__podprofile_notification_count, notificationCount);
- }
-
- public boolean isAppendSharedViaApp() {
- return getBoolean(prefApp, R.string.pref_key__append_shared_via_app, true);
- }
-
- @SuppressLint("CommitPrefEdits")
- public void setProxyEnabled(boolean enabled) {
- //commit instead of apply because the app is likely to be killed before apply is called.
- prefApp.edit().putBoolean(context.getString(R.string.pref_key__proxy_enabled), enabled).commit();
- }
-
- /**
- * Default return value: false
- *
- * @return whether proxy is enabled or not
- */
- public boolean isProxyEnabled() {
- return getBoolean(prefApp, R.string.pref_key__proxy_enabled, false);
- }
-
- public boolean wasProxyEnabled() {
- return getBoolean(prefApp, R.string.pref_key__proxy_was_enabled, false);
- }
-
- /**
- * Needed in order to determine, whether the proxy has just been disabled (trigger app restart)
- * or if proxy was disabled before (do not restart app)
- *
- * @param b new value
- */
- @SuppressLint("CommitPrefEdits")
- public void setProxyWasEnabled(boolean b) {
- prefApp.edit().putBoolean(context.getString(R.string.pref_key__proxy_was_enabled), b).commit();
- }
-
- /**
- * Default value: ""
- *
- * @return proxy host
- */
- public String getProxyHost() {
- return getString(prefApp, R.string.pref_key__proxy_host, "");
- }
-
- /**
- * Default value: 0
- *
- * @return proxy port
- */
- public int getProxyPort() {
- try {
- return Integer.parseInt(getString(prefApp, R.string.pref_key__proxy_port, "0"));
- } catch (Exception e) {
- setString(prefApp, R.string.pref_key__proxy_port, "0");
- return 0;
- }
- }
-
- public boolean isIntellihideToolbars() {
- return getBoolean(prefApp, R.string.pref_key__intellihide_toolbars, true);
- }
-
- public boolean isChromeCustomTabsEnabled() {
- return getBoolean(prefApp, R.string.pref_key__chrome_custom_tabs_enabled, true);
- }
-
- public boolean isLoggingEnabled() {
- return getBoolean(prefApp, R.string.pref_key__logging_enabled, true);
- }
-
- public boolean isLoggingSpamEnabled() {
- return getBoolean(prefApp, R.string.pref_key__logging_spam_enabled, false);
- }
-
- public boolean isVisibleInNavExit() {
- return getBoolean(prefApp, R.string.pref_key__visibility_nav__exit, false);
- }
-
- public boolean isVisibleInNavHelp_license() {
- return getBoolean(prefApp, R.string.pref_key__visibility_nav__help_license, true);
- }
-
- public boolean isVisibleInNavPublic_activities() {
- return getBoolean(prefApp, R.string.pref_key__visibility_nav__public_activities, false);
- }
-
- public boolean isVisibleInNavMentions() {
- return getBoolean(prefApp, R.string.pref_key__visibility_nav__mentions, false);
- }
-
- public boolean isVisibleInNavCommented() {
- return getBoolean(prefApp, R.string.pref_key__visibility_nav__commented, true);
- }
-
- public boolean isVisibleInNavLiked() {
- return getBoolean(prefApp, R.string.pref_key__visibility_nav__liked, true);
- }
-
- public boolean isVisibleInNavActivities() {
- return getBoolean(prefApp, R.string.pref_key__visibility_nav__activities, true);
- }
-
- public boolean isVisibleInNavAspects() {
- return getBoolean(prefApp, R.string.pref_key__visibility_nav__aspects, true);
- }
-
- public boolean isVisibleInNavFollowed_tags() {
- return getBoolean(prefApp, R.string.pref_key__visibility_nav__followed_tags, true);
- }
-
- public boolean isVisibleInNavProfile() {
- return getBoolean(prefApp, R.string.pref_key__visibility_nav__profile, false);
- }
-}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/data/PodAspect.java b/app/src/main/java/com/github/dfa/diaspora_android/data/DiasporaAspect.java
similarity index 73%
rename from app/src/main/java/com/github/dfa/diaspora_android/data/PodAspect.java
rename to app/src/main/java/com/github/dfa/diaspora_android/data/DiasporaAspect.java
index b878f679..97ad868d 100644
--- a/app/src/main/java/com/github/dfa/diaspora_android/data/PodAspect.java
+++ b/app/src/main/java/com/github/dfa/diaspora_android/data/DiasporaAspect.java
@@ -1,43 +1,44 @@
/*
- This file is part of the Diaspora for Android.
+ This file is part of the dandelion*.
- Diaspora for Android is free software: you can redistribute it and/or modify
+ dandelion* is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
- Diaspora for Android is distributed in the hope that it will be useful,
+ dandelion* is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with the Diaspora for Android.
+ along with the dandelion*.
If not, see .
*/
package com.github.dfa.diaspora_android.data;
import com.github.dfa.diaspora_android.App;
+import com.github.dfa.diaspora_android.util.AppSettings;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Locale;
-public class PodAspect {
+public class DiasporaAspect {
public long id;
public String name;
public boolean selected;
- public PodAspect(long id, String name, boolean selected) {
+ public DiasporaAspect(long id, String name, boolean selected) {
this.id = id;
this.name = name;
this.selected = selected;
}
- public PodAspect(String shareabletext) {
+ public DiasporaAspect(String shareabletext) {
// fromShareAbleText
String[] str = shareabletext.split("%");
selected = Integer.parseInt(str[0]) == 1;
@@ -45,7 +46,7 @@ public class PodAspect {
name = shareabletext.substring(shareabletext.indexOf(str[1]) + str[1].length() + 1);
}
- public PodAspect(JSONObject json) throws JSONException {
+ public DiasporaAspect(JSONObject json) throws JSONException {
if (json.has("id")) {
id = json.getLong("id");
}
@@ -70,8 +71,8 @@ public class PodAspect {
public String toHtmlLink(final App app) {
final AppSettings appSettings = app.getSettings();
return String.format(Locale.getDefault(),
- "%s",
- appSettings.getPodDomain(), id, name);
+ "%s",
+ appSettings.getPod().getPodUrl().getBaseUrl(), id, name);
}
@Override
@@ -81,7 +82,7 @@ public class PodAspect {
@Override
public boolean equals(Object o) {
- return o instanceof PodAspect && ((PodAspect) o).id == id;
+ return o instanceof DiasporaAspect && ((DiasporaAspect) o).id == id;
}
public String toShareAbleText() {
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/data/DiasporaPodList.java b/app/src/main/java/com/github/dfa/diaspora_android/data/DiasporaPodList.java
new file mode 100644
index 00000000..3052ea77
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/data/DiasporaPodList.java
@@ -0,0 +1,524 @@
+package com.github.dfa.diaspora_android.data;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+
+/**
+ * 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
+ * DiasporaPod - Data container for a Pod, can include N DiasporaPodUrl's
+ * DiasporaPodUrl - A Url of an DiasporaPod
+ * For all Classes a loading and saving to JSON method is available
+ */
+@SuppressWarnings({"WeakerAccess", "unused", "SameParameterValue", "SpellCheckingInspection", "UnusedReturnValue", "JavaDoc", "FieldCanBeLocal"})
+public class DiasporaPodList implements Iterable, Serializable {
+ private static final boolean EXPORT_TOJSON_POST_COUNT_LOCAL = true;
+ private List pods = new ArrayList<>();
+ private boolean trackMergeChanges = false;
+ private Integer trackAddedIndexStart = -1;
+ private List trackUpdatedIndexes = new ArrayList<>();
+ private boolean keepOldNameDuringMerge = false;
+ private long timestamp;
+
+ public DiasporaPodList() {
+ }
+
+ /**
+ * Load DiasporaPodList from Json
+ *
+ * @param json Json Object
+ */
+ public DiasporaPodList fromJson(JSONObject json) throws JSONException {
+ JSONArray jarr;
+ pods.clear();
+
+ if (json.has("pods")) {
+ jarr = json.getJSONArray("pods");
+ for (int i = 0; i < jarr.length(); i++) {
+ DiasporaPod pod = new DiasporaPod().fromJson(jarr.getJSONObject(i));
+ pods.add(pod);
+ }
+ }
+ if (json.has("timestamp")) {
+ timestamp = json.getLong("timestamp");
+ }
+ return this;
+ }
+
+ /**
+ * Convert DiasporaPodList to JSON
+ */
+ public JSONObject toJson() throws JSONException {
+ JSONObject json = new JSONObject();
+ JSONArray jpods = new JSONArray();
+ for (DiasporaPod pod : pods) {
+ jpods.put(pod.toJson());
+ }
+ json.put("pods", jpods);
+ json.put("timestamp", System.currentTimeMillis());
+ return json;
+ }
+
+ /**
+ * Merge newer entries into this podlist
+ * Will add new pods, and update data of pods with data from the new list
+ *
+ * @param newPodList Another podlist
+ */
+ public void mergeWithNewerEntries(final DiasporaPodList newPodList) throws JSONException {
+ if (isTrackMergeChanges()) {
+ trackAddedIndexStart = -1;
+ trackUpdatedIndexes.clear();
+ }
+ for (DiasporaPod newPod : newPodList) {
+ int index = pods.indexOf(newPod);
+ if (index >= 0) {
+ DiasporaPod updatePodBak = new DiasporaPod().fromJson(pods.get(index).toJson());
+ DiasporaPod updatePod = pods.get(index);
+ updatePod.fromJson(newPod.toJson());
+
+ // Restore Pod id (if was set to zero)
+ if (updatePodBak.getId() != 0 && updatePod.getId() == 0) {
+ updatePod.setId(updatePodBak.getId());
+ }
+ if (updatePodBak.getPostCountLocal() != 0 && updatePod.getPostCountLocal() == 0) {
+ updatePod.setPostCountLocal(updatePodBak.getPostCountLocal());
+ }
+ if (updatePodBak.getScore() != 0 && updatePod.getScore() == 0) {
+ updatePod.setScore(updatePodBak.getScore());
+ }
+ if (!updatePodBak.getName().equals("") && keepOldNameDuringMerge) {
+ updatePod.setName(updatePodBak.getName());
+ }
+ if (isTrackMergeChanges()) {
+ trackUpdatedIndexes.add(index);
+ }
+ } else {
+ pods.add(newPod);
+ if (isTrackMergeChanges() && trackAddedIndexStart == -1) {
+ trackAddedIndexStart = pods.size() - 1;
+ }
+ }
+ }
+ }
+
+ /**
+ * Sort the pod list
+ */
+ public void sortPods() {
+ Collections.sort(pods);
+ }
+
+ /**
+ * Iterator for Iterable interface (forEach, ..)
+ */
+ public Iterator iterator() {
+ return pods.iterator();
+ }
+
+ public int size() {
+ return pods.size();
+ }
+
+ public int indexOf(DiasporaPod pod) {
+ return pods.indexOf(pod);
+ }
+
+ public List getPods() {
+ return pods;
+ }
+
+ public void setPods(List pods) {
+ this.pods = pods;
+ }
+
+ public DiasporaPod getPodAt(int index) {
+ if (index >= 0 && index < pods.size()) {
+ return pods.get(index);
+ }
+ return null;
+ }
+
+ public boolean isTrackMergeChanges() {
+ return trackMergeChanges;
+ }
+
+ public void setTrackMergeChanges(boolean trackMergeChanges) {
+ this.trackMergeChanges = trackMergeChanges;
+ }
+
+ public Integer getTrackAddedIndexStart() {
+ return trackAddedIndexStart;
+ }
+
+ public List getTrackUpdatedIndexes() {
+ return trackUpdatedIndexes;
+ }
+
+ public boolean isKeepOldNameDuringMerge() {
+ return keepOldNameDuringMerge;
+ }
+
+ public void setKeepOldNameDuringMerge(boolean keepOldNameDuringMerge) {
+ this.keepOldNameDuringMerge = keepOldNameDuringMerge;
+ }
+
+
+ /* ██████╗ ██████╗ ██████╗
+ * ██╔══██╗██╔═══██╗██╔══██╗
+ * ██████╔╝██║ ██║██║ ██║
+ * ██╔═══╝ ██║ ██║██║ ██║
+ * ██║ ╚██████╔╝██████╔╝
+ * ╚═╝ ╚═════╝ ╚═════╝
+ */
+ public static class DiasporaPod implements Iterable, Comparable, Serializable {
+ private List _podUrls = new ArrayList<>();
+ private List _mainLangs = new ArrayList<>();
+ private String _name = "";
+ private int _score = 0;
+ private int _id = 0;
+ private long _postCountLocal = 0;
+
+
+ public DiasporaPod() {
+ }
+
+ /**
+ * Load a DiasporaPod from JSON
+ *
+ * @param json Json Object
+ */
+ public DiasporaPod fromJson(JSONObject json) throws JSONException {
+ JSONArray jarr;
+
+ if (json.has("name")) {
+ _name = json.getString("name");
+ }
+ if (json.has("mainLangs")) {
+ jarr = json.getJSONArray("mainLangs");
+ for (int i = 0; i < jarr.length(); i++) {
+ String val = jarr.getString(i);
+ if (!_mainLangs.contains(val)) {
+ _mainLangs.add(val);
+ }
+ }
+ }
+ if (json.has("podUrls")) {
+ jarr = json.getJSONArray("podUrls");
+ for (int i = 0; i < jarr.length(); i++) {
+ DiasporaPodUrl podUrl = new DiasporaPodUrl().fromJson(jarr.getJSONObject(i));
+ if (!_podUrls.contains(podUrl)) {
+ _podUrls.add(podUrl);
+ }
+ }
+ }
+ if (json.has("score")) {
+ _score = json.getInt("score");
+ }
+ if (json.has("postCountLocal")) {
+ _postCountLocal = json.getLong("postCountLocal");
+ }
+ if (json.has("id")) {
+ _id = json.getInt("id");
+ }
+ return this;
+ }
+
+ /**
+ * Convert DiasporaPod to JSON
+ */
+ public JSONObject toJson() throws JSONException {
+ JSONObject json = new JSONObject();
+ json.put("name", _name);
+ json.put("id", _id);
+
+ if (_score != 0) {
+ json.put("score", _score);
+ }
+
+ // Only export active6 (frequently changing if told to do)
+ if (EXPORT_TOJSON_POST_COUNT_LOCAL && _postCountLocal > 0) {
+ json.put("postCountLocal", _postCountLocal);
+ }
+
+ // Pod urls
+ JSONArray jarr = new JSONArray();
+ for (DiasporaPodUrl value : _podUrls) {
+ jarr.put(value.toJson());
+ }
+ json.put("podUrls", jarr);
+
+ // main langs
+ jarr = new JSONArray();
+ for (String value : _mainLangs) {
+ jarr.put(value);
+ }
+ json.put("mainLangs", jarr);
+ return json;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ boolean ret = false;
+ if (o instanceof DiasporaPod) {
+ DiasporaPod otherPod = (DiasporaPod) o;
+
+ // Check if id is equal
+ ret = _id != 0 && _id == otherPod._id;
+
+ // Check if _host is the same (fallback if id is 0)
+ if (!ret) {
+ for (DiasporaPodUrl podUrl : _podUrls) {
+ for (DiasporaPodUrl otherPodUrl : otherPod.getPodUrls()) {
+ if (podUrl.getBaseUrl().equals(otherPodUrl.getBaseUrl())) {
+ ret = true;
+ }
+ }
+ }
+ }
+ }
+ return ret;
+ }
+
+ @Override
+ public int compareTo(DiasporaPod otherPod) {
+ if (otherPod != null) {
+ List myPodUrls = getPodUrls();
+ List otherPodUrls = otherPod.getPodUrls();
+ if (!myPodUrls.isEmpty() && !otherPodUrls.isEmpty()) {
+ return myPodUrls.get(0).getHost().compareTo(otherPodUrls.get(0).getHost());
+ }
+ return _name.compareTo(otherPod.getName());
+ }
+ return _name.compareTo("");
+ }
+
+ @Override
+ public String toString() {
+ return _name + "(" + _id + ")";
+ }
+
+ /**
+ * Iterator for Iterable interface (forEach, ..)
+ */
+ public Iterator iterator() {
+ return _podUrls.iterator();
+ }
+
+ /*
+ * Getter & Setter
+ */
+ public List getPodUrls() {
+ return _podUrls;
+ }
+
+ public DiasporaPod setPodUrls(List podUrls) {
+ _podUrls = podUrls;
+ return this;
+ }
+
+ public List getMainLangs() {
+ return _mainLangs;
+ }
+
+ public DiasporaPod setMainLangs(List mainLangs) {
+ _mainLangs = mainLangs;
+ return this;
+ }
+
+ public DiasporaPod appendMainLangs(String... values) {
+ _mainLangs.addAll(Arrays.asList(values));
+ return this;
+ }
+
+ /**
+ * Returns the first DiasporaPodUrl in the list
+ */
+ public DiasporaPodUrl getPodUrl() {
+ if (_podUrls.size() > 0) {
+ return _podUrls.get(0);
+ }
+ return null;
+ }
+
+ public DiasporaPod appendPodUrls(DiasporaPodUrl... values) {
+ _podUrls.addAll(Arrays.asList(values));
+ return this;
+ }
+
+ public String getName() {
+ return _name;
+ }
+
+ public DiasporaPod setName(String name) {
+ _name = name;
+ return this;
+ }
+
+ public int getScore() {
+ return _score;
+ }
+
+ public DiasporaPod setScore(int score) {
+ _score = score;
+ return this;
+ }
+
+ public long getPostCountLocal() {
+ return _postCountLocal;
+ }
+
+ public DiasporaPod setPostCountLocal(long postCountLocal) {
+ _postCountLocal = postCountLocal;
+ return this;
+ }
+
+ public int getId() {
+ return _id;
+ }
+
+ public DiasporaPod setId(int id) {
+ _id = id;
+ return this;
+ }
+
+ /* ██████╗ ██████╗ ██████╗ ██╗ ██╗██████╗ ██╗
+ * ██╔══██╗██╔═══██╗██╔══██╗ ██║ ██║██╔══██╗██║
+ * ██████╔╝██║ ██║██║ ██║ ██║ ██║██████╔╝██║
+ * ██╔═══╝ ██║ ██║██║ ██║ ██║ ██║██╔══██╗██║
+ * ██║ ╚██████╔╝██████╔╝ ╚██████╔╝██║ ██║███████╗
+ * ╚═╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝
+ */
+ public static class DiasporaPodUrl implements Serializable {
+ private String _host = "";
+ private String _protocol = "https";
+ private Integer _port = 443;
+
+ public DiasporaPodUrl() {
+ }
+
+ public DiasporaPodUrl(JSONObject json) throws JSONException {
+ fromJson(json);
+ }
+
+ /**
+ * Get the base url
+ *
+ * @return
+ */
+ public String getBaseUrl() {
+ return _protocol + "://" + _host + (isPortNeeded() ? _port : "");
+ }
+
+ /**
+ * Convert JSON to DiasporaPodList
+ *
+ * @param json JSON Object
+ */
+ public DiasporaPodUrl fromJson(JSONObject json) throws JSONException {
+ if (json.has("host")) {
+ _host = json.getString("host");
+ }
+ if (json.has("protocol")) {
+ _protocol = json.getString("protocol");
+ }
+ if (json.has("port")) {
+ _port = json.getInt("port");
+ }
+ return this;
+ }
+
+ /***
+ * Convert DiasporaPodList to JSON
+ */
+ public JSONObject toJson() throws JSONException {
+ JSONObject json = new JSONObject();
+ json.put("host", _host);
+ if (!_protocol.equals("https")) {
+ json.put("protocol", _protocol);
+ }
+ if (_port != 443) {
+ json.put("port", _port);
+ }
+ return json;
+ }
+
+ /**
+ * Set default values for https
+ */
+ public void setHttpsDefaults() {
+ setProtocol("https");
+ setPort(443);
+ }
+
+
+ /**
+ * Set default values for http
+ */
+ public void setHttpDefaults() {
+ setProtocol("http");
+ setPort(80);
+ }
+
+ /**
+ * Tells if the ports needs to shown
+ */
+ public boolean isPortNeeded() {
+ return !((_port == 80 && _protocol.equals("http")) || (_port == 443 && _protocol.equals("https")));
+ }
+
+ @Override
+ public String toString() {
+ return getBaseUrl();
+ }
+
+ @Override
+ @SuppressWarnings("SimplifiableIfStatement")
+ public boolean equals(Object o) {
+ if (o instanceof DiasporaPodUrl) {
+ return getBaseUrl().equals(((DiasporaPodUrl) o).getBaseUrl());
+ }
+ return false;
+ }
+
+ /*
+ * GETTER & SETTER
+ */
+ public String getHost() {
+ return _host;
+ }
+
+ public DiasporaPodUrl setHost(String host) {
+ _host = host;
+ return this;
+ }
+
+ public String getProtocol() {
+ return _protocol;
+ }
+
+ public DiasporaPodUrl setProtocol(String protocol) {
+ _protocol = protocol;
+ return this;
+ }
+
+ public Integer getPort() {
+ return _port;
+ }
+
+ public DiasporaPodUrl setPort(Integer port) {
+ _port = port;
+ return this;
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/data/PodUserProfile.java b/app/src/main/java/com/github/dfa/diaspora_android/data/DiasporaUserProfile.java
similarity index 68%
rename from app/src/main/java/com/github/dfa/diaspora_android/data/PodUserProfile.java
rename to app/src/main/java/com/github/dfa/diaspora_android/data/DiasporaUserProfile.java
index b670513c..22efea59 100644
--- a/app/src/main/java/com/github/dfa/diaspora_android/data/PodUserProfile.java
+++ b/app/src/main/java/com/github/dfa/diaspora_android/data/DiasporaUserProfile.java
@@ -1,18 +1,18 @@
/*
- This file is part of the Diaspora for Android.
+ This file is part of the dandelion*.
- Diaspora for Android is free software: you can redistribute it and/or modify
+ dandelion* is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
- Diaspora for Android is distributed in the hope that it will be useful,
+ dandelion* is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with the Diaspora for Android.
+ along with the dandelion*.
If not, see .
*/
@@ -20,11 +20,11 @@ package com.github.dfa.diaspora_android.data;
import android.os.Handler;
-import com.github.dfa.diaspora_android.util.AppLog;
-import com.github.dfa.diaspora_android.util.Log;
-
import com.github.dfa.diaspora_android.App;
-import com.github.dfa.diaspora_android.listener.WebUserProfileChangedListener;
+import com.github.dfa.diaspora_android.listener.DiasporaUserProfileChangedListener;
+import com.github.dfa.diaspora_android.util.AppLog;
+import com.github.dfa.diaspora_android.util.AppSettings;
+import com.github.dfa.diaspora_android.util.DiasporaUrlHelper;
import org.json.JSONArray;
import org.json.JSONException;
@@ -32,49 +32,56 @@ import org.json.JSONObject;
/**
* User profile
- * Created by gsantner (https://gsantner.github.io/) on 24.03.16. Part of Diaspora for Android.
+ * Created by gsantner (gsantner AT mailbox DOT org) on 24.03.16. Part of dandelion*.
*/
-public class PodUserProfile {
- private static final int MINIMUM_WEBUSERPROFILE_LOAD_TIMEDIFF = 5000;
+public class DiasporaUserProfile {
+ private static final int MINIMUM_USERPROFILE_LOAD_TIMEDIFF = 5000;
private Handler callbackHandler;
- private WebUserProfileChangedListener listener;
+ private DiasporaUserProfileChangedListener listener;
private final App app;
private final AppSettings appSettings;
+ DiasporaUrlHelper urls;
private JSONObject json;
- private long lastLoaded;
+ private long userProfileLastLoadedTimestamp;
private boolean isWebUserProfileLoaded;
private String avatarUrl;
private String guid;
private String name;
- private PodAspect[] podAspects;
+ private DiasporaAspect[] aspects;
private String[] followedTags;
private int notificationCount;
private int unreadMessagesCount;
+ private long lastVisitedPositionInStream = -1;
- public PodUserProfile(App app) {
+ public DiasporaUserProfile(App app) {
this.app = app;
appSettings = app.getSettings();
+ urls = new DiasporaUrlHelper(appSettings);
+ loadFromAppSettings();
+ }
+ public void loadFromAppSettings() {
avatarUrl = appSettings.getAvatarUrl();
guid = appSettings.getProfileId();
name = appSettings.getName();
- podAspects = appSettings.getPodAspects();
+ aspects = appSettings.getAspects();
followedTags = appSettings.getFollowedTags();
notificationCount = appSettings.getNotificationCount();
unreadMessagesCount = appSettings.getUnreadMessageCount();
+ lastVisitedPositionInStream = appSettings.getLastVisitedPositionInStream();
}
- public PodUserProfile(App app, Handler callbackHandler, WebUserProfileChangedListener listener) {
+ public DiasporaUserProfile(App app, Handler callbackHandler, DiasporaUserProfileChangedListener listener) {
this(app);
this.listener = listener;
this.callbackHandler = callbackHandler;
}
public boolean isRefreshNeeded() {
- return (System.currentTimeMillis() - lastLoaded) >= MINIMUM_WEBUSERPROFILE_LOAD_TIMEDIFF;
+ return (System.currentTimeMillis() - userProfileLastLoadedTimestamp) >= MINIMUM_USERPROFILE_LOAD_TIMEDIFF;
}
public boolean isWebUserProfileLoaded() {
@@ -84,7 +91,7 @@ public class PodUserProfile {
public boolean parseJson(String jsonStr) {
try {
json = new JSONObject(jsonStr);
- lastLoaded = System.currentTimeMillis();
+ userProfileLastLoadedTimestamp = System.currentTimeMillis();
// Avatar
if (json.has("avatar")) {
@@ -96,7 +103,7 @@ public class PodUserProfile {
}
// GUID (User id)
- if (json.has("guid") && loadGuid(json.getString("guid"))) {
+ if (json.has("guid") && loadGuid(json.getString("guid")) && !guid.isEmpty()) {
appSettings.setProfileId(guid);
}
@@ -117,7 +124,7 @@ public class PodUserProfile {
// Aspect
if (json.has("aspects") && loadAspects(json.getJSONArray("aspects"))) {
- appSettings.setPodAspects(podAspects);
+ appSettings.setPodAspects(aspects);
}
// Followed tags
@@ -128,13 +135,23 @@ public class PodUserProfile {
isWebUserProfileLoaded = true;
} catch (JSONException e) {
- AppLog.d(this, e.getMessage());
+ AppLog.d(this, e.getMessage());
isWebUserProfileLoaded = false;
}
- lastLoaded = System.currentTimeMillis();
+ userProfileLastLoadedTimestamp = System.currentTimeMillis();
return isWebUserProfileLoaded;
}
+ public void analyzeUrl(String url) {
+ String prefix = urls.getPodUrl() + DiasporaUrlHelper.SUBURL_STREAM_WITH_TIMESTAMP;
+ if (url.startsWith(prefix)) {
+ try {
+ setLastVisitedPositionInStream(Long.parseLong(url.replace(prefix, "")));
+ } catch (NumberFormatException ignored) {
+ }
+ }
+ }
+
/*
// Getters & Setters
*/
@@ -159,20 +176,38 @@ public class PodUserProfile {
return unreadMessagesCount;
}
- public PodAspect[] getAspects() {
- return podAspects;
+ public DiasporaAspect[] getAspects() {
+ return aspects;
}
public String[] getFollowedTags() {
return followedTags;
}
+ public long getLastVisitedPositionInStream() {
+ return lastVisitedPositionInStream;
+ }
+
+ public void setLastVisitedPositionInStream(long lastVisitedPositionInStream) {
+ this.lastVisitedPositionInStream = lastVisitedPositionInStream;
+ appSettings.setLastVisitedPositionInStream(lastVisitedPositionInStream);
+ }
+
+ public boolean hasLastVisitedTimestampInStream() {
+ return appSettings.getLastVisitedPositionInStream() != -1;
+ }
+
+ public void resetLastVisitedPositionInStream() {
+ appSettings.setLastVisitedPositionInStream(-1);
+ }
+
/*
* Private property setters
*/
/**
* Sets the avatar, returns true if this was a new one, false if already the old one
+ *
* @param avatarUrl url
* @return true if new avatar url
*/
@@ -182,7 +217,7 @@ public class PodUserProfile {
if (listener != null && callbackHandler != null) {
callbackHandler.post(new Runnable() {
public void run() {
- listener.onUserProfileAvatarChanged(avatarUrl);
+ listener.onUserProfileAvatarChanged(DiasporaUserProfile.this, avatarUrl);
}
});
}
@@ -205,7 +240,7 @@ public class PodUserProfile {
if (listener != null && callbackHandler != null) {
callbackHandler.post(new Runnable() {
public void run() {
- listener.onUserProfileNameChanged(name);
+ listener.onUserProfileNameChanged(DiasporaUserProfile.this, name);
}
});
}
@@ -220,7 +255,7 @@ public class PodUserProfile {
if (listener != null && callbackHandler != null) {
callbackHandler.post(new Runnable() {
public void run() {
- listener.onNotificationCountChanged(notificationCount);
+ listener.onNotificationCountChanged(DiasporaUserProfile.this, notificationCount);
}
});
}
@@ -230,9 +265,9 @@ public class PodUserProfile {
}
private boolean loadAspects(final JSONArray jsonAspects) throws JSONException {
- podAspects = new PodAspect[jsonAspects.length()];
+ aspects = new DiasporaAspect[jsonAspects.length()];
for (int i = 0; i < jsonAspects.length(); i++) {
- podAspects[i] = new PodAspect(jsonAspects.getJSONObject(i));
+ aspects[i] = new DiasporaAspect(jsonAspects.getJSONObject(i));
}
return true;
}
@@ -251,7 +286,7 @@ public class PodUserProfile {
if (listener != null && callbackHandler != null) {
callbackHandler.post(new Runnable() {
public void run() {
- listener.onUnreadMessageCountChanged(unreadMessagesCount);
+ listener.onUnreadMessageCountChanged(DiasporaUserProfile.this, unreadMessagesCount);
}
});
}
@@ -268,11 +303,11 @@ public class PodUserProfile {
this.callbackHandler = callbackHandler;
}
- public WebUserProfileChangedListener getListener() {
+ public DiasporaUserProfileChangedListener getListener() {
return listener;
}
- public void setListener(WebUserProfileChangedListener listener) {
+ public void setListener(DiasporaUserProfileChangedListener listener) {
this.listener = listener;
}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/listener/DiasporaUserProfileChangedListener.java b/app/src/main/java/com/github/dfa/diaspora_android/listener/DiasporaUserProfileChangedListener.java
new file mode 100644
index 00000000..dc1b67dc
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/listener/DiasporaUserProfileChangedListener.java
@@ -0,0 +1,59 @@
+/*
+ This file is part of the dandelion*.
+
+ dandelion* is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ dandelion* is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the dandelion*.
+
+ If not, see .
+ */
+package com.github.dfa.diaspora_android.listener;
+
+import com.github.dfa.diaspora_android.data.DiasporaUserProfile;
+
+/**
+ * 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
+ */
+public interface DiasporaUserProfileChangedListener {
+ /**
+ * Called when the DiasporaUserProfile name changed
+ *
+ * @param diasporaUserProfile The profile
+ * @param name The new name
+ */
+ void onUserProfileNameChanged(DiasporaUserProfile diasporaUserProfile, String name);
+
+ /**
+ * Called when the DiasporaUserProfile avatarUrl changed
+ *
+ * @param diasporaUserProfile The profile
+ * @param avatarUrl The new name
+ */
+ void onUserProfileAvatarChanged(DiasporaUserProfile diasporaUserProfile, String avatarUrl);
+
+ /**
+ * Called when the DiasporaUserProfile notificationCount changed
+ *
+ * @param diasporaUserProfile The profile
+ * @param notificationCount The new notificationCount
+ */
+ void onNotificationCountChanged(DiasporaUserProfile diasporaUserProfile, int notificationCount);
+
+ /**
+ * Called when the DiasporaUserProfile unreadMessageCount changed
+ *
+ * @param diasporaUserProfile The profile
+ * @param unreadMessageCount The new unreadMessageCount
+ */
+ void onUnreadMessageCountChanged(DiasporaUserProfile diasporaUserProfile, int unreadMessageCount);
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/listener/IntellihideToolbarActivityListener.java b/app/src/main/java/com/github/dfa/diaspora_android/listener/IntellihideToolbarActivityListener.java
new file mode 100644
index 00000000..58f04704
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/listener/IntellihideToolbarActivityListener.java
@@ -0,0 +1,14 @@
+package com.github.dfa.diaspora_android.listener;
+
+import android.support.design.widget.AppBarLayout;
+
+/**
+ * interface that adds options to control intellihide of toolbars to the Activity
+ * Created by vanitas on 08.10.16.
+ */
+
+public interface IntellihideToolbarActivityListener {
+ int toolbarDefaultScrollFlags = AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS | AppBarLayout.LayoutParams.SCROLL_FLAG_SNAP;
+
+ void setToolbarIntellihide(boolean enable);
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/listener/OnSomethingClickListener.java b/app/src/main/java/com/github/dfa/diaspora_android/listener/OnSomethingClickListener.java
new file mode 100644
index 00000000..86ae6789
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/listener/OnSomethingClickListener.java
@@ -0,0 +1,15 @@
+package com.github.dfa.diaspora_android.listener;
+
+/**
+ * Listener for different types of click events
+ */
+public interface OnSomethingClickListener {
+ /**
+ * Triggered when something was clicked
+ *
+ * @param o Some object, or null
+ * @param i Some index, int value or null
+ * @param s Some String, or null
+ */
+ void onSomethingClicked(T o, Integer i, String s);
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/listener/WebUserProfileChangedListener.java b/app/src/main/java/com/github/dfa/diaspora_android/listener/WebUserProfileChangedListener.java
deleted file mode 100644
index 9ef24a1f..00000000
--- a/app/src/main/java/com/github/dfa/diaspora_android/listener/WebUserProfileChangedListener.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- This file is part of the Diaspora for Android.
-
- Diaspora for Android is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Diaspora for Android is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with the Diaspora for Android.
-
- If not, see .
- */
-package com.github.dfa.diaspora_android.listener;
-
-/**
- * Created by gsantner (https://gsantner.github.io/) on 26.03.16.
- * Interface that needs to be implemented by classes that listen for Profile related changes
- */
-public interface WebUserProfileChangedListener {
- void onUserProfileNameChanged(String name);
-
- void onUserProfileAvatarChanged(String avatarUrl);
-
- void onNotificationCountChanged(int notificationCount);
-
- void onUnreadMessageCountChanged(int unreadMessageCount);
-}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/receivers/OpenExternalLinkReceiver.java b/app/src/main/java/com/github/dfa/diaspora_android/receiver/OpenExternalLinkReceiver.java
similarity index 56%
rename from app/src/main/java/com/github/dfa/diaspora_android/receivers/OpenExternalLinkReceiver.java
rename to app/src/main/java/com/github/dfa/diaspora_android/receiver/OpenExternalLinkReceiver.java
index 0ef48e4f..496a8c6e 100644
--- a/app/src/main/java/com/github/dfa/diaspora_android/receivers/OpenExternalLinkReceiver.java
+++ b/app/src/main/java/com/github/dfa/diaspora_android/receiver/OpenExternalLinkReceiver.java
@@ -1,4 +1,22 @@
-package com.github.dfa.diaspora_android.receivers;
+/*
+ This file is part of the dandelion*.
+
+ dandelion* is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ dandelion* is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the dandelion*.
+
+ If not, see .
+ */
+package com.github.dfa.diaspora_android.receiver;
import android.app.Activity;
import android.content.BroadcastReceiver;
@@ -9,15 +27,13 @@ import android.graphics.BitmapFactory;
import android.net.Uri;
import android.support.customtabs.CustomTabsIntent;
-import com.github.dfa.diaspora_android.App;
import com.github.dfa.diaspora_android.R;
import com.github.dfa.diaspora_android.activity.MainActivity;
-import com.github.dfa.diaspora_android.data.AppSettings;
+import com.github.dfa.diaspora_android.ui.theme.ThemeHelper;
import com.github.dfa.diaspora_android.util.AppLog;
-import com.github.dfa.diaspora_android.util.CustomTabHelpers.BrowserFallback;
-import com.github.dfa.diaspora_android.util.CustomTabHelpers.CustomTabActivityHelper;
-import com.github.dfa.diaspora_android.util.Helpers;
-import com.github.dfa.diaspora_android.util.Log;
+import com.github.dfa.diaspora_android.util.AppSettings;
+import com.github.dfa.diaspora_android.web.custom_tab.BrowserFallback;
+import com.github.dfa.diaspora_android.web.custom_tab.CustomTabActivityHelper;
/**
* BroadcastReceiver that opens links in a Chrome CustomTab
@@ -32,23 +48,24 @@ public class OpenExternalLinkReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context c, Intent receiveIntent) {
- AppSettings settings = new AppSettings(c);
+ AppSettings appSettings = AppSettings.get();
+ ThemeHelper.getInstance(appSettings);
- AppLog.v(this, "OpenExternalLinkReceiver.onReceive(): url");
+ AppLog.v(this, "OpenExternalLinkReceiver.onReceive(): url");
- Uri url = null;
+ Uri url;
try {
String sUrl = receiveIntent.getStringExtra(MainActivity.EXTRA_URL);
url = Uri.parse(sUrl);
} catch (Exception _ignored) {
- AppLog.v(this, "Could not open Chrome Custom Tab (bad URL)");
+ AppLog.v(this, "Could not open Chrome Custom Tab (bad URL)");
return;
}
- if (settings.isChromeCustomTabsEnabled()) {
+ if (appSettings.isChromeCustomTabsEnabled()) {
// Setup Chrome Custom Tab
CustomTabsIntent.Builder customTab = new CustomTabsIntent.Builder();
- customTab.setToolbarColor(Helpers.getColorFromRessource(c, R.color.colorPrimary));
+ customTab.setToolbarColor(ThemeHelper.getPrimaryColor());
customTab.addDefaultShareMenuItem();
Bitmap backButtonIcon = BitmapFactory.decodeResource(c.getResources(), R.drawable.chrome_custom_tab__back);
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/receivers/UpdateTitleReceiver.java b/app/src/main/java/com/github/dfa/diaspora_android/receiver/UpdateTitleReceiver.java
similarity index 59%
rename from app/src/main/java/com/github/dfa/diaspora_android/receivers/UpdateTitleReceiver.java
rename to app/src/main/java/com/github/dfa/diaspora_android/receiver/UpdateTitleReceiver.java
index c722baac..c6dddb6b 100644
--- a/app/src/main/java/com/github/dfa/diaspora_android/receivers/UpdateTitleReceiver.java
+++ b/app/src/main/java/com/github/dfa/diaspora_android/receiver/UpdateTitleReceiver.java
@@ -1,4 +1,22 @@
-package com.github.dfa.diaspora_android.receivers;
+/*
+ This file is part of the dandelion*.
+
+ dandelion* is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ dandelion* is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the dandelion*.
+
+ If not, see .
+ */
+package com.github.dfa.diaspora_android.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -7,12 +25,12 @@ import android.content.Intent;
import com.github.dfa.diaspora_android.App;
import com.github.dfa.diaspora_android.R;
import com.github.dfa.diaspora_android.activity.MainActivity;
-import com.github.dfa.diaspora_android.data.AppSettings;
import com.github.dfa.diaspora_android.util.AppLog;
+import com.github.dfa.diaspora_android.util.AppSettings;
import com.github.dfa.diaspora_android.util.DiasporaUrlHelper;
/**
- * BroadcastReceiver used to update the title of the MainActivity depending on the url of the webview
+ * BroadcastReceiver used to update the title of the MainActivity depending on the url of the ui__webview
* Created by vanitas on 11.09.16.
*/
public class UpdateTitleReceiver extends BroadcastReceiver {
@@ -20,6 +38,7 @@ public class UpdateTitleReceiver extends BroadcastReceiver {
private AppSettings appSettings;
private App app;
private TitleCallback callback;
+ private String lastUrl;
public UpdateTitleReceiver(App app, DiasporaUrlHelper urls, TitleCallback callback) {
this.urls = urls;
@@ -30,20 +49,24 @@ public class UpdateTitleReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
- String url = intent.getStringExtra(MainActivity.EXTRA_URL);
- if (url != null && url.startsWith(urls.getPodUrl())) {
- String subUrl = url.substring((urls.getPodUrl()).length());
+ lastUrl = intent.getStringExtra(MainActivity.EXTRA_URL);
+ if (lastUrl != null && lastUrl.startsWith(urls.getPodUrl())) {
+ String subUrl = lastUrl.substring((urls.getPodUrl()).length());
AppLog.spam(this, "onReceive()- Set title for subUrl " + subUrl);
if (subUrl.startsWith(DiasporaUrlHelper.SUBURL_STREAM)) {
setTitle(R.string.nav_stream);
} else if (subUrl.startsWith(DiasporaUrlHelper.SUBURL_POSTS)) {
- setTitle(R.string.diaspora);
+ setTitle(R.string.app_name);
} else if (subUrl.startsWith(DiasporaUrlHelper.SUBURL_NOTIFICATIONS)) {
setTitle(R.string.notifications);
} else if (subUrl.startsWith(DiasporaUrlHelper.SUBURL_CONVERSATIONS)) {
setTitle(R.string.conversations);
} else if (subUrl.startsWith(DiasporaUrlHelper.SUBURL_NEW_POST)) {
setTitle(R.string.new_post);
+ } else if (subUrl.startsWith(DiasporaUrlHelper.SUBURL_STATISTICS)) {
+ setTitle(R.string.statistics);
+ } else if (subUrl.startsWith(DiasporaUrlHelper.SUBURL_CONTACTS)) {
+ setTitle(R.string.contacts);
} else if (subUrl.startsWith(DiasporaUrlHelper.SUBURL_PEOPLE + appSettings.getProfileId())) {
setTitle(R.string.nav_profile);
} else if (subUrl.startsWith(DiasporaUrlHelper.SUBURL_ACTIVITY)) {
@@ -56,25 +79,25 @@ public class UpdateTitleReceiver extends BroadcastReceiver {
setTitle(R.string.nav_mentions);
} else if (subUrl.startsWith(DiasporaUrlHelper.SUBURL_PUBLIC)) {
setTitle(R.string.public_);
- } else if (urls.isAspectUrl(url)) {
- setTitle(urls.getAspectNameFromUrl(url, app));
+ } else if (urls.isAspectUrl(lastUrl)) {
+ setTitle(urls.getAspectNameFromUrl(lastUrl, app));
}
} else {
- AppLog.spam(this, "onReceive()- Invalid url: " + url);
+ AppLog.spam(this, "onReceive()- Invalid url: " + lastUrl);
}
}
private void setTitle(int rId) {
- callback.setTitle(rId);
+ callback.setTitle(lastUrl, rId);
}
private void setTitle(String title) {
- callback.setTitle(title);
+ callback.setTitle(lastUrl, title);
}
public interface TitleCallback {
- void setTitle(int Rid);
+ void setTitle(String url, int resId);
- void setTitle(String title);
+ void setTitle(String url, String title);
}
}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/util/AvatarImageLoader.java b/app/src/main/java/com/github/dfa/diaspora_android/service/AvatarImageLoader.java
similarity index 75%
rename from app/src/main/java/com/github/dfa/diaspora_android/util/AvatarImageLoader.java
rename to app/src/main/java/com/github/dfa/diaspora_android/service/AvatarImageLoader.java
index eee45f6a..ab975326 100644
--- a/app/src/main/java/com/github/dfa/diaspora_android/util/AvatarImageLoader.java
+++ b/app/src/main/java/com/github/dfa/diaspora_android/service/AvatarImageLoader.java
@@ -1,30 +1,30 @@
/*
- This file is part of the Diaspora for Android.
+ This file is part of the dandelion*.
- Diaspora for Android is free software: you can redistribute it and/or modify
+ dandelion* is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
- Diaspora for Android is distributed in the hope that it will be useful,
+ dandelion* is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with the Diaspora for Android.
+ along with the dandelion*.
If not, see .
*/
-
-package com.github.dfa.diaspora_android.util;
+
+package com.github.dfa.diaspora_android.service;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.ImageView;
-import com.github.dfa.diaspora_android.task.ImageDownloadTask;
+import net.gsantner.opoc.util.DownloadTask;
import java.io.File;
@@ -54,7 +54,9 @@ public class AvatarImageLoader {
public void startImageDownload(ImageView imageView, String avatarUrl) {
if (!avatarUrl.equals("")) {
- new ImageDownloadTask(imageView, avatarFile.getAbsolutePath()).execute(avatarUrl);
+ new DownloadTask(new File(avatarFile.getAbsolutePath()), (ok, file) -> {
+ loadToImageView(imageView);
+ }).execute(avatarUrl);
}
}
}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/service/FetchPodsService.java b/app/src/main/java/com/github/dfa/diaspora_android/service/FetchPodsService.java
new file mode 100644
index 00000000..d9a24ecd
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/service/FetchPodsService.java
@@ -0,0 +1,114 @@
+/*
+ This file is part of the dandelion*.
+
+ dandelion* is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ dandelion* is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the dandelion*.
+
+ If not, see .
+ */
+package com.github.dfa.diaspora_android.service;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.os.IBinder;
+import android.support.v4.content.LocalBroadcastManager;
+
+import com.github.dfa.diaspora_android.data.DiasporaPodList;
+import com.github.dfa.diaspora_android.util.AppLog;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import javax.net.ssl.HttpsURLConnection;
+
+import info.guardianproject.netcipher.NetCipher;
+
+public class FetchPodsService extends Service {
+ public static final String MESSAGE_PODS_RECEIVED = "com.github.dfa.diaspora.podsreceived";
+ public static final String EXTRA_PODLIST = "pods";
+
+ public FetchPodsService() {
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ new GetPodsTask(this).execute();
+ return super.onStartCommand(intent, flags, startId);
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ // TODO: Return the communication channel to the service.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+}
+
+class GetPodsTask extends AsyncTask {
+ private static final String PODDY_PODLIST_URL = "https://raw.githubusercontent.com/gsantner/dandelion/master/app/src/main/res/raw/podlist.json";
+
+ private final Service service;
+
+ GetPodsTask(Service service) {
+ this.service = service;
+ }
+
+ @Override
+ protected DiasporaPodList doInBackground(Void... params) {
+ StringBuilder sb = new StringBuilder();
+ BufferedReader br = null;
+ try {
+ HttpsURLConnection con = NetCipher.getHttpsURLConnection(PODDY_PODLIST_URL);
+ if (con.getResponseCode() == HttpsURLConnection.HTTP_OK) {
+ br = new BufferedReader(new InputStreamReader(con.getInputStream()));
+ String line;
+ while ((line = br.readLine()) != null) {
+ sb.append(line);
+ }
+
+ // Parse JSON & return pod list
+ JSONObject json = new JSONObject(sb.toString());
+ return new DiasporaPodList().fromJson(json);
+ } else {
+ AppLog.e(this, "Failed to download list of pods");
+ }
+ } catch (IOException | JSONException e) {
+ e.printStackTrace();
+ } finally {
+ if (br != null) {
+ try {
+ br.close();
+ } catch (IOException ignored) {
+ }
+ }
+ }
+
+ // Could not fetch list of pods :(
+ return new DiasporaPodList();
+ }
+
+ @Override
+ protected void onPostExecute(DiasporaPodList pods) {
+ if (pods == null) {
+ pods = new DiasporaPodList();
+ }
+ Intent broadcastIntent = new Intent(FetchPodsService.MESSAGE_PODS_RECEIVED);
+ broadcastIntent.putExtra(FetchPodsService.EXTRA_PODLIST, pods);
+ LocalBroadcastManager.getInstance(service.getApplicationContext()).sendBroadcast(broadcastIntent);
+ service.stopSelf();
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/data/HashtagProvider.java b/app/src/main/java/com/github/dfa/diaspora_android/service/HashtagContentProvider.java
similarity index 79%
rename from app/src/main/java/com/github/dfa/diaspora_android/data/HashtagProvider.java
rename to app/src/main/java/com/github/dfa/diaspora_android/service/HashtagContentProvider.java
index bcd18511..4c7b744e 100644
--- a/app/src/main/java/com/github/dfa/diaspora_android/data/HashtagProvider.java
+++ b/app/src/main/java/com/github/dfa/diaspora_android/service/HashtagContentProvider.java
@@ -1,31 +1,31 @@
/*
- This file is part of the Diaspora for Android.
+ This file is part of the dandelion*.
- Diaspora for Android is free software: you can redistribute it and/or modify
+ dandelion* is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
- Diaspora for Android is distributed in the hope that it will be useful,
+ dandelion* is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with the Diaspora for Android.
+ along with the dandelion*.
If not, see .
This file is inspired from sourabhsoni.com/implementing-hashtags-in-android-application/
*/
-package com.github.dfa.diaspora_android.data;
+package com.github.dfa.diaspora_android.service;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
-public class HashtagProvider extends ContentProvider {
+public class HashtagContentProvider extends ContentProvider {
@Override
public int delete(Uri arg0, String arg1, String[] arg2) {
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/task/ProfileFetchTask.java b/app/src/main/java/com/github/dfa/diaspora_android/service/ProfileFetchTask.java
similarity index 82%
rename from app/src/main/java/com/github/dfa/diaspora_android/task/ProfileFetchTask.java
rename to app/src/main/java/com/github/dfa/diaspora_android/service/ProfileFetchTask.java
index 7d4e70e2..4f0b3491 100644
--- a/app/src/main/java/com/github/dfa/diaspora_android/task/ProfileFetchTask.java
+++ b/app/src/main/java/com/github/dfa/diaspora_android/service/ProfileFetchTask.java
@@ -1,32 +1,30 @@
/*
- This file is part of the Diaspora for Android.
+ This file is part of the dandelion*.
- Diaspora for Android is free software: you can redistribute it and/or modify
+ dandelion* is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
- Diaspora for Android is distributed in the hope that it will be useful,
+ dandelion* is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with the Diaspora for Android.
+ along with the dandelion*.
If not, see .
*/
-package com.github.dfa.diaspora_android.task;
+package com.github.dfa.diaspora_android.service;
import android.content.Context;
import android.os.AsyncTask;
-
-import com.github.dfa.diaspora_android.util.AppLog;
-import com.github.dfa.diaspora_android.util.Log;
import android.webkit.CookieManager;
import com.github.dfa.diaspora_android.App;
-import com.github.dfa.diaspora_android.data.PodUserProfile;
+import com.github.dfa.diaspora_android.data.DiasporaUserProfile;
+import com.github.dfa.diaspora_android.util.AppLog;
import com.github.dfa.diaspora_android.util.DiasporaUrlHelper;
import java.io.BufferedReader;
@@ -62,7 +60,7 @@ public class ProfileFetchTask extends AsyncTask {
String extractedProfileData = null;
final CookieManager cookieManager = app.getCookieManager();
String cookies = cookieManager.getCookie(urls.getPodUrl());
- AppLog.d(this, cookies);
+ AppLog.d(this, cookies);
HttpsURLConnection connection;
InputStream inStream;
@@ -88,10 +86,10 @@ public class ProfileFetchTask extends AsyncTask {
}
}
- try{
+ try {
br.close();
inStream.close();
- } catch (IOException e){/*Nothing*/}
+ } catch (IOException e) {/*Nothing*/}
connection.disconnect();
@@ -101,9 +99,9 @@ public class ProfileFetchTask extends AsyncTask {
if (extractedProfileData != null) {
- PodUserProfile profile = new PodUserProfile(app);
+ DiasporaUserProfile profile = new DiasporaUserProfile(app);
profile.parseJson(extractedProfileData);
- AppLog.d(this, "Extracted new_messages (service):" + profile.getUnreadMessagesCount());
+ AppLog.d(this, "Extracted new_messages (service):" + profile.getUnreadMessagesCount());
}
return null;
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/task/GetPodsService.java b/app/src/main/java/com/github/dfa/diaspora_android/task/GetPodsService.java
deleted file mode 100644
index afce5e01..00000000
--- a/app/src/main/java/com/github/dfa/diaspora_android/task/GetPodsService.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- This file is part of the Diaspora for Android.
-
- Diaspora for Android is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Diaspora for Android is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with the Diaspora for Android.
-
- If not, see .
- */
-package com.github.dfa.diaspora_android.task;
-
-import android.app.Service;
-import android.content.Intent;
-import android.os.AsyncTask;
-import android.os.IBinder;
-import android.support.v4.content.LocalBroadcastManager;
-
-import com.github.dfa.diaspora_android.util.AppLog;
-
-import org.json.JSONArray;
-import org.json.JSONObject;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.net.ssl.HttpsURLConnection;
-
-import info.guardianproject.netcipher.NetCipher;
-
-public class GetPodsService extends Service {
- public static final String MESSAGE_PODS_RECEIVED = "com.github.dfa.diaspora.podsreceived";
-
- public GetPodsService() {
- }
-
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- getPods();
- return super.onStartCommand(intent, flags, startId);
- }
-
- private void getPods() {
- /*
- * Most of the code in this AsyncTask is from the file getPodlistTask.java
- * from the app "Diaspora Webclient".
- * A few modifications and adaptations were made by me.
- * Source:
- * https://github.com/voidcode/Diaspora-Webclient/blob/master/src/com/voidcode/diasporawebclient/getPodlistTask.java
- * Thanks to Terkel Sørensen ; License : GPLv3
- */
- AsyncTask getPodsAsync = new AsyncTask() {
- @Override
- protected String[] doInBackground(Void... params) {
-
- // TODO: Update deprecated code
-
- StringBuilder builder = new StringBuilder();
- //HttpClient client = new DefaultHttpClient();
- List list = null;
- HttpsURLConnection connection;
- InputStream inStream;
- try {
- connection = NetCipher.getHttpsURLConnection("https://podupti.me/api.php?key=4r45tg&format=json");
- int statusCode = connection.getResponseCode();
- if (statusCode == 200) {
- inStream = connection.getInputStream();
- BufferedReader reader = new BufferedReader(
- new InputStreamReader(inStream));
- String line;
- while ((line = reader.readLine()) != null) {
- builder.append(line);
- }
-
- try {
- inStream.close();
- } catch (IOException e) {/*Nothing to do*/}
-
- connection.disconnect();
- } else {
- AppLog.e(this, "Failed to download list of pods");
- }
- } catch (IOException e) {
- //TODO handle json buggy feed
- e.printStackTrace();
- }
- //Parse the JSON Data
- try {
- JSONObject jsonObjectAll = new JSONObject(builder.toString());
- JSONArray jsonArrayAll = jsonObjectAll.getJSONArray("pods");
- AppLog.d(this, "Number of entries " + jsonArrayAll.length());
- list = new ArrayList<>();
- for (int i = 0; i < jsonArrayAll.length(); i++) {
- JSONObject jo = jsonArrayAll.getJSONObject(i);
- if (jo.getString("secure").equals("true"))
- list.add(jo.getString("domain"));
- }
-
- } catch (Exception e) {
- //TODO Handle Parsing errors here
- e.printStackTrace();
- }
- if (list != null)
- return list.toArray(new String[list.size()]);
- else
- return null;
- }
-
- @Override
- protected void onPostExecute(String[] pods) {
- Intent broadcastIntent = new Intent(MESSAGE_PODS_RECEIVED);
- broadcastIntent.putExtra("pods", pods != null ? pods : new String[0]);
- LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(broadcastIntent);
- stopSelf();
- }
- };
- getPodsAsync.execute();
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- // TODO: Return the communication channel to the service.
- throw new UnsupportedOperationException("Not yet implemented");
- }
-
-}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/task/ImageDownloadTask.java b/app/src/main/java/com/github/dfa/diaspora_android/task/ImageDownloadTask.java
deleted file mode 100644
index e9b6677f..00000000
--- a/app/src/main/java/com/github/dfa/diaspora_android/task/ImageDownloadTask.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- This file is part of the Diaspora for Android.
-
- Diaspora for Android is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Diaspora for Android is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with the Diaspora for Android.
-
- If not, see .
- */
-package com.github.dfa.diaspora_android.task;
-
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.os.AsyncTask;
-import android.support.annotation.Nullable;
-
-import com.github.dfa.diaspora_android.util.AppLog;
-import com.github.dfa.diaspora_android.util.Log;
-import android.widget.ImageView;
-
-import com.github.dfa.diaspora_android.App;
-
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-import javax.net.ssl.HttpsURLConnection;
-
-import info.guardianproject.netcipher.NetCipher;
-
-/**
- * Task that can be used to download images from URLs and store them in storage
- * Created by gsantner (https://gsantner.github.io/) on 24.03.16.
- */
-public class ImageDownloadTask extends AsyncTask {
- private final ImageView imageView;
- private String savePath;
-
- /**
- * Download image from URL
- *
- * @param imageView ImageView to set image to (null = don't set)
- * @param savePath Save image to file (null = don't save)
- */
- public ImageDownloadTask(@Nullable ImageView imageView, @Nullable String savePath) {
- this.imageView = imageView;
- this.savePath = savePath;
- }
-
- protected Bitmap doInBackground(String... urls) {
- String url = urls[0];
- Bitmap bitmap = null;
- FileOutputStream out = null;
- InputStream inStream;
- HttpsURLConnection connection;
- try {
- connection = NetCipher.getHttpsURLConnection(url);
- inStream = connection.getInputStream();
- bitmap = BitmapFactory.decodeStream(inStream);
-
- // Save to file if not null
- if (savePath != null) {
- out = new FileOutputStream(savePath);
- bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
- }
-
- try {
- inStream.close();
- } catch (IOException e) {/*Nothing*/}
-
- connection.disconnect();
-
- } catch (Exception e) {
- AppLog.e(this, e.getMessage());
- } finally {
- try {
- if (out != null) {
- out.close();
- }
- } catch (IOException ignored) {
- }
- }
- return bitmap;
- }
-
- protected void onPostExecute(Bitmap result) {
- // Display on imageview if not null
- if (imageView != null) {
- imageView.setImageBitmap(result);
- }
- }
-}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/task/StatisticsFetchTask.java b/app/src/main/java/com/github/dfa/diaspora_android/task/StatisticsFetchTask.java
deleted file mode 100644
index 2a82b609..00000000
--- a/app/src/main/java/com/github/dfa/diaspora_android/task/StatisticsFetchTask.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- This file is part of the Diaspora for Android.
-
- Diaspora for Android is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Diaspora for Android is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with the Diaspora for Android.
-
- If not, see .
- */
-package com.github.dfa.diaspora_android.task;
-
-import android.content.Context;
-import android.os.AsyncTask;
-
-import com.github.dfa.diaspora_android.util.AppLog;
-import com.github.dfa.diaspora_android.util.Log;
-import android.webkit.CookieManager;
-
-import com.github.dfa.diaspora_android.App;
-import com.github.dfa.diaspora_android.util.DiasporaUrlHelper;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-
-import javax.net.ssl.HttpsURLConnection;
-
-import info.guardianproject.netcipher.NetCipher;
-
-/**
- * AsyncTask to fetch a users profile
- */
-public class StatisticsFetchTask extends AsyncTask {
- // Code for getting the profile async without any UI/WebView
- // TODO: This is an early version,needs to be converted to Service
-
- private final App app;
- private final Context context;
- private final DiasporaUrlHelper urls;
-
- public StatisticsFetchTask(final App app) {
- this.context = app.getApplicationContext();
- this.app = app;
- this.urls = new DiasporaUrlHelper(app.getSettings());
- }
-
-
- @Override
- protected Void doInBackground(Void... params) {
- String extractedProfileData = null;
- final CookieManager cookieManager = app.getCookieManager();
- String cookies = cookieManager.getCookie(urls.getPodUrl());
-
- HttpsURLConnection connection;
- InputStream inStream;
- try {
- URL url = new URL(urls.getStatisticsUrl());
- connection = NetCipher.getHttpsURLConnection(url);
- connection.setReadTimeout(10000);
- connection.setConnectTimeout(15000);
- connection.setRequestMethod("GET");
- if (cookies != null) {
- connection.setRequestProperty("Cookie", cookies);
- }
- connection.connect();
-
- inStream = connection.getInputStream();
- BufferedReader br = new BufferedReader(new InputStreamReader(inStream));
- String line;
- while ((line = br.readLine()) != null) {
- AppLog.d(this, "STATS: "+line);
- }
-
- try{
- br.close();
- inStream.close();
- } catch (IOException e){/*Nothing*/}
-
- connection.disconnect();
-
- } catch (IOException e) {
- e.printStackTrace();
- }
- return null;
- }
-}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/BadgeDrawable.java b/app/src/main/java/com/github/dfa/diaspora_android/ui/BadgeDrawable.java
index 03460aa9..39701d29 100644
--- a/app/src/main/java/com/github/dfa/diaspora_android/ui/BadgeDrawable.java
+++ b/app/src/main/java/com/github/dfa/diaspora_android/ui/BadgeDrawable.java
@@ -1,3 +1,21 @@
+/*
+ This file is part of the dandelion*.
+
+ dandelion* is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ dandelion* is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the dandelion*.
+
+ If not, see .
+ */
package com.github.dfa.diaspora_android.ui;
import android.content.Context;
@@ -10,93 +28,80 @@ import android.graphics.Rect;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
-import android.support.v4.content.ContextCompat;
+import android.support.annotation.NonNull;
import com.github.dfa.diaspora_android.R;
+import com.github.dfa.diaspora_android.util.AppSettings;
+import com.github.dfa.diaspora_android.util.ContextUtils;
+@SuppressWarnings("WeakerAccess")
public class BadgeDrawable extends Drawable {
// Source: http://mobikul.com/adding-badge-count-on-menu-items-like-cart-notification-etc/
private static final String BADGE_VALUE_OVERFLOW = "*";
- private Paint badgeBackground;
- private Paint badgeStroke;
- private Paint badgeText;
- private Rect textRect = new Rect();
+ private Paint _badgeBackground;
+ private Paint _badgeText;
+ private Rect _textRect = new Rect();
- private String badgeValue = "";
- private boolean shouldDraw;
+ private String _badgeValue = "";
+ private boolean _shouldDraw;
public BadgeDrawable(Context context) {
float textSize = context.getResources().getDimension(R.dimen.textsize_badge_count);
- badgeBackground = new Paint();
- badgeBackground.setColor(ContextCompat.getColor(context.getApplicationContext(), R.color.accent));
- badgeBackground.setAntiAlias(true);
- badgeBackground.setStyle(Paint.Style.FILL);
- badgeStroke = new Paint();
- badgeStroke.setColor(ContextCompat.getColor(context.getApplicationContext(), R.color.colorPrimaryDark));
- badgeStroke.setAntiAlias(true);
- badgeStroke.setStyle(Paint.Style.FILL);
+ AppSettings settings = AppSettings.get();
+ _badgeBackground = new Paint();
+ _badgeBackground.setColor(settings.getAccentColor());
+ _badgeBackground.setAntiAlias(true);
+ _badgeBackground.setStyle(Paint.Style.FILL);
- badgeText = new Paint();
- badgeText.setColor(Color.WHITE);
- badgeText.setTypeface(Typeface.DEFAULT);
- badgeText.setTextSize(textSize);
- badgeText.setAntiAlias(true);
- badgeText.setTextAlign(Paint.Align.CENTER);
+ _badgeText = new Paint();
+ _badgeText.setColor(ContextUtils.get().shouldColorOnTopBeLight(settings.getAccentColor()) ? Color.WHITE : Color.BLACK);
+ _badgeText.setTypeface(Typeface.DEFAULT);
+ _badgeText.setTextSize(textSize);
+ _badgeText.setAntiAlias(true);
+ _badgeText.setTextAlign(Paint.Align.CENTER);
}
@Override
- public void draw(Canvas canvas) {
- if (!shouldDraw) {
+ public void draw(@NonNull Canvas canvas) {
+ if (!_shouldDraw) {
return;
}
Rect bounds = getBounds();
float width = bounds.right - bounds.left;
float height = bounds.bottom - bounds.top;
+ float oneDp = ContextUtils.get().convertDpToPx(1);
// Position the badge in the top-right quadrant of the icon.
float radius = ((Math.max(width, height) / 2)) / 2;
- float centerX = (width - radius - 1) + 5;
- float centerY = radius - 5;
- if (badgeValue.length() <= 2) {
- // Draw badge circle.
- canvas.drawCircle(centerX, centerY, (int) (radius + 7.5), badgeStroke);
- canvas.drawCircle(centerX, centerY, (int) (radius + 5.5), badgeBackground);
- } else {
- canvas.drawCircle(centerX, centerY, (int) (radius + 8.5), badgeStroke);
- canvas.drawCircle(centerX, centerY, (int) (radius + 6.5), badgeBackground);
- //canvas.drawRoundRect(radius, radius, radius, radius, 10, 10, badgeBackground);
- }
- // Draw badge count text inside the circle.
- badgeText.getTextBounds(badgeValue, 0, badgeValue.length(), textRect);
- float textHeight = textRect.bottom - textRect.top;
+ float centerX = (width - radius - 1) + oneDp * 2;
+ float centerY = radius - 2 * oneDp;
+ canvas.drawCircle(centerX, centerY, (int) (radius + oneDp * 5), _badgeBackground);
+
+ // Draw badge count message inside the circle.
+ _badgeText.getTextBounds(_badgeValue, 0, _badgeValue.length(), _textRect);
+ float textHeight = _textRect.bottom - _textRect.top;
float textY = centerY + (textHeight / 2f);
- if (badgeValue.length() > 2)
- canvas.drawText(BADGE_VALUE_OVERFLOW, centerX, textY, badgeText);
- else
- canvas.drawText(badgeValue, centerX, textY, badgeText);
+ canvas.drawText(_badgeValue.length() > 2 ? BADGE_VALUE_OVERFLOW : _badgeValue,
+ centerX, textY, _badgeText);
}
- /*
- Sets the count (i.e notifications) to display.
- */
- public void setCount(String count) {
- badgeValue = count;
+ // Sets the text to display. Badge displays a '*' if more than 2 characters
+ private void setBadgeText(String text) {
+ _badgeValue = text;
- // Only draw a badge if there are notifications.
- shouldDraw = !count.equalsIgnoreCase("0");
+ // Only draw a badge if the value isn't a zero
+ _shouldDraw = !text.equalsIgnoreCase("0");
invalidateSelf();
}
@Override
public void setAlpha(int alpha) {
- // do nothing
}
@Override
public void setColorFilter(ColorFilter cf) {
- // do nothing
}
@Override
@@ -105,11 +110,11 @@ public class BadgeDrawable extends Drawable {
}
public static void setBadgeCount(Context context, LayerDrawable icon, Integer count) {
- setBadgeCount(context, icon, count.toString());
+ setBadgeText(context, icon, count.toString());
}
- public static void setBadgeCount(Context context, LayerDrawable icon, String count) {
-
+ // Max of 2 characters
+ public static void setBadgeText(Context context, LayerDrawable icon, String text) {
BadgeDrawable badge;
// Reuse drawable if possible
@@ -120,7 +125,7 @@ public class BadgeDrawable extends Drawable {
badge = new BadgeDrawable(context);
}
- badge.setCount(count);
+ badge.setBadgeText(text);
icon.mutate();
icon.setDrawableByLayerId(R.id.ic_badge, badge);
}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/BottomBarBehavior.java b/app/src/main/java/com/github/dfa/diaspora_android/ui/BottomBarBehavior.java
index 6e89bfc4..c9648574 100644
--- a/app/src/main/java/com/github/dfa/diaspora_android/ui/BottomBarBehavior.java
+++ b/app/src/main/java/com/github/dfa/diaspora_android/ui/BottomBarBehavior.java
@@ -47,7 +47,7 @@ public class BottomBarBehavior extends CoordinatorLayout.Behavior
if (defaultDependencyTop == -1) {
defaultDependencyTop = dependency.getTop();
}
- if(dependency.getTop()<0)
+ if (dependency.getTop() < 0)
child.setTranslationY(-dependency.getTop() + defaultDependencyTop);
else
child.setTranslationY(defaultDependencyTop);
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/ContextMenuWebView.java b/app/src/main/java/com/github/dfa/diaspora_android/ui/ContextMenuWebView.java
deleted file mode 100644
index adac6fd2..00000000
--- a/app/src/main/java/com/github/dfa/diaspora_android/ui/ContextMenuWebView.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- This file is part of the Diaspora for Android.
-
- Diaspora for Android is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Diaspora for Android is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with the Diaspora for Android.
-
- If not, see .
- */
-package com.github.dfa.diaspora_android.ui;
-
-import android.Manifest;
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.DownloadManager;
-import android.content.ClipData;
-import android.content.ClipboardManager;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.graphics.Bitmap;
-import android.net.Uri;
-import android.os.Environment;
-import android.support.v4.content.LocalBroadcastManager;
-import android.util.AttributeSet;
-import android.view.ContextMenu;
-import android.view.MenuItem;
-import android.widget.Toast;
-
-import com.github.dfa.diaspora_android.R;
-import com.github.dfa.diaspora_android.activity.MainActivity;
-import com.github.dfa.diaspora_android.task.ImageDownloadTask;
-
-import java.io.File;
-
-/**
- * Subclass of WebView which adds a context menu for long clicks on images or links to share, save
- * or open with another browser
- */
-@SuppressWarnings("deprecation")
-public class ContextMenuWebView extends NestedWebView {
-
- public static final int ID_SAVE_IMAGE = 10;
- public static final int ID_IMAGE_EXTERNAL_BROWSER = 11;
- public static final int ID_COPY_LINK = 12;
- public static final int ID_SHARE_LINK = 13;
- public static final int ID_SHARE_IMAGE = 14;
-
- private final Context context;
- private Activity parentActivity;
- private String lasLoadUrl = "";
-
- public ContextMenuWebView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- this.context = context;
- }
-
- public ContextMenuWebView(Context context, AttributeSet attrs) {
- super(context, attrs);
- this.context = context;
- }
-
- @Override
- protected void onCreateContextMenu(ContextMenu menu) {
- super.onCreateContextMenu(menu);
-
- HitTestResult result = getHitTestResult();
-
- MenuItem.OnMenuItemClickListener handler = new MenuItem.OnMenuItemClickListener() {
- public boolean onMenuItemClick(MenuItem item) {
- HitTestResult result = getHitTestResult();
- String url = result.getExtra();
- switch (item.getItemId()) {
- //Save image to external memory
- case ID_SAVE_IMAGE: {
- boolean writeToStoragePermitted = true;
- if (android.os.Build.VERSION.SDK_INT >= 23) {
- int hasWRITE_EXTERNAL_STORAGE = parentActivity.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
- if (hasWRITE_EXTERNAL_STORAGE != PackageManager.PERMISSION_GRANTED) {
- writeToStoragePermitted = false;
- if (!parentActivity.shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
- new AlertDialog.Builder(parentActivity)
- .setMessage(R.string.permissions_image)
- .setPositiveButton(context.getText(android.R.string.yes), new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- if (android.os.Build.VERSION.SDK_INT >= 23)
- parentActivity.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
- MainActivity.REQUEST_CODE__ACCESS_EXTERNAL_STORAGE);
- }
- })
- .setNegativeButton(context.getText(android.R.string.no), null)
- .show();
- }
- parentActivity.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
- MainActivity.REQUEST_CODE__ACCESS_EXTERNAL_STORAGE);
- }
- }
- if (writeToStoragePermitted) {
- if (url != null) {
- Uri source = Uri.parse(url);
- DownloadManager.Request request = new DownloadManager.Request(source);
- File destinationFile = new File(Environment.getExternalStorageDirectory() + "/Pictures/Diaspora/"
- + System.currentTimeMillis() + ".png");
- request.setDestinationUri(Uri.fromFile(destinationFile));
- ((DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(request);
- Toast.makeText(context, context.getText(R.string.share__toast_saved_image_to_location) + " " +
- destinationFile.getAbsolutePath(), Toast.LENGTH_LONG).show();
- }
- }
- }
- break;
-
- case ID_SHARE_IMAGE:
- if (url != null) {
- final Uri local = Uri.parse(Environment.getExternalStorageDirectory() + "/Pictures/Diaspora/" + System.currentTimeMillis() + ".png");
- new ImageDownloadTask(null, local.getPath()) {
- @Override
- protected void onPostExecute(Bitmap result) {
- Uri myUri = Uri.fromFile(new File(local.getPath()));
- Intent sharingIntent = new Intent();
- sharingIntent.setAction(Intent.ACTION_SEND);
- sharingIntent.putExtra(Intent.EXTRA_STREAM, myUri);
- sharingIntent.setType("image/png");
- sharingIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- context.startActivity(Intent.createChooser(sharingIntent, "Share image using"));
- }
- }.execute(url);
- } else {
- Toast.makeText(context, "Cannot share image: url is null", Toast.LENGTH_SHORT).show();
- }
- break;
-
- case ID_IMAGE_EXTERNAL_BROWSER:
- if (url != null) {
- Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
- context.startActivity(intent);
- }
- break;
-
- //Copy url to clipboard
- case ID_COPY_LINK:
- if (url != null) {
- ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
- clipboard.setPrimaryClip(ClipData.newPlainText("text", url));
- Toast.makeText(context, R.string.share__toast_link_address_copied, Toast.LENGTH_SHORT).show();
- }
- break;
-
- //Try to share link to other apps
- case ID_SHARE_LINK:
- if (url != null) {
- Intent sendIntent = new Intent();
- sendIntent.setAction(Intent.ACTION_SEND);
- sendIntent.putExtra(Intent.EXTRA_TEXT, url);
- sendIntent.setType("text/plain");
- context.startActivity(Intent.createChooser(sendIntent, getResources()
- .getText(R.string.context_menu_share_link)));
- }
- break;
- }
- return true;
- }
- };
-
- //Build context menu
- if (result.getType() == HitTestResult.IMAGE_TYPE ||
- result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
- // Menu options for an image.
- menu.setHeaderTitle(result.getExtra());
- menu.add(0, ID_SAVE_IMAGE, 0, context.getString(R.string.context_menu_save_image)).setOnMenuItemClickListener(handler);
- menu.add(0, ID_IMAGE_EXTERNAL_BROWSER, 0, context.getString(R.string.context_menu_open_external_browser)).setOnMenuItemClickListener(handler);
- menu.add(0, ID_SHARE_IMAGE, 0, context.getString(R.string.context_menu_share_image)).setOnMenuItemClickListener(handler);
- } else if (result.getType() == HitTestResult.ANCHOR_TYPE ||
- result.getType() == HitTestResult.SRC_ANCHOR_TYPE) {
- // Menu options for a hyperlink.
- menu.setHeaderTitle(result.getExtra());
- menu.add(0, ID_COPY_LINK, 0, context.getString(R.string.context_menu_copy_link)).setOnMenuItemClickListener(handler);
- menu.add(0, ID_SHARE_LINK, 0, context.getString(R.string.context_menu_share_link)).setOnMenuItemClickListener(handler);
- }
- }
-
- public void loadUrlNew(String url){
- stopLoading();
- loadUrl(url);
- }
-
- @Override
- public void loadUrl(String url) {
- super.loadUrl(url);
-
- // Don't spam intents ;)
- if (!lasLoadUrl.equals(url)) {
- Intent updateActivityTitleIntent = new Intent(MainActivity.ACTION_UPDATE_TITLE_FROM_URL);
- updateActivityTitleIntent.putExtra(MainActivity.EXTRA_URL, getUrl());
- LocalBroadcastManager.getInstance(context).sendBroadcast(updateActivityTitleIntent);
- }
- lasLoadUrl = url;
- }
-
- public void setParentActivity(Activity activity) {
- this.parentActivity = activity;
- }
-}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/CustomWebViewClient.java b/app/src/main/java/com/github/dfa/diaspora_android/ui/CustomWebViewClient.java
deleted file mode 100644
index 8e31a15c..00000000
--- a/app/src/main/java/com/github/dfa/diaspora_android/ui/CustomWebViewClient.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- This file is part of the Diaspora for Android.
-
- Diaspora for Android is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Diaspora for Android is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with the Diaspora for Android.
-
- If not, see .
- */
-package com.github.dfa.diaspora_android.ui;
-
-import android.content.Intent;
-import android.net.Uri;
-import android.support.v4.content.LocalBroadcastManager;
-import android.webkit.CookieManager;
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
-
-import com.github.dfa.diaspora_android.App;
-import com.github.dfa.diaspora_android.activity.MainActivity;
-
-public class CustomWebViewClient extends WebViewClient {
- private final App app;
- private WebView webView;
-
- public CustomWebViewClient(App app, WebView webView) {
- this.app = app;
- this.webView = webView;
- }
-
- public boolean shouldOverrideUrlLoading(WebView view, String url) {
- if (!url.contains(app.getSettings().getPodDomain())) {
- Intent i = new Intent(MainActivity.ACTION_OPEN_EXTERNAL_URL);
- i.putExtra(MainActivity.EXTRA_URL, url);
- LocalBroadcastManager.getInstance(app.getApplicationContext()).sendBroadcast(i);
- return true;
- }
- return false;
- }
-
- public void onPageFinished(WebView view, String url) {
- super.onPageFinished(view, url);
-
- final CookieManager cookieManager = app.getCookieManager();
- String cookies = cookieManager.getCookie(url);
- //Log.d(this, "All the cookies in a string:" + cookies);
-
- if (cookies != null) {
- cookieManager.setCookie(url, cookies);
- cookieManager.setCookie("https://" + app.getSettings().getPodDomain(), cookies);
- //for (String c : cookies.split(";")) {
- //AppLog.d(this, "Cookie: " + c.split("=")[0] + " Value:" + c.split("=")[1]);
- //}
- //new ProfileFetchTask(app).execute();
- }
- }
-
-}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/HtmlTextView.java b/app/src/main/java/com/github/dfa/diaspora_android/ui/HtmlTextView.java
index 444088a6..26552ec1 100644
--- a/app/src/main/java/com/github/dfa/diaspora_android/ui/HtmlTextView.java
+++ b/app/src/main/java/com/github/dfa/diaspora_android/ui/HtmlTextView.java
@@ -1,31 +1,30 @@
/*
- This file is part of the Diaspora for Android.
+ This file is part of the dandelion*.
- Diaspora for Android is free software: you can redistribute it and/or modify
+ dandelion* is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
- Diaspora for Android is distributed in the hope that it will be useful,
+ dandelion* is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with the Diaspora for Android.
+ along with the dandelion*.
If not, see .
*/
package com.github.dfa.diaspora_android.ui;
-import android.annotation.TargetApi;
import android.content.Context;
+import android.support.v7.widget.AppCompatTextView;
import android.text.Html;
import android.text.SpannableString;
import android.text.util.Linkify;
import android.util.AttributeSet;
import android.util.Patterns;
-import android.widget.TextView;
import com.github.dfa.diaspora_android.activity.MainActivity;
@@ -36,9 +35,9 @@ import java.util.regex.Pattern;
* TextView, that renders HTML with highlited and clickable links and hashtags.
* Links are opened in a webbrowser.
* Hashtags open the MainActivity, load the new-post site of the selected pod and insert the
- * hashtag into the post editor. See data/HashtagProvider.
+ * hashtag into the post editor. See data/HashtagContentProvider.
*/
-public class HtmlTextView extends TextView {
+public class HtmlTextView extends AppCompatTextView {
public HtmlTextView(Context context) {
super(context);
@@ -55,25 +54,19 @@ public class HtmlTextView extends TextView {
init();
}
- @TargetApi(21)
- public HtmlTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- init();
- }
-
/**
- * Linkify, format markdown and escape the displayed text.
+ * Linkify, format markdown and escape the displayed message.
*/
- private void init(){
+ private void init() {
formatHtmlAndCustomTags();
}
- public void setTextFormatted(String text){
+ public void setTextFormatted(String text) {
setText(text);
formatHtmlAndCustomTags();
}
- private void formatHtmlAndCustomTags(){
+ private void formatHtmlAndCustomTags() {
setText(new SpannableString(Html.fromHtml(getText().toString())));
Linkify.TransformFilter filter = new Linkify.TransformFilter() {
public final String transformUrl(final Matcher match, String url) {
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/PodSelectionDialog.java b/app/src/main/java/com/github/dfa/diaspora_android/ui/PodSelectionDialog.java
new file mode 100644
index 00000000..abb31703
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/ui/PodSelectionDialog.java
@@ -0,0 +1,275 @@
+package com.github.dfa.diaspora_android.ui;
+
+
+import android.annotation.SuppressLint;
+import android.app.Dialog;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v7.app.AlertDialog;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+import android.widget.RadioGroup;
+import android.widget.Spinner;
+import android.widget.TextView;
+
+import com.github.dfa.diaspora_android.App;
+import com.github.dfa.diaspora_android.R;
+import com.github.dfa.diaspora_android.data.DiasporaPodList.DiasporaPod;
+import com.github.dfa.diaspora_android.data.DiasporaPodList.DiasporaPod.DiasporaPodUrl;
+import com.github.dfa.diaspora_android.ui.theme.ThemeHelper;
+import com.github.dfa.diaspora_android.ui.theme.ThemedAppCompatDialogFragment;
+import com.github.dfa.diaspora_android.util.AppSettings;
+import com.github.dfa.diaspora_android.web.ProxyHandler;
+
+import org.json.JSONException;
+
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+import butterknife.OnItemSelected;
+
+/**
+ * Dialog that helps the user configure a pod
+ * Created by gsantner on 06.10.16.
+ */
+public class PodSelectionDialog extends ThemedAppCompatDialogFragment {
+ public static final String TAG = "com.github.dfa.diaspora_android.ui.PodSelectionDialog";
+
+ public interface PodSelectionDialogResultListener {
+ void onPodSelectionDialogResult(DiasporaPod pod, boolean accepted);
+ }
+
+ public static PodSelectionDialog newInstance(PodSelectionDialogResultListener resultListener) {
+ return newInstance(new DiasporaPod(), resultListener);
+ }
+
+ public static PodSelectionDialog newInstance(DiasporaPod pod, PodSelectionDialogResultListener resultListener) {
+ PodSelectionDialog dialog = new PodSelectionDialog();
+ dialog.setPod(pod);
+ dialog.setResultListener(resultListener);
+ return dialog;
+ }
+
+ /*
+ // ██████╗ ██╗ █████╗ ██╗ ██████╗ ██████╗
+ // ██╔══██╗██║██╔══██╗██║ ██╔═══██╗██╔════╝
+ // ██║ ██║██║███████║██║ ██║ ██║██║ ███╗
+ // ██║ ██║██║██╔══██║██║ ██║ ██║██║ ██║
+ // ██████╔╝██║██║ ██║███████╗╚██████╔╝╚██████╔╝
+ // ╚═════╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═════╝
+ */
+
+ @BindView(R.id.podselection__dialog__edit_podaddress)
+ EditText editPodAddress;
+
+ @BindView(R.id.podselection__dialog__edit_pod_name)
+ EditText editPodName;
+
+ @BindView(R.id.podselection__dialog__radiogroup_protocol)
+ RadioGroup radiogrpProtocol;
+
+ @BindView(R.id.podselection__dialog__text_profile)
+ TextView textProfile;
+
+ @BindView(R.id.podselection__dialog__spinner_profile)
+ Spinner spinnerProfile;
+
+ @BindView(R.id.podselection__dialog__check_torpreset)
+ CheckBox checkboxTorPreset;
+
+ @BindView(R.id.podselection__dialog__text_torpreset)
+ TextView textTorPreset;
+
+ @BindView(R.id.podselection__dialog__text_pod_name)
+ TextView textPodName;
+
+ @BindView(R.id.podselection__dialog__text_pod_address)
+ TextView textPodAddress;
+
+ @BindView(R.id.podselection__dialog__text_protocol)
+ TextView textProtocol;
+
+ @BindView(R.id.podselection__dialog__btn_ok)
+ Button btnOk;
+
+ @BindView(R.id.podselection__dialog__btn_cancel)
+ Button btnCancel;
+
+ private PodSelectionDialogResultListener resultListener;
+ private View root;
+ private DiasporaPod pod = new DiasporaPod();
+ private App app;
+
+ @NonNull
+ @Override
+ @SuppressLint("InflateParams")
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ LayoutInflater inflater = getActivity().getLayoutInflater();
+ app = (App) getActivity().getApplication();
+
+ // Bind UI
+ root = inflater.inflate(R.layout.podselection__dialog, null);
+ ButterKnife.bind(this, root);
+ editPodName.setText(pod.getName());
+ List podUrls = pod.getPodUrls();
+ if (podUrls.size() > 0) {
+ uiLoadDiasporaUrl(0);
+ }
+ if (podUrls.size() > 1) {
+ textProfile.setVisibility(View.VISIBLE);
+ spinnerProfile.setVisibility(View.VISIBLE);
+ String[] podUrlss = new String[podUrls.size()];
+ for (int i = 0; i < podUrls.size(); podUrlss[i] = podUrls.get(i++).getBaseUrl()) ;
+ ArrayAdapter spinnerAdapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_item, podUrlss);
+ spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+ spinnerProfile.setAdapter(spinnerAdapter);
+ }
+ applyColorsToViews();
+ builder.setView(root);
+ return builder.create();
+ }
+
+ protected void applyColorsToViews() {
+ ThemeHelper.getInstance(app.getSettings());
+
+ textPodAddress.setTextColor(ThemeHelper.getAccentColor());
+ textPodName.setTextColor(ThemeHelper.getAccentColor());
+ textProfile.setTextColor(ThemeHelper.getAccentColor());
+ textProtocol.setTextColor(ThemeHelper.getAccentColor());
+ textTorPreset.setTextColor(ThemeHelper.getAccentColor());
+ btnOk.setTextColor(ThemeHelper.getAccentColor());
+ btnCancel.setTextColor(ThemeHelper.getAccentColor());
+
+ ThemeHelper.updateEditTextColor(editPodAddress);
+ ThemeHelper.updateEditTextColor(editPodName);
+ ThemeHelper.updateCheckBoxColor(checkboxTorPreset);
+ ThemeHelper.updateRadioGroupColor(radiogrpProtocol);
+ }
+
+ @Override
+ protected AppSettings getAppSettings() {
+ if (isAdded()) {
+ return ((App) getActivity().getApplication()).getSettings();
+ } else {
+ return AppSettings.get();
+ }
+ }
+
+ @OnItemSelected(R.id.podselection__dialog__spinner_profile)
+ public void spinnerItemSelected(Spinner spinner, int position) {
+ uiLoadDiasporaUrl(position);
+ }
+
+ public void uiLoadDiasporaUrl(int wantedPodUrlPos) {
+ List podUrls = pod.getPodUrls();
+ if (podUrls.size() == 0) {
+ return;
+ }
+ wantedPodUrlPos = wantedPodUrlPos < podUrls.size() ? wantedPodUrlPos : 0;
+
+ DiasporaPodUrl url1 = podUrls.get(wantedPodUrlPos);
+ editPodAddress.setText(url1.getHost());
+ radiogrpProtocol.check(url1.getProtocol().equals("https")
+ ? R.id.podselection__dialog__radio_https : R.id.podselection__dialog__radio_http);
+
+ // Tor
+ boolean isOnionUrl = url1.getHost().endsWith(".onion");
+ setUiVisible(textTorPreset, isOnionUrl);
+ setUiVisible(checkboxTorPreset, isOnionUrl);
+ checkboxTorPreset.setChecked(isOnionUrl);
+ }
+
+ public void setUiVisible(View view, boolean visible) {
+ if (view != null) {
+ view.setVisibility(visible ? View.VISIBLE : View.GONE);
+ }
+ }
+
+
+ @OnClick({R.id.podselection__dialog__btn_ok, R.id.podselection__dialog__btn_cancel})
+ public void onResultButtonClicked(View view) {
+ boolean POSITIVE_PRESSED = view.getId() == R.id.podselection__dialog__btn_ok;
+ if (POSITIVE_PRESSED) {
+ if (!checkInputs()) {
+ return;
+ }
+ DiasporaPodUrl podUrl = new DiasporaPodUrl();
+ if (radiogrpProtocol.getCheckedRadioButtonId() == R.id.podselection__dialog__radio_https) {
+ podUrl.setHttpsDefaults();
+ } else {
+ podUrl.setHttpDefaults();
+ }
+ podUrl.setHost(editPodAddress.getText().toString());
+ pod.setName(editPodName.getText().toString());
+ pod.getPodUrls().clear();
+ pod.getPodUrls().add(podUrl);
+
+ // Load Tor preset
+ if (pod.getPodUrl().getHost().endsWith(".onion") && checkboxTorPreset.isChecked()) {
+ AppSettings settings = app.getSettings();
+ settings.setProxyHttpEnabled(true);
+ settings.setProxyWasEnabled(false);
+ settings.setProxyHttpPort(8118);
+ settings.setProxyHttpHost("127.0.0.1");
+ ProxyHandler.getInstance().updateProxySettings(getContext());
+ }
+
+ getDialog().dismiss();
+ publishResult(true);
+ } else {
+ getDialog().cancel();
+ publishResult(false);
+ }
+ }
+
+ public boolean checkInputs() {
+ boolean ok = true;
+ String s = editPodAddress.getText().toString();
+ if (TextUtils.isEmpty(s) || s.length() < 3) {
+ editPodAddress.setError(getString(R.string.missing_value));
+ ok = false;
+ }
+ s = editPodName.getText().toString();
+ if (TextUtils.isEmpty(s) || s.length() < 3) {
+ editPodName.setError(getString(R.string.missing_value));
+ ok = false;
+ }
+ return ok;
+ }
+
+ public void publishResult(boolean accepted) {
+ if (resultListener != null) {
+ resultListener.onPodSelectionDialogResult(pod, accepted);
+ }
+ }
+
+ /*
+ * GETTER & SETTER
+ */
+ public PodSelectionDialogResultListener getResultListener() {
+ return resultListener;
+ }
+
+ public void setResultListener(PodSelectionDialogResultListener resultListener) {
+ this.resultListener = resultListener;
+ }
+
+ public DiasporaPod getPod() {
+ return pod;
+ }
+
+ public void setPod(DiasporaPod pod) {
+ try {
+ this.pod = new DiasporaPod().fromJson(pod.toJson());
+ } catch (JSONException ignored) {
+ }
+ }
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/SearchOrCustomTextDialogCreator.java b/app/src/main/java/com/github/dfa/diaspora_android/ui/SearchOrCustomTextDialogCreator.java
new file mode 100644
index 00000000..c7421567
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/ui/SearchOrCustomTextDialogCreator.java
@@ -0,0 +1,85 @@
+package com.github.dfa.diaspora_android.ui;
+
+import android.app.Activity;
+import android.support.v4.content.ContextCompat;
+
+import com.github.dfa.diaspora_android.R;
+import com.github.dfa.diaspora_android.data.DiasporaAspect;
+import com.github.dfa.diaspora_android.util.AppSettings;
+
+import net.gsantner.opoc.ui.SearchOrCustomTextDialog;
+import net.gsantner.opoc.util.Callback;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+public class SearchOrCustomTextDialogCreator {
+ public static final String SPECIAL_PREFIX = "\uD83D\uDCA0";
+
+ public static void showDiasporaTagsDialog(final Activity activity, final Callback.a1 callback) {
+ SearchOrCustomTextDialog.DialogOptions dopt = new SearchOrCustomTextDialog.DialogOptions();
+ baseConf(activity, dopt);
+ dopt.callback = callback;
+ dopt.isSearchEnabled = true;
+ dopt.searchHintText = R.string.search;
+ dopt.titleText = R.string.tags;
+
+ new Thread(() -> {
+ AppSettings appSettings = AppSettings.get();
+ ArrayList hl = new ArrayList<>();
+ ArrayList data = new ArrayList<>(Arrays.asList(appSettings.getFollowedTags()));
+ if (data.size() > 0) {
+ String highlighted = surroundString(data.remove(0));
+ data.add(0, highlighted);
+ hl.add(highlighted);
+ }
+
+ for (int strid : new int[]{R.string.manage_hashtags}) {
+ String special = surroundString(appSettings.rstr(strid));
+ data.add(0, special);
+ hl.add(special);
+ }
+ dopt.data = data;
+ dopt.highlightData = hl;
+ activity.runOnUiThread(() -> SearchOrCustomTextDialog.showMultiChoiceDialogWithSearchFilterUI(activity, dopt));
+ }).start();
+ }
+
+ private static String surroundString(String text) {
+ return SPECIAL_PREFIX + " " + text + " ";
+ }
+
+
+ public static void showDiasporaAspectsDialog(final Activity activity, final Callback.a1 callback) {
+ SearchOrCustomTextDialog.DialogOptions dopt = new SearchOrCustomTextDialog.DialogOptions();
+ baseConf(activity, dopt);
+ dopt.callback = callback;
+ dopt.isSearchEnabled = false;
+ dopt.titleText = R.string.contacts;
+
+ new Thread(() -> {
+ AppSettings appSettings = AppSettings.get();
+ ArrayList hl = new ArrayList<>();
+ ArrayList data = new ArrayList<>();
+ for (DiasporaAspect aspect : AppSettings.get().getAspects()) {
+ data.add(aspect.name);
+ }
+ for (int strid : new int[]{R.string.nav_profile, R.string.manage_your_contact_list}) {
+ String special = surroundString(appSettings.rstr(strid));
+ data.add(0, special);
+ hl.add(special);
+ }
+ dopt.data = data;
+ dopt.highlightData = hl;
+ activity.runOnUiThread(() -> SearchOrCustomTextDialog.showMultiChoiceDialogWithSearchFilterUI(activity, dopt));
+ }).start();
+ }
+
+
+ private static void baseConf(Activity activity, SearchOrCustomTextDialog.DialogOptions dopt) {
+ AppSettings as = new AppSettings(activity);
+ dopt.isDarkDialog = as.isAmoledColorMode();
+ dopt.textColor = ContextCompat.getColor(activity, dopt.isDarkDialog ? R.color.white : R.color.primary_text);
+ dopt.highlightColor = as.getAccentColor();
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ColorPalette.java b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ColorPalette.java
new file mode 100644
index 00000000..d483605e
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ColorPalette.java
@@ -0,0 +1,289 @@
+package com.github.dfa.diaspora_android.ui.theme;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.support.v4.content.ContextCompat;
+import android.support.v4.graphics.ColorUtils;
+
+import com.github.dfa.diaspora_android.R;
+
+/**
+ * Class that handles Colors
+ * Created by dnld on 24/02/16.
+ */
+public class ColorPalette {
+
+ public static int[] getAccentColors(Context context) {
+ return new int[]{
+ ContextCompat.getColor(context, R.color.md_red_500),
+ ContextCompat.getColor(context, R.color.md_purple_500),
+ ContextCompat.getColor(context, R.color.md_deep_purple_500),
+ ContextCompat.getColor(context, R.color.md_blue_500),
+ ContextCompat.getColor(context, R.color.md_light_blue_500),
+ ContextCompat.getColor(context, R.color.md_cyan_500),
+ ContextCompat.getColor(context, R.color.md_teal_500),
+ ContextCompat.getColor(context, R.color.md_green_500),
+ ContextCompat.getColor(context, R.color.md_yellow_500),
+ ContextCompat.getColor(context, R.color.md_orange_500),
+ ContextCompat.getColor(context, R.color.md_deep_orange_500),
+ ContextCompat.getColor(context, R.color.md_brown_500),
+ ContextCompat.getColor(context, R.color.md_blue_grey_500),
+ };
+ }
+
+ public static int getObscuredColor(int c) {
+ float[] hsv = new float[3];
+ int color = c;
+ Color.colorToHSV(color, hsv);
+ hsv[2] *= 0.85f; // value component
+ color = Color.HSVToColor(hsv);
+ return color;
+ }
+
+ public static int getTransparentColor(int color, int alpha) {
+ return ColorUtils.setAlphaComponent(color, alpha);
+ }
+
+ public static int[] getTransparencyShadows(int color) {
+ int[] shadows = new int[10];
+ for (int i = 0; i < 10; i++)
+ shadows[i] = (ColorPalette.getTransparentColor(color, ((100 - (i * 10)) * 255) / 100));
+ return shadows;
+ }
+
+ public static int[] getBaseColors(Context context) {
+ return new int[]{
+ ContextCompat.getColor(context, R.color.md_red_500),
+ ContextCompat.getColor(context, R.color.md_pink_500),
+ ContextCompat.getColor(context, R.color.md_purple_500),
+ ContextCompat.getColor(context, R.color.md_deep_purple_500),
+ ContextCompat.getColor(context, R.color.md_indigo_500),
+ ContextCompat.getColor(context, R.color.md_blue_500),
+ ContextCompat.getColor(context, R.color.md_light_blue_500),
+ ContextCompat.getColor(context, R.color.md_cyan_500),
+ ContextCompat.getColor(context, R.color.md_teal_500),
+ ContextCompat.getColor(context, R.color.md_green_500),
+ ContextCompat.getColor(context, R.color.md_light_green_500),
+ ContextCompat.getColor(context, R.color.md_lime_500),
+ ContextCompat.getColor(context, R.color.md_yellow_500),
+ ContextCompat.getColor(context, R.color.md_amber_500),
+ ContextCompat.getColor(context, R.color.md_orange_500),
+ ContextCompat.getColor(context, R.color.md_deep_orange_500),
+ ContextCompat.getColor(context, R.color.md_brown_500),
+ ContextCompat.getColor(context, R.color.md_blue_grey_500),
+ ContextCompat.getColor(context, R.color.md_grey_500)
+ };
+ }
+
+ public static int[] getColors(Context context, int c) {
+ if (c == ContextCompat.getColor(context, R.color.md_red_500)) {
+ return new int[]{
+ ContextCompat.getColor(context, R.color.md_red_200),
+ ContextCompat.getColor(context, R.color.md_red_300),
+ ContextCompat.getColor(context, R.color.md_red_400),
+ ContextCompat.getColor(context, R.color.md_red_500),
+ ContextCompat.getColor(context, R.color.md_red_600),
+ ContextCompat.getColor(context, R.color.md_red_700),
+ ContextCompat.getColor(context, R.color.md_red_800),
+ ContextCompat.getColor(context, R.color.md_red_900)
+ };
+ } else if (c == ContextCompat.getColor(context, R.color.md_pink_500)) {
+ return new int[]{
+ ContextCompat.getColor(context, R.color.md_pink_200),
+ ContextCompat.getColor(context, R.color.md_pink_300),
+ ContextCompat.getColor(context, R.color.md_pink_400),
+ ContextCompat.getColor(context, R.color.md_pink_500),
+ ContextCompat.getColor(context, R.color.md_pink_600),
+ ContextCompat.getColor(context, R.color.md_pink_700),
+ ContextCompat.getColor(context, R.color.md_pink_800),
+ ContextCompat.getColor(context, R.color.md_pink_900)
+ };
+ } else if (c == ContextCompat.getColor(context, R.color.md_purple_500)) {
+ return new int[]{
+ ContextCompat.getColor(context, R.color.md_purple_200),
+ ContextCompat.getColor(context, R.color.md_purple_300),
+ ContextCompat.getColor(context, R.color.md_purple_400),
+ ContextCompat.getColor(context, R.color.md_purple_500),
+ ContextCompat.getColor(context, R.color.md_purple_600),
+ ContextCompat.getColor(context, R.color.md_purple_700),
+ ContextCompat.getColor(context, R.color.md_purple_800),
+ ContextCompat.getColor(context, R.color.md_purple_900)
+ };
+ } else if (c == ContextCompat.getColor(context, R.color.md_deep_purple_500)) {
+ return new int[]{
+ ContextCompat.getColor(context, R.color.md_deep_purple_200),
+ ContextCompat.getColor(context, R.color.md_deep_purple_300),
+ ContextCompat.getColor(context, R.color.md_deep_purple_400),
+ ContextCompat.getColor(context, R.color.md_deep_purple_500),
+ ContextCompat.getColor(context, R.color.md_deep_purple_600),
+ ContextCompat.getColor(context, R.color.md_deep_purple_700),
+ ContextCompat.getColor(context, R.color.md_deep_purple_800),
+ ContextCompat.getColor(context, R.color.md_deep_purple_900)
+ };
+ } else if (c == ContextCompat.getColor(context, R.color.md_indigo_500)) {
+ return new int[]{
+ ContextCompat.getColor(context, R.color.md_indigo_200),
+ ContextCompat.getColor(context, R.color.md_indigo_300),
+ ContextCompat.getColor(context, R.color.md_indigo_400),
+ ContextCompat.getColor(context, R.color.md_indigo_500),
+ ContextCompat.getColor(context, R.color.md_indigo_600),
+ ContextCompat.getColor(context, R.color.md_indigo_700),
+ ContextCompat.getColor(context, R.color.md_indigo_800),
+ ContextCompat.getColor(context, R.color.md_indigo_900)
+ };
+ } else if (c == ContextCompat.getColor(context, R.color.md_blue_500)) {
+ return new int[]{
+ ContextCompat.getColor(context, R.color.md_blue_200),
+ ContextCompat.getColor(context, R.color.md_blue_300),
+ ContextCompat.getColor(context, R.color.md_blue_400),
+ ContextCompat.getColor(context, R.color.md_blue_500),
+ ContextCompat.getColor(context, R.color.md_blue_600),
+ ContextCompat.getColor(context, R.color.md_blue_650),
+ ContextCompat.getColor(context, R.color.md_blue_700),
+ ContextCompat.getColor(context, R.color.md_blue_750),
+ ContextCompat.getColor(context, R.color.md_blue_800),
+ ContextCompat.getColor(context, R.color.md_blue_900)
+ };
+ } else if (c == ContextCompat.getColor(context, R.color.md_light_blue_500)) {
+ return new int[]{
+ ContextCompat.getColor(context, R.color.md_light_blue_200),
+ ContextCompat.getColor(context, R.color.md_light_blue_300),
+ ContextCompat.getColor(context, R.color.md_light_blue_400),
+ ContextCompat.getColor(context, R.color.md_light_blue_500),
+ ContextCompat.getColor(context, R.color.md_light_blue_600),
+ ContextCompat.getColor(context, R.color.md_light_blue_700),
+ ContextCompat.getColor(context, R.color.md_light_blue_800),
+ ContextCompat.getColor(context, R.color.md_light_blue_900)
+ };
+ } else if (c == ContextCompat.getColor(context, R.color.md_cyan_500)) {
+ return new int[]{
+ ContextCompat.getColor(context, R.color.md_cyan_200),
+ ContextCompat.getColor(context, R.color.md_cyan_300),
+ ContextCompat.getColor(context, R.color.md_cyan_400),
+ ContextCompat.getColor(context, R.color.md_cyan_500),
+ ContextCompat.getColor(context, R.color.md_cyan_600),
+ ContextCompat.getColor(context, R.color.md_cyan_700),
+ ContextCompat.getColor(context, R.color.md_cyan_800),
+ ContextCompat.getColor(context, R.color.md_cyan_900)
+ };
+ } else if (c == ContextCompat.getColor(context, R.color.md_teal_500)) {
+ return new int[]{
+ ContextCompat.getColor(context, R.color.md_teal_200),
+ ContextCompat.getColor(context, R.color.md_teal_300),
+ ContextCompat.getColor(context, R.color.md_teal_400),
+ ContextCompat.getColor(context, R.color.md_teal_500),
+ ContextCompat.getColor(context, R.color.md_teal_600),
+ ContextCompat.getColor(context, R.color.md_teal_700),
+ ContextCompat.getColor(context, R.color.md_teal_800),
+ ContextCompat.getColor(context, R.color.md_teal_900)
+ };
+ } else if (c == ContextCompat.getColor(context, R.color.md_green_500)) {
+ return new int[]{
+ ContextCompat.getColor(context, R.color.md_green_200),
+ ContextCompat.getColor(context, R.color.md_green_300),
+ ContextCompat.getColor(context, R.color.md_green_400),
+ ContextCompat.getColor(context, R.color.md_green_500),
+ ContextCompat.getColor(context, R.color.md_green_600),
+ ContextCompat.getColor(context, R.color.md_green_700),
+ ContextCompat.getColor(context, R.color.md_green_800),
+ ContextCompat.getColor(context, R.color.md_green_900)
+ };
+ } else if (c == ContextCompat.getColor(context, R.color.md_light_green_500)) {
+ return new int[]{
+ ContextCompat.getColor(context, R.color.md_light_green_200),
+ ContextCompat.getColor(context, R.color.md_light_green_300),
+ ContextCompat.getColor(context, R.color.md_light_green_400),
+ ContextCompat.getColor(context, R.color.md_light_green_500),
+ ContextCompat.getColor(context, R.color.md_light_green_600),
+ ContextCompat.getColor(context, R.color.md_light_green_700),
+ ContextCompat.getColor(context, R.color.md_light_green_800),
+ ContextCompat.getColor(context, R.color.md_light_green_900)
+ };
+ } else if (c == ContextCompat.getColor(context, R.color.md_lime_500)) {
+ return new int[]{
+ ContextCompat.getColor(context, R.color.md_lime_200),
+ ContextCompat.getColor(context, R.color.md_lime_300),
+ ContextCompat.getColor(context, R.color.md_lime_400),
+ ContextCompat.getColor(context, R.color.md_lime_500),
+ ContextCompat.getColor(context, R.color.md_lime_600),
+ ContextCompat.getColor(context, R.color.md_lime_700),
+ ContextCompat.getColor(context, R.color.md_lime_800),
+ ContextCompat.getColor(context, R.color.md_lime_900)
+ };
+ } else if (c == ContextCompat.getColor(context, R.color.md_yellow_500)) {
+ return new int[]{
+ ContextCompat.getColor(context, R.color.md_yellow_400),
+ ContextCompat.getColor(context, R.color.md_yellow_500),
+ ContextCompat.getColor(context, R.color.md_yellow_600),
+ ContextCompat.getColor(context, R.color.md_yellow_700),
+ ContextCompat.getColor(context, R.color.md_yellow_800),
+ ContextCompat.getColor(context, R.color.md_yellow_900)
+ };
+ } else if (c == ContextCompat.getColor(context, R.color.md_amber_500)) {
+ return new int[]{
+ ContextCompat.getColor(context, R.color.md_amber_200),
+ ContextCompat.getColor(context, R.color.md_amber_300),
+ ContextCompat.getColor(context, R.color.md_amber_400),
+ ContextCompat.getColor(context, R.color.md_amber_500),
+ ContextCompat.getColor(context, R.color.md_amber_600),
+ ContextCompat.getColor(context, R.color.md_amber_700),
+ ContextCompat.getColor(context, R.color.md_amber_800),
+ ContextCompat.getColor(context, R.color.md_amber_900)
+ };
+ } else if (c == ContextCompat.getColor(context, R.color.md_orange_500)) {
+ return new int[]{
+ ContextCompat.getColor(context, R.color.md_orange_200),
+ ContextCompat.getColor(context, R.color.md_orange_300),
+ ContextCompat.getColor(context, R.color.md_orange_400),
+ ContextCompat.getColor(context, R.color.md_orange_500),
+ ContextCompat.getColor(context, R.color.md_orange_600),
+ ContextCompat.getColor(context, R.color.md_orange_700),
+ ContextCompat.getColor(context, R.color.md_orange_800),
+ ContextCompat.getColor(context, R.color.md_orange_900)
+ };
+ } else if (c == ContextCompat.getColor(context, R.color.md_deep_orange_500)) {
+ return new int[]{
+ ContextCompat.getColor(context, R.color.md_deep_orange_200),
+ ContextCompat.getColor(context, R.color.md_deep_orange_300),
+ ContextCompat.getColor(context, R.color.md_deep_orange_400),
+ ContextCompat.getColor(context, R.color.md_deep_orange_500),
+ ContextCompat.getColor(context, R.color.md_deep_orange_600),
+ ContextCompat.getColor(context, R.color.md_deep_orange_650),
+ ContextCompat.getColor(context, R.color.md_deep_orange_700),
+ ContextCompat.getColor(context, R.color.md_deep_orange_800),
+ ContextCompat.getColor(context, R.color.md_deep_orange_900)
+ };
+ } else if (c == ContextCompat.getColor(context, R.color.md_brown_500)) {
+ return new int[]{
+ ContextCompat.getColor(context, R.color.md_brown_200),
+ ContextCompat.getColor(context, R.color.md_brown_300),
+ ContextCompat.getColor(context, R.color.md_brown_400),
+ ContextCompat.getColor(context, R.color.md_brown_500),
+ ContextCompat.getColor(context, R.color.md_brown_600),
+ ContextCompat.getColor(context, R.color.md_brown_700),
+ ContextCompat.getColor(context, R.color.md_brown_800),
+ ContextCompat.getColor(context, R.color.md_brown_900)
+ };
+ } else if (c == ContextCompat.getColor(context, R.color.md_grey_500)) {
+ return new int[]{
+ ContextCompat.getColor(context, R.color.md_grey_400),
+ ContextCompat.getColor(context, R.color.md_grey_500),
+ ContextCompat.getColor(context, R.color.md_grey_600),
+ ContextCompat.getColor(context, R.color.md_grey_700),
+ ContextCompat.getColor(context, R.color.md_grey_800),
+ ContextCompat.getColor(context, R.color.md_grey_900),
+ Color.parseColor("#000000")
+ };
+ } else {
+ return new int[]{
+ ContextCompat.getColor(context, R.color.md_blue_grey_300),
+ ContextCompat.getColor(context, R.color.md_blue_grey_400),
+ ContextCompat.getColor(context, R.color.md_blue_grey_500),
+ ContextCompat.getColor(context, R.color.md_blue_grey_600),
+ ContextCompat.getColor(context, R.color.md_blue_grey_700),
+ ContextCompat.getColor(context, R.color.md_blue_grey_800),
+ ContextCompat.getColor(context, R.color.md_blue_grey_900)
+ };
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemeHelper.java b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemeHelper.java
new file mode 100644
index 00000000..510bb566
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemeHelper.java
@@ -0,0 +1,179 @@
+/*
+ This file is part of the dandelion*.
+
+ dandelion* is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ dandelion* is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the dandelion*.
+
+ If not, see .
+ This class is inspired by org.horasapps.LeafPic
+ */
+package com.github.dfa.diaspora_android.ui.theme;
+
+import android.content.DialogInterface;
+import android.content.res.ColorStateList;
+import android.graphics.Color;
+import android.graphics.PorterDuff;
+import android.os.Build;
+import android.support.design.widget.TabLayout;
+import android.support.v4.content.ContextCompat;
+import android.support.v4.widget.CompoundButtonCompat;
+import android.support.v7.app.AlertDialog;
+import android.support.v7.widget.ActionMenuView;
+import android.support.v7.widget.Toolbar;
+import android.view.View;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+import android.widget.ProgressBar;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
+import android.widget.TextView;
+
+import com.github.dfa.diaspora_android.R;
+import com.github.dfa.diaspora_android.util.AppSettings;
+
+/**
+ * Singleton that can be used to color views
+ * Created by vanitas on 06.10.16.
+ */
+
+public class ThemeHelper {
+ private AppSettings appSettings;
+ private static ThemeHelper instance;
+
+ private ThemeHelper(AppSettings appSettings) {
+ this.appSettings = appSettings;
+ }
+
+ public static ThemeHelper getInstance(AppSettings appSettings) {
+ if (instance == null) {
+ instance = new ThemeHelper(appSettings);
+ }
+ return instance;
+ }
+
+ public static ThemeHelper getInstance() {
+ if (instance == null)
+ throw new IllegalStateException("ThemeHelper must be initialized using getInstance(AppSettingsBase) before it can be used!");
+ return instance;
+ }
+
+ public static void updateEditTextColor(EditText editText) {
+ if (editText != null) {
+ editText.setHighlightColor(getInstance().appSettings.getAccentColor());
+ if (Build.VERSION.SDK_INT >= 21) {
+ editText.getBackground().mutate().setColorFilter(getAccentColor(), PorterDuff.Mode.SRC_ATOP);
+ }
+ }
+ }
+
+ public static void updateCheckBoxColor(CheckBox checkBox) {
+ if (checkBox != null) {
+ int states[][] = {{android.R.attr.state_checked}, {}};
+ int colors[] = {ThemeHelper.getAccentColor(), getNeutralGreyColor()};
+ CompoundButtonCompat.setButtonTintList(checkBox, new ColorStateList(states, colors));
+ }
+ }
+
+ public static void updateTabLayoutColor(TabLayout tabLayout) {
+ if (tabLayout != null) {
+ tabLayout.setBackgroundColor(getInstance().appSettings.getPrimaryColor());
+ tabLayout.setSelectedTabIndicatorColor(getInstance().appSettings.getAccentColor());
+ }
+ }
+
+ public static void updateTextViewLinkColor(TextView textView) {
+ if (textView != null) {
+ textView.setHighlightColor(getInstance().appSettings.getAccentColor());
+ textView.setLinkTextColor(getInstance().appSettings.getAccentColor());
+ }
+ }
+
+ public static void updateTextViewTextColor(TextView textView) {
+ if (textView != null) {
+ textView.setTextColor(getInstance().appSettings.getAccentColor());
+ }
+ }
+
+ public static void updateToolbarColor(Toolbar toolbar) {
+ if (toolbar != null) {
+ toolbar.setBackgroundColor(getInstance().appSettings.getPrimaryColor());
+ }
+ }
+
+ public static void updateActionMenuViewColor(ActionMenuView actionMenuView) {
+ if (actionMenuView != null) {
+ actionMenuView.setBackgroundColor(getInstance().appSettings.getPrimaryColor());
+ }
+ }
+
+ public static int getPrimaryColor() {
+ return getInstance().appSettings.getPrimaryColor();
+ }
+
+ public static int getAccentColor() {
+ return getInstance().appSettings.getAccentColor();
+ }
+
+ public static void setPrimaryColorAsBackground(View view) {
+ if (view != null) {
+ view.setBackgroundColor(getPrimaryColor());
+ }
+ }
+
+ public static int getPrimaryDarkColor() {
+ return ColorPalette.getObscuredColor(getPrimaryColor());
+ }
+
+ public static void updateProgressBarColor(ProgressBar progressBar) {
+ if (progressBar != null && progressBar.getProgressDrawable() != null) {
+ progressBar.getProgressDrawable().setColorFilter(getAccentColor(), PorterDuff.Mode.SRC_IN);
+ }
+ }
+
+ public static void updateRadioGroupColor(RadioGroup radioGroup) {
+ if (radioGroup != null && Build.VERSION.SDK_INT >= 21) {
+ for (int i = 0; i < radioGroup.getChildCount(); ++i) {
+ RadioButton btn = ((RadioButton) radioGroup.getChildAt(i));
+ btn.setButtonTintList(new ColorStateList(
+ new int[][]{new int[]{-android.R.attr.state_enabled}, new int[]{android.R.attr.state_enabled}},
+ new int[]{Color.BLACK, ThemeHelper.getAccentColor()}));
+ btn.invalidate();
+ }
+ }
+ }
+
+ public static int getNeutralGreyColor() {
+ return ContextCompat.getColor(getInstance().appSettings.getContext(), R.color.md_grey_800);
+ }
+
+ public static void updateAlertDialogColor(AlertDialog alertDialog) {
+ if (alertDialog != null) {
+ for (int i : new int[]{
+ DialogInterface.BUTTON_POSITIVE,
+ DialogInterface.BUTTON_NEUTRAL,
+ DialogInterface.BUTTON_NEGATIVE}) {
+ Button b = alertDialog.getButton(i);
+ if (b != null) {
+ b.setTextColor(getAccentColor());
+ }
+ }
+ }
+ }
+
+ public static void updateButtonTextColor(Button button) {
+ if (button != null) {
+ button.setTextColor(getAccentColor());
+ }
+ }
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/Themeable.java b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/Themeable.java
new file mode 100644
index 00000000..61ab17fa
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/Themeable.java
@@ -0,0 +1,10 @@
+package com.github.dfa.diaspora_android.ui.theme;
+
+/**
+ * Interface that allows setting Theme colors
+ * Created by vanitas on 24.10.16.
+ */
+
+public interface Themeable {
+ void setColors();
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedActivity.java b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedActivity.java
new file mode 100644
index 00000000..d8651bb5
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedActivity.java
@@ -0,0 +1,91 @@
+/*
+ This file is part of the dandelion*.
+
+ dandelion* is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ dandelion* is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the dandelion*.
+
+ If not, see .
+ */
+package com.github.dfa.diaspora_android.ui.theme;
+
+import android.annotation.TargetApi;
+import android.content.pm.ActivityInfo;
+import android.os.Build;
+import android.support.v7.app.AppCompatActivity;
+
+import com.github.dfa.diaspora_android.App;
+import com.github.dfa.diaspora_android.R;
+import com.github.dfa.diaspora_android.util.AppSettings;
+import com.github.dfa.diaspora_android.util.ContextUtils;
+
+/**
+ * Activity that supports color schemes
+ * Created by vanitas on 06.10.16.
+ */
+
+public abstract class ThemedActivity extends AppCompatActivity {
+
+ protected AppSettings getAppSettings() {
+ return ((App) getApplication()).getSettings();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ ThemeHelper.getInstance(getAppSettings());
+ updateLanguage();
+ updateStatusBarColor();
+ updateRecentAppColor();
+ applyColorToViews();
+ updateScreenRotation();
+ }
+
+ protected abstract void applyColorToViews();
+
+ /**
+ * Update color of the status bar
+ */
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+ private void updateStatusBarColor() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ getWindow().setStatusBarColor(ThemeHelper.getPrimaryDarkColor());
+ }
+ }
+
+ /**
+ * Update primary color in recent apps overview
+ */
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+ private void updateRecentAppColor() {
+
+ }
+
+ protected void updateScreenRotation() {
+ String setting = getAppSettings().getScreenRotation();
+ int rotation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; // Default (system settings)
+
+ if (setting.equals(getString(R.string.rotation_val_sensor))) {
+ rotation = ActivityInfo.SCREEN_ORIENTATION_SENSOR;
+ } else if (setting.equals(getString(R.string.rotation_val_portrait))) {
+ rotation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT;
+ } else if (setting.equals(getString(R.string.rotation_val_landscape))) {
+ rotation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE;
+ }
+ setRequestedOrientation(rotation);
+ }
+
+ public void updateLanguage() {
+ AppSettings appSettings = getAppSettings();
+ ContextUtils.get().setAppLanguage(appSettings.getLanguage());
+ }
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedAlertDialogBuilder.java b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedAlertDialogBuilder.java
new file mode 100644
index 00000000..c5a3cde7
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedAlertDialogBuilder.java
@@ -0,0 +1,45 @@
+package com.github.dfa.diaspora_android.ui.theme;
+
+import android.content.Context;
+import android.content.DialogInterface;
+import android.support.annotation.NonNull;
+import android.support.annotation.StyleRes;
+import android.support.v7.app.AlertDialog;
+
+import com.github.dfa.diaspora_android.util.AppSettings;
+
+/**
+ * AlertDialog Builder that colors its buttons
+ * Created by vanitas on 06.11.16.
+ */
+
+public class ThemedAlertDialogBuilder extends AlertDialog.Builder {
+ protected AppSettings appSettings;
+
+ public ThemedAlertDialogBuilder(@NonNull Context context, AppSettings appSettings) {
+ super(context);
+ this.appSettings = appSettings;
+ }
+
+ public ThemedAlertDialogBuilder(@NonNull Context context, @StyleRes int themeResId, AppSettings appSettings) {
+ super(context, themeResId);
+ this.appSettings = appSettings;
+ }
+
+ @Override
+ public AlertDialog create() {
+ final AlertDialog dialog = super.create();
+ dialog.setOnShowListener(new DialogInterface.OnShowListener() {
+ @Override
+ public void onShow(DialogInterface dialogInterface) {
+ applyColors(dialog);
+ }
+ });
+ return dialog;
+ }
+
+ private void applyColors(AlertDialog alertDialog) {
+ ThemeHelper.getInstance(appSettings);
+ ThemeHelper.updateAlertDialogColor(alertDialog);
+ }
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedAppCompatDialogFragment.java b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedAppCompatDialogFragment.java
new file mode 100644
index 00000000..11e6f707
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedAppCompatDialogFragment.java
@@ -0,0 +1,28 @@
+package com.github.dfa.diaspora_android.ui.theme;
+
+import android.app.Dialog;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v7.app.AppCompatDialogFragment;
+
+import com.github.dfa.diaspora_android.util.AppSettings;
+
+/**
+ * Themed DialogFragment
+ * Created by vanitas on 22.10.16.
+ */
+
+public abstract class ThemedAppCompatDialogFragment extends AppCompatDialogFragment {
+
+ @NonNull
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ Dialog dialog = super.onCreateDialog(savedInstanceState);
+ ThemeHelper.getInstance(getAppSettings());
+ return dialog;
+ }
+
+ protected abstract void applyColorsToViews();
+
+ protected abstract AppSettings getAppSettings();
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedCheckBoxPreference.java b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedCheckBoxPreference.java
new file mode 100644
index 00000000..0c829342
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedCheckBoxPreference.java
@@ -0,0 +1,48 @@
+package com.github.dfa.diaspora_android.ui.theme;
+
+import android.content.Context;
+import android.preference.CheckBoxPreference;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CheckBox;
+
+import com.github.dfa.diaspora_android.util.AppSettings;
+
+/**
+ * CheckboxPreference that colors its checkbox with accent color
+ * Created by vanitas on 24.10.16.
+ */
+
+public class ThemedCheckBoxPreference extends CheckBoxPreference implements Themeable {
+ protected View rootLayout;
+
+ @SuppressWarnings("unused")
+ public ThemedCheckBoxPreference(Context context) {
+ super(context);
+ }
+
+ @SuppressWarnings("unused")
+ public ThemedCheckBoxPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @SuppressWarnings("unused")
+ public ThemedCheckBoxPreference(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ @Override
+ protected View onCreateView(ViewGroup parent) {
+ rootLayout = super.onCreateView(parent);
+ setColors();
+ return rootLayout;
+ }
+
+ @Override
+ public void setColors() {
+ CheckBox checkBox = rootLayout.findViewById(android.R.id.checkbox);
+ ThemeHelper.getInstance(AppSettings.get());
+ ThemeHelper.updateCheckBoxColor(checkBox);
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedColorPickerPreference.java b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedColorPickerPreference.java
new file mode 100644
index 00000000..c335d929
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedColorPickerPreference.java
@@ -0,0 +1,64 @@
+package com.github.dfa.diaspora_android.ui.theme;
+
+import android.content.Context;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
+import android.preference.Preference;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.ImageView;
+
+import com.github.dfa.diaspora_android.R;
+import com.github.dfa.diaspora_android.util.AppSettings;
+import com.github.dfa.diaspora_android.util.ContextUtils;
+
+/**
+ * Preference that shows selected Color in a circle
+ * Created by vanitas on 25.10.16.
+ */
+
+public class ThemedColorPickerPreference extends Preference implements Themeable {
+ protected ImageView colorPreview;
+
+ @SuppressWarnings("unused")
+ public ThemedColorPickerPreference(Context context) {
+ super(context);
+ }
+
+ @SuppressWarnings("unused")
+ public ThemedColorPickerPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @SuppressWarnings("unused")
+ public ThemedColorPickerPreference(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ @Override
+ protected void onBindView(View view) {
+ super.onBindView(view);
+ colorPreview = view.findViewById(android.R.id.icon);
+ setColors();
+ }
+
+ @Override
+ public void setColors() {
+ Drawable circle;
+ if (colorPreview != null && (circle = colorPreview.getDrawable()) != null) {
+ Context c = getContext();
+ AppSettings appSettings = AppSettings.get();
+ String key = getKey();
+
+ int color = ContextUtils.get().rcolor(R.color.primary);
+ if ((appSettings.isKeyEqual(key, R.string.pref_key__primary_color_shade))) {
+ color = appSettings.getPrimaryColor();
+ } else if ((appSettings.isKeyEqual(key, R.string.pref_key__accent_color_shade))) {
+ color = appSettings.getAccentColor();
+ } else {
+ color = appSettings.getColor(key, color, getSharedPreferences());
+ }
+ circle.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
+ }
+ }
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedFragment.java b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedFragment.java
new file mode 100644
index 00000000..6158a4a9
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedFragment.java
@@ -0,0 +1,49 @@
+/*
+ This file is part of the dandelion*.
+
+ dandelion* is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ dandelion* is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the dandelion*.
+
+ If not, see .
+ */
+package com.github.dfa.diaspora_android.ui.theme;
+
+import com.github.dfa.diaspora_android.App;
+import com.github.dfa.diaspora_android.util.AppSettings;
+
+import net.gsantner.opoc.activity.GsFragmentBase;
+
+/**
+ * Fragment that supports color schemes
+ * Created by vanitas on 06.10.16.
+ */
+
+public abstract class ThemedFragment extends GsFragmentBase {
+ protected AppSettings getAppSettings() {
+ return ((App) getActivity().getApplication()).getSettings();
+ }
+
+ protected abstract void applyColorToViews();
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ ThemeHelper.getInstance(getAppSettings());
+ applyColorToViews();
+ }
+
+
+ public boolean isAllowedIntellihide() {
+ return true;
+ }
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedPreferenceCategory.java b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedPreferenceCategory.java
new file mode 100644
index 00000000..5df13fda
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedPreferenceCategory.java
@@ -0,0 +1,51 @@
+package com.github.dfa.diaspora_android.ui.theme;
+
+import android.content.Context;
+import android.preference.PreferenceCategory;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import com.github.dfa.diaspora_android.util.AppSettings;
+
+/**
+ * PreferenceCategory with a colored title
+ * Created by vanitas on 24.10.16.
+ */
+
+public class ThemedPreferenceCategory extends PreferenceCategory implements Themeable {
+ protected TextView titleTextView;
+
+ @SuppressWarnings("unused")
+ public ThemedPreferenceCategory(Context context) {
+ super(context);
+ }
+
+ @SuppressWarnings("unused")
+ public ThemedPreferenceCategory(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @SuppressWarnings("unused")
+ public ThemedPreferenceCategory(Context context, AttributeSet attrs,
+ int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ @Override
+ protected View onCreateView(ViewGroup parent) {
+ View rootLayout = super.onCreateView(parent);
+ this.titleTextView = rootLayout.findViewById(android.R.id.title);
+ setColors();
+ return rootLayout;
+ }
+
+ @Override
+ public void setColors() {
+ if (titleTextView != null) {
+ ThemeHelper.getInstance(AppSettings.get());
+ ThemeHelper.updateTextViewTextColor(titleTextView);
+ }
+ }
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedPreferenceFragment.java b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedPreferenceFragment.java
new file mode 100644
index 00000000..a3a96c5a
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedPreferenceFragment.java
@@ -0,0 +1,45 @@
+package com.github.dfa.diaspora_android.ui.theme;
+
+import android.os.Build;
+import android.preference.Preference;
+import android.preference.PreferenceFragment;
+import android.preference.PreferenceScreen;
+import android.view.Window;
+
+import com.github.dfa.diaspora_android.App;
+import com.github.dfa.diaspora_android.util.AppSettings;
+
+/**
+ * PreferenceFragment with a colored status bar
+ * Created by vanitas on 24.10.16.
+ */
+
+public abstract class ThemedPreferenceFragment extends PreferenceFragment {
+ public abstract void updateViewColors();
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ updateViewColors();
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
+ if (isAdded()) {
+ App app = ((App) getActivity().getApplication());
+ AppSettings appSettings = app.getSettings();
+ if (Build.VERSION.SDK_INT >= 21) {
+ if (preference instanceof PreferenceScreen && ((PreferenceScreen) preference).getDialog() != null) {
+ Window window = ((PreferenceScreen) preference).getDialog().getWindow();
+ if (window != null) {
+ ThemeHelper.getInstance(appSettings);
+ window.setStatusBarColor(ThemeHelper.getPrimaryDarkColor());
+ }
+ }
+ }
+ }
+ return super.onPreferenceTreeClick(screen, preference);
+ }
+
+ public abstract String getFragmentTag();
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedVisibilityPreference.java b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedVisibilityPreference.java
new file mode 100644
index 00000000..6bd8c186
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedVisibilityPreference.java
@@ -0,0 +1,35 @@
+package com.github.dfa.diaspora_android.ui.theme;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.CheckBox;
+
+import com.github.dfa.diaspora_android.R;
+import com.github.dfa.diaspora_android.util.AppSettings;
+
+/**
+ * ThemedCheckBoxPreference with visibility icons instead of checkbox. TODO: Make more flexible?
+ * Created by vanitas on 25.10.16.
+ */
+
+public class ThemedVisibilityPreference extends ThemedCheckBoxPreference {
+ public ThemedVisibilityPreference(Context context) {
+ super(context);
+ }
+
+ public ThemedVisibilityPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public ThemedVisibilityPreference(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ @Override
+ public void setColors() {
+ CheckBox checkBox = rootLayout.findViewById(android.R.id.checkbox);
+ checkBox.setButtonDrawable(R.drawable.ic_visibility_selector);
+ ThemeHelper.getInstance(AppSettings.get());
+ ThemeHelper.updateCheckBoxColor(checkBox);
+ }
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/util/ActivityUtils.java b/app/src/main/java/com/github/dfa/diaspora_android/util/ActivityUtils.java
new file mode 100644
index 00000000..09ecb767
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/util/ActivityUtils.java
@@ -0,0 +1,86 @@
+package com.github.dfa.diaspora_android.util;
+
+import android.app.Activity;
+import android.content.Context;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Environment;
+import android.support.v4.content.FileProvider;
+import android.view.View;
+
+import com.github.dfa.diaspora_android.BuildConfig;
+import com.github.dfa.diaspora_android.R;
+import com.github.dfa.diaspora_android.web.WebHelper;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.Locale;
+
+@SuppressWarnings({"WeakerAccess", "unused", "SameParameterValue"})
+public class ActivityUtils extends net.gsantner.opoc.util.ActivityUtils {
+ public ActivityUtils(Activity activity) {
+ super(activity);
+ }
+
+
+ public static ActivityUtils get(Activity activity) {
+ return new ActivityUtils(activity);
+ }
+
+ public File createImageFile() throws IOException {
+ // Create an image file name
+ String timeStamp = new SimpleDateFormat("dd-MM-yy_HH-mm", Locale.getDefault()).format(new Date());
+ String imageFileName = "JPEG_" + timeStamp + "_";
+ AppLog.d(ActivityUtils.class, Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath());
+ File storageDir = Environment.getExternalStoragePublicDirectory(
+ Environment.DIRECTORY_PICTURES);
+ return new File(
+ imageFileName + /* prefix */
+ ".jpg", /* suffix */
+ storageDir.getAbsolutePath() /* directory */
+ );
+ }
+
+ /**
+ * Show Information if user is offline, returns true if is not connected to internet
+ *
+ * @param anchor A view anchor
+ */
+ public boolean showInfoIfUserNotConnectedToInternet(View anchor) {
+ boolean isOnline = WebHelper.isOnline(_context);
+ if (!isOnline) {
+ showSnackBar(R.string.sorry_need_to_be_connected_to_internet, true);
+ }
+ return !isOnline;
+ }
+
+ public void logBundle(Bundle savedInstanceState, String k) {
+ if (savedInstanceState != null) {
+ for (String key : savedInstanceState.keySet()) {
+ AppLog.d("Bundle", key + " is a key in the bundle " + k);
+ Object bun = savedInstanceState.get(key);
+ if (bun != null) {
+ if (bun instanceof Bundle) {
+ logBundle((Bundle) bun, k + "." + key);
+ } else if (bun instanceof byte[]) {
+ AppLog.d("Bundle", "Key: " + k + "." + key + ": " + Arrays.toString((byte[]) bun));
+ } else {
+ AppLog.d("Bundle", "Key: " + k + "." + key + ": " + bun.toString());
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * This method creates file sharing uri by using FileProvider
+ *
+ * @return
+ */
+ public static Uri getFileSharingUri(Context context, File file) {
+ return FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID, file);
+ }
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/util/AndroidBug5497Workaround.java b/app/src/main/java/com/github/dfa/diaspora_android/util/AndroidBug5497Workaround.java
new file mode 100644
index 00000000..98017bde
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/util/AndroidBug5497Workaround.java
@@ -0,0 +1,58 @@
+package com.github.dfa.diaspora_android.util;
+
+
+import android.app.Activity;
+import android.graphics.Rect;
+import android.view.View;
+import android.view.ViewTreeObserver;
+import android.widget.FrameLayout;
+
+// From https://stackoverflow.com/a/19494006
+public class AndroidBug5497Workaround {
+
+ // For more information, see https://code.google.com/p/android/issues/detail?id=5497
+ // To use this class, simply invoke assistActivity() on an Activity that already has its content view set.
+
+ public static void assistActivity(Activity activity) {
+ new AndroidBug5497Workaround(activity);
+ }
+
+ private View mChildOfContent;
+ private int usableHeightPrevious;
+ private FrameLayout.LayoutParams frameLayoutParams;
+
+ private AndroidBug5497Workaround(Activity activity) {
+ FrameLayout content = activity.findViewById(android.R.id.content);
+ mChildOfContent = content.getChildAt(0);
+ mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
+ public void onGlobalLayout() {
+ possiblyResizeChildOfContent();
+ }
+ });
+ frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
+ }
+
+ private void possiblyResizeChildOfContent() {
+ int usableHeightNow = computeUsableHeight();
+ if (usableHeightNow != usableHeightPrevious) {
+ int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();
+ int heightDifference = usableHeightSansKeyboard - usableHeightNow;
+ if (heightDifference > (usableHeightSansKeyboard / 4)) {
+ // keyboard probably just became visible
+ frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;
+ } else {
+ // keyboard probably just became hidden
+ frameLayoutParams.height = usableHeightSansKeyboard;
+ }
+ mChildOfContent.requestLayout();
+ usableHeightPrevious = usableHeightNow;
+ }
+ }
+
+ private int computeUsableHeight() {
+ Rect r = new Rect();
+ mChildOfContent.getWindowVisibleDisplayFrame(r);
+ return (r.bottom - r.top);
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/util/AppLog.java b/app/src/main/java/com/github/dfa/diaspora_android/util/AppLog.java
index 171bbd6c..2f0f38c8 100644
--- a/app/src/main/java/com/github/dfa/diaspora_android/util/AppLog.java
+++ b/app/src/main/java/com/github/dfa/diaspora_android/util/AppLog.java
@@ -1,6 +1,32 @@
+/*
+ This file is part of the dandelion*.
+
+ dandelion* is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ dandelion* is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the dandelion*.
+
+ If not, see .
+ */
package com.github.dfa.diaspora_android.util;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Observable;
+import java.util.Observer;
+
/**
+ * Class that logs debug messages to Androids Log and to additional targets (like textviews)
* Created by gregor on 18.09.16.
*/
public class AppLog {
@@ -35,37 +61,184 @@ public class AppLog {
*/
public static void v(Object source, String _text) {
if (isLoggingEnabled()) {
- Log.v(getLogPrefix(source), _text);
+ if (source != null) {
+ Log.v(getLogPrefix(source), _text);
+ } else {
+ Log.v("null", _text);
+ }
}
}
public static void i(Object source, String _text) {
if (isLoggingEnabled()) {
- Log.i(getLogPrefix(source), _text);
+ if (source != null) {
+ Log.i(getLogPrefix(source), _text);
+ } else {
+ Log.i("null", _text);
+ }
}
}
public static void d(Object source, String _text) {
if (isLoggingEnabled()) {
- Log.d(getLogPrefix(source), _text);
+ if (source != null) {
+ Log.d(getLogPrefix(source), _text);
+ } else {
+ Log.d("null", _text);
+ }
}
}
public static void e(Object source, String _text) {
if (isLoggingEnabled()) {
- Log.e(getLogPrefix(source), _text);
+ if (source != null) {
+ Log.e(getLogPrefix(source), _text);
+ } else {
+ Log.e("null", _text);
+ }
}
}
public static void w(Object source, String _text) {
if (isLoggingEnabled()) {
- Log.w(getLogPrefix(source), _text);
+ if (source != null) {
+ Log.w(getLogPrefix(source), _text);
+ } else {
+ Log.w("null", _text);
+ }
}
}
public static void spam(Object source, String _text) {
if (isLoggingEnabled() && isLoggingSpamEnabled()) {
- Log.v(getLogPrefix(source), _text);
+ if (source != null) {
+ Log.v(getLogPrefix(source), _text);
+ } else {
+ Log.v("null", _text);
+ }
+ }
+ }
+
+
+ /**
+ * Class that saves logs eg. for later debugging.
+ * TODO: Differentiate log types (error/debug/info...)
+ */
+ public static class Log extends Observable {
+ public static final int MAX_BUFFER_SIZE = 100;
+
+ public static Log instance;
+ private AppSettings appSettings;
+ private final DateFormat dateFormat;
+ private final ArrayList logBuffer;
+ private final ArrayList observers;
+
+ private Log() {
+ this(null);
+ }
+
+ private Log(AppSettings appSettings) {
+ if (appSettings != null) {
+ //TODO: Store/Restore logBuffer between app starts
+ logBuffer = new ArrayList<>();
+ } else {
+ logBuffer = new ArrayList<>();
+ }
+ SimpleDateFormat.getTimeInstance();
+ dateFormat = SimpleDateFormat.getDateInstance();
+ observers = new ArrayList<>();
+ }
+
+ public static Log getInstance() {
+ if (instance == null) instance = new Log();
+ return instance;
+ }
+
+ public static Log getInstance(AppSettings appSettings) {
+ if (instance == null) instance = new Log(appSettings);
+ return instance;
+ }
+
+ private static String time() {
+ return getInstance().dateFormat.format(new Date()) + ": ";
+ }
+
+ public static void d(String tag, String msg) {
+ Log l = getInstance();
+ android.util.Log.d(tag, msg);
+ l.addLogEntry(msg);
+ l.notifyLogBufferChanged();
+ }
+
+ public static void e(String tag, String msg) {
+ Log l = getInstance();
+ android.util.Log.e(tag, msg);
+ l.addLogEntry(msg);
+ l.notifyLogBufferChanged();
+ }
+
+ public static void i(String tag, String msg) {
+ Log l = getInstance();
+ android.util.Log.i(tag, msg);
+ l.addLogEntry(msg);
+ l.notifyLogBufferChanged();
+ }
+
+ public static void v(String tag, String msg) {
+ Log l = getInstance();
+ android.util.Log.v(tag, msg);
+ l.addLogEntry(msg);
+ l.notifyLogBufferChanged();
+ }
+
+ public static void w(String tag, String msg) {
+ Log l = getInstance();
+ android.util.Log.w(tag, msg);
+ l.addLogEntry(msg);
+ l.notifyLogBufferChanged();
+ }
+
+ public static void wtf(String tag, String msg) {
+ Log l = getInstance();
+ android.util.Log.wtf(tag, msg);
+ l.addLogEntry(msg);
+ l.notifyLogBufferChanged();
+ }
+
+ public synchronized static ArrayList getLogBufferArray() {
+ return getInstance().logBuffer;
+ }
+
+ public synchronized static String getLogBuffer() {
+ String out = "";
+ for (String s : getInstance().logBuffer) {
+ out = out + s + "\n";
+ }
+ return out;
+ }
+
+ private void notifyLogBufferChanged() {
+ if (observers == null) return;
+ for (Observer o : observers) {
+ if (o != null) {
+ o.update(this, null);
+ }
+ }
+ }
+
+ private synchronized void addLogEntry(String msg) {
+ logBuffer.add(time() + msg);
+ while (logBuffer.size() > MAX_BUFFER_SIZE) {
+ logBuffer.remove(0);
+ }
+ }
+
+ public static void addLogObserver(Observer observer) {
+ getInstance().observers.add(observer);
+ }
+
+ public static void removeLogObserver(Observer o) {
+ getInstance().observers.remove(o);
}
}
}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/util/AppSettings.java b/app/src/main/java/com/github/dfa/diaspora_android/util/AppSettings.java
new file mode 100644
index 00000000..1ced82bb
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/util/AppSettings.java
@@ -0,0 +1,480 @@
+/*
+ This file is part of the dandelion*.
+ dandelion* is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+ dandelion* is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+ You should have received a copy of the GNU General Public License
+ along with the dandelion*.
+ If not, see .
+ */
+package com.github.dfa.diaspora_android.util;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.graphics.Color;
+import android.os.Environment;
+
+import com.github.dfa.diaspora_android.App;
+import com.github.dfa.diaspora_android.BuildConfig;
+import com.github.dfa.diaspora_android.R;
+import com.github.dfa.diaspora_android.data.DiasporaAspect;
+import com.github.dfa.diaspora_android.data.DiasporaPodList.DiasporaPod;
+import com.github.dfa.diaspora_android.web.ProxyHandler;
+
+import net.gsantner.opoc.preference.SharedPreferencesPropertyBackend;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * Settings
+ * Created by gsantner (gsantner AT mailbox DOT org) on 20.03.16. Part of dandelion*.
+ */
+@SuppressWarnings("ConstantConditions")
+public class AppSettings extends SharedPreferencesPropertyBackend {
+ private final SharedPreferences _prefPod;
+ private DiasporaPod currentPod0Cached;
+
+ public static AppSettings get() {
+ return new AppSettings(App.get());
+ }
+
+ public AppSettings(Context context) {
+ super(context);
+ _prefPod = _context.getSharedPreferences("pod0", Context.MODE_PRIVATE);
+ }
+
+ /**
+ * Clear all settings in _prefPod (Settings related to the configured pod)
+ * This uses commit instead of apply, since
+ * SettingsActivity.SettingsFragmentDebugging.showWipeSettingsDialog()
+ * kills the app after the calling this, so we have to block until we are finished.
+ */
+ @SuppressLint("CommitPrefEdits")
+ public void resetPodSettings() {
+ super.resetSettings(_prefPod);
+ }
+
+ /**
+ * Clear all settings in _prefApp (related to the App itself)
+ * This uses commit instead of apply, since
+ * SettingsActivity.SettingsFragmentDebugging.showWipeSettingsDialog()
+ * kills the app after the calling this, so we have to block until we are finished.
+ */
+ @SuppressLint("CommitPrefEdits")
+ public void resetAppSettings() {
+ super.resetSettings(_prefApp);
+ }
+
+ //#################################
+ //## Getter & Setter for settings
+ //#################################
+ public String getProfileId() {
+ return getString(R.string.pref_key__podprofile_id, "", _prefPod);
+ }
+
+ public void setProfileId(String profileId) {
+ setString(R.string.pref_key__podprofile_id, profileId, _prefPod);
+ }
+
+ public boolean isLoadImages() {
+ return getBool(R.string.pref_key__load_images, true);
+ }
+
+ public int getMinimumFontSize() {
+ switch (getString(R.string.pref_key__font_size, "")) {
+ case "huge":
+ return 20;
+ case "large":
+ return 16;
+ case "normal":
+ return 8;
+ default:
+ setString(R.string.pref_key__font_size, "normal");
+ return 8;
+ }
+ }
+
+ public String getAvatarUrl() {
+ return getString(R.string.pref_key__podprofile_avatar_url, "", _prefPod);
+ }
+
+ public void setAvatarUrl(String avatarUrl) {
+ setString(R.string.pref_key__podprofile_avatar_url, avatarUrl, _prefPod);
+ }
+
+ public String getName() {
+ return getString(R.string.pref_key__podprofile_name, "", _prefPod);
+ }
+
+ public void setName(String name) {
+ setString(R.string.pref_key__podprofile_name, name, _prefPod);
+ }
+
+ public DiasporaPod getPod() {
+ if (currentPod0Cached == null) {
+ String pref = getString(R.string.pref_key__current_pod_0, "", _prefPod);
+
+ try {
+ currentPod0Cached = new DiasporaPod().fromJson(new JSONObject(pref));
+ } catch (JSONException e) {
+ currentPod0Cached = null;
+ }
+ }
+ return currentPod0Cached;
+ }
+
+ public void setPod(DiasporaPod pod) {
+ try {
+ setString(R.string.pref_key__current_pod_0,
+ pod == null ? null : pod.toJson().toString(), _prefPod);
+ currentPod0Cached = pod;
+ } catch (JSONException ignored) {
+ }
+ }
+
+ public boolean hasPod() {
+ return !getString(R.string.pref_key__current_pod_0, "", _prefPod).equals("");
+ }
+
+ public void setPodAspects(DiasporaAspect[] aspects) {
+ String[] strs = new String[aspects.length];
+ for (int i = 0; i < strs.length; i++) {
+ strs[i] = aspects[i].toShareAbleText();
+ }
+ setStringArray(R.string.pref_key__podprofile_aspects, strs, _prefPod);
+ }
+
+ public DiasporaAspect[] getAspects() {
+ String[] s = getStringArray(R.string.pref_key__podprofile_aspects, _prefPod);
+ DiasporaAspect[] aspects = new DiasporaAspect[s.length];
+ for (int i = 0; i < aspects.length; i++) {
+ aspects[i] = new DiasporaAspect(s[i]);
+ }
+ return aspects;
+ }
+
+ public String[] getFollowedTags() {
+ return getStringArray(R.string.pref_key__podprofile_followed_tags, _prefPod);
+ }
+
+ public void setFollowedTags(String[] values) {
+ setStringArray(R.string.pref_key__podprofile_followed_tags, values, _prefPod);
+ }
+
+ public String[] getFollowedTagsFavs() {
+ return getStringArray(R.string.pref_key__podprofile_followed_tags_favs, _prefPod);
+ }
+
+ public void setFollowedTagsFavs(List values) {
+ setStringList(R.string.pref_key__podprofile_followed_tags_favs, values, _prefPod);
+ }
+
+ public String[] getAspectFavs() {
+ return getStringArray(R.string.pref_key__podprofile_aspects_favs, _prefPod);
+ }
+
+ public void setAspectFavs(List values) {
+ setStringList(R.string.pref_key__podprofile_aspects_favs, values, _prefPod);
+ }
+
+ public int getUnreadMessageCount() {
+ return getInt(R.string.pref_key__podprofile_unread_message_count, 0, _prefPod);
+ }
+
+ public void setUnreadMessageCount(int unreadMessageCount) {
+ setInt(R.string.pref_key__podprofile_unread_message_count, unreadMessageCount, _prefPod);
+ }
+
+ public int getNotificationCount() {
+ return getInt(R.string.pref_key__podprofile_notification_count, 0, _prefPod);
+ }
+
+ public void setNotificationCount(int notificationCount) {
+ setInt(R.string.pref_key__podprofile_notification_count, notificationCount, _prefPod);
+ }
+
+ public boolean isAppendSharedViaApp() {
+ return getBool(R.string.pref_key__append_shared_via_app, true);
+ }
+
+ @SuppressLint("CommitPrefEdits")
+ public void setProxyHttpEnabled(boolean enabled) {
+ //commit instead of apply because the app is likely to be killed before apply is called.
+ _prefApp.edit().putBoolean(rstr(R.string.pref_key__http_proxy_enabled), enabled).commit();
+ }
+
+ /**
+ * Default return value: false
+ *
+ * @return whether proxy is enabled or not
+ */
+ public boolean isProxyHttpEnabled() {
+ try {
+ return getBool(R.string.pref_key__http_proxy_enabled, false);
+ } catch (ClassCastException e) {
+ setProxyHttpEnabled(false);
+ return false;
+ }
+ }
+
+ public boolean wasProxyEnabled() {
+ return getBool(R.string.pref_key__proxy_was_enabled, false);
+ }
+
+ /**
+ * Needed in order to determine, whether the proxy has just been disabled (trigger app restart)
+ * or if proxy was disabled before (do not restart app)
+ *
+ * @param b new value
+ */
+ @SuppressLint("CommitPrefEdits")
+ public void setProxyWasEnabled(boolean b) {
+ _prefApp.edit().putBoolean(rstr(R.string.pref_key__proxy_was_enabled), b).commit();
+ }
+
+ /**
+ * Default value: ""
+ *
+ * @return proxy host
+ */
+ public String getProxyHttpHost() {
+ return getString(R.string.pref_key__http_proxy_host, "");
+ }
+
+ public void setProxyHttpHost(String value) {
+ setString(R.string.pref_key__http_proxy_host, value);
+ }
+
+ /**
+ * Default value: 0
+ *
+ * @return proxy port
+ */
+ public int getProxyHttpPort() {
+ try {
+ String str = getString(R.string.pref_key__http_proxy_port, "0");
+ return Integer.parseInt(str);
+ } catch (ClassCastException e) {
+ int port = getInt(R.string.pref_key__http_proxy_port, 0);
+ setProxyHttpPort(port);
+ return port;
+ }
+ }
+
+ public void setProxyHttpPort(int value) {
+ setString(R.string.pref_key__http_proxy_port, Integer.toString(value));
+ }
+
+ public ProxyHandler.ProxySettings getProxySettings() {
+ return new ProxyHandler.ProxySettings(isProxyHttpEnabled(), getProxyHttpHost(), getProxyHttpPort());
+ }
+
+ public boolean isIntellihideToolbars() {
+ return getBool(R.string.pref_key__intellihide_toolbars, false);
+ }
+
+ public boolean isChromeCustomTabsEnabled() {
+ return getBool(R.string.pref_key__chrome_custom_tabs_enabled, true);
+ }
+
+ public boolean isLoggingEnabled() {
+ return getBool(R.string.pref_key__logging_enabled, false);
+ }
+
+ public boolean isLoggingSpamEnabled() {
+ return getBool(R.string.pref_key__logging_spam_enabled, false);
+ }
+
+ public boolean isVisibleInNavExit() {
+ return getBool(R.string.pref_key__visibility_nav__exit, true);
+ }
+
+ public boolean isVisibleInNavHelp_license() {
+ return getBool(R.string.pref_key__visibility_nav__help_license, true);
+ }
+
+ public boolean isVisibleInNavPublic_activities() {
+ return getBool(R.string.pref_key__visibility_nav__public_activities, false);
+ }
+
+ public boolean isVisibleInNavMentions() {
+ return getBool(R.string.pref_key__visibility_nav__mentions, false);
+ }
+
+ public boolean isVisibleInNavCommented() {
+ return getBool(R.string.pref_key__visibility_nav__commented, true);
+ }
+
+ public boolean isVisibleInNavLiked() {
+ return getBool(R.string.pref_key__visibility_nav__liked, true);
+ }
+
+ public boolean isVisibleInNavActivities() {
+ return getBool(R.string.pref_key__visibility_nav__activities, true);
+ }
+
+ public boolean isVisibleInNavAspects() {
+ return getBool(R.string.pref_key__visibility_nav__aspects, true);
+ }
+
+ public boolean isVisibleInNavFollowed_tags() {
+ return getBool(R.string.pref_key__visibility_nav__followed_tags, true);
+ }
+
+ public boolean isVisibleInNavProfile() {
+ return getBool(R.string.pref_key__visibility_nav__profile, true);
+ }
+
+ public boolean isVisibleInNavContacts() {
+ return getBool(R.string.pref_key__visibility_nav__contacts, false);
+ }
+
+ public boolean isVisibleInNavStatistics() {
+ return getBool(R.string.pref_key__visibility_nav__statistics, false);
+ }
+
+ public boolean isVisibleInNavReports() {
+ return getBool(R.string.pref_key__visibility_nav__reports, false);
+ }
+
+ public boolean isVisibleInNavGsantnerAccount() {
+ return getBool(R.string.pref_key__visibility_nav__gsantner_account, false);
+ }
+
+ public boolean isVisibleInNavToggleMobileDesktop() {
+ return getBool(R.string.pref_key__visibility_nav__toggle_mobile_desktop, false);
+ }
+
+ public boolean isTopbarStreamShortcutEnabled() {
+ return getBool(R.string.pref_key__topbar_stream_shortcut, false);
+ }
+
+ public boolean isOpenYoutubeExternalEnabled() {
+ return getBool(R.string.pref_key__open_youtube_external_enabled, true);
+ }
+
+ public boolean isSwipeRefreshEnabled() {
+ return getBool(R.string.pref_key__swipe_refresh_enabled, true);
+ }
+
+ public String getScreenRotation() {
+ return getString(R.string.pref_key__screen_rotation, R.string.rotation_val_system);
+ }
+
+ public boolean isAppFirstStart() {
+ boolean value = getBool(R.string.pref_key__app_first_start, true);
+ setBool(R.string.pref_key__app_first_start, false);
+ return value;
+ }
+
+ public boolean isAppCurrentVersionFirstStart(boolean doSet) {
+ int value = getInt(R.string.pref_key__app_first_start_current_version, -1);
+ if (doSet) {
+ setInt(R.string.pref_key__app_first_start_current_version, BuildConfig.VERSION_CODE);
+ }
+ return value != BuildConfig.VERSION_CODE && !BuildConfig.IS_TEST_BUILD;
+ }
+
+ public File getAppSaveDirectory() {
+ return new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/dandelion");
+
+ }
+
+ public long getLastVisitedPositionInStream() {
+ return getLong(R.string.pref_key__podprofile_last_stream_position, -1, _prefPod);
+ }
+
+ public void setLastVisitedPositionInStream(long timestamp) {
+ setLong(R.string.pref_key__podprofile_last_stream_position, timestamp, _prefPod);
+ }
+
+ public void setLanguage(String value) {
+ setString(R.string.pref_key__language, value);
+ }
+
+ public String getLanguage() {
+ return getString(R.string.pref_key__language, "");
+ }
+
+ public void setPrimaryColorSettings(int base, int shade) {
+ setInt(R.string.pref_key__primary_color_base, base);
+ setInt(R.string.pref_key__primary_color_shade, shade);
+ }
+
+ public int[] getPrimaryColorSettings() {
+ return new int[]{
+ getInt(R.string.pref_key__primary_color_base, rcolor(R.color.md_blue_650)),
+ getInt(R.string.pref_key__primary_color_shade, rcolor(R.color.primary))
+ };
+ }
+
+ @SuppressWarnings("ConstantConditions")
+ public int getPrimaryColor() {
+ if (isAmoledColorMode()) {
+ return Color.BLACK;
+ } else {
+ return getInt(R.string.pref_key__primary_color_shade, rcolor(
+ BuildConfig.IS_TEST_BUILD ? R.color.md_brown_800 : R.color.primary));
+ }
+ }
+
+ public void setAccentColorSettings(int base, int shade) {
+ setInt(R.string.pref_key__accent_color_base, base);
+ setInt(R.string.pref_key__accent_color_shade, shade);
+ }
+
+ public int[] getAccentColorSettings() {
+ return new int[]{
+ getInt(R.string.pref_key__accent_color_base, rcolor(R.color.md_green_400)),
+ getInt(R.string.pref_key__accent_color_shade, rcolor(R.color.accent))
+ };
+ }
+
+ public int getAccentColor() {
+ return getInt(R.string.pref_key__accent_color_shade, rcolor(R.color.accent));
+ }
+
+ public boolean isExtendedNotificationsActivated() {
+ return getBool(R.string.pref_key__extended_notifications, false);
+ }
+
+ public boolean isAmoledColorMode() {
+ return getBool(R.string.pref_key__primary_color__amoled_mode, false);
+ }
+
+ public void setAmoledColorMode(boolean enable) {
+ setBool(R.string.pref_key__primary_color__amoled_mode, enable);
+ }
+
+ public boolean isAdBlockEnabled() {
+ return getBool(R.string.pref_key__adblock_enable, true);
+ }
+
+ public boolean isEditorStatusBarHidden() {
+ return getBool(R.string.pref_key__is_overview_statusbar_hidden, false);
+ }
+
+ public void setRecreateMainActivity(boolean value) {
+ setBool(R.string.pref_key__recreate_main_activity, value);
+ }
+
+ public boolean isRecreateMainActivity() {
+ boolean value = getBool(R.string.pref_key__recreate_main_activity, false);
+ setRecreateMainActivity(false);
+ return value;
+ }
+
+ public boolean isShowTitleInMainView() {
+ return getBool(R.string.pref_key__show_title, false);
+ }
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/util/ContextUtils.java b/app/src/main/java/com/github/dfa/diaspora_android/util/ContextUtils.java
new file mode 100644
index 00000000..d2132cc4
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/util/ContextUtils.java
@@ -0,0 +1,58 @@
+package com.github.dfa.diaspora_android.util;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Environment;
+
+import com.github.dfa.diaspora_android.App;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.Locale;
+
+@SuppressWarnings({"WeakerAccess", "unused", "SameParameterValue"})
+public class ContextUtils extends net.gsantner.opoc.util.ContextUtils {
+ protected ContextUtils(Context context) {
+ super(context);
+ }
+
+
+ public static ContextUtils get() {
+ return new ContextUtils(App.get());
+ }
+
+ public File createImageFile() throws IOException {
+ // Create an image file name
+ String timeStamp = new SimpleDateFormat("dd-MM-yy_HH-mm", Locale.getDefault()).format(new Date());
+ String imageFileName = "JPEG_" + timeStamp + "_";
+ AppLog.d(ContextUtils.class, Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath());
+ File storageDir = Environment.getExternalStoragePublicDirectory(
+ Environment.DIRECTORY_PICTURES);
+ return new File(
+ imageFileName + /* prefix */
+ ".jpg", /* suffix */
+ storageDir.getAbsolutePath() /* directory */
+ );
+ }
+
+ public void logBundle(Bundle savedInstanceState, String k) {
+ if (savedInstanceState != null) {
+ for (String key : savedInstanceState.keySet()) {
+ AppLog.d("Bundle", key + " is a key in the bundle " + k);
+ Object bun = savedInstanceState.get(key);
+ if (bun != null) {
+ if (bun instanceof Bundle) {
+ logBundle((Bundle) bun, k + "." + key);
+ } else if (bun instanceof byte[]) {
+ AppLog.d("Bundle", "Key: " + k + "." + key + ": " + Arrays.toString((byte[]) bun));
+ } else {
+ AppLog.d("Bundle", "Key: " + k + "." + key + ": " + bun.toString());
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/util/CustomTabHelpers/BrowserFallback.java b/app/src/main/java/com/github/dfa/diaspora_android/util/CustomTabHelpers/BrowserFallback.java
deleted file mode 100644
index a4bdd930..00000000
--- a/app/src/main/java/com/github/dfa/diaspora_android/util/CustomTabHelpers/BrowserFallback.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.github.dfa.diaspora_android.util.CustomTabHelpers;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.net.Uri;
-
-/**
- * Adapted from https://medium.com/ribot-labs/exploring-chrome-customs-tabs-on-android-ef427effe2f4
- */
-
-public class BrowserFallback implements CustomTabActivityHelper.CustomTabFallback {
- @Override
- public void openUri(Activity activity, Uri uri) {
- Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.setData(uri);
- activity.startActivity(intent);
- }
-}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/util/DiasporaUrlHelper.java b/app/src/main/java/com/github/dfa/diaspora_android/util/DiasporaUrlHelper.java
index b3c99805..b272dac0 100644
--- a/app/src/main/java/com/github/dfa/diaspora_android/util/DiasporaUrlHelper.java
+++ b/app/src/main/java/com/github/dfa/diaspora_android/util/DiasporaUrlHelper.java
@@ -1,18 +1,18 @@
/*
- This file is part of the Diaspora for Android.
+ This file is part of the dandelion*.
- Diaspora for Android is free software: you can redistribute it and/or modify
+ dandelion* is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
- Diaspora for Android is distributed in the hope that it will be useful,
+ dandelion* is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with the Diaspora for Android.
+ along with the dandelion*.
If not, see .
*/
@@ -20,21 +20,22 @@ package com.github.dfa.diaspora_android.util;
import com.github.dfa.diaspora_android.App;
import com.github.dfa.diaspora_android.R;
-import com.github.dfa.diaspora_android.data.AppSettings;
-import com.github.dfa.diaspora_android.data.PodAspect;
+import com.github.dfa.diaspora_android.data.DiasporaAspect;
+import com.github.dfa.diaspora_android.data.DiasporaPodList.DiasporaPod;
/**
* Helper class that provides easy access to specific urls related to diaspora
* Created by vanitasvitae on 10.08.16.
*/
-@SuppressWarnings("unused")
+@SuppressWarnings({"unused", "SpellCheckingInspection", "SameParameterValue", "WeakerAccess"})
public class DiasporaUrlHelper {
private final AppSettings settings;
- public static final String HTTPS = "https://";
+ public static final String URL_BLANK = "about:blank";
public static final String SUBURL_NOTIFICATIONS = "/notifications";
public static final String SUBURL_POSTS = "/posts/";
public static final String SUBURL_STREAM = "/stream";
+ public static final String SUBURL_STREAM_WITH_TIMESTAMP = SUBURL_STREAM + "?max_time=";
public static final String SUBURL_CONVERSATIONS = "/conversations";
public static final String SUBURL_NEW_POST = "/status_messages/new";
public static final String SUBURL_PEOPLE = "/people/";
@@ -43,30 +44,47 @@ public class DiasporaUrlHelper {
public static final String SUBURL_COMMENTED = "/commented";
public static final String SUBURL_MENTIONS = "/mentions";
public static final String SUBURL_PUBLIC = "/public";
+ public static final String SUBURL_ASPECT = "/aspects?a_ids[]=";
public static final String SUBURL_TOGGLE_MOBILE = "/mobile/toggle";
public static final String SUBURL_SEARCH_TAGS = "/tags/";
public static final String SUBURL_SEARCH_PEOPLE = "/people.mobile?q=";
public static final String SUBURL_FOLOWED_TAGS = "/followed_tags";
public static final String SUBURL_ASPECTS = "/aspects";
public static final String SUBURL_STATISTICS = "/statistics";
- public static final String URL_BLANK = "about:blank";
+ public static final String SUBURL_PERSONAL_SETTINGS = "/user/edit";
+ public static final String SUBURL_MANAGE_TAGS = "/tag_followings/manage";
+ public static final String SUBURL_SIGN_IN = "/users/sign_in";
+ public static final String SUBURL_CONTACTS = "/contacts";
+ public static final String SUBURL_REPORTS = "/reports";
+ public static final String SUBURL_NOTIFICATIONS_ALSO_COMMENTED = "/notifications?type=also_commented";
+ public static final String SUBURL_NOTIFICATIONS_COMMENT_ON_POST = "/notifications?type=comment_on_post";
+ public static final String SUBURL_NOTIFICATIONS_LIKED = "/notifications?type=liked";
+ public static final String SUBURL_NOTIFICATIONS_MENTIONED = "/notifications?type=mentioned";
+ public static final String SUBURL_NOTIFICATIONS_RESHARED = "/notifications?type=reshared";
+ public static final String SUBURL_NOTIFICATIONS_STARTED_SHARING = "/notifications?type=started_sharing";
+ public static final String SUBURL_THEME = "/user/edit";
public DiasporaUrlHelper(AppSettings settings) {
this.settings = settings;
}
/**
- * Return a https url of the pod set in AppSettings.
+ * Return a url of the pod set in AppSettingsBase.
* Eg. https://pod.geraspora.de
*
* @return https://(pod-domain.tld)
*/
public String getPodUrl() {
- return HTTPS + settings.getPodDomain();
+ DiasporaPod pod = settings.getPod();
+ if (pod != null) {
+ return pod.getPodUrl().getBaseUrl();
+ }
+ return "http://127.0.0.1";
+
}
/**
- * Return a https url that points to the stream of the configured diaspora account
+ * Return a url that points to the stream of the configured diaspora account
*
* @return https://(pod-domain.tld)/stream
*/
@@ -75,7 +93,16 @@ public class DiasporaUrlHelper {
}
/**
- * Return a https url that points to the notifications feed of the configured diaspora account
+ * Return a url that points to the stream of the configured diaspora account on a timestamp
+ *
+ * @return https://(pod-domain.tld)/stream?max_time=1482057867
+ */
+ public String getStreamWithTimestampUrl(long timestamp) {
+ return getPodUrl() + SUBURL_STREAM_WITH_TIMESTAMP + timestamp;
+ }
+
+ /**
+ * Return a url that points to the notifications feed of the configured diaspora account
*
* @return https://(pod-domain.tld)/notifications
*/
@@ -84,7 +111,7 @@ public class DiasporaUrlHelper {
}
/**
- * Returns a https url that points to the post with the id postId
+ * Returns a url that points to the post with the id postId
*
* @return https://(pod-domain.tld)/posts/(postId)
*/
@@ -93,7 +120,7 @@ public class DiasporaUrlHelper {
}
/**
- * Return a https url that points to the conversations overview of the registered diaspora account
+ * Return a url that points to the conversations overview of the registered diaspora account
*
* @return https://(pod-domain.tld)/conversations
*/
@@ -102,7 +129,7 @@ public class DiasporaUrlHelper {
}
/**
- * Return a https url that points to the new-post form that lets the user create a new post
+ * Return a url that points to the new-post form that lets the user create a new post
*
* @return https://(pod-domain.tld)/status_messages/new
*/
@@ -111,7 +138,7 @@ public class DiasporaUrlHelper {
}
/**
- * Return a https url that shows the profile of the currently registered diaspora account
+ * Return a url that shows the profile of the currently registered diaspora account
*
* @return https://(pod-domain.tld)/people/(profileId)
*/
@@ -120,17 +147,27 @@ public class DiasporaUrlHelper {
}
/**
- * Return a https url that shows the profile of the user with user id profileId
+ * Return a url that shows the profile of the user with user id profileId
*
* @param profileId Id of the profile to be shown
* @return https://(pod-domain.tld)/people/(profileId)
*/
- public String getProfileUrl(long profileId) {
+ public String getProfileUrl(String profileId) {
return getPodUrl() + SUBURL_PEOPLE + profileId;
}
/**
- * Return a https url that points to the activities feed of the currently registered diaspora account
+ * Return a url that queries posts from the given aspect
+ *
+ * @param aspectId ID of the aspect
+ * @return https://(pod-domain.tld)//aspects?a_ids[]=aspectId
+ */
+ public String getAspectUrl(String aspectId) {
+ return getPodUrl() + SUBURL_ASPECT + aspectId;
+ }
+
+ /**
+ * Return a url that points to the activities feed of the currently registered diaspora account
*
* @return https://(pod-domain.tld)/activity
*/
@@ -139,7 +176,7 @@ public class DiasporaUrlHelper {
}
/**
- * Return a https url that points to the feed of posts that were liked by the currently registered diaspora account
+ * Return a url that points to the feed of posts that were liked by the currently registered diaspora account
*
* @return https://(pod-domain.tld)/liked
*/
@@ -148,7 +185,7 @@ public class DiasporaUrlHelper {
}
/**
- * Return a https url that points to the stream of posts that were commented by the currently registered diaspora account
+ * Return a url that points to the stream of posts that were commented by the currently registered diaspora account
*
* @return https://(pod-domain.tld)/commented
*/
@@ -157,7 +194,7 @@ public class DiasporaUrlHelper {
}
/**
- * Return a https url that points to the stream of posts in which the currently registered diaspora account has been mentioned in
+ * Return a url that points to the stream of posts in which the currently registered diaspora account has been mentioned in
*
* @return https://(pod-domain.tld)/mentions
*/
@@ -166,7 +203,7 @@ public class DiasporaUrlHelper {
}
/**
- * Return a https url that points to the stream of public posts
+ * Return a url that points to the stream of public posts
*
* @return https://(pod-domain.tld)/public
*/
@@ -175,7 +212,7 @@ public class DiasporaUrlHelper {
}
/**
- * Return a https url that toggles between mobile and desktop view when opened
+ * Return a url that toggles between mobile and desktop view when opened
*
* @return https://(pod-domain.tld)/mobile/toggle
*/
@@ -184,7 +221,7 @@ public class DiasporaUrlHelper {
}
/**
- * Return a https url that queries posts for the given hashtag query
+ * Return a url that queries posts for the given hashtag query
*
* @param query hashtag to be searched
* @return https://(pod-domain.tld)/tags/query
@@ -194,7 +231,16 @@ public class DiasporaUrlHelper {
}
/**
- * Return a https url that queries user accounts for query
+ * Return a url that queries posts for the given hashtag query
+ *
+ * @return https://(pod-domain.tld)/followed_tags
+ */
+ public String getAllFollowedTagsUrl() {
+ return getPodUrl() + SUBURL_FOLOWED_TAGS;
+ }
+
+ /**
+ * Return a url that queries user accounts for query
*
* @param query search term
* @return https://(pod-domain.tld)/people.mobile?q=(query)
@@ -204,13 +250,84 @@ public class DiasporaUrlHelper {
}
/**
- * Return a https url that points to the statistics page of the pod.
+ * Return a url that points to the statistics page of the pod.
+ *
* @return https://(pod-domain.tld)/statistics
*/
public String getStatisticsUrl() {
return getPodUrl() + SUBURL_STATISTICS;
}
+ /**
+ * Return an Url that points to the reports page of a the configured pod.
+ * Note: This url is only useful/visible for podmins and moderators.
+ *
+ * @return https://(pod-domain.tld)/reports
+ */
+ public String getReportsUrl() {
+ return getPodUrl() + SUBURL_REPORTS;
+ }
+
+ /**
+ * Return a url that points to the sign in page of the pod.
+ *
+ * @return https://(pod-domain.tld)/users/sign_in
+ */
+ public String getSignInUrl() {
+ return getPodUrl() + SUBURL_SIGN_IN;
+ }
+
+ /**
+ * Return a url that points to the personal settings page of the pod.
+ *
+ * @return https://(pod-domain.tld)/user/edit
+ */
+ public String getPersonalSettingsUrl() {
+ return getPodUrl() + SUBURL_PERSONAL_SETTINGS;
+ }
+
+ /**
+ * Return a url that points to the manage tags page of the pod.
+ *
+ * @return https://(pod-domain.tld)/tag_followings/manage
+ */
+ public String getManageTagsUrl() {
+ return getPodUrl() + SUBURL_MANAGE_TAGS;
+ }
+
+ /**
+ * Return a url that points to the manage tags page of the pod.
+ *
+ * @return https://(pod-domain.tld)/contacts
+ */
+ public String getContactsUrl() {
+ return getPodUrl() + SUBURL_CONTACTS;
+ }
+
+ public String getSuburlNotificationsAlsoCommentedUrl() {
+ return getPodUrl() + SUBURL_NOTIFICATIONS_ALSO_COMMENTED;
+ }
+
+ public String getSuburlNotificationsCommentOnPostUrl() {
+ return getPodUrl() + SUBURL_NOTIFICATIONS_COMMENT_ON_POST;
+ }
+
+ public String getSuburlNotificationsLikedUrl() {
+ return getPodUrl() + SUBURL_NOTIFICATIONS_LIKED;
+ }
+
+ public String getSuburlNotificationsMentionedUrl() {
+ return getPodUrl() + SUBURL_NOTIFICATIONS_MENTIONED;
+ }
+
+ public String getSuburlNotificationsResharedUrl() {
+ return getPodUrl() + SUBURL_NOTIFICATIONS_RESHARED;
+ }
+
+ public String getSuburlNotificationsStartedSharingUrl() {
+ return getPodUrl() + SUBURL_NOTIFICATIONS_STARTED_SHARING;
+ }
+
/**
* Returns the url of the blank WebView
*
@@ -228,7 +345,7 @@ public class DiasporaUrlHelper {
url = url.replace(getPodUrl() + "/aspects?a_ids[]=", "").split(",")[0];
try {
int id = Integer.parseInt(url);
- for (PodAspect aspect : app.getPodUserProfile().getAspects()) {
+ for (DiasporaAspect aspect : app.getDiasporaUserProfile().getAspects()) {
if (aspect.id == id) {
return aspect.name;
}
@@ -237,4 +354,13 @@ public class DiasporaUrlHelper {
}
return app.getString(R.string.aspects);
}
+
+ /**
+ * Return a url that points to the settings of the pod.
+ *
+ * @return https://(pod-domain.tld)/user/edit
+ */
+ public String getThemeUrl() {
+ return getPodUrl() + SUBURL_THEME;
+ }
}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/util/Helpers.java b/app/src/main/java/com/github/dfa/diaspora_android/util/Helpers.java
deleted file mode 100644
index 830380ec..00000000
--- a/app/src/main/java/com/github/dfa/diaspora_android/util/Helpers.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- This file is part of the Diaspora for Android.
-
- Diaspora for Android is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Diaspora for Android is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with the Diaspora for Android.
-
- If not, see .
- */
-package com.github.dfa.diaspora_android.util;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.net.Uri;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Environment;
-
-import com.github.dfa.diaspora_android.App;
-import com.github.dfa.diaspora_android.R;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.text.SimpleDateFormat;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.Locale;
-
-public class Helpers {
-
- public static void animateToActivity(Activity from, Class to, boolean finishFromActivity) {
- Intent intent = new Intent(from, to);
- intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
- from.startActivity(intent);
- from.overridePendingTransition(R.anim.fadein, R.anim.fadeout);
- if (finishFromActivity) {
- from.finish();
- }
- }
-
- public static int getColorFromRessource(Context context, int ressourceId) {
- Resources res = context.getResources();
- if (Build.VERSION.SDK_INT >= 23) {
- return res.getColor(ressourceId, context.getTheme());
- } else {
- return res.getColor(ressourceId);
- }
- }
-
- public static void loadUrlInExternalBrowser(Context context, String url) {
- try {
- Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
- context.startActivity(browserIntent);
- } catch (Exception ignored) {
- }
- }
-
- public static File createImageFile() throws IOException {
- // Create an image file name
- String timeStamp = new SimpleDateFormat("dd-MM-yy_HH-mm", Locale.getDefault()).format(new Date());
- String imageFileName = "JPEG_" + timeStamp + "_";
- AppLog.d(Helpers.class, Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath());
- File storageDir = Environment.getExternalStoragePublicDirectory(
- Environment.DIRECTORY_PICTURES);
- return new File(
- imageFileName + /* prefix */
- ".jpg", /* suffix */
- storageDir.getAbsolutePath() /* directory */
- );
- }
-
- public static String readTextfileFromRawRessource(Context context, int rawRessourceId, String linePrefix, String linePostfix) {
- StringBuilder sb = new StringBuilder();
- String line = "";
- BufferedReader br = null;
- linePrefix = linePrefix == null ? "" : linePrefix;
- linePostfix = linePostfix == null ? "" : linePostfix;
-
- try {
- br = new BufferedReader(new InputStreamReader(context.getResources().openRawResource(rawRessourceId)));
- while ((line = br.readLine()) != null) {
- sb.append(linePrefix);
- sb.append(line);
- sb.append(linePostfix);
- sb.append("\n");
- }
- } catch (Exception ignored) {
- } finally {
- if (br != null) {
- try {
- br.close();
- } catch (IOException ignored) {
- }
- }
- }
- return sb.toString();
- }
-
- public static String hexColorFromRessourceColor(Context context, int idColor) {
- return "#" + Integer.toHexString(context.getResources().getColor(idColor) & 0x00ffffff);
- }
-
- public static void printBundle(Bundle savedInstanceState, String k) {
- if (savedInstanceState != null) {
- for (String key : savedInstanceState.keySet()) {
- AppLog.d("SAVED", key + " is a key in the bundle " + k);
- Object bun = savedInstanceState.get(key);
- if (bun != null) {
- if (bun instanceof Bundle) {
- printBundle((Bundle) bun, k + "." + key);
- } else if (bun instanceof byte[]) {
- AppLog.d("SAVED", "Key: " + k + "." + key + ": " + Arrays.toString((byte[]) bun));
- } else {
- AppLog.d("SAVED", "Key: " + k + "." + key + ": " + bun.toString());
- }
- }
- }
- }
- }
-}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/util/Log.java b/app/src/main/java/com/github/dfa/diaspora_android/util/Log.java
deleted file mode 100644
index ad0791e7..00000000
--- a/app/src/main/java/com/github/dfa/diaspora_android/util/Log.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package com.github.dfa.diaspora_android.util;
-
-import com.github.dfa.diaspora_android.data.AppSettings;
-
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Observable;
-import java.util.Observer;
-
-/**
- * Class that saves logs eg. for later debugging.
- * TODO: Differentiate log types (error/debug/info...)
- * Created by vanitas on 09.09.16.
- */
-public class Log extends Observable {
- public static final int MAX_BUFFER_SIZE = 100;
-
- public static Log instance;
- private AppSettings appSettings;
- private SimpleDateFormat dateFormat;
- private ArrayList logBuffer;
- private ArrayList observers;
-
- private Log() {
- this(null);
- }
- private Log(AppSettings appSettings) {
- if(appSettings != null) {
- //TODO: Store/Restore logBuffer between app starts
- logBuffer = new ArrayList<>();
- } else {
- logBuffer = new ArrayList<>();
- }
- dateFormat = new SimpleDateFormat("HH:mm:ss");
- observers = new ArrayList<>();
- }
-
- public static Log getInstance() {
- if(instance == null) instance = new Log();
- return instance;
- }
-
- public static Log getInstance(AppSettings appSettings) {
- if(instance == null) instance = new Log(appSettings);
- return instance;
- }
-
- private static String time() {
- return getInstance().dateFormat.format(new Date())+": ";
- }
-
- public static void d(String tag, String msg) {
- Log l = getInstance();
- android.util.Log.d(tag, msg);
- l.addLogEntry(msg);
- l.notifyLogBufferChanged();
- }
-
- public static void e(String tag, String msg) {
- Log l = getInstance();
- android.util.Log.e(tag, msg);
- l.addLogEntry(msg);
- l.notifyLogBufferChanged();
- }
-
- public static void i(String tag, String msg) {
- Log l = getInstance();
- android.util.Log.i(tag, msg);
- l.addLogEntry(msg);
- l.notifyLogBufferChanged();
- }
-
- public static void v(String tag, String msg) {
- Log l = getInstance();
- android.util.Log.v(tag, msg);
- l.addLogEntry(msg);
- l.notifyLogBufferChanged();
- }
-
- public static void w(String tag, String msg) {
- Log l = getInstance();
- android.util.Log.w(tag, msg);
- l.addLogEntry(msg);
- l.notifyLogBufferChanged();
- }
-
- public static void wtf(String tag, String msg) {
- Log l = getInstance();
- android.util.Log.wtf(tag, msg);
- l.addLogEntry(msg);
- l.notifyLogBufferChanged();
- }
-
- public synchronized static ArrayList getLogBufferArray() {
- return getInstance().logBuffer;
- }
-
- public synchronized static String getLogBuffer() {
- String out = "";
- for(String s : getInstance().logBuffer) {
- out = out + s + "\n";
- }
- return out;
- }
-
- private void notifyLogBufferChanged() {
- if(observers == null) return;
- for(Observer o : observers) {
- if(o != null) {
- o.update(this, null);
- }
- }
- }
-
- private synchronized void addLogEntry(String msg) {
- logBuffer.add(time()+msg);
- while (logBuffer.size() > MAX_BUFFER_SIZE) {
- logBuffer.remove(0);
- }
- }
-
- public static void addLogObserver(Observer observer) {
- getInstance().observers.add(observer);
- }
-
- public static void removeLogObserver(Observer o) {
- getInstance().observers.remove(o);
- }
-}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/web/BrowserFragment.java b/app/src/main/java/com/github/dfa/diaspora_android/web/BrowserFragment.java
new file mode 100644
index 00000000..bfc53fd9
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/web/BrowserFragment.java
@@ -0,0 +1,224 @@
+/*
+ This file is part of the dandelion*.
+
+ dandelion* is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ dandelion* is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the dandelion*.
+
+ If not, see .
+ */
+package com.github.dfa.diaspora_android.web;
+
+import android.content.Context;
+import android.content.MutableContextWrapper;
+import android.os.Bundle;
+import android.support.v4.widget.SwipeRefreshLayout;
+import android.view.View;
+import android.view.ViewGroup;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.widget.ProgressBar;
+
+import com.github.dfa.diaspora_android.App;
+import com.github.dfa.diaspora_android.R;
+import com.github.dfa.diaspora_android.ui.theme.ThemeHelper;
+import com.github.dfa.diaspora_android.ui.theme.ThemedFragment;
+import com.github.dfa.diaspora_android.util.AppLog;
+import com.github.dfa.diaspora_android.util.AppSettings;
+
+/**
+ * Fragment with a webView and a ProgressBar.
+ * This Fragment retains its instance.
+ * Created by vanitas on 26.09.16.
+ */
+
+public class BrowserFragment extends ThemedFragment {
+ public static final String TAG = "com.github.dfa.diaspora_android.BrowserFragment";
+
+ protected ContextMenuWebView webView;
+ protected ProgressBar progressBar;
+ protected AppSettings appSettings;
+ protected CustomWebViewClient webViewClient;
+ protected WebSettings webSettings;
+
+ protected String pendingUrl;
+ protected SwipeRefreshLayout swipe;//pull to refresh
+
+ @Override
+ protected int getLayoutResId() {
+ return R.layout.browser__fragment;
+ }
+
+
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ AppLog.d(this, "onViewCreated()");
+ super.onViewCreated(view, savedInstanceState);
+
+ if (this.appSettings == null) {
+ this.appSettings = ((App) getActivity().getApplication()).getSettings();
+ }
+
+ if (this.webView == null) {
+ this.webView = view.findViewById(R.id.webView);
+ getActivity().runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ BrowserFragment.this.applyWebViewSettings();
+ }
+ });
+
+ ProxyHandler.getInstance().addWebView(webView);
+ }
+
+ if (this.progressBar == null) {
+ this.progressBar = view.findViewById(R.id.progressBar);
+ }
+
+ if (pendingUrl != null) {
+ loadUrl(pendingUrl);
+ pendingUrl = null;
+ }
+
+ webView.setParentActivity(getActivity());
+
+ this.setRetainInstance(true);
+
+ //pull to refresh
+ swipe = view.findViewById(R.id.swipe);
+ swipe.setDistanceToTriggerSync(2000);
+ swipe.setOnRefreshListener(() -> reloadUrl());
+ if (appSettings.isSwipeRefreshEnabled()) {
+ swipe.setEnabled(true);
+ } else {
+ swipe.setRefreshing(false);
+ swipe.setEnabled(false);
+ return;
+ }
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+
+ if (getRetainInstance() && getView() != null && getView().getParent() instanceof ViewGroup) {
+ ((ViewGroup) getView().getParent()).removeView(getView());
+ }
+ }
+
+ private void applyWebViewSettings() {
+ this.webSettings = webView.getSettings();
+ webSettings.setAllowFileAccess(false);
+ webSettings.setUseWideViewPort(true);
+ webSettings.setLoadWithOverviewMode(true);
+ webSettings.setUserAgentString("Mozilla/5.0 (Linux; U; Android 4.4.4; Nexus 5 Build/KTU84P) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30");
+ webSettings.setDomStorageEnabled(true);
+ webSettings.setMinimumFontSize(appSettings.getMinimumFontSize());
+ webSettings.setLoadsImagesAutomatically(appSettings.isLoadImages());
+ webSettings.setAppCacheEnabled(true);
+
+ if (android.os.Build.VERSION.SDK_INT >= 21) {
+ WebView.enableSlowWholeDocumentDraw();
+ webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
+ }
+
+ this.registerForContextMenu(webView);
+ //webView.setParentActivity(this);
+ webView.setOverScrollMode(WebView.OVER_SCROLL_ALWAYS);
+
+ this.webViewClient = new CustomWebViewClient((App) getActivity().getApplication(), webView);
+ webView.setWebViewClient(webViewClient);
+ webView.setWebChromeClient(new ProgressBarWebChromeClient(webView, progressBar));
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ if (webView != null) {
+ webSettings.setMinimumFontSize(appSettings.getMinimumFontSize());
+ webSettings.setLoadsImagesAutomatically(appSettings.isLoadImages());
+ }
+ }
+
+ @Override
+ public String getFragmentTag() {
+ return TAG;
+ }
+
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ if (webView != null && webView.getContext() instanceof MutableContextWrapper) {
+ ((MutableContextWrapper) webView.getContext()).setBaseContext(context);
+ }
+ }
+
+ public boolean onBackPressed() {
+ if (webView.canGoBack()) {
+ getActivity().runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ webView.goBack();
+ }
+ });
+ return true;
+ }
+ return false;
+ }
+
+ public void loadUrl(final String url) {
+ if (getWebView() != null) {
+ AppLog.v(this, "loadUrl(): load " + url);
+ getActivity().runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ getWebView().loadUrlNew(url);
+ }
+ });
+
+ } else {
+ AppLog.v(this, "loadUrl(): WebView null: Set pending url to " + url);
+ pendingUrl = url;
+ }
+ }
+
+ public String getUrl() {
+ if (getWebView() != null) {
+ return getWebView().getUrl();
+ } else {
+ return pendingUrl;
+ }
+ }
+
+ public void reloadUrl() {
+ AppLog.v(this, "reloadUrl()");
+ if (getWebView() != null) {
+ getActivity().runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ getWebView().reload();
+ swipe.setRefreshing(false);//pull to refresh
+ }
+ });
+
+ }
+ }
+
+ public ContextMenuWebView getWebView() {
+ return this.webView;
+ }
+
+ @Override
+ protected void applyColorToViews() {
+ ThemeHelper.updateProgressBarColor(progressBar);
+ }
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/web/ContextMenuWebView.java b/app/src/main/java/com/github/dfa/diaspora_android/web/ContextMenuWebView.java
new file mode 100644
index 00000000..e1194c9e
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/web/ContextMenuWebView.java
@@ -0,0 +1,187 @@
+/*
+ This file is part of the dandelion*.
+
+ dandelion* is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ dandelion* is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the dandelion*.
+
+ If not, see .
+ */
+package com.github.dfa.diaspora_android.web;
+
+import android.app.Activity;
+import android.content.ClipData;
+import android.content.ClipboardManager;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.util.AttributeSet;
+import android.view.ContextMenu;
+import android.view.MenuItem;
+import android.widget.Toast;
+
+import com.github.dfa.diaspora_android.BuildConfig;
+import com.github.dfa.diaspora_android.R;
+import com.github.dfa.diaspora_android.util.AppSettings;
+
+import net.gsantner.opoc.util.DownloadTask;
+import net.gsantner.opoc.util.PermissionChecker;
+import net.gsantner.opoc.util.ShareUtil;
+
+import java.io.File;
+import java.util.Date;
+
+/**
+ * Subclass of WebView which adds a context menu for long clicks on images or links to share, save
+ * or open with another browser
+ */
+@SuppressWarnings("deprecation")
+public class ContextMenuWebView extends NestedWebView {
+
+ public static final int ID_SAVE_IMAGE = 10;
+ public static final int ID_IMAGE_EXTERNAL_BROWSER = 11;
+ public static final int ID_COPY_IMAGE_LINK = 15;
+ public static final int ID_COPY_LINK = 12;
+ public static final int ID_SHARE_LINK = 13;
+ public static final int ID_SHARE_IMAGE = 14;
+
+ private final Context context;
+ private Activity parentActivity;
+ private String lastLoadUrl = "";
+
+ public ContextMenuWebView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ this.context = context;
+ }
+
+ public ContextMenuWebView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ this.context = context;
+ }
+
+ @Override
+ protected void onCreateContextMenu(ContextMenu menu) {
+ super.onCreateContextMenu(menu);
+
+ HitTestResult result = getHitTestResult();
+
+ MenuItem.OnMenuItemClickListener handler = new MenuItem.OnMenuItemClickListener() {
+ public boolean onMenuItemClick(MenuItem item) {
+ HitTestResult result = getHitTestResult();
+ String url = result.getExtra();
+ final ShareUtil shu = new ShareUtil(context);
+ final PermissionChecker permc = new PermissionChecker(parentActivity);
+ final AppSettings appSettings = new AppSettings(context);
+
+ switch (item.getItemId()) {
+ //Save image to external memory
+ case ID_SAVE_IMAGE: {
+ if (permc.doIfExtStoragePermissionGranted(context.getString(R.string.image_permission_description__appspecific))) {
+ File fileSaveDirectory = appSettings.getAppSaveDirectory();
+ if (permc.mkdirIfStoragePermissionGranted(fileSaveDirectory)) {
+ String filename = "dandelion-" + ShareUtil.SDF_SHORT.format(new Date()) + url.substring(url.lastIndexOf("."));
+ /*Uri source = Uri.parse(url);
+ DownloadManager.Request request = new DownloadManager.Request(source);
+ request.setDestinationUri(Uri.fromFile(new File(fileSaveDirectory, filename)));
+ ((DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(request);*/
+ new DownloadTask(new File(fileSaveDirectory, filename), (ok, dlfile) -> {
+ if (ok) {
+ Toast.makeText(context, context.getText(R.string.saving_image_to) + " " + dlfile.getName(), Toast.LENGTH_LONG).show();
+ }
+ }).execute(url);
+ }
+ }
+ break;
+ }
+
+ case ID_SHARE_IMAGE: {
+ if (permc.doIfExtStoragePermissionGranted(context.getString(R.string.image_permission_description__appspecific))) {
+ File fileSaveDirectory = appSettings.getAppSaveDirectory();
+ if (permc.mkdirIfStoragePermissionGranted(fileSaveDirectory)) {
+ String filename = ".dandelion-shared" + url.substring(url.lastIndexOf("."));
+ new DownloadTask(new File(fileSaveDirectory, filename), (ok, dlfile) -> {
+ if (ok) {
+ Toast.makeText(context, context.getText(R.string.saving_image_to) + " " + dlfile.getName(), Toast.LENGTH_LONG).show();
+ shu.shareStream(dlfile, "image/" + dlfile.getAbsolutePath().lastIndexOf(".") + 1);
+ }
+ }).execute(url);
+ }
+ }
+ break;
+ }
+
+ case ID_IMAGE_EXTERNAL_BROWSER:
+ if (url != null) {
+ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
+ context.startActivity(intent);
+ }
+ break;
+
+ //Copy url to clipboard
+ case ID_COPY_IMAGE_LINK:
+ case ID_COPY_LINK:
+ if (url != null) {
+ ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
+ clipboard.setPrimaryClip(ClipData.newPlainText("text", url));
+ Toast.makeText(context, R.string.link_adress_copied, Toast.LENGTH_SHORT).show();
+ }
+ break;
+
+ //Try to share link to other apps
+ case ID_SHARE_LINK:
+ if (url != null) {
+ Intent sendIntent = new Intent();
+ sendIntent.setAction(Intent.ACTION_SEND);
+ sendIntent.putExtra(Intent.EXTRA_TEXT, url);
+ sendIntent.setType("text/plain");
+ context.startActivity(Intent.createChooser(sendIntent, getResources()
+ .getText(R.string.share_link_address)));
+ }
+ break;
+ }
+ return true;
+ }
+ };
+
+ //Build context menu
+ if (result.getType() == HitTestResult.IMAGE_TYPE ||
+ result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
+ // Menu options for an image.
+ menu.setHeaderTitle(result.getExtra());
+ menu.add(0, ID_SAVE_IMAGE, 0, context.getString(R.string.save_image)).setOnMenuItemClickListener(handler);
+ menu.add(0, ID_IMAGE_EXTERNAL_BROWSER, 0, context.getString(R.string.open_in_external_browser)).setOnMenuItemClickListener(handler);
+ menu.add(0, ID_SHARE_IMAGE, 0, context.getString(R.string.share_image)).setOnMenuItemClickListener(handler);
+ menu.add(0, ID_COPY_IMAGE_LINK, 0, context.getString(R.string.copy_image_address_to_clipboard)).setOnMenuItemClickListener(handler);
+ } else if (result.getType() == HitTestResult.ANCHOR_TYPE ||
+ result.getType() == HitTestResult.SRC_ANCHOR_TYPE) {
+ // Menu options for a hyperlink.
+ menu.setHeaderTitle(result.getExtra());
+ menu.add(0, ID_COPY_LINK, 0, context.getString(R.string.copy_link_adress_to_clipboard)).setOnMenuItemClickListener(handler);
+ menu.add(0, ID_SHARE_LINK, 0, context.getString(R.string.share_link_address)).setOnMenuItemClickListener(handler);
+ }
+ }
+
+ public void loadUrlNew(String url) {
+ stopLoading();
+ loadUrl(url);
+ }
+
+ @Override
+ public void loadUrl(String url) {
+ super.loadUrl(url);
+ WebHelper.sendUpdateTitleByUrlIntent(url, getContext());
+ }
+
+ public void setParentActivity(Activity activity) {
+ this.parentActivity = activity;
+ }
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/web/CustomWebViewClient.java b/app/src/main/java/com/github/dfa/diaspora_android/web/CustomWebViewClient.java
new file mode 100644
index 00000000..5e0011d8
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/web/CustomWebViewClient.java
@@ -0,0 +1,105 @@
+/*
+ This file is part of the dandelion*.
+
+ dandelion* is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ dandelion* is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the dandelion*.
+
+ If not, see .
+ */
+package com.github.dfa.diaspora_android.web;
+
+import android.annotation.TargetApi;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Build;
+import android.support.v4.content.LocalBroadcastManager;
+import android.webkit.CookieManager;
+import android.webkit.WebResourceResponse;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+
+import com.github.dfa.diaspora_android.App;
+import com.github.dfa.diaspora_android.activity.MainActivity;
+import com.github.dfa.diaspora_android.data.DiasporaPodList;
+import com.github.dfa.diaspora_android.util.AppSettings;
+
+import net.gsantner.opoc.util.AdBlock;
+
+public class CustomWebViewClient extends WebViewClient {
+ private final App app;
+ private String lastLoadUrl = "";
+ private boolean isAdBlockEnabled = false;
+ AppSettings appSettings = AppSettings.get();
+
+ public CustomWebViewClient(App app, WebView webView) {
+ this.app = app;
+ isAdBlockEnabled = AppSettings.get().isAdBlockEnabled();
+ }
+
+ //Open non-diaspora links in customtab/external browser
+ public boolean shouldOverrideUrlLoading(WebView view, String url) {
+ DiasporaPodList.DiasporaPod pod = AppSettings.get().getPod();
+ String host = null;
+ if (pod != null && pod.getPodUrl() != null && pod.getPodUrl().getHost() != null) {
+ host = pod.getPodUrl().getHost();
+ }
+
+ if (url.startsWith("https://dia.so/")
+ || (host != null && (url.startsWith("https://" + host)
+ || url.startsWith("http://" + host)))) {
+ return false;
+ }//make youtube links open external-->never customtab
+ else if (appSettings.isOpenYoutubeExternalEnabled() && (url.startsWith("https://youtube.com/") || url.startsWith("https://www.youtube.com/") || url.startsWith("https://m.youtube.com/") || url.startsWith("https://youtu.be/"))) {
+ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
+ view.getContext().startActivity(intent);
+ return true;
+ } else {
+ Intent i = new Intent(MainActivity.ACTION_OPEN_EXTERNAL_URL);
+ i.putExtra(MainActivity.EXTRA_URL, url);
+ LocalBroadcastManager.getInstance(app.getApplicationContext()).sendBroadcast(i);
+ return true;
+ }
+ }
+
+ public void onPageFinished(WebView view, String url) {
+ super.onPageFinished(view, url);
+
+ final CookieManager cookieManager = app.getCookieManager();
+ String cookies = cookieManager.getCookie(url);
+ DiasporaPodList.DiasporaPod pod = AppSettings.get().getPod();
+
+ if (cookies != null) {
+ cookieManager.setCookie(url, cookies);
+ if (pod != null && pod.getPodUrl() != null) {
+ cookieManager.setCookie(pod.getPodUrl().getBaseUrl(), cookies);
+ cookieManager.setCookie(".dia.so", "pod=" + pod.getPodUrl().getHost());
+ }
+ for (String c : cookies.split(";")) {
+ //AppLog.d(this, "Cookie: " + c.split("=")[0] + " Value:" + c.split("=")[1]);
+ }
+ //new ProfileFetchTask(app).execute();
+ }
+ }
+
+
+ @SuppressWarnings("deprecation")
+ @TargetApi(Build.VERSION_CODES.KITKAT_WATCH)
+ @Override
+ public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
+ if (isAdBlockEnabled && AdBlock.getInstance().isAdHost(url)) {
+ return AdBlock.createEmptyResponse();
+ }
+ return super.shouldInterceptRequest(view, url);
+ }
+
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/web/DiasporaStreamWebChromeClient.java b/app/src/main/java/com/github/dfa/diaspora_android/web/DiasporaStreamWebChromeClient.java
new file mode 100644
index 00000000..1dc21836
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/web/DiasporaStreamWebChromeClient.java
@@ -0,0 +1,82 @@
+/*
+ This file is part of the dandelion*.
+
+ dandelion* is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ dandelion* is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the dandelion*.
+
+ If not, see .
+ */
+package com.github.dfa.diaspora_android.web;
+
+import android.webkit.JsResult;
+import android.webkit.WebView;
+import android.widget.ProgressBar;
+
+import com.github.dfa.diaspora_android.R;
+import com.github.dfa.diaspora_android.ui.theme.ThemedAlertDialogBuilder;
+import com.github.dfa.diaspora_android.util.AppLog;
+import com.github.dfa.diaspora_android.util.AppSettings;
+
+/**
+ * WebChromeClient that handles sharing text to diaspora*
+ * Created by vanitas on 26.09.16.
+ */
+
+public class DiasporaStreamWebChromeClient extends FileUploadWebChromeClient {
+ protected SharedTextCallback sharedTextCallback;
+
+ public DiasporaStreamWebChromeClient(WebView webView, ProgressBar progressBar, FileUploadCallback fileUploadCallback, SharedTextCallback callback) {
+ super(webView, progressBar, fileUploadCallback);
+ this.sharedTextCallback = callback;
+ }
+
+ @Override
+ public void onProgressChanged(WebView wv, int progress) {
+ super.onProgressChanged(wv, progress);
+ WebHelper.optimizeMobileSiteLayout(wv);
+ WebHelper.sendUpdateTitleByUrlIntent(wv.getUrl(), wv.getContext());
+
+ if (progress > 0 && progress <= 85) {
+ WebHelper.getUserProfile(wv);
+ }
+
+ if (progress > 60) {
+ String textToBeShared = sharedTextCallback.getSharedText();
+ if (textToBeShared != null) {
+ AppLog.d(this, "Share text into webView");
+ WebHelper.shareTextIntoWebView(wv, textToBeShared);
+ }
+ }
+ }
+
+ @Override
+ public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
+ ThemedAlertDialogBuilder builder = new ThemedAlertDialogBuilder(view.getContext(), AppSettings.get());
+ builder.setTitle(view.getContext().getString(R.string.confirmation))
+ .setMessage(message)
+ .setPositiveButton(android.R.string.ok, (dialog, which) -> result.confirm())
+ .setNegativeButton(android.R.string.cancel, (dialog, which) -> result.cancel())
+ .setOnCancelListener(dialog -> {
+ result.cancel();
+ dialog.dismiss();
+ })
+ .create().show();
+ return true;
+ }
+
+ public interface SharedTextCallback {
+ String getSharedText();
+
+ void setSharedText(String shared);
+ }
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/web/FileUploadWebChromeClient.java b/app/src/main/java/com/github/dfa/diaspora_android/web/FileUploadWebChromeClient.java
new file mode 100644
index 00000000..8197d6ff
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/web/FileUploadWebChromeClient.java
@@ -0,0 +1,55 @@
+/*
+ This file is part of the dandelion*.
+
+ dandelion* is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ dandelion* is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the dandelion*.
+
+ If not, see .
+ */
+package com.github.dfa.diaspora_android.web;
+
+import android.net.Uri;
+import android.webkit.ValueCallback;
+import android.webkit.WebView;
+import android.widget.ProgressBar;
+
+/**
+ * WebChromeClient that allows uploading images
+ * Created by vanitas on 26.09.16.
+ */
+
+public class FileUploadWebChromeClient extends ProgressBarWebChromeClient {
+ protected FileUploadCallback fileUploadCallback;
+
+ public FileUploadWebChromeClient(WebView webView, ProgressBar progressBar, FileUploadCallback fileUploadCallback) {
+ super(webView, progressBar);
+ this.fileUploadCallback = fileUploadCallback;
+ }
+
+ //For Android 4.1/4.2 only. DO NOT REMOVE!
+ @SuppressWarnings("unused")
+ protected void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture) {
+ fileUploadCallback.legacyImageUpload(uploadMsg, acceptType, capture);
+ }
+
+ @Override
+ public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, FileChooserParams fileChooserParams) {
+ return fileUploadCallback.imageUpload(webView, filePathCallback, fileChooserParams);
+ }
+
+ public interface FileUploadCallback {
+ boolean imageUpload(WebView webView, ValueCallback filePathCallback, FileChooserParams fileChooserParams);
+
+ void legacyImageUpload(ValueCallback uploadMsg, String acceptType, String capture);
+ }
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/NestedWebView.java b/app/src/main/java/com/github/dfa/diaspora_android/web/NestedWebView.java
similarity index 97%
rename from app/src/main/java/com/github/dfa/diaspora_android/ui/NestedWebView.java
rename to app/src/main/java/com/github/dfa/diaspora_android/web/NestedWebView.java
index 4f59a339..2ee37f25 100644
--- a/app/src/main/java/com/github/dfa/diaspora_android/ui/NestedWebView.java
+++ b/app/src/main/java/com/github/dfa/diaspora_android/web/NestedWebView.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.github.dfa.diaspora_android.ui;
+package com.github.dfa.diaspora_android.web;
import android.content.Context;
import android.support.v4.view.MotionEventCompat;
@@ -89,6 +89,9 @@ public class NestedWebView extends WebView implements NestedScrollingChild {
stopNestedScroll();
break;
}
+ if (event != null) {
+ event.recycle();
+ }
return returnValue;
}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/web/ProgressBarWebChromeClient.java b/app/src/main/java/com/github/dfa/diaspora_android/web/ProgressBarWebChromeClient.java
new file mode 100644
index 00000000..f1f27931
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/web/ProgressBarWebChromeClient.java
@@ -0,0 +1,44 @@
+/*
+ This file is part of the dandelion*.
+
+ dandelion* is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ dandelion* is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the dandelion*.
+
+ If not, see .
+ */
+package com.github.dfa.diaspora_android.web;
+
+import android.view.View;
+import android.webkit.WebChromeClient;
+import android.webkit.WebView;
+import android.widget.ProgressBar;
+
+/**
+ * WebChromeClient that connects the ProgressBar and the WebView and updates the progress of the progressBar.
+ * Created by vanitas on 26.09.16.
+ */
+
+public class ProgressBarWebChromeClient extends WebChromeClient {
+ protected final ProgressBar progressBar;
+ protected final WebView webView;
+
+ public ProgressBarWebChromeClient(WebView webView, ProgressBar progressBar) {
+ this.webView = webView;
+ this.progressBar = progressBar;
+ }
+
+ public void onProgressChanged(WebView wv, int progress) {
+ progressBar.setProgress(progress);
+ progressBar.setVisibility(progress == 100 ? View.GONE : View.VISIBLE);
+ }
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/web/ProxyHandler.java b/app/src/main/java/com/github/dfa/diaspora_android/web/ProxyHandler.java
new file mode 100644
index 00000000..3b1f8d7b
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/web/ProxyHandler.java
@@ -0,0 +1,136 @@
+/*
+ This file is part of the dandelion*.
+
+ dandelion* is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ dandelion* is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the dandelion*.
+
+ If not, see .
+ */
+package com.github.dfa.diaspora_android.web;
+
+import android.content.Context;
+import android.os.StrictMode;
+import android.webkit.WebView;
+
+import com.github.dfa.diaspora_android.activity.MainActivity;
+import com.github.dfa.diaspora_android.util.AppLog;
+import com.github.dfa.diaspora_android.util.AppSettings;
+
+import java.util.ArrayList;
+
+import info.guardianproject.netcipher.NetCipher;
+import info.guardianproject.netcipher.webkit.WebkitProxy;
+
+/**
+ * Proxy Handler that applies proxy settings of the app to webviews etc.
+ * Created by vanitas on 10.10.16.
+ */
+
+public class ProxyHandler {
+ private static ProxyHandler instance;
+ private ArrayList webViews;
+
+
+ private ProxyHandler() {
+ /* Singleton, yo? */
+ this.webViews = new ArrayList<>();
+ }
+
+ public static ProxyHandler getInstance() {
+ if (instance == null) {
+ instance = new ProxyHandler();
+ }
+ return instance;
+ }
+
+ public void updateProxySettings(Context context) {
+ AppLog.d(this, "UpdateProxySettings()");
+ AppSettings appSettings = AppSettings.get();
+ StrictMode.ThreadPolicy old = StrictMode.getThreadPolicy();
+ StrictMode.ThreadPolicy tmp = new StrictMode.ThreadPolicy.Builder().permitAll().build();
+ StrictMode.setThreadPolicy(tmp);
+ if (appSettings.isProxyHttpEnabled()) {
+ //Update NetCipher
+ NetCipher.setProxy(appSettings.getProxyHttpHost(), appSettings.getProxyHttpPort());
+ //Update webviews
+ for (WebView wv : webViews) {
+ if (wv != null) {
+ try {
+ WebkitProxy.setProxy(MainActivity.class.getName(), context.getApplicationContext(), wv, appSettings.getProxyHttpHost(), appSettings.getProxyHttpPort());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ StrictMode.setThreadPolicy(old);
+ }
+
+ public void addWebView(WebView wv) {
+ AppLog.d(this, "AddWebView");
+ if (wv != null && !webViews.contains(wv)) {
+ webViews.add(wv);
+ updateWebViewProxySettings(wv, wv.getContext());
+ }
+ }
+
+ private void updateWebViewProxySettings(WebView wv, Context context) {
+ AppLog.d(this, "UpdateWebViewProxySettings()");
+ AppSettings appSettings = AppSettings.get();
+ StrictMode.ThreadPolicy old = StrictMode.getThreadPolicy();
+ StrictMode.ThreadPolicy tmp = new StrictMode.ThreadPolicy.Builder().permitAll().build();
+ StrictMode.setThreadPolicy(tmp);
+ if (appSettings.isProxyHttpEnabled()) {
+ if (wv != null) {
+ try {
+ WebkitProxy.setProxy(MainActivity.class.getName(), context.getApplicationContext(), wv, appSettings.getProxyHttpHost(), appSettings.getProxyHttpPort());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ StrictMode.setThreadPolicy(old);
+ }
+
+ public static class ProxySettings {
+ private final boolean enabled;
+ private final String host;
+ private final int port;
+
+ public ProxySettings(boolean enabled, String host, int port) {
+ this.enabled = enabled;
+ this.host = host;
+ this.port = port;
+ }
+
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ public String getHost() {
+ return host;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ return (other instanceof ProxySettings) &&
+ enabled == ((ProxySettings) other).isEnabled() &&
+ host.equals(((ProxySettings) other).getHost()) &&
+ port == ((ProxySettings) other).getPort();
+ }
+ }
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/util/WebHelper.java b/app/src/main/java/com/github/dfa/diaspora_android/web/WebHelper.java
similarity index 60%
rename from app/src/main/java/com/github/dfa/diaspora_android/util/WebHelper.java
rename to app/src/main/java/com/github/dfa/diaspora_android/web/WebHelper.java
index 691481be..49d10340 100644
--- a/app/src/main/java/com/github/dfa/diaspora_android/util/WebHelper.java
+++ b/app/src/main/java/com/github/dfa/diaspora_android/web/WebHelper.java
@@ -1,42 +1,37 @@
/*
- This file is part of the Diaspora for Android.
+ This file is part of the dandelion*.
- Diaspora for Android is free software: you can redistribute it and/or modify
+ dandelion* is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
- Diaspora for Android is distributed in the hope that it will be useful,
+ dandelion* is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with the Diaspora for Android.
+ along with the dandelion*.
If not, see .
*/
-
-package com.github.dfa.diaspora_android.util;
+
+package com.github.dfa.diaspora_android.web;
import android.content.Context;
+import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
+import android.support.v4.content.LocalBroadcastManager;
import android.text.Html;
import android.webkit.URLUtil;
import android.webkit.WebView;
-import com.github.dfa.diaspora_android.App;
-import com.github.dfa.diaspora_android.R;
-import com.github.dfa.diaspora_android.data.AppSettings;
-import com.github.dfa.diaspora_android.data.PodAspect;
-import com.github.dfa.diaspora_android.data.PodUserProfile;
-
-import java.util.Locale;
+import com.github.dfa.diaspora_android.activity.MainActivity;
/**
* Created by Gregor Santner on 07.08.16.
- * https://gsantner.github.io
*/
public class WebHelper {
@@ -46,14 +41,14 @@ public class WebHelper {
return ni != null && ni.isConnectedOrConnecting();
}
- public static String replaceUrlWithMarkdown(String url){
- if( url != null && URLUtil.isHttpUrl(url) || URLUtil.isHttpsUrl(url)){
+ public static String replaceUrlWithMarkdown(String url) {
+ if (url != null && URLUtil.isHttpUrl(url) || URLUtil.isHttpsUrl(url)) {
return "<" + url + ">";
}
return url;
}
- public static String escapeHtmlText(String text){
+ public static String escapeHtmlText(String text) {
text = Html.escapeHtml(text);
text = text.replace("\n", "
");
return text;
@@ -62,7 +57,7 @@ public class WebHelper {
public static void optimizeMobileSiteLayout(final WebView wv) {
wv.loadUrl("javascript: ( function() {" +
" if (document.documentElement == null || document.documentElement.style == null) { return; }" +
- " document.documentElement.style.paddingBottom = '260px';" +
+ " document.documentElement.style.paddingBottom = '50px';" +
" document.getElementById('main').style.paddingTop = '5px';" +
" if(document.getElementById('main_nav')) {" +
" document.getElementById('main_nav').parentNode.removeChild(" +
@@ -84,7 +79,7 @@ public class WebHelper {
" var links = followed_tags.nextElementSibling.children[0].children;" +
" var tags = [];" +
" for(var i = 0; i < links.length - 1; i++) {" + // the last element is "Manage followed tags" link
- " tags.push(links[i].innerText.substring(1));" +
+ " tags.push(links[i].innerText.replace('#',''));" +
" }" +
" gon.user[\"android_app.followed_tags\"] = tags;" +
" } catch(e) {}" +
@@ -95,7 +90,7 @@ public class WebHelper {
"})();");
}
- public static void shareTextIntoWebView(final WebView webView, String sharedText){
+ public static void shareTextIntoWebView(final WebView webView, String sharedText) {
sharedText = sharedText.replace("'", "'").replace("\"", """);
webView.loadUrl("javascript:(function() { " +
" document.documentElement.style.paddingBottom = '500px';" +
@@ -111,50 +106,20 @@ public class WebHelper {
"})();");
}
- public static void showAspectList(final WebView wv, final App app) {
- wv.stopLoading();
- PodUserProfile profile = app.getPodUserProfile();
- StringBuilder sb = new StringBuilder();
+ private static String lastUpdateTitleByUrl = "";
- sb.append("");
-
- // Content
- for (PodAspect aspect : profile.getAspects()) {
- sb.append("» ");
- sb.append(aspect.toHtmlLink(app));
- sb.append("");
+ public static synchronized void sendUpdateTitleByUrlIntent(String url, Context context) {
+ // Ignore javascript stuff
+ if (url != null && url.startsWith("javascript:")) {
+ return;
}
- // End
- sb.append("");
- wv.loadDataWithBaseURL(null, sb.toString(), "text/html", "UTF-16", null);
- }
-
- public static void showFollowedTagsList(final WebView wv, final App app) {
- wv.stopLoading();
- PodUserProfile profile = app.getPodUserProfile();
- StringBuilder sb = new StringBuilder();
-
- sb.append("");
-
- // Content
- AppSettings appSettings = app.getSettings();
- sb.append("» ");
- sb.append(String.format(Locale.getDefault(),
- "%s",
- appSettings.getPodDomain(), app.getString(R.string.all_tags)));
- sb.append("");
- for (String tag: profile.getFollowedTags()) {
- sb.append("» ");
- sb.append(String.format(Locale.getDefault(),
- "#%s",
- appSettings.getPodDomain(), tag, tag));
- sb.append("");
+ // Don't spam intents
+ if (lastUpdateTitleByUrl != null && !lastUpdateTitleByUrl.equals(url) && url != null) {
+ Intent updateActivityTitleIntent = new Intent(MainActivity.ACTION_UPDATE_TITLE_FROM_URL);
+ updateActivityTitleIntent.putExtra(MainActivity.EXTRA_URL, url);
+ LocalBroadcastManager.getInstance(context).sendBroadcast(updateActivityTitleIntent);
}
-
- // End
- sb.append("");
- wv.loadDataWithBaseURL(null, sb.toString(), "text/html", "UTF-16", null);
+ lastUpdateTitleByUrl = url;
}
-
}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/web/custom_tab/BrowserFallback.java b/app/src/main/java/com/github/dfa/diaspora_android/web/custom_tab/BrowserFallback.java
new file mode 100644
index 00000000..af10c11a
--- /dev/null
+++ b/app/src/main/java/com/github/dfa/diaspora_android/web/custom_tab/BrowserFallback.java
@@ -0,0 +1,36 @@
+/*
+ This file is part of the dandelion*.
+
+ dandelion* is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ dandelion* is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the dandelion*.
+
+ If not, see .
+ */
+package com.github.dfa.diaspora_android.web.custom_tab;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.net.Uri;
+
+/**
+ * Adapted from https://medium.com/ribot-labs/exploring-chrome-customs-tabs-on-android-ef427effe2f4
+ */
+
+public class BrowserFallback implements CustomTabActivityHelper.CustomTabFallback {
+ @Override
+ public void openUri(Activity activity, Uri uri) {
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setData(uri);
+ activity.startActivity(intent);
+ }
+}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/util/CustomTabHelpers/CustomTabActivityHelper.java b/app/src/main/java/com/github/dfa/diaspora_android/web/custom_tab/CustomTabActivityHelper.java
similarity index 79%
rename from app/src/main/java/com/github/dfa/diaspora_android/util/CustomTabHelpers/CustomTabActivityHelper.java
rename to app/src/main/java/com/github/dfa/diaspora_android/web/custom_tab/CustomTabActivityHelper.java
index 9e14c748..fce06062 100644
--- a/app/src/main/java/com/github/dfa/diaspora_android/util/CustomTabHelpers/CustomTabActivityHelper.java
+++ b/app/src/main/java/com/github/dfa/diaspora_android/web/custom_tab/CustomTabActivityHelper.java
@@ -1,4 +1,22 @@
-package com.github.dfa.diaspora_android.util.CustomTabHelpers;
+/*
+ This file is part of the dandelion*.
+
+ dandelion* is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ dandelion* is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the dandelion*.
+
+ If not, see .
+ */
+package com.github.dfa.diaspora_android.web.custom_tab;
import android.app.Activity;
import android.content.ComponentName;
@@ -8,7 +26,6 @@ import android.support.customtabs.CustomTabsClient;
import android.support.customtabs.CustomTabsIntent;
import android.support.customtabs.CustomTabsServiceConnection;
import android.support.customtabs.CustomTabsSession;
-import android.util.Log;
import java.util.List;
@@ -25,10 +42,10 @@ public class CustomTabActivityHelper {
/**
* Opens the URL on a Custom Tab if possible. Otherwise fallsback to opening it on a WebView
*
- * @param activity The host activity
+ * @param activity The host activity
* @param customTabsIntent a CustomTabsIntent to be used if Custom Tabs is available
- * @param uri the Uri to be opened
- * @param fallback a CustomTabFallback to be used if Custom Tabs is not available
+ * @param uri the Uri to be opened
+ * @param fallback a CustomTabFallback to be used if Custom Tabs is not available
*/
public static void openCustomTab(Activity activity,
CustomTabsIntent customTabsIntent,
@@ -37,7 +54,7 @@ public class CustomTabActivityHelper {
String packageName = CustomTabsHelper.getPackageNameToUse(activity);
//If we cant find a package name, it means there's no browser that supports
- //Chrome Custom Tabs installed. So, we fallback to the webview
+ //Chrome Custom Tabs installed. So, we fallback to the ui__webview
if (packageName == null) {
if (fallback != null) {
fallback.openUri(activity, uri);
@@ -50,6 +67,7 @@ public class CustomTabActivityHelper {
/**
* Unbinds the Activity from the Custom Tabs Service
+ *
* @param activity the activity that is connected to the service
*/
public void unbindCustomTabsService(Activity activity) {
@@ -75,7 +93,8 @@ public class CustomTabActivityHelper {
/**
* Register a Callback to be called when connected or disconnected from the Custom Tabs Service
- * @param connectionCallback
+ *
+ * @param connectionCallback callback
*/
public void setConnectionCallback(ConnectionCallback connectionCallback) {
this.mConnectionCallback = connectionCallback;
@@ -83,6 +102,7 @@ public class CustomTabActivityHelper {
/**
* Binds the Activity to the Custom Tabs Service
+ *
* @param activity the activity to be binded to the service
*/
public void bindCustomTabsService(Activity activity) {
@@ -118,6 +138,10 @@ public class CustomTabActivityHelper {
return session.mayLaunchUrl(uri, extras, otherLikelyBundles);
}
+ public boolean warmup(int flags) {
+ return mClient.warmup(flags);
+ }
+
/**
* A Callback for when the service is connected or disconnected. Use those callbacks to
* handle UI changes when the service is connected or disconnected
@@ -139,9 +163,8 @@ public class CustomTabActivityHelper {
*/
public interface CustomTabFallback {
/**
- *
* @param activity The Activity that wants to open the Uri
- * @param uri The uri to be opened by the fallback
+ * @param uri The uri to be opened by the fallback
*/
void openUri(Activity activity, Uri uri);
}
diff --git a/app/src/main/java/com/github/dfa/diaspora_android/util/CustomTabHelpers/CustomTabsHelper.java b/app/src/main/java/com/github/dfa/diaspora_android/web/custom_tab/CustomTabsHelper.java
similarity index 78%
rename from app/src/main/java/com/github/dfa/diaspora_android/util/CustomTabHelpers/CustomTabsHelper.java
rename to app/src/main/java/com/github/dfa/diaspora_android/web/custom_tab/CustomTabsHelper.java
index 6ab577af..aaa89f06 100644
--- a/app/src/main/java/com/github/dfa/diaspora_android/util/CustomTabHelpers/CustomTabsHelper.java
+++ b/app/src/main/java/com/github/dfa/diaspora_android/web/custom_tab/CustomTabsHelper.java
@@ -1,4 +1,22 @@
-package com.github.dfa.diaspora_android.util.CustomTabHelpers;
+/*
+ This file is part of the dandelion*.
+
+ dandelion* is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ dandelion* is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the dandelion*.
+
+ If not, see .
+ */
+package com.github.dfa.diaspora_android.web.custom_tab;
import android.content.Context;
import android.content.Intent;
@@ -8,7 +26,6 @@ import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.support.customtabs.CustomTabsService;
import android.text.TextUtils;
-import android.util.Log;
import com.github.dfa.diaspora_android.util.AppLog;
@@ -24,18 +41,22 @@ public class CustomTabsHelper {
static final String BETA_PACKAGE = "com.chrome.beta";
static final String DEV_PACKAGE = "com.chrome.dev";
static final String LOCAL_PACKAGE = "com.google.android.apps.chrome";
+ static final String CHROMIUM = "org.chromium.chrome";
+ static final String FENNEC = "org.mozilla.fennec_fdroid";
+ static final String KLAR = "org.mozilla.klar";
private static final String EXTRA_CUSTOM_TABS_KEEP_ALIVE =
"android.support.customtabs.extra.KEEP_ALIVE";
private static String sPackageNameToUse;
- private CustomTabsHelper() {}
+ private CustomTabsHelper() {
+ }
/**
* Goes through all apps that handle VIEW intents and have a warmup service. Picks
* the one chosen by the user if there is one, otherwise makes a best effort to return a
* valid package name.
- *
+ *
* This is not threadsafe.
*
* @param context {@link Context} to use for accessing {@link PackageManager}.
@@ -83,12 +104,19 @@ public class CustomTabsHelper {
sPackageNameToUse = DEV_PACKAGE;
} else if (packagesSupportingCustomTabs.contains(LOCAL_PACKAGE)) {
sPackageNameToUse = LOCAL_PACKAGE;
+ } else if (packagesSupportingCustomTabs.contains(CHROMIUM)) {
+ sPackageNameToUse = CHROMIUM;
+ } else if (packagesSupportingCustomTabs.contains(FENNEC)) {
+ sPackageNameToUse = FENNEC;
+ } else if (packagesSupportingCustomTabs.contains(KLAR)) {
+ sPackageNameToUse = KLAR;
}
return sPackageNameToUse;
}
/**
* Used to check whether there is a specialized handler for a given intent.
+ *
* @param intent The intent to check with.
* @return Whether there is a specialized handler for the given intent.
*/
@@ -109,7 +137,7 @@ public class CustomTabsHelper {
return true;
}
} catch (RuntimeException e) {
- AppLog.e(TAG, "Runtime exception while getting specialized handlers");
+ AppLog.e(TAG, "Runtime exception while getting specialized handlers");
}
return false;
}
@@ -118,6 +146,6 @@ public class CustomTabsHelper {
* @return All possible chrome package names that provide custom tabs feature.
*/
public static String[] getPackages() {
- return new String[]{"", STABLE_PACKAGE, BETA_PACKAGE, DEV_PACKAGE, LOCAL_PACKAGE};
+ return new String[]{"", STABLE_PACKAGE, BETA_PACKAGE, DEV_PACKAGE, LOCAL_PACKAGE, CHROMIUM, FENNEC, KLAR};
}
}
diff --git a/app/src/main/java/net/gsantner/opoc/activity/GsFragmentBase.java b/app/src/main/java/net/gsantner/opoc/activity/GsFragmentBase.java
new file mode 100644
index 00000000..479551d9
--- /dev/null
+++ b/app/src/main/java/net/gsantner/opoc/activity/GsFragmentBase.java
@@ -0,0 +1,160 @@
+/*#######################################################
+ *
+ * Maintained 2017-2023 by Gregor Santner
+ *
+ * License: Apache 2.0
+ * https://github.com/gsantner/opoc/#licensing
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+#########################################################*/
+package net.gsantner.opoc.activity;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.support.annotation.LayoutRes;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.support.v7.widget.Toolbar;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import net.gsantner.opoc.android.dummy.MenuItemDummy;
+import net.gsantner.opoc.util.ContextUtils;
+
+import butterknife.ButterKnife;
+
+/**
+ * A common base fragment to extend from
+ */
+public abstract class GsFragmentBase extends Fragment {
+ private boolean _fragmentFirstTimeVisible = true;
+ private final Object _fragmentFirstTimeVisibleSync = new Object();
+
+ protected ContextUtils _cu;
+ protected Bundle _savedInstanceState = null;
+ protected Menu _fragmentMenu = new MenuItemDummy.Menu();
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setHasOptionsMenu(true);
+ }
+
+ /**
+ * Inflate the fragments layout. Don't override this method, just supply the needed
+ * {@link LayoutRes} via abstract method {@link #getLayoutResId()}, super does the rest
+ */
+ @Deprecated
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ _cu = new ContextUtils(inflater.getContext());
+ _cu.setAppLanguage(getAppLanguage());
+ _savedInstanceState = savedInstanceState;
+ if (getLayoutResId() == 0) {
+ Log.e(getClass().getCanonicalName(), "Error: GsFragmentbase.onCreateview: Returned 0 for getLayoutResId");
+ }
+ View view = inflater.inflate(getLayoutResId(), container, false);
+ ButterKnife.bind(this, view);
+ return view;
+ }
+
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ view.postDelayed(() -> {
+ synchronized (_fragmentFirstTimeVisibleSync) {
+ if (getUserVisibleHint() && isVisible() && _fragmentFirstTimeVisible) {
+ _fragmentFirstTimeVisible = false;
+ onFragmentFirstTimeVisible();
+ }
+ }
+ }, 1);
+ }
+
+ /**
+ * Get a tag from the fragment, allows faster distinction
+ *
+ * @return This fragments tag
+ */
+ public abstract String getFragmentTag();
+
+
+ /**
+ * Get the layout to be inflated in the fragment
+ *
+ * @return Layout resource id
+ */
+ @LayoutRes
+ protected abstract int getLayoutResId();
+
+ /**
+ * Event to be called when the back button was pressed
+ * True should be returned when this was handled by the fragment
+ * and no further handling in the view hierarchy is needed
+ *
+ * @return True if back handled by fragment
+ */
+ public boolean onBackPressed() {
+ return false;
+ }
+
+ /**
+ * Set the language to be used in this fragment
+ * Defaults to resolve the language from sharedpreferences: pref_key__language
+ *
+ * @return Empty string for system language, or an android locale code
+ */
+ public String getAppLanguage() {
+ if (getContext() != null) {
+ return getContext().getSharedPreferences("app", Context.MODE_PRIVATE)
+ .getString("pref_key__language", "");
+ }
+ return "";
+ }
+
+ /**
+ * This will be called when this fragment gets the first time visible
+ */
+ public void onFragmentFirstTimeVisible() {
+ }
+
+ @Override
+ public void setUserVisibleHint(boolean isVisibleToUser) {
+ super.setUserVisibleHint(isVisibleToUser);
+ synchronized (_fragmentFirstTimeVisibleSync) {
+ if (isVisibleToUser && _fragmentFirstTimeVisible) {
+ _fragmentFirstTimeVisible = false;
+ onFragmentFirstTimeVisible();
+ }
+ }
+ }
+
+ @Override
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ super.onCreateOptionsMenu(menu, inflater);
+ _fragmentMenu = menu;
+ }
+
+ public Menu getFragmentMenu() {
+ return _fragmentMenu;
+ }
+
+ /**
+ * Get the toolbar from activity
+ * Requires id to be set to @+id/toolbar
+ */
+ @SuppressWarnings("ConstantConditions")
+ protected Toolbar getToolbar() {
+ try {
+ return (Toolbar) getActivity().findViewById(new ContextUtils(getActivity()).getResId(ContextUtils.ResType.ID, "toolbar"));
+ } catch (Exception e) {
+ return null;
+ }
+ }
+}
diff --git a/app/src/main/java/net/gsantner/opoc/android/dummy/MenuItemDummy.java b/app/src/main/java/net/gsantner/opoc/android/dummy/MenuItemDummy.java
new file mode 100644
index 00000000..5d3b5f97
--- /dev/null
+++ b/app/src/main/java/net/gsantner/opoc/android/dummy/MenuItemDummy.java
@@ -0,0 +1,351 @@
+/*
+ * Maintained 2017-2023 by Gregor Santner
+ * 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) {
+ }
+ }
+}
diff --git a/app/src/main/java/net/gsantner/opoc/android/dummy/TextWatcherDummy.java b/app/src/main/java/net/gsantner/opoc/android/dummy/TextWatcherDummy.java
new file mode 100644
index 00000000..e6a5ea94
--- /dev/null
+++ b/app/src/main/java/net/gsantner/opoc/android/dummy/TextWatcherDummy.java
@@ -0,0 +1,58 @@
+/*
+ * Maintained 2017-2023 by Gregor Santner
+ * 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 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 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 impl) {
+ return new TextWatcherDummy() {
+ public void afterTextChanged(final Editable s) {
+ impl.callback(s);
+ }
+ };
+ }
+}
diff --git a/app/src/main/java/net/gsantner/opoc/format/markdown/SimpleMarkdownParser.java b/app/src/main/java/net/gsantner/opoc/format/markdown/SimpleMarkdownParser.java
new file mode 100644
index 00000000..ea117a8a
--- /dev/null
+++ b/app/src/main/java/net/gsantner/opoc/format/markdown/SimpleMarkdownParser.java
@@ -0,0 +1,248 @@
+/*#######################################################
+ *
+ * Maintained 2018-2023 by Gregor Santner
+ *
+ * License: Apache 2.0
+ * https://github.com/gsantner/opoc/#licensing
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+#########################################################*/
+
+/*
+ * Parses most common markdown tags. Only inline tags are supported, multiline/block syntax
+ * is not supported (citation, multiline code, ..). This is intended to stay as easy as possible.
+ *
+ * You can e.g. apply a accent color by replacing #000001 with your accentColor string.
+ *
+ * FILTER_ANDROID_TEXTVIEW output is intended to be used at simple Android TextViews,
+ * were a limited set of _html tags is supported. This allow to still display e.g. a simple
+ * CHANGELOG.md file without including a WebView for showing HTML, or other additional UI-libraries.
+ *
+ * FILTER_WEB is intended to be used at engines understanding most common HTML tags.
+ */
+
+package net.gsantner.opoc.format.markdown;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+/**
+ * Simple Markdown Parser
+ */
+@SuppressWarnings({"WeakerAccess", "CaughtExceptionImmediatelyRethrown", "SameParameterValue", "unused", "SpellCheckingInspection", "RepeatedSpace", "SingleCharAlternation", "Convert2Lambda"})
+public class SimpleMarkdownParser {
+ //########################
+ //## Statics
+ //########################
+ public interface SmpFilter {
+ String filter(String text);
+ }
+
+ public final static SmpFilter FILTER_ANDROID_TEXTVIEW = new SmpFilter() {
+ @Override
+ public String filter(String text) {
+ // TextView supports a limited set of html tags, most notably
+ // a href, b, big, font size&color, i, li, small, u
+
+ // Don't start new line if 2 empty lines and heading
+ while (text.contains("\n\n#")) {
+ text = text.replace("\n\n#", "\n#");
+ }
+
+ return text
+ .replaceAll("(?s)", "") // HTML comments
+ .replace("\n\n", "\n \n") // Start new line if 2 empty lines
+ .replace("~°", " ") // double space/half tab
+ .replaceAll("(?m)^### (.*)$", " $1 ") // h3
+ .replaceAll("(?m)^## (.*)$", " $1
diff --git a/app/src/main/res/layout/about__fragment_license.xml b/app/src/main/res/layout/about__fragment_license.xml
new file mode 100644
index 00000000..c93dad72
--- /dev/null
+++ b/app/src/main/res/layout/about__fragment_license.xml
@@ -0,0 +1,214 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/browser__fragment.xml b/app/src/main/res/layout/browser__fragment.xml
new file mode 100644
index 00000000..9f534a0a
--- /dev/null
+++ b/app/src/main/res/layout/browser__fragment.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_about.xml b/app/src/main/res/layout/fragment_about.xml
deleted file mode 100644
index 579b1a2e..00000000
--- a/app/src/main/res/layout/fragment_about.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/fragment_license.xml b/app/src/main/res/layout/fragment_license.xml
deleted file mode 100644
index 12b319c0..00000000
--- a/app/src/main/res/layout/fragment_license.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/main__activity.xml b/app/src/main/res/layout/main__activity.xml
index a546cd6d..eeaeebec 100644
--- a/app/src/main/res/layout/main__activity.xml
+++ b/app/src/main/res/layout/main__activity.xml
@@ -2,7 +2,7 @@
+ app:itemTextColor="@color/primary_text"
+ app:menu="@menu/main__navdrawer"
+ app:paddingEnd="0dp"
+ app:paddingStart="0dp" />
diff --git a/app/src/main/res/layout/main__app_bar.xml b/app/src/main/res/layout/main__app_bar.xml
index b5be6807..4d42fe9f 100644
--- a/app/src/main/res/layout/main__app_bar.xml
+++ b/app/src/main/res/layout/main__app_bar.xml
@@ -1,45 +1,32 @@
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context="com.github.dfa.diaspora_android.activity.MainActivity">
+ app:popupTheme="@style/AppTheme.PopupOverlay" />
-
+
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/main__content.xml b/app/src/main/res/layout/main__content.xml
deleted file mode 100644
index 6794e928..00000000
--- a/app/src/main/res/layout/main__content.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/main__nav_header.xml b/app/src/main/res/layout/main__nav_header.xml
index 146f8703..b19e40fd 100644
--- a/app/src/main/res/layout/main__nav_header.xml
+++ b/app/src/main/res/layout/main__nav_header.xml
@@ -1,19 +1,21 @@
+ android:theme="@style/ThemeOverlay.AppCompat.Dark"
+ tools:background="@color/primary">
-
+
+ android:src="@drawable/ic_launcher"
+ tools:ignore="ContentDescription" />
+ android:textSize="16sp"
+ android:textStyle="bold" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/podselection__dialog.xml b/app/src/main/res/layout/podselection__dialog.xml
new file mode 100644
index 00000000..34e0b291
--- /dev/null
+++ b/app/src/main/res/layout/podselection__dialog.xml
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/podselection__fragment.xml b/app/src/main/res/layout/podselection__fragment.xml
new file mode 100644
index 00000000..862beee0
--- /dev/null
+++ b/app/src/main/res/layout/podselection__fragment.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/recycler_list__fragment.xml b/app/src/main/res/layout/recycler_list__fragment.xml
new file mode 100644
index 00000000..7db300f6
--- /dev/null
+++ b/app/src/main/res/layout/recycler_list__fragment.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/recycler_list__list_item_with_fav.xml b/app/src/main/res/layout/recycler_list__list_item_with_fav.xml
new file mode 100644
index 00000000..e72fdbdf
--- /dev/null
+++ b/app/src/main/res/layout/recycler_list__list_item_with_fav.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/settings__activity.xml b/app/src/main/res/layout/settings__activity.xml
new file mode 100644
index 00000000..129bb787
--- /dev/null
+++ b/app/src/main/res/layout/settings__activity.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/splash__activity.xml b/app/src/main/res/layout/splash__activity.xml
deleted file mode 100644
index 5f65f563..00000000
--- a/app/src/main/res/layout/splash__activity.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/ui__dialog__color_picker.xml b/app/src/main/res/layout/ui__dialog__color_picker.xml
new file mode 100644
index 00000000..26223ed4
--- /dev/null
+++ b/app/src/main/res/layout/ui__dialog__color_picker.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_search__people_tags.xml b/app/src/main/res/layout/ui__dialog_search__people_tags.xml
similarity index 52%
rename from app/src/main/res/layout/dialog_search__people_tags.xml
rename to app/src/main/res/layout/ui__dialog_search__people_tags.xml
index 3270b387..1d377662 100644
--- a/app/src/main/res/layout/dialog_search__people_tags.xml
+++ b/app/src/main/res/layout/ui__dialog_search__people_tags.xml
@@ -1,14 +1,16 @@
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center_horizontal"
+ android:orientation="vertical"
+ android:paddingEnd="@dimen/activity_horizontal_margin_half"
+ android:paddingStart="@dimen/activity_horizontal_margin_half">
+ android:hint="@string/dandelion"
+ android:maxLines="1" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/webview.xml b/app/src/main/res/layout/webview.xml
deleted file mode 100644
index 35d12bc4..00000000
--- a/app/src/main/res/layout/webview.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/menu/main__menu_bottom.xml b/app/src/main/res/menu/main__menu_bottom.xml
deleted file mode 100644
index 002a2a29..00000000
--- a/app/src/main/res/menu/main__menu_bottom.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-
diff --git a/app/src/main/res/menu/main__menu_top.xml b/app/src/main/res/menu/main__menu_top.xml
index d6c873b7..8929b0a9 100644
--- a/app/src/main/res/menu/main__menu_top.xml
+++ b/app/src/main/res/menu/main__menu_top.xml
@@ -1,13 +1,8 @@
-
-
+ tools:context="com.github.dfa.diaspora_android.activity.MainActivity"
+ tools:ignore="AlwaysShowAction">
+ android:id="@+id/action_notifications"
+ android:icon="@drawable/ic_notifications_white_48px__layer"
+ android:title="@string/notifications"
+ app:showAsAction="always" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/menu/main__navdrawer.xml b/app/src/main/res/menu/main__navdrawer.xml
index 25a2f7a9..8c8eebd2 100644
--- a/app/src/main/res/menu/main__navdrawer.xml
+++ b/app/src/main/res/menu/main__navdrawer.xml
@@ -1,7 +1,9 @@
-
+
+ android:title="@string/tags" />
+
+
+ android:title="@string/public_activities" />
+
+
+
+
+
+
+ android:title="@string/exit_app"
+ android:visible="false" />
-
-
-
+
+
-
-
-
+
+
+
+
diff --git a/app/src/main/res/menu/pods__menu.xml b/app/src/main/res/menu/pods__menu.xml
deleted file mode 100644
index 1c33e1c9..00000000
--- a/app/src/main/res/menu/pods__menu.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
diff --git a/app/src/main/res/menu/podselection__menu.xml b/app/src/main/res/menu/podselection__menu.xml
new file mode 100644
index 00000000..85958624
--- /dev/null
+++ b/app/src/main/res/menu/podselection__menu.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/menu/stream__menu_top.xml b/app/src/main/res/menu/stream__menu_top.xml
new file mode 100644
index 00000000..8638c533
--- /dev/null
+++ b/app/src/main/res/menu/stream__menu_top.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/raw/adblock_domains__yoyo.txt b/app/src/main/res/raw/adblock_domains__yoyo.txt
new file mode 100644
index 00000000..cecbc9ca
--- /dev/null
+++ b/app/src/main/res/raw/adblock_domains__yoyo.txt
@@ -0,0 +1,2343 @@
+# From https://pgl.yoyo.org/as/
+101com.com
+101order.com
+123found.com
+180hits.de
+180searchassistant.com
+207.net
+247media.com
+24log.com
+24log.de
+24pm-affiliation.com
+2mdn.net
+2o7.net
+360yield.com
+4affiliate.net
+4d5.net
+50websads.com
+518ad.com
+51yes.com
+600z.com
+777partner.com
+77tracking.com
+7bpeople.com
+7search.com
+99count.com
+a-ads.com
+a-counter.kiev.ua
+a.0day.kiev.ua
+a.aproductmsg.com
+a.collective-media.net
+a.consumer.net
+a.mktw.net
+a.sakh.com
+a.ucoz.net
+a.ucoz.ru
+a.xanga.com
+a32.g.a.yimg.com
+aaddzz.com
+abacho.net
+abc-ads.com
+absoluteclickscom.com
+abz.com
+ac.rnm.ca
+accounts.pkr.com.invalid
+acsseo.com
+actionsplash.com
+actualdeals.com
+acuityads.com
+ad-balancer.at
+ad-balancer.net
+ad-center.com
+ad-pay.de
+ad-rotator.com
+ad-server.gulasidorna.se
+ad-serverparc.nl
+ad-souk.com
+ad-space.net
+ad-tech.com
+ad-up.com
+ad.100.tbn.ru
+ad.71i.de
+ad.a8.net
+ad.abcnews.com
+ad.abctv.com
+ad.aboutwebservices.com
+ad.abum.com
+ad.afy11.net
+ad.allstar.cz
+ad.altervista.org
+ad.amgdgt.com
+ad.anuntis.com
+ad.auditude.com
+ad.bizo.com
+ad.bnmla.com
+ad.bondage.com
+ad.caradisiac.com
+ad.centrum.cz
+ad.cgi.cz
+ad.choiceradio.com
+ad.clix.pt
+ad.cooks.com
+ad.crwdcntrl.net
+ad.digitallook.com
+ad.directrev.com
+ad.doctissimo.fr
+ad.domainfactory.de
+ad.e-kolay.net
+ad.eurosport.com
+ad.f1cd.ru
+ad.flurry.com
+ad.foxnetworks.com
+ad.freecity.de
+ad.gate24.ch
+ad.globe7.com
+ad.grafika.cz
+ad.hbv.de
+ad.hodomobile.com
+ad.httpool.com
+ad.hyena.cz
+ad.iinfo.cz
+ad.ilove.ch
+ad.infoseek.com
+ad.jamba.net
+ad.jamster.co.uk
+ad.jetsoftware.com
+ad.keenspace.com
+ad.leadbolt.net
+ad.liveinternet.ru
+ad.lupa.cz
+ad.media-servers.net
+ad.mediastorm.hu
+ad.mgd.de
+ad.musicmatch.com
+ad.nachtagenten.de
+ad.nozonedata.com
+ad.nttnavi.co.jp
+ad.nwt.cz
+ad.onad.eu
+ad.pandora.tv
+ad.preferances.com
+ad.profiwin.de
+ad.prv.pl
+ad.rambler.ru
+ad.reunion.com
+ad.scanmedios.com
+ad.sensismediasmart.com.au
+ad.seznam.cz
+ad.simgames.net
+ad.slutload.com
+ad.smartclip.net
+ad.tbn.ru
+ad.technoratimedia.com
+ad.thewheelof.com
+ad.turn.com
+ad.tv2.no
+ad.twitchguru.com
+ad.usatoday.com
+ad.virtual-nights.com
+ad.wavu.hu
+ad.way.cz
+ad.weatherbug.com
+ad.wsod.com
+ad.wz.cz
+ad.yadro.ru
+ad.yourmedia.com
+ad.zanox.com
+ad0.bigmir.net
+ad01.mediacorpsingapore.com
+ad1.emediate.dk
+ad1.emule-project.org
+ad1.kde.cz
+ad1.pamedia.com.au
+ad2.iinfo.cz
+ad2.linxcz.cz
+ad2.lupa.cz
+ad2flash.com
+ad2games.com
+ad3.iinfo.cz
+ad3.pamedia.com.au
+ad4game.com
+adaction.de
+adadvisor.net
+adap.tv
+adapt.tv
+adbanner.ro
+adbard.net
+adbers.com
+adblade.com
+adblockanalytics.com
+adboost.de.vu
+adboost.net
+adbooth.net
+adbot.com
+adbrite.com
+adbroker.de
+adbunker.com
+adbutler.com
+adbutler.de
+adbuyer.com
+adbuyer3.lycos.com
+adcash.com
+adcast.deviantart.com
+adcell.de
+adcenter.mdf.se
+adcenter.net
+adcentriconline.com
+adcept.net
+adclick.com
+adclient.uimserv.net
+adclient1.tucows.com
+adcomplete.com
+adconion.com
+adcontent.gamespy.com
+adcycle.com
+add.newmedia.cz
+addealing.com
+addfreestats.com
+addme.com
+adecn.com
+ademails.com
+adengage.com
+adexpose.com
+adext.inkclub.com
+adf.ly
+adfactor.nl
+adfarm.mediaplex.com
+adflight.com
+adforce.com
+adform.com
+adgardener.com
+adgoto.com
+adgridwork.com
+adhese.be
+adhese.com
+adimage.asiaone.com.sg
+adimage.guardian.co.uk
+adimages.been.com
+adimages.carsoup.com
+adimages.go.com
+adimages.homestore.com
+adimages.omroepzeeland.nl
+adimages.sanomawsoy.fi
+adimg.cnet.com
+adimg.com.com
+adimg.uimserv.net
+adimg1.chosun.com
+adimgs.sapo.pt
+adimpact.com
+adinjector.net
+adinterax.com
+adisfy.com
+adition.com
+adition.de
+adition.net
+adizio.com
+adjix.com
+adjug.com
+adjuggler.com
+adjuggler.yourdictionary.com
+adjustnetwork.com
+adk2.com
+adk2ads.tictacti.com
+adland.ru
+adlantic.nl
+adledge.com
+adlegend.com
+adlog.com.com
+adloox.com
+adlooxtracking.com
+adlure.net
+admagnet.net
+admailtiser.com
+adman.gr
+adman.in.gr
+adman.otenet.gr
+admanagement.ch
+admanager.btopenworld.com
+admanager.carsoup.com
+admarketplace.net
+admarvel.com
+admax.nexage.com
+admedia.com
+admedia.ro
+admeld.com
+admerize.be
+admeta.com
+admex.com
+adminder.com
+adminshop.com
+admized.com
+admob.com
+admonitor.com
+admotion.com.ar
+adnet-media.net
+adnet.asahi.com
+adnet.biz
+adnet.de
+adnet.ru
+adnet.worldreviewer.com
+adnetinteractive.com
+adnetwork.net
+adnetworkperformance.com
+adnews.maddog2000.de
+adnotch.com
+adnxs.com
+adocean.pl
+adonspot.com
+adoperator.com
+adorigin.com
+adpepper.dk
+adpepper.nl
+adperium.com
+adpia.vn
+adplus.co.id
+adplxmd.com
+adprofile.net
+adprojekt.pl
+adq.nextag.com
+adrazzi.com
+adreactor.com
+adrecreate.com
+adremedy.com
+adreporting.com
+adres.internet.com
+adrevolver.com
+adriver.ru
+adrolays.de
+adrotate.de
+adrotator.se
+adrta.com
+ads-click.com
+ads.4tube.com
+ads.5ci.lt
+ads.abovetopsecret.com
+ads.aceweb.net
+ads.activestate.com
+ads.adfox.ru
+ads.administrator.de
+ads.adshareware.net
+ads.adultfriendfinder.com
+ads.adultswim.com
+ads.advance.net
+ads.adverline.com
+ads.affiliates.match.com
+ads.ak.facebook.com.edgesuite.net
+ads.allvatar.com
+ads.alt.com
+ads.amdmb.com
+ads.amigos.com
+ads.aol.co.uk
+ads.aol.com
+ads.apn.co.nz
+ads.appsgeyser.com
+ads.as4x.tmcs.net
+ads.as4x.tmcs.ticketmaster.com
+ads.asia1.com.sg
+ads.asiafriendfinder.com
+ads.ask.com
+ads.aspalliance.com
+ads.avazu.net
+ads.batpmturner.com
+ads.beenetworks.net
+ads.belointeractive.com
+ads.berlinonline.de
+ads.betanews.com
+ads.betfair.com
+ads.betfair.com.au
+ads.bigchurch.com
+ads.bigfoot.com
+ads.bing.com
+ads.bittorrent.com
+ads.blog.com
+ads.bloomberg.com
+ads.bluelithium.com
+ads.bluemountain.com
+ads.bluesq.com
+ads.bonniercorp.com
+ads.boylesports.com
+ads.brabys.com
+ads.brazzers.com
+ads.bumq.com
+ads.businessweek.com
+ads.canalblog.com
+ads.canoe.ca
+ads.casinocity.com
+ads.cbc.ca
+ads.cc
+ads.cc-dt.com
+ads.centraliprom.com
+ads.cgnetworks.com
+ads.channel4.com
+ads.clearchannel.com
+ads.co.com
+ads.com.com
+ads.contactmusic.com
+ads.contentabc.com
+ads.contextweb.com
+ads.crakmedia.com
+ads.creative-serving.com
+ads.creativematch.com
+ads.cricbuzz.com
+ads.cybersales.cz
+ads.dada.it
+ads.datinggold.com
+ads.datingyes.com
+ads.dazoot.ro
+ads.deltha.hu
+ads.dennisnet.co.uk
+ads.desmoinesregister.com
+ads.detelefoongids.nl
+ads.deviantart.com
+ads.digital-digest.com
+ads.digitalmedianet.com
+ads.digitalpoint.com
+ads.directionsmag.com
+ads.domeus.com
+ads.eagletribune.com
+ads.easy-forex.com
+ads.eatinparis.com
+ads.economist.com
+ads.edbindex.dk
+ads.egrana.com.br
+ads.einmedia.com
+ads.electrocelt.com
+ads.elitetrader.com
+ads.emirates.net.ae
+ads.epltalk.com
+ads.eu.msn.com
+ads.exactdrive.com
+ads.expat-blog.biz
+ads.expedia.com
+ads.ezboard.com
+ads.factorymedia.com
+ads.fairfax.com.au
+ads.faxo.com
+ads.ferianc.com
+ads.filmup.com
+ads.financialcontent.com
+ads.flooble.com
+ads.fool.com
+ads.footymad.net
+ads.forbes.com
+ads.forbes.net
+ads.forium.de
+ads.fortunecity.com
+ads.fotosidan.se
+ads.foxkidseurope.net
+ads.foxnetworks.com
+ads.foxnews.com
+ads.freecity.de
+ads.friendfinder.com
+ads.ft.com
+ads.futurenet.com
+ads.gamecity.net
+ads.gamershell.com
+ads.gamespyid.com
+ads.gamigo.de
+ads.gaming-universe.de
+ads.gawker.com
+ads.geekswithblogs.net
+ads.glispa.com
+ads.gmodules.com
+ads.godlikeproductions.com
+ads.goyk.com
+ads.gplusmedia.com
+ads.gradfinder.com
+ads.grindinggears.com
+ads.groundspeak.com
+ads.gsm-exchange.com
+ads.gsmexchange.com
+ads.guardian.co.uk
+ads.guardianunlimited.co.uk
+ads.guru3d.com
+ads.hardwaresecrets.com
+ads.harpers.org
+ads.hbv.de
+ads.hearstmags.com
+ads.heartlight.org
+ads.heias.com
+ads.hideyourarms.com
+ads.hollywood.com
+ads.horsehero.com
+ads.horyzon-media.com
+ads.iafrica.com
+ads.ibest.com.br
+ads.ibryte.com
+ads.icq.com
+ads.ign.com
+ads.img.co.za
+ads.imgur.com
+ads.indiatimes.com
+ads.infi.net
+ads.internic.co.il
+ads.ipowerweb.com
+ads.isoftmarketing.com
+ads.itv.com
+ads.iwon.com
+ads.jewishfriendfinder.com
+ads.jiwire.com
+ads.jobsite.co.uk
+ads.jpost.com
+ads.jubii.dk
+ads.justhungry.com
+ads.kaktuz.net
+ads.kelbymediagroup.com
+ads.kinobox.cz
+ads.kinxxx.com
+ads.kompass.com
+ads.krawall.de
+ads.lesbianpersonals.com
+ads.linuxfoundation.org
+ads.linuxjournal.com
+ads.linuxsecurity.com
+ads.livenation.com
+ads.mariuana.it
+ads.massinfra.nl
+ads.mcafee.com
+ads.mediaodyssey.com
+ads.mediaturf.net
+ads.medienhaus.de
+ads.mgnetwork.com
+ads.mmania.com
+ads.moceanads.com
+ads.motor-forum.nl
+ads.motormedia.nl
+ads.msn.com
+ads.multimania.lycos.fr
+ads.nationalgeographic.com
+ads.ncm.com
+ads.netclusive.de
+ads.netmechanic.com
+ads.networksolutions.com
+ads.newdream.net
+ads.newgrounds.com
+ads.newmedia.cz
+ads.newsint.co.uk
+ads.newsquest.co.uk
+ads.ninemsn.com.au
+ads.nj.com
+ads.nola.com
+ads.nordichardware.com
+ads.nordichardware.se
+ads.nwsource.com
+ads.nyi.net
+ads.nytimes.com
+ads.nyx.cz
+ads.nzcity.co.nz
+ads.o2.pl
+ads.oddschecker.com
+ads.okcimg.com
+ads.ole.com
+ads.olivebrandresponse.com
+ads.oneplace.com
+ads.ookla.com
+ads.optusnet.com.au
+ads.outpersonals.com
+ads.passion.com
+ads.pennet.com
+ads.penny-arcade.com
+ads.pheedo.com
+ads.phpclasses.org
+ads.pickmeup-ltd.com
+ads.planet.nl
+ads.pni.com
+ads.pof.com
+ads.powweb.com
+ads.primissima.it
+ads.printscr.com
+ads.prisacom.com
+ads.program3.com
+ads.psd2html.com
+ads.pushplay.com
+ads.quoka.de
+ads.rcs.it
+ads.recoletos.es
+ads.rediff.com
+ads.redlightcenter.com
+ads.redtube.com
+ads.resoom.de
+ads.returnpath.net
+ads.s3.sitepoint.com
+ads.satyamonline.com
+ads.savannahnow.com
+ads.saymedia.com
+ads.scifi.com
+ads.seniorfriendfinder.com
+ads.servebom.com
+ads.sexinyourcity.com
+ads.shizmoo.com
+ads.shopstyle.com
+ads.sift.co.uk
+ads.silverdisc.co.uk
+ads.slim.com
+ads.smartclick.com
+ads.soft32.com
+ads.space.com
+ads.sptimes.com
+ads.stackoverflow.com
+ads.sun.com
+ads.supplyframe.com
+ads.t-online.de
+ads.tahono.com
+ads.techtv.com
+ads.telegraph.co.uk
+ads.themovienation.com
+ads.thestar.com
+ads.tmcs.net
+ads.totallyfreestuff.com
+ads.townhall.com
+ads.trinitymirror.co.uk
+ads.tripod.com
+ads.tripod.lycos.co.uk
+ads.tripod.lycos.de
+ads.tripod.lycos.es
+ads.tripod.lycos.it
+ads.tripod.lycos.nl
+ads.tripod.spray.se
+ads.tso.dennisnet.co.uk
+ads.uknetguide.co.uk
+ads.ultimate-guitar.com
+ads.uncrate.com
+ads.undertone.com
+ads.usatoday.com
+ads.v3.com
+ads.verticalresponse.com
+ads.vgchartz.com
+ads.videosz.com
+ads.virtual-nights.com
+ads.virtualcountries.com
+ads.vnumedia.com
+ads.waps.cn
+ads.wapx.cn
+ads.weather.ca
+ads.web.aol.com
+ads.web.cs.com
+ads.web.de
+ads.webmasterpoint.org
+ads.websiteservices.com
+ads.whi.co.nz
+ads.whoishostingthis.com
+ads.wiezoekje.nl
+ads.wikia.nocookie.net
+ads.wineenthusiast.com
+ads.wwe.biz
+ads.xhamster.com
+ads.xtra.co.nz
+ads.y-0.net
+ads.yahoo.com
+ads.yimg.com
+ads.yldmgrimg.net
+ads.yourfreedvds.com
+ads.youtube.com
+ads.zdnet.com
+ads.ztod.com
+ads03.redtube.com
+ads1.canoe.ca
+ads1.mediacapital.pt
+ads1.msn.com
+ads1.rne.com
+ads1.virtual-nights.com
+ads10.speedbit.com
+ads180.com
+ads2.brazzers.com
+ads2.clearchannel.com
+ads2.contentabc.com
+ads2.gamecity.net
+ads2.jubii.dk
+ads2.net-communities.co.uk
+ads2.oneplace.com
+ads2.rne.com
+ads2.virtual-nights.com
+ads2.xnet.cz
+ads2004.treiberupdate.de
+ads3.contentabc.com
+ads3.gamecity.net
+ads3.virtual-nights.com
+ads4.clearchannel.com
+ads4.gamecity.net
+ads4.virtual-nights.com
+ads4homes.com
+ads5.canoe.ca
+ads5.virtual-nights.com
+ads6.gamecity.net
+ads7.gamecity.net
+ads8.com
+adsatt.abc.starwave.com
+Adsatt.ABCNews.starwave.com
+adsatt.espn.go.com
+adsatt.espn.starwave.com
+Adsatt.go.starwave.com
+adsby.bidtheatre.com
+adscale.de
+adscholar.com
+adscience.nl
+adscpm.com
+adsdaq.com
+adsdk.com
+adsend.de
+adserv.evo-x.de
+adserv.gamezone.de
+adserv.iafrica.com
+adserv.qconline.com
+adserve.ams.rhythmxchange.com
+adserver-live.yoc.mobi
+adserver.43plc.com
+adserver.71i.de
+adserver.adultfriendfinder.com
+adserver.aidameter.com
+adserver.aol.fr
+adserver.beggarspromo.com
+adserver.betandwin.de
+adserver.bing.com
+adserver.bizhat.com
+adserver.break-even.it
+adserver.cams.com
+adserver.com
+adserver.digitoday.com
+adserver.dotcommedia.de
+adserver.finditquick.com
+adserver.flossiemediagroup.com
+adserver.freecity.de
+adserver.freenet.de
+adserver.friendfinder.com
+adserver.hardsextube.com
+adserver.hardwareanalysis.com
+adserver.html.it
+adserver.irishwebmasterforum.com
+adserver.janes.com
+adserver.libero.it
+adserver.news.com.au
+adserver.ngz-network.de
+adserver.nydailynews.com
+adserver.o2.pl
+adserver.oddschecker.com
+adserver.omroepzeeland.nl
+adserver.pl
+adserver.portalofevil.com
+adserver.portugalmail.net
+adserver.portugalmail.pt
+adserver.sanomawsoy.fi
+adserver.sciflicks.com
+adserver.sharewareonline.com
+adserver.spankaway.com
+adserver.startnow.com
+adserver.theonering.net
+adserver.twitpic.com
+adserver.viagogo.com
+adserver.virginmedia.com
+adserver.yahoo.com
+adserver01.de
+adserver1-images.backbeatmedia.com
+adserver1.backbeatmedia.com
+adserver1.mindshare.de
+adserver1.ogilvy-interactive.de
+adserver2.mindshare.de
+adserverplus.com
+adserversolutions.com
+adservinginternational.com
+adsfac.eu
+adsfac.net
+adsfac.us
+adshost1.com
+adside.com
+adsk2.co
+adskape.ru
+adsklick.de
+adsmarket.com
+adsmart.co.uk
+adsmart.com
+adsmart.net
+adsmogo.com
+adsnative.com
+adsoftware.com
+adsoldier.com
+adsonar.com
+adspace.ro
+adspeed.net
+adspirit.de
+adsponse.de
+adsremote.scrippsnetworks.com
+adsrevenue.net
+adsrv.deviantart.com
+adsrv.eacdn.com
+adsrv.iol.co.za
+adsrvr.org
+adsstat.com
+adstat.4u.pl
+adstest.weather.com
+adsupply.com
+adsymptotic.com
+adsynergy.com
+adsys.townnews.com
+adsystem.simplemachines.org
+adtech.de
+adtechus.com
+adtegrity.net
+adthis.com
+adtiger.de
+adtoll.com
+adtology.com
+adtoma.com
+adtrace.org
+adtrade.net
+adtrading.de
+adtrak.net
+adtriplex.com
+adultadvertising.com
+adv-adserver.com
+adv-banner.libero.it
+adv.cooperhosting.net
+adv.freeonline.it
+adv.hwupgrade.it
+adv.livedoor.com
+adv.webmd.com
+adv.wp.pl
+adv.yo.cz
+advariant.com
+adventory.com
+advert.bayarea.com
+advert.dyna.ultraweb.hu
+adverticum.com
+adverticum.net
+adverticus.de
+advertise.com
+advertiseireland.com
+advertisespace.com
+advertising.com
+advertising.guildlaunch.net
+advertisingbanners.com
+advertisingbox.com
+advertmarket.com
+advertmedia.de
+advertpro.sitepoint.com
+advertpro.ya.com
+adverts.carltononline.com
+advertserve.com
+advertstream.com
+advertwizard.com
+advideo.uimserv.net
+adview.ppro.de
+advisormedia.cz
+adviva.net
+advnt.com
+adwareremovergold.com
+adwhirl.com
+adwitserver.com
+adworldnetwork.com
+adworx.at
+adworx.be
+adworx.nl
+adx.allstar.cz
+adx.atnext.com
+adxpansion.com
+adxpose.com
+adxvalue.com
+adyea.com
+adzerk.net
+adzerk.s3.amazonaws.com
+adzones.com
+af-ad.co.uk
+affbuzzads.com
+affili.net
+affiliate.1800flowers.com
+affiliate.doubleyourdating.com
+affiliate.dtiserv.com
+affiliate.gamestop.com
+affiliate.mercola.com
+affiliate.mogs.com
+affiliate.offgamers.com
+affiliate.travelnow.com
+affiliate.viator.com
+affiliatefuel.com
+affiliatefuture.com
+affiliates.allposters.com
+affiliates.babylon.com
+affiliates.digitalriver.com
+affiliates.globat.com
+affiliates.internationaljock.com
+affiliates.streamray.com
+affiliates.thinkhost.net
+affiliates.thrixxx.com
+affiliates.ultrahosting.com
+affiliatetracking.com
+affiliatetracking.net
+affiliatewindow.com
+affiliation-france.com
+afftracking.justanswer.com
+ah-ha.com
+ahalogy.com
+aidu-ads.de
+aim4media.com
+aistat.net
+aktrack.pubmatic.com
+alclick.com
+alenty.com
+alexa-sitestats.s3.amazonaws.com
+all4spy.com
+alladvantage.com
+allosponsor.com
+amazingcounters.com
+amazon-adsystem.com
+americash.com
+amung.us
+an.tacoda.net
+anahtars.com
+analytics.adpost.org
+analytics.google.com
+analytics.live.com
+analytics.yahoo.com
+anm.intelli-direct.com
+annonser.dagbladet.no
+apex-ad.com
+api.intensifier.de
+apture.com
+arc1.msn.com
+arcadebanners.com
+ard.xxxblackbook.com
+are-ter.com
+as.webmd.com
+as1.advfn.com
+assets1.exgfnetwork.com
+assoc-amazon.com
+at-adserver.alltop.com
+atdmt.com
+athena-ads.wikia.com
+atwola.com
+auctionads.com
+auctionads.net
+audience2media.com
+audit.median.hu
+audit.webinform.hu
+auto-bannertausch.de
+autohits.dk
+avenuea.com
+avpa.javalobby.org
+avres.net
+avsads.com
+awempire.com
+awin1.com
+azfront.com
+b-1st.com
+b.aol.com
+b.engadget.com
+ba.afl.rakuten.co.jp
+babs.tv2.dk
+backbeatmedia.com
+banik.redigy.cz
+banner-exchange-24.de
+banner.ad.nu
+banner.ambercoastcasino.com
+banner.blogranking.net
+banner.buempliz-online.ch
+banner.casino.net
+banner.casinodelrio.com
+banner.cotedazurpalace.com
+banner.coza.com
+banner.cz
+banner.easyspace.com
+banner.elisa.net
+banner.eurogrand.com
+banner.featuredusers.com
+banner.getgo.de
+banner.goldenpalace.com
+banner.img.co.za
+banner.inyourpocket.com
+banner.kiev.ua
+banner.linux.se
+banner.media-system.de
+banner.mindshare.de
+banner.nixnet.cz
+banner.noblepoker.com
+banner.northsky.com
+banner.orb.net
+banner.penguin.cz
+banner.rbc.ru
+banner.relcom.ru
+banner.tanto.de
+banner.titan-dsl.de
+banner.vadian.net
+banner.webmersion.com
+banner.wirenode.com
+bannerads.de
+bannerboxes.com
+bannercommunity.de
+bannerconnect.com
+bannerconnect.net
+bannerexchange.cjb.net
+bannerflow.com
+bannergrabber.internet.gr
+bannerhost.com
+bannerimage.com
+bannerlandia.com.ar
+bannermall.com
+bannermarkt.nl
+bannerpower.com
+banners.adultfriendfinder.com
+banners.amigos.com
+banners.asiafriendfinder.com
+banners.audioholics.com
+banners.babylon-x.com
+banners.bol.com.br
+banners.cams.com
+banners.clubseventeen.com
+banners.czi.cz
+banners.dine.com
+banners.direction-x.com
+banners.directnic.com
+banners.easydns.com
+banners.freett.com
+banners.friendfinder.com
+banners.getiton.com
+banners.iq.pl
+banners.isoftmarketing.com
+banners.lifeserv.com
+banners.linkbuddies.com
+banners.passion.com
+banners.resultonline.com
+banners.sexsearch.com
+banners.sys-con.com
+banners.thomsonlocal.com
+banners.videosz.com
+banners.virtuagirlhd.com
+banners.wunderground.com
+bannerserver.com
+bannersgomlm.com
+bannershotlink.perfectgonzo.com
+bannersng.yell.com
+bannerspace.com
+bannerswap.com
+bannertesting.com
+bannery.cz
+bannieres.acces-contenu.com
+bans.adserver.co.il
+bans.bride.ru
+barnesandnoble.bfast.com
+basebanner.com
+baypops.com
+bbelements.com
+bbn.img.com.ua
+begun.ru
+belstat.com
+belstat.nl
+berp.com
+best-pr.info
+best-top.ro
+bestsearch.net
+bhclicks.com
+bidclix.com
+bidclix.net
+bidswitch.net
+bidtrk.com
+bidvertiser.com
+bigbangmedia.com
+bigclicks.com
+billboard.cz
+bitads.net
+bitmedianetwork.com
+bizad.nikkeibp.co.jp
+bizrate.com
+blast4traffic.com
+blingbucks.com
+blogads.com
+blogcounter.de
+blogherads.com
+blogrush.com
+blogtoplist.se
+blogtopsites.com
+blueadvertise.com
+bluekai.com
+bluelithium.com
+bluewhaleweb.com
+bm.annonce.cz
+bn.bfast.com
+boersego-ads.de
+boldchat.com
+boom.ro
+boomads.com
+boost-my-pr.de
+box.anchorfree.net
+bpath.com
+braincash.com
+brandreachsys.com
+bravenet.com.invalid
+bridgetrack.com
+brightinfo.com
+british-banners.com
+bs.yandex.ru
+bttrack.com
+budsinc.com
+bullseye.backbeatmedia.com
+buyhitscheap.com
+buysellads.com
+buzzonclick.com
+bvalphaserver.com
+bwp.download.com
+c.bigmir.net
+c1.nowlinux.com
+c1exchange.com
+campaign.bharatmatrimony.com
+caniamedia.com
+carbonads.com
+carbonads.net
+casalemedia.com
+casalmedia.com
+cash4members.com
+cash4popup.de
+cashcrate.com
+cashengines.com
+cashfiesta.com
+cashlayer.com
+cashpartner.com
+casinogames.com
+casinopays.com
+casinorewards.com
+casinotraffic.com
+casinotreasure.com
+cbanners.virtuagirlhd.com
+cbmall.com
+cdn.freefacti.com
+cdn.freefarcy.com
+cecash.com
+centerpointmedia.com
+ceskydomov.alias.ngs.modry.cz
+cetrk.com
+cgicounter.puretec.de
+ch.questionmarket.com
+chameleon.ad
+channelintelligence.com
+chart.dk
+chartbeat.com
+chartbeat.net
+checkm8.com
+checkstat.nl
+chestionar.ro
+chitika.net
+cibleclick.com
+cityads.telus.net
+cj.com
+cjbmanagement.com
+cjlog.com
+claria.com
+class-act-clicks.com
+click.absoluteagency.com
+click.fool.com
+click.kmindex.ru
+click2freemoney.com
+click2paid.com
+clickability.com
+clickadz.com
+clickagents.com
+clickbank.com
+clickbank.net
+clickbooth.com
+clickboothlnk.com
+clickbrokers.com
+clickcompare.co.uk
+clickdensity.com
+clickedyclick.com
+clickhereforcellphones.com
+clickhouse.com
+clickhype.com
+clicklink.jp
+clickmedia.ro
+clickonometrics.pl
+clicks.equantum.com
+clicks.mods.de
+clickserve.cc-dt.com
+clicksor.com
+clicktag.de
+clickthrucash.com
+clickthruserver.com
+clickthrutraffic.com
+clicktrace.info
+clicktrack.ziyu.net
+clicktracks.com
+clicktrade.com
+clickxchange.com
+clickz.com
+clickzxc.com
+clicmanager.fr
+clientmetrics-pa.googleapis.com
+clients.tbo.com
+clixgalore.com
+clk.konflab.com
+clkads.com
+clkrev.com
+cluster.adultworld.com
+clustrmaps.com
+cmpstar.com
+cnomy.com
+cnt.spbland.ru
+cnt1.pocitadlo.cz
+code-server.biz
+colonize.com
+comclick.com
+commindo-media-ressourcen.de
+commissionmonster.com
+compactbanner.com
+comprabanner.it
+confirmed-profits.com
+connextra.com
+contaxe.de
+content.acc-hd.de
+content.ad
+contextweb.com
+conversantmedia.com
+conversionruler.com
+cookies.cmpnet.com
+coremetrics.com
+count.rbc.ru
+count.rin.ru
+count.west263.com
+counted.com
+counter.bloke.com
+counter.cnw.cz
+counter.cz
+counter.dreamhost.com
+counter.fateback.com
+counter.mirohost.net
+counter.mojgorod.ru
+counter.nowlinux.com
+counter.rambler.ru
+counter.search.bg
+counter.sparklit.com
+counter.yadro.ru
+counters.honesty.com
+counting.kmindex.ru
+counts.tucows.com
+coupling-media.de
+cpalead.com
+cpays.com
+cpmaffiliation.com
+cpmstar.com
+cpxinteractive.com
+cqcounter.com
+crakmedia.com
+craktraffic.com
+crawlability.com
+crazypopups.com
+creafi-online-media.com
+creative.whi.co.nz
+creatives.as4x.tmcs.net
+creatives.livejasmin.com
+crispads.com
+criteo.com
+crowdgravity.com
+crtv.mate1.com
+crwdcntrl.net
+ctnetwork.hu
+cubics.com
+customad.cnn.com
+cyberbounty.com
+cybermonitor.com
+d.adroll.com
+dakic-ia-300.com
+danban.com
+dapper.net
+datashreddergold.com
+dbbsrv.com
+dc-storm.com
+de17a.com
+dealdotcom.com
+debtbusterloans.com
+decknetwork.net
+deloo.de
+demandbase.com
+demdex.net
+di1.shopping.com
+dialerporn.com
+didtheyreadit.com
+direct-xxx-access.com
+directaclick.com
+directleads.com
+directorym.com
+directtrack.com
+discountclick.com
+displayadsmedia.com
+dist.belnk.com
+dmtracker.com
+dmtracking.alibaba.com
+dmtracking2.alibaba.com
+dnads.directnic.com
+domaining.in
+domainsponsor.com
+domainsteam.de
+domdex.com
+doubleclick.com
+doubleclick.de
+doubleclick.net
+doublepimp.com
+drumcash.com
+dynamic.fmpub.net
+e-adimages.scrippsnetworks.com
+e-bannerx.com
+e-debtconsolidation.com
+e-m.fr
+e-n-t-e-r-n-e-x.com
+e-planning.net
+e.kde.cz
+eadexchange.com
+eas.almamedia.fi
+easyhits4u.com
+ebayadvertising.com
+ebocornac.com
+ebuzzing.com
+ecircle-ag.com
+eclick.vn
+ecoupons.com
+edgeio.com
+effectivemeasure.com
+effectivemeasure.net
+eiv.baidu.com
+elitedollars.com
+elitetoplist.com
+emarketer.com
+emediate.dk
+emediate.eu
+engine.espace.netavenir.com
+enginenetwork.com
+enoratraffic.com
+enquisite.com
+entercasino.com
+entrecard.s3.amazonaws.com
+eqads.com
+ero-advertising.com
+esellerate.net
+estat.com
+etahub.com
+etargetnet.com
+etracker.de
+eu-adcenter.net
+eu1.madsone.com
+eur.a1.yimg.com
+eurekster.com
+euro-linkindex.de
+euroclick.com
+euros4click.de
+eusta.de
+evergage.com
+evidencecleanergold.com
+ewebcounter.com
+exchange-it.com
+exchange.bg
+exchangead.com
+exchangeclicksonline.com
+exelator.com
+exit76.com
+exitexchange.com
+exitfuel.com
+exoclick.com
+exogripper.com
+experteerads.com
+exponential.com
+express-submit.de
+extractorandburner.com
+extreme-dm.com
+extremetracking.com
+eyeblaster.com
+eyereturn.com
+eyeviewads.com
+eyewonder.com
+ezula.com
+f5biz.com
+fast-adv.it
+fastclick.com
+fastclick.com.edgesuite.net
+fastclick.net
+fb-promotions.com
+fc.webmasterpro.de
+feedbackresearch.com
+feedjit.com
+ffxcam.fairfax.com.au
+fimc.net
+fimserve.com
+findcommerce.com
+findyourcasino.com
+fineclicks.com
+first.nova.cz
+firstlightera.com
+flashtalking.com
+fleshlightcash.com
+flexbanner.com
+flowgo.com
+flurry.com
+fonecta.leiki.com
+foo.cosmocode.de
+forex-affiliate.net
+fpctraffic.com
+fpctraffic2.com
+fragmentserv.iac-online.de
+free-banners.com
+freebanner.com
+freelogs.com
+freeonlineusers.com
+freepay.com
+freestats.com
+freestats.tv
+freewebcounter.com
+funklicks.com
+funpageexchange.com
+fusionads.net
+fusionquest.com
+fxclix.com
+fxstyle.net
+galaxien.com
+game-advertising-online.com
+gamehouse.com
+gamesites100.net
+gamesites200.com
+gamesitestop100.com
+gator.com
+gbanners.hornymatches.com
+gemius.pl
+geo.digitalpoint.com
+geobanner.adultfriendfinder.com
+geovisite.com
+getclicky.com
+globalismedia.com
+globaltakeoff.net
+globaltrack.com.invalid
+globe7.com
+globus-inter.com
+gmads.net
+go-clicks.de
+go-rank.de
+goingplatinum.com
+goldstats.com
+google-analytics.com
+googleadservices.com
+googlesyndication.com
+gostats.com
+gp.dejanews.com
+gpr.hu
+grafstat.ro
+grapeshot.co.uk
+greystripe.com
+gtop.ro
+gtop100.com
+gunggo.com
+harrenmedia.com
+harrenmedianetwork.com
+havamedia.net
+heias.com
+hentaicounter.com
+herbalaffiliateprogram.com
+hexusads.fluent.ltd.uk
+heyos.com
+hgads.com
+hidden.gogoceleb.com
+hightrafficads.com
+histats.com
+hit-parade.com
+hit.bg
+hit.ua
+hit.webcentre.lycos.co.uk
+hitbox.com
+hitcents.com
+hitfarm.com
+hitiz.com
+hitlist.ru
+hitlounge.com
+hitometer.com
+hits.europuls.eu
+hits.informer.com
+hits.puls.lv
+hits.theguardian.com
+hits4me.com
+hits4pay.com
+hitslink.com
+hittail.com
+hollandbusinessadvertising.nl
+homepageking.de
+hostedads.realitykings.com
+hotjar.com
+hotkeys.com
+hotlog.ru
+hotrank.com.tw
+hs-analytics.net
+htmlhubing.xyz
+httpool.com
+hurricanedigitalmedia.com
+hydramedia.com
+hyperbanner.net
+hypertracker.com
+i-clicks.net
+i.xx.openx.com
+i1img.com
+i1media.no
+ia.iinfo.cz
+iad.anm.co.uk
+iadnet.com
+iasds01.com
+iconadserver.com
+icptrack.com
+idcounter.com
+identads.com
+idot.cz
+idregie.com
+idtargeting.com
+ientrymail.com
+iesnare.com
+ifa.tube8live.com
+ilbanner.com
+ilead.itrack.it
+ilovecheating.com
+imageads.canoe.ca
+imagecash.net
+images-pw.secureserver.net
+images.v3.com
+imarketservices.com
+img.prohardver.hu
+imgpromo.easyrencontre.com
+imonitor.nethost.cz
+imprese.cz
+impressionmedia.cz
+impressionz.co.uk
+imrworldwide.com
+inboxdollars.com
+incentaclick.com
+indexstats.com
+indieclick.com
+industrybrains.com
+inetlog.ru
+infinite-ads.com
+infinityads.com
+infolinks.com
+information.com
+inringtone.com
+insightexpress.com
+insightexpressai.com
+inspectorclick.com
+instantmadness.com
+intelliads.com
+intellitxt.com
+interactive.forthnet.gr
+intergi.com
+internetfuel.com
+interreklame.de
+interstat.hu
+ip.ro
+ip193.cn
+iperceptions.com
+ipro.com
+ireklama.cz
+itfarm.com
+itop.cz
+its-that-easy.com
+itsptp.com
+jcount.com
+jinkads.de
+joetec.net
+js.users.51.la
+juicyads.com
+jumptap.com
+justrelevant.com
+justwebads.com
+k.iinfo.cz
+kanoodle.com
+keymedia.hu
+kindads.com
+kissmetrics.com
+kliks.nl
+kniverto.com
+komoona.com
+kompasads.com
+kontera.com
+kt-g.de
+ktu.sv2.biz
+lakequincy.com
+launchbit.com
+layer-ad.de
+layer-ads.de
+lbn.ru
+lct.salesforce.com
+lead-analytics.nl
+leadboltads.net
+leadclick.com
+leadingedgecash.com
+leadzupc.com
+levelrate.de
+lfstmedia.com
+liftdna.com
+ligatus.com
+ligatus.de
+lightningcast.net
+lightspeedcash.com
+link-booster.de
+link4ads.com
+linkadd.de
+linkbuddies.com
+linkexchange.com
+linkprice.com
+linkrain.com
+linkreferral.com
+links-ranking.de
+linkshighway.com
+linkstorms.com
+linkswaper.com
+linktarget.com
+liquidad.narrowcastmedia.com
+liveintent.com
+liverail.com
+loading321.com
+log.btopenworld.com
+logua.com
+lop.com
+lucidmedia.com
+lzjl.com
+m.webtrends.com
+m1.webstats4u.com
+m4n.nl
+mackeeperapp.mackeeper.com
+madclient.uimserv.net
+madisonavenue.com
+mads.cnet.com
+madvertise.de
+marchex.com
+market-buster.com
+marketing.888.com
+marketing.hearstmagazines.nl
+marketing.nyi.net
+marketing.osijek031.com
+marketingsolutions.yahoo.com
+maroonspider.com
+mas.sector.sk
+mastermind.com
+matchcraft.com
+mathtag.com
+max.i12.de
+maximumcash.com
+mbn.com.ua
+mbs.megaroticlive.com
+mbuyu.nl
+mdotm.com
+measuremap.com
+media-adrunner.mycomputer.com
+media-servers.net
+media.ftv-publicite.fr
+media.funpic.de
+media6degrees.com
+mediaarea.eu
+mediacharger.com
+mediadvertising.ro
+mediageneral.com
+mediamath.com
+mediamgr.ugo.com
+mediaplazza.com
+mediaplex.com
+mediascale.de
+mediatext.com
+mediax.angloinfo.com
+mediaz.angloinfo.com
+medleyads.com
+medyanetads.com
+megacash.de
+megago.com
+megastats.com
+megawerbung.de
+metaffiliation.com
+metanetwork.com
+methodcash.com
+metrics.windowsitpro.com
+mgid.com
+miarroba.com
+microstatic.pl
+microticker.com
+midnightclicking.com
+misstrends.com
+mixpanel.com
+mixtraffic.com
+mjxads.internet.com
+mlm.de
+mmismm.com
+mmtro.com
+moatads.com
+mobclix.com
+mocean.mobi
+moneyexpert.com
+monsterpops.com
+mopub.com
+mouseflow.com
+mpstat.us
+mr-rank.de
+mrskincash.com
+mtree.com
+musiccounter.ru
+muwmedia.com
+myaffiliateprogram.com
+mybloglog.com
+mycounter.ua
+mymoneymakingapp.com
+mypagerank.net
+mypagerank.ru
+mypowermall.com
+mystat-in.net
+mystat.pl
+mytop-in.net
+n69.com
+naiadsystems.com.invalid
+naj.sk
+namimedia.com
+nastydollars.com
+navigator.io
+navrcholu.cz
+nbjmp.com
+ndparking.com
+nedstat.com
+nedstat.nl
+nedstatbasic.net
+nedstatpro.net
+nend.net
+neocounter.neoworx-blog-tools.net
+neoffic.com
+net-filter.com
+netaffiliation.com
+netagent.cz
+netclickstats.com
+netcommunities.com
+netdirect.nl
+netincap.com
+netpool.netbookia.net
+netshelter.net
+network.business.com
+neudesicmediagroup.com
+newads.bangbros.com
+newbie.com
+newnet.qsrch.com
+newnudecash.com
+newopenx.detik.com
+newt1.adultadworld.com
+newt1.adultworld.com
+newtopsites.com
+ng3.ads.warnerbros.com
+ngs.impress.co.jp
+nitroclicks.com
+novem.pl
+nuggad.net
+numax.nu-1.com
+nuseek.com
+oas.benchmark.fr
+oas.foxnews.com
+oas.repubblica.it
+oas.roanoke.com
+oas.salon.com
+oas.toronto.com
+oas.uniontrib.com
+oas.villagevoice.com
+oascentral.businessweek.com
+oascentral.chicagobusiness.com
+oascentral.fortunecity.com
+oascentral.register.com
+oewa.at
+oewabox.at
+offerforge.com
+offermatica.com
+olivebrandresponse.com
+omniture.com
+onclasrv.com
+onclickads.net
+oneandonlynetwork.com
+onenetworkdirect.com
+onestat.com
+onestatfree.com
+online-metrix.net
+onlinecash.com
+onlinecashmethod.com
+onlinerewardcenter.com
+openad.tf1.fr
+openad.travelnow.com
+openads.friendfinder.com
+openads.org
+openx.angelsgroup.org.uk
+openx.blindferret.com
+opienetwork.com
+optimost.com
+optmd.com
+ordingly.com
+ota.cartrawler.com
+otto-images.developershed.com
+outbrain.com
+overture.com
+owebmoney.ru
+oxado.com
+oxcash.com
+oxen.hillcountrytexas.com
+p.adpdx.com
+pagead.l.google.com
+pagefair.com
+pagerank-ranking.de
+pagerank-submitter.de
+pagerank-suchmaschine.de
+pagerank-united.de
+pagerank4you.com
+pageranktop.com
+parse.ly.invalid
+parsely.com
+partage-facile.com
+partner-ads.com
+partner.pelikan.cz
+partner.topcities.com
+partnerad.l.google.com
+partnercash.de
+partners.priceline.com
+passion-4.net
+pay-ads.com
+paycounter.com
+paypopup.com
+payserve.com
+pbnet.ru
+pcash.imlive.com
+peep-auktion.de
+peer39.com
+pennyweb.com
+pepperjamnetwork.com
+percentmobile.com
+perfectaudience.com
+perfiliate.com
+performancerevenue.com
+performancerevenues.com
+performancing.com
+pgmediaserve.com
+pgpartner.com
+pheedo.com
+phoenix-adrunner.mycomputer.com
+phpadsnew.new.natuurpark.nl
+phpmyvisites.net
+picadmedia.com
+pillscash.com
+pimproll.com
+pixel.adsafeprotected.com
+pixel.jumptap.com
+pixel.redditmedia.com
+play4traffic.com
+playhaven.com
+plista.com
+plugrush.com
+pointroll.com
+pop-under.ru
+popads.net
+popub.com
+popunder.ru
+popup.msn.com
+popupmoney.com
+popupnation.com
+popups.infostart.com
+popuptraffic.com
+porngraph.com
+porntrack.com
+postrelease.com
+potenza.cz
+pr-star.de
+pr-ten.de
+praddpro.de
+prchecker.info
+precisioncounter.com
+predictad.com
+premium-offers.com
+primaryads.com
+primetime.net
+privatecash.com
+pro-advertising.com
+pro.i-doctor.co.kr
+proext.com
+profero.com
+projectwonderful.com
+promo.badoink.com
+promo.ulust.com
+promo1.webcams.nl
+promobenef.com
+promos.fling.com
+promote.pair.com
+promotion-campaigns.com
+pronetadvertising.com
+propellerads.com
+proranktracker.com
+proton-tm.com
+protraffic.com
+provexia.com
+prsitecheck.com
+psstt.com
+pub.chez.com
+pub.club-internet.fr
+pub.hardware.fr
+pub.realmedia.fr
+pubdirecte.com
+publicidad.elmundo.es
+pubmatic.com
+pubs.lemonde.fr
+pulse360.com
+q.azcentral.com
+qctop.com
+qnsr.com
+quantcast.com
+quantserve.com
+quarterserver.de
+questaffiliates.net
+quigo.com
+quinst.com
+quisma.com
+rad.msn.com
+radar.cedexis.com
+radarurl.com
+radiate.com
+rampidads.com
+rank-master.com
+rank-master.de
+rankchamp.de
+ranking-charts.de
+ranking-hits.de
+ranking-id.de
+ranking-links.de
+ranking-liste.de
+ranking-street.de
+rankingchart.de
+rankingscout.com
+rankyou.com
+rapidcounter.com
+rate.ru
+ratings.lycos.com
+rb1.design.ru
+re-directme.com
+reachjunction.com
+reactx.com
+readserver.net
+realcastmedia.com
+realclix.com
+realmedia-a800.d4p.net
+realtechnetwork.com
+realtracker.com
+reduxmedia.com
+reduxmediagroup.com
+reedbusiness.com.invalid
+referralware.com
+regnow.com
+reinvigorate.net
+reklam.rfsl.se
+reklama.mironet.cz
+reklama.reflektor.cz
+reklamcsere.hu
+reklame.unwired-i.net
+reklamer.com.ua
+relevanz10.de
+relmaxtop.com
+remotead.cnet.com
+republika.onet.pl
+retargeter.com
+revenue.net
+revenuedirect.com
+revsci.net
+revstats.com
+richmails.com
+richmedia.yimg.com
+richwebmaster.com
+rightstats.com
+rlcdn.com
+rle.ru
+rmads.msn.com
+rmedia.boston.com
+roar.com
+robotreplay.com
+roia.biz
+rok.com.com
+rose.ixbt.com
+rotabanner.com
+roxr.net
+rtbpop.com
+rtbpopd.com
+ru-traffic.com
+ru4.com
+rubiconproject.com
+s.adroll.com
+s2d6.com
+sageanalyst.net
+sail-horizon.com
+samsungacr.com
+samsungads.com
+sbx.pagesjaunes.fr
+scambiobanner.aruba.it
+scanscout.com
+scopelight.com
+scorecardresearch.com
+scratch2cash.com
+scripte-monster.de
+searchfeast.com
+searchmarketing.com
+searchramp.com
+secure.webconnect.net
+sedoparking.com
+sedotracker.com
+seeq.com.invalid
+sensismediasmart.com.au
+seo4india.com
+serv0.com
+servedby-buysellads.com
+servedbyadbutler.com
+servedbyopenx.com
+services.hearstmags.com
+serving-sys.com
+sexaddpro.de
+sexadvertentiesite.nl
+sexcounter.com
+sexinyourcity.com
+sexlist.com
+sextracker.com
+sexystat.com
+shareadspace.com
+shareasale.com
+sharepointads.com
+sher.index.hu
+shinystat.com
+shinystat.it
+shoppingads.com
+siccash.com
+sidebar.angelfire.com
+sinoa.com
+sitemeter.com
+sitestat.com
+sixsigmatraffic.com
+skimresources.com
+skylink.vn
+slickaffiliate.com
+slopeaota.com
+smart4ads.com
+smartadserver.com
+smowtion.com
+snapads.com
+snoobi.com
+socialspark.com
+softclick.com.br
+spacash.com
+sparkstudios.com
+specificmedia.co.uk
+specificpop.com
+spezialreporte.de
+spinbox.techtracker.com
+spinbox.versiontracker.com
+sponsorads.de
+sponsorpro.de
+sponsors.thoughtsmedia.com
+spot.fitness.com
+spotxchange.com
+spylog.com
+spywarelabs.com
+spywarenuker.com
+spywords.com
+srwww1.com
+starffa.com
+start.freeze.com
+stat.cliche.se
+stat.dealtime.com
+stat.dyna.ultraweb.hu
+stat.pl
+stat.su
+stat.tudou.com
+stat.webmedia.pl
+stat.zenon.net
+stat24.com
+stat24.meta.ua
+statcounter.com
+static.fmpub.net
+static.itrack.it
+staticads.btopenworld.com
+statistik-gallup.net
+statm.the-adult-company.com
+stats.blogger.com
+stats.cts-bv.nl
+stats.directnic.com
+stats.hyperinzerce.cz
+stats.mirrorfootball.co.uk
+stats.multiup.org
+stats.olark.com
+stats.suite101.com
+stats.surfaid.ihost.com
+stats.townnews.com
+stats.unwired-i.net
+stats.wordpress.com
+stats.x14.eu
+stats4all.com
+statsie.com
+statxpress.com
+steelhouse.com
+steelhousemedia.com
+stickyadstv.com
+suavalds.com
+subscribe.hearstmags.com
+sugoicounter.com
+sumo.com
+sumome.com
+superclix.de
+superstats.com
+supertop.ru
+supertop100.com
+suptullog.com
+surfmusik-adserver.de
+swan-swan-goose.com
+swissadsolutions.com
+swordfishdc.com
+sx.trhnt.com
+t.insigit.com
+t.pusk.ru
+taboola.com
+tacoda.net
+tagular.com
+tailsweep.co.uk
+tailsweep.com
+tailsweep.se
+takru.com
+tangerinenet.biz
+tapad.com
+targad.de
+targetingnow.com
+targetnet.com
+targetpoint.com
+tatsumi-sys.jp
+tcads.net
+teads.tv
+techclicks.net
+teenrevenue.com
+teliad.de
+text-link-ads.com
+textad.sexsearch.com
+textads.biz
+textads.opera.com
+textlinks.com
+tfag.de
+theadhost.com
+theads.me
+thebugs.ws
+thecounter.com
+therapistla.com
+therichkids.com
+thrnt.com
+thruport.com
+tinybar.com
+tizers.net
+tlvmedia.com
+tntclix.co.uk
+top-casting-termine.de
+top-site-list.com
+top.list.ru
+top.mail.ru
+top.proext.com
+top100-images.rambler.ru
+top100.mafia.ru
+top123.ro
+top20.com.invalid
+top20free.com
+top90.ro
+topbarh.box.sk
+topblogarea.se
+topbucks.com
+topforall.com
+topgamesites.net
+toplist.cz
+toplist.pornhost.com
+toplista.mw.hu
+toplistcity.com
+topmmorpgsites.com.invalid
+topping.com.ua
+toprebates.com
+topsafelist.net
+topsearcher.com
+topsir.com
+topsite.lv
+topsites.com.br
+topstats.com
+totemcash.com
+touchclarity.com
+touchclarity.natwest.com
+tour.brazzers.com
+tpnads.com
+track.adform.net
+track.anchorfree.com
+track.gawker.com
+trackalyzer.com
+tracker.icerocket.com
+tracker.marinsm.com
+tracking.crunchiemedia.com
+tracking.gajmp.com
+tracking.internetstores.de
+tracking.yourfilehost.com
+tracking101.com
+trackingsoft.com
+trackmysales.com
+tradeadexchange.com
+tradedoubler.com
+traffic-exchange.com
+traffic.liveuniversenetwork.com
+trafficadept.com
+trafficcdn.liveuniversenetwork.com
+trafficfactory.biz
+trafficholder.com
+traffichunt.com
+trafficjunky.net
+trafficleader.com
+trafficsecrets.com
+trafficspaces.net
+trafficstrategies.com
+trafficswarm.com
+traffictrader.net
+trafficz.com
+trafficz.net
+traffiq.com
+trafic.ro
+travis.bosscasinos.com
+trekblue.com
+trekdata.com
+trendcounter.com
+trendmd.com
+trhunt.com
+tribalfusion.com
+trix.net
+truehits.net
+truehits1.gits.net.th
+truehits2.gits.net.th
+tsms-ad.tsms.com
+tubemogul.com
+turn.com
+tvmtracker.com
+twittad.com
+tyroo.com
+uarating.com
+ukbanners.com
+ultramercial.com
+unanimis.co.uk
+untd.com
+updated.com
+urlcash.net
+us.a1.yimg.com
+usapromotravel.com
+usmsad.tom.com
+utarget.co.uk
+utils.mediageneral.net
+v1.cnzz.com
+validclick.com
+valuead.com
+valueclick.com
+valueclickmedia.com
+valuecommerce.com
+valuesponsor.com
+veille-referencement.com
+ventivmedia.com
+vericlick.com
+vertadnet.com
+veruta.com
+vervewireless.com
+vibrantmedia.com
+video-stats.video.google.com
+videoegg.com
+view4cash.de
+viewpoint.com
+visistat.com
+visit.webhosting.yahoo.com
+visitbox.de
+visual-pagerank.fr
+visualrevenue.com
+voicefive.com
+vpon.com
+vrs.cz
+vs.tucows.com
+vungle.com
+warlog.ru
+wdads.sx.atl.publicus.com
+web-stat.com
+web.informer.com
+web2.deja.com
+webads.co.nz
+webads.nl
+webangel.ru
+webcash.nl
+webcounter.cz
+webcounter.goweb.de
+webgains.com
+webmaster-partnerprogramme24.de
+webmasterplan.com
+webmasterplan.de
+weborama.fr
+webpower.com
+webreseau.com
+webseoanalytics.com
+websponsors.com
+webstat.channel4.com
+webstat.com
+webstat.net
+webstats4u.com
+webtrackerplus.com
+webtraffic.se
+webtraxx.de
+webtrendslive.com
+werbung.meteoxpress.com
+wetrack.it
+whaleads.com
+whenu.com
+whispa.com
+whoisonline.net
+wholesaletraffic.info
+widespace.com
+widgetbucks.com
+wikia-ads.wikia.com
+window.nixnet.cz
+wintricksbanner.googlepages.com
+witch-counter.de
+wlmarketing.com
+wmirk.ru
+wonderlandads.com
+wondoads.de
+woopra.com
+worldwide-cash.net
+wtlive.com
+www-banner.chat.ru
+www-google-analytics.l.google.com
+www.banner-link.com.br
+www.dnps.com
+www.kaplanindex.com
+www.money4exit.de
+www.photo-ads.co.uk
+www1.gto-media.com
+www8.glam.com
+wwwpromoter.com
+x-traceur.com
+x6.yakiuchi.com
+xchange.ro
+xclicks.net
+xertive.com
+xg4ken.com
+xiti.com
+xplusone.com
+xponsor.com
+xq1.net
+xrea.com
+xtendmedia.com
+xtremetop100.com
+xxxcounter.com
+xxxmyself.com
+y.ibsys.com
+yab-adimages.s3.amazonaws.com
+yabuka.com
+yadro.ru
+yesads.com
+yesadvertising.com
+yieldads.com
+yieldlab.net
+yieldmanager.com
+yieldmanager.net
+yieldmo.com
+yieldtraffic.com
+yoc.mobi
+yoggrt.com
+z5x.net
+zangocash.com
+zanox-affiliate.de
+zanox.com
+zantracker.com
+zedo.com
+zencudo.co.uk
+zenkreka.com
+zenzuu.com
+zeus.developershed.com
+zeusclicks.com
+zintext.com
+zmedia.com
+zv1.november-lax.com
+
diff --git a/app/src/main/res/raw/license_third_party.tpl b/app/src/main/res/raw/license_third_party.tpl
deleted file mode 100644
index 6aadb125..00000000
--- a/app/src/main/res/raw/license_third_party.tpl
+++ /dev/null
@@ -1,11 +0,0 @@
-NEWENTRY NetCipher
-https://github.com/guardianproject/NetCipher
-
-NEWENTRY ButterKnife
-https://jakewharton.github.io/butterknife
-
-NEWENTRY Android Support Library
-https://developer.android.com/topic/libraries/support-library/index.html
-
-NEWENTRY Android Design Library
-https://android-developers.blogspot.de/2015/05/android-design-support-library.html
diff --git a/app/src/main/res/raw/licenses_3rd_party.md b/app/src/main/res/raw/licenses_3rd_party.md
new file mode 100644
index 00000000..fce02fc6
--- /dev/null
+++ b/app/src/main/res/raw/licenses_3rd_party.md
@@ -0,0 +1,14 @@
+* NetCipher
+
+
+* ButterKnife
+
+
+* ShiftColorPicker
+
+
+* Android Support Library
+
+
+* Android Design Library
+
diff --git a/app/src/main/res/raw/maintainers.md b/app/src/main/res/raw/maintainers.md
new file mode 100644
index 00000000..7b1bc7f9
--- /dev/null
+++ b/app/src/main/res/raw/maintainers.md
@@ -0,0 +1,5 @@
+* Gregor Santner (gsantner)
+~° https://github.com/gsantner
+
+* Paul Schaub (vanitasvitae)
+~° https://github.com/vanitasvitae
diff --git a/app/src/main/res/raw/maintainers.tpl b/app/src/main/res/raw/maintainers.tpl
deleted file mode 100644
index 77be0317..00000000
--- a/app/src/main/res/raw/maintainers.tpl
+++ /dev/null
@@ -1,5 +0,0 @@
-NEWENTRY Gregor Santner (gsantner)
-SUBTABBY https://gsantner.github.io
-
-NEWENTRY Paul Schaub (vanitasvitae)
-SUBTABBY https://github.com/vanitasvitae
diff --git a/app/src/main/res/raw/podlist.json b/app/src/main/res/raw/podlist.json
new file mode 100644
index 00000000..817418e5
--- /dev/null
+++ b/app/src/main/res/raw/podlist.json
@@ -0,0 +1,1531 @@
+{
+ "pods": [
+ {
+ "score": 20,
+ "podUrls": [
+ {"host": "joindiaspora.com"},
+ {
+ "protocol": "http",
+ "port": 80,
+ "host": "diasporaaqmjixh5.onion"
+ }
+ ],
+ "name": "JoinDiaspora*",
+ "mainLangs": ["en"],
+ "id": 38077
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.geraspora.de"}],
+ "name": "Geraspora",
+ "mainLangs": ["de"],
+ "id": 24783
+ },
+ {
+ "score": 20,
+ "podUrls": [
+ {"host": "diasp.org"},
+ {"host": "diasporgc3d32vv4.onion"}
+ ],
+ "name": "diasporg*",
+ "mainLangs": [],
+ "id": 12688
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "framasphere.org"}],
+ "name": "Framasphere",
+ "mainLangs": [],
+ "id": 38776
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "nerdpol.ch"}],
+ "name": "nerdpol.ch*",
+ "mainLangs": ["de"],
+ "id": 17343
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "despora.de"}],
+ "name": "Despora*",
+ "mainLangs": ["de"],
+ "id": 6695
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.zone"}],
+ "name": "zone",
+ "mainLangs": [],
+ "id": 41976
+ },
+ {
+ "score": 20,
+ "podUrls": [
+ {"host": "sechat.org"},
+ {
+ "protocol": "http",
+ "port": 80,
+ "host": "sechatqpscuj2npx.onion"
+ }
+ ],
+ "name": "Sechat*",
+ "mainLangs": [],
+ "id": 6524
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.orkz.net"}],
+ "name": "orkz.net",
+ "mainLangs": [],
+ "id": 41604
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "poddery.com"}],
+ "name": "poddery.com",
+ "mainLangs": [],
+ "id": 36667
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.disroot.org"}],
+ "name": "disroot.org",
+ "mainLangs": [],
+ "id": 39828
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diasporabr.com.br"}],
+ "name": "diasporabr.com.br",
+ "mainLangs": [],
+ "id": 18248
+ },
+ {
+ "score": -22,
+ "podUrls": [{"host": "diaspora-fr.org"}],
+ "name": "diaspora-fr.org",
+ "mainLangs": [],
+ "id": 13909
+ },
+ {
+ "score": -22,
+ "podUrls": [{"host": "diasp.de"}],
+ "name": "diasp.de",
+ "mainLangs": ["de"],
+ "id": 46864
+ },
+ {
+ "score": 99,
+ "podUrls": [{"host": "diaspora.com.ar"}],
+ "name": "com.ar",
+ "mainLangs": [],
+ "id": 22994
+ },
+ {
+ "score": -22,
+ "podUrls": [{"host": "diasp.eu"}],
+ "name": "diasp.eu",
+ "mainLangs": [],
+ "id": 46423
+ },
+ {
+ "podUrls": [{"host": "berdaguermontes.eu"}],
+ "name": "berdaguermontes.eu",
+ "mainLangs": [],
+ "id": 25432
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "berlinspora.de"}],
+ "name": "berlinspora.de",
+ "mainLangs": ["de"],
+ "id": 38327
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "community.kanalinseln.de"}],
+ "name": "community.kanalinseln.de",
+ "mainLangs": ["de"],
+ "id": 37468
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "d.consumium.org"}],
+ "name": "d.consumium.org",
+ "mainLangs": [],
+ "id": 2107
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "dia.manuelbichler.at"}],
+ "name": "dia.manuelbichler.at",
+ "mainLangs": ["de"],
+ "id": 14817
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "dia.myocastor.de"}],
+ "name": "dia.myocastor.de",
+ "mainLangs": ["de"],
+ "id": 7190
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diapod.net"}],
+ "name": "diapod.net",
+ "mainLangs": [],
+ "id": 43611
+ },
+ {
+ "podUrls": [{"host": "diapod.org"}],
+ "name": "diapod.org",
+ "mainLangs": [],
+ "id": 13926
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diasp.ca"}],
+ "name": "diasp.ca",
+ "mainLangs": [],
+ "id": 40056
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diasp.cz"}],
+ "name": "diasp.cz",
+ "mainLangs": [],
+ "id": 21452
+ },
+ {
+ "podUrls": [{"host": "diasp.eu.com"}],
+ "name": "diasp.eu.com",
+ "mainLangs": [],
+ "id": 4343
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diasp.nl"}],
+ "name": "diasp.nl",
+ "mainLangs": ["nl"],
+ "id": 33262
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspod.de"}],
+ "name": "diaspod.de",
+ "mainLangs": ["de"],
+ "id": 2553
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.alfter.us"}],
+ "name": "alfter.us",
+ "mainLangs": ["en"],
+ "id": 13402
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.bohramt.de"}],
+ "name": "bohramt.de",
+ "mainLangs": ["de"],
+ "id": 8209
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.deadhexagon.com"}],
+ "name": "deadhexagon.com",
+ "mainLangs": [],
+ "id": 16721
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.digi-merc.org"}],
+ "name": "digi-merc.org",
+ "mainLangs": [],
+ "id": 13165
+ },
+ {
+ "podUrls": [{"host": "dorf-post.de"}],
+ "name": "dorf-post.de",
+ "mainLangs": ["de"],
+ "id": 43137
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.espiritolivre.org"}],
+ "name": "espiritolivre.org",
+ "mainLangs": [],
+ "id": 8690
+ },
+ {
+ "podUrls": [{"host": "diaspora.horwood.biz"}],
+ "name": "horwood.biz",
+ "mainLangs": [],
+ "id": 12684
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.hzsogood.net"}],
+ "name": "hzsogood.net",
+ "mainLangs": [],
+ "id": 3651
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.kapper.net"}],
+ "name": "kapper.net",
+ "mainLangs": [],
+ "id": 40765
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.koehn.com"}],
+ "name": "koehn.com",
+ "mainLangs": [],
+ "id": 25812
+ },
+ {
+ "podUrls": [{"host": "diaspora.kosebamse.com"}],
+ "name": "kosebamse.com",
+ "mainLangs": [],
+ "id": 15474
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.lebarjack.com"}],
+ "name": "lebarjack.com",
+ "mainLangs": [],
+ "id": 36540
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.microdata.co.uk"}],
+ "name": "microdata.co.uk",
+ "mainLangs": ["en"],
+ "id": 8704
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.moosje.nl"}],
+ "name": "moosje.nl",
+ "mainLangs": ["nl"],
+ "id": 45461
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.net.gr"}],
+ "name": "net.gr",
+ "mainLangs": [],
+ "id": 9863
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.permutationsofchaos.com"}],
+ "name": "permutationsofchaos.com",
+ "mainLangs": [],
+ "id": 1513
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.pimpmypony.eu"}],
+ "name": "pimpmypony.eu",
+ "mainLangs": [],
+ "id": 38497
+ },
+ {
+ "podUrls": [{"host": "diaspora.pingupod.de"}],
+ "name": "pingupod.de",
+ "mainLangs": ["de"],
+ "id": 10135
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.podzimek.org"}],
+ "name": "podzimek.org",
+ "mainLangs": [],
+ "id": 12139
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.poleni.com"}],
+ "name": "poleni.com",
+ "mainLangs": [],
+ "id": 1154
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.psyco.fr"}],
+ "name": "psyco.fr",
+ "mainLangs": ["fr"],
+ "id": 31397
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.raven-ip.com"}],
+ "name": "raven-ip.com",
+ "mainLangs": [],
+ "id": 17410
+ },
+ {
+ "podUrls": [{"host": "diaspora.retrodigital.net"}],
+ "name": "retrodigital.net",
+ "mainLangs": [],
+ "id": 24640
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.soh.re"}],
+ "name": "soh.re",
+ "mainLangs": [],
+ "id": 39183
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.subsignal.org"}],
+ "name": "subsignal.org",
+ "mainLangs": [],
+ "id": 22108
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.trash-talk.de"}],
+ "name": "trash-talk.de",
+ "mainLangs": ["de"],
+ "id": 46672
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.u4u.org"}],
+ "name": "u4u.org",
+ "mainLangs": [],
+ "id": 9278
+ },
+ {
+ "podUrls": [{"host": "diaspora.unixcorn.org"}],
+ "name": "unixcorn.org",
+ "mainLangs": [],
+ "id": 43416
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diasporabrazil.org"}],
+ "name": "diasporabrazil.org",
+ "mainLangs": [],
+ "id": 42422
+ },
+ {
+ "score": 51,
+ "podUrls": [{"host": "diasporapr.tk"}],
+ "name": "diasporapr.tk",
+ "mainLangs": [],
+ "id": 12020
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diasporing.ch"}],
+ "name": "Diasporing.ch",
+ "mainLangs": ["de"],
+ "id": 8471
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "distributed.chat"}],
+ "name": "distributed.chat",
+ "mainLangs": [],
+ "id": 43459
+ },
+ {
+ "score": -17,
+ "podUrls": [{"host": "espora.com.es"}],
+ "name": "espora.com.es",
+ "mainLangs": [],
+ "id": 11247
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "espora.social"}],
+ "name": "espora.social",
+ "mainLangs": [],
+ "id": 5948
+ },
+ {
+ "podUrls": [{"host": "failure.net"}],
+ "name": "failure.net",
+ "mainLangs": [],
+ "id": 41690
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "flokk.no"}],
+ "name": "flokk.no",
+ "mainLangs": [],
+ "id": 45658
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "freehuman.fr"}],
+ "name": "freehuman.fr",
+ "mainLangs": ["fr"],
+ "id": 21531
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "iliketoast.net"}],
+ "name": "iliketoast.net",
+ "mainLangs": [],
+ "id": 23287
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "jons.gr"}],
+ "name": "jons.gr",
+ "mainLangs": [],
+ "id": 41539
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "kapok.se"}],
+ "name": "kapok.se",
+ "mainLangs": [],
+ "id": 32786
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "karmasphe.re"}],
+ "name": "karmasphe.re",
+ "mainLangs": [],
+ "id": 20368
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "laba.mba"}],
+ "name": "laba.mba",
+ "mainLangs": [],
+ "id": 32393
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "liberdade.digital"}],
+ "name": "liberdade.digital",
+ "mainLangs": [],
+ "id": 40958
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "librenet.co.za"}],
+ "name": "librenet.co.za",
+ "mainLangs": [],
+ "id": 14862
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "librenet.gr"}],
+ "name": "librenet.gr",
+ "mainLangs": [],
+ "id": 27582
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "misamigos.online"}],
+ "name": "misamigos.online",
+ "mainLangs": [],
+ "id": 16366
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "mondiaspora.net"}],
+ "name": "mondiaspora.net",
+ "mainLangs": [],
+ "id": 3365
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "networkwizard.de"}],
+ "name": "networkwizard.de",
+ "mainLangs": ["de"],
+ "id": 47458
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "nx-pod.de"}],
+ "name": "nx-pod.de",
+ "mainLangs": ["de"],
+ "id": 14678
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pe.spbstu.ru"}],
+ "name": "pe.spbstu.ru",
+ "mainLangs": ["ru"],
+ "id": 39808
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.4ray.co"}],
+ "name": "4ray.co",
+ "mainLangs": [],
+ "id": 2522
+ },
+ {
+ "podUrls": [{"host": "pod.8n1.org"}],
+ "name": "8n1.org",
+ "mainLangs": [],
+ "id": 12504
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.alterworld.info"}],
+ "name": "alterworld.info",
+ "mainLangs": [],
+ "id": 1176
+ },
+ {
+ "podUrls": [{"host": "pod.asap-soft.com"}],
+ "name": "asap-soft.com",
+ "mainLangs": [],
+ "id": 49271
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.cannyfoxx.me"}],
+ "name": "cannyfoxx.me",
+ "mainLangs": [],
+ "id": 3505
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.cyberdungeon.de"}],
+ "name": "cyberdungeon.de",
+ "mainLangs": ["de"],
+ "id": 887
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.dapor.net"}],
+ "name": "dapor.net",
+ "mainLangs": [],
+ "id": 45578
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.datenknoten.me"}],
+ "name": "datenknoten.me",
+ "mainLangs": [],
+ "id": 34173
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.diaspora.software"}],
+ "name": "software",
+ "mainLangs": [],
+ "id": 33657
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.dirkomatik.de"}],
+ "name": "dirkomatik.de",
+ "mainLangs": ["de"],
+ "id": 47570
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.gedankenausbruch.com"}],
+ "name": "gedankenausbruch.com",
+ "mainLangs": [],
+ "id": 6893
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.gleisnetze.de"}],
+ "name": "gleisnetze.de",
+ "mainLangs": ["de"],
+ "id": 31471
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.goodsharing.at"}],
+ "name": "goodsharing.at",
+ "mainLangs": ["de"],
+ "id": 36615
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.hashtagueule.fr"}],
+ "name": "hashtagueule.fr",
+ "mainLangs": ["fr"],
+ "id": 10296
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.hoizi.net"}],
+ "name": "hoizi.net",
+ "mainLangs": [],
+ "id": 27479
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.itabs.nl"}],
+ "name": "itabs.nl",
+ "mainLangs": ["nl"],
+ "id": 15016
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.jpope.org"}],
+ "name": "jpope.org",
+ "mainLangs": [],
+ "id": 11674
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.liebeleu.de"}],
+ "name": "liebeleu.de",
+ "mainLangs": ["de"],
+ "id": 29566
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.nomorestars.com"}],
+ "name": "nomorestars.com",
+ "mainLangs": [],
+ "id": 31958
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.ponk.pink"}],
+ "name": "ponk.pink",
+ "mainLangs": [],
+ "id": 14849
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.promedol.com"}],
+ "name": "promedol.com",
+ "mainLangs": [],
+ "id": 21338
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.psynet.su"}],
+ "name": "psynet.su",
+ "mainLangs": [],
+ "id": 16045
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.roocita.com"}],
+ "name": "roocita.com",
+ "mainLangs": [],
+ "id": 47269
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.sertelon.fr"}],
+ "name": "sertelon.fr",
+ "mainLangs": ["fr"],
+ "id": 15234
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.storel.li"}],
+ "name": "storel.li",
+ "mainLangs": [],
+ "id": 33181
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.tchncs.de"}],
+ "name": "tchncs.de",
+ "mainLangs": ["de"],
+ "id": 20115
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.thomasdalichow.de"}],
+ "name": "thomasdalichow.de",
+ "mainLangs": ["de"],
+ "id": 12001
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.volt.io"}],
+ "name": "volt.io",
+ "mainLangs": [],
+ "id": 19139
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "podbay.net"}],
+ "name": "podbay.net",
+ "mainLangs": [],
+ "id": 16270
+ },
+ {
+ "podUrls": [{"host": "podricing.pw"}],
+ "name": "podricing.pw",
+ "mainLangs": [],
+ "id": 6398
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pubpod.alqualonde.org"}],
+ "name": "pubpod.alqualonde.org",
+ "mainLangs": [],
+ "id": 26555
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "revreso.de"}],
+ "name": "revreso.de",
+ "mainLangs": ["de"],
+ "id": 41788
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "ruhrspora.de"}],
+ "name": "ruhrspora.de",
+ "mainLangs": ["de"],
+ "id": 46198
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "russiandiaspora.org"}],
+ "name": "russiandiaspora.org",
+ "mainLangs": [],
+ "id": 22166
+ },
+ {
+ "podUrls": [{"host": "shrekislove.us"}],
+ "name": "shrekislove.us",
+ "mainLangs": ["en"],
+ "id": 39003
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "social.acclaro.digital"}],
+ "name": "acclaro.digital",
+ "mainLangs": [],
+ "id": 33853
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "social.baldr.io"}],
+ "name": "baldr.io",
+ "mainLangs": [],
+ "id": 7781
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "social.daxbau.net"}],
+ "name": "daxbau.net",
+ "mainLangs": [],
+ "id": 37517
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "social.elaon.de"}],
+ "name": "elaon.de",
+ "mainLangs": ["de"],
+ "id": 30112
+ },
+ {
+ "podUrls": [{"host": "social.lanham.id.au"}],
+ "name": "lanham.id.au",
+ "mainLangs": [],
+ "id": 48421
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "social.mbuto.me"}],
+ "name": "mbuto.me",
+ "mainLangs": [],
+ "id": 18258
+ },
+ {
+ "score": 95,
+ "podUrls": [{"host": "socializer.cc"}],
+ "name": "socializer.cc",
+ "mainLangs": [],
+ "id": 30584
+ },
+ {
+ "podUrls": [{"host": "spora.zone"}],
+ "name": "spora.zone",
+ "mainLangs": [],
+ "id": 24735
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "subvillage.de"}],
+ "name": "subvillage.de",
+ "mainLangs": ["de"],
+ "id": 29359
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "sysad.org"}],
+ "name": "sysad.org",
+ "mainLangs": [],
+ "id": 45830
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "teki.be"}],
+ "name": "teki.be",
+ "mainLangs": [],
+ "id": 5276
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "therealtalk.org"}],
+ "name": "therealtalk.org",
+ "mainLangs": [],
+ "id": 26786
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "thinkopen.net"}],
+ "name": "thinkopen.net",
+ "mainLangs": [],
+ "id": 7366
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "tippentappen.de"}],
+ "name": "tippentappen.de",
+ "mainLangs": ["de"],
+ "id": 622
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "whatsnewz.com"}],
+ "name": "whatsnewz.com",
+ "mainLangs": [],
+ "id": 5842
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "wk3.org"}],
+ "name": "wk3.org",
+ "mainLangs": [],
+ "id": 39292
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "www.datataffel.dk"}],
+ "name": "datataffel.dk",
+ "mainLangs": [],
+ "id": 35984
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "www.diasporaix.de"}],
+ "name": "diasporaix.de",
+ "mainLangs": ["de"],
+ "id": 26219
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.hofud.com"}],
+ "name": "hofud.com",
+ "mainLangs": [],
+ "id": 10983
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspora.softwarelivre.org"}],
+ "name": "softwarelivre.org",
+ "mainLangs": [],
+ "id": 33510
+ },
+ {
+ "score": 39,
+ "podUrls": [{"host": "confetticake.club"}],
+ "name": "confetticake.club",
+ "mainLangs": [],
+ "id": 41623
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "diaspote.org"}],
+ "name": "diaspote.org",
+ "mainLangs": [],
+ "id": 33317
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "pod.userzap.de"}],
+ "name": "userzap.de",
+ "mainLangs": ["de"],
+ "id": 12816
+ },
+ {
+ "score": 20,
+ "podUrls": [{"host": "www.vodeoo.com"}],
+ "name": "vodeoo.com",
+ "mainLangs": [],
+ "id": 5856
+ },
+ {
+ "podUrls": [{"host": "diaspora.punkbeer.me"}],
+ "name": "punkbeer.me",
+ "mainLangs": [],
+ "id": 16609
+ },
+ {
+ "podUrls": [{"host": "ingtech.net"}],
+ "name": "ingtech.net",
+ "mainLangs": [],
+ "id": 13051
+ },
+ {
+ "podUrls": [{"host": "mmkr.co"}],
+ "name": "mmkr.co",
+ "mainLangs": [],
+ "id": 30787
+ },
+ {
+ "podUrls": [{"host": "pod.kneedrag.org"}],
+ "name": "kneedrag.org",
+ "mainLangs": [],
+ "id": 24936
+ },
+ {
+ "podUrls": [{"host": "spyurk.am"}],
+ "name": "Spyurk",
+ "mainLangs": [],
+ "id": 24921
+ },
+ {
+ "podUrls": [{"host": "pod.mew.cat"}],
+ "name": "mew.cat",
+ "mainLangs": [],
+ "id": 10609
+ },
+ {
+ "podUrls": [{"host": "dfhz.tk"}],
+ "name": "dfhz.tk",
+ "mainLangs": [],
+ "id": 17389
+ },
+ {
+ "podUrls": [{"host": "netiz.in"}],
+ "name": "netiz.in",
+ "mainLangs": ["in"],
+ "id": 26206
+ },
+ {
+ "score": 98,
+ "podUrls": [{"host": "pod1.orobouros.net"}],
+ "name": "pod1.orobouros.net",
+ "mainLangs": [],
+ "id": 41891
+ },
+ {
+ "podUrls": [{"host": "witchcraft.ml"}],
+ "name": "witchcraft.ml",
+ "mainLangs": [],
+ "id": 37791
+ },
+ {
+ "score": 40,
+ "podUrls": [{"host": "libellula.criptica.org"}],
+ "name": "libellula.criptica.org",
+ "mainLangs": [],
+ "id": 36850
+ },
+ {
+ "podUrls": [{"host": "pod.datamol.org"}],
+ "name": "datamol.org",
+ "mainLangs": [],
+ "id": 31476
+ },
+ {
+ "podUrls": [{"host": "social.berdaguermontes.eu"}],
+ "name": "berdaguermontes.eu",
+ "mainLangs": [],
+ "id": 47620
+ },
+ {
+ "podUrls": [{"host": "mh8.lat-clan.fr"}],
+ "name": "mh8.lat-clan.fr",
+ "mainLangs": ["fr"],
+ "id": 25711
+ },
+ {
+ "score": 55,
+ "podUrls": [{"host": "dp.lumy.me"}],
+ "name": "dp.lumy.me",
+ "mainLangs": [],
+ "id": 37629
+ },
+ {
+ "podUrls": [{"host": "social.souvenirfromlife.fr"}],
+ "name": "souvenirfromlife.fr",
+ "mainLangs": ["fr"],
+ "id": 22180
+ },
+ {
+ "podUrls": [{"host": "diaspora.mokrynskyi.com"}],
+ "name": "mokrynskyi.com",
+ "mainLangs": [],
+ "id": 24363
+ },
+ {
+ "score": 40,
+ "podUrls": [{"host": "hub.transition-regensburg.de"}],
+ "name": "hub.transition-regensburg.de",
+ "mainLangs": ["de"],
+ "id": 3300
+ },
+ {
+ "podUrls": [{"host": "co.zy.lc"}],
+ "name": "co.zy.lc",
+ "mainLangs": [],
+ "id": 31291
+ },
+ {
+ "podUrls": [{"host": "diaspora.treefish.org"}],
+ "name": "treefish.org",
+ "mainLangs": [],
+ "id": 37210
+ },
+ {
+ "podUrls": [{"host": "diaspora.bke.ro"}],
+ "name": "bke.ro",
+ "mainLangs": [],
+ "id": 43350
+ },
+ {
+ "podUrls": [{"host": "pod.sd.vc"}],
+ "name": "sd.vc",
+ "mainLangs": [],
+ "id": 3302
+ },
+ {
+ "podUrls": [{"host": "diaspora.cxx.rocks"}],
+ "name": "cxx.rocks",
+ "mainLangs": [],
+ "id": 20172
+ },
+ {
+ "podUrls": [{"host": "social.homenet.org"}],
+ "name": "homenet.org",
+ "mainLangs": [],
+ "id": 48291
+ },
+ {
+ "podUrls": [{"host": "social.cigliola.com"}],
+ "name": "cigliola.com",
+ "mainLangs": [],
+ "id": 31082
+ },
+ {
+ "podUrls": [{"host": "friaspora.tk"}],
+ "name": "friaspora.tk",
+ "mainLangs": [],
+ "id": 32711
+ },
+ {
+ "podUrls": [{"host": "pod.lasserh.dk"}],
+ "name": "lasserh.dk",
+ "mainLangs": [],
+ "id": 29141
+ },
+ {
+ "podUrls": [{"host": "hubz.tk"}],
+ "name": "hubz.tk",
+ "mainLangs": [],
+ "id": 31332
+ },
+ {
+ "podUrls": [{"host": "hubzilla.kosebamse.com"}],
+ "name": "hubzilla.kosebamse.com",
+ "mainLangs": [],
+ "id": 19953
+ },
+ {
+ "podUrls": [{"host": "driaans.nl"}],
+ "name": "driaans.nl",
+ "mainLangs": ["nl"],
+ "id": 6488
+ },
+ {
+ "podUrls": [{"host": "dispersio.us"}],
+ "name": "dispersio.us",
+ "mainLangs": ["en"],
+ "id": 9
+ },
+ {
+ "podUrls": [{"host": "go.lookbehind.eu"}],
+ "name": "go.lookbehind.eu",
+ "mainLangs": [],
+ "id": 39260
+ },
+ {
+ "podUrls": [{"host": "diasp.ot-si.com"}],
+ "name": "diasp.ot-si.com",
+ "mainLangs": [],
+ "id": 1100
+ },
+ {
+ "score": 99,
+ "podUrls": [{"host": "diaspora.crossfamilyweb.com"}],
+ "name": "crossfamilyweb.com",
+ "mainLangs": [],
+ "id": 10816
+ },
+ {
+ "podUrls": [{"host": "hub.aoeu.me"}],
+ "name": "hub.aoeu.me",
+ "mainLangs": [],
+ "id": 22535
+ },
+ {
+ "podUrls": [{"host": "dia.pwn.ninja"}],
+ "name": "dia.pwn.ninja",
+ "mainLangs": [],
+ "id": 41416
+ },
+ {
+ "podUrls": [{"host": "3ogsbs3vuvapgg37.onion.to"}],
+ "name": "3ogsbs3vuvapgg37.onion.to",
+ "mainLangs": [],
+ "id": 43975
+ },
+ {
+ "podUrls": [{"host": "hubz.secretlair.me"}],
+ "name": "hubz.secretlair.me",
+ "mainLangs": [],
+ "id": 31412
+ },
+ {
+ "podUrls": [{"host": "got.noip.me"}],
+ "name": "got.noip.me",
+ "mainLangs": [],
+ "id": 24638
+ },
+ {
+ "podUrls": [{"host": "pod.bitcast.info"}],
+ "name": "bitcast.info",
+ "mainLangs": [],
+ "id": 31132
+ },
+ {
+ "podUrls": [{"host": "f.tschlotfeldt.de"}],
+ "name": "f.tschlotfeldt.de",
+ "mainLangs": ["de"],
+ "id": 12221
+ },
+ {
+ "podUrls": [{"host": "hubloq.net"}],
+ "name": "hubloq.net",
+ "mainLangs": [],
+ "id": 41618
+ },
+ {
+ "podUrls": [{"host": "hubzilla.kneedrag.org"}],
+ "name": "hubzilla.kneedrag.org",
+ "mainLangs": [],
+ "id": 38463
+ },
+ {
+ "podUrls": [{"host": "gesichtsbu.ch"}],
+ "name": "gesichtsbu.ch",
+ "mainLangs": ["de"],
+ "id": 47552
+ },
+ {
+ "podUrls": [{"host": "hubzi.fraengii.de"}],
+ "name": "hubzi.fraengii.de",
+ "mainLangs": ["de"],
+ "id": 40845
+ },
+ {
+ "podUrls": [{"host": "friendica.narf.ssji.net"}],
+ "name": "friendica.narf.ssji.net",
+ "mainLangs": [],
+ "id": 37056
+ },
+ {
+ "podUrls": [{"host": "durohr.de"}],
+ "name": "durohr.de",
+ "mainLangs": ["de"],
+ "id": 48207
+ },
+ {
+ "podUrls": [{"host": "0kcg.com"}],
+ "name": "0kcg.com",
+ "mainLangs": [],
+ "id": 9891
+ },
+ {
+ "podUrls": [{"host": "aegibson.me"}],
+ "name": "aegibson.me",
+ "mainLangs": [],
+ "id": 45381
+ },
+ {
+ "podUrls": [{"host": "redmatrix.us"}],
+ "name": "redmatrix.us",
+ "mainLangs": ["en"],
+ "id": 28470
+ },
+ {
+ "podUrls": [{"host": "15o2.de"}],
+ "name": "15o2.de",
+ "mainLangs": ["de"],
+ "id": 10262
+ },
+ {
+ "podUrls": [{"host": "upt.social"}],
+ "name": "upt.social",
+ "mainLangs": [],
+ "id": 22385
+ },
+ {
+ "podUrls": [{"host": "friendica.bohrshouse.com"}],
+ "name": "friendica.bohrshouse.com",
+ "mainLangs": [],
+ "id": 9771
+ },
+ {
+ "podUrls": [{"host": "hubzilla.site"}],
+ "name": "hubzilla.site",
+ "mainLangs": [],
+ "id": 12050
+ },
+ {
+ "podUrls": [{"host": "hubzilla.zavb.de"}],
+ "name": "hubzilla.zavb.de",
+ "mainLangs": ["de"],
+ "id": 16156
+ },
+ {
+ "podUrls": [{"host": "diaspora.aeriesguard.com"}],
+ "name": "aeriesguard.com",
+ "mainLangs": [],
+ "id": 25987
+ },
+ {
+ "podUrls": [{"host": "pod.cornify.de"}],
+ "name": "cornify.de",
+ "mainLangs": ["de"],
+ "id": 46021
+ },
+ {
+ "podUrls": [{"host": "hochminuseins.net"}],
+ "name": "hochminuseins.net",
+ "mainLangs": [],
+ "id": 27013
+ },
+ {
+ "podUrls": [{"host": "thecrimsontint.com"}],
+ "name": "thecrimsontint.com",
+ "mainLangs": [],
+ "id": 44004
+ },
+ {
+ "podUrls": [{"host": "diaspora.clubelek.fr"}],
+ "name": "clubelek.fr",
+ "mainLangs": ["fr"],
+ "id": 48494
+ },
+ {
+ "podUrls": [{"host": "teamhubzilla.org"}],
+ "name": "teamhubzilla.org",
+ "mainLangs": [],
+ "id": 35346
+ },
+ {
+ "podUrls": [{"host": "diaspora.schlimme.net"}],
+ "name": "schlimme.net",
+ "mainLangs": [],
+ "id": 33506
+ },
+ {
+ "podUrls": [{"host": "www.wiwiec.com"}],
+ "name": "wiwiec.com",
+ "mainLangs": [],
+ "id": 14764
+ },
+ {
+ "podUrls": [{"host": "diasp.danletard.de"}],
+ "name": "diasp.danletard.de",
+ "mainLangs": ["de"],
+ "id": 38252
+ },
+ {
+ "podUrls": [{"host": "libertypod.com"}],
+ "name": "libertypod.com",
+ "mainLangs": [],
+ "id": 47484
+ },
+ {
+ "podUrls": [{"host": "hubzilla.pskosinski.pl"}],
+ "name": "hubzilla.pskosinski.pl",
+ "mainLangs": [],
+ "id": 49996
+ },
+ {
+ "podUrls": [{"host": "pod.juvenesco.eu"}],
+ "name": "juvenesco.eu",
+ "mainLangs": [],
+ "id": 35432
+ },
+ {
+ "score": 99,
+ "podUrls": [{"host": "pirati.ca"}],
+ "name": "pirati.ca",
+ "mainLangs": [],
+ "id": 7832
+ },
+ {
+ "podUrls": [{"host": "diasp.sk"}],
+ "name": "diasp.sk",
+ "mainLangs": [],
+ "id": 42123
+ },
+ {
+ "podUrls": [{"host": "f.libreden.net"}],
+ "name": "f.libreden.net",
+ "mainLangs": [],
+ "id": 28236
+ },
+ {
+ "podUrls": [{"host": "pod.mausdompteur.de"}],
+ "name": "mausdompteur.de",
+ "mainLangs": ["de"],
+ "id": 22517
+ },
+ {
+ "podUrls": [{"host": "diaspora.raitisoja.com"}],
+ "name": "raitisoja.com",
+ "mainLangs": [],
+ "id": 13163
+ },
+ {
+ "score": 99,
+ "podUrls": [{"host": "squeet.me"}],
+ "name": "squeet.me",
+ "mainLangs": [],
+ "id": 33979
+ },
+ {
+ "podUrls": [{"host": "pod.kakise.xyz"}],
+ "name": "kakise.xyz",
+ "mainLangs": [],
+ "id": 15607
+ },
+ {
+ "podUrls": [{"host": "pod.diasporacaribe.org"}],
+ "name": "diasporacaribe.org",
+ "mainLangs": [],
+ "id": 5615
+ },
+ {
+ "podUrls": [{"host": "hub.feder8.ru"}],
+ "name": "hub.feder8.ru",
+ "mainLangs": ["ru"],
+ "id": 451
+ },
+ {
+ "podUrls": [{"host": "hubzilla.a-zwenkau.de"}],
+ "name": "hubzilla.a-zwenkau.de",
+ "mainLangs": ["de"],
+ "id": 973
+ },
+ {
+ "podUrls": [{"host": "social.punkbeer.me"}],
+ "name": "punkbeer.me",
+ "mainLangs": [],
+ "id": 9210
+ },
+ {
+ "podUrls": [{"host": "pod.sapient.fun"}],
+ "name": "sapient.fun",
+ "mainLangs": [],
+ "id": 12715
+ },
+ {
+ "podUrls": [{"host": "pod.phantasie.cc"}],
+ "name": "phantasie.cc",
+ "mainLangs": [],
+ "id": 17966
+ },
+ {
+ "podUrls": [{"host": "diaspora.masharih.me"}],
+ "name": "masharih.me",
+ "mainLangs": [],
+ "id": 33148
+ },
+ {
+ "podUrls": [{"host": "hub.mariovavti.com"}],
+ "name": "hub.mariovavti.com",
+ "mainLangs": [],
+ "id": 43393
+ },
+ {
+ "podUrls": [{"host": "social.patur.in"}],
+ "name": "patur.in",
+ "mainLangs": ["in"],
+ "id": 35985
+ },
+ {
+ "podUrls": [{"host": "jeroenpraat.nl"}],
+ "name": "jeroenpraat.nl",
+ "mainLangs": ["nl"],
+ "id": 12243
+ },
+ {
+ "podUrls": [{"host": "grindcore.ch"}],
+ "name": "grindcore.ch",
+ "mainLangs": ["de"],
+ "id": 8505
+ },
+ {
+ "podUrls": [{"host": "pod.vixiv.net"}],
+ "name": "vixiv.net",
+ "mainLangs": [],
+ "id": 22599
+ },
+ {
+ "podUrls": [{"host": "social.deuxfleurs.fr"}],
+ "name": "deuxfleurs.fr",
+ "mainLangs": ["fr"],
+ "id": 19227
+ },
+ {
+ "podUrls": [{"host": "parlementum.net"}],
+ "name": "parlementum.net",
+ "mainLangs": [],
+ "id": 8591
+ },
+ {
+ "podUrls": [{"host": "villianbook.com"}],
+ "name": "villianbook.com",
+ "mainLangs": [],
+ "id": 40782
+ },
+ {
+ "podUrls": [{"host": "frolix8.asia"}],
+ "name": "frolix8.asia",
+ "mainLangs": [],
+ "id": 14385
+ },
+ {
+ "podUrls": [{"host": "hub.vilarejo.pro.br"}],
+ "name": "hub.vilarejo.pro.br",
+ "mainLangs": [],
+ "id": 45914
+ },
+ {
+ "podUrls": [{"host": "social.vixiv.net"}],
+ "name": "vixiv.net",
+ "mainLangs": [],
+ "id": 13922
+ }
+ ],
+ "timestamp": 1502656297127
+}
diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml
new file mode 100644
index 00000000..4e4a8035
--- /dev/null
+++ b/app/src/main/res/values-af/strings.xml
@@ -0,0 +1,157 @@
+
+
+
+ Maak navigasie balk oop
+ Sluit navigasie balk
+ Herlaai
+ Sluit
+ Kanselleer
+
+ Instellings
+ Kennisgewings
+ Gesprekke
+ Stroom
+ Profiel
+ Aspekte
+ Aktiwiteite
+ Hou van
+ Opgemerk
+ Aantal keer genoem
+ Publiek
+ Soek
+ Kontakte
+ Verandering-log
+ Statistiek
+
+ Alle kennisgewings
+ Ook Opgemerk
+ Lewer kommentaar op hierdie plasing
+ Hou van
+ Aantal keer genoem
+ Herdeel
+ Begin deel
+
+ Fout: Kon nie lys van pods verkry nie!
+ Bevestiging
+ Wil jy uitgaan?
+
+ Meer
+ Omtrent | Hulp
+ Gevolgde merkers
+ Publieke aktiwiteite
+ Verslae
+ Deel skakel as teks
+ Deel vriesbeeld van webbladsy
+ Neem vriesbeeld van webbladsy
+ Stoor beeld na
+ Stoor vriesbeeld as:
+ Skakel adres gekopieer…
+ Nuwe Plasing
+ Gaan tot bo
+ Soek met merkers of persone
+ Verlaat toep
+ Wissel Mobiele/Monitor oogpunt
+ Deel…
+ met merkers
+ met mense
+ Voer asseblief \'n naam in
+ Deel skakel adres
+ Stoor beeld
+ Deel beeld
+ Maak in eksterne webleser oop…
+ Kopieer skakel adres na knipbord
+ Kopieer beeld adres na knipbord
+
+ Kon nie beeld laai nie
+
+ Toestemming geweier.
+ Pod naam
+ Protokol
+ Pod adres
+ Vermiste waarde
+ Versteek status balk
+ Wys titel
+
+
+ Voorkoms
+ Netwerk
+ Pod verstellings
+
+
+ Gebruiker
+ Algemeen
+ Admin
+
+ Tema en kleure
+ Primêre kleur
+ Kleur van die nutsbalke
+ Kontras kleur
+ Kleur van die vorderingsbalk
+ AMOLED modus
+
+ Uitgebreide Kennisgewings
+ Taal
+
+ Fontgrootte
+ Normaal
+ Groot
+ Masief
+
+ Laai beelde
+
+ Skerm Rotasie
+ Beheer outomatiese skermrotasie
+ Verstek
+ Portret
+ Landskap
+
+ Laai Tor voorkeure
+ Volmag
+ Gasheer
+ Poort
+ Toep moet herlaai om volmag te deaktiveer
+ Orbot volmag voorkeure gelaai
+
+
+ Persoonlike instellings
+ Bestuur Hutsmerke
+ Onvolg Hutsmerke
+ Verander rekening
+ Vee Buffer
+ Vee WebBuffer skoon
+
+ Diverse
+ Volle herstel
+ Blok advertensies
+ Omtrent
+ Lisensie
+ Ontfouting
+ Toepassing
+ Toestel
+ diaspora * Pod
+ Tope weergawe: %1$s
+ Android Weergawe%1$s
+ Toestel naam%1$s
+ Kodenaam: %1$s
+ Pod profiel naam: %1$s
+ Pod domein: %1$s
+ Verkry die bron
+ Vertaal hierdie Toep!
+ Die toepassing is nie in jou taal beskikbaar? Jy kan dit verander! Hoekom help jy ons nie met die vertaling nie? Ons gebruik Stringlate om enigiemand te help om toepassing te vertaal.
+ Laat ek vertaal
+ Gee terugvoer!
+ dandelion * is nog in ontwikkeling, so as jy voorstelle of enige soort terugvoer het, gebruik asseblief ons probleem volger laat ons weet!
+ Raporteer foute
+ Deel die toep
+ Haai! Loer na #dandelion! %1$s
+
+ Handhawers
+ %1$s<br><br>baie dankie!
+ GNU GPLv3+ Lisensie
+ Derdeparty biblioteke
+ Vertel my meer
+ Bemagtig om Youtube links oop te maak in eksterne Toeps
+ Youtube links
+ Verander die tema van jou rekening
+ Trek om te verfris
+
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
new file mode 100644
index 00000000..d09bf9c8
--- /dev/null
+++ b/app/src/main/res/values-ar/strings.xml
@@ -0,0 +1,41 @@
+
+
+
+
+ إعدادات
+ بحث
+ سِجل التغييرات
+
+
+
+ المزيد
+ مشاركة
+
+
+ اخفاء شريط الاشعارات
+ إظهار العنوان
+
+
+ المظهر
+
+
+ عام
+
+
+ تغيير لغة التطبيق. اعد فتح التطبيق لتفعيل التغيير
+ اللّغة
+
+
+
+ افتراضي
+
+
+
+ مسح ذاكرة التخزين المؤقت
+
+ أخرى
+ عن التطبيق
+ ترخيص
+
+ المساهمون
+
diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml
new file mode 100644
index 00000000..43d88f4b
--- /dev/null
+++ b/app/src/main/res/values-az/strings.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
new file mode 100644
index 00000000..43d88f4b
--- /dev/null
+++ b/app/src/main/res/values-bg/strings.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml
new file mode 100644
index 00000000..43d88f4b
--- /dev/null
+++ b/app/src/main/res/values-bn/strings.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml
new file mode 100644
index 00000000..51109f4f
--- /dev/null
+++ b/app/src/main/res/values-bs/strings.xml
@@ -0,0 +1,41 @@
+
+
+
+ Otvori navigacijsku ladicu
+ Zatvorite navigacijsku ladicu
+ Zatvori
+ Otkaži
+
+ Podešavanja
+ Traži
+ Popis izmjena
+
+
+
+ Više
+
+
+ Sakrij statusnu traku
+
+
+ Izgled
+
+
+ Opće
+
+
+ Promijeni jezik programa. Iznova pokrenite program da aktivirate promjenu
+ Jezik
+
+
+
+ Osnovni
+
+
+
+
+ Razno
+ O programu
+
+ Saradnici
+
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
new file mode 100644
index 00000000..3ad40c44
--- /dev/null
+++ b/app/src/main/res/values-ca/strings.xml
@@ -0,0 +1,209 @@
+
+
+
+ Obre el calaix de navegació
+ Tanca el calaix de navegació
+ Recarrega
+ Tanca
+ Cancel·la
+
+ Configuració
+ Notificacions
+ Conversacions
+ Transmissió
+ Perfil
+ Aspectes
+ Activitats
+ M\'ha agradat
+ Comentat
+ Mencions
+ Públic
+ Cerca
+ Contactes
+ Novetats
+ Estadístiques
+
+ Totes les notificacions
+ També s\'ha comentat
+ Comenta sobre la publicació
+ M\'ha agradat
+ Mencionat
+ Recompartit
+ S\'ha iniciat la compartició
+
+ Error: No s\'ha pogut recuperar la llista de pods!
+ Cal que us connecteu a Internet per continuar
+ Confirmació
+ Voleu sortir?
+
+ Més
+ Quant a | Ajuda
+ Etiquetes seguides
+ Activitats públiques
+ Informes
+ Comparteix l\'enllaç com a text
+ Comparteix la captura de pantalla de la pàgina web
+ Feu una captura de pantalla de la pàgina web
+ S\'està desant la imatge per a
+ S\'està desant la captura de pantalla com:
+ S\'ha copiat l\'adreça de l\'enllaç…
+ Nova publicació
+ Vés a l\'inici
+ Cerca per etiquetes o persones
+ Surt de l\'aplicació
+ Commuta la vista de mòbils/escriptori
+ Comparteix…
+ per etiquetes
+ per persones
+ Afegiu un nom
+ Comparteix l\'adreça de l\'enllaç
+ Desa la imatge
+ Comparteix la imatge
+ Obre en un navegador extern…
+ Copia l\'adreça de l\'enllaç al porta-retalls
+ Copia l\'adreça de la imatge al porta-retalls
+
+ No s\'ha pogut carregar la imatge
+
+ Cal que concediu «Accés al permís d\'emmagatzematge» per desar captures de pantalla. Després, hauríeu de tancar l\'aplicació completament o reiniciar el dispositiu. Si no concediu l\'accés a l\'emmagatzematge, però voleu utilitzar la funció de captura de pantalla més endavant, podeu concedir el permís més endavant.
+Aneu a: Configuració del sistema - Aplicacions - dandelion*. A la secció de permisos podeu concedir el «permís d\'emmagatzematge d\'escriptura».
+ Cal que concediu «Accés al permís d\'emmagatzematge» per desar/penjar imatges. Després, hauríeu de tancar l\'aplicació completament o reiniciar el dispositiu. Si no concediu l\'accés a l\'emmagatzematge, però voleu desar imatges més endavant, podeu concedir el permís més endavant. Aneu a: Configuració del sistema - Aplicacions - dandelion*. A la secció de permisos podeu concedir el «permís d\'emmagatzematge d\'escriptura».
+ Permís denegat.
+ Permís concedit. Torneu-ho a provar.
+ Pod personalitzat
+ Nom del pod
+ Protocol
+ Adreça del pod
+ Falta el valor
+ Voleu saltar a la última pàgina visitada?
+ Amaga la barra d\'estat a la vista principal
+ Amaga la barra d\'estat
+ Mostra el títol a la vista principal
+ Mostra el títol
+ Drecera del llançador
+
+ La barra d\'eines superior carrega la transmissió
+ Feu clic a un espai buit a la barra d\'eines superior per obrir la transmissió
+
+ Aparença
+ Xarxa
+ Configuració del pod
+ Operabilitat
+
+
+ Control lliscant de navegació
+ Controleu la visibilitat de les entrades al calaix de navegació
+ Usuari
+ General
+ Administrador/a
+
+ Tema i colors
+ Controleu quins colors s\'utilitzen a tota l\'aplicació
+ Color primari
+ Color de les barres d\'eines
+ Color d\'èmfasi
+ Color de la barra de progrés
+ Mode AMOLED
+ Substitueix el color amb la pantalla AMOLED compatible amb el negre en moltes parts de l\'aplicació. Cal reiniciar per canviar aquesta configuració. Per explorar diaspora* en la foscor, també heu d\'activar el tema fosc, que es pot trobar en la configuració del compte personal de diaspora*.
+
+ Notificacions ampliades
+ Amplieu la campana de notificacions amb un menú desplegable que mostra les categories de notificacions
+ Canvieu l\'idioma d\'aquesta aplicació. Reinicieu l\'aplicació perquè els canvis tinguin efecte
+ Idioma
+ Idioma del sistema
+
+ Controla la mida del text de WebView
+ Mida de la lletra
+ Normal
+ Gran
+ Enorme
+
+ Carrega imatges
+ Commuta la càrrega d\'imatges a p. ex. estalvia dades mòbils
+
+ Rotació de pantalla
+ Control automàtic de la rotació de la pantalla
+ Per defecte
+ Sensor\n(ignora la configuració del sistema)
+ Vertical
+ Horitzontal
+
+ Carrega Tor per defecte
+ Carrega la configuració del servidor intermediari per a Proxy HTTP (Orbot)
+ Servidor intermediari
+ Activa el servidor intermediari
+ Trànsit del servidor intermediari de dandelion* evadint el tallafocs.\nPot requerir reinici. Això podria no funcionar en alguns telèfons.
+ Amfitrió
+ Port
+ L\'aplicació necessita reiniciar-se per desactivar l\'ús del servidor intermediari
+ S\'ha carregat la configuració per defecte de l\'Orbot
+
+ Obre els enllaços externs amb les pestanyes personalitzades de Chrome. S\'ha d\'instal·lar Chromium, Firefox o Google Chrome per poder utilitzar aquesta funció. \nNOTA IMPORTANT: Les pestanyes personalitzades de Chrome no utilitzen servidors intermediaris configurats!
+
+ Configuració personal
+ Obre la configuració del compte diaspora*
+ Gestioneu la vostra llista de contactes
+ Gestioneu les etiquetes
+ Deixa de seguir les etiquetes seguides
+ Canvia de compte
+ Esborra les dades locals de la sessió i canvia a un altre pod /compte diaspora*
+ Això esborrarà totes les galetes i les dades de sessió. Esteu segur que voleu canviar el vostre compte?
+ Esborra la memòria cau
+ Esborra la memòria cau de WebView
+ Amaga automàticament les barres d\'eines superior i inferior mentre es desplaça
+ Barra d\'eines «Intellihide»
+ Afegeix compartit per avís
+ Afegiu una referència a aquesta aplicació als textos compartits: [via #dandelion]
+
+ Divers
+ Reinici complet
+ Esborra localment totes les configuracions relacionades amb l\'aplicació i tanca les sessions de tots els comptes
+ Això restablirà tots els paràmetres modificats de l\'aplicació als valors per defecte i es desconnectarà de tots els pods. Les vostres imatges baixades romandran intactes. Esteu segur que voleu continuar?
+ Activa el bloqueig d\'anuncis bàsic. Anuncis que es poden incloure p. ex. en vistes integrades
+ Bloqueja anuncis
+ Quant a
+ Llicècia
+ Depuració
+ Aplicació
+ Dispositiu
+ Pod de diaspora*
+ Registre de depuració
+ Registre de depuració (detallat)
+ Versió de l\'aplicació: %1$s
+ Versió d\'Android: %1$s
+ Nom del dispositiu: %1$s
+ Nom en clau: %1$s
+ Nom de perfil del pod: %1$s
+ Domini del pod: %1$s
+ S\'ha copiat el registre de depuració al porta-retalls
+ dandelion* és el seu complement per a navegar per la xarxa social diapora*. Afegeix característiques com útils barres d\'eines i suport per a servidors intermediaris com la xarxa Tor a la seva experiència social.
+ Contribuïu amb codi!
+ dandelion* es desenvolupa lliurement, en el sentit de llibertat, i segueix les idees del projecte
+diaspora*. Si voleu contribuir, endavant! Actualment som un equip molt petit, de manera que us agrairíem molt qualsevol tipus d\'ajuda!
+ Obtén el codi font
+ Traduïu l\'aplicació!
+ L\'aplicació no està disponible en el vostre idioma? Podeu canviar això! Per què no ens ajudeu a traduir-la? Utilitzem Stringlate perquè qualsevol persona pugui traduir l\'aplicació.
+ Permeteu-me traduir
+ Valoreu-nos!
+ dandelion* encara està en desenvolupament, així que si teniu suggeriments o qualsevol tipus de comentari, feu servir el nostre gestor d\'errors per informar-nos-en!
+ Informe d\'errors
+ Difoneu aquest projecte
+ Parleu als vostres amics i familiars sobre diaspora* i #dandelion! Per què no difoneu les vostres experiències? Ens encantaria escoltar-les!
+ Comparteix l\'aplicació
+ Ep! Doneu un cop d\'ull a #dandelion! %1$s
+
+ Mantenidors
+ Aquesta aplicació està sent desenvolupada i mantinguda per <br><br>%1$s
+ Col·laboradors
+ ¡%1$s < br >< br > Gràcies!
+ Llicència GNU GPLv3+
+ Biblioteques de tercers
+ S\'utilitzen les següents biblioteques:
+ Prenem alguna inspiració i codi de LeafPic. Aneu a comprovar-ho, també és programari gratuït!
+ Expliqueu-me més
+ Activeu-ho per obrir enllaços de Youtube en aplicacions externes
+ Enllaços de YouTube
+ Canvia el tema del vostre compte
+ Feu lliscar per actualitzar
+ 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.
+
diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml
new file mode 100644
index 00000000..43d88f4b
--- /dev/null
+++ b/app/src/main/res/values-ckb/strings.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-cs/strings-about.xml b/app/src/main/res/values-cs/strings-about.xml
deleted file mode 100644
index 54191dc5..00000000
--- a/app/src/main/res/values-cs/strings-about.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-cs/strings-preferences.xml b/app/src/main/res/values-cs/strings-preferences.xml
deleted file mode 100644
index 3885ddb3..00000000
--- a/app/src/main/res/values-cs/strings-preferences.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 193ab72a..63534efb 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -1,11 +1,203 @@
-
-
-
-
-
-
-
-
+
+ Otevøít navigaèní panel
+ Zavøít navigaèní panel
+ Aktualizovat
+ Konec
+ Rakovina
+
+ Nastavení
+ Oznámení
+ Konverzace
+ Stream
+ Profil
+ Aspekty
+ Aktivity
+ Líbilo se
+ Okomentované příspěvky
+ Zmínky
+ Veřejné
+ Hledat
+ Kontakty
+ Seznam změn
+ Statistika
+
+ Všechna oznámení
+ Také komentováno
+ Okomentoval/a Tvůj příspěvek
+ Líbilo se
+ Zmíněn
+ Sdílen
+ Začalo sdílení
+
+ Error: Nemohl získat seznam podů!
+ Omlouvám se, musíte být připojeni k internetu, abyste mohli pokračovat dál
+ Potvrzení
+ Chceš opustit aplikaci?
+
+ Více
+ O aplikaci | Pomoc
+ Zlaté rány
+ Veřejné aktivity
+ Nahlášení
+ Sdílejte odkaz jako text
+ Šablony obrázku webových stránek
+ Podívejte se na snímek webové stránky
+ Uložit obrázek
+ Uložit snímky jako:
+ Zapnutá adresa …
+ Nový příspěvek
+ Jít nahoru
+ Hledat štítky nebo osoby
+ Ukončit aplikaci
+ Pohled na pracovní plochu
+ Sdílet…
+ tagy
+ lidmi
+ Prosím přidejte jméno
+ Sdílejte adresu odkazu
+ Uložit obrázek
+ Sdílet obrázek
+ Otevřít v externím prohlížeči…
+ Zkopírovat link do schránky
+ Kopírovat adresu obrázku do schránky
+
+ Nemohl být načten obrázek
+
+ Abys mohl ukládat/nahrávat obrázky, musíš nejprve aplikaci povolit přístup k datovému úložišti. Poté by měla být aplikace uzavřena, případně restartován celý přístroj. Pokud přístupu zabráníš, ale časem se rozhodneš obrázky ukládat, můžeš toto oprávnění povolit později. Otevři: Systémové nastavení - Aplikace - dandelion*. V oblasti oprávnění poté můžeš změnit vybraná nastavení.
+ Oprávnění odepřeno.
+ Oprávnění povoleno. Prosím, zkus to znovu.
+ Použij definovaný Pod
+ Název Podu
+ Protokol
+ Adresa Podu
+ Chybějící hodnota
+ Zavolat poslední navštívenou stránku ve streamu?
+ Hide bar at the main view at the view.
+ Schovat statusbar
+ Zobrazit titul v hlavním pohledu
+ Zobrazit titul
+ Launcher shortcut
+
+ Horní nástrojová lišta načítá stream
+ Pro otevření streamu klikni na práznou plochu v horní nástrojové liště
+
+ Vzhled
+ Síť
+ Nastavení Podu
+ Obsluha
+
+
+ Navigační šprýmař
+ Ovládejte viditelnost položek v navigačním šuplíku
+ Uživatel
+ Obecné
+ Administrátor
+
+ Téma a zmatek
+ Ovládání, které barvy jsou používány v průběhu aplikace
+ Primární barva
+ Barva nástrojové lišty
+ Akcentová barva
+ Barva detailů
+ AMOLED model
+ Pro procházení barvy s AMOLED zobrazujeme příjemnou černou barvu v mnoha částech aplikace.
+
+ Rozšířené oznámení
+ Rozšiř oznámení zvonku pomocí výběrového menu, které zobrazuje kategorie oznámení
+ Pokud chcete zmìnit jazyk této aplikace, bude vyžadován její restart.
+ Jazyk
+ Jazyk systému
+
+ Konfigurovat velikost textu WebViewu
+ Velikost písma
+ Normální
+ Velké
+ Obrovské
+
+ Načítej obrázky
+ Útok obrázku na např. uložte mobilní data
+
+ Rotace obrazovky
+ Kontroluj automatickou rotaci
+ Standardní
+ Senzor\n(ignorovat systémové nastavení)
+ Na výšku
+ Na šířku
+
+ Načti přednastavení Toru
+ Načti proxy nastavení pro Tor (Orbot) HTTP Proxy
+ Proxy
+ Aktivovat proxy
+ Veď datovou cestu dandelion*, aby se obešla brána Firewall.\nMůže být vyžadován restart. Toto nemusí fungovat na všech přístrojích.
+ Host
+ Port
+ Při restartu musíte zakázat používání proxy serveru
+ načtený panel proxy
+
+
+ Osobní nastavení
+ Otevřte nastavení účtu diaspory
+ Spravte Váš seznam kontaktů
+ Řídit Hashtagy
+ Unfollow již následoval hashts
+ Změna konta
+ Erase local session data and switch to another diaspora* pod/účet
+ Chcete změnit svůj účet?
+ Vyprázdnit cache
+ Smazat cache WebView
+ Automaticky skryjí horní a dolní lišty při každém hodnocení.
+ Lity rozumových nástrojů
+ Konečný společný přístup
+ Přidat referenci této aplikace ke sdílenému textu: [via #dandelion]
+
+ Různé
+ Celkový reset
+ Podařilo se vám smazat všechna nastavení související s aplikací a přihlásit se ze všech účtů.
+ Toto přepíše všechna změněná nastavení aplikace do výchozích hodnot a vymaže vás ze všech podů.
+ Uživatelné základní Adcker může být součástí např. v embedded views.
+ Blokové reklamy
+ Informace
+ Licence
+ Debugging
+ Aplikace
+ Přístroj
+ Pod diaspora*
+ Protokol odstraňování chyb
+ Protokol odstraňování chyb (detailně)
+ Verze aplikace: %1$s
+ Android verze: %1$s
+ Název přístroje: %1$s
+ Kódový název: %1$s
+ Profilový název Podu: %1$s
+ Doména Podu: %1$s
+ Protokol odstraňování chyb byl zkopírován do schránky
+ dandelion* je Tvoje doprovodná aplikace pro procházení sociální sítí diaspora*. Nabízí features jako užitečné nástrojové lišty nebo podporu pro proxy servery (např. Tor Network).
+ Spolupracuj!
+ dandelion* je svobodný software (free as in Freedom) a řídí se myšlenkami projektu diaspora*. Pokud chceš přispívat, jen do toho! Momentálně jsme velmi malý tým, takže jsme velmi vděční za jakýkoli druh pomoci!
+ Ke zdrojovému kódu
+ Přelož aplikaci!
+ Pokud si nejste jistí, že jste se rozhodli pro něco, co potřebujete?
+ Chci překládat
+ Dej zpětnou vazbu!
+ dandelion* je stále ve vývoji, takže pokud máš jakékoli návrhy, neváhej nám zanechat zpětnou vazbu pomocí užití našeho bug trackeru!
+ Nahlásit chybu
+ Řekni o aplikaci ostatním!
+ Řekni svým přátelům a rodině o diaspora* a #dadelion! Proč nezačít blogovat o Tvých zkušenostech? Rádi o Tobě uslyšíme!
+ Sdílejte chuť
+ Hey! Podívejte se na #dandelion! %1$s
+
+ Vývojáři
+ Spolupracovníci
+ %1$s<br><br>Děkujeme!
+ GNU GPLv3+ Licence
+ Knihovny třetí strany
+ Následující knihovny jsou využívány:
+ We took some inspiration and code from LeafPic.
+ Řekni mi více
+ Umožnit otevřít Youtube odkazy na externí aplikace
+ Youtube odkazy
+ Změňte téma vašeho účtu
+ Pull osvěžit
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
new file mode 100644
index 00000000..6d783039
--- /dev/null
+++ b/app/src/main/res/values-da/strings.xml
@@ -0,0 +1,93 @@
+
+
+
+ Genindlæs
+
+ Indstillinger
+ Notifikationer
+ Samtaler
+ Strøm
+ Profil
+ Aspekter
+ Aktiviteter
+ Synes om
+ Kommenteret
+ Omtalelser
+ Offentlig
+ Søg
+ Kontakter
+ Ændringslog
+ Statistik
+
+ Alle notifikationer
+ Kommenterede også
+ Kommenter på opslag
+ Syntes om
+ Nævnte
+ Gendelte
+
+
+ Mere
+ Del…
+ Del billede
+ Åben i ekstern browser…
+ Kopier link-adresse til udklipsholder
+
+
+ Gem statusbar
+
+ Øverste værktøjslinje indlæser strøm
+ Klik på tom plads i den øverste værktøjslinje for at åbne strømme
+
+ Udseende
+ Netværk
+
+
+ Generelt
+
+ Primær farve
+ Værktøjslinjers farver
+ Markeringsfarve
+
+ Ændre applikationens sprog. Genstart for at ændringen træder i kraft
+ Sprog
+
+
+
+ Standard
+
+
+
+ Ryd cache
+
+ Diverse
+ Om
+ Licens
+ Fejlsøgning
+ Applikation
+ Enhed
+ diaspora* Pod
+ Fejlsøgningslog
+ Fejlsøgningslog (udvidet)
+ App version: %1$s
+ Android version: %1$s
+ Enhedsnavn: %1$s
+ Kodenavn: %1$s
+ Pod-profilnavn: %1$s
+ Pod-domæne: %1$s
+ Fejlsøgningslog kopieret til udklipsbord
+ dandelion* er dine hjælpe-applikationer til at finde rundt på det sociale netværk diaspora*. Den tilføjer funktionaliteter som værktøjslinker og understøttelse for proxy-servere som Tor til din sociale oplevelse.
+ Bidrag med kode!
+ dandelion* udvikles som fri software og følger ideerne bag diaspora*-projektet. Hvis du har lyst til at bidrage, så sæt i gang! For nuværende er vi et meget lille hold der står bag, og vi sætter stor pris på enhver form for hjælp!
+ Hent kildekoden
+ Oversæt applikationen!
+ Findes applikationen ikke på dit sprog? Det kan du ændre! Hvorfor ikke hjælpe os med at oversætte den? Vi burer crowdin-platformen som gør dig i stand til at oversætte.
+ Lad mig oversætte
+ Meld tilbage!
+ dandelion* udvikles stadig, så hvis du har forslag eller anden form for tilbagemelding, så lad os det venligst vide via vores problem-tracker!
+ Rapporter fejl
+ Spred ordet!
+
+ Udviklere
+ Bidragsydere
+
diff --git a/app/src/main/res/values-de/strings-about.xml b/app/src/main/res/values-de/strings-about.xml
deleted file mode 100644
index c2ffbd61..00000000
--- a/app/src/main/res/values-de/strings-about.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
- Über
- Lizenz
- Debugging
- Anwendung
- Gerät
- Diaspora Pod
- Debug-Protokoll
- Debug-Protokoll (Verbose)
- App Version: %1$s
- Paketname: %1$s
- Android Version: %1$s
- Gerätename: %1$s
- Pod-Adresse: %1$s
- Debug-Protokoll in Zwischenablage kopiert
- Verwendete Drittanbieter-Bibliotheken
-
-
- DiasporaForAndroid ist dein Begleiter auf deinen Streifzügen durch das soziale Netzwerk Diaspora. Er bietet dir zusätzliche Features wie nützliche Toolbars und Unterstützung für Proxyserver wie etwa das Tornetzwerk. <br><br>
-
- Diaspora benutzt Markdown-Formatierung für deine Beiträge. Weitere Informationen dazu findest du auf<br>
- https://wiki.diasporafoundation.org/Markdown_reference_guide <br> <br>
-
- DiasporaForAndroid wird frei wie in Freiheit entwickelt und folgt den Ideen des Diaspora Projektes. <br>
- Den Quellcode findest du auf Github: <br>
- https://github.com/Diaspora-for-Android/diaspora-android <br> <br>
-
- Wenn du auf Probleme stößt oder Vorschläge hast, nutze den Bugtracker (siehe Link oben).
- Alternativ kannst du deine Frage auch mit dem Hashtag #DFAQ auf Diaspora posten.<br> <br>
- Die App ist nicht in deiner Sprache verfügbar? Hilf mit und übersetze die App auf Crowdin.com!<br>
- https://crowdin.com/project/diaspora-for-android <br> <br>
-
- Wenn du Lust hast erzähle doch deinen Freunden von #DiasporaForAndroid!
-
-
diff --git a/app/src/main/res/values-de/strings-preferences.xml b/app/src/main/res/values-de/strings-preferences.xml
deleted file mode 100644
index ed3586f7..00000000
--- a/app/src/main/res/values-de/strings-preferences.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
-
-
- Erscheinungsbild
- Netzwerk
- Pod Einstellungen
-
-
- Navigations Slider
- Konfiguration der Sichtbarkeit von Einträgen im Navigation-Slider
- Sichtbarkeit der Einträge
-
- Schriftgröße
-
-
- Lade Bilder
- Deaktiviere das Laden von Bildern, um den Datenverbrauch zu verringern
-
- Aktiviere Netzwerkproxy
- Nutze einen Proxyserver, um Firewalls zu umgehen
- Host
- Port
-
- Chrome Custom Tabs
- Externe Links mit Chrome Custom Tabs öffnen. Für dieses Feature muss Chromium oder Google Chrome installiert sein
-
- Persönliche Einstellungen
- Öffne die Einstellungen deines Diaspora Accounts
- Kontakte
- Bearbeite deine Kontaktliste
- Tags verwalten
- Verwalte die Liste der Hashtags, denen du folgst
- Konto wechseln
- Lösche lokale Sitzungsdaten und wechsle zu einem anderen Pod/Benutzerkonto
- Das wird alle Cookies und Sitzungsdaten löschen. Willst du wirklich dein Konto wechseln?
- Zwischenspeicher leeren
- Leert den Zwischenspeicher des WebViews
- Verstecke die obere und untere Werkzeugleiste automatisch, während gescrollt wird
- Werkzeugleisten intelligent verstecken
- Verweise auf App
- Füge beim Teilen von Texten einen Verweis auf diese App an (\"geteilt durch…\")
-
-
-
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 07789f80..54bc3bbe 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -1,72 +1,212 @@
-
-
- *[geteilt durch #DiasporaForAndroid]*
-
- Aktualisieren
- Ungelesene Benachrichtigung. Lesen?
-
- Einstellungen
- Benachrichtigungen
- Unterhaltungen
- Stream
- Profil
- Aspekte
- Aktivitäten
- Gelikte Beiträge
- Kommentiert
- Erwähnungen
- Öffentliche Aktivitäten
- Suchen
-
- Pod auswählen
- Pod-Adresse eingeben
- Pod-Adresse bestätigen
- Anmerkung: Die Podliste wird aus den sicheren Pods, die bei https://podupti.me gelistet sind generiert.
- Bitte eine gültige Pod-Adresse (Url) eingeben
- Fehler: Konnte die Podliste nicht abfragen!
- Entschuldigung, du musst mit dem Internet verbunden sein, um fortzufahren.
- Bestätigung
- Möchtest du wirklich \nhttps://%1$s\nals deinen Diaspora Pod auswählen?
- Möchtest du die App verlassen?
-
- Mehr
- Über | Hilfe
- Verfolgte Tags
- Öffentliche Aktivitäten
- Link als Text teilen
- Bildschirmfoto teilen
- Bildschirmfoto speichern
- Speichere Bild als
- Bildschirmfoto wird gespeichert unter:
- Linkadresse kopiert …
- Neuer Beitrag
- Nach oben scrollen
- Suche nach Tags oder Personen…
- App beenden
- Mobil-/Desktopansicht umschalten
- Teilen…
- nach Tags
- nach Personen
- Füge einen Namen ein.
- Linkadresse teilen
- Bild speichern
- Bild teilen
- In externem Browser öffnen…
- Linkadresse kopieren
-
- Warnung: Proxy konnte nicht aktiviert werden…
- Konnte Bild nicht laden…
- Alle Tags
-
- Du musst der App Zugriff auf den Gerätespeicher gewähren, damit das Bildschirmfoto
+
+ NavDrawer öffnen
+ NavDrawer schließen
+ Aktualisieren
+ Schließen
+ Abbrechen
+
+ Einstellungen
+ Benachrichtigungen
+ Unterhaltungen
+ Stream
+ Profil
+ Aspekte
+ Aktivitäten
+ Gelikte Beiträge
+ Kommentiert
+ Erwähnungen
+ Öffentliche Aktivitäten
+ Suchen
+ Kontakte
+ Änderungen
+ Statistik
+
+ Alle Benachrichtigungen
+ Auch kommentiert
+ Einen Beitrag kommentiert
+ Gefällt
+ Erwähnt
+ Weitergesagt
+ Angefangen zu teilen
+
+ Fehler: Konnte die Podliste nicht abfragen!
+ Entschuldigung, du musst mit dem Internet verbunden sein, um fortzufahren.
+ Bestätigung
+ Möchtest du die App verlassen?
+
+ Mehr
+ Über | Hilfe
+ Tags
+ Öffentliche Aktivitäten
+ Meldungen
+ Link als Text teilen
+ Bildschirmfoto teilen
+ Bildschirmfoto speichern
+ Speichere Bild als
+ Bildschirmfoto wird gespeichert unter:
+ Link-Adresse kopiert …
+ Neuer Beitrag
+ Nach oben scrollen
+ Suche nach Tags oder Personen…
+ App beenden
+ Mobil-/Desktopansicht umschalten
+ Teilen…
+ nach Tags
+ nach Personen
+ Füge einen Namen ein.
+ Link-Adresse teilen
+ Bild speichern
+ Bild teilen
+ In externem Browser öffnen…
+ Link-Adresse kopieren
+ Bild-Adresse kopieren
+
+ Konnte Bild nicht laden…
+
+ Du musst der App Zugriff auf den Gerätespeicher gewähren, damit das Bildschirmfoto
gespeichert werden kann. Danach solltest du die Anwendung komplett schließen oder das Gerät neu starten.
Wenn du den Zugriff verweigerst und die Funktion später doch nutzen willst, kannst du die Berechtigung
- nachträglich erteilen. Öffne dafür: Systemeinstellungen - Apps - Diaspora. Im Bereich Berechtigungen kannst
+ nachträglich erteilen. Öffne dafür: Systemeinstellungen - Apps - dandelion*. Im Bereich Berechtigungen kannst
dann die entsprechende Einstellung vornehmen.
- Du musst der App Zugriff auf den Gerätespeicher gewähren, damit Bilder gespeichert oder hochgeladen werden können. Danach solltest du die Anwendung komplett schließen oder das Telefon neu starten. Wenn du den Zugriff verweigerst und die Funktion später doch nutzen willst, kannst du die Berechtigung
-nachträglich erteilen. Öffne dafür: Systemeinstellungen - Apps - Diaspora. Im Bereich Berechtigungen kannst dann die entsprechende Einstellung vornehmen.
- Berechtigung verweigert.
- Berechtigung erteilt. Bitte versuche es erneut.
+ Du musst der App Zugriff auf den Gerätespeicher gewähren, damit Bilder gespeichert oder hochgeladen werden können. Danach solltest du die Anwendung komplett schließen oder das Telefon neu starten. Wenn du den Zugriff verweigerst und die Funktion später doch nutzen willst, kannst du die Berechtigung
+nachträglich erteilen. Öffne dafür: Systemeinstellungen - Apps - dandelion*. Im Bereich Berechtigungen kannst dann die entsprechende Einstellung vornehmen.
+ Berechtigung verweigert.
+ Berechtigung erteilt. Bitte versuche es erneut.
+ Benutzerdefinierter Pod
+ Pod Name
+ Protokoll
+ Pod Adresse
+ Fehlender Wert
+ Zuletzt besuchte Seite im Stream aufrufen?
+ Statusleiste in Hauptansicht verstecken
+ Statusleiste verstecken
+ Titel in der Hauptansicht anzeigen
+ Titel anzeigen
+ Launcher Verknüpfung
+
+ Obere Werkzeugleiste lädt Stream
+ Klicks auf leere Flächen der oberen Werkzeugleiste öffnen den Stream
+
+ Erscheinungsbild
+ Netzwerk
+ Pod Einstellungen
+ Bedienbarkeit
+
+
+ Navigations Slider
+ Konfiguration der Sichtbarkeit von Einträgen im Navigation-Slider
+ Benutzer
+ Allgemeines
+ Administrator
+
+ Farbschema
+ Einstellungen des Farbdesigns
+ Primärfarbe
+ Färbung der Werkzeugleisten
+ Akzentfarbe
+ Färbung der Details
+ AMOLED Modus
+ Farben mit AMOLED-Display freundlichen Farben an vielen Orten der App überschreiben. Ein Neustart ist erforderlich um diese Einstellung zu ändern. Du kannst in deinen persönlichen diaspora* Einstellungen das dunkle Thema aktivieren, damit wird auch der Inhalt dunkler.
+
+ Erweiterte Benachrichtigungen
+ Erweitere die Benachrichtigungsglocke um ein Ausklappmenü mit verschiedenen Benachrichtigungskategorien
+ Sprache der App ändern. Ein Neustart der App ist erforderlich um die Einstellung zu übernehmen
+ Sprache
+ Systemsprache
+
+ Konfigurieren der Textgröße der Webansicht
+ Schriftgröße
+ Normal
+ Groß
+ Größer
+
+ Lade Bilder
+ Deaktiviere das Laden von Bildern, um den Datenverbrauch zu verringern
+
+ Bildschirmrotation
+ Kontrolliere die automatische Bildschirmrotation
+ Standard
+ Sensor\n(System-Einstellungen ignorieren)
+ Hochformat
+ Querformat
+
+ Tor Voreinstellungen laden
+ Proxy Einstellungen für Tor (Orbot) HTTP Proxy laden
+ Proxy
+ Aktiviere Netzwerkproxy
+ Nutze einen Proxyserver, um Firewalls zu umgehen.\nDie App muss neu gestartet werden
+ Host
+ Port
+ App muss neu gestartet werden um den Proxy zu deaktivieren
+ Orbot Proxy Preset geladen
+
+ Externe Links mit Chrome Custom Tabs öffnen. Chromium oder Google Chrome muss für dieses Feature installiert sein.\nWICHTIGER HINWEIS: Chrome Custom Tabs verwenden die konfigurierten Proxy-Server nicht!
+
+ Persönliche Einstellungen
+ Öffne die Einstellungen deines diaspora* Accounts
+ Bearbeite deine Kontaktliste
+ Tags verwalten
+ Bereits verfolgte Hashtags nicht mehr verfolgen
+ Konto wechseln
+ Lösche lokale Sitzungsdaten und wechsele zu einem anderen diaspora* Pod/Benutzerkonto
+ Das wird alle Cookies und Sitzungsdaten löschen. Willst du wirklich dein Konto wechseln?
+ Zwischenspeicher leeren
+ Leert den Zwischenspeicher des WebViews
+ Verstecke die obere und untere Werkzeugleiste automatisch, während gescrollt wird
+ Werkzeugleisten intelligent verstecken
+ Verweise auf App
+ Füge eine Referenz zu in diese App geteilte Texte hinzu: [via #dandelion]
+
+ Verschiedenes
+ Zurücksetzen
+ Setze alle Einstellungen der Anwendung zurück und melde alle Konten ab
+ Dies wird alle geänderten Einstellungen der Anwendung auf die Standardwerte zurücksetzen und alle Konten abmelden. Deine heruntergeladenen Medien bleiben unberührt. Bist du sicher, dass du fortfahren willst?
+ Einfachen Werbeblocker aktivieren. Werbung könnte z.B. in eingebetteten Anzeigen enthalten sein
+ Werbung blockieren
+ Über
+ Lizenz
+ Debugging
+ Anwendung
+ Gerät
+ diaspora* Pod
+ Debug-Protokoll
+ Debug-Protokoll (Verbose)
+ App Version: %1$s
+ Android Version: %1$s
+ Gerätename: %1$s
+ Codename: %1$s
+ Pod Profil Name: %1$s
+ Pod Domain: %1$s
+ Debug-Protokoll in Zwischenablage kopiert
+ dandelion* ist dein Begleiter auf deinen Streifzügen durch das soziale Netzwerk diaspora*. Es bietet dir zusätzliche Funktionen wie nützliche Werkzeugleisten und Unterstützung für Proxyserver wie das Tor-Netzwerk.
+ Mach mit!
+ dandelion* wird frei wie in Freiheit entwickelt und folgt den Ideen des diaspora* Projektes. Wenn du mithelfen willst, nur zu! Wir sind momentan nur ein sehr kleines Team und sind froh über jede Unterstützung!
+ Zum Quellcode
+ Übersetze die App!
+ Die Anwendung ist nicht in deiner Sprache verfügbar? Das kannst du ändern! Warum hilfst du uns nicht, indem du übersetzt? Wir benutzen die Plattform crowdin, um es jedem zu ermöglichen, die App zu übersetzen.
+ Ich möchte übersetzen
+ Feedback geben!
+ dandelion* befindet sich noch in Entwicklung, wenn du also Vorschläge oder etwas anderes auf dem Herzen hast besuche doch unseren Bug Tracker und lass es uns wissen!
+ Fehler melden
+ Anderen davon erzählen!
+ Erzähl deiner Familie und deinen Freunden von diaspora* und #dandelion! Warum bloggst du nicht über deine Erfahrungen mit der App? Wir würden gerne davon erfahren!
+ Weitersagen
+ Hallo! Schau dir #dandelion an! %1$s
+
+ Entwickler
+ Diese Anwendung wird momentan entwickelt und betreut von <br><br>%1$s
+ Beitragende
+ %1$s<br><br>Vielen Dank!
+ GNU GPLv3+ Lizenz
+ Drittanbieter-Bibliotheken
+ Die folgenden Bibliotheken werden genutzt:
+ Wir haben ein wenig bei LeafPic gespickt. Schaut euch das mal an, es handelt sich dabei auch um freie Software!
+ Erzähl mir mehr
+ Einschalten um YouTube Links in einer externen App zu öffnen
+ YouTube Links
+ Thema des Accounts ändern
+ Pull-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.
diff --git a/app/src/main/res/values-el/strings-about.xml b/app/src/main/res/values-el/strings-about.xml
deleted file mode 100644
index 54191dc5..00000000
--- a/app/src/main/res/values-el/strings-about.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-el/strings-preferences.xml b/app/src/main/res/values-el/strings-preferences.xml
deleted file mode 100644
index 3885ddb3..00000000
--- a/app/src/main/res/values-el/strings-preferences.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 193ab72a..43d88f4b 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -1,11 +1,24 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
new file mode 100644
index 00000000..43d88f4b
--- /dev/null
+++ b/app/src/main/res/values-eo/strings.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-es/strings-about.xml b/app/src/main/res/values-es/strings-about.xml
deleted file mode 100644
index 54191dc5..00000000
--- a/app/src/main/res/values-es/strings-about.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-es/strings-preferences.xml b/app/src/main/res/values-es/strings-preferences.xml
deleted file mode 100644
index 6a6b67c1..00000000
--- a/app/src/main/res/values-es/strings-preferences.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
-
-
-
-
- Aspecto
- Red
- Ajustes del Pod
-
-
- Control deslizante de navegación
- Control de visibilidad de las entradas en el cajón de navegación
- Elemento visibilidad
-
- Tamaño de letra
-
-
- Cargar imágenes
- Desactivar la carga de de imágenes a datos móviles seguros
-
- Activar Proxy
- El tráfico proxificado de Diaspora para evitar firewalls.\nPuede necesitar reiniciarse
- Anfitrión
- Puerto
-
-
- Configuración personal
- Contactos
- Administrar tu lista de contactos
- Administrar Etiquetas
- Agregar y eliminar la etiqueta que estas siguendo
- Cambiar cuenta
- Borrar datos de la sesión local y cambiar a otro pod/cuenta de Diaspora
- Esto borrará todas las cookies y datos de la sesión. ¡Realmente deseas cambiar tu cuenta?
- Limpiar caché
- Limpiar cache de WebView
- Ocultar barras de herramientas superior e inferior automáticamente mientras se desplaza
- Barras de herramientas Intellihide
- Añadir compartido por aviso
- Agregar una referencia a esta aplicación (\"compartida por…\") a los textos compartidos
-
-
-
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 9e7fe3fb..603085a5 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -1,64 +1,207 @@
-
-
- *[compartido vía #DiasporaForAndroid]*
-
- Recargar
- Notificación sin leer. ¿Quieres leerla?
-
- Configuración
- Notificaciones
- Conversaciones
- Entrada
- Perfíl
- Aspectos
- Actividades
- Me gusta
- Comentarios
- Menciones
- Público
- Búsqueda
-
- Seleccionar Pod
- Introduce el dominio del Pod
- Confirma la url del Pod
- Nota: La lista de Pods esta integrada por Pods seguros enlistados en https://podupti.me. Puedes ingresar en el campo de edición cualquier Pod no enlistado.
- Por favor, introduce un nombre de dominio válido
- Error: ¡No se pudo recuperar la lista de pods!
- Lo sentimos, debe estar conectado a internet para continuar
- Confirmación
- ¿Realmente desea usar\nhttps://%1$s\ncomo su Pod de Diaspora?
- ¿Desea salir?
-
- Etiquetas seguidas
- Actividad pública
- Compartir link como texto
- Compartir captura de pantalla de la página web
- Tomar captura de pantalla de la página web
- Guardar imagen en
- Guardar captura de pantalla como:
- Dirección del enlace copiada …
- Nueva Publicación
- Ir arriba
- Buscar por etiquetas o personas
- Salir de la aplicación
- Cambiar vista de móvil/escritorio
- Compartir…
- Por etiquetas
- Por personas
- Por favor añade un nombre
- Compartir la dirección del enlace
- Guardar imagen
- Compartir imagen
- Abrir en un navegador externo…
- Copiar dirección al portapapeles
-
- Advertencia: No se pudo establecer proxy de la red
- No se pudo cargar la imagen
- Todas las etiquetas
-
- Debe conceder \"Permiso de Almacenamiento de Información\" para guardar capturas de pantalla. Después debe cerrar completamente la aplicación o reiniciar el teléfono. Si usted no permite el acceso al almacenamiento pero desea utilizar la función de captura de pantalla en un momento posterior, puede conceder el permiso más adelante. Por favor vaya a: ajustes del sistema - aplicaciones - Diaspora. En la sección de permisos puede conceder el \"permiso de almacenamiento de escritura\".
- Permiso denegado.
- Permiso concedido. Por favor, inténtelo de nuevo.
+
+ Abrir el panel de navegación
+ Cerrar el panel de navegación
+ Refrescar
+ Cerrar
+ Cancelar
+
+ Ajustes
+ Notificaciones
+ Conversaciones
+ Portada
+ Perfil
+ Aspectos
+ Mi actividad
+ Me gusta
+ Comentarios
+ Menciones
+ Público
+ Búsqueda
+ Contactos
+ Registro de cambios
+ Estadísticas
+
+ Todas las notificaciones
+ También Comentado
+ Comentar en Publicación
+ Gustado
+ Mencionado
+ Recompartido
+ Empezado Compartir
+
+ Error: No pudimos recuperar la lista de pods!
+ Debe conectarse a internet para poder continuar
+ Confirmación
+ ¿Desea salir?
+
+ Más
+ Sobre | Ayuda
+ Etiquetas seguidas
+ Actividad pública
+ Informes
+ Compartir enlace como texto
+ Compartir captura de pantalla de la página web
+ Tomar captura de pantalla de la página web
+ Guardando imagen a
+ Guardando captura de pantalla como:
+ Dirección de enlace copiada
+ Nueva publicación
+ Ir arriba
+ Buscar por etiquetas o por personas
+ Salir de la aplicación
+ Alternar vista de móvil/escritorio
+ Compartir…
+ por etiquetas
+ por personas
+ Por favor, añade un nombre
+ Compartir dirección de enlace
+ Guardar imagen
+ Compartir imagen
+ Abrir en navegador externo…
+ Copiar dirección del enlace al portapapeles
+ Copiar dirección de imagen al portapapeles
+
+ No se pudo cargar la imagen
+
+ Debe conceder \"Permiso de Almacenamiento de Información\" para guardar capturas de pantalla. Después debe cerrar completamente la aplicación o reiniciar el teléfono. Si usted no permite el acceso al almacenamiento pero desea utilizar la función de captura de pantalla en un momento posterior, puede conceder el permiso más adelante. Por favor vaya a: ajustes del sistema - aplicaciones - dandelion*. En la sección de permisos puede conceder el \"permiso de almacenamiento de escritura\".
+ Debe conceder \"Permiso de acceso al almacenamiento\" para guardar imágenes. Después, debe cerrar completamente la aplicación o reiniciar el aparato. Si usted no permite el almacenamiento pero quiere guardar imágenes en otro momento, puede conceder el permiso más tarde. Por favor abra: ajustes del sistema -aplicaciones- dandelion*. En la sección de permisos puede conceder el \"permiso de almacenamiento de escritura\".
+ Permiso denegado.
+ Permiso concedido. Por favor, inténtelo de nuevo.
+ Pod personalizado
+ Nombre de Pod
+ Protocolo
+ Dirección de Pod
+ Valor ausente
+ ¿Saltar a la última página visitada?
+ Ocultar barra de estado en la vista principal
+ Ocultar barra de estado
+ Mostrar título en la vista princial
+ Mostrar título
+ Atajo de lanzador
+
+ Barra de herramientas superior carga la portada
+ Haga clic en un espacio vacío en la barra de herramientas superior para abrir portada
+
+ Apariencia
+ Red
+ Ajustes del Pod
+ Operatividad
+
+
+ Control deslizante de navegación
+ Control de visibilidad de las entradas en el cajón de navegación
+ Usuario
+ General
+ Administrador
+
+ Tema y Colores
+ Control de colores que se utilizan en la aplicación
+ Color primario
+ Color de las barras de herramientas
+ Color de Énfasis
+ Color de la barra de progreso
+ Modo AMOLED
+ Substituir el color negro en varias partes de la app con uno compatible con pantallas AMOLED. Necesitarás reiniciar la app para alternar ésta opcion. Para navegar diaspora* con un tema oscuro, lo necesitarás habilitar en tu panel de configuraciones personales de cuenta diaspora*.
+
+ Notificaciones extendidas
+ Extender la campana de notificaciones con un menú desplegable que muestra categorías de notificación
+ Cambiar el idioma de esta aplicación. Reiniciar la aplicación para que se apliquen los cambios
+ Idioma
+ Idioma del sistema
+
+ Control del tamaño del texto de la vista Web
+ Tamaño de letra
+ Tamaño normal
+ Tamaño grande
+ Tamaño enorme
+
+ Cargar imágenes
+ Desactivar la carga de de imágenes a datos móviles seguros
+
+ Rotación de la pantalla
+ Controlar la rotación automática de la pantalla
+ Predeterminado
+ Sensor\n(ignorar la configuración de la sistema)
+ Vertical
+ Apaisado
+
+ Cargar Tor predeterminado
+ Cargar la configuración del proxy de Tor (Orbot) HTTP Proxy
+ Proxy
+ Activar proxy
+ Tráfico del proxy de dandelion* evadiendo el cortafuegos.\nPuede requerir reiniciar. Puede no funcionar en algunos teléfonos.
+ Host
+ Puerto
+ La aplicación necesita reiniciar para deshabilitar el uso de proxy
+ Cargado proxy Orbot predeterminado
+
+ Abrir vínculos externos con barras personalizadas de Chrome. Chromium o Google Chrome deben estar instalados para utilizar esta característica. \nNOTA IMPORTANTE: ¡ las barras personalizadas de Chrome no usan servidores proxy configurados!
+
+ Configuración personal
+ Abre la configuración de tu cuenta de diaspora*
+ Administrar su lista de contactos
+ Manejar etiquetas
+ Dejar de seguir las etiquetas seguidas
+ Cambiar cuenta
+ Borrar datos de la sesión local y cambiar a otro pod/cuenta de diaspora*
+ Esto borrará todas las cookies y datos de la sesión. ¿Realmente deseas cambiar tu cuenta?
+ Limpiar caché
+ Borrar caché de vista Web
+ Ocultar barras de herramientas superior e inferior automáticamente mientras se desplaza
+ Barra de herramientas Intellihide
+ Añadir compartido por aviso
+ Agregar una referencia a esta aplicación en los textos compartidos: [vía #dandelion]
+
+ Diverso
+ Reinicio completo
+ Borrar localmente toda la configuración relacionada con la aplicación y cerrar sesión en todas las cuentas
+ Esto restablecerá todas las modificaciones en la configuración a sus valores predeterminados y se desconectará de todos los pods. Las imágenes descargadas permanecerán intactas. ¿Está seguro de que desea continuar?
+ Habilitar bloqueador de publicidad básico. Publicidad podrá ser incluida p.ej. en vistas incrustadas
+ Bloquear publicidad
+ Acerca de
+ Licencia
+ Depurando
+ Aplicación
+ Dispositivo
+ Pod de diaspora*
+ Depurar registro
+ Depurar registro (Detallado)
+ Versión aplicación:%1$s
+ Versión de Android: %1$s
+ Nombre del dispositivo: %1$s
+ Nombre clave: %1$s
+ Nombre de perfil del pod: %1$s
+ Dominio del pod:%1$s
+ Registro de depuración copiado al portapapeles
+ dandelion* es su complemento para navegar por la red social diapora*. Añade características como útiles barras de herramientas y soporte para servidores proxy como la red Tor a su experiencia social.
+ ¡Contribuir con código!
+ dandelion* se desarrolla libre, en el sentido de libertad, y sigue las ideas del proyecto diaspora*. Si usted quiere contribuir, ¡adelante! Actualmente somos un equipo muy pequeño, por lo que ¡agradeceríamos mucho cualquier tipo de ayuda!
+ Obtener el código fuente
+ ¡Traducir la aplicación!
+ ¿La aplicación no está disponible en su idioma? ¡Usted puede cambiar eso! ¿Por qué no nos ayuda traduciéndola? Utilizamos la plataforma crowdin para permitir a cualquiera traducir la aplicación.
+ Permítanme traducir
+ Danos tu opinión!
+ dandelion* todavía está en desarrollo, así que si tiene sugerencias o cualquier tipo de comentarios, ¡utilice nuestro gestor de errores para hacérnoslo saber!
+ Reporte de errores
+ ¡Corre la voz!
+ ¡Hable a sus amigos y familiares acerca de diaspora* y #dandelion! ¿Por qué no difunde sus experiencias? ¡Nos encantaría escucharle!
+ Compartir la aplicación
+ ¡Hey! ¡Mira #dandelion! %1$s
+
+ Mantenimiento
+ Esta aplicación está siendo desarrollada y mantenida por < br >< br >%1$s
+ Contribuidores
+ ¡%1$s < br >< br > Gracias!
+ Licencia GNU GPLv3 +
+ Bibliotecas de terceros
+ Se utilizan las siguientes bibliotecas:
+ Tomamos algo de inspiración y código de LeafPic. ¡Venga, tomad prestado, es software libre también!
+ Saber más
+ Habilitar para abrir enlaces de Youtube en aplicaciones externas
+ Enlaces de YouTube
+ Cambiar el tema de tu cuenta
+ Tirar para refrescar
+ Deslizar hacia abajo la parte superior de la página para refrescar.\n Necesita reiniciar la aplicación para que los cambios surtan efecto.
diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml
new file mode 100644
index 00000000..43d88f4b
--- /dev/null
+++ b/app/src/main/res/values-et/strings.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
new file mode 100644
index 00000000..f5cf3963
--- /dev/null
+++ b/app/src/main/res/values-fa/strings.xml
@@ -0,0 +1,35 @@
+
+
+
+
+ تنظیمات
+ جستجو
+ لاگ تغییرات
+
+
+
+ بیشتر
+
+
+ مخفی کردن نوار وضعیت
+
+
+
+
+ عمومی
+
+
+ تغییر زبان برنامه. لازم است برنامه را از نو اجرا کنید تا تغییرات را ببینید
+ زبان
+
+
+
+ پیشفرض
+
+
+
+
+ درباره مارکور
+
+ همکاران
+
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
new file mode 100644
index 00000000..43d88f4b
--- /dev/null
+++ b/app/src/main/res/values-fi/strings.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml
new file mode 100644
index 00000000..04cb116a
--- /dev/null
+++ b/app/src/main/res/values-fil/strings.xml
@@ -0,0 +1,27 @@
+
+
+
+
+ Mga Tanawin
+ Hanapin
+
+
+
+
+
+
+
+ Ayos
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-fr/strings-about.xml b/app/src/main/res/values-fr/strings-about.xml
deleted file mode 100644
index e1d28166..00000000
--- a/app/src/main/res/values-fr/strings-about.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
- A propos
- Licence
- Déboguer
- Application
- Appareil
- Pod diaspora
- Journal de débogage
- Log de débogage (Verbeux)
- Version app : %1$s
- Nom du paquet : %1$s
- Version Android : %1$s
- Nom de l\'appareil : %1$s
- Adresse du pod : %1$s
- Journal de débogage copié dans le presse-papiers
- Bibliothèques tierces utilisées
-
-
- DiasporaForAndroid est votre app compagnon pour naviguer sur le réseau social Diaspora*. Il ajoute des fonctionnalités supplémentaires comme des barres d’outils utiles et la prise en charge pour les serveurs proxy comme le réseau Tor à votre expérience sociale. <br><br>
-
- Diaspora* utilise Markdown pour mettre en forme les messages. Vous pouvez trouver plus d’informations sur<br>
- https://wiki.diasporafoundation.org/Markdown_reference_guide <br> <br>
-
- DiasporaForAndroid est un logiciel libre et suit les idées du projet Diaspora*. <br>
- Vous pouvez trouver le code source sur Github : <br>
- https://github.com/Diaspora-for-Android/diaspora-android <br> <br>
-
- Si vous rencontrez des problèmes ou si vous avez des suggestions, vous pouvez utiliser notre bug tracker avec le lien ci-dessus.
- Alternativement, vous pouvez poster votre question avec le hashtag #DFAQ sur Diaspora*. <br> <br>
- Cette application n’est pas disponible dans votre langue ? Découvrez notre projet sur Crowdin et aidez à la traduire ! !<br>
- https://crowdin.com/project/diaspora-for-android <br> <br>
-
- Aussi, n’hésitez pas à parler à vos amis de #DiasporaForAndroid !
-
-
diff --git a/app/src/main/res/values-fr/strings-preferences.xml b/app/src/main/res/values-fr/strings-preferences.xml
deleted file mode 100644
index 48b8d71d..00000000
--- a/app/src/main/res/values-fr/strings-preferences.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
-
-
- Apparence
- Paramètres du réseau
- Paramètres du pod
-
-
- Barre de défilement
- Contrôles de la visibilité des entrées dans le volet de navigation
- Visibilité de l’élément
-
- Taille de la police
-
-
- Charger les images
- Désactiver le chargements des images pour préserver la data mobile
-
- Activer Proxy
- Serveur Proxy.\n(Nécessite un redémarrage)
- Hôte
- Port
-
- Onglets personnalisés de Chrome
- Ouvrir les liens externes avec les onglets personnalisés. Chromium ou Google Chrome doit être installé pour cette fonctionnalité
-
- Paramètres personnels
- Ouvrir vos paramètres de compte diaspora
- Contacts
- Gérer votre liste de contacts
- Gérer les Hashtags
- Ajouter et supprimer les hashtags que vous suivez
- Changer de compte
- Effacer les données de session locale et passer à un autre pod/compte Diaspora
- Cette opération va effacer les cookies et données de session. Voulez-vous vraiment changer de compte/pod?
- Vider le cache
- Vide le cache de navigation
- Masquer les barres d’outils en haut et en bas automatiquement lors du défilement
- Masquage intelligent des barres d\'outils
- Ajoutez \"partagé via …\" aux partages
- Ajoutez une référence à l\'application (« partagée via …\") aux textes partagés
-
-
-
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 63422ca4..b039f5c3 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -1,67 +1,207 @@
-
-
- *[partagé via #DiasporaForAndroid]*
-
- Rafraîchir
- Notifications non lues. Lire ?
-
- Paramètres
- Notifications
- Discussions
- Flux
- Profil
- Aspects
- Activités
- Aimés
- Commentés
- Mentions
- Publique
- Rechercher
-
- Selectionnez un Pod
- Entrez le nom de domaine du pod
- Confirmez l\'url du pod
- Note : la liste est générée à partir de la liste des pods sécurisés depuis https://podupti.me. Vous pouvez entrer l\'url d\'un pod non listé.
- Veuillez entrer un nom de domaine valide
- Erreur : impossible de récupérer la liste des pods !
- Désolé, vous devez être connecté à Internet pour continuer
- Confirmation
- Voulez-vous vraiment utiliser\nhttps://%1$s\ncomme pod Diaspora ?
- Souhaitez-vous quitter ?
-
- Plus
- A propos | Aide
- Hashtags suivis
- Activités publiques
- Partager le lien comme texte
- Partager la capture d\'écran d\'un site web
- Prendre une capture d\'écran d\'un site web
- Enregistrer l\'image sous
- Enregistrer la capture d\'écran sous :
- Lien copié…
- Nouveau message
- Retour en haut
- Recherche par tags ou par personnes
- Quitter l\'application
- Activer/désactiver la version mobile
- Partager…
- par tags
- par personne
- Veuillez ajouter un nom
- Partager un lien
- Enregistrer l\'image
- Partager l\'image
- Ouvrir dans un navigateur externe…
- Copier le lien dans le presse-papier
-
- Attention: connexion au proxy impossible…
- Impossible de récupérer l\'image
- Tout Tags
-
- Vous devez autoriser \"Modifier ou supprimer le contenu de la carte Sd \" pour sauvegarder les captures d\'écrans. Ensuite, vous devriez fermer l\'application ou redémarrer votre téléphone. Si vous n\'avez pas autorisé l\'accès à l\'espace de stockage mais que vous souhaitez utiliser la fonctionnalité de prise de capture d\'écran plus tard, vous pouvez donner la permission plus tard. Veuillez ouvrir : Paramètres - applications - Diaspora. Dans la section Autorisations, vous pouvez autoriser \"Modifier ou supprimer le contenu de la carte Sd \".
- Vous devez autoriser \"Modifier ou supprimer le contenu de la carte Sd \" pour sauvegarder/téléverser les images. Ensuite, vous devriez fermer l\'application ou redémarrer votre téléphone. Si vous n\'avez pas autorisé l\'accès à l\'espace de stockage mais que vous souhaitez sauvegarder des images ultérieurement, vous pouvez donner la permission plus tard. Veuillez ouvrir : Paramètres - applications - Diaspora. Dans la section Autorisations, vous pouvez autoriser \"Modifier ou supprimer le contenu de la carte Sd \".
- Permission refusée.
- Permission accordée. Veuillez réessayer.
+
+ Ouvrir le tiroir de navigation
+ Fermer le tiroir de navigation
+ Rafraîchir
+ Fermer
+ Annuler
+
+ Paramètres
+ Notifications
+ Discussions
+ Flux
+ Profil
+ Aspects
+ Activités
+ Aimés
+ Commentés
+ Mentionnés
+ Publique
+ Recherche
+ Contacts
+ Nouveautés
+ Statistiques
+
+ Toutes les notifications
+ Aussi commenté
+ Commentaires sur posts
+ Aimés
+ Mentionnés
+ Repartagés
+ A commencé à partager
+
+ Erreur : impossible de récupérer la liste des pods !
+ Désolé, vous devez être connecté à Internet pour continuer
+ Vérification
+ Souhaitez-vous quitter ?
+
+ Plus
+ A propos | Aide
+ Hashtags suivis
+ Activités publiques
+ Signalements
+ Partager le lien comme texte
+ Partager la capture d\'écran d\'un site web
+ Prendre une capture d\'écran d\'un site web
+ Enregistrer l\'image sous
+ Enregistrer la capture d\'écran sous :
+ Lien copié…
+ Nouveau message
+ Retour en haut
+ Recherche par tags ou par personnes
+ Quitter l\'application
+ Activer/désactiver la vue bureau/mobile
+ Partager…
+ par tags
+ par personne
+ Veuillez ajouter un nom
+ Partager un lien
+ Enregistrer l\'image
+ Partager l\'image
+ Ouvrir dans un navigateur externe…
+ Copier le lien dans le presse-papier
+ Copier le lien de l\'image dans le presse-papiers
+
+ Impossible de récupérer l\'image
+
+ Vous devez autoriser \"Modifier ou supprimer le contenu de la carte Sd \" pour sauvegarder les captures d\'écrans. Ensuite, vous devriez fermer l\'application ou redémarrer votre téléphone. Si vous n\'avez pas autorisé l\'accès à l\'espace de stockage mais que vous souhaitez utiliser la fonctionnalité de prise de capture d\'écran plus tard, vous pouvez donner la permission plus tard. Veuillez ouvrir : Paramètres - applications - dandelion*. Dans la section Autorisations, vous pouvez autoriser \"Modifier ou supprimer le contenu de la carte Sd \".
+ Vous devez autoriser \"Modifier ou supprimer le contenu de la carte Sd \" pour sauvegarder/téléverser les images. Ensuite, vous devriez fermer l\'application ou redémarrer votre téléphone. Si vous n\'avez pas autorisé l\'accès à l\'espace de stockage mais que vous souhaitez sauvegarder des images ultérieurement, vous pouvez donner la permission plus tard. Veuillez ouvrir : Paramètres - applications - dandelion*. Dans la section Autorisations, vous pouvez autoriser \"Modifier ou supprimer le contenu de la carte Sd \".
+ Permission refusée.
+ Permission accordée. Veuillez réessayer.
+ Pod personnalisé
+ Nom du Pod
+ Protocole
+ Adresse du Pod
+ Valeur manquante
+ Sauter à la dernière page visitée dans le flux ?
+ Cacher la barre de statut sur la vue principale
+ Cacher la barre de statut
+ Afficher le titre dans la vue principale
+ Afficher le titre
+ Raccourci de l\'écran d\'accueil
+
+ La barre du haut charge le flux
+ Cliquez sur un espace vide sur la barre du haut pour ouvrir le flux
+
+ Apparence
+ Paramètres du réseau
+ Paramètres du pod
+ Opérabilité
+
+
+ Curseur de navigation
+ Visibilité de contrôle des entrées dans le volet de navigation
+ Utilisateur
+ Général
+ Admin
+
+ Thème et couleurs
+ Contrôler les couleurs utilisées pour l\'application
+ Couleur principale
+ Couleur des barres d\'outils
+ Couleur secondaire
+ Couleur de la barre de progression
+ Mode AMOLED
+ Remplacez les couleurs avec du noir compatible avec les affichages AMOLED, sur plusieurs parties de l\'application. Pour naviguer dans diaspora* avec un affichage sombre, vous pouvez aussi utiliser le thème Dark, que vous trouverez dans vos paramètres personnels de votre compte diaspora*.
+
+ Notifications étendues
+ Étendre la cloche de notifications avec un menu déroulant qui affiche les catégories de notification
+ Changer la langue de l\'interface. Vous devrez redémarrer l\'application pour que ce changement soit pris en compte
+ Langue
+ Langue du système
+
+ Contrôle de la taille du texte pour l\'affichage web
+ Taille de la police
+ Normal
+ Large
+ Très grand
+
+ Charger les images
+ Désactiver le chargements des images pour préserver la data mobile
+
+ Rotation de l\'écran
+ Rotation automatique de l\'écran
+ Par défaut
+ Capteur\n(ignore les paramètres du système)
+ Portrait
+ Paysage
+
+ Charger la pré-configuration Tor
+ Charger les paramètres proxy pour Tor (Orbot) HTTP Proxy
+ Proxy
+ Activer Proxy
+ Proxy pour dandelion* pour contourner les pare-feux.\nPeut nécessiter un redémarrage
+ Hôte
+ Port
+ L\'application a besoin d\'être redémarrée pour désactiver l\'usage du proxy
+ Préréglages proxy Orbot chargés
+
+ Ouvrez les liens externes avec Chrome Custom Tabs. Chromium ou Google Chrome doit être installé pour cette fonctionnalité. \nNOTE IMPORTANTE : Chrome Custom Tabs n\'utilisent pas les serveurs proxy configurés !
+
+ Paramètres personnels
+ Ouvrir vos paramètres de compte diaspora*
+ Gérez vos contacts
+ Gérer les Hashtags
+ Ne plus suivre les tags suivis
+ Changer de compte
+ Effacer les données de session locale et passer à un autre pod/compte diaspora*
+ Cette opération va effacer les cookies et données de session. Voulez-vous vraiment changer de compte/pod?
+ Vider le cache
+ Vider le cache
+ Masquer les barres d’outils en haut et en bas automatiquement lors du défilement
+ Masquer la barre d\'outils
+ Ajouter partagé par avis-
+ Ajouter une référence à cette application aux partages: [via #dandelion]
+
+ Divers
+ Réinitialisation complète
+ Effacer localement tous les réglages relatifs à l\'application et déconnexion de tous les comptes
+ Ceci va réinitialiser tous les changements à leurs valeurs par défaut et vous déconnecter de tous les pods. Vos images téléchargées resteront intactes. Êtes-vous sûr de vouloir continuer ?
+ Activer un bloqueur de pub. Des pubs peuvent être incluses, dans des vues embarquées par exemple
+ Bloquer les publicités
+ À propos
+ Licence
+ Déboguer
+ Application
+ Appareil
+ Pod diaspora*
+ Journal de débogage
+ Log de débogage (Verbeux)
+ Version app : %1$s
+ Version Android : %1$s
+ Nom de l\'appareil : %1$s
+ Nom de code : %1$s
+ Pod alias : %1$s
+ Adresse du pod : %1$s
+ Journal de débogage copié dans le presse-papiers
+ dandelion* est votre application compagnon pour naviguer sur le réseau social diaspora*. Il ajoute des fonctionnalités telles que des barres d’outils utiles et la prise en charge pour les serveurs proxy comme le réseau Tor à votre expérience sociale.
+ Contribuez au code !
+ dandelion* est libre, et suit les idées du projet diaspora*. Si vous voulez contribuer, allez-y ! Actuellement, nous sommes une toute petite équipe, donc nous apprécierions tout type d\'aide !
+ Obtenir la source
+ Traduire l\'application !
+ L’application n’est pas disponible dans votre langue ? Vous pouvez changer cela ! Pourquoi ne pas nous aider à la traduire ? Nous utilisons la plate-forme crowdin pour permettre à quiconque de traduire l’application.
+ Je voudrais traduire
+ Donnez votre avis !
+ dandelion* est encore en développement, donc si vous avez des suggestions ou n’importe quel genre de retour, veuillez utiliser notre traqueur de bogues pour nous le faire savoir !
+ Signaler un bug
+ Faîtes passer le mot !
+ Parlez de diaspora* et #dandelion à vos amis et votre famille ! Pourquoi ne pas bloguer à propos de votre expérience ? Nous aimerions la lire !
+ Partager cette application
+ Hé ! Découvrez #dandelion ! %1$s
+
+ Mainteneurs
+ Cette application est actuellement développée et maintenue par <br><br>%1$s
+ Contributeurs
+ %1$s<br><br>Merci !
+ Licence GNU GPLv3+
+ Bibliothèques tierces
+ Les bibliothèques suivantes sont utilisées :
+ Nous avons pris des inspirations et du code de LeafPic. Allez voir, c\'est aussi un logiciel libre !
+ En savoir plus
+ Autoriser l\'ouverture des liens Youtube par une appli externe
+ Liens Youtube
+ Changer le thème de votre compte
+ Tirer vers le bas pour mettre à jour
+ 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.
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
new file mode 100644
index 00000000..86bd9019
--- /dev/null
+++ b/app/src/main/res/values-gl/strings.xml
@@ -0,0 +1,210 @@
+
+
+
+ Abrir cadro de navegación
+ Pechar cadro de navegación
+ Actualizar
+ Pechar
+ Cancelar
+
+ Axustes
+ Notificacións
+ Conversas
+ Cronoloxía
+ Perfil
+ Aspecto
+ Actividades
+ Gústame
+ Comentei
+ Mencións
+ Público
+ Buscar
+ Contactos
+ Rexistro de cambios
+ Estatísticas
+
+ Todas as notificacións
+ Tamén comentado
+ Comentario nunha publicación
+ Gústame
+ Mencionado
+ Compartido
+ Xa compartes
+
+ Problema: non se obtivo a lista de nodos!
+ Desculpa, tes que ter conexión a internet para esto
+ Confirmación
+ Quere saír?
+
+ Máis
+ Sobre | Axuda
+ Etiquetas seguidas
+ Actividade pública
+ Informes
+ Compartir ligazón como texto
+ Compartir captura de páxina
+ Capturar imaxe de páxina web
+ Gardar imaxe en
+ Gardando captura como:
+ Enderezo da ligazón copiado …
+ Nova mensaxe
+ Ir arriba
+ Buscar persoas ou etiquetas
+ Saír da app
+ Vista móbil/escritorio
+ Compartir…
+ Etiquetas
+ Persoas
+ Por favor, engade un nome
+ Compartir ligazón
+ Gardar imaxe
+ Compartir imaxe
+ Abrir nun navegador externo…
+ Copiar ligazón ao portapapeis
+ Copia enderezo da imaxe ao portapapeis
+
+ Non se cargou a imaxe
+
+ Debes permitir \"Permiso de acceso a almacenamento\" para gardar capturas. Podes
+ 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*.
+ 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 permites acceder ao almacenamento, para poder gardar imaxes posteriormente, deberás abrir: preferencias do sistema - apps - dandelion* no dispositivo.
+ Na sección de permisos podes activar o \"permiso de escritura no almacenamento\".
+ Permiso denegado.
+ Permiso concedido. Inténtao de novo.
+ Nodo personalizado
+ Nome do nodo
+ Protocolo
+ Enderezo do nodo
+ Faltan datos
+ Ir a última páxina lida na conversa?
+ Agochar a barra de estado na vista principal
+ Agochar barra de estado
+ Mostrar título na vista principal
+ Mostrar título
+ Atallo do lanzador
+
+ A barra superior carga a conversa
+ Preme nun espazo baleiro na barra superior para abrir a conversa
+
+ Aparencia
+ Rede
+ Axustes do nodo
+ Operabilidade
+
+
+ Cadro de navegación
+ Controla a visibiidade das entradas no cadro de navegación
+ Usuaria
+ Xeral
+ Admin
+
+ Decorado e cores
+ Escolle qué cores se utilizan na aplicación
+ Cor primaria
+ Cor das barras de ferramentas
+ Cor de énfase
+ Cor da barra de progreso
+ Modo AMOLED
+ Sobreescribir as cores co negro dos dispositivos AMOLED en varios lugares da aplicación. Precisa reiniciar para habilitar esta preferencia. Para navegar diaspora* en modo oscuro tamén precisa activar o Decorado Oscuro, que pode atopar nos axustes personais na súa conta de diaspora*.
+
+ Notificacións extendidas
+ Extender a icona da campá de notificación con un menú desplegable que mostre a categoría das notificacións
+ Cambiar o idioma de esta aplicación. Reinicia para que se aplique o troco
+ Idioma
+ Idioma do sistema
+
+ Estableza o tamaño do texto na Vista Web
+ Tamaño do texto
+ Normal
+ Grande
+ Enorme
+
+ Cargar imaxes
+ Xestionar a carga de imaxes por ex. para aforrar datos do móbil
+
+ Rotación da pantalla
+ Controlar a rotación automática da pantalla
+ Por omisión
+ Sensor\n(ignorar axustes do dispositivo)
+ Retrato
+ Paisaxe
+
+ Cargar perfil Tor
+ Cargar axustes proxy para Tor (Orbot) HTTP Proxy
+ Proxy
+ Habilitar Proxy
+ Proxy para o tráfico de dandelion* para saltar cortalumes.\nPodería precisar reinicio. Esto podería non funcionar nalgúns móbiles.
+ Servidor
+ Porto
+ Precisa reiniciar a app para desactivar o uso do proxy
+ Cargadas as preferencias do proxy Orbot
+
+ Abrir ligazóns externas con Chrome Custom Tabs. Chromium ou Google Chrome ten que estar instalado para utilizar esta característica.\nIMPORTANTE: Chrome Custom Tabs non utiliza os servidores proxy configurados!
+
+ Axustes personais
+ Abrir os axustes da conta diaspora*
+ Xestiona a lista de contactos
+ Xestionar etiquetas
+ Deixar de seguir etiquetas que segues
+ Mudar de conta
+ Eliminar os datos locais da sesión e cambiar a outro nodo/conta de diaspora*
+ Esto eliminará todas as cookies e datos de sesión. Seguro que queres mudar de conta?
+ Limpar cache
+ Limpar a cache da VistaWeb
+ Agochar automáticamente as barras superior e inferior mentras desplaza
+ Barras de ferramentas intelixentes
+ Engadir aviso-compartido-por
+ Engadir unha referencia a que foi compartido desde esta aplicación: [via #dandelion]
+
+ Varios
+ Restablecer completamente
+ Eliminar todolos axustes locais da app e desconectar todas as contas
+ 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?
+ Activar un AdBlocker básico. Poderían verse anuncios por exemplo en vistas incrustadas
+ Bloquear publicidade
+ Sobre
+ Licenza
+ Depurando
+ Aplicación
+ Dispositivo
+ Nodo diaspora*
+ Rexistro de depuración
+ Rexistro de depuración (polo miúdo)
+ Versión da App: %1$s
+ Versión Android: %1$s
+ Nome do dispositivo: %1$s
+ Alcume: %1$s
+ Nome do perfil do nodo: %1$s
+ Dominio do nodo: %1$s
+ Ficheiro de depuración copiado ao portapapeis
+ 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.
+ Contribúa ao código!
+ 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!
+ Aquí as fontes
+ Traduce a app!
+ 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.
+ Deixame traducir
+ Danos a túa opinión!
+ 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!
+ Reporte erros
+ Difunde!
+ Dille aos teus amigos e familiares que utilizas diaspora* e #dandelion! Por qué non escribir sobre a experiencia? Encantaríanos saber de ti!
+ Comparte a aplicación
+ Ei!! Olla #dandelion! %1$s
+
+ Mantedores
+ Esta aplicación está a ser desenvolta e mantida por <br><br>%1$s
+ Contribúen
+ %1$s<br><br>Grazas!
+ Licenza GNU GPLv3+
+ Código de terceiras partes
+ Utilízase o seguinte código:
+ Inspirámonos e collemos código de LeafPic. Bótalle un ollo, tamén é software libre!
+ Cóntame máis
+ Activar para abrir vídeos YouTube nunha app externa
+ Ligazóns YouTube
+ Cambiar o decorado da túa conta
+ Tira para actualizar
+ Tirar hacia abaixo na parte superior da páxina.\nDebes reiniciar a app para que os cambios se apliquen.
+
diff --git a/app/src/main/res/values-hi/strings-about.xml b/app/src/main/res/values-hi/strings-about.xml
deleted file mode 100644
index 54191dc5..00000000
--- a/app/src/main/res/values-hi/strings-about.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-hi/strings-preferences.xml b/app/src/main/res/values-hi/strings-preferences.xml
deleted file mode 100644
index 3885ddb3..00000000
--- a/app/src/main/res/values-hi/strings-preferences.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index 193ab72a..07facc0c 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -1,11 +1,41 @@
-
-
-
-
-
-
-
-
+
+ नेविगेशन ड्रॉवर खोलें
+ नेविगेशन ड्रॉवर को बंद करें
+
+ सेटिंग्स
+ खोजें
+ बदलाव लॉग
+
+
+
+ अधिक
+ साझा करें...
+
+
+ स्थिति पट्टी छुपाएँ
+ शीर्षक दिखाएं
+
+
+ दिखावट
+
+
+
+
+ इस ऐप की भाषा बदलें परिवर्तन प्रभावी होने के लिए ऐप को पुन: प्रारंभ करें
+ भाषा
+
+
+
+
+
+
+ कैश को साफ़ करें
+
+ विविध
+ जानकारी
+ लाइसेंस
+
+ योगदान कर्ता
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
new file mode 100644
index 00000000..43d88f4b
--- /dev/null
+++ b/app/src/main/res/values-hr/strings.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-hu/strings-about.xml b/app/src/main/res/values-hu/strings-about.xml
deleted file mode 100644
index 54191dc5..00000000
--- a/app/src/main/res/values-hu/strings-about.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-hu/strings-preferences.xml b/app/src/main/res/values-hu/strings-preferences.xml
deleted file mode 100644
index 3885ddb3..00000000
--- a/app/src/main/res/values-hu/strings-preferences.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 193ab72a..36ef8efa 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -1,11 +1,193 @@
-
-
-
-
-
-
-
-
+
+ Újratölt
+
+ Beállítások
+ Értesítések
+ Beszélgetések
+ Hírfolyam
+ Profil
+ Csoportjaim
+ Tevékenységeim
+ Kedvelések
+ Hozzászólások
+ Megemlítések
+ Nyilvános
+ Keresés
+ Partnerek
+ Újdonságok
+ Statisztika
+
+ Összes értesítés
+ Más hozzászólások
+ Közvetlen hozzászólások
+ Kedvelések
+ Megemlítések
+ Megosztások
+ Új kapcsolatok
+
+ Hiba: Nem lehetett lekérni a podok listáját!
+ Bocsánat, csatlakoznod kell az internethez a folytatáshoz
+ Jóváhagyás
+ Ki akarsz lépni?
+
+ Egyebek
+ Névjegy | Segítség
+ Követett címkék
+ Nyilvános tevékenységek
+ Jelentések
+ Link megosztása szövegként
+ Weboldal képernyőképének megosztása
+ Képernyőkép készítése weboldalról
+ Kép mentése a következő helyre
+ Képernyőkép mentése mint:
+ Másolt link címe…
+ Új bejegyzés
+ Ugrás az oldal tetejére
+ Címkék vagy emberek keresése
+ Kilépés az alkalmazásból
+ Mobil-/asztali mód
+ Megosztás…
+ címkékre
+ emberekre
+ Kérlek, adj meg egy nevet
+ Link címének megosztása
+ Kép mentése
+ Kép megosztása
+ Megnyitás külső böngészőben…
+ Link címének másolása a vágólapra
+ Kép címének másolása a vágólapra
+
+ Nem lehet betölteni a képet
+
+ Engedélyezned kell a tárhely elérését a képernyőképek mentéséhez. Aztán teljesen be kell zárnod az alkalmazást vagy újra kell indítanod az eszközt. Ha most nem akarod engedélyezni a tárhely elérését, de később szeretnéd használni a képernyőkép-funkciót, kérlek, tedd meg az alábbi helyen: Rendszerbeállítások - Alkalmazások - dandelion*. Itt az engedélyeknél hozzáadhatod az a tárhelyre való írást.
+ Engedélyezned kell a tárhely elérését a képek mentéséhez/feltöltéséhez. Aztán teljesen be kell zárnod az alkalmazást vagy újra kell indítanod az eszközt. Ha most nem akarod engedélyezni a tárhely elérését, de később szeretnéd használni a képernyőkép-funkciót, kérlek, tedd meg az alábbi helyen: Rendszerbeállítások - Alkalmazások - dandelion*. Itt az engedélyeknél hozzáadhatod az a tárhelyre való írást.
+ Hozzáférés megtagadva.
+ Hozzáférés megtagadva. Kérlek, próbáld újra!
+ Egyéni pod
+ Pod neve
+ Protokoll
+ Pod címe
+ Hiányzó érték
+ Ugorjunk a legutóbb meglátogatott oldalra a hírfolyamon belül?
+
+ A fenti eszköztár betölti a hírfolyamot
+ Kattints egy üres helyre a fenti eszköztáron a hírfolyam megnyitásához
+
+ Megjelenés
+ Hálózat
+ Podbeállítások
+ Működés
+
+
+ Navigációs csúszka
+ Az oldalsó navigációs menü elemei láthatóságának megadása
+ Felhasználó
+ Általános
+ Adminisztrátor
+
+ Témák és színek
+ Az alkalmazás által használt színek megadása
+ Elsődleges szín
+ Az eszköztárak színe
+ Másodlagos szín
+ A folyamatsáv színe
+ AMOLED mód
+ A színek felülbírálása feketével az alkalmazás sok részén, mely hasznos lehet AMOLED kijelzők esetében. Újra kell indítanod az alkalmazást ehhez a változtatáshoz. Hogy sötétben böngészd a diaspora*-ot, engedélyezned kell a Sötét téma beállítást, amely megtalálható a személyes diaspora* fiókbeállításaidnál.
+
+ Kiterjesztett értesítések
+ Az értesítések gombra kattintva megjelenik egy gyorsmenü, amely értesítéskategóriákat mutat
+ Az alkalmazás nyelvének megváltoztatása. Indítsd újra az alkalmazást, hogy a módosítások érvénybe lépjenek!
+ Nyelv
+ Rendszernyelv
+
+ A webnézet szövegméretének módosítása
+ Betűméret
+ Normál
+ Nagy
+ Óriási
+
+ Képek betöltése
+ Képek betöltésének be-/kikapcsolása pl. a kevesebb adatfelhasználás céljából
+
+ Kijelzőforgatás
+ Kijelzőforgatás automatikus irányítása
+ Alapértelmezett
+ Szenzor\n(rendszerbeállítások figyelmen kívül hagyása)
+ Álló
+ Fekvő
+
+ Tor profil betöltése
+ Proxybeállítások betöltése a Tor (Orbot) HTTP Proxynak
+ Proxy
+ Proxy engedélyezése
+ Proxy használata a dandelion* adatforgalmának a tűzfalak kikerüléséért.\nÚjraindítás szükséges lehet. Nem biztos, hogy minden telefonon működik.
+ Host
+ Port
+ Az alkalmazást újra kell indítani a proxyhasználat kikapcsolásához
+ Orbot proxyprofil betöltve
+
+ Külső linkek megnyitása a Chrome egyéni lapjaival. Ennek a funkciónak a használatához telepítve kell lennie a Chromiumnak vagy a Google Chrome-nak.\nFONTOS MEGJEGYZÉS: Chrome egyéni lapjai nem használják a beállított proxyszervereket!
+
+ Személyes beállítások
+ A diaspora*-fiókod beállításainak megnyitása
+ A partnereid listájának kezelése
+ Címkék kezelése
+ Címkék követésének megszüntetése
+ Fiókváltás
+ Helyi munkamenet adatának törlése és váltás másik diaspora*-podra vagy -fiókra
+ Ez törölni fogja az összes sütit és a munkamenet adatait. Tényleg fiókot akarsz váltani?
+ Gyorsítótár kiürítése
+ Beépített böngésző gyorsítótárjának kiürítése
+ A felső és alsó eszköztárak automatikus elrejtése görgetés közben
+ Intelligensen eltűnő eszköztárak
+ Használt program megemlítése megosztáskor
+ Hivatkozás erre az alkalmazásra a megosztásokban: [megosztva ezzel: #dandelion]
+
+ Egyéb
+ Teljes visszaállítás eredeti értékekre
+ Az alkalmazás összes helyi beállításának törlése és kijelentkezés az összes fiókból
+ Ez az összes módosított beállítás értékét visszaállítja alapra és kijelentkeztet téged az összes podról. A letöltött képeid érintetlenül maradnak. Biztos, hogy folytatod?
+ Alap hirdetésblokkoló (AdBlocker) engedélyezése. Reklámok jelenhetnek meg pl. a beépített megjelenítéseknél
+ Hirdetések blokkolása
+ Névjegy
+ Licenc
+ Hibakeresés
+ Alkalmazás
+ Eszköz
+ diaspora*-pod
+ Hibakeresési napló
+ Hibakeresési napló (részletes)
+ Alkalmazásverzió: %1$s
+ Android verzió: %1$s
+ Eszköznév: %1$s
+ Kódnév: %1$s
+ Podprofilnév: %1$s
+ Pod domain: %1$s
+ Hibakeresési napló átmásolva a vágólapra
+ A dandelion* a te segédalkalmazásod a diaspora* közösségi hálózat böngészésére. Olyan funkciókat ad hozzá a közösségi élményedhez, mint hasznos eszköztárak és proxyszerver-támogatás (pl. Tor).
+ Járulj hozzá a fejlesztéshez!
+ A dandelion* szabad szoftver és a diaspora* projekt elképzeléseit követi. Ha hozzá akarsz járulni, csak rajta! Jelenleg egy nagyon kis csapat vagyunk, így nagyra értékelünk bármilyen segítséget!
+ A program forrása
+ Fordítsd le az alkalmazást!
+ Nem érhető el az alkalmazás a nyelveden? Ezen változtathatsz! Mit szólnál ahhoz, ha segítenél nekünk a lefordításában? A crowdin platformot használjuk, hogy bárki le tudja fordítani az alkalmazást.
+ Hadd fordítsak
+ Adj visszajelzést!
+ A dandelion* még mindig fejlesztés alatt áll, szóval ha vannak javaslataid vagy bármilyen visszajelzésed, kérlek, használd a hibanyomkövetőt!
+ Hibajelentés
+ Ajánld másoknak!
+ Beszélj a barátaiddal és családtagjaiddal a diaspora*-ról és a #dandelionról! Mi lenne, ha blogolnál a tapasztalataidról? Szeretnénk hallani tőled valamit!
+ Az alkalmazás megosztása
+ Szia! Próbáld ki a #dandeliont! %1$s
+
+ Karbantartók
+ Ezt az alkalmazást jelenleg <br><br>%1$s fejleszti és tartja karban.
+ Hozzájárulók
+ %1$s<br><br>Köszönjük!
+ GNU GPLv3+ Licenc
+ 3. személytől származó könyvtárak
+ A következő könyvtárak vannak használatban:
+ A LeafPicből merítettünk némi inspirációt és programkódot. Próbáld ki, ez is szabad szoftver!
+ Tudj meg többet
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
new file mode 100644
index 00000000..43d88f4b
--- /dev/null
+++ b/app/src/main/res/values-in/strings.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-it/strings-about.xml b/app/src/main/res/values-it/strings-about.xml
deleted file mode 100644
index 957fa634..00000000
--- a/app/src/main/res/values-it/strings-about.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
- Informazioni
- Licenza
- Debug
- Applicazione
- Dispositivo
- Pod Diaspora
- Log di debug
- Log di debug (dettagliato)
- Versione app: %1$s
- Nome pacchetto: %1$s
- Versione Android: %1$s
- Nome dispositivo: %1$s
- Dominio pod: %1$s
- Log di debug copiato negli appunti
- Librerie di terze parti usate
-
-
-DiasporaForAndroid è la tua app per navigare sul social network Diaspora. Aggiunge funzioni, come un\'utile barra di navigazione e il supporto ai server proxy come la rete Tor, alla tua esperienza social. <br><br>
-
- Diaspora usa la sintassi Markdown per formattare i post. Puoi trovare maggiori informazioni su<br>
- https://wiki.diasporafoundation.org/Markdown_reference_guide/it <br> <br>
-
- DiasporaForAndroid è sviluppato liberamente e segue le idee del progetto Diaspora. <br>
- Puoi trovare il codice sorgente su Github: <br>
- https://github.com/Diaspora-for-Android/diaspora-android <br> <br>
-
- Se trovi qualsiasi problema o hai dei suggerimenti puoi usare il nostro bug tracker al link sopraccitato.
- Alternativamente puoi postare la tua domanda con l\'hashtag #DFAQ su Diaspora. <br> <br>
- Quest\'app non è tradotta nella tua lingua? Visita il nostro progetto su Crowdin e aiuta la traduzione!<br>
- https://crowdin.com/project/diaspora-for-android <br> <br>
-
- Sentiti poi libero di parlare ai tuoi amici di #DiasporaForAndroid!
-
-
diff --git a/app/src/main/res/values-it/strings-preferences.xml b/app/src/main/res/values-it/strings-preferences.xml
deleted file mode 100644
index 01fbf921..00000000
--- a/app/src/main/res/values-it/strings-preferences.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
-
-
- Aspetto
- Rete
- Impostazioni pod
-
-
- Menù di navigazione
- Controlla la visibilità degli elementi nel menù di navigazione
- Visibilità degli elementi
-
- Dimensione font
-
-
- Carica immagini
- Disabilita il caricamento delle immagini per risparmiare la rete dati
-
- Attiva proxy
- Traffico del proxy di Diaspora per bypassare i firewall.\nPuò essere necessario il riavvio dell\'app
- Host
- Porta
-
-
- Impostazioni personali
- Apri le impostazioni del tuo account Diaspora
- Contatti
- Gestisci il tuo elenco di contatti
- Gestisci hashtag
- Aggiungi ed elimina gli hashtag che stai seguendo
- Cambia account
- Elimina dati della sessione locale e passa ad un altro pod/account Diaspora
- Questo eliminerà tutti i cookie e i dati della sessione. Vuoi veramente cambiare il tuo account?
- Pulisci cache
- Pulisci cache di WebView
- Nascondi barre superiori e inferiori automaticamente quando scrolli
- Barre che si nascondono intelligentemente
- Aggiungi avviso dell\'app
- Aggiunge un riferimento a quest\'app (\"Condiviso da…\") nei testi condivisi
-
-
-
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 0d3b5547..8271dda5 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -1,73 +1,213 @@
-
-
- *[condiviso con #DiasporaForAndroid]*
-
- Ricarica
- C\'è una notifica non letta. La vuoi leggere?
-
- Impostazioni
- Notifiche
- Conversazioni
- Stream
- Profilo
- Aspetti
- Attività
- Piaciuti
- Commentati
- Menzioni
- Pubblico
- Cerca
-
- Seleziona pod
- Inserisci dominio del pod
- Conferma URL del pod
- Nota: l\'elenco dei pod sicuri si trova su https://podupti.me. Si può inserire nel relativo campo qualsiasi pod non presente nell\'elenco.
- Inserisci un dominio valido
- Errore: impossibile ottenere la lista dei pod!
- Devi essere connesso ad internet per proseguire
- Conferma
- Vuoi veramente usare\nhttps://%1$s\ncome tuo pod di Diaspora?
- Vuoi veramente uscire?
-
- Altro
- Informazioni | Aiuto
- Tag seguiti
- Attività pubbliche
- Condividi link
- Condividi screensot
- Fai uno screenshot
- Salvataggio dell\'immagine in
- Salvataggio dello screenshot come:
- Indirizzo copiato…
- Nuovo post
- Vai in cima
- Cerca tag o persone
- Esci dall\'app
- Attiva visualizzazione mobile/desktop
- Condividi…
- per tag
- per persona
- Inserisci un nome
- Condividi link
- Salva immagine
- Condividi immagine
- Apri nel browser…
- Copia link negli appunti
-
- Attenzione: impossibile impostare proxy di rete…
- Impossibile caricare immagine
- Tutti i tag
-
- Devi garantire il permesso di accesso alla memoria per poter salvare gli screenshot. Dopodiché devi
+
+ Apri barra di navigazione
+ Chiudi barra di navigazione
+ Ricarica
+ Chiudi
+ Annulla
+
+ Impostazioni
+ Notifiche
+ Conversazioni
+ Stream
+ Profilo
+ Aspetti
+ Attività
+ Piaciuti
+ Commentati
+ Menzioni
+ Pubblico
+ Cerca
+ Contatti
+ Log delle modifiche
+ Statistiche
+
+ Tutte le notifiche
+ Inoltre ha commentato
+ Commento sul post
+ Ha messo Mi piace
+ Ha menzionato
+ Ha ricondiviso
+ Ha iniziato a condividere con te
+
+ Errore: impossibile ottenere la lista dei pod!
+ Devi essere connesso ad internet per proseguire
+ Conferma
+ Vuoi veramente uscire?
+
+ Altro
+ Informazioni | Aiuto
+ Tag seguiti
+ Attività pubbliche
+ Segnalazioni
+ Condividi link come testo
+ Condividi screenshot della pagina Web
+ Fai uno screenshot della pagina web
+ Salvataggio dell\'immagine in
+ Salvataggio dello screenshot come:
+ Indirizzo copiato…
+ Nuovo post
+ Vai in cima
+ Cerca tag o persone
+ Esci dall\'app
+ Attiva visualizzazione mobile/desktop
+ Condividi…
+ per tag
+ per persona
+ Inserisci un nome
+ Condividi link
+ Salva immagine
+ Condividi immagine
+ Apri nel browser…
+ Copia link negli appunti
+ Copia indirizzo dell\'immagine negli appunti
+
+ Impossibile caricare immagine
+
+ Devi garantire il permesso di accesso alla memoria per poter salvare gli screenshot. Dopodiché devi
chiudere completamente l\'app o riavviare il dispositivo. Se non permetti l\'accesso alla memoria ma vuoi usare la
funzione degli screenshot più avanti, puoi garantire il permesso successivamente. Vai su: Impostazioni - App -
- Diaspora. Nella sezione dei permessi puoi garantire il permesso per la scrittura sul dispositivo.
- Devi garantire il permesso di accesso alla memoria per poter salvare e caricare le immagini. Dopodiché devi
+ dandelion*. Nella sezione dei permessi puoi garantire il permesso per la scrittura sul dispositivo.
+ Devi concedere il permesso di accesso alla memoria per poter salvare e caricare le immagini. Dopodiché devi
chiudere completamente l\'app o riavviare il dispositivo. Se non permetti l\'accesso alla memoria ma vuoi
- salvare le immagini più avanti, puoi garantire il permesso successivamente. Vai su: Impostazioni - App -
- Diaspora. Nella sezione dei permessi puoi garantire il permesso per la scrittura sul dispositivo.
- Permesso negato.
- Permesso garantito. Si prega di riprovare.
+ salvare le immagini più avanti, puoi concedere il permesso successivamente. Vai su: Impostazioni - App -
+ dandelion*. Nella sezione dei permessi puoi concedere il permesso per la scrittura sul dispositivo.
+ Permesso negato.
+ Permesso concesso. Si prega di riprovare.
+ Pod personalizzato
+ Nome del pod
+ Protocollo
+ Indirizzo del pod
+ Valore mancante
+ Salta all\'ultima pagina visitata nello stream?
+ Nascondi barra di stato nella schermata principale
+ Nascondi la barra di stato
+ Mostra titolo nella schermata principale
+ Mostra titolo
+ Avvio rapido
+
+ La barra superiore apre lo stream
+ Premi su uno spazio vuoto nella barra degli strumenti superiore per aprire lo stream
+
+ Aspetto
+ Rete
+ Impostazioni pod
+ Operabilità
+
+
+ Menù di navigazione
+ Controlla la visibilità degli elementi nel menù di navigazione
+ Utente
+ Generali
+ Amministrazione
+
+ Tema e colori
+ Scegli quali colori usare nell\'app
+ Colore primario
+ Colore della barra
+ Colore secondario
+ Colore della barra dei progressi
+ Modalità AMOLED
+ Sostituzione dei colori con display AMOLED scuro in molte parti dell\'app. È necessario riavviare per attivare o disattivare questa impostazione. Per utilizzare diaspora* in scuro è inoltre necessario attivare il tema scuro, che può essere trovato nelle impostazioni dell\'account personale di diaspora*.
+
+ Notifiche estese
+ Estendi il bottone delle notifiche con un menù che mostra le categorie di notifiche
+ Cambia lingua dell\'app. Riavvia affinchè le modifiche abbiano effetto
+ Lingua
+ Lingua di sistema
+
+ Controllo dimensione testo del WebView
+ Dimensione font
+ Normale
+ Grande
+ Molto grande
+
+ Carica immagini
+ Disabilita il caricamento delle immagini per risparmiare la rete dati
+
+ Rotazione dello schermo
+ Controlla la rotazione automatica dello schermo
+ Predefinito
+ Sensore\n(ignora le impostazioni di sistema)
+ Verticale
+ Orizzontale
+
+ Carica i valori predefiniti di Tor
+ Carica le impostazioni del proxy per il proxy HTTP di Tor (Orbot)
+ Proxy
+ Attiva proxy
+ Usa il proxy con i dati di dandelion* per eludere i firewall.\nPotrebbe essere necessario il riavvio
+ Host
+ Porta
+ E\' necessario riavviare l\'app per disattivare l\'utilizzo del proxy
+ Orbot proxy preset caricato
+
+ Apri collegamenti esterni con le schede personalizzate di Chrome. Chromium o Google Chrome devono essere installati per questa funzione. \nNOTA IMPORTANTE: le schede personalizzate di Chrome non usano i server proxy configurabili!
+
+ Impostazioni personali
+ Apri le impostazioni del tuo account diaspora*
+ Gestisci il tuo elenco di contatti
+ Gestisci hashtag
+ Non seguire più gli hashtag seguiti
+ Cambia account
+ Elimina dati della sessione locale e passa ad un altro pod/account diaspora*
+ Questo eliminerà tutti i cookie e i dati della sessione. Vuoi veramente cambiare il tuo account?
+ Pulisci cache
+ Pulisci cache di WebView
+ Nascondi barre superiori e inferiori automaticamente quando scrolli
+ Barre che si nascondono intelligentemente
+ Aggiungi avviso dell\'app
+ Aggiungere un riferimento a questa applicazione ai testi condivisi: [via #dandelion]
+
+ Altro
+ Reset completo
+ Elimina localmente tutte le impostazioni relative all\'app e disconnette da tutti gli account
+ Questo cancellerà tutte le impostazioni dell\'app che sono state cambiate ai loro valori predefiniti e ti disconnetterà da tutti i pod. Le immagini scaricate non verranno toccate. Sei sicuro di voler procedere?
+ Abilitare AdBlocker base. Gli annunci possono essere inclusi ad es. nelle visualizzazioni incorporate
+ Blocca le pubblicità
+ Informazioni
+ Licenza
+ Debug
+ Applicazione
+ Dispositivo
+ Pod diaspora*
+ Log di debug
+ Log di debug (dettagliato)
+ Versione app: %1$s
+ Versione Android: %1$s
+ Nome dispositivo: %1$s
+ Codename: %1$s
+ Pod alias: %1$s
+ Dominio pod: %1$s
+ Log di debug copiato negli appunti
+ dandelion* è la tua app per l\'esplorazione del social network diaspora*. Aggiunge funzionalità, quali un\'utile barra degli strumenti e il supporto per i server proxy come la rete Tor, alla vostra esperienza social.
+ Contribuisci al codice!
+ dandelion* è sviluppato liberamente e segue le idee del progetto diaspora*. Se vuoi contribuire sei il benvenuto! Attualmente siamo un team molto piccolo, quindi apprezziamo qualsiasi tipo di aiuto!
+ Ottieni il codice sorgente
+ Traduci l\'app!
+ L\'app non è disponibile nella tua lingua? Si può cambiare! Perché non ci aiuti a tradurlo? Utilizziamo la piattaforma Crowdin per permettere a chiunque di tradurre l\'app.
+ Fammi tradurre
+ Lascia un feedback!
+ dandelion* è ancora in sviluppo, quindi se avete suggerimenti o qualsiasi tipo di feedback, utilizza lo strumento di segnalazione dei bug per dirci la tua!
+ Segnala un bug
+ Passaparola!
+ Dì ai tuoi amici e familiari di diaspora* e di #dandelion! Perché non scrivi un post sulla tua esperienza? Ci piacerebbe sentire cosa ne pensate!
+ Condividi l\'app
+ Ehi! Scopri #dandelion! %1$s
+
+ Manutentori
+ Quest\'app è attualmente sviluppata e mantenuta da <br><br>%1$s
+ Collaboratori
+ %1$s<br><br>Grazie!
+ Licenza GNU GPL versione 3 o superiore
+ Librerie di terze parti
+ Sono utilizzate le seguenti librerie:
+ Abbiamo preso ispirazione e parte del codice da LeafPic. Dagli un\'occhiata, anch\'esso è software libero!
+ Dimmi di più
+ Abilita l\'apertura dei link Youtube su app esterna
+ Links Youtube
+ Cambia il tema del tuo account
+ Trascina per aggiornare
+ Trascina dall\'alto al basso per aggiornare la pagina.\nDevi riavviare l\'app affinchè le modifiche abbiano effetto.
diff --git a/app/src/main/res/values-iw-rIL/strings.xml b/app/src/main/res/values-iw-rIL/strings.xml
new file mode 100644
index 00000000..cd8d0245
--- /dev/null
+++ b/app/src/main/res/values-iw-rIL/strings.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml
new file mode 100644
index 00000000..9626eba5
--- /dev/null
+++ b/app/src/main/res/values-iw/strings.xml
@@ -0,0 +1,37 @@
+
+
+
+
+ הגדרות
+ חפש
+ רשימת שינויים
+
+
+
+ עוד
+
+
+ הסתר שורת מצב
+
+
+ מראה
+
+
+ כללי
+
+
+ שנה את שפת האפליקציה. אתחל את האפליקציה בכדי שהשינויים יכנסו לתוקף
+ שפה
+
+
+
+ ברירת מחדל
+
+
+
+
+ שונות
+ אודות
+
+ תורמים
+
diff --git a/app/src/main/res/values-ja/strings-about.xml b/app/src/main/res/values-ja/strings-about.xml
deleted file mode 100644
index 21d010b0..00000000
--- a/app/src/main/res/values-ja/strings-about.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
- について
- ライセンス
- デバッグ
- アプリケーション
- デバイス
- ダイアスポラ ポッド
- デバッグログ
- デバッグ ログ (詳細)
- アプリバージョン: %1$s
- パッケージ名: %1$s
- Android バージョン: %1$s
- デバイス名: %1$s
- ポッドドメイン: %1$s
- デバッグログをクリップボードにコピーしました
- 使用したサードパーティ ライブラリー
-
-
-DiasporaForAndroid は、ダイアスポラ ソーシャル ネットワークを閲覧するためのコンパニオン アプリです。ソーシャル体験に便利なツールバーや Tor のようなプロキシ サーバーのサポートのような追加機能があります。<br><br>
-
-ダイアスポラは、投稿の書式にマークダウンを使用します。詳細は<br>
-https://wiki.diasporafoundation.org/Markdown_reference_guide <br> <br>
-
-DiasporaForAndroid は自由に無料で開発され、ダイアスポラ プロジェクトの考えをフォローしています。<br>
-Github でソースコードを見つけることができます: <br>
-https://github.com/Diaspora-for-Android/diaspora-android <br> <br>
-
-何か問題に直面したり、提案がある場合は、上記のリンクで私たちのバグトラッカーを使用できます。
-またダイアスポラにハッシュタグ #DFAQ で質問を投稿することもできます。<br> <br>
-このアプリがあなたの言語で利用可能できませんか? Crowdin.com で私たちのプロジェクトを確認して、翻訳を手伝ってください!<br>
-https://crowdin.com/project/diaspora-for-android <br> <br>
-
-また気軽に #DiasporaForAndroid について友達に教えてください!
-
-
diff --git a/app/src/main/res/values-ja/strings-preferences.xml b/app/src/main/res/values-ja/strings-preferences.xml
deleted file mode 100644
index 909ff218..00000000
--- a/app/src/main/res/values-ja/strings-preferences.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
-
-
- 外観
- ネットワーク
- ポッドの設定
-
-
- ナビゲーション スライダー
- ナビゲーションドロワー内のエントリーの表示を制御します
- アイテムの表示
-
- フォントサイズ
-
-
- 画像の読み込み
- 安全なモバイルデータのため、画像の読み込みを無効にします
-
- プロキシを有効にする
- Diaspora の通信をプロキシして、ファイアウォールに回避します。\n再起動が必要になることがあります
- ホスト
- ポート
-
- Chrome カスタムタブ
- Chrome カスタム タブで外部リンクを開きます。この機能は Chromium または Google Chrome をインストールする必要があります
-
- 個人用設定
- Diaspora アカウント設定を開きます
- 連絡先
- 連絡先リストを管理します
- ハッシュタグを管理
- フォローしているハッシュタグを追加および削除します
- アカウントを変更
- ローカルのセッション データを消去し、別の Diaspora ポッド/アカウントに切り替えます
- すべてのクッキーとセッション データが消去されます。アカウントを変更してもよろしいですか?
- キャッシュをクリア
- WebView のキャッシュをクリアします
- スクロールの間、自動的に上部と下部のツールバーを非表示にします
- Intellihide ツールバー
- 共有方法の通知を追加
- 共有テキストに、このアプリへの参照 (\"…で共有\") を追加します
-
-
-
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index f987ef11..5c8c52ea 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -1,67 +1,207 @@
-
-
- *[#DiasporaForAndroid で共有]*
-
- 再読み込み
- 未読の通知。読みますか?
-
- 設定
- 通知
- トーク
- ストリーム
- プロフィール
- アスペクト
- アクティビティ
- いいね!
- コメント
- メンション
- 公開
- 検索
-
- ポッドを選択
- ポッドのドメインを入力
- ポッドの URL を確認
- 注意: ポットリストは、https://podupti.me に記載されているセキュリティで保護されたポッドが表示されます。表示されていないポッドを編集フィールドに入力することができます。
- 有効なドメインを入力してください
- エラー: ポッドのリストを取得できませんでした!
- 申し訳ありません。続行するにはインターネットに接続する必要があります
- 確認
- Diaspora のポッドとして\nhttps://%1$s\nを使用してもよろしいですか?
- 終了しますか?
-
- さらに
- 概要 |ヘルプ
- フォロー済タグ
- 公開アクティビティ
- テキストとしてリンクを共有
- Web ページのスクリーン ショットを共有
- Web ページのスクリーン ショットを撮る
- 画像を保存中
- スクリーンショットを保存中:
- リンク アドレスをコピーしました …
- 新しい投稿
- 先頭に移動
- タグまたは人で検索
- アプリを終了
- モバイル/デスクトップ表示の切り替え
- 共有…
- タグ別
- 人別
- 名前を追加してください
- リンク アドレスを共有
- 画像を保存
- 画像を共有
- 外部ブラウザーで開く…
- リンクアドレスをクリップボードへコピー
-
- 警告: ネットワーク プロキシを設定できませんでした…
- 画像を読み込むことができません
- すべてのタグ
-
- スクリーン ショットを保存するために、\"ストレージのアクセス許可\" を付与する必要があります。その後、完全にアプリを閉じるか、携帯電話を再起動する必要があります。ストレージへのアクセスを許可しないで、後でスクリーン ショット機能を使用する場合は、後でアクセス許可を付与することができます。その場合: システム設定 - アプリ - Diaspora を開いて、アクセス許可のセクションで、\"ストレージの書き込みアクセス許可\" を付与することができます。
- 画像を保存/アップロードするために、\"ストレージのアクセス許可\" を付与する必要があります。その後、完全にアプリを閉じるか、携帯電話を再起動する必要があります。ストレージへのアクセスを許可しないで、後で画像を保存したい場合は、後でアクセス許可を付与することができます。その場合: システム設定 - アプリ - Diaspora を開いて、アクセス許可のセクションで、\"ストレージの書き込みアクセス許可\" を付与することができます。
- アクセスが拒否されました。
- アクセスを許可しました。もう一度やり直してください。
+
+ ナビゲーションドロワーを開く
+ ナビゲーションドロワーを閉じる
+ 再読み込み
+ 閉じる
+ キャンセル
+
+ 設定
+ 通知
+ トーク
+ ストリーム
+ プロフィール
+ アスペクト
+ アクティビティ
+ いいね!
+ コメント
+ メンション
+ 公開
+ 検索
+ 連絡先
+ 変更履歴
+ 統計情報
+
+ すべての通知
+ コメントもしました
+ 投稿にコメント
+ いいね!しました
+ メンションしました
+ リシェアしました
+ シェアを始めました
+
+ エラー: ポッドのリストを取得できませんでした!
+ 申し訳ありません。続行するにはインターネットに接続する必要があります
+ 確認
+ 終了しますか?
+
+ さらに
+ 概要 |ヘルプ
+ フォロー済タグ
+ 公開アクティビティ
+ 報告
+ テキストとしてリンクをシェア
+ Web ページのスクリーン ショットをシェア
+ Web ページのスクリーン ショットを撮る
+ 画像を保存中
+ スクリーンショットを保存中:
+ リンク アドレスをコピーしました …
+ 新しい投稿
+ 先頭に移動
+ タグまたは人で検索
+ アプリを終了
+ モバイル/デスクトップ表示の切り替え
+ シェア…
+ タグ別
+ 人別
+ 名前を追加してください
+ リンク アドレスをシェア
+ 画像を保存
+ 画像をシェア
+ 外部ブラウザーで開く…
+ リンクアドレスをクリップボードへコピー
+ 画像のアドレスをクリップボードへコピー
+
+ 画像を読み込むことができません
+
+ スクリーン ショットを保存するために、\"ストレージのアクセス許可\" を付与する必要があります。その後、完全にアプリを閉じるか、携帯電話を再起動する必要があります。ストレージへのアクセスを許可しないで、後でスクリーン ショット機能を使用する場合は、後でアクセス許可を付与することができます。その場合: システム設定 - アプリ - dandelion* を開いて、アクセス許可のセクションで、\"ストレージの書き込みアクセス許可\" を付与することができます。
+ 画像を保存/アップロードするために、\"ストレージのアクセス許可\" を付与する必要があります。その後、完全にアプリを閉じるか、携帯電話を再起動する必要があります。ストレージへのアクセスを許可しないで、後で画像を保存したい場合は、後でアクセス許可を付与することができます。その場合: システム設定 - アプリ - dandelion* を開いて、アクセス許可のセクションで、\"ストレージの書き込みアクセス許可\" を付与することができます。
+ アクセスが拒否されました。
+ アクセスを許可しました。もう一度やり直してください。
+ カスタム ポッド
+ ポッド名
+ プロトコル
+ ポッドのアドレス
+ 値がありません
+ ストリームの最後に訪れたページに移動しますか?
+ メイン画面のステータスバーを非表示にします
+ ステータスバーを非表示
+ メインビューにタイトルを表示します
+ タイトルを表示
+ ランチャーのショートカット
+
+ 上部ツールバーでストリームを読み込み
+ 上部ツールバーの空白部分をクリックして、ストリームを開きます。
+
+ 外観
+ ネットワーク
+ ポッドの設定
+ 操作性
+
+
+ ナビゲーション スライダー
+ ナビゲーションドロワー内のエントリーの表示を制御します
+ ユーザー
+ 一般
+ 管理
+
+ テーマと色
+ アプリ全体で使用される色を制御します
+ プライマリ色
+ ツールバーの色
+ アクセント色
+ プログレスバーの色
+ AMOLED モード
+ アプリの多くの部分を AMOLED フレンドリーな黒色の表示で上書きします。この設定を切り替えるには再起動する必要があります。ダイアスポラ* を暗く参照するには、ダイアスポラ* の個人アカウント設定にある、ダークテーマをアクティブにする必要があります。
+
+ 拡張通知
+ 通知のカテゴリーを示すドロップダウン・メニューで通知ベルを拡張します
+ このアプリの言語を変更します。 変更を反映するにはアプリを再起動します
+ 言語
+ システム言語
+
+ WebView のテキストサイズを調整
+ フォントサイズ
+ 標準
+ 大
+ 巨大
+
+ 画像の読み込み
+ 安全なモバイルデータのため、画像の読み込みを無効にします
+
+ 画面の回転
+ 画面の自動回転をコントロール
+ デフォルト
+ センサー\n(システムの設定を無視)
+ ポートレート (縦向き)
+ ランドスケープ (横向き)
+
+ Tor プリセットを読み込む
+ Tor (Orbot) HTTP プロキシのプロキシ設定を読み込みます
+ プロキシ
+ プロキシを有効にする
+ dandelion* の通信をプロキシして、ファイアウォールに回避します。\n再起動が必要になることがあります
+ ホスト
+ ポート
+ プロキシの使用を無効にするには、アプリを再起動する必要があります
+ Orbot プロキシのプリセットを読み込みました
+
+ Chrome のカスタム タブで外部リンクを開きます。この機能は Chromium または Google Chrome をインストールする必要があります。\n重要な注意: Chrome のカスタム タブは構成されているプロキシ サーバーを使用しません!
+
+ 個人用設定
+ diaspora* アカウント設定を開きます
+ 連絡先リストを管理します
+ ハッシュタグを管理
+ すでにフォローしているハッシュタグのフォローをやめます
+ アカウントを変更
+ ローカルのセッション データを消去し、別の diaspora* ポッド/アカウントに切り替えます
+ すべてのクッキーとセッション データが消去されます。アカウントを変更してもよろしいですか?
+ キャッシュをクリア
+ WebView のキャッシュをクリアします
+ スクロールの間、自動的に上部と下部のツールバーを非表示にします
+ Intellihide ツールバー
+ シェア方法の通知を追加
+ 共有テキストにこのアプリへの参照を追加します: [via #dandelion]
+
+ その他
+ 完全なリセット
+ すべてのアカウントから、アプリとログアウトに関連するすべての設定をローカルで消去します
+ これはアプリの変更された設定をすべてデフォルトにリセットして、すべてのポッドからログアウトします。ダウンロードした画像はそのまま残ります。続行してもよろしいですか?
+ 基本 AdBlocker を有効にします。広告は、埋め込みビューなどに含まれることがあります
+ 広告をブロック
+ 情報
+ ライセンス
+ デバッグ
+ アプリケーション
+ デバイス
+ ダイアスポラ* ポッド
+ デバッグログ
+ デバッグ ログ (詳細)
+ アプリバージョン: %1$s
+ Android バージョン: %1$s
+ デバイス名: %1$s
+ コード名: %1$s
+ ポッドプロファイル名: %1$s
+ ポッドドメイン: %1$s
+ デバッグログをクリップボードにコピーしました
+ dandelion* は、ソーシャル ネットワーク diaspora* をブラウジングするためのコンパニオン アプリです。便利なツールバーや Tor のようなプロキシ サーバーのサポートなどの機能を追加して、ソーシャル体験することができます。
+ コードを貢献!
+ dandelion* は自由にフリーで開発され、diaspora* プロジェクトのアイデアをフォローしています。貢献したい場合は、どうぞ! 現在私たちは、非常に小規模なチームなので、あらゆる種類の支援に感謝申し上げます!
+ ソースを取得
+ アプリを翻訳!
+ アプリがお使いの言語で利用できませんか? それを変更することができます! 翻訳して私たちを支援しませんか? Crowdin プラットフォームを使用して、誰でもアプリケーションを翻訳できるようにしています。
+ 翻訳させてください
+ フィードバックする!
+ dandelion* はまだ開発中なので、提案や何かフィードバックがあれば、私たちのバグ追跡システムにご連絡ください!
+ バグを報告
+ みんなに広めよう!
+ diaspora* と #dandelion について家族や友人に広めてください! あなたの体験についてブログしませんか? 私たちにあなたからの話を聞かせてください!
+ アプリを共有
+ やあ! #dandelion をチェックしてください! %1$s
+
+ メンテナンススタッフ
+ 現在、このアプリは以下の人によって開発およびメンテナンスされています <br><br>%1$s
+ 貢献者
+ %1$s<br><br>ありがとうございます!
+ GNU GPLv3+ ライセンス
+ サードパーティ ライブラリー
+ 以下のライブラリーが使用されます:
+ LeafPic からいくつかのインスピレーションとコードを得ました。チェックしてみてください。同様のフリーソフトウェアです!
+ さらに詳しく
+ 外部アプリで Youtube のリンクを開くことができます
+ Youtube のリンク
+ アカウントのテーマを変更
+ 引き下げて更新
+ ページの上から下に引き下げて更新します。\n変更を反映するため、アプリを再起動する必要があります。
diff --git a/app/src/main/res/values-jw/strings.xml b/app/src/main/res/values-jw/strings.xml
new file mode 100644
index 00000000..43d88f4b
--- /dev/null
+++ b/app/src/main/res/values-jw/strings.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml
new file mode 100644
index 00000000..5d824099
--- /dev/null
+++ b/app/src/main/res/values-kab/strings.xml
@@ -0,0 +1,203 @@
+
+
+
+ Ldi umuɣ n tunigin
+ Ffer umuɣ n tunigin
+ Smiren
+
+ Iɣewwaṛen
+ Ilɣa
+ Idiwenniyen
+ Agdil
+ Amaɣnu
+ Udmawen
+ Irmuden
+ Aḥemmel
+ Yettuwennet
+ Tummliwin
+ Azayez
+ Nadi
+ Inermisen
+ Amaynut
+ Tidaddanin
+
+ Meṛṛa ilɣa
+ Iwennet daɣen
+ Iwenniten ɣef yizen
+ Aḥemmel
+ Tummliwin
+ Yules beṭṭu
+ Yebda beṭṭu
+
+ Tuccḍa: Ur iemir ara ad d-yawi tabdart n ipoden!
+ Suref-aɣ, yessefk ad teqqneḍ ar Internet akken ad tkemmleḍ
+ Asentem
+ Tebɣiḍ ad teffɣeḍ?
+
+ Ugar
+ Ɣef | Tallelt
+ Tibzimin yettwaḍefren
+ Irmuden izuyaz
+ Ineqqisen
+ Bḍu aseɣwen am uḍris
+ Bḍu tuṭṭfa n ugdil n usmel web
+ Ṭṭef agdil n usmel web
+ Asekles n tugna ar
+ Asekles n tuṭṭfa s yisem:
+ Aseɣwen yettwanɣel…
+ Izen n uɣrab amaynut
+ Ddu ar usnas
+ Anadi s tebqzimin neɣ s imdanen
+ Ffeɣ seg usnas
+ Rmed/Sens timeẓri aselkim/aziraz
+ Bḍu…
+ s tebzimin
+ s imdanen
+ Rnu isem
+ Bḍu tansa n useɣwen
+ Sekles tugna
+ Bḍu tugna
+ Ldi deg iminig azɣaray…
+ Nɣel aseɣwen ɣef afus
+ Nɣel tugna ɣef afus
+
+ Ur izmir ara ad d-isali tugna
+
+ Yessefk ad tmuddeḍ tasiregt \"Snifel neɣ kkes agbur di tkarḍa Sd \" akken ad teskelseḍ tuṭṭfiwin n ugdil. Sakin, yessefk ad tmedleḍ asnas neɣ ad talseḍ tanekra n tiliɣri-ik. Ma yella ur tmuddeḍ ara tasiregt n unelcum ar umḍiq n usekles acu kan tebɣiḍ ad tesqedceḍ tamahilt n tuṭṭfa n ugdil ar zdat, yessefk ad tmuddeḍ tasiregt ticki. Ma ulac aṣili ldi: Iɣewwaren - isnasen - dandelion*. Di tgezmi Tisirag, yessefk ad tmuddeḍ tasiregt \"Snifel neɣ kkes agbur n tkarḍa Sd\".
+ Yessefk ad tmuddeḍ tasiregt \"Mudd tisirag n usekles \" akken ad teskelseḍ/ad tessaliḍ
+ tiwlafin. Sakin, yessefk ad tmedleḍ asnas neɣ ad talseḍ tanekra n tiliɣri-ik. Ma yella ur tmuddeḍ ara tasiregt n unekcum
+ ar umḍiq n usekles acu kan tebɣiḍ ad tesqedceḍ tamahilt n tuṭṭfa n ugdil ar zdat, yessefk ad tmuddeḍ tasiregt ticki. Ma ulac aṣili ldi: Iɣewwaren - isnasen -
+ dandelion*. Di tgezmi Tisirag, yessefk ad tmuddeḍ tasiregt \"Tisiragt n usekles n tira\".
+ Tasiregt tettwagi.
+ Tasiregt tettunefk. Ɛreḍ tikelt nniḍen.
+ Apod udmawan
+ Isem n upod
+ Aneggaf
+ Tansa n upod
+ Azal yettwazgel
+ Ddu ar usebter aneggaru yettwarzan deg usuddem?
+ Ffer afeggag n waddad di tmeẓri tagejdant
+ Ffer afeggag n waddad
+ Sken azwel deg iẓri agejdan.
+ Sken azwel
+ Anegzum n wagdil n umager.
+
+ Afeggag n ufella yessalay-d asuddem
+ Sit ɣef tallunt tilemt n ufella akken ad d-ldiḍ asuddem
+
+ Udem
+ Aẓeṭṭa
+ Iɣewwaṛen Pod
+ Tasnemhelt
+
+
+ Taḥnaccaḍt n iminig
+ Ad iqareɛ askan n inekcam deg ugalis n tunigin
+ Aseqdac
+ Amatu
+ Anedbal
+
+ Isental d yiniten
+ Ad iqareɛ initen yettwasqedcen i usnas
+ Ini amezwaru
+ Ini n ufeggag n ifecka
+ Ini asnawan
+ Ini n ufeggag n usfari
+ Askar AMOLED
+ Semselsi initen s uberkan yemṣadan d uskan AMOLED, ɣef ddeqs n yiḥricen n usnas. Akken ad tinigeḍ di diaspora* s sukan ubrik, tzemreḍ daɣen ad tesqedceḍ asentel Aberkan, win ara tafeḍ deg iɣewwaṛen-ik udmawanen n umiḍan-ik diaspora*.
+
+ Ilɣa n usiɣzef
+ Siɣzef nnaqus n ilɣa s umuɣ n udrurem ara d-iseknen taggayin n ulɣu
+ Beddel isem n tutlayt n ugrudem. Yessefk ad talseḍ tanekra n usnas akken teddu tutlaut tamaynut
+ Tutlayt
+ Tutlayt n unagraw
+
+ Ad iqareɛ teɣzi n uḍris i uskan Web
+ Teɣzi n tsefsit
+ Amagnu
+ Hraw
+ Meqqer
+
+ Sali-d tugniwin
+ Sens abeddel n tugniwin akken ad tḥerzeḍ isefka n uziraz
+
+ Tuzya n ugdil
+ Tuzya tawurmant n ugdil
+ Amezwer
+ Amaṭṭaf\n(ad yezgel iɣewwaṛen n unagraw)
+ S teɣzi
+ S tehri
+
+ Sali-d tawila tuzwirt Tor
+ Sali-d iɣewwaṛen n upṛuksi i upṛuksi HTTP Tor (Orbot)
+ Apṛuksu
+ Rmed apṛuksi
+ Apṛuksi i dandelion* akken ur tseqdaceḍ ara aɣrab n tmes.\nIzmer ilaq-ak tulsa n tnekra.
+ Asenneftaɣ
+ Tawwurt
+ Asnas yesra ad yales tanekra akken ad isens aseqdec n upṛuksi
+ Aseggem uzwir n upṛuksi Orbot i d-yulin
+
+ Ldi iseɣwan izɣrayen s Chrome Custom Tabs. Chromium neɣ Google Chrome yessefk ad yebded i useqdec n tmahilt-agi. \nTAMAWT TAXATERT: Chrome Custom Tabs ur iseqdac ara iqeddacen ipṛuksiyen ibedden!
+
+ Iɣewwaṛen udmawanen
+ Ldi iɣewwaṛen-ik n umiḍan diaspora*
+ Sefrek tabdart-ik n unermes
+ Sefrek Hashtag
+ Ur ṭṭafaṛ ara hashtag-agi
+ Beddel amiḍan
+ Sfeḍ isefka n tɣimit idiganen sakin ddu ar upud/amiḍan nniḍen diaspora*
+ Tamhelt-agi ad tsewḥel inagan n tuqqna akked isefka n tɣimit. Tebɣiḍ ad tbeddleḍ amiḍan?
+ Sfeḍ tuffirt
+ Sfeḍ tuffirt n WebView
+ Ad yeffer ifeggagen n ifecka n ufella d wadda s wudem awurman deg udrurem
+ Ffer afeggag n ifecka
+ Rnu yebḍa s tikti
+ Rnu tamsisɣelt ar usnas-agi i beṭṭu: [s #dandelion]
+
+ Ayen nniḍen
+ Tulsa n uwennez ummid
+ Ad yesfeḍ s wudem adigan akk iɣewwaṛen icudden ar usnas sakin ad yekkes si tuqqna akk imiḍanen
+ Ayagi ad yales awennez n ibeddilen meṛṛa ar wazalen-nsen n tazwara sakin ad isuffeɣ si tuqqna akk ipuden. Tugniwin-ik yudren ad qqiment akken llant. Tebɣiḍ ad tkemmleḍ?
+ Rmd amsewḥal n udellel. Adelle yezmer ad ddunt, m.d. deg tmeẓriyin tusliɣin
+ Sewḥel adellel
+ Ɣef
+ Turagt
+ Tamseɣtayt
+ Asnas
+ Ibenk
+ diaspora* Pod
+ Aɣmis n temseɣtayt
+ Aɣmis n temseɣtayt (Verbose)
+ Lqem n usnas: %1$s
+ Lqem Android: %1$s
+ Isem n yibenk: %1$s
+ Isem n tengalt: %1$s
+ Isem n umaɣnu n upud: %1$s
+ Tansa n upud: %1$s
+ Aɣmis n temseqtayt yettwaneɣlen ɣef afus
+ dandelion* d asnas-ik amdakel i tunigin deg uẓeṭṭa n tmetti diaspora*. Ad yernu timahilin am ifecka iwulmen akked usefrek n iqeddacen ipṛuksiyen am uẓeṭṭa Tor ar tarimit-ik n tmetti.
+ Ttekki di tengalt!
+ dandelion* d ilelli, udiɣ yeṭṭafaṛ tiktiwin n useɣzan diaspora*. Ma tebɣiḍ ad tettekkiḍ, Iya-d! Akka tura, nekni d tarbaɛt meẓẓiyen, ihi ad nebɣu yal anaw n tallelt!
+ Awi aɣbalu
+ Suqel asnas!
+ Asnas ulac-it s tutlayt-ik? Tzemreḍ ad tbeddleḍ ayagi! Acuɣer ur tettmudduḍ ara afus di tsuqilt-is? nseqdac asmel Crowdin akken ad nermed i yal yiwen ad isuqel asnas.
+ Eǧǧ-iyi ad suqleɣ
+ Mudd-d tikti!
+ dandelion* yezga di tneflit, ihi ma ɣur-k isumar neɣ yal tikti, seqdec aneḍfaṛ nneɣ n ibugen akken ad tazneḍ!
+ Azen ibugen
+ Siqeḍ awal!
+ Meslay i yimdukal-ik akked twacult-ik ɣef diaspora* d #dandelion! Acuɣer ur tettmaeslayeḍ ara deg iblugen ɣef aya? Nebɣa ad nsel kra sɣur-k!
+ Bḍu asnas
+ Hey! Senqed #dandelion! %1$s
+
+ Wid yettseggimen
+ Asnas-agi yezga di tneflit akked useggem sɣru <br><br>%1$s
+ Imttekkiyen
+ %1$s<br><br>Tanemmirt!
+ Turagt GNU GPLv3+
+ Tinedlisin tis kraḍ
+ Tinedlisin-agi ttwaseqdacent:
+ Newwi kra n tiktiwin akked tengat si LeafPic. Duu ad ten-twaliḍ. D aseɣẓan ilellil!
+ Ini-yid ugar
+
diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml
new file mode 100644
index 00000000..43d88f4b
--- /dev/null
+++ b/app/src/main/res/values-kmr/strings.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-kn/strings-about.xml b/app/src/main/res/values-kn/strings-about.xml
deleted file mode 100644
index 54191dc5..00000000
--- a/app/src/main/res/values-kn/strings-about.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-kn/strings-preferences.xml b/app/src/main/res/values-kn/strings-preferences.xml
deleted file mode 100644
index 3885ddb3..00000000
--- a/app/src/main/res/values-kn/strings-preferences.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml
index d8fdd669..2deb9a26 100644
--- a/app/src/main/res/values-kn/strings.xml
+++ b/app/src/main/res/values-kn/strings.xml
@@ -1,25 +1,40 @@
-
-
- ಮತ್ತೋಮ್ಮೆ ಲೋಡ್ ಮಾಡಿ
-
- ಸೆಟ್ಟಿಂಗ್ಗಳು
- ಇಷ್ಟವಾದ
- ಸಾರ್ವಜನಿಕ
- ಹುಡುಕಿ
-
- ಪೋಡ್ ಆಯ್ಕೆಮಾಡಿಕೊಳ್ಳಿ
-
- ಹೊಸ ಪೊಸ್ಟ್
- ಮೇಲಕ್ಕೆ ಹೋಗಿ
- ಹಂಚಿಕೊಳ್ಳಿ…
- ಕೊಂಡಿಯನ್ನು ಹಂಚಿಕೊಳ್ಳಿ
- ಚಿತ್ರವನ್ನು ಉಳಿಸಿ
- ಚಿತ್ರವನ್ನು ಹಂಚಿಕೊಳ್ಳಿ
- ಕ್ಲಿಪ್ಬೋರ್ಡ್ಗೆ ಕೊಂಡಿಯನ್ನು ನಕಲಿಸಿ
-
- ಎಲ್ಲಾ ಟ್ಯಾಗ್ಗಳು
-
+
+ ಮತ್ತೋಮ್ಮೆ ಲೋಡ್ ಮಾಡಿ
+
+ ಸೆಟ್ಟಿಂಗ್ಗಳು
+ ಇಷ್ಟವಾದ
+ ಸಾರ್ವಜನಿಕ
+ ಹುಡುಕಿ
+
+ ಇಷ್ಟವಾದ
+
+
+ ಹೊಸ ಪೊಸ್ಟ್
+ ಮೇಲಕ್ಕೆ ಹೋಗಿ
+ ಹಂಚಿಕೊಳ್ಳಿ…
+ ಕೊಂಡಿಯನ್ನು ಹಂಚಿಕೊಳ್ಳಿ
+ ಚಿತ್ರವನ್ನು ಉಳಿಸಿ
+ ಚಿತ್ರವನ್ನು ಹಂಚಿಕೊಳ್ಳಿ
+ ಕ್ಲಿಪ್ಬೋರ್ಡ್ಗೆ ಕೊಂಡಿಯನ್ನು ನಕಲಿಸಿ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ಪರವಾನಿಗೆ
+ Debug Log (Verbose)
+
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
new file mode 100644
index 00000000..a7989702
--- /dev/null
+++ b/app/src/main/res/values-ko/strings.xml
@@ -0,0 +1,196 @@
+
+
+
+ 사이드 메뉴 열기
+ 사이드 메뉴 닫기
+ 새로고침
+
+ 설정
+ 알림
+ 대화
+ 스트림
+ 프로필
+ 화면비율
+ 활동
+ 좋아하는
+ 댓글단
+ 멘션
+ 공개
+ 검색
+ 연락처
+ 변경사항
+ 상태
+
+ 모든 알림
+ 다른 코멘트
+ 게시물에 댓글 달기
+ 좋아하는
+ 멘션한
+ 재공유
+ 공유가 시작됨
+
+ 오류: 포드 목록을 검색하지 못했습니다!
+ 해당 작업을 실행하려면 인터넷에 연결되어 있어야 합니다.
+ 확인
+ 종료하시겠어요?
+
+ 더 보기
+ 도움말
+ 팔로우한 태그
+ 공개 활동
+ 리포트
+ 텍스트로 링크 공유
+ 웹페이지 스크린샷으로 공유
+ 웝페이지 스크린샷 찍기
+ 이미지 저장하기
+ 다음으로 스크린샷 저장:
+ 링크 주소를 복사했습니다 …
+ 새 게시물
+ 상단으로 이동
+ 태그 또는 사람으로 검색
+ 어플리케이션 종료
+ 모바일/데스크톱 보기 전환
+ 공유…
+ 태그로
+ 사람으로
+ 이름을 추가 하세요
+ 링크 주소 공유
+ 이미지 저장하기
+ 이미지 공유
+ 다른 브라우저에서 열기…
+ 링크 주소를 클립보드에 복사
+ 이미지 주소를 클립보드에 복사
+
+ 이미지를 불러올 수 없습니다
+
+ 스크린샷을 저장하려면 파일 저장소 접근 권한이 필요합니다. 권한을 승인하신 후
+ 앱을 완전히 종료하시거나 재부팅하세요.
+ 나중에 해당 기능을 사용하시려면 시스템 세팅 - 어플리케이션 -
+ dandelion* 에 들어가 저장소 쓰기 권한을 부여해주십시오.
+ 이미지를 업로드하거나 저장하려면 파일 저장소 접근 권한이 필요합니다. 권한을 승인하신 후
+ 앱을 완전히 종료하시거나 재부팅하세요.
+ 나중에 해당 기능을 사용하시려면 시스템 세팅 - 어플리케이션 -
+ dandelion* 에 들어가 저장소 쓰기 권한을 부여해주십시오.
+ 권한 거부됨.
+ 권한이 승인되었습니다. 다시 시도해보세요.
+ 사용자 정의 포드
+ 포드 이름
+ 프로토콜
+ 포드 주소
+ 값이 없습니다
+ 스트림의 마지막 방문 페이지로 이동합니까?
+
+ 상단 툴바에서 스트림 읽기
+ 상단 툴바의 빈 부분을 클릭해 스트림 열기
+
+ 모양
+ 네트워크
+ 포드 설정
+ 운용성
+
+
+ 탐색 슬라이더
+ 탐색 서랍에서 항목의 컨트롤 표시
+ 유저
+ 기본 설정
+ 관리자
+
+ 테마와 색상
+ 전체적인 앱의 색상을 선택하세요
+ 기본 색상
+ 툴바 색상
+ 강조 색상
+ 진행바 색상
+
+ 확장된 알림
+ 알림 카테고리를 나타내는 드롭 다운 메뉴에서 알림 벨을 확장합니다
+ 언어 변경하기. 재시작이 필요합니다.
+ 언어
+ 시스템 언어
+
+ 웹뷰 글자 크기 변경
+ 폰트 사이즈
+ 일반
+ 크게
+ 더 크게
+
+ 이미지 로드 여부
+ 이미지 로드 여부를 변경합니다. 예) 모바일 데이터를 아끼기 위해
+
+ 화면 회전
+ 자동 화면회전 여부를 변경합니다
+ 기본값
+ 센서\n(시스템 설정 무시)
+ 세로
+ 가로
+
+ 토르 프리셋 로드
+ 토르 (Orbot) 프록시 설정을 로드
+ 프록시
+ 프록시를 사용하도록 설정
+ Dandelion* 트래픽이 방화벽을 우회하도록 설정합니다.\n재시작이 필요합니다. 몇몇 기기에서는 동작하지 않을 수 있습니다.
+ 호스트
+ 포트
+ 프록시 사용을 해제 하려면 다시 시작해야 합니다
+ Orbot 프록시 프리셋 로드
+
+
+ 개인 설정
+ Diaspora* 계정 설정 열기
+ 연락처 리스트 관리
+ 해시태그 관리
+ 이미 팔로우된 해시태그 언팔로우
+ 계정 변경
+ 로컬 세션 데이터를 지우고, 다른 diaspora* 포드/계정으로 전환
+ 모든 쿠키 및 세션 데이터를 지웁니다. 계정을 변경합니까?
+ 캐시 삭제
+ WebView 캐시 지우기
+ 스크롤 하는 동안 위쪽 및 아래쪽 툴바 자동으로 숨기기
+ Intellihide 툴바
+ 꼬릿말 붙이기
+ 어플리케이션 꼬릿말을 붙입니다: [via #dandelion]
+
+ 기타
+ 전체 리셋
+ 모든 계정에서 로그아웃 하고 응용 프로그램에 관련된 모든 로컬 설정을 삭제
+ 이 어플리케이션의 모든 변경 된 설정은 기본값으로 재설정 되며 모든 포드에서 로그아웃 됩니다. 다운로드 된 이미지는 그대로 있을 것입니다. 계속합니까?
+ 이 앱에 대해서..
+ 라이선스
+ 디버깅
+ 어플리케이션
+ 기기
+ diaspora* 포드
+ 디버그 로그
+ 디버그 로그 (자세한 정보)
+ 앱 버전: %1$s
+ 안드로이드 버전: %1$s
+ 기기 이름: %1$s
+ 코드네임: %1$s
+ 포드 프로필 이름: %1$s
+ 포드 도메인: %1$s
+ 디버그 로그가 클립보드에 복사되었습니다
+ dandelion* 은 소셜 네트워크인 diaspora* 의 어플리케이션입니다. 툴바, 토르 등의 프록시서버 지원 등의 유용한 기능들을 포함하고 있습니다.
+ 개발에 도움을 주세요!
+ dandelion* 은 diaspora* 의 자유로움과 아이디어를 따라 개발됩니다. 기여하고 싶으세요? 그럼 해주십시오! 저희는 소규모의 팀으로 운영되고 있으므로 모든 기여활동을 감사히 생각합니다!
+ 소스코드
+ 앱 번역하기
+ 번역하기
+ 피드백
+ dandelion* 은 아직 개발단계입니다. 제안사항이나 피드백이 있으시면 버그 트래커를 이용해 알려주세요!
+ 버그 신고
+ 당신은 홍보대사
+ Diaspora* 와 #dandelion 에 대해 가족들과 친구들에게 이야기해보세요. 혹은 블로그나 인터넷 커뮤니티에 글을 써보시고요. 여러분의 의견을 듣고싶습니다!
+ 앱 공유
+ #dandelion 이거 완전 물건인데요! %1$s
+
+ 관리자
+ 현재 개발 및 관리 주체: <br><br>%1$s
+ 기여자
+ %1$s<br><br> 감사합니다!
+ GNU GPLv3+ License
+ 서드파티 라이브러리
+ 다음의 라이브러리들이 사용됬습니다:
+ LeafPic에서 약간의 영감을 받았으며, 코드들도 일부 차용했습니다.
+한번 사용해보세요! 무료 소프트웨어 입니다!
+ 더 자세히 보기
+
diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml
new file mode 100644
index 00000000..43d88f4b
--- /dev/null
+++ b/app/src/main/res/values-mk/strings.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-ml/strings-about.xml b/app/src/main/res/values-ml/strings-about.xml
deleted file mode 100644
index a5fbe45e..00000000
--- a/app/src/main/res/values-ml/strings-about.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- കുറിച്ച്
- ലൈസെൻസ്
- തിരുത്തൽ
- അപ്ലിക്കേഷന്
- ഡയസ്പോറ പോഡ്
- പ്രയോഗത്തിന്റെ പതിപ്പ്:%1$s
- പാക്കേജിന്റെ പേര്:%1$s
- പോഡിന്റെ അഡ്രസ്:%1$s
- മൂന്നാം കക്ഷി ലൈബ്രറികൾ ഉപയോഗിച്ചിട്ടുണ്ട്
-
-
-
diff --git a/app/src/main/res/values-ml/strings-preferences.xml b/app/src/main/res/values-ml/strings-preferences.xml
deleted file mode 100644
index 390a9139..00000000
--- a/app/src/main/res/values-ml/strings-preferences.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
-
-
-
-
- കാഴ്ച്ച
- ശൃങ്കല
- പോഡ് സജ്ജീകരണങ്ങൾ
-
-
- നാവിഗേഷൻ സ്ലൈഡർ
- നാവിഗേഷൻ ഡ്രാവറിൽ കാണേണ്ട എൻട്രികൾ നിയന്ത്രിക്കൂ
- ഇനത്തിന്റെ കാഴ്ച
-
- ഫോണ്ട് സൈസ്
-
-
- ചിത്രങ്ങൾ കാണിക്കണമോ
- മൊബൈൽ ഡാറ്റ ഉപഭോഗം കുറയ്ക്കാനായി ചിത്രങ്ങൾ ലോഡ് ചെയ്യാതിരിക്കുക
-
- പ്രോക്സി അനുവദിക്കൂ
- ഫയർവാളുകളെ മറികടക്കാൻ ഡയസ്പോറ ട്രാഫിക് പ്രോക്സി ചെയ്യൂ.\nപുനരാരംഭിക്കേണ്ടി വന്നേക്കാം
- ആഥിതേയൻ
- പോർട്ട്
-
-
- സ്വകാര്യ സജ്ജീകരണങ്ങൾ
- ബന്ധങ്ങൾ
- ബന്ധങ്ങളുടെ ക്രമം നിയന്ത്രികൂ
- ഹാഷ്ടാഗുകളെ നിയന്ത്രിക്കൂ
- താങ്കൾ പിന്തുടരുന്ന ഹാഷ്ടാഗുകളെ ചേർക്കുകയോ നീക്കുകയോ ചെയ്യൂ
- അക്കൗണ്ട് മാറ്റുക
- ലോക്കൽ സെഷൻ ഡാറ്റ തുടച്ചുമാറ്റി മറ്റൊരു ഡയസ്പോറ അക്കൗണ്ട്/പോഡ് തിരഞ്ഞെടുക്കുക
- ഇത് താങ്കളുടെ കുക്കികളും സെഷൻ ഡാറ്റയും തുടച്ചുനീക്കും. താങ്കൾക്ക് അക്കൗണ്ട് മാറ്റണമെന്ന് ഉറപ്പുണ്ടോ?
- കാഷ് തുടച്ചുനീക്കുക
- വെബ്വ്യൂ കാഷ് തുടച്ചുനീക്കുക
- മുകളിലെയും ചുവട്ടിലെയും ടൂൾബാറുകൾ സ്ക്രോൾ ചെയ്യുമ്പോൾ താനേ അപ്രത്യക്ഷമാക്കുക
- ടൂൾബാറുകൾ ഇന്റലിഹൈഡ് ചെയ്യുക
- അറിയിപ്പാൽ പങ്കുവച്ചത് എന്ന് കൂട്ടിച്ചേർക്കുക
- പങ്കുവയ്ക്കുന്ന വാചകങ്ങളിൽ ഈ പ്രയോഗത്തിന്റെ അവലംബം(\"…പങ്കുവച്ചത്\") എന്ന് കൂട്ടിച്ചേർക്കുക
-
-
-
diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml
index 83ec76f7..2f9811b6 100644
--- a/app/src/main/res/values-ml/strings.xml
+++ b/app/src/main/res/values-ml/strings.xml
@@ -1,67 +1,167 @@
-
-
- *[ #DiasporaForAndroid ഉപയോഗിച്ച് ഷെയർ ചെയ്തത്]*
-
- റീലോഡ്
- വായിക്കാത്ത അറിയിപ്പുകളുണ്ട്. വായിക്കുന്നുവോ?
-
- സജ്ജീകരണങ്ങൾ
- അറിയിപ്പുകൾ
- സംഭാഷണങ്ങൾ
- സ്ട്രീം
- പ്രൊഫൈൽ
- ആസ്പെക്റ്റുകൾ
- ആക്ടിവിറ്റികൾ
- ഇഷ്ടപെട്ടവ
- കമന്റ് ചെയ്തവ
- പരാമർശങ്ങൾ
- പരസ്യമായ
- തിരയുക
-
- പോഡ് തിരഞ്ഞെടുക്കുക
- പോഡ് അഡ്രസ് രേഖപ്പെടുത്തുക
- പോഡ് അഡ്രസ് ഉറപ്പാക്കുക
- അറിയിപ്പ് : പോഡുകളുടെ ലിസ്റ്റ് https://podupti.me യിൽ നിന്നാണ് ലഭിക്കുന്നത്. തിരുത്തൽ വരുത്താനുള്ളയിടത്തിൽ മറ്റു പോഡുകളുടെ അഡ്രസ് നൽകാം.
- ശരിയായ ഒരു അഡ്രസ് നൽകുക
- തെറ്റ്: പോഡുകളുടെ ലിസ്റ്റ് ലഭിക്കുന്നില്ല!
- ക്ഷമിക്കണം, തുടരുവാൻ ഇൻറർനെറ്റുമായി ബന്ധപ്പെട്ടിരിക്കണം
- ഉറപ്പിക്കൽ
- \nhttps://%1$s\nനിങ്ങളുടെ ഡയാസ്പൊറ പോഡായി ഉപയോഗിക്കണമെന്ന് ഉറപ്പാണോ?
- പുറത്തേക്കു പോകണമോ?
-
- കൂടുതൽ
- കുറിച്ച് | സഹായം
- പിന്തുടരുന്ന ടാഗുകൾ
- പൊതു പ്രവൃത്തികൾ
- ലിങ്ക് വാചകമായി പങ്കുവയ്ക്കൂ
- വെബ്പേജിന്റെ ചിത്രം പങ്കുവയ്ക്കൂ
- വെബ്പേജിന്റെ ചിത്രം എടുക്കുക
- ചിത്രം സൂക്ഷിക്കേണ്ട ഇടം
- സ്ക്രീനിന്റെ ചിത്രം സൂക്ഷിക്കേണ്ട പേര്:
- കണ്ണിയുടെ വിലാസം കോപ്പി ചെയ്തിട്ടുണ്ട് …
- പുതിയ പോസ്റ്റ്
- മുകളിലെയ്ക്ക് പോകൂ
- ടാഗ് പ്രകാരമോ വ്യക്തികൾ പ്രകാരമോ തിരയൂ
- പുറത്തേയ്ക്കു കടക്കൂ
- മൊബൈൽ/ഡെസ്ക്ടോപ്പ് രീതിയാക്കുക
- പങ്കുവയ്ക്കൂ…
- ടാഗ് പ്രകാരം
- വ്യക്തികൾ പ്രകാരം
- ദയവായി ഒരു പേര് ചേർക്കുക
- ലിങ്ക് അഡ്രസ് പങ്കുവയ്ക്കുക
- ചിത്രം സൂക്ഷിക്കുക
- ചിത്രം പങ്കുവയ്ക്കുക
- പുറമേയുള്ള ബ്രൗസറിൽ തുറക്കുക…
- ലിങ്ക് അഡ്രസ് ക്ലിപ്ബോർഡിലേക്ക് കോപ്പി ചെയ്യുക
-
- മുന്നറിയിപ്പ്: നെറ്റ്വർക്ക് പ്രോക്സി സെറ്റ് ചെയ്യാൻ കഴിഞ്ഞില്ല…
- ചിത്രം ലോഡ് ചെയ്യാൻ കഴിയുന്നില്ല
- എല്ലാ ടാഗുകളും
-
- സ്ക്രീനിന്റെ ചിത്രങ്ങൾ സൂക്ഷിക്കാൻ താങ്കൾ \"സ്റ്റോറേജിൽ പ്രവേശിക്കാനുള്ള അനുവാദം\" നൽകണം. അതിനുശേഷം താങ്കൾ പ്രയോഗത്തെ പൂർണമായും നിർത്തുകയോ മൊബൈൽ റീസ്റ്റാർട്ട് ചെയ്യുകയോ വേണം. സ്റ്റോറേജിൽ പ്രവേശിക്കാനുള്ള അനുവാദം നൽകാതെ മറ്റൊരവസരത്തിൽ സ്ക്രീനിന്റെ ചിത്രത്തങ്ങൾ സൂക്ഷിക്കാൻ താങ്കൾക്ക് അപ്പോൾ അനുവാദം നൽകാം. ഇതിനായി സജ്ജീകരണങ്ങളിലെ പ്രയോഗങ്ങളിൽ നിന്ന് ഡയസ്പോറ തിരഞ്ഞെടുക്കുക. എന്നിട്ട് അനുവാദങ്ങളിൽ \"റൈറ്റ് സ്റ്റോറേജ് അനുവാദം\" നൽകുക.
- ചിത്രങ്ങൾ സൂക്ഷിക്കാൻ താങ്കൾ \"സ്റ്റോറേജിൽ പ്രവേശിക്കാനുള്ള അനുവാദം\" നൽകണം. അതിനുശേഷം താങ്കൾ പ്രയോഗത്തെ പൂർണമായും നിർത്തുകയോ മൊബൈൽ റീസ്റ്റാർട്ട് ചെയ്യുകയോ വേണം. സ്റ്റോറേജിൽ പ്രവേശിക്കാനുള്ള അനുവാദം നൽകാതെ മറ്റൊരവസരത്തിൽ ചിത്രത്തങ്ങൾ സൂക്ഷിക്കാൻ താങ്കൾക്ക് അപ്പോൾ അനുവാദം നൽകാം. ഇതിനായി സജ്ജീകരണങ്ങളിലെ പ്രയോഗങ്ങളിൽ നിന്ന് ഡയസ്പോറ തിരഞ്ഞെടുക്കുക. എന്നിട്ട് അനുവാദങ്ങളിൽ \"റൈറ്റ് സ്റ്റോറേജ് അനുവാദം\" നൽകുക.
- അനുവാദം നിഷേധിച്ചിരിക്കുന്നു.
- അനുവാദം നൽകിയിരിക്കുന്നു. ദയവായി വീണ്ടും ശ്രമിക്കുക.
+
+ വീണ്ടും ലോഡ് ചെയ്യുക
+ റദ്ദാക്കുക
+
+ ക്രമീകരണങ്ങൾ
+ അറിയിപ്പുകൾ
+ സംഭാഷണങ്ങൾ
+ സ്ട്രീം
+ പ്രൊഫൈൽ
+ ഭാവങ്ങൾ
+ പ്രവർത്തനങ്ങൾ
+ ലൈക്ക് ചെയ്തു
+ അഭിപ്രായം പ്രകടിപ്പിച്ചു
+ പ്രസ്താവനകൾ
+ പൊതു
+ തിരയുക
+ സമ്പർക്കങ്ങൾ
+ അടയാളപ്പെടുത്തിയ മാറ്റങ്ങൾ
+ സ്ഥിതിവിവരക്കണക്ക്
+
+ എല്ലാ അറിയിപ്പുകളും
+ അഭിപ്രായപ്പെട്ടു
+ പോസ്റ്റിൽ അഭിപ്രായപ്പെടുക
+ ലൈക്ക് ചെയ്തു
+ പ്രസ്താവിച്ചു
+ വീണ്ടും ഷെയർ ചെയ്തു
+ ഷെയർ ചെയ്യാൻ തുടങ്ങി
+
+ പിഴവ്: പോഡുകളുടെ പട്ടിക പുതുക്കുവാൻ കഴിയുന്നില്ല!
+ ക്ഷമിക്കുക, നിങ്ങൾക്ക് മുന്നോട്ട് പോകുവാൻ ഇന്റർനെറ്റ് ബന്ധം ആവശ്യമാണ്
+ ഉറപ്പാക്കൽ
+ നിങ്ങൾക്ക് പുറത്തുകടക്കണോ?
+
+ കൂടുതൽ
+ അതേക്കുറിച്ചു | സഹായം
+ പിന്തുടർന്ന ടാഗുകൾ
+ പൊതു പ്രവർത്തനങ്ങൾ
+ റിപ്പോർട്ടുകൾ
+ ലിങ്ക് ടെക്സ്റ്റായി പങ്കുവയ്ക്കുക
+ വെബ്പേജിന്റെ സ്ക്രീൻഷോട്ട് പങ്കുവയ്ക്കുക
+ വെബ്പേജിന്റെ സ്ക്രീൻഷോട്ട് എടുക്കുക
+ ചിത്രം സംരക്ഷിക്കേണ്ട സ്ഥലം
+ സ്ക്രീൻഷോട്ട് സംരക്ഷിക്കേണ്ട ഫോർമാറ്റ്:
+ ലിങ്കിന്റെ വിലാസം പകർത്തി…
+ പുതിയ പോസ്റ്റ്
+ മുകളിലേക്ക് പോകുക
+ ടാഗുകളെയോ വ്യക്തികളെയോ തിരയുക
+ ആപ്പിന് പുറത്തുകടക്കുക
+ മൊബൈൽ/ഡെസ്ക്ടോപ്പ് വ്യൂവിലേക്ക് മാറുക
+ പങ്കുവയ്ക്കുക…
+ ടാഗുകളെ
+ ആളുകളെ
+ പേര് ചേർക്കുക
+ ലിങ്ക് വിലാസം പങ്കുവയ്ക്കുക
+ ചിത്രം സംരക്ഷിക്കുക
+ ചിത്രം പങ്കുവയ്ക്കുക
+ പുറമെയുള്ള ബ്രൗസറിൽ തുറക്കുക…
+ ലിങ്ക് വിലാസം ക്ലിപ്ബോർഡിലേക്ക് പകർത്തുക
+ ചിത്രത്തിന്റെ വിലാസം ക്ലിപ്ബോർഡിലേക്ക് പകർത്തുക
+
+ ചിത്രം ലോഡ് ചെയ്യാൻ സാധിക്കുന്നില്ല
+
+ സ്ക്രീന്ഷോട്ടുകൾ സംരക്ഷിക്കാൻ \"സ്റ്റോറേജ് ഉപയോഗിക്കാനുള്ള അനുമതി\" നിങ്ങൾ നൽകണം. അതിനു ശേഷം ഈ ആപ്പ് പൂർണമായും അടയ്ക്കുകയോ ഉപകരണം വീണ്ടും തുടങ്ങുകയോ ചെയ്യുക. ഇനി നിങ്ങൾക്ക് സ്റ്റോറേജ് ഉപയോഗിക്കാനുള്ള അനുവാദം തരാൻ പറ്റാതിരിക്കുകയും പക്ഷെ പിന്നീട് സ്ക്രീൻഷോട്ട് ഉപയോഗിക്കുകയും ചെയ്യണമെങ്കിൽ, നിങ്ങൾക്ക് അനുവാദം പിന്നീട് നല്കാനാവും. അതിനായി സിസ്റ്റം ക്രമീകരണങ്ങൾ- ആപ്പുകൾ- ഡാൻഡേലിയൻ* തുറക്കുക. അതിൽ പെർമിഷൻ വിഭാഗത്തിൽ \"സ്റ്റോറേജിൽ എഴുതുവാനുള്ള അനുമതി\" നൽകുക.
+ ചിത്രങ്ങൾ സംരക്ഷിക്കാൻ/അപ്ലോഡ് ചെയ്യാൻ \"സ്റ്റോറേജ് ഉപയോഗിക്കാനുള്ള അനുമതി\" നിങ്ങൾ നൽകണം. അതിനു ശേഷം ഈ ആപ്പ് പൂർണമായും അടയ്ക്കുകയോ ഉപകരണം വീണ്ടും തുടങ്ങുകയോ ചെയ്യുക. ഇനി നിങ്ങൾക്ക് സ്റ്റോറേജ് ഉപയോഗിക്കാനുള്ള അനുവാദം തരാൻ പറ്റാതിരിക്കുകയും പക്ഷെ പിന്നീട് ചിത്രങ്ങൾ സംരക്ഷിക്കുകയും ചെയ്യണമെങ്കിൽ, നിങ്ങൾക്ക് അനുവാദം പിന്നീട് നല്കാനാവും. അതിനായി സിസ്റ്റം ക്രമീകരണങ്ങൾ- ആപ്പുകൾ- ഡാൻഡേലിയൻ* തുറക്കുക. അതിൽ പെർമിഷൻ വിഭാഗത്തിൽ \"സ്റ്റോറേജിൽ എഴുതുവാനുള്ള അനുമതി\" നൽകുക.
+ അനുമതി നിരസിച്ചിരിക്കുന്നു.
+ അനുമതി നൽകിയിരിക്കുന്നു. വീണ്ടും ശ്രമിക്കുക.
+ കസ്റ്റം പോഡ്
+ പോഡിന്റെ പേര്
+ പ്രോട്ടോകോൾ
+ പോഡ് വിലാസം
+ കാണാതായ മൂല്യം
+ സ്ട്രീമിലെ അവസാനമായി സന്ദർശിച്ച പേജിലേക്ക് പോകുക?
+
+ മുകളിലെ ടൂൾബാർ സ്ട്രീം ലോഡ് ചെയ്യുന്നു
+ ടൂൾബാറിലെ ഒഴിഞ്ഞ സ്ഥലത്തു ക്ലിക്ക് ചെയ്തു സ്ട്രീം തുറക്കുക
+
+ രൂപം
+ ശൃംഖല
+ പോഡ് ക്രമീകരണങ്ങൾ
+ പ്രവർത്തിക്കുവാൻ കഴിയുന്നത്
+
+
+ നാവിഗേഷൻ സ്ലൈഡർ
+ നാവിഗേഷൻ വലിപ്പിലെ രേഖപ്പെടുത്തലുകളുടെ കാഴ്ച്ച നിയന്ത്രിക്കുക
+ ഉപയോക്താവ്
+ പൊതു
+ അഡ്മിൻ
+
+ തീമും നിറവും
+ ആപ്പിൽ മൊത്തമായി ഉപയോഗിക്കുന്ന നിറങ്ങൾ ക്രമീകരിക്കുക
+ പ്രധാന നിറം
+ ടൂൾബാറുകളുടെ നിറം
+ എടുത്തുകാണിക്കുന്ന നിറം
+ പ്രോഗ്രസ് ബാറിന്റെ നിറം
+ അമോൾഡ് മോഡ്
+ അമോലെഡ് ഡിസ്പ്ലേ സൗഹൃദമായ കറുപ്പ് നിറം ആപ്പിന്റെ പല ഭാഗങ്ങളിലും മറ്റു നിറങ്ങളെ മറികടക്കും. ഈ ക്രമീകരണം മാറ്റുവാൻ ആപ്പ് വീണ്ടും തുറക്കേണ്ടി വരും. നിങ്ങളുടെ സ്വകാര്യ ഡയസ്പോറ* അകൗണ്ട് ക്രമീകരണങ്ങളിലെ ഇരുണ്ട തീം പ്രയോഗിച്ചാൽ ഡയസ്പോറ* നിങ്ങൾക്ക് ഇരുണ്ട പശ്ചാത്തലത്തിൽ ഉപയോഗിക്കാം.
+
+ വ്യാപിപ്പിച്ച വിജ്ഞാപനങ്ങൾ
+ വിജ്ഞാപന വിഭാഗങ്ങൾ കാണിക്കുന്ന താഴേക്ക് വലിക്കാവുന്ന മെനുവിൽ വിജ്ഞാപന മണി വലുതാക്കുക
+ ആപ്പിന്റെ ഭാഷ മാറ്റുക. മാറ്റം ഫലപ്രദമാകുവാൻ ആപ്പ് വീണ്ടും തുറക്കുക
+ ഭാഷ
+ സിസ്റ്റത്തിലെ ഭാഷ
+
+ വെബ്വ്യൂ അക്ഷരങ്ങളുടെ വലിപ്പം നിയന്ത്രിക്കുക
+ അക്ഷരങ്ങളുടെ വലിപ്പം
+ സാധാരണ
+ വലിയ
+ ഭീമാകാരമായ
+
+ ചിത്രങ്ങൾ ലോഡ് ചെയ്യുക
+ ചിത്രം ലോഡ് ചെയ്യുന്നത് മാറ്റുക. ഉദാ:- മൊബൈൽ ഡാറ്റാ ലഭിക്കുന്നതിനായി
+
+ സ്ക്രീൻ കറക്കുക
+ തനിയെ സ്ക്രീൻ ചുറ്റുന്നത് നിയന്ത്രിക്കുക
+ സ്വതേ ഉള്ള മൂല്യം
+ സെൻസർ\n (സിസ്റ്റം ക്രമീകരണങ്ങളെ അവഗണിക്കുക)
+ പോർട്രൈറ്റ്
+ ലാൻസ്കേപ്
+
+ ടോറിൽ മുൻകൂറായി രേഖപ്പെടുത്തിയ മൂല്യങ്ങൾ ലോഡ് ചെയ്യുക
+ ടോർ (ഓർബോട്ട്) HTTP പ്രോക്സി ക്രമീകരണങ്ങൾ ലോഡ് ചെയ്യുക
+ പ്രോക്സി
+ പ്രോക്സി പ്രയോഗിക്കുക
+ ഹോസ്റ്റ്
+ പോർട്ട്
+ പ്രോക്സി ഉപയോഗം പ്രവർത്തനരഹിതമാക്കുവാൻ ആപ്പ് വീണ്ടും തുറക്കുക
+ മുൻകൂറായി ഉണ്ടായിരുന്ന ഓർബോട്ട് പ്രോക്സി ലോഡ് ചെയ്തു
+
+ പുറമെയുള്ള ലിങ്കുകൾ ക്രോം കസ്റ്റം ടാബിൽ തുറക്കുക. ക്രോമിയം അല്ലെങ്കിൽ ഗൂഗിൾ ക്രോം ഈ സൗകര്യം ലഭിക്കുന്നതിനായി ഇൻസ്റ്റാൾ ചെയ്തിരിക്കണം.
+\n പ്രധാന അറിയിപ്പ്: ക്രമീകരിച്ച പ്രോക്സി സെർവറുകൾ ക്രോം കസ്റ്റം ടാബുകൾ ഉപയോഗിക്കാറില്ല!
+
+ സ്വകാര്യ ക്രമീകരണങ്ങൾ
+ നിങ്ങളുടെ ഡയസ്പോറ* അക്കൗണ്ട് ക്രമീകരണങ്ങൾ തുറക്കുക
+ നിങ്ങളുടെ സമ്പർക്കങ്ങളുടെ പട്ടിക കൈകാര്യം ചെയ്യുക
+ ഹാഷ്ടാഗുകൾ കൈകാര്യം ചെയ്യുക
+ പിന്തുടർന്ന് വന്ന ഹാഷ്ടാഗുകൾ പിന്തുടരാതിരിക്കുക
+ അക്കൗണ്ട് മാറ്റുക
+ പ്രാദേശികമായ സെഷൻ ഡാറ്റ മായ്ച്ച ശേഷം മറ്റൊരു ഡയസ്പോറ* പോഡ്/അക്കൗണ്ട് ലേക്ക് മാറുക
+ ഇത് താങ്കളുടെ കുക്കികളും സെഷൻ ഡാറ്റയും തുടച്ചുനീക്കും. താങ്കൾക്ക് അക്കൗണ്ട് മാറ്റണമെന്ന് ഉറപ്പുണ്ടോ?
+ കാഷ് തുടച്ചുനീക്കുക
+ വെബ്വ്യൂ കാഷ് തുടച്ചുനീക്കുക
+ മുകളിലെയും ചുവട്ടിലെയും ടൂൾബാറുകൾ സ്ക്രോൾ ചെയ്യുമ്പോൾ താനേ അപ്രത്യക്ഷമാക്കുക
+ ടൂൾബാറുകൾ ഇന്റലിഹൈഡ് ചെയ്യുക
+ അറിയിപ്പാൽ പങ്കുവച്ചത് എന്ന് കൂട്ടിച്ചേർക്കുക
+
+ ലളിതമായ ആഡ്ബ്ലോക്കർ സജ്ജമാക്കുക. പരസ്യങ്ങൾ ചിലപ്പോൾ ഉൾപ്പെടാം. ഉദാ: എംബെഡ്ഡ് ചെയ്ത കാഴ്ചയിൽ
+ പരസ്യങ്ങൾ തടയുക
+ കുറിച്ച്
+ ലൈസൻസ്
+ തെറ്റു കണ്ടുപിടിക്കുക
+ ആപ്പ്ളിക്കേഷൻ
+ ഉപകരണം
+ diaspora* പോഡ്
+ തിരുത്തിയ തെറ്റുകളുടെ പട്ടിക
+ തിരുത്തിയ തെറ്റുകൾ (വേർബോസ്)
+ ആപ്പ് വേർഷൻ: %1$s
+ ആൻഡ്രോയ്ഡ് വേർഷൻ: %1$s
+ ഉപകരണത്തിന്റെ പേര്:%1$s
+ കോഡ്നെയിം: %1$s
+ പോഡിന്റെ അഡ്രസ്:%1$s
+
+ താഴെ പറഞ്ഞിരിക്കുന്ന ലൈബ്രറികൾ ഉപയോഗിച്ചിരിക്കുന്നു:
+ ഞങ്ങൾ ചില കോഡുകൾ കടമെടുത്തതും പ്രചോദനമായതും ലീഫ്പിക് ഇൽ നിന്നാണ്. ഒന്നു പരിശോധിക്കൂ.. അതും സ്വതന്ത്ര സോഫ്റ്റ്വേർ ആണ്!
+ വിശദീകരിക്കുക
diff --git a/app/src/main/res/values-mr/strings.xml b/app/src/main/res/values-mr/strings.xml
new file mode 100644
index 00000000..43d88f4b
--- /dev/null
+++ b/app/src/main/res/values-mr/strings.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml
new file mode 100644
index 00000000..19084ead
--- /dev/null
+++ b/app/src/main/res/values-nb-rNO/strings.xml
@@ -0,0 +1,40 @@
+
+
+
+ Åpne navigasjonsskuff
+ Lukk navigasjonsskuff
+
+ Innstillinger
+ Søk
+ Endringslogg
+
+
+
+ Mor
+
+
+ Skjul statusfelt
+ Vis tittel
+
+
+ Utseende
+
+
+ Hovedinnstillinger
+
+
+ Endre programmets språk. Omstart kreves før endringer trer i effekt
+ Språk
+
+
+
+ Forvalg
+
+
+
+
+ Ymse
+ Om
+
+ Bidragsytere
+
diff --git a/app/src/main/res/values-nl/strings-about.xml b/app/src/main/res/values-nl/strings-about.xml
deleted file mode 100644
index 54191dc5..00000000
--- a/app/src/main/res/values-nl/strings-about.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-nl/strings-preferences.xml b/app/src/main/res/values-nl/strings-preferences.xml
deleted file mode 100644
index 47b807ca..00000000
--- a/app/src/main/res/values-nl/strings-preferences.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
-
-
-
-
- Vormgeving
- Netwerk
- Pod-instellingen
-
-
- Navigatie Slider
- Item Zichtbaarheid
-
- Lettergrootte
-
-
- Afbeeldingen laden
- Afbeelding laden uitschakelen om mobiele data te besparen
-
- Proxy inschakelen
- Gebruik een Proxy voor Diaspora om de firewalls te omzeilen.\nRestart nodig
- Host
- Poort
-
-
- Persoonlijke instellingen
- Contacten
- Uw lijst met contactpersonen beheren
- Beheren van Hashtags
- Toevoegen en verwijderen van de hashtags die u volgt
- Account wijzigen
- Lokale sessiegegevens wissen en schakel over naar een andere Diaspora pod/account
- Dit zal alle cookies en sessiegegevens wissen. Wilt u echt uw account wijzigen?
- Cache wissen
- WebView-cache leegmaken
- Boven- en onderkant werkbalken automatisch verbergen tijdens het scrollen
- Werkbalken slim wegwerken
- Gedeeld-via-aankondiging toevoegen
- Een verwijzing naar dit app (\"gedeeld door…\") toevoegen aan gedeelde teksten
-
-
-
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 319d5ff4..41ef2f93 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -1,63 +1,207 @@
-
-
- *[gedeeld door #DiasporaForAndroid]*
-
- Opnieuw Laden
- Ongelezen bericht. Wilt u het lezen?
-
- Instellingen
- Meldingen
- Gesprekken
- Stream
- Profiel
- Aspecten
- Activiteiten
- Leuk gevonden
- Gereageerd
- Vermeldingen
- Openbaar
- Zoeken
-
- Selecteer Pod
- Voer pod domein
- Bevestigen pod url
- Opmerking: De podlijst is gevuld met beveiligde pods vermeld op https://podupti.me. U kunt in het bewerk veld elke pod invullen die niet in de lijst staat.
- Voer een geldige domeinnaam in
- Fout: Kan niet de podlijst ophalen!
- Sorry, u moet verbinding met internet hebben om verder te gaan
- Bevestiging
- Wilt u echt \nhttps://%1$s\n als uw Diaspora pod gebruiken?
- Wilt u afsluiten?
-
- Gevolgde Tags
- Publieke activiteiten
- Link delen als tekst
- Screenshot van de webpagina delen
- Neem screenshot van de webpagina
- Afbeelding opslaan
- Screenshot oplaan als:
- Link adres gekopieerd…
- Nieuw Bericht
- Terug naar boven
- Zoeken op tags of personen
- App afsluiten
- Desktop weergave in-/uitschakelen
- Delen…
- viaTags
- via mensen
- Voeg een naam toe
- Deel adreslink
- Afbeelding opslaan
- Deel afbeelding
- Geopend in externe browser…
- Link-adres kopiëren naar Klembord
-
- Waarschuwing: Kan niet netwerk proxy instellen…
- Niet in staat om afbeelding te laden
- Alle tags
-
- Toestemming geweigerd.
- Toestemming verleend. Probeer het opnieuw.
+
+ Open navigatiemenu
+ Sluit navigatiemenu
+ Herladen
+ Sluit
+ Annuleren
+
+ Instellingen
+ Meldingen
+ Gesprekken
+ Stream
+ Profiel
+ Aspecten
+ Activiteiten
+ Leuk gevonden
+ Gereageerd
+ Vermeldingen
+ Openbaar
+ Zoeken
+ Contacten
+ Logboekwijzigingen
+ Statistieken
+
+ Alle meldingen
+ Heeft ook gereageerd
+ Reageer op het bericht
+ Leuk gevonden
+ Genoemd
+ Opnieuw gedeeld
+ Begonnen met delen
+
+ Fout: Kan niet de podlijst ophalen!
+ Sorry, u moet verbinding met internet hebben om verder te gaan
+ Bevestiging
+ Wilt u afsluiten?
+
+ Meer
+ Over | Help
+ Gevolgde Tags
+ Publieke activiteiten
+ Rapporten
+ Link delen als tekst
+ Screenshot van de webpagina delen
+ Neem screenshot van de webpagina
+ Afbeelding opslaan
+ Screenshot oplaan als:
+ Link adres gekopieerd…
+ Nieuw bericht
+ Terug naar boven
+ Zoeken op tags of personen
+ Afsluiten
+ Desktop weergave in-/uitschakelen
+ Delen…
+ viaTags
+ via mensen
+ Voeg een naam toe
+ Deel adreslink
+ Afbeelding opslaan
+ Deel afbeelding
+ Geopend in externe browser…
+ Link-adres kopiëren naar Klembord
+ Afbeelding kopiëren naar Klembord
+
+ Niet in staat om afbeelding te laden
+
+ U moet machtegingen aan \"Access Storage Permission\" geven om screenshots op te slaan. Daarna moet u de app volledig afsluiten of de telefoon opnieuw opstarten. Als u geen toestemming aan opslag wil geven maar screenshot functie later wil gebruiken, kunt u de toestemming later geven. Open dan: systemsettings - apps - dandelion*. In de machtegings sectie kunt u machtegingen geven aan \"write storage permission\".
+ U moet machtigingen aan \"Access Storage Permission\" geven om screenshots op te slaan. Daarna moet u de app volledig afsluiten of de telefoon opnieuw opstarten. Als u geen toestemming aan opslag wilt geven maar screenshot functie later wilt gebruiken, kunt u de toestemming later geven. Open dan: system settings - apps - dandelion*. In de machtigingssectie kunt u machtigingen geven aan \"write storage permission\".
+ Toestemming geweigerd.
+ Toestemming verleend. Probeer het opnieuw.
+ Aangepaste Pod
+ Pod naam
+ Protocol
+ Pod adres
+ Ontbrekende waarde
+ Ga naar laatste bezochte pagina in de stream?
+ Verberg statusbalk op hoofdweergave
+ Verberg statusbalk
+ Toon titel in de hoofdweergave
+ Toon titel
+ Launcher snelkoppeling
+
+ Bovenste werkbalk laadt stream
+ Klik op een lege ruimte in de bovenste werkbalk om de stream te openen
+
+ Vormgeving
+ Netwerk
+ Pod-instellingen
+ Bruikbaarheid
+
+
+ Navigatie Slider
+ Configureer zichtbaarheid van vermeldingen in navigatie slider
+ Gebruiker
+ Algemeen
+ Administrator
+
+ Themakleuren
+ Bepalen welke kleuren worden gebruikt in de app
+ Hoofdkleur
+ Kleur van de werkbalken
+ Accentkleur
+ Kleur van de progresbalk
+ AMOLED modus
+ Overschrijd kleuren met AMOLED display vriendelijk zwart op veel plekken in de app. Je moet de app restarten om deze verandering te zien. Om diaspora* in het donker te zien moet je de Dark thema activeren, dat gevonden kan worden in je eigen diaspora* account instellingen.
+
+ Uitgebreide meldingen
+ Breidt de notificatie bel uit met een dropdown menu dat de notificatie categorieën laat zien
+ Taal wijzigen van deze app. Opnieuw opstarten om wijzigingen te activeren
+ Taal
+ Systeemtaal
+
+ Configureer tekstgrootte van de webview
+ Lettergrootte
+ Normaal
+ Groot
+ Enorm
+
+ Afbeeldingen laden
+ Afbeeldingen uitschakelen om mobiele data te besparen
+
+ Schermrotatie
+ Configureer automatische schermrotatie
+ Standaard
+ Sensor\n(negeer systeem instellingen)
+ Portret
+ Landschap
+
+ Tor Voorinstelling laden
+ Laden van de proxy-instellingen voor HTTP-Proxy Tor (Orbot)
+ Proxy
+ Proxy inschakelen
+ Proxy dandelion*-verkeer om firewalls te omzeilen. \nVereist mogelijk app herstart. Dit kan op sommige telefoons niet werken.
+ Host
+ Poort
+ App moet opnieuw opstarten om het gebruik van de proxy uit te schakelen
+ Orbot proxy voorinstelling geladen
+
+ Open externe links met Chrome aangepaste tabbladen. Chromium of Google Chrome moet worden geïnstalleerd om deze functie te gebruiken. \nBELANGRIJK Opmerking: Chrome aangepaste tabbladen gebruiken niet geconfigureerde proxyservers!
+
+ Persoonlijke instellingen
+ Open uw accountinstellingen van diaspora*
+ Uw lijst met contactpersonen beheren
+ Beheren van Hashtags
+ Ontvolg al gevolgde hashtags
+ Account wijzigen
+ Lokale sessiegegevens wissen en schakel over naar een andere diaspora* pod/account
+ Dit zal alle cookies en sessiegegevens wissen. Wilt u echt uw account wijzigen?
+ Cache wissen
+ WebView-cache leegmaken
+ Boven- en onderkant werkbalken automatisch verbergen tijdens het scrollen
+ Werkbalken slim wegwerken
+ Gedeeld-via-aankondiging toevoegen
+ Een verwijzing naar deze app toevoegen aan gedeelde teksten: [via #dandelion]
+
+ Overige
+ Volledige Reset
+ Veeg alle lokale instellingen uit gerelateerd aan deze app en log op alle accounts uit
+ Dit zal alle instellingen terugzetten en je uitloggen bij elke pod. Je gedownloade afbeeldingen blijven onaangeraakt. Weet je zeker dat je door wilt gaan?
+ Simpele AdBlocker inschakelen. Advertenties kunnen bijvoorbeeld bij ingesloten weergaven erbij zitten
+ Blokkeer advertenties
+ Over
+ Licentie
+ Foutopsporing
+ Applicatie
+ Apparaat
+ diaspora* Pod
+ Foutoplossing
+ Foutoplossing (Verbose)
+ App Versie: %1$s
+ Android Versie: %1$s
+ Apparaatnaam: %1$s
+ Codenaam: %1$s
+ Pod Profielnaam: %1$s
+ Pod Domein: %1$s
+ Debuglog gekopieerd naar klembord
+ dandelion* is jouw bedrijfsapp om te surfen op het sociale netwerk diaspora*. Het voegt functies toe zoals nuttige werkbalken en ondersteuning voor proxyservers zoals het Tor Netwerk aan uw sociale ervaringen.
+ Code bijdragen!
+ dandelion* is vrij zoals in vrijheid ontwikkeld en volgt de ideeën van het diaspora* project. Als u iets wilt bijdragen, gaat uw gang! Op dit moment zijn we een erg klein team, dus we waarderen elke vorm van hulp!
+ Krijg de bron
+ Vertaal deze App!
+ De app niet beschikbaar in jouw taal? Jij kan dat veranderen! Waarom zou u niet helpen met vertalen? We gebruiken het crowdin platform zodat iedereen kan helpen met vertalen.
+ Laat me vertalen
+ Geef Feedback!
+ dandelion* is nog in ontwikkeling, dus heeft u suggesties of enige vorm van feedback, gebruik dan onze bug tracker om ons te laten weten!
+ Bugs melden
+ Vertel het verder!
+ Vertel uw vrienden en familie over diaspora* en #dandelion! Waarom blogt u niet over uw ervaringen? We willen graag uw ervaringen horen!
+ Deel deze app
+ Hey! Bekijk #dandelion! %1$s
+
+ Onderhouders
+ Deze app wordt momenteel ontwikkeld en onderhouden door < br >< br >%1$s
+ Bijdragers
+ %1$s < br >< br > dank u!
+ GNU GPLv3 + licentie
+ 3rd Party Bibliotheken
+ De volgende bibliotheken worden gebruikt:
+ We zijn geïnspireerd door LeafPic en lenen er code van. Ga kijken, deze vrije software is het proberen waard!
+ Vertel me meer
+ Inschakelen om Youtube links te openen op externe app
+ Youtube links
+ Wijzig het thema van uw account
+ Trek om te vernieuwen
+ Trek omlaag op de bovenkant van de pagina om te vernieuwen.\nU moet de app opnieuw opstarten om wijzigingen door te voeren.
diff --git a/app/src/main/res/values-no/strings-about.xml b/app/src/main/res/values-no/strings-about.xml
deleted file mode 100644
index 54191dc5..00000000
--- a/app/src/main/res/values-no/strings-about.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-no/strings-preferences.xml b/app/src/main/res/values-no/strings-preferences.xml
deleted file mode 100644
index 3885ddb3..00000000
--- a/app/src/main/res/values-no/strings-preferences.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-no/strings.xml b/app/src/main/res/values-no/strings.xml
index 193ab72a..e56fc1d8 100644
--- a/app/src/main/res/values-no/strings.xml
+++ b/app/src/main/res/values-no/strings.xml
@@ -1,11 +1,54 @@
-
-
-
-
-
-
-
-
+
+
+ Innstillinger
+ Søk
+ Endringslogg
+
+
+
+ Mer
+ Del…
+
+
+
+ Den øvre verktøylinjen laster inn strømmen
+ Klikk på en tom plass i den øvre verktøylinjen for å åpne strømmen
+
+ Utseende
+ Nettverk
+ Pod-innstillinger
+ Brukbarhet
+
+
+ Navigasjonsbryter
+ Kontrollér synligheten for innlegg i navigasjonsskuffen
+ Bruker
+ Generelt
+ Administrator
+
+ Tema og farger
+ Kontrollér hvilke farger som brukes i appen
+ Primærfarge
+ Verktøylinjefarge
+ Aksentfarge
+ Fremgangslinjefarge
+ AMOLED-modus
+
+ Bytt språket for denne appen og omstart slik at endringen kan ta sted
+ Språk
+
+
+
+
+
+
+ Tøm hurtigminne
+
+ Forskjellig
+ Om
+ Lisens
+
+ Medvirkende
diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml
new file mode 100644
index 00000000..91176dc2
--- /dev/null
+++ b/app/src/main/res/values-or/strings.xml
@@ -0,0 +1,118 @@
+
+
+
+ ନେଭିଗେସନ୍ ଡ୍ରୟର୍ ଖୋଲନ୍ତୁ
+ ନେଭିଗେସନ୍ ଡ୍ରୟର୍ ବନ୍ଦ କରନ୍ତୁ
+ ପୁନଃଲୋଡ୍ କରନ୍ତୁ
+ ବନ୍ଦ କରନ୍ତୁ
+ ବାତିଲ୍ କର
+
+ ସେଟିଂସମୂହ
+ ବିଜ୍ଞପ୍ତି
+ ବାର୍ତ୍ତାଳାପ
+ ପ୍ରୋଫାଇଲ୍
+ ସନ୍ଧାନ କରନ୍ତୁ
+ ପରିବର୍ତ୍ତନ ଲଗ୍
+ ପରିସଂଖ୍ୟାନ
+
+ ସବୁ ବିଜ୍ଞପ୍ତି
+
+ ନିଶ୍ଚିତକରଣ
+
+ ଅଧିକ
+ ବିଷୟରେ | ସହାୟତା
+ ପାଠ୍ୟ ଭାବରେ ଲିଙ୍କ୍ ଅଂଶୀଦାର କରନ୍ତୁ
+ ୱେବପୃଷ୍ଠାର ସ୍କ୍ରିନସଟ୍ ଅଂଶୀଦାର କରନ୍ତୁ
+ ୱେବପୃଷ୍ଠାର ସ୍କ୍ରିନସଟ୍ ନିଅନ୍ତୁ
+ ଏଥିରେ ପ୍ରତିଛବି ସଞ୍ଚୟ କରୁଛି
+ ଲିଙ୍କ୍ ଠିକଣା କପି ହୋଇଛି …
+ ଶୀର୍ଷକୁ ଯାଆନ୍ତୁ
+ ଆପ୍ ବାହାରକୁ ଯାଆନ୍ତୁ
+ ମୋବାଇଲ୍/ଡେସ୍କଟପ୍ ଦର୍ଶନ ଟୋଗଲ୍ କରନ୍ତୁ
+ ଅଂଶୀଦାର…
+ ଦୟାକରି ଏକ ନାମ ଯୋଡ଼ନ୍ତୁ
+ ଲିଙ୍କ୍ ଠିକଣା ଅଂଶୀଦାର କରନ୍ତୁ
+ ପ୍ରତିଛବି ସଞ୍ଚୟ କରନ୍ତୁ
+ ପ୍ରତିଛବି ଅଂଶୀଦାର କରନ୍ତୁ
+
+ ପ୍ରତିଛବି ଲୋଡ୍ କରିବାରେ ଅସମର୍ଥ
+
+ ପ୍ରୋଟୋକଲ୍
+ ମୁଖ୍ୟ ଦର୍ଶନରେ ସ୍ଥିତି ଦଣ୍ଡିକା ଲୁଚାନ୍ତୁ
+ ସ୍ଥିତି ଦଣ୍ଡିକା ଲୁଚାଅ
+ ମୁଖ୍ୟ ଦର୍ଶନରେ ଆଖ୍ୟା ଦେଖାନ୍ତୁ
+ ଆଖ୍ୟା ଦେଖାନ୍ତୁ
+ ଉନ୍ମୋଚକ ସର୍ଟକଟ୍
+
+
+ ରୂପ
+ ନେଟୱର୍କ
+
+
+ ଉପଭୋକ୍ତା
+ ସାଧାରଣ
+ ବ୍ୟବସ୍ଥାପକ
+
+ ଥିମ୍ ଏବଂ ରଙ୍ଗ
+
+ ଏହି ଆପ୍ ର ଭାଷା ବଦଳାନ୍ତୁ। ପରିବର୍ତ୍ତନଗୁଡ଼ିକ କାର୍ଯ୍ୟକାରୀ ହେବା ପାଇଁ ଆପ୍ ପୁନଃଆରମ୍ଭ କରନ୍ତୁ
+ ଭାଷା
+ ସିଷ୍ଟମ୍ ଭାଷା
+
+ ଫଣ୍ଟ ଆକାର
+ ସାଧାରଣ
+ ବଡ଼
+ ବିରାଟ
+
+ ପ୍ରତିଛବିଗୁଡ଼ିକୁ ଧାରଣ କରନ୍ତୁ
+
+ ସ୍କ୍ରିନ୍ ଘୂର୍ଣ୍ଣନ
+ ଡିଫଲ୍ଟ
+ ପୋର୍ଟ୍ରେଟ୍
+ ଲ୍ୟାଣ୍ଡସ୍କେପ୍
+
+ ପ୍ରକ୍ସି
+ ପ୍ରକ୍ସି ସକ୍ଷମ କରନ୍ତୁ
+
+
+ ଆକାଉଣ୍ଟ୍ ବଦଳାନ୍ତୁ
+ ଏହା ସମସ୍ତ କୁକୀ ଏବଂ ଅଧିବେଶନ ଡାଟା ଲିଭାଇଦେବ। ଆପଣ ପ୍ରକୃତରେ ଆପଣଙ୍କ ଆକାଉଣ୍ଟ୍ ପରିବର୍ତ୍ତନ କରିବାକୁ ଚାହାଁନ୍ତି କି?
+
+ ଵିଵିଧ
+ ପୂର୍ଣ୍ଣ ପୁନଃସେଟ୍
+ ମୌଳିକ AdBlocker ସକ୍ଷମ କରନ୍ତୁ। ବିଜ୍ଞାପନଗୁଡ଼ିକ ଗ୍ରଥିତ ଦର୍ଶନରେ ଅନ୍ତର୍ଭୁକ୍ତ ହୋଇପାରେ
+ ବିଜ୍ଞାପନଗୁଡ଼ିକୁ ଅବରୋଧ କରନ୍ତୁ
+ ବିଷୟରେ
+ ଲାଇସେନ୍ସ
+ ଆପ୍ଲିକେସନ୍
+ ଡିଭାଇସ୍
+ ଆପ୍ ସଂସ୍କରଣ: %1$s
+ ଆଣ୍ଡ୍ରଏଡ୍ ସଂସ୍କରଣ: %1$s
+ ଡିଭାଇସ୍ ନାମ: %1$s
+ କୋଡ୍ ନାମ: %1$s
+ ଉତ୍ସ ପ୍ରାପ୍ତ କରନ୍ତୁ
+ ଆପ୍ ଅନୁବାଦ କରନ୍ତୁ!
+ ଆପ୍ ଆପଣଙ୍କ ଭାଷାରେ ଉପଲବ୍ଧ ନାହିଁ କି? ଆପଣ ଏହା ବଦଳାଇପାରିବେ! ଆପଣ ଏହାକୁ ଅନୁବାଦ କରି ଆମକୁ କାହିଁକି ସାହାଯ୍ୟ କରୁନାହାଁନ୍ତି? ଆପ୍ ଅନୁବାଦ କରିବାରେ ଯେକୌଣସି ବ୍ୟକ୍ତିଙ୍କୁ ସକ୍ଷମ କରିବା ପାଇଁ ଆମେ Crowdin ବ୍ୟବହାର କରୁ।
+ ମୋତେ ଅନୁବାଦ କରିବାକୁ ଦିଅ
+ ମତାମତ ଦିଅନ୍ତୁ!
+ dandelion* ଏପର୍ଯ୍ୟନ୍ତ ବିକାଶରେ ଅଛି, ତେଣୁ ଯଦି ଆପଣଙ୍କର ପରାମର୍ଶ କିମ୍ୱା କୌଣସି ପ୍ରକାରର ମତାମତ ରହିଛି, ତେବେ ଦୟାକରି ଆମକୁ ଜଣାଇବା ପାଇଁ ଆମର ବଗ୍ ଟ୍ରାକର୍ ବ୍ୟବହାର କରନ୍ତୁ!
+ ବଗ୍ ରିପୋର୍ଟ୍ କରନ୍ତୁ
+ ଶବ୍ଦ ବିସ୍ତାର କରନ୍ତୁ!
+ diaspora* ଏବଂ #dandelion ବିଷୟରେ ଆପଣଙ୍କ ବନ୍ଧୁ ଏବଂ ପରିବାରକୁ କୁହନ୍ତୁ! ଆପଣ ଆପଣଙ୍କର ଅନୁଭୂତି ବିଷୟରେ କାହିଁକି ବ୍ଲଗ୍ କରୁନାହଁ? ଆମେ ଆପଣଙ୍କଠାରୁ ଶୁଣିବାକୁ ପସନ୍ଦ କରିବୁ!
+ ଆପ୍ ଅଂଶୀଦାର କରନ୍ତୁ
+ ଆଜ୍ଞା! #dandelion କୁ ଥରେ ଦେଖିଯାଆନ୍ତୁ! %1$s
+
+ ରକ୍ଷଣାବେକ୍ଷଣକାରୀ
+ ଏହି ଆପ୍ ବର୍ତ୍ତମାନ <br><br>%1$sଙ୍କ ଦ୍ୱାରା ବିକାଶ ଓ ରକ୍ଷଣାବେକ୍ଷଣ କରାଯାଉଛି
+ ଯୋଗଦାନକାରୀ
+ %1$s<br><br>ଧନ୍ୟବାଦ!
+ GNU GPLv3+ ଲାଇସେନ୍ସ
+ ତୃତୀୟ-ପକ୍ଷ ଲାଇବ୍ରେରୀ
+ ନିମ୍ନଲିଖିତ ଲାଇବ୍ରେରୀଗୁଡ଼ିକ ବ୍ୟବହାର ହୋଇଛି:
+ ଆମେ LeafPic ରୁ କିଛି ପ୍ରେରଣା ଏବଂ କୋଡ୍ ନେଇଛୁ। ଯାଆନ୍ତୁ ଏହାକୁ ଥରେ ଦେଖି ଆସନ୍ତୁ, ଏହା ବି ଏକ ମାଗଣା ସଫ୍ଟୱେର୍!
+ ମୋତେ ଆହୁରି କୁହନ୍ତୁ
+ ବାହ୍ୟ ଆପରେ YouTube ଲିଙ୍କ୍ ଖୋଲିବା ପାଇଁ ସକ୍ଷମ କରନ୍ତୁ
+ YouTube ଲିଙ୍କଗୁଡ଼ିକ
+ ଆପଣଙ୍କ ଆକାଉଣ୍ଟର ଥିମ୍ ପରିବର୍ତ୍ତନ କରନ୍ତୁ
+ ସତେଜ କରିବାକୁ ଟାଣନ୍ତୁ
+
diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml
new file mode 100644
index 00000000..43d88f4b
--- /dev/null
+++ b/app/src/main/res/values-pa/strings.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-pl/strings-about.xml b/app/src/main/res/values-pl/strings-about.xml
deleted file mode 100644
index 54191dc5..00000000
--- a/app/src/main/res/values-pl/strings-about.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-pl/strings-preferences.xml b/app/src/main/res/values-pl/strings-preferences.xml
deleted file mode 100644
index 62cae27d..00000000
--- a/app/src/main/res/values-pl/strings-preferences.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
-
-
-
-
- Wygląd
- Sieć
- Ustawienia poda
-
-
-
- Rozmiar czcionki
-
-
- Załaduj obrazy
-
- Włącz serwer Proxy
-
-
- Ustawienia osobiste
- Kontakty
- Zarządzanie listą kontaktów
- Zarządzanie znacznikami
- Zmień konto
- Skasuj dane sesji lokalnej i przełącz się do innego poda diaspory/konta
- Wyczyść pamięć podręczną
- Wyczyść pamięć podręczną WebView
- Automatycznie ukryj paski narzędzi na górze i na dole podczas przewijania
-
-
-
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index ef9b10a0..520b2632 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -1,43 +1,206 @@
-
-
- *[dzielone przez #DiasporaForAndroid]*
-
- Odśwież
- Nieprzeczytane powiadomienia. Chcesz je przeczytać?
-
- Ustawienia
- Powiadomienia
- Rozmowy
- Strumień
- Profil
- Aspekty
- Aktywności
- Polubione
- Skomentowane
- Wzmianki
- Publiczna
- Szukaj
-
- Wybierz Pod
- Wprowadź domenę poda
- Potwierdzić adres url poda
- Wprowadź prawidłową nazwę domeny
- Błąd: Nie można pobrać listy podów!
- Przepraszam, musisz być podłączony do Internetu, aby kontynuować
- Potwierdzenie
- Czy naprawdę chcesz używać\nhttps://%1$s \njako Twój Pod Diaspory?
- Czy chcesz zakończyć?
-
- Obserwowane znaczniki
- Publiczna aktywność
- Udostępnij odnośnik jako tekst
- Podziel zrzut ekranu strony internetowej
- Zapisywanie obrazu do
- Zapisywanie zrzutu ekranu jako:
- Adres odnośnika skopiowany …
- Nowy post
-
-
+
+ Otwórz panel nawigacyjny
+ Zamknij panel nawigacyjny
+ Przeładuj
+ Zamknij
+ Anuluj
+
+ Ustawienia
+ Powiadomienia
+ Rozmowy
+ Strumień
+ Profil
+ Aspekty
+ Aktywność
+ Polubione
+ Skomentowane
+ Wzmianki
+ Publiczne
+ Szukaj
+ Kontakty
+ Lista zmian
+ Statystyki
+
+ Wszystkie powiadomienia
+ Także skomentował/a
+ Skomentował/a Twój wpis
+ Polubienia
+ Wzmianki
+ Powtórzenia
+ Zaczęli się z Tobą dzielić
+
+ Błąd: Nie udało się pobrać listy podów!
+ Przykro mi, lecz aby kontynuować, musisz mieć połączenie z Internetem
+ Potwierdzenie
+ Czy chcesz wyjść?
+
+ Więcej
+ Informacje | Pomoc
+ Obserwowane tagi
+ Aktywność publiczna
+ Zgłoszenia
+ Udostępnij link jako tekst
+ Udostępnij zrzut ekranu strony internetowej
+ Wykonaj zrzut ekranu strony internetowej
+ Zapisywanie obrazu do
+ Zapisywanie zrzutu ekranu jako:
+ Skopiowano adres linku…
+ Nowy wpis
+ Przejdź do góry
+ Szukaj tagów lub osób
+ Zamknij aplikację
+ Przełącz na widok mobilny/standardowy
+ Udostępnij…
+ w tagach
+ w osobach
+ Podaj nazwę użytkownika lub tagu
+ Udostępnij adres odnośnika
+ Zapisz obraz
+ Udostępnij obraz
+ Otwórz w zewnętrznej przeglądarce…
+ Skopiuj adres odnośnika do schowka
+ Skopiuj adres obrazu do schowka
+
+ Nie udało się wczytać obrazu
+
+ Aby móc zapisywać zrzuty ekranu, musisz nadać aplikacji uprawnienia do \"modyfikowania i usuwania zawartości karty SD\". Gdy to zrobisz, powinieneś całkowicie zamknąć aplikację lub zrestartować urządzenie. Jeśli nie nadasz teraz tego uprawnienia, ale będziesz chciał zrobić to w przyszłości, otwórz Ustawienia - Aplikacje - dandelion*. W sekcji uprawnień zaznacz \"Pamięć\".
+ Aby móc zapisywać/wysyłać obrazy, musisz nadać aplikacji uprawnienia do \"modyfikowania i usuwania zawartości karty SD\". Gdy to zrobisz, powinieneś całkowicie zamknąć aplikację lub zrestartować urządzenie. Jeśli nie nadasz teraz tego uprawnienia, ale będziesz chciał zrobić to w przyszłości, otwórz Ustawienia - Aplikacje - dandelion*. W sekcji uprawnień zaznacz \"Pamięć\".
+ Odmowa dostępu.
+ Dostęp przyznany. Spróbuj ponownie.
+ Pod spoza listy
+ Nazwa Poda
+ Protokół
+ Adres Poda
+ Nie podano danych
+ Przejść do ostatnio odwiedzonej strony w strumieniu?
+ Ukryj pasek stanu w głównym widoku
+ Ukryj pasek stanu
+ Pokaż tytuł w widoku głównym
+ Pokaż tytuł
+ Skrót dla launchera
+
+ Górny pasek narzędzi wczytuje strumień
+ Aby otworzyć strumień, kliknij na pustą przestrzeń w górnym pasku narzędziowym
+
+ Wygląd
+ Sieć
+ Ustawienia poda
+ Obsługa
+
+
+ Pasek nawigacji
+ Wybierz elementy widoczne w panelu nawigacyjnym
+ Użytkownik
+ Ogólne
+ Administracja
+
+ Motywy i kolory
+ Ustaw, jakich kolorów ma używać aplikacja
+ Kolor podstawowy
+ Kolor pasków narzędzi
+ Kolor dodatkowy
+ Kolor paska postępu
+ Tryb AMOLED
+ Nadpisz kolory w wielu częściach aplikacji, używając czarnego przyjaznego dla ekranów AMOLED. Aby zobaczyć zmiany, musisz zrestartować aplikację. Żeby przeglądać diasporę* w ciemności, musisz także aktywować Ciemny (Dark) motyw. Opcję tę znajdziesz w ustawieniach Twojego konta diaspory*.
+
+ Rozszerzone powiadomienia
+ Dodaj do ikony powiadomień menu wyboru kategorii powiadomień
+ Zmienia język aplikacji. Zrestartuj żeby wprowadzić zmiany
+ Język
+ Język systemowy
+
+ Wybierz rozmiar tekstu WebView
+ Rozmiar czcionki
+ Normalny
+ Duży
+ Bardzo duży
+
+ Wczytuj obrazy
+ Odznacz, aby wyłączyć wczytywanie obrazów, np. w celu oszczędzania transferu
+
+ Orientacja ekranu
+ Wybierz pożądaną orientację ekranu
+ Domyślna
+ Czujnik\n(ignoruj ustawienia systemowe)
+ Pionowa
+ Pozioma
+
+ Wczytaj domyślną konfigurację Tora
+ Wczytaj ustawienia proxy HTTP Tora (Orbot)
+ Serwer proxy
+ Używaj proxy
+ Przesyłaj ruch dandelion* przez proxy, aby ominąć zapory sieciowe.\nMoże wymagać restartu. Może nie działać na niektórych urządzeniach.
+ Host
+ Port
+ Aplikacja musi zostać zrestartowana, aby wyłączyć proxy
+ Domyślna konfiguracja Orbota została wczytana
+
+ Otwieraj odnośniki zewnętrzne za pomocą Chrome Custom Tabs. Musisz posiadać zainstalowane Chrome lub Chromium. \nWAŻNA UWAGA: Chrome Custom Tabs nie używa serwerów proxy ustawionych w tej aplikacji!
+
+ Ustawienia osobiste
+ Otwórz ustawienia konta diaspora*
+ Zarządzaj swoją listą kontaktów
+ Zarządzanie tagami
+ Przestań śledzić wybrane tagi
+ Zmień konto
+ Skasuj dane lokalnej sesji i przełącz się na inne konto diaspory*
+ Operacja spowoduje usunięcie wszystkich ciasteczek i danych sesji. Jesteś pewny, że chcesz przełączyć na inne konto?
+ Wyczyść pamięć podręczną
+ Wyczyść pamięć podręczną WebView
+ Automatycznie ukryj paski narzędzi na górze i na dole podczas przewijania
+ Autoukrywanie pasków narzędzi
+ Informacja o użytej aplikacji
+ Umieszczaj odnośnik do tej aplikacji na dole udostępnianych wiadomości: [via #dandelion]
+
+ Różne
+ Całkowity restart
+ Wyczyść wszystkie lokalne ustawienia aplikacji i wyloguj ze wszystkich kont
+ Ta operacja przywróci wszystkie zmodyfikowane przez Ciebie ustawienia aplikacji do ich domyślnych wartości i wyloguje Cię ze wszystkich Podów. Na pewno chcesz to zrobić?
+ Włącz prosty AdBlocker. Reklamy mogą znajdować się m.in. w osadzonych widokach
+ Blokuj reklamy
+ Informacje
+ Licencja
+ Debugowanie
+ Aplikacja
+ Urządzenie
+ Pod diaspora*
+ Log debugowania
+ Log debugowania (rozszerzony)
+ Wersja aplikacji: %1$s
+ Wersja systemu Android: %1$s
+ Nazwa urządzenia: %1$s
+ Nazwa kodowa: %1$s
+ Alias Poda: %1$s
+ Domena Poda: %1$s
+ Log debugowania został skopiowany do schowka
+ dandelion* to Twój cyfrowy towarzysz umożliwiający korzystanie z sieci społecznościowej diaspora*. Aplikacja posiada użyteczne paski narzędzi oraz obsługę serwerów proxy takich jak Tor, aby korzystanie z diaspory* było jeszcze przyjemniejsze.
+ Wesprzyj nas kodem!
+ dandelion* to wolne, w sensie wolności, oprogramowanie, zgodne z ideami projektu diaspora*. Jeśli chcesz nam pomóc w rozwoju, zapraszamy! Jesteśmy bardzo małym zespołem i ogromnie doceniamy każdą formę pomocy!
+ Pobierz kod źródłowy
+ Przetłumacz aplikację!
+ Aplikacja nie jest dostępna w Twoim języku? Możesz to zmienić, pomagając nam w tłumaczeniu! Dzięki platformie crowdin każdy może pomóc w tłumaczeniu aplikacji.
+ Chcę pomóc w tłumaczeniu
+ Wyślij feedback!
+ dandelion* jest ciągle w fazie rozwoju, więc jeśli masz jakiekolwiek sugestie lub chciałbyś podzielić się swoją opinią zrób to za pomocą naszego systemu zgłaszania błędów!
+ Zgłoś błąd
+ Powiedz innym o aplikacji!
+ Powiedz swoim znajomym i rodzinie o diaspora* oraz #dandelion! Dlaczego miałbyś nie opisać swoich doświadczeń na blogu? Byłoby nam miło usłyszeć, co masz do powiedzenia!
+ Udostępnij aplikację
+ Cześć! Wypróbuj #dandelion! %1$s
+
+ Twórcy aplikacji
+ Rozwojem i utrzymaniem aplikacji aktualnie zajmują się <br><br>%1$s
+ Współautorzy
+ %1$s<br><br>Wielkie dzięki!
+ Licencja GNU GPLv3+
+ Biblioteki zewnętrzne
+ Zostały użyte następujące biblioteki zewnętrzne:
+ Zaczerpnęliśmy kilka pomysłów oraz trochę kodu z aplikacji LeafPic. Wypróbuj ją, to także wolne oprogramowanie!
+ Chcę wiedzieć więcej
+ Włącz aby otwierać linki do YouTube w zewnętrznej aplikacji
+ Linki YouTube
+ Zmień motyw konta
+ Pociągnij aby odświeżyć
diff --git a/app/src/main/res/values-pt-rBR/strings-about.xml b/app/src/main/res/values-pt-rBR/strings-about.xml
deleted file mode 100644
index 94341faf..00000000
--- a/app/src/main/res/values-pt-rBR/strings-about.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
- Sobre
- Licença
- Depurando
- Aplicação
- Diaspora Pod
- Versão do App: %1$s
- Vagem de domínio: %1$s
-
-
-
diff --git a/app/src/main/res/values-pt-rBR/strings-preferences.xml b/app/src/main/res/values-pt-rBR/strings-preferences.xml
deleted file mode 100644
index ee8eebc8..00000000
--- a/app/src/main/res/values-pt-rBR/strings-preferences.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
-
-
-
-
- Aparência
- Rede
- Configurações do Pod
-
-
- Controle deslizante de navegação
- Visibilidade do controle de entradas na gaveta de navegação
- Visibilidade de item
-
- Tamanho da fonte
-
-
- Carregar imagens
- Desabilitar o carregamento de imagens para economizar seus créditos
-
- Habilitar o Proxy
- Usar proxy para o tráfego da diáspora para contornar firewalls.\nPode requerer reinicialização
- Servidor
- Porta
-
-
- Configurações pessoais
- Contatos
- Gerenciar sua lista de contatos
- Gerenciar Hashtags
- Adicionar ou excluir as hashtags que você está seguindo
- Alterar conta
- Apagar dados de sessão local e mudar para outro usuário de outro Pod diáspora
- Isto apagará todos os dados de sessão e cookies. Você quer realmente mudar sua conta?
- Limpar cache
- Limpar o cache do WebView
- Ocultar as barras de ferramentas superior e inferior automaticamente durante a rolagem
- Barras de ferramentas auto ocultante
- Acrescentar compartilhado-por-aviso
- Acrescentar uma referência (\"compartilhado por…\") a este app para textos compartilhados
-
-
-
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index e5535e31..682ddefd 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -1,65 +1,177 @@
-
-
- *[compartilhado por #DiasporaForAndroid]*
-
- Atualizar
- Notificação não lida. Quer ler?
-
- Opções
- Notificações
- Conversas
- Stream
- Perfil
- Aspectos
- Atividades
- Curti
- Comentou
- Menções
- Público
- Buscar
-
- Selecione o Pod
- Insira o domínio do Pod
- Confirme a URL do Pod
- OBS: A lista de pods é gerada por pods seguros do https://podupti.me. Você pode adicionar qualquer pod não listado.
- Por favor insira um nome de domínio válido
- Erro: Não conseguimos recuperar a lista de pods!
- Desculpe, que você deve estar conectado à Internet para prosseguir
- Confirmação
- Você realmente quer usar\nhttps://%1$s\no seu Pod diáspora?
- Deseja sair?
-
- Tags selecionadas
- Atividades públicas
- Compartilhar link como texto
- Compartilhar o screenshot da página Web
- Tirar screenshot da página Web
- Salvar imagem para
- Salvar screenshot como:
- Link copiado…
- Nova mensagem
- Ir para o topo
- Procurar por tags ou pessoas
- Sair do app
- Alternar a exibição móvel/área de trabalho
- Compartilhar…
- por tags
- por pessoas
- Por favor, adicione um nome
- Compartilhar link
- Salvar imagem
- Compartilhar Imagem
- Abrir em navegador externo…
- Copiar link para área de transferência
-
- Aviso: Não foi possível definir proxy de rede…
- Não é possível carregar a imagem
- Todas as tags
-
- Você deve conceder \"Permissão de armazenamento\" para salvar screenshots. Depois disso você deve fechar o app completamente ou reiniciar o telefone. Se você não permitir o acesso de armazenamento, mas deseja usar a função de captura de tela em um momento posterior, você pode conceder a permissão mais tarde. Por favor, abra: configurações - aplicativos - Diaspora. Na seção permissões, você pode conceder a permissão de armazenamento \"gravar\".
- Você deve conceder \"Permissão de armazenamento\" para salvar imagens. Depois disso você deve fechar o app completamente ou reiniciar o telefone. Se você não permitir o acesso de armazenamento, mas deseja salvar imagens em um momento posterior, você pode conceder a permissão mais tarde. Por favor, abra: configurações - aplicativos - Diaspora. Na seção permissões, você pode conceder a permissão de armazenamento \"gravar\".
- Permissão negada.
- Permissão concedida. Por favor, tente novamente.
+
+ Abra o painel de navegação
+ Fechar painel de navegação
+ Atualizar
+ Fechar
+ Cancelar
+
+ Configurações
+ Notificações
+ Conversas
+ Transmissão
+ Perfil
+ Aspectos
+ Atividades
+ Curtidas
+ Comentários
+ Referências
+ Público
+ Pesquisar
+ Contatos
+ Histórico de mudanças
+ Estatísticas
+
+ Todas as notificações
+ Também comentado
+ Comentar no post
+ Curtidas
+ Mencionado
+ Recompartilhado
+ Começou a compartilhar
+
+ Erro: Impossível recuperar as informações dos pods!
+ Você precisa conectar à Internet para prosseguir
+ Confirmação
+ Deseja sair?
+
+ Mais
+ Sobre | Ajuda
+ Tags seguidas
+ Atividades públicas
+ Relatórios
+ Compartilhar link como texto
+ Compartilhar uma captura de tela da página
+ Tirar uma captura de tela da página
+ Salvar imagem para
+ Salvar captura de tela como:
+ Link copiado…
+ Nova postagem
+ Ir para o topo
+ Procurar por tags ou pessoas
+ Sair do app
+ Alternar a exibição telefone/área de trabalho
+ Compartilhar…
+ por tags
+ por pessoas
+ Por favor, adicione um nome
+ Compartilhar endereço
+ Salvar imagem
+ Compartilhar imagem
+ Abrir em navegador externo…
+ Copiar endereço à área de transferência
+ Copiar endereço de imagem à área de transferência
+
+ Impossível carregar a imagem
+
+ Permissão negada.
+ Permissão concedida. Por favor, tente novamente.
+ Pod personalizado
+ Nome do pod
+ Protocolo
+ Endereço do pod
+ Sem dado
+ Voltar para a última página visitada no fluxo?
+ Ocultar a barra de estado na janela principal
+ Esconder barra de status
+ Mostrar título
+
+ Barra de ferramentas superior abre o fluxo
+ Clique em um espaço vazio na barra de ferramentas superior para abrir o fluxo
+
+ Aparência
+ Rede
+ Configurações do pod
+ Operabilidade
+
+
+ Controle deslizante de navegação
+ Visibilidade do controle de entradas na gaveta de navegação
+ Usuário
+ Geral
+ Administrador
+
+ Tema e cores
+ Controlar quais cores são usadas em todo o aplicativo
+ Cor principal
+ Cor das barras de ferramentas
+ Cor de destaque
+ Cor da barra de progresso
+ Modo AMOLED
+
+ Notificações estendidas
+ Muda o idioma do aplicativo. Reinicie o aplicativo para que as alterações entrem em vigor
+ Idioma
+ Idioma do sistema
+
+ Tamanho da fonte
+ Normal
+ Grande
+ Enorme
+
+ Carregar imagens
+ Desabilitar o carregamento de imagens para economizar seus créditos
+
+ Rotação de tela
+ Controle da rotação automática de tela
+ Padrão
+ Sensor\n(ignorar configurações de sistema)
+ Retrato
+ Paisagem
+
+ Carregar configuração do Tor
+ Carregar configurações de proxy HTTP do Tor (Orbot)
+ Proxy
+ Habilitar Proxy
+ Usar proxy no dandelion* para contornar firewalls. \nRequer reinicialização. Pode não funcionar em alguns telefones.
+ Servidor
+ Porta
+ É necessário reiniciar para desabilitar o proxy
+ Predefinição de proxy orbot carregado
+
+ Abrir links externos com guias de predefinidas do Chrome. O Chromium ou o Google Chrome precisa ser instalado para utilizar esse recurso. \nNOTA IMPORTANTE: Guias Chrome predefinidas não usam servidores proxy!
+
+ Configurações pessoais
+ Abra suas configurações de usuário diaspora*
+ Gerenciar seus contatos
+ Gerenciar Hashtags
+ Parar de seguir hashtags
+ Alterar conta
+ Apagar dados de sessão local e mudar para outro usuário de outro Pod diaspora*
+ Isto apagará todos os dados de sessão e cookies. Você quer realmente mudar sua conta?
+ Limpar cache
+ Limpar o cache do WebView
+ Ocultar as barras de ferramentas superior e inferior automaticamente durante a rolagem
+ Barras de ferramentas auto ocultante
+ Acrescentar compartilhado-por-aviso
+ Acrescentar referência a este aplicativo aos textos compartilhados: [via #dandelion]
+
+ Diversos
+ Zerar tudo
+ Limpar localmente todas as configurações relacionadas ao aplicativo e sair de todas as contas
+ Isto irá retornar todas as configurações alteradas do aplicativo para seus valores padrão e encerrar as sessões de todos os pods. Suas imagens baixadas permanecerão intactas. Tem certeza que deseja prosseguir?
+ Habilite AdBlocker básico. Anúncios incorporados, p.ex., podem ser vistos
+ Bloquear anúncios
+ Sobre
+ Licença
+ Depurando
+ Aplicação
+ Dispositivo
+ diaspora* Pod
+ Histórico de Depuração
+ Histórico de depuração (detalhado)
+ Versão do App: %1$s
+ Versão do Android: %1$s
+ Nome do dispositivo: %1$s
+ Codinome: %1$s
+ Domínio do Pod: %1$s
+
+ Mantenedores
+ Colaboradores
+ %1$s<br><br>Obrigado!
+ Licença GNU GPLv3+
+ Bibliotecas de Terceiros
+ São usadas as seguintes bibliotecas:
+ Conte-me mais
diff --git a/app/src/main/res/values-pt/strings-about.xml b/app/src/main/res/values-pt/strings-about.xml
deleted file mode 100644
index 54191dc5..00000000
--- a/app/src/main/res/values-pt/strings-about.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-pt/strings-preferences.xml b/app/src/main/res/values-pt/strings-preferences.xml
deleted file mode 100644
index 3885ddb3..00000000
--- a/app/src/main/res/values-pt/strings-preferences.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 193ab72a..a0b80c09 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -1,11 +1,205 @@
-
-
-
-
-
-
-
-
+
+ Abrir menu de navegação
+ Fechar menu de navegação
+ Recarregar
+ Fechar
+ Cancelar
+
+ Definições
+ Notificações
+ Conversas
+ Fluxo
+ Perfil
+ Aspetos
+ Atividades
+ Gostou
+ Comentou
+ Menções
+ Público
+ Pesquisar
+ Contactos
+ Alterações
+ Estatísticas
+
+ Todas as notificações
+ Também comentou
+ Comentar publicação
+ Gostou
+ Mencionou
+ Partilhou
+ Partilha iniciada
+
+ Erro: não foi possível obter a lista de pods!
+ Tem que haver uma ligação à Internet para continuar
+ Confirmação
+ Deseja sair?
+
+ Mais
+ Acerca | Ajuda
+ Etiquetas seguidas
+ Atividade pública
+ Relatórios
+ Partilhar ligação como texto
+ Partilhar imagem da página web
+ Obter imagem da página web
+ Guardar imagem em
+ Guardar imagem como:
+ Ligação copiada…
+ Nova publicação
+ Ir para o topo
+ Pesquisar por etiquetas ou por pessoas
+ Sair
+ Alternar entre vista móvel/desktop
+ Partilhar…
+ por etiquetas
+ por pessoa
+ Por favor adicione um nome
+ Partilhar ligação
+ Guardar imagem
+ Partilhar imagem
+ Abrir no navegador externo…
+ Copiar ligação para área de transferência
+ Copiar endereço da imagem para a área de transferência
+
+ Não foi possível carregar a imagem
+
+ Permissão recusada.
+ Permissão concedida. Tente novamente.
+ Pod personalizado
+ Nome do Pod
+ Protocolo
+ Endereço do Pod
+ Valor em falta
+ Ir para a última página visitada no fluxo?
+ Ocultar barra de estado na vista principal
+ Ocultar barra de estado
+ Mostrar título na vista principal
+ Mostrar título
+ Atalho para o lançador
+
+ Barra de ferramentas superior carrega o fluxo
+ Clique num espaço vazio da barra de ferramentas superior para abrir o fluxo
+
+ Aparência
+ Rede
+ Definições do Pod
+ Operacionalidade
+
+
+ Controlo de navegação
+ Controlar exibição das entradas no menu de navegação
+ Utilizador
+ Geral
+ Administrador
+
+ Tema e cores
+ Controlar as cores utilizadas na aplicação
+ Cor principal
+ Cor das barras de ferramentas
+ Cor secundária
+ Cor da barra de progresso
+ Modo AMOLED
+ Substitua as cores com o AMOLED exibe preto amigável em muitas partes do aplicativo. Você precisa reiniciar para alternar esta configuração. Para navegar em diaspora* no escuro, você também precisa ativar o tema escuro, que pode ser encontrado nas configurações da sua conta pessoal diaspora*.
+
+ Notificações expandidas
+ Estenda o sinal de notificações com um menu suspenso que mostra as categorias de notificação
+ Altera o idioma da aplicação. Tem que reiniciar a aplicação para aplicar as alterações
+ Idioma
+ Idioma do sistema
+
+ Controlar tamanho do texto na WebView
+ Tamanho do tipo de letra
+ Normal
+ Grande
+ Enorme
+
+ Carregar imagens
+ Alternar carregamento de imagens para poupar dados móveis
+
+ Rotação do ecrã
+ Controlar automaticamente a rotação do ecrã
+ Padrão
+ Sensor\n(ignorar definições do sistema)
+ Vertical
+ Horizontal
+
+ Carregar predefinição Tor
+ Carregar definições de proxy para Tor (Orbot) Proxy HTTP
+ Proxy
+ Ativar proxy
+ Proxy dandelion*\'s para contornar firewalls.\nPode ser necessário reiniciar e pode não funcionar em alguns telefones.
+ Servidor
+ Porta
+ Tem que reiniciar a aplicação para aplicar a alteração
+ Predefinição de proxy Orbot carregada
+
+ Abra links externos com abas personalizadas do Chrome. Chromium, Firefox ou Google Chrome precisa ser instalado para usar este recurso. \nNOTA IMPORTANTE: Guias personalizadas do Chrome não usam servidores proxy configurados!
+
+ Definições pessoais
+ Abra suas definições da sua conta diaspora*
+ Gerir lista de contactos
+ Gerir \'hashtags\'
+ Não seguir hashtags já seguidas
+ Mudar de conta
+ Apagar dados de sessão local e mudar para outro pod/conta diaspora*
+ Isto irá apagar todos os dados de cookies e da sessão. Tem a certeza de que deseja alterar sua conta?
+ Limpar cache
+ Limpar cache WebView
+ Ocultar automaticamente as barras de ferramentas superior e inferior durante a rolagem
+ Barra Intellihide
+ Anexar compartilhado-por-aviso
+ Acrescentar uma referência a este aplicativo a textos compartilhados: [via #dandelion]
+
+ Diversos
+ Resetar tudo
+ Localmente limpar todas as configurações relacionadas ao aplicativo e sair de todas as contas
+ Isto irá redefinir todas as configurações alteradas do aplicativo para seus valores padrão e sair de todos os servidores. Suas imagens baixadas permanecerão intactas. Tem certeza que deseja continuar?
+ Habilitar o AdBlocker básico. Anúncios podem ser incluídos, por exemplo, em visualizações incorporadas
+ Bloquear anúncios
+ Acerca
+ Licença
+ Depuração
+ Aplicação
+ Dispositivo
+ diaspora* Pod
+ Registo de depuração
+ Registo de depuração (detalhado)
+ Versão: %1$s
+ Versão Android: %1$s
+ Nome do dispositivo: %1$s
+ Nome de código: %1$s
+ Nome do perfil Pod: %1$s
+ Domínio Pod: %1$s
+ Dados copiados para a área de transferência
+ dandelion* é seu aplicativo companheiro para navegar pela diaspora*. Ele adiciona recursos como barras de ferramentas úteis e suporte para servidores de proxy como a Tor Network para sua experiência social.
+ Contribua com código!
+ dandelion* é desenvolvido gratuitamente como na Liberdade e segue as ideias do projeto diaspora*. Se você quiser contribuir, vá em frente! Atualmente somos uma equipe muito pequena, então nós apreciamos muito qualquer tipo de ajuda!
+ Obter o código fonte
+ Traduzir a aplicação!
+ O aplicativo não está disponível em seu idioma? Você pode alterar isso! Por que você não nos ajuda traduzindo-lo? Nós usamos Stringlate para permitir que alguém traduza o aplicativo.
+ Quero participar
+ Dar Feedback!
+ dandelion* ainda está em desenvolvimento, então se você tiver sugestões ou algum tipo de feedback, por favor, use nosso bug tracker para nos informar!
+ Reportar erros
+ Passe a palavra!
+ Conte aos seus amigos e familiares sobre diaspora* e #dandelion! Por que você não blog sobre suas experiências? Nós adoraríamos ouvir de você!
+ Partilhar plicação
+ Ei! Confira #dandelion! %1$s
+
+ Desenvolvimento
+ Esta aplicação está a ser desenvolvida e mantida por <br><br>%1$s
+ Colaboradores
+ %1$s<br><br>Obrigado!
+ Licença GNU GPLv3+
+ Bibliotecas de terceiros
+ Utilizamos as seguintes bibliotecas:
+ Demos alguma inspiração e código do LeafPic. Vá conferir, é também software livre!
+ Saber mais
+ Ative para abrir as ligações YouTube na aplicação externa
+ Ligações YouTube
+ Altera o tema da sua conta
+ Puxar para atualizar
+ Deslize de cima para baixo para recarregar.\nTem que reiniciar a aplicação para aplicar as alterações.
diff --git a/app/src/main/res/values-ro-rRO/strings.xml b/app/src/main/res/values-ro-rRO/strings.xml
new file mode 100644
index 00000000..7fe2aa0d
--- /dev/null
+++ b/app/src/main/res/values-ro-rRO/strings.xml
@@ -0,0 +1,78 @@
+
+
+
+ Reîncarcă
+
+ Setări
+ Notificări
+ Conversații
+ Stream
+ Profil
+ Aspecte
+ Activități
+ Apreciate
+ Comentate
+ Mențiuni
+ Public
+ Căutare
+ Contacte
+ Jurnalul modificărilor
+ Statistici
+
+ Toate notificările
+ Si comentate
+ Comentariu pe Post
+ Apreciate
+ Menţionate
+ Repartajate
+ Început Partajare
+
+ Eroare: Lista de Pod-uri nu poate fi preluată!
+ Ne pare rău, trebuie să fi conectat la Internet pentru a continua
+ Confirmare
+ Doriţi să ieşiţi?
+
+ Extra
+ Despre | Ajutor
+ Tag-uri urmarite
+ Activităţi publice
+ Rapoarte
+ Partajează adresa ca text
+ Share screenshot a paginii web
+ Ia screenshot a paginii web
+ Imagine salvată în
+ Screenshot salvat ca:
+ Adresa copiată …
+ Postare nouă
+ Du-te la partea de sus
+ Căutare după Tag-uri sau persoane
+ Ieșire din Aplicatie
+ Comuta Vezi mobil/desktop
+ Distribuire…
+ după etichete
+ dupa persoane
+ Adauga nume
+ Partajează adresa
+ Salvează imaginea
+ Partajează imaginea
+
+
+
+ Despre
+ Licenţă
+ Depanare
+ Aplicaţie
+ Dispozitiv
+ Pod diaspora*
+ Jurnal Depanare
+ Jurnal Depanare (Detaliat)
+ Versiune aplicație: %1$s
+ Versiune Android: %1$s
+ Nume Dispozitiv: %1$s
+ Nume de cod: %1$s
+ Nume Profil Pod: %1$s
+ Domeniu Pod: %1$s
+ Jurnal Depanare copiat în clipboard
+ dandelion* este companionul tau pentru navigarea reţelei sociale diaspora *. Adaugă caracteristici cum ar fi utilele bare de instrumente şi suport pentru proxy servere ca Tor Network pentru experienţa ta socială.
+
+
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
new file mode 100644
index 00000000..b14cad56
--- /dev/null
+++ b/app/src/main/res/values-ro/strings.xml
@@ -0,0 +1,95 @@
+
+
+
+ Reîncarcă
+
+ Setări
+ Notificări
+ Conversații
+ Stream
+ Profil
+ Aspecte
+ Activități
+ Apreciate
+ Comentate
+ Mențiuni
+ Public
+ Căutare
+ Contacte
+ Jurnalul modificărilor
+ Statistici
+
+ Toate notificările
+ Si comentate
+ Comentariu pe Post
+ Apreciate
+ Menţionate
+ Repartajate
+ Început Partajare
+
+ Eroare: Lista de Pod-uri nu poate fi preluată!
+ Ne pare rău, trebuie să fi conectat la Internet pentru a continua
+ Confirmare
+ Doriţi să ieşiţi?
+
+ Extra
+ Despre | Ajutor
+ Tag-uri urmarite
+ Activităţi publice
+ Rapoarte
+ Partajează adresa ca text
+ Share screenshot a paginii web
+ Ia screenshot a paginii web
+ Imagine salvată în
+ Screenshot salvat ca:
+ Adresa copiată …
+ Postare nouă
+ Du-te la partea de sus
+ Căutare după Tag-uri sau persoane
+ Ieșire din Aplicatie
+ Comuta Vezi mobil/desktop
+ Distribuire…
+ după etichete
+ dupa persoane
+ Adauga nume
+ Partajează adresa
+ Salvează imaginea
+ Partajează imaginea
+
+
+
+
+
+
+
+
+ Schimbă limba acestei aplicații. Restartează aplicația pentru ca schimbările să ia efect
+ Limbă
+
+
+
+
+
+
+ Goliți memoria cache
+
+ Diverse
+ Despre
+ Licenţă
+ Depanare
+ Aplicaţie
+ Dispozitiv
+ Pod diaspora*
+ Jurnal Depanare
+ Jurnal Depanare (Detaliat)
+ Versiune aplicație: %1$s
+ Versiune Android: %1$s
+ Nume Dispozitiv: %1$s
+ Nume de cod: %1$s
+ Nume Profil Pod: %1$s
+ Domeniu Pod: %1$s
+ Jurnal Depanare copiat în clipboard
+ dandelion* este companionul tau pentru navigarea reţelei sociale diaspora *. Adaugă caracteristici cum ar fi utilele bare de instrumente şi suport pentru proxy servere ca Tor Network pentru experienţa ta socială.
+
+ Contribuitori
+
diff --git a/app/src/main/res/values-ru/strings-about.xml b/app/src/main/res/values-ru/strings-about.xml
deleted file mode 100644
index 54191dc5..00000000
--- a/app/src/main/res/values-ru/strings-about.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-ru/strings-preferences.xml b/app/src/main/res/values-ru/strings-preferences.xml
deleted file mode 100644
index 3bc04e85..00000000
--- a/app/src/main/res/values-ru/strings-preferences.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
-
-
-
-
- Внешний вид
- Сеть
- Настройки пода
-
-
- Слайдер навигации
- Управление видимостью записей в ящике навигации
- Видимость элемента
-
- Размер шрифта
-
-
- Загрузка изображений
- Отключить загрузку изображений для экономии траффика
-
- Использовать прокси
- Перенаправить трафик Диаспоры в обход брандмауэров.\nМожет потребовать перезапуска
- Хост
- Порт
-
-
- Личные настройки
- Контакты
- Управление списком контактов
- Управление хэштегами
- Добавление и удаление хэштегов, на которые вы подписаны
- Сменить аккаунт
- Стереть данные локального сеанса и переключиться на другой под/аккаунт Диаспоры
- Это удалит все файлы cookie и данные сеанса. Вы действительно хотите изменить вашу учетную запись?
- Очистить кэш
- Очистить кэш WebView
- Скрывать верхнюю и нижнюю панели инструментов автоматически во время прокрутки
- Интеллектуальное скрытие панелей инструментов
- Присоединять \"Опубликовано из\" к сообщению
- Присоединять ссылку на приложение (\"Опубликовано из…\") к размещенным записям
-
-
-
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index bc08b56f..4aa33db5 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -1,65 +1,207 @@
-
-
- *[опубликовано из #DiasporaForAndroid]*
-
- Перезагрузить
- Непрочитанное уведомление. Хотите прочитать его?
-
- Настройки
- Уведомления
- Разговоры
- Поток
- Профиль
- Аспекты
- Недавняя активность
- Понравившиеся
- Прокомментированные
- Упоминания
- Публичные
- Поиск
-
- Выберите под
- Введите адрес пода
- Подтвердите URL пода
- Примечание: список подов формируется на основании списка безопасных подов с https://podupti.me. Вы можете ввести в поле для ввода любой под не из списка.
- Пожалуйста, введите корректное имя домена
- Ошибка: не удалось получить список подов!
- Извините, вы должны быть подключены к Интернету, чтобы продолжить
- Подтверждение
- Вы действительно хотите использовать\nhttps://%1$s\nв качестве вашего пода в Диаспоре?
- Вы действительно хотите выйти?
-
- Отслеживаемые хэштеги
- Публичная активность
- Разместить ссылку как текст
- Разместить экранный снимок страницы
- Сделать экранный снимок страницы
- Сохранение изображения в
- Сохранение экранного снимка как:
- Адрес ссылки скопирован…
- Новая запись
- Наверх
- Поиск по тегам или людям
- Выйти из приложения
- Переключить мобильный/настольный режим просмотра
- Поделиться…
- по тегам
- по людям
- Пожалуйста добавьте имя
- Разместить адрес ссылки
- Сохранить изображение
- Поделиться изображением
- Открыть во внешнем браузере…
- Копировать адрес ссылки в буфер обмена
-
- Предупреждение: Не удалось установить сетевой прокси…
- Не удается загрузить изображение
- Все теги
-
- Необходимо предоставить «Разрешение на доступ к хранилищу» для сохранения скриншотов. После этого вы должны полностью закрыть приложение или перезагрузите телефон. Если вы не разрешаете доступ к хранилищу, но хотите использовать функцию скриншотов позже, можно предоставить разрешение позднее. Затем откройте: Системные настройки - приложения - Диаспора. В разделе разрешения можно предоставить «разрешение на запись в хранилище».
- Необходимо предоставить «Разрешение на доступ к хранилищу» для сохранения изображений. После этого вы должны полностью закрыть приложение или перезагрузите телефон. Если вы не разрешаете доступ к хранилищу, но хотите сохранять изображения позже, можно предоставить разрешение позднее. Затем откройте: Системные настройки - приложения - Диаспора. В разделе разрешения можно предоставить «разрешение на запись в хранилище».
- В разрешении отказано.
- Разрешение получено. Пожалуйста, попробуйте еще раз.
+
+ Открыть панель навигации
+ Закрыть панель навигации
+ Обновить
+ Закрыть
+ Отмена
+
+ Настройки
+ Уведомления
+ Разговоры
+ Поток
+ Профиль
+ Аспекты
+ Активность
+ Понравившееся
+ Прокомментированное
+ Упоминания
+ Публичное
+ Поиск
+ Контакты
+ История изменений
+ Статистика
+
+ Все уведомления
+ Также прокомментировали
+ Комментарий к записи
+ Понравилось
+ Упомянули
+ Поделились
+ Добавили вас
+
+ Ошибка: Не удалось получить список подов!
+ Извините, вы должны быть подключены к Интернету, чтобы продолжить
+ Подтверждение
+ Вы хотите выйти?
+
+ Дополнительно
+ Информация | Помощь
+ Теги
+ Публичное
+ Отчёты
+ Поделиться ссылкой как текстом
+ Поделиться скриншотом страницы
+ Сделать скриншот страницы
+ Сохранение изображения в
+ Сохранение скриншота как:
+ Адрес ссылки скопирован …
+ Новый пост
+ В начало
+ Искать по тегам и людям
+ Выйти из приложения
+ Переключить мобильный вид
+ Поделиться…
+ по тегам
+ по людям
+ Пожалуйста, добавьте имя
+ Поделиться адресом ссылки
+ Сохранить изображение
+ Поделиться изображением
+ Открыть во внешнем браузере…
+ Скопировать адрес ссылки в буфер обмена
+ Скопировать адрес изображения в буфер обмена
+
+ Не удаётся загрузить изображение
+
+ Необходимо предоставить «Разрешение на доступ к хранилищу» для сохранения скриншотов. После этого вы должны полностью закрыть приложение или перезагрузите телефон. Если вы не разрешаете доступ к хранилищу, но хотите использовать функцию скриншотов позже, можно предоставить разрешение позднее. Затем откройте: Системные настройки - приложения - dandelion*. В разделе разрешения можно предоставить «разрешение на запись в хранилище».
+ Необходимо предоставить «Разрешение на доступ к хранилищу» для сохранения/выгрузки изображений. После этого вам необходимо полностью закрыть приложение или перезагрузить телефон. Если вы не разрешаете доступ к хранилищу, но хотите сохранять изображения позже, можно предоставить разрешение позднее. В таком случае откройте: Системные настройки - приложения - dandelion*. В разделе разрешений можно будет предоставить «разрешение на запись в хранилище».
+ В разрешении отказано.
+ Разрешение получено. Пожалуйста, попытайтесь снова.
+ Произвольный под
+ Название пода
+ Протокол
+ Адрес пода
+ Значение отсутствует
+ Перейти к последней просмотренной странице в Потоке?
+ Скрыть строку состояния в главном окне
+ Скрыть строку состояния
+ Показывать заголовок на главном экране
+ Показать заголовок
+ Ярлык лаунчера
+
+ Верхняя панель инструментов загружает Поток
+ Нажмите на пустое пространство на верхней панели инструментов, чтобы открыть Поток
+
+ Внешний вид
+ Сеть
+ Настройки пода
+ Работоспособность
+
+
+ Слайдер навигации
+ Управление видимостью записей в ящике навигации
+ Пользовательские
+ Общие
+ Для администраторов
+
+ Тема и цвета
+ Выбор цветов используемых в приложении
+ Основной цвет
+ Цвет панелей инструментов
+ Акцентирующий цвет
+ Цвет индикатора загрузки
+ Режим AMOLED
+ Переопределить цвета на благоприятный для AMOLED чёрный во многих частях приложения. Вам нужно перезапустить приложение, чтобы включить эту опцию. Для просмотра диаспоры* в тёмных тонах, вам также необходимо активировать тёмную тему в настройках аккаунта.
+
+ Расширенные уведомления
+ Показывать выпадающее меню с категориями уведомлений при нажатии на иконку уведомлений
+ Изменить язык этого приложения. Перезапустите приложение, чтобы изменения вступили в силу
+ Язык
+ Язык системы
+
+ Управление размером текста WebView
+ Размер шрифта
+ Нормальный
+ Крупный
+ Огромный
+
+ Загружать изображения
+ Отключить загрузку изображений для экономии трафика
+
+ Поворот экрана
+ Контролировать автоматический поворот экрана
+ По умолчанию
+ Сенсор\n(игнорировать системные настройки)
+ Вертикальная ориентация
+ Горизонтальная ориентация
+
+ Загрузить шаблон конфигурации Tor
+ Загрузить настройки прокси для Tor (Orbot)
+ Прокси
+ Включить прокси
+ Проксировать трафик dandelion* для обхода брандмауэров.\nМожет потребоваться перезапуск
+ Хост
+ Порт
+ Приложению необходимо перезапуститься, чтобы отключить использование прокси
+ Шаблон конфигурации прокси Orbot загружен
+
+ Открывать внешние ссылки с помощью Chrome Custom Tabs. Для этого должен быть установлен Chromium или Google Chrome. \nВАЖНОЕ ЗАМЕЧАНИЕ: Chrome Custom Tabs не использует настройки прокси-серверов!
+
+ Личные настройки
+ Открыть настройки аккаунта diaspora*
+ Управление списком контактов
+ Управление тегами
+ Отписаться от тегов
+ Сменить учётную запись
+ Стереть данные локального сеанса и переключиться на другой под/аккаунт diaspora*
+ Это сотрёт все куки и данные сеанса. Вы действительно хотите сменить учётную запись?
+ Очистить кэш
+ Очистить кэш WebView
+ Скрывать верхнюю и нижнюю панели инструментов автоматически во время прокрутки
+ Интеллектуальное скрытие панелей инструментов
+ Добавлять \"Опубликовано из\" к сообщению
+ Добавлять к сообщениям ссылку на это приложение: [via #dandelion]
+
+ Прочее
+ Полный сброс
+ Локально стереть все параметры, относящиеся к приложению и выйти из всех учётных записей
+ Это сбросит все изменённые параметры приложения на значения по умолчанию и выйдет из аккаунтов на всех подах. Ваши загруженные изображения останутся нетронутыми. Вы уверены, что хотите продолжить?
+ Включить простой блокировщик рекламы. Реклама может быть во встроенных элементах страницы
+ Блокировать рекламу
+ О программе
+ Лицензия
+ Отладка
+ Приложение
+ Устройство
+ Под diaspora*
+ Журнал отладки
+ Журнал отладки (подробный)
+ Версия приложения: %1$s
+ Версия Android: %1$s
+ Имя устройства: %1$s
+ Кодовое имя: %1$s
+ Имя профиля пода: %1$s
+ Домен пода: %1$s
+ Журнал отладки скопирован в буфер обмена
+ dandelion* - это приложение-компаньон для социальной сети Диаспора*. Приложение добавляет такие функции как полезные панели инструментов и поддержку прокси-серверов (таких как Tor).
+ Сделайте свой вклад!
+ dandelion* разрабатывается как свободное ПО и следует идеям проекта Диаспора*. Если вы хотите помочь - вперёд! В настоящее время мы является очень небольшой командой, поэтому мы высоко ценим любые виды помощи!
+ Получить исходный код
+ Переведите приложение!
+ Приложение недоступно на вашем языке? Вы можете это изменить! Почему бы вам не помочь нам перевести его? Мы используем платформу crowdin, чтобы позволить любому сделать это.
+ Перейти к переводу
+ Оставьте отзыв!
+ dandelion* всё ещё находится в разработке, так что, если у вас есть предложения или пожелания, пожалуйста, воспользуйтесь нашим трекером ошибок, чтобы сообщить нам об этом!
+ Сообщить об ошибках
+ Расскажите друзьям!
+ Расскажите вашим друзьям и семье о Диаспоре* и #dandelion! Почему бы вам не разместить запись о вашем опыте в блоге? Мы будем рады услышать об этом!
+ Рассказать о приложении
+ Эй! Зацените #dandelion! %1$s
+
+ Мейнтейнеры
+ Это приложение в настоящее время разрабатывается и поддерживается следующими людьми: <br><br>%1$s
+ Поддержавшие проект
+ %1$s<br><br>Спасибо вам!
+ Лицензия GNU GPLv3+
+ Сторонние библиотеки
+ Используются следующие библиотеки:
+ Мы вдохновлялись и взяли немного кода из LeafPic. Попробуйте это приложение, оно тоже является свободным ПО!
+ Расскажите мне больше
+ Открывать ссылки на Youtube во внешних приложениях
+ Ссылки на Youtube
+ Изменить тему вашей учётной записи
+ Потяните для обновления
+ Потяните вниз, чтобы обновить страницу.\nВам нужно перезапустить приложение, чтобы изменения вступили в силу.
diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml
new file mode 100644
index 00000000..d16b663e
--- /dev/null
+++ b/app/src/main/res/values-sc/strings.xml
@@ -0,0 +1,210 @@
+
+
+
+ Aberi su pannellu de nàvigu
+ Serra su pannellu de nàvigu
+ Torra a carrigare
+ Serra
+ Annulla
+
+ Impostatziones
+ Notìficas
+ Arresonos
+ Flussu
+ Profilu
+ Caras
+ Atividades
+ Agradèssidas
+ Cummentadas
+ Numenadas
+ Pùblicu
+ Chirca
+ Cuntatos
+ Registru de sas modìficas
+ Istatìsticas
+
+ Totu sas notìficas
+ Àteros cummentos
+ Cummentu in una publicatzione
+ Agradèssidas
+ Numenada
+ Torrada a cumparzire
+ At incumintzadu a cumpartzire
+
+ Errore: Impossìbile recuperare sa lista de sos pods!
+ Depes èssere connessu a ìnternet pro sighire
+ Cunfirma
+ Cheres essire?
+
+ Àteru
+ Informatziones |Agiudu
+ Etichetas sighidas
+ Atividades pùblicas
+ Sinnalatziones
+ Cumpartzi unu ligàmene comente testu
+ Cumpartzi s\'ischermada de sa pàgina web
+ Faghe un\'ischermada de sa pàgina web
+ Sarbende s\'immàgine in
+ Sarbende s\'ischermada in:
+ Ligàmene copiadu…
+ Publicatzione noa
+ Torra a s\'incumintzu
+ Chirca etichetas o persones
+ Essi dae s\'aplicatzione
+ Allughe/istuda sa versione mòbile
+ Cumpartzi…
+ pro eticheta
+ pro persone
+ Pro praghere annanghe unu nùmene
+ Cumpartzi ligàmene
+ Sarva s\'immàgine
+ Cumpartzi s\'immàgine
+ Aberi in un\'esploradore (browser) esternu…
+ Còpia su ligàmenes in sos apuntos
+ Còpia s\'indiritzu de s\'immàgine in sos apuntos
+
+ Impossìbile carrigare s\'immàgine
+
+ Depes frunire \"Permissu de atzessu a sa memòria\" pro sarvare sas ischermadas. A pustis dias dèpere serrare de su totu s\'aplicatzione o torrare a allùghere su dispositivu. Si no as a frunire su permissu a sa memòria ma cheres impreare sa funtzionalidade de ischermada, prus a tardu, l\'as a pòdere fàghere tando. Pro praghere aberi: systemsettings - apps - dandelion*. In sa setzione pro sos permissosas a pòdere frunire su \"permissu de atzessu a sa memòria\".
+ Depes frunire \"Permissu de atzessu a sa memòria\" pro sarvare e carrigare sas immàgines. A pustis dias dèpere serrare de su totu s\'aplicatzione o torrare a allùghere su dispositivu. Si no as a frunire su permissu a sa memòria ma cheres impreare sa funtzionalidade de ischermada, prus a tardu, l\'as a pòdere fàghere tando. Pro praghere aberi: systemsettings - apps - dandelion*. In sa setzione pro sos permissosas a pòdere frunire su \"permissu de atzessu a sa memòria\".
+ Permissu dennegadu.
+ Permissu cuntzessu. Pro praghere torra a proare.
+ Pod personalizadu
+ Nùmene de su pod
+ Protocollu
+ Indiritzu de su pod
+ Valore fartante
+ Brincare a s\'ùrtima pàgina visitada in su flussu?
+ Istichi sa barra de s\'istadu in sa vista printzipale
+ Istichi sa barra de s\'istadu
+ Ammustra su tìtulu in sa vista printzipale
+ Ammustra tìtulu
+ Incurtzada de s\'allughidore
+
+ Sa barra superiore aberit su flussu
+ Incarca in unu tretu bòidu in sa barra superiore de sas ainas pro abèrrere su flussu
+
+ Aparèntzia
+ Retza
+ Impostatziones de su pod
+ Operabilidade
+
+
+ Menù de nàvigu
+ Controlla sa visibilidade de sos elementos in su menù de nàvigu
+ Impreadore
+ Generales
+ Amministratzione
+
+ Temas e colores
+ Controlla cales colores sunt impreados in s\'aplicatzione
+ Colore primàriu
+ Colore de sas barras de sas ainas
+ Colore secondàriu
+ Colore de sa barra de progressu
+ Modalidade AMOLED
+ Remplasa sos colores cun su nigheddu pro ischermos AMOLED in medas tretos de s\'aplicatzione. As a dèpere torrare a allùghere s\'aplicatzione pro ativare custa impostatzione. Pro navigare in diaspora* cun su tema iscuru lu depes fintzas allùghere dae sas optziones personales de su contu de diaspora* tuo.
+
+ Notìficas ismanniadas
+ Ismànnia su butone de sas notìficas cun unu menù chi ammustrat sas categorias de sas notìficas
+ Càmbia sa limba de custa aplicatzione. Torra·la a allùghere pro fàghere tènnere efetu a su cambiamentu
+ Limba
+ Limba de sistema
+
+ Controlla sa mannària de su testu de sa vista web
+ Mannària de su testu
+ Normale
+ Mannu
+ Mannu meda
+
+ Iscàrriga sas immàgines
+ Allughe/istuda su carrigamentu de sas immàgines pro risparmiare sos datos mòbiles
+
+ Rotatzione de s\'ischermu
+ Controlla sa rotatzione automàtica de s\'ischermu
+ Predefinidu
+ Sensore\n
+ (ignora sas impostatziones de sistema)
+ Verticale
+ Orizontale
+
+ Càrriga sos valores predefinidos de Tor
+ Càrriga sas impostatziones pro su sèrver intermèdiu HTTP de Tor (Orbot)
+ Server intermèdiu (Proxy)
+ Abìlita unu server intermèdiu
+ Faghe colare su tràficu de dandelion* in unu server intermèdiu pro isfrancare sos firewalls.\n
+ Diat pòdere èssere netzessàriu a torrare a allùghere s\'aplicatzione. Diat pòdere non funtzionare pro carchi telèfono.
+ Host
+ Ghenna
+ Depes torrare a allùghere s\'aplicatzione pro istudare s\'impreu de su server intermediàriu
+ Impostatziones de su server de Orbot carrigadas
+
+ Aberi sos ligàmenes esternos cun sas ischedas personalizadas de Chrome. Chromium o Google Chrome depent èssere installados pro lu pòdere fàghere. \n
+ NOTA DE IMPORTU: sas ischedas personalizadas de Chrome no impreant sos servers intermediàrios configurados!
+
+ Impostatziones personales
+ Aberi sas impostatziones de su contu de diaspora* tuo
+ Amministra sa lista de sos contatos tuos
+ Amministra sas etichetas
+ Acaba·la de sighire sas etichetas sighidas
+ Càmbia contu
+ Iscantzella sos datos de sa sessione locale e cola a un\'àteru contu o pod de diaspora*
+ Custu at a iscantzellare totu sos cookies e sos datos de sa sessione. Seguru ses de chèrrere cambiare su contu tuo?
+ Iscantzella sa cache
+ Iscantzella sa cache de sa vista web
+ Istichi automaticamente sas barras superiores e inferiores cando ses iscurrende sa pàgina
+ Barras chi s\'istichint intelligentemente
+ Annanghe un\'avisu de s\'aplicatzione
+ Annanghe unu riferimentu a custa aplicatzione a sos testos cumpartzidos: [via #dandelion]
+
+ Vàriu
+ Reimpostatzione intrea
+ Iscantzella localmente totu sos datos relativos a s\'aplicatzione e essi dae totu sos contos
+ Custu at a fàghere torrare totu sas impostatziones de s\'aplicatzione a sos valores predefinidos e t\'at a fàghere essire dae totu sos pods. Sas immàgines iscarrigadas dae tie no ant a èssere tocadas. Seguru ses de chèrrere sighire?
+ Abìlita su blocadore de publitzidade de base. Sa publitzidade diat pòdere èssere incluida, pro esèmpiu, in sas visualizatziones incorporadas
+ Bloca sa publitzidade
+ Informatziones
+ Litzèntzia
+ Depuratzione dae sos errores
+ Aplicatzione
+ Dispositivu
+ Pod de diaspora*
+ Registru de depuratzione
+ Registru de depuratzione (a sa minuda)
+ Versione aplicatzione: %1$s
+ Versione Android: %1$s
+ Nùmene dispositivu: %1$s
+ Nùmene còdighe: %1$s
+ Nùmene de profilu de su pod: %1$s
+ Domìniu de su pod: %1$s
+ Registru de depuratzione copiadu in sos apuntos
+ dandelion* est s\'aplicatzione tua pro s\'esploratzione de sa retza sotziale diaspora*. Annanghet funtzionalidades comente a barras de ainas utilosas e a su suportu pro server intermediàrios (proxies) comente a sa retza Tor pro s\'esperièntzia sotziale tua.
+ Contribui a su còdighe!
+ dandelion* est iscvilupada liberamente e sighit sas idea de su progetu diaspora*. Si cheres contribuire, faghe·lu! In custu momentu semus unu grupu minore meda, nos diat agradare a tènnere cale si siat casta de agiudu!
+ Otenne su còdighe mitza
+ Tradui s\'aplicatzione!
+ S\'aplicatzione no est disponìbile in sa limba tua? Lu podes cambiare! Proite non nos agiudas traduinde·la? Nois impreamus sa prataforma crowdin pro permìtere a totus de traduire s\'aplicatzione.
+ Faghe·mi traduire
+ Lassa·nos s\'opinione tua!
+ dandelion* est galu in isvilupu. Si tenes impòsitos o cale si siat casta de cosa da sinnalare, pro praghere, faghe·la·nos ischire impreende s\'aina de sinnalatziones de errores nostra!
+ Sinnala errores
+ Cumpartzi sa paràula!
+ Faghe connòschere diaspora* e #dandelion a sos amigos e a sa familia tua! Proite no iscries carchi cosa a pitzu de sas esperièntzias tuas? Noas diat agradare meda a ischire ite nde pensas!
+ Cumpartzi s\'aplicatzione
+ Ei! Dae un\'ograda a #dandelion! %1$s
+
+ Manutentores
+ Custa aplicatzione est beninde isvilupada e manutentada dae <br><br>%1$s
+ Contribuidores
+ %1$s<br><br>Gràtzias!
+ Litzèntzia GNU GPLv3+
+ Librerias de terzas partes
+ Sunt impreadas custas librerias:
+ Amus pigadu ispiratzione e parte de su còdighe dae LeafPic. Abbistade·bos·lu, est fintzas cussu unu programma lìberu!
+ Àteras informatziones
+ Abìlita pro abèrrere sos ligàmenes de Youtube in un\'aplicatzione esterna
+ Ligàmenes de Youtube
+ Muda su tema de su contu tuo
+ Tira cara a bassu pro annoare
+ 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.
+
diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml
new file mode 100644
index 00000000..45159998
--- /dev/null
+++ b/app/src/main/res/values-si/strings.xml
@@ -0,0 +1,81 @@
+
+
+
+ නැවත පූරණය
+ වසන්න
+ අවලංගු
+
+ සැකසුම්
+ දැනුම්දීම්
+ සංවාද
+ පැතිකඩ
+ ක්රියාකාරකම්
+ අදහස් දැක්විණි
+ සැඳහුම්
+ ප්රසිද්ධ
+ සොයන්න
+ සබඳතා
+ සංඛ්යාලේඛන
+
+ සියළුම දැනුම්දීම්
+ එවගේම අදහස් දැක්විණි
+
+ ඔබට පිටවීමට ඇවැසිද?
+
+ තව
+ පිළිබඳව | උපකාර
+ ප්රසිද්ධ ක්රියාකාරකම්
+ වාර්තා
+ වියමන පිටුවෙහි තිරසේයාවක් බෙදාගන්න
+ වියමන පිටුවෙහි තිර සේයාවක් අරගන්න
+ ලෙස තිරසේයාව සුරකින්න:
+ සබැඳියේ ලිපිනය පිටපත් විය…
+ යෙදුමෙන් පිටවන්න
+ බෙදාගන්න…
+ නමක් එකතු කරන්න
+ සබැඳියේ ලිපිනය බෙදාගන්න
+ බාහිර අතිරික්සුවකින් විවෘත කරන්න…
+ සබැඳිය පසුරුපුවරුවට පිටපත් කරන්න
+
+
+ කෙටුම්පත
+ සිරැසිය පෙන්වන්න
+
+
+ ජාලය
+
+
+ පරිශීලක
+ පරිපාලක
+
+ තේමාව සහ වර්ණ
+
+ භාෂාව
+ පද්ධතියේ භාෂාව
+
+ මුද්රණඅකුරේ ප්රමාණය
+ සාමාන්ය
+
+
+ පෙරනිමි
+
+ පෙරකලාසිය
+ පෙරකලාසිය සබල කරන්න
+
+
+ ගිණුම වෙනස් කරන්න
+
+ පිලිබඳව
+ බලපත්රය
+ යෙදුම
+ උපාංගය
+ ඇන්ඩ්රොයිඩ් අනුවාදය: %1$s
+ උපාංගයේ නම: %1$s
+ කේතනාමය: %1$s
+ මූලාශ්රය ගන්න
+ යෙදුම පරිවර්තනය කරන්න!
+ යෙදුම බෙදාගන්න
+
+ ජීඑන්යූ ජීපීඑල්v3+ බලපත්රය
+ යූටියුබ් සබැඳිය
+
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
new file mode 100644
index 00000000..43d88f4b
--- /dev/null
+++ b/app/src/main/res/values-sk/strings.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml
new file mode 100644
index 00000000..43d88f4b
--- /dev/null
+++ b/app/src/main/res/values-sq/strings.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-sr-rRS/strings.xml b/app/src/main/res/values-sr-rRS/strings.xml
new file mode 100644
index 00000000..422fd22e
--- /dev/null
+++ b/app/src/main/res/values-sr-rRS/strings.xml
@@ -0,0 +1,38 @@
+
+
+
+ Otvori navigacioni panel
+ Yatvori navigacioni panel
+
+ Podesavanja
+ Lista promena
+
+
+
+
+
+ Sakrij status
+ Prikaži naziv
+
+
+ Izgled
+
+
+
+
+ Promijeni jezik ove aplikacije. Restartuj apikaciju da bi podešavanja dobila efekat.
+ Jezik
+
+
+
+
+
+
+
+ Ostalo
+ O ovom
+
+ Pomo\'nici
+ Prikazi GNU GPLv3 licence
+ Prikaz licence trecih lica
+
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
new file mode 100644
index 00000000..543f0196
--- /dev/null
+++ b/app/src/main/res/values-sr/strings.xml
@@ -0,0 +1,40 @@
+
+
+
+
+ Поставке
+ тражи
+ Дневник измена
+
+
+
+ још
+ Подели…
+
+
+ Sakrij status
+
+
+ Izgled
+ Мрежа
+
+
+
+
+ Промените језик апликације. Поново покрените након тога
+ Језик
+
+
+
+
+
+
+ Обриши кеш
+
+ разно
+ О програму
+ Лиценца
+
+ Програмери
+ Сарадници
+
diff --git a/app/src/main/res/values-sv/strings-about.xml b/app/src/main/res/values-sv/strings-about.xml
deleted file mode 100644
index 54191dc5..00000000
--- a/app/src/main/res/values-sv/strings-about.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-sv/strings-preferences.xml b/app/src/main/res/values-sv/strings-preferences.xml
deleted file mode 100644
index 3885ddb3..00000000
--- a/app/src/main/res/values-sv/strings-preferences.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 193ab72a..7c42e701 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -1,11 +1,213 @@
-
-
-
-
-
-
-
-
+
+ Öppna navigeringslådan
+ Stäng navigeringslådan
+ Ladda om
+ Avsluta
+ Avbryt
+
+ Inställningar
+ Notiser
+ Konversationer
+ Ström
+ Profil
+ Aspekter
+ Aktiviteter
+ Gillade
+ Kommenterade
+ Omnämnanden
+ Offentlig
+ Söc
+ Kontakter
+ Ändringar
+ Statistik
+
+ Alla Notiser
+ Kommenterade Även
+ Kommentar till tillägg
+ Gillade
+ Omnämnd
+ Vidaredelad
+ Började Dela
+
+ Fel: Kunde inte hämta podlista!
+ Ursäkta, du måste ansluta till Internet för att fortsätta
+ Bekräftelse
+ Vill du avsluta?
+
+ Mer
+ Om | Hjälp
+ Följda Taggar
+ Offentliga aktiviteter
+ Rapporter
+ Dela länk som text
+ Dela skämdump av en webbsida
+ Ta skärmdump av en webbsida
+ Sparar bild som
+ Sparar skärmdump som:
+ Länkadressen kopierades ...
+ Nytt inlägg
+ Till toppen
+ Sök på taggar eller personer
+ Avsluta appen
+ Växla mellan telefon- och skrivbordsvy
+ Dela…
+ efter taggar
+ efter människor
+ Var god ange namn
+ Dela länkadress
+ Spara bild
+ Dela bild
+ Öppna i en extern webbläsare...
+ Kopiera länkadress
+ Kopiera bildadressen
+
+ Kunde inte ladda bilden
+
+ Du måste bevilja lagringsbehörighet för att spara skärmdumpar. När du gjort det, bör du
+ stänga ned appen eller starta om din enhet. Om du inte vill bevilja lagringsbehörighet men ändå vill använda
+ skärmdumpsfunktionen senare, kan du bevilja behörighet senare. Öppna då systeminställningarna, appar,
+ dandelion*. Bland behörigheterna väljer du att bevilja den att skriva data.
+ Du måste bevilja lagringsbehörighet för att spara och ladda upp bilder. När du gjort det, bör du
+ stänga ned appen eller starta om din enhet. Om du inte vill bevilja lagringsbehörighet men ändå vill spara bilder
+ senare, kan du bevilja behörighet senare. Öppna då systeminställningarna, appar,
+ dandelion*. Bland behörigheterna väljer du att bevilja den att skriva data.
+ Åtkomst nekad.
+ Åtkomst beviljad. Var god försök igen.
+ Anpassad pod
+ Podnamn
+ Protokoll
+ Podadress
+ Värde saknas
+ Vill du hoppa senast besökta sida i strömmen?
+ Dölj statusfältet vid huvudvyn
+ Dölj statusfältet
+ Göm titeln i huvudvyn
+ Visa titel
+ Programstartargenväg
+
+ Den övre verktygspanelen laddar stöm
+ Tryck på en tom yta i övre verktygsfältet för att öppna strömmen
+
+ Utseende
+ Nätverk
+ Pod-inställningar
+ Funktionsdugligheten
+
+
+ Navigeringsreglage
+ Kontrollera synligheten för inlägg i den utdragbara panelen
+ Användare
+ Generella
+ Administratör
+
+ Tema och färger
+ Styr vilka färger som ska används i programmet
+ Primär färg
+ Färgen på verktygspanelerna
+ Accentfärg
+ Färg på förloppsindikatorn
+ AMOLED-läge
+ Överskrid färger med svart i flera delar av appen, anpassad AMOLED-skärmar. Du behöver starta om för att verkställa. För att använda Diaspora* i mörkt läge behöver du också aktivera Dark theme, som du hittar bland dina personliga Diaspora*-kontoinställningar.
+
+ Utökade notifikationer
+ Utöka notifikationsklockan med en rullgardinsmeny som visar kategorier för notifieringar
+ Byt språk för appen. Starta om för att fastställa ändringar
+ Språk
+ Systemspråk
+
+ Justera textstorleken för WebView
+ Teckenstorlek
+ Normal
+ Stor
+ Enorm
+
+ Läs in bilder
+ Växla bildinläsning för t.ex. låg mobildata
+
+ Skärmrotation
+ Styr automatisk skärmrotering
+ Förvald
+ Sensor\n(överskrid systeminställningar)
+ Porträtt
+ Landskap
+
+ Ladda Tor-nställningar
+ Ladda proxyinställningar för Tor (Orbot) HTTP Proxy
+ Proxy
+ Aktivera proxy
+ Använd proxy med dandelion* för att kringgå brandväggar.\nKan kräva omstart. Detta fungerar inte på vissa telefoner.
+ Värd
+ Port
+ Appen måste startas om för att inaktivera proxyanvändning
+ Orbot-proxyinställningar laddade
+
+ Öppna externa länkar med Chrome Custom Tabs. Chromium eller Google Chrome måste installeras för att använda den här funktionen. \nOBSERVERA: Chrome Custom Tabs använder inte den konfigurerade proxyservern!
+
+ Personliga inställningar
+ Öppna dina kontoinställningar i diaspora*
+ Hantera din kontaktlista
+ Hantera fyrkantstaggar
+ Sluta följa taggar du redan följer
+ Ändra Konto
+ Radera lokal sessionsdata och växla till en annan diaspora*-pod eller -konto
+ Detta kommer att radera alla kakor och all sessionsdata. Vill du verkligen byta konto?
+ Rensa cache
+ Rensa WebView-cache
+ Dölj automatiskt de övre och undre verktygsfälten när du skrollar
+ Intellihide-verktygsfält
+ Lägg till delade-av-meddelande
+ Lägg till en hänvisning till denna app när du skriver: [via #dandelion]
+
+ Diverse
+ Total återställning
+ Rensa alla lokala inställningar som har med appen att göra och logga ut alla konton
+ Detta kommer att återställa alla ändrade inställningarna på appen till deras standardvärden och loggar ut dig från alla poddar. Dina nedladdade bilder förblir orörda. Är du säker på att du vill fortsätta?
+ Använd lätt reklamblockering. Reklam finns bland annat i inbyggda vyer
+ Blockera reklam
+ Om
+ Licens
+ Avlusning
+ Program
+ Enhet
+ diaspora*-pod
+ Avlusningslogg
+ Avlusningslogg (detaljerad)
+ Programversion: %1$s
+ Androidversion: %1$s
+ Enhetens namn: %1$s
+ Kodnamn: %1$s
+ Podprofilens namn: %1$s
+ Poddomän: %1$s
+ Texten kopierad till urklippen
+ dandelion* är en kompletterande app till att använda det sociala nätverket diaspora*. Den lägger till funktioner såsom användbara verktyg and stöd för proxyservrar såsom Tor.
+ Bidrag med kod!
+ dandelion* är utvecklat för att vara fritt som i frihet och lyder under samma filosofi som diaspora*-projektet. Om du vill bidra, är det fritt fram! I dagsläget är vi få, så uppskattar öppenhjärtigt all hjälp!
+ Hämta källkoden
+ Översätt appen!
+ Är appen inte tillgänglig på ditt mål? Det kan du ändra på! Hjälp oss översätta! Vi använder oss av plattformen Crowdin så att alla kan hjälpa till att översätta appen.
+ Jag vill översätta
+ Lämna respons!
+ dandelion* utvecklas fortfarande, så har du några förslag eller annan återkoppling, använd vårt buggrapporteringssystem!
+ Rapportera buggar
+ Berätta om oss!
+ Berätta för dina närmaste om diaspora* och #dandelion! Blogga om dina erfarenheter! Vi vill gärna veta vad du tycker!
+ Dela appen
+ Hallå! Kolla in #dandelion! %1$s
+
+ Utvecklare
+ Denna app utvecklas för närvarande och underhålls av < br >< br >%1$s
+ Bidragsgivare
+ %1$s < br >< br > Tack så hjärtligt!
+ GNU GPLv3+
+ Tredjepartsbibliotek
+ Följande bibliotek används:
+ Vi hämtade inspiration och kod från LeafPic. Kika på det, det är också fri programvara!
+ Berätta mer
+ Aktivera för att öppna Youtube-länkar i en extern app
+ Youtube-länkar
+ Ändra temat för ditt konto
+ Dra för att uppdatera
+ 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.
diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml
new file mode 100644
index 00000000..43d88f4b
--- /dev/null
+++ b/app/src/main/res/values-ta/strings.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml
new file mode 100644
index 00000000..43d88f4b
--- /dev/null
+++ b/app/src/main/res/values-te/strings.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml
new file mode 100644
index 00000000..43d88f4b
--- /dev/null
+++ b/app/src/main/res/values-th/strings.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-tr/strings-about.xml b/app/src/main/res/values-tr/strings-about.xml
deleted file mode 100644
index 54191dc5..00000000
--- a/app/src/main/res/values-tr/strings-about.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-tr/strings-preferences.xml b/app/src/main/res/values-tr/strings-preferences.xml
deleted file mode 100644
index 3885ddb3..00000000
--- a/app/src/main/res/values-tr/strings-preferences.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 193ab72a..6c40a2c3 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -1,11 +1,210 @@
-
-
-
-
-
-
-
-
+
+ Gezinme çekmecesini aç
+ Gezinme çekmecesini kapat
+ Yeniden Yükle
+ Kapat
+ İptal
+
+ Ayarlar
+ Bildirimler
+ Konuşmalar
+ Yayın
+ Profil
+ Görünüm
+ Aktiviteler
+ Beğeniler
+ Yorumlananlar
+ Bahsetmeler
+ Herkes
+ Ara
+ Kişiler
+ Değişme Günlüğü
+ İstatistikler
+
+ Tüm Bildimler
+ Ayrıca Yorumlar
+ Gönderine Yorumlar
+ Beğeniler
+ Bahsedilen
+ Yeniden paylaşılan
+ Paylaşım Başlatıldı
+
+ Hata: Pod listesi alınamadı!
+ Üzgünüm, devam etmek için internete bağlı olmalısın.
+ Onayla
+ Çıkmak mı istiyorsun ?
+
+ Daha
+ Hakkında | Yardım
+ Takip Edilen Etiketler
+ Genel etkinlikler
+ Raporlar
+ Bağlantıyı metin olarak paylaş
+ Web sayfasının ekran görüntüsünü paylaş
+ Web sayfasının ekran görüntüsünü al
+ Görüntüyü şuna kaydet
+ Ekran görüntüsü olarak kaydediliyor:
+ Bağlantı adresi kopyalandı…
+ Yeni gönderi
+ Başa dön
+ Etiketlere veya kişilere göre arayın
+ Uygulamadan çık
+ Mobil/masaüstü görünümünü değiştir
+ Paylaş...
+ Etiket
+ Insan
+ Lütfen bir isim ekleyin
+ Bağlantı adresini paylaş
+ Görseli kaydet
+ Görsel paylaş
+ Harici tarayıcıda aç…
+ Bağlantı adresini panoya kopyala
+ Görsel adresini panoya kopyala
+
+ Görsel yüklenemedi
+
+ Görüntüleri kaydetmek/yüklemek için \"Depolama Erişim İzni\" vermeniz gerekir. Sonrasında uygulamayı tamamen kapatmalı veya cihazı yeniden başlatmalısınız. Depoylama erişimine izin vermeyebilirsiniz, ancak daha sonra görüntüleri kaydetmek isterseniz, daha sonra izin verebilirsiniz. İzin vermek için: Sistem Ayarları - Uygulamalar - dandelion* İzinler bölümü \"Depolama Erişim İzni\" verebilirsiniz.
+ Görüntüleri kaydetmek/yüklemek için \"Depolama Erişim İzni\" vermeniz gerekir. Sonrasında uygulamayı tamamen kapatmalı veya cihazı yeniden başlatmalısınız. Depoylama erişimine izin vermeyebilirsiniz, ancak daha sonra görüntüleri kaydetmek isterseniz, daha sonra izin verebilirsiniz. İzin vermek için: Sistem Ayarları - Uygulamalar - dandelion* İzinler bölümü \"Depolama Erişim İzni\" verebilirsiniz.
+ İzin reddedildi.
+ İzin verildi. Lütfen tekrar deneyin.
+ Özel Pod
+ Pod adı
+ Protokol
+ Pod adresi
+ Eksik değer
+ Akışta son ziyaret edilen sayfaya git?
+ Durum çubuğunu ana görünümde gizle
+ Durum çubuğunu gizle
+ Başlığı ana görünümde göster
+ Başlığı göster
+ Başlatıcı kısayolu
+
+ Üst araç çubuğu akışı yükler
+ Üst araç çubuğunda boş bir yere tıklayarak akışı başlatabilirsiniz
+
+ Görünüş
+ Ağ
+ Pod Ayarları
+ Çalışabilirlik
+
+
+ Menü Kaydırıcı
+ Gezinme çekmecesindeki girişlerin görünürlüğünü kontrol et
+ Kullanıcı
+ Genel
+ Yönetici
+
+ Tema ve Renkler
+ Uygulamada hangi renklerin kullanılacağını kontrol edin
+ Birincil Renk
+ Araç çubuğu rengi
+ Vurgu rengi
+ İlerleme çubuğunun rengi
+ AMOLED Modu
+ Uygulamanın birçok yerinde AMOLED ekrana uyumlu siyah renkleri geçersiz kılın. Bu ayarı değiştirmek için yeniden başlatmanız gerekiyor. Diaspora * \'ya göz atmak için, kişisel diyaspora * hesap ayarlarınızda bulunan Dark temasını da aktive etmeniz gerekir.
+
+ Genişletilmiş Bildirimler
+ Bildirim zilini, bildirim kategorilerini gösteren bir açılır menü ile genişlet
+ Bu uygulamanın dilini değiştir. Değişikliklerin etkili olması için uygulamayı yeniden başlatın
+ Dil
+ Sistem dili
+
+ Web Görünümünün yazı boyutunu ayarların
+ Yazı Boyutu
+ Normal
+ Büyük
+ Çok Büyük
+
+ Resimleri yükle
+ Örneğin veri tasarrufu için resimlerin yüklenmesini ayarlayın
+
+ Ekran döndürme
+ Otomatik ekran döndürmeyi ayarlayın
+ Varsayılan
+ Sensör\n
+ (sistem ayarlarını yok say)
+ Dikey
+ Yatay
+
+ Tor hazır ayarını yükle
+ Tor (Orbot) HTTP Proxy için proxy ayarlarını yükle
+ Proxy
+ Proxy etkinleştir
+ Proxy dandelion*\'s traffic to circumvent firewalls.\n
+ May require restart. This might not work on some phones.
+ Sunucu
+ Port
+ Proxy kullanımını devre dışı bırakmak için uygulamanın yeniden başlatılması gerekiyor
+ Orbot proxy hazır ayarı yüklendi
+
+ Chrome Özel Sekmeler ile harici bağlantılar açın. Bu özelliği kullanabilmek için Chromium, Firefox veya Google Chrome\'un yüklü olması gerekir.\n
+ ÖNEMLİ NOT: Chrome Özel Sekmeler, yapılandırılmış proxy sunucuları kullanmaz!
+
+ Kişisel ayarlar
+ diaspora* hesap ayarlarını aç
+ Kişi listenizi yönetin
+ Etiketleri yönetin
+ Mevcut takip edilen etiketleri takipten vazgeç
+ Hesabı Değiştir
+ Yerel oturum verilerini silin ve başka bir diaspora * pod(a)/hesab(a) geçin
+ Bu, tüm çerezleri ve oturum verilerini siler. Gerçekten hesabını değiştirmek istiyor musun?
+ Önbelleği temizle
+ WebView önbelleğini temizle
+ Kaydırma yaparken üst ve alt araç çubuklarını otomatik olarak gizle
+ Araç Çubuklarını Otomatik Gizle
+ shared-by-notice ekle
+ Bu uygulamaya, paylaşılan metinlere bir referans ekleyin: [örn #dandelion]
+
+ Çeşitli
+ Tamamen Sıfırlama
+ Uygulama ile ilgili tüm ayarları yerel olarak sil ve tüm hesaplardan çıkış yap
+ Bu, uygulamanın tüm değiştirilen ayarlarını varsayılan değerlerine sıfırlar ve tüm podlardan çıkar. İndirdiğiniz görüntülere donulmaz. Devam etmek istediğine emin misin?
+ Temel reklam engelleyiciyi etkinleştirin. Reklamlar yerleşik görünümlere dahil edilebilir
+ Reklamları engelle
+ Hakkında
+ Lisans
+ Hata Ayıklama
+ Uygulama
+ Cihaz
+ diaspora* Pod
+ Hata Ayıklama Günlükleri
+ Hata Ayıklama Günlüğü (Detaylı)
+ Uygulama Sürümü: %1$s
+ Android Sürümü: %1$s
+ Cihaz Adı: %1$s
+ Kod adı: %1$s
+ Pod Profil Adı: %1$s
+ Pod Adresi: %1$s
+ Hata ayıklama günlüğü panoya kopyalandı
+ dandelion* is your companion app for browsing the social network diaspora*. Yararlı araç çubukları ve Tor Ağı gibi proxy sunucularıyla sosyal deneyimlerinize destek sağlar.
+ Koda katkıda bulun!
+ dandelion* özgürlük için özgürce geliştirilir ve diaspora* projesinin fikirlerini takip eder. Katkıda bulunmak istiyorsanız, devam edin! Şu anda çok küçük bir takımız, bu yüzden her türlü yardımı çok takdir ediyoruz!
+ Kaynağı al
+ Uygulamayı tercüme et!
+ Uygulamayı kendi dilinde kullanamıyor musun? Bunu değiştirebilirsin. Neden çeviride bize yardımcı olmuyorsun? Herkesin çeviriye katkıda bulunabilmesi için Crowdin platformunu kullanıyoruz.
+ Hadi çevirelim
+ Geri bildirimde bulun!
+ dandelion* hala geliştirme aşamasındadır, bu yüzden önerileriniz veya herhangi bir geri bildiriminiz varsa, lütfen bize haber vermek için hata izleyicimizi kullanın!
+ Hataları Bildir
+ Herkese duyur!
+ Arkadaşlarınıza ve ailenize diaspora* ve #dandelion hakkında bilgi verin! Neden deneyimleriniz hakkında blog yazmıyorsunuz? Sizden duymak isteriz!
+ Uygulamayı paylaş
+ Hey %1$s ! #dandelion’a bir göz at!
+
+ Yardımcılar
+ Bu uygulamayı şu anda geliştiren ve devam ettiren <br><br>%1$s
+ Katkıda bulunanlar
+ %1$s<br><br>Teşekkürler!
+ GNU GPLv3+ License
+ Üçüncü Parti Kütüphaneler
+ Şu kütüphaneler kullanıldı:
+ LeafPic\'ten biraz ilham ve kod aldık. Göz atabilirsiniz, özgür bir yazılım!
+ Daha fazla göster
+ YouTube linklerini harici uygulamada açmak için etkinleştir
+ YouTube linkleri
+ Hesabınızın temasını değiştirin
+ Yenilemek için çek
+ Yenilemek için sayfanın üst kısmından çekin\nDeğişikliklerin geçerli olması için uygulamayı yeniden başlat.
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
new file mode 100644
index 00000000..19fb0794
--- /dev/null
+++ b/app/src/main/res/values-uk/strings.xml
@@ -0,0 +1,213 @@
+
+
+
+ Відкрити панель навігації
+ Закрити панель навігації
+ Перезавантажити
+ Закрити
+ Скасувати
+
+ Налаштування
+ Сповіщення
+ Розмови
+ Потік
+ Профіль
+ Аспекти
+ Діяльність
+ Вподобане
+ Коментоване
+ Згадки
+ Публічне
+ Пошук
+ Контакти
+ Журнал змін
+ Статистика
+
+ Усі сповіщення
+ Також прокоментували
+ Коментар до допису
+ Вподобано
+ Згадано
+ Поширено
+ Додано
+
+ Помилка: Не вдалося отримати список подів
+ На жаль, для продовження потрібне з\'єднання з інтернетом
+ Підтвердження
+ Ви дійсно бажаєте вийти?
+
+ Ще
+ Про | Допомога
+ Відстежувані мітки
+ Публічна діяльність
+ Звіти
+ Поширити посилання як текст
+ Поширити знімок екрану веб-сторінки
+ Зробити знімок екрану веб-сторінки
+ Збереження зображення в
+ Збереження знімка екрану як:
+ Адресу посилання скопійовано…
+ Новий допис
+ Перейти нагору
+ Шукати мітки чи людей
+ Вийти
+ Перемкнути мобільний/стаціонарний вигляд
+ Поширити…
+ за мітками
+ за людьми
+ Будь ласка, додайте ім\'я
+ Поширити посилання
+ Зберегти зображення
+ Поділитися зображенням
+ Відкрити у зовнішньому браузері…
+ Копіювати адресу посилання у буфер обміну
+ Копіювати зображення у буфер обміну
+
+ Не вдалося завантажити зображення
+
+ Ви маєте надати право доступу до внутрішньої пам\'яті, щоб зберігати знімки екрану. Після цього треба
+ повністю закрити застосунок або перезапустити пристрій. Якщо ви не дозволяєте доступ до пам\'яті, але хочете використовувати
+ функцію знімків екрана пізніше, ви можете надати доступ пізніше. Будь ласка, відкрийте тоді Налаштування — Програми —
+ dandelion*. У розділі дозволів ви можете надати право «доступу до запису у пам\'ять».
+ Ви маєте надати право доступу до внутрішньої пам\'яті, щоб зберігати/вивантажувати зображення. Після цього треба
+ повністю закрити застосунок або перезапустити пристрій. Якщо ви не дозволяєте доступ до пам\'яті, але хочете зберігати зображення
+ пізніше, ви можете надати доступ пізніше. Будь ласка, відкрийте тоді Налаштування — Програми —
+ dandelion*. У розділі дозволів ви можете надати право «доступу до запису у пам\'ять».
+ Доступ заборонено.
+ Доступ надано. Будь ласка, спробуйте ще раз.
+ Власний под
+ Назва поду
+ Протокол
+ Адреса поду
+ Відсутнє значення
+ Перейти на останню відвідану сторінку в потоці?
+ Приховати рядок статусу
+ Сховати рядок статусу
+ Показати заголовки у головному вікні
+ Показувати заголовок
+ Створити ярлик
+
+ Верхня панель завантажує потік
+ Натисніть на вільному місці верхньої панелі, щоб відкрити потік
+
+ Вигляд
+ Мережа
+ Налаштування поду
+ Працездатність
+
+
+ Повзунок навігації
+ Налаштування видимості дописів у меню навігації
+ Користувач
+ Загальне
+ Адмін
+
+ Теми і кольори
+ Налаштування кольорів, які використовуються у програмці
+ Основний колір
+ Колір панелей
+ Контрастний колір
+ Колір панелі прогресу
+ Режим AMOLED
+ Замінити кольори у багатьох частинах програмки на чорний, сприядливий для AMOLED-дисплеїв. Вам треба здійснити перезавантаження, щоб це налаштування запрацювало. Щоб перекладати Діаспору* в темних тонах, Вам також треба активувати темну тему у своїх налаштуваннях обліковки Діаспори*.
+
+ Розширені сповіщення
+ Додати до дзвоника сповіщень випадне меню з категоріями сповіщень
+ Змінити мову додатку. Перезапустіть додаток для застосування змін.
+ Мова
+ Мова системи
+
+ Налаштування розміру тексту WebView
+ Розмір шрифту
+ Звичайний
+ Великий
+ Величезний
+
+ Завантаження зображень
+ Вимкнути завантаження зображень, напр. для зменшення трафіку
+
+ Поворот екрану
+ Налаштування автоматичного повертання екрану
+ За замовчуванням
+ Сенсор\n(ігнорувати системні налаштування)
+ Портрет
+ Пейзаж
+
+ Завантажити шаблон налаштувань Tor
+ Завантажити налаштування проксі для Tor (Orbot)
+ Проксі
+ Увімкнути проксі
+ Пускати трафік dandelion* через проксі для обходу фаєрволів.\nМоже потребувати перезапуску. На деяких телефонах може не працювати.
+ Хост
+ Порт
+ Потрібен перезапуск програмки, щоб вимкнути використання проксі
+ Завантажено шаблон налаштувань Orbot
+
+ Відкривати зовнішні посилання у Chrome Custom Tabs. Для використання цієї функції має бути встановлений Chromium або Google Chrome.\nВАЖЛИВО: Chrome Custom Tabs не використовують налаштовані проксі-сервери!
+
+ Персональні налаштування
+ Відкрити налаштування обліковки Діаспори*
+ Налаштувати список контактів
+ Керувати мітками
+ Відписатися від поточних міток
+ Змінити обліковий запис
+ Стерти локальні дані сесії і перемкнутися на інший под/обліковий запис Діаспори*
+ Це видалить усі куки та дані сесії. Ви справді хочете змінити обліковку?
+ Очистити кеш
+ Очистити кеш WebView
+ Автоматично приховувати верхню і нижню панелі при прокручуванні
+ Інтелектуальне приховування панелей
+ Додати примітку via
+ Додати до поширюваних текстів примітку: [via #dandelion]
+
+ Різне
+ Повне скидання
+ Стерти усі локальні налаштування програмки і вийти з усіх обліковок
+ Це зітре усі змінені налаштування застосунку до їхніх значень за замовчуванням і вилогінить вас з усіх подів. Ваші завантажені зображення залишаться на міці. Бажаєте продовжити?
+ Увімкнути базовий AdBlocker. Реклама може зберегтися, напр., у вбудованих переглядах
+ Блокувати рекламу
+ Про Markor
+ Ліцензія
+ Налагодження
+ Програма
+ Пристрій
+ Под Діаспора*
+ Журнал налагодження
+ Журнал налагодження (детальний)
+ Версія програми: %1$s
+ Версія Android: %1$s
+ Назва пристрою: %1$s
+ Кодова назва: %1$s
+ Назва профілю поду: %1$s
+ Домен поду: %1$s
+ Журнал налагодження скопійовано в буфер обміну
+ dandelion* — це ваша програмка для перегляду соціальної мережі Діаспора*. Для зручності, застосунок додає такі функції, як використання панелей інструментів і підримку проксі-серверів на зразок мережі Tor.
+ Зробіть внесок у код!
+ dandelion* розробляється як вільне програмне забезпечення і слідує ідеям проекту Діаспора*. Якщо ви хочете зробити внесок, приєднуйтеся! Зараз ми дуже маленька команда, тож будемо раді будь-якій допомозі!
+ Отримати вихідний код
+ Перекласти цю програмку
+ Цей застосунок недоступний вашою мовою? Ви можете це змінити! Чому б не допомогти нам, переклавши його? Ми використовуємо платформу crowdin, де будь-хто може перекласти програмку.
+ Хочу перекладати
+ Залишіть відгук!
+ dandelion* все ще перебуває у розробці, тому якщо у вас є побажання або відгуки, будь ласка, скористайтеся нашим баг-трекером, щоб ми знали!
+ Повідомити про помилку
+ Поділіться з друзями!
+ Розкажіть про Діаспору і #dandelion друзям і родині! Чому б не написати у блог про свій досвід? Будемо раді почути вашу думку!
+ Поділитися застосунком
+ Привіт! Спробуй #dandelion! %1$s
+
+ Розробники
+ Зараз цю програмку розробляють і підтримують <br><br>%1$s
+ Автори
+ %1$s<br><br>Дякуємо!
+ Ліцензія GNU GPLv3+
+ Сторонні бібліотеки
+ Використовуються такі бібліотеки:
+ Ми взяли трохи натхнення і коду з LeafPic. Це також вільне програмне забезпечення, тож користуйтеся!
+ Хочу знати більше
+ Увімкнути для відкриття посилань Youtube у зовнішньому застосунку
+ Youtube посилання
+ Змінити тему вашого облікового запису
+ Потягніть, щоб оновити
+ Потягніть сторінку згори вниз, щоб оновити.\nВам потрібно перезавантажити застосунок, щоб зміни набрали сили.
+
diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml
new file mode 100644
index 00000000..43d88f4b
--- /dev/null
+++ b/app/src/main/res/values-ur/strings.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml
index e18d571e..5b55f978 100644
--- a/app/src/main/res/values-v21/styles.xml
+++ b/app/src/main/res/values-v21/styles.xml
@@ -1,6 +1,6 @@
>
-
-
@@ -23,8 +23,19 @@
@color/primary_text@color/white
-
- @color/white
+
+
+
+
+
+
diff --git a/app/src/main/res/xml-v25/shortcuts.xml b/app/src/main/res/xml-v25/shortcuts.xml
new file mode 100755
index 00000000..a667dcf1
--- /dev/null
+++ b/app/src/main/res/xml-v25/shortcuts.xml
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/file_provider_paths.xml b/app/src/main/res/xml/file_provider_paths.xml
new file mode 100644
index 00000000..c8826f4c
--- /dev/null
+++ b/app/src/main/res/xml/file_provider_paths.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
deleted file mode 100644
index 6c6308a3..00000000
--- a/app/src/main/res/xml/preferences.xml
+++ /dev/null
@@ -1,167 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/xml/preferences__master.xml b/app/src/main/res/xml/preferences__master.xml
new file mode 100644
index 00000000..c6afd55f
--- /dev/null
+++ b/app/src/main/res/xml/preferences__master.xml
@@ -0,0 +1,188 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/preferences__sub_debugging.xml b/app/src/main/res/xml/preferences__sub_debugging.xml
new file mode 100644
index 00000000..3715729a
--- /dev/null
+++ b/app/src/main/res/xml/preferences__sub_debugging.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/preferences__sub_navslider_vis.xml b/app/src/main/res/xml/preferences__sub_navslider_vis.xml
new file mode 100644
index 00000000..037102aa
--- /dev/null
+++ b/app/src/main/res/xml/preferences__sub_navslider_vis.xml
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/preferences__sub_proxy.xml b/app/src/main/res/xml/preferences__sub_proxy.xml
new file mode 100644
index 00000000..0e85fbe4
--- /dev/null
+++ b/app/src/main/res/xml/preferences__sub_proxy.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/preferences__sub_themes.xml b/app/src/main/res/xml/preferences__sub_themes.xml
new file mode 100644
index 00000000..aa4bde15
--- /dev/null
+++ b/app/src/main/res/xml/preferences__sub_themes.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 052b2e6a..75a6ed58 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,12 +1,44 @@
+/*#######################################################
+ *
+ * SPDX-FileCopyrightText: 2017-2023 Gregor Santner
+ * SPDX-License-Identifier: Unlicense OR CC0-1.0
+ *
+#########################################################*/
// Top-level build file where you can add configuration options common to all sub-projects/modules.
+import java.text.SimpleDateFormat
+
buildscript {
- repositories {
- jcenter()
+ ext {
+ version_gradle_tools = "3.6.3"
+ version_plugin_kotlin = "1.3.72"
+ enable_plugin_kotlin = false
+
+ version_compileSdk = 29
+ version_buildTools = "29.0.3"
+ version_minSdk = 17
+
+ // https://developer.android.com/topic/libraries/support-library/
+ version_library_appcompat = "28.0.0" //androidx
+ // https://github.com/JakeWharton/butterknife/releases
+ version_library_butterknife = "8.8.1" //9.0.0-rc2
+ // https://github.com/guardianproject/NetCipher/releases
+ version_library_netcipher = "2.0.0-alpha1"
}
+
+ repositories {
+ maven { url 'https://maven.google.com' }
+ jcenter()
+ maven { url "https://jitpack.io" }
+ mavenCentral()
+ }
+
dependencies {
- classpath 'com.android.tools.build:gradle:2.1.3'
- classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
+ classpath "com.android.tools.build:gradle:${version_gradle_tools}"
+ classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
+ if (project.enable_plugin_kotlin) {
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${version_plugin_kotlin}"
+ }
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
@@ -15,11 +47,70 @@ buildscript {
allprojects {
repositories {
+ maven { url 'https://maven.google.com' }
jcenter()
+ maven { url "https://jitpack.io" }
mavenCentral()
}
+
+ tasks.matching { task -> task.name.matches('.*generate.*Resources') }.all {
+ task -> task.dependsOn copyRepoFiles
+ }
+
+ tasks.matching {it instanceof Test}.all { // Enable unit test output, html+xml output
+ testLogging.events "passed", "skipped", "failed", "standardOut", "standardError"
+ testLogging.showStandardStreams = true
+ reports.junitXml.enabled = true
+ reports.html.enabled = true
+ }
}
task clean(type: Delete) {
delete rootProject.buildDir
}
+
+final String[] ROOT_TO_RAW_COPYFILES = ["README.md", "CHANGELOG.md", "CONTRIBUTORS.md", "LICENSE.txt", "LICENSE.md", "LICENSE"]
+task copyRepoFiles(type: Copy) {
+ from rootProject.files(ROOT_TO_RAW_COPYFILES)
+ into "app/src/main/res/raw"
+ rename { String fileName -> fileName.replace(fileName, fileName.toLowerCase()) }
+}
+
+
+@SuppressWarnings(["UnnecessaryQualifiedReference", "SpellCheckingInspection", "GroovyUnusedDeclaration"])
+// Returns used android languages as a buildConfig array: {'de', 'it', ..}"
+static String findUsedAndroidLocales() {
+ Set langs = new HashSet<>()
+ new File('.').eachFileRecurse(groovy.io.FileType.DIRECTORIES) {
+ final foldername = it.name
+ if (foldername.startsWith('values-') && !it.canonicalPath.contains("build" + File.separator + "intermediates") && !it.canonicalPath.contains("gradle" + File.separator + "daemon")) {
+ new File(it.toString()).eachFileRecurse(groovy.io.FileType.FILES) {
+ if (it.name.toLowerCase().endsWith(".xml") && it.getCanonicalFile().getText('UTF-8').contains("
+ try {
+ def stdout = new ByteArrayOutputStream()
+ exec {
+ commandLine 'git', 'rev-parse', 'HEAD'
+ standardOutput = stdout
+ }
+ return stdout.toString().trim()
+ } catch (Exception ignored) {
+ return 'unknown'
+ }
+}
+
+@SuppressWarnings(["UnnecessaryQualifiedReference", "SpellCheckingInspection", "GroovyUnusedDeclaration"])
+// Returns the build date in a RFC3339 compatible format. TZ is always converted to UTC
+static String getBuildDate() {
+ final SimpleDateFormat RFC3339_LIKE = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'")
+ RFC3339_LIKE.setTimeZone(TimeZone.getTimeZone("UTC"))
+ return RFC3339_LIKE.format(new Date())
+}
diff --git a/crowdin.yaml b/crowdin.yaml
deleted file mode 100644
index e0c205fa..00000000
--- a/crowdin.yaml
+++ /dev/null
@@ -1,25 +0,0 @@
-files:
- -
- source: '/app/src/main/res/values/strings*.xml'
- translation: '/app/src/main/res/values-%android_code%/%original_file_name%'
- languages_mapping:
- android_code:
- sv-SE: sv
- es-ES: es
- ml-IN: ml
- pt-PT: pt
- "no": 'no'
- de: de
- tr: tr
- ca: ca
- ru: ru
- pl: pl
- nl: nl
- ja: ja
- it: it
- hu: hu
- hi: hi
- fr: fr
- el: el
- cs: cs
- kn: kn
diff --git a/crowdin.yml b/crowdin.yml
new file mode 100644
index 00000000..c4ffe7a5
--- /dev/null
+++ b/crowdin.yml
@@ -0,0 +1,70 @@
+# vim: sw=2 ts=2 noexpandtab:
+commit_message: "[ci skip] Update translations (%language%)"
+append_commit_message: false
+files:
+ - source: /app/src/main/res/values/strings.xml
+ translation: /app/src/main/res/values-%android_code%/%original_file_name%
+ languages_mapping:
+ android_code:
+ az: az # Azerbaijani
+ ckb: ckb # Sorani (Kurdish)
+ kmr: kmr # Kurmanji (Kurdish)
+ gl: gl # Galician
+ sc: sc # Sardinian
+ kab: kab # Kabyle
+ hi: hi # Indian, Hindi
+ ml-IN: ml # Indian, Malayalam
+ fa: fa # Persian
+ nb: nb-rNO # Norwegian, Bokmal
+ sv-SE: sv # Swedish
+ es-ES: es # Espanol
+ de: de # German
+ ru: ru # Russian
+ pl: pl # Polish
+ ja: ja # Japanese
+ it: it # Italian
+ fr: fr # French
+ da: da # Danish
+ nl: nl # Dutch
+ hu: hu # Hungarian
+ cs: cs # Czech
+ ko: ko # Korean
+ zh-CN: zh-rCN # Chinese (Simplified on Android)
+ zh-TW: zh-rTW # Chinese (Traditional on Android)
+ el: el # Greek
+ "no": 'no' # Norwegian
+ tr: tr # Turkish
+ ca: ca # Catalan
+ pt-PT: pt # Portugese
+ pt-BR: pt-rBR # Portugese, Brazilian
+ fil: fil # Filipino
+ uk: uk # Ukrainian
+ ar: ar # Arabic
+ fi: fi # Finnish
+ af: af # Afrikaans
+ he: iw # Hebrew
+ ro: ro # Romanian
+ vi: vi # Vietnamese
+ bs: bs # Bosnian
+ sr: sr # Serbian, Cyrillic
+ sr-CS: sr-rRS # Serbian, Latin
+ bn: bn # Bengali
+ pa-IN: pa # Punjabi, India
+ jv: jw # Javanese
+ mr: mr # Marathi
+ te: te # Telugu
+ ur-PK: ur # Urdu, Pakistan
+ id: in # Indonesian
+ sk: sk # Slovak
+ kn: kn # Kannada (Asian)
+ ta: ta # Tamil (Asian)
+ sq: sq # Albanian
+ mk: mk # Macedonian
+ si-LK: si # Sinhala (Sri Lanka)
+ eo: eo # Esperanto
+ or: or # Odia/Oriya (India)
+ hr: hr # Croatia
+ bg: bg # Bulgarian
+ et: et # Estonian
+ th: th # Thai
+ translate_attributes: 0
diff --git a/gradle.properties b/gradle.properties
old mode 100644
new mode 100755
index 1d3591c8..44129c91
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,18 +1,28 @@
-# Project-wide Gradle settings.
-
-# IDE (e.g. Android Studio) users:
-# Gradle settings configured through the IDE *will override*
-# any settings specified in this file.
-
-# For more details on how to configure your build environment visit
-# http://www.gradle.org/docs/current/userguide/build_environment.html
-
-# Specifies the JVM arguments used for the daemon process.
-# The setting is particularly useful for tweaking memory settings.
-# Default value: -Xmx10248m -XX:MaxPermSize=256m
-# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
-
-# When configured, Gradle will run in incubating parallel mode.
-# This option should only be used with decoupled projects. More details, visit
-# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
-# org.gradle.parallel=true
\ No newline at end of file
+# Project-wide Gradle settings.
+
+# IDE (e.g. Android Studio) users:
+# Settings specified in this file will override any Gradle settings
+# configured through the IDE.
+
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+
+# The Gradle daemon aims to improve the startup and execution time of Gradle.
+# When set to true the Gradle daemon is to run the build.
+# TODO: disable daemon on CI, since builds should be clean and reliable on servers
+org.gradle.daemon=true
+
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+# Default value: -Xmx10248m -XX:MaxPermSize=256m
+org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
+
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+org.gradle.parallel=true
+
+# Enables new incubating mode that makes Gradle selective when configuring projects.
+# Only relevant projects are configured which results in faster builds for large multi-projects.
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:configuration_on_demand
+org.gradle.configureondemand=true
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index b0e288cf..505b369a 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Tue Aug 16 21:43:55 CEST 2016
+#Fri Jul 26 02:59:10 CEST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip
diff --git a/metadata/de/full_description.txt b/metadata/de/full_description.txt
new file mode 100644
index 00000000..5813a487
--- /dev/null
+++ b/metadata/de/full_description.txt
@@ -0,0 +1,23 @@
+Client für das gemeinschaftlich betriebene, verteile soziale Netzwerk diaspora*.
+Verbessere dein Netzwerk-Erlebnis durch nützliche Features:
+
+⚡ Schnellzugriff auf die meisten diaspora* Funktionen
+🎨 Anpassbar an deinen Geschmack
+👉 Teile Inhalte mit und von der App
+🌎 Unterstützung von Proxies (unterstützt Tor/Orbot)
+📰 In-App-Browser zum schnellen lesen von Artikeln
+🌆 Dark/AMOLED Modus zum Energiesparen und Augen schonen
+🈴 Verfügbar in vielen Sprachen
+#️⃣ Durchsuche Tags und Aspekte
+
+🈯 Getrennte App- und Systemsprache. Nutze die App in beliebiger Sprache (zB. Englisch) und behalte deine Systemsprache (zB. Deutsch) bei.
+
+🔐 Du bist noch auf der Suche nach einem Pod um dich zu registrieren? Die App bringt eine große Liste mit und weitere Pods findest du auf diaspora.fediverse.observer.
+
+🍻 Mehrere Accounts: Nutze dandelion* und dandelior* um zwei Accounts auf dem gleichen Gerät zu nutzen. Die Apps besitzen eigene Icons und unterschiedliche Vorgabefarben.
+
+🌍 Hinweis: Die App nutzt Androids WebView Komponente um Inhalte von diaspora* Pods in der mobilen Ansicht anzuzeigen. Für fehlende Features frage bitte auf dem diaspora* Bug Tracker.
+
+Weitere Informationen:
+Project site | diaspora* FAQ
+
diff --git a/metadata/de/short_description.txt b/metadata/de/short_description.txt
new file mode 100644
index 00000000..71a3004f
--- /dev/null
+++ b/metadata/de/short_description.txt
@@ -0,0 +1 @@
+Client für das Soziale Netzwerk diaspora*
diff --git a/metadata/en-US/changelogs/1.txt b/metadata/en-US/changelogs/1.txt
new file mode 100644
index 00000000..d60031cb
--- /dev/null
+++ b/metadata/en-US/changelogs/1.txt
@@ -0,0 +1 @@
+Added to F-Droid
diff --git a/metadata/en-US/featureGraphic.png b/metadata/en-US/featureGraphic.png
new file mode 100644
index 00000000..92105097
Binary files /dev/null and b/metadata/en-US/featureGraphic.png differ
diff --git a/metadata/en-US/full_description.txt b/metadata/en-US/full_description.txt
new file mode 100644
index 00000000..e1c445bd
--- /dev/null
+++ b/metadata/en-US/full_description.txt
@@ -0,0 +1,22 @@
+A client for the community-run, distributed social network diaspora*.
+It adds useful features to your networking experience:
+
+⚡ Quick access to most diaspora* features
+🎨 Customize everything to own preferences
+👉 Share content from and to the app
+🌎 Proxy support (Tor/Orbot supported)
+📰 In-app-browser to view articles
+🌆 Dark/AMOLED mode available
+🈴 Available in many languages
+#️⃣Browse tags and aspects
+
+🈯 Use in any language that the app is translated in - for example in German but have English as system language.
+
+🔐 Looking for a pod to register? The app lists many pods with more being listed at diaspora.fediverse.observer.
+
+🍻 Multiple accounts: You can use dandelion* and dandelior* to use two accounts at the same time on one device. They use a different icon and other default colors.
+
+🌍 Notice: The app uses the Android WebView component to display contents of diaspora* pods in the mobile view. For missing features and bugs in mobile view, ask at diaspora* bugtracker.
+
+ More information:
+Project site | diaspora* FAQ
diff --git a/metadata/en-US/phoneScreenshots/01.png b/metadata/en-US/phoneScreenshots/01.png
new file mode 100644
index 00000000..a4d96448
Binary files /dev/null and b/metadata/en-US/phoneScreenshots/01.png differ
diff --git a/metadata/en-US/phoneScreenshots/02.png b/metadata/en-US/phoneScreenshots/02.png
new file mode 100644
index 00000000..77eb6b2c
Binary files /dev/null and b/metadata/en-US/phoneScreenshots/02.png differ
diff --git a/metadata/en-US/phoneScreenshots/03.png b/metadata/en-US/phoneScreenshots/03.png
new file mode 100644
index 00000000..2fe74f91
Binary files /dev/null and b/metadata/en-US/phoneScreenshots/03.png differ
diff --git a/metadata/en-US/phoneScreenshots/04.png b/metadata/en-US/phoneScreenshots/04.png
new file mode 100644
index 00000000..c2e39717
Binary files /dev/null and b/metadata/en-US/phoneScreenshots/04.png differ
diff --git a/metadata/en-US/phoneScreenshots/05.png b/metadata/en-US/phoneScreenshots/05.png
new file mode 100644
index 00000000..c5dc0626
Binary files /dev/null and b/metadata/en-US/phoneScreenshots/05.png differ
diff --git a/metadata/en-US/phoneScreenshots/06.png b/metadata/en-US/phoneScreenshots/06.png
new file mode 100644
index 00000000..36b912e9
Binary files /dev/null and b/metadata/en-US/phoneScreenshots/06.png differ
diff --git a/metadata/en-US/phoneScreenshots/07.png b/metadata/en-US/phoneScreenshots/07.png
new file mode 100644
index 00000000..db7965c7
Binary files /dev/null and b/metadata/en-US/phoneScreenshots/07.png differ
diff --git a/metadata/en-US/phoneScreenshots/08.png b/metadata/en-US/phoneScreenshots/08.png
new file mode 100644
index 00000000..b4858eb2
Binary files /dev/null and b/metadata/en-US/phoneScreenshots/08.png differ
diff --git a/metadata/en-US/phoneScreenshots/09.png b/metadata/en-US/phoneScreenshots/09.png
new file mode 100644
index 00000000..86e3ca44
Binary files /dev/null and b/metadata/en-US/phoneScreenshots/09.png differ
diff --git a/metadata/en-US/promoGraphic.png b/metadata/en-US/promoGraphic.png
new file mode 100644
index 00000000..186cec0f
Binary files /dev/null and b/metadata/en-US/promoGraphic.png differ
diff --git a/metadata/en-US/short_description.txt b/metadata/en-US/short_description.txt
new file mode 100644
index 00000000..d177ec0d
--- /dev/null
+++ b/metadata/en-US/short_description.txt
@@ -0,0 +1 @@
+diaspora* social network client
diff --git a/metadata/zz/full_description.txt b/metadata/zz/full_description.txt
new file mode 100644
index 00000000..8e27be7d
--- /dev/null
+++ b/metadata/zz/full_description.txt
@@ -0,0 +1 @@
+text
diff --git a/metadata/zz/short_description.txt b/metadata/zz/short_description.txt
new file mode 100644
index 00000000..8e27be7d
--- /dev/null
+++ b/metadata/zz/short_description.txt
@@ -0,0 +1 @@
+text
diff --git a/metadata/zz/title.txt b/metadata/zz/title.txt
new file mode 100644
index 00000000..8e27be7d
--- /dev/null
+++ b/metadata/zz/title.txt
@@ -0,0 +1 @@
+text
diff --git a/patches/vanitasvitae-Add-first-image-viewer-design.patch b/patches/vanitasvitae-Add-first-image-viewer-design.patch
new file mode 100644
index 00000000..ffb9ecab
--- /dev/null
+++ b/patches/vanitasvitae-Add-first-image-viewer-design.patch
@@ -0,0 +1,240 @@
+From 90ae580fa732962127156a333b5d879cd4a80d36 Mon Sep 17 00:00:00 2001
+From: vanitasvitae
+Date: Mon, 10 Apr 2017 21:43:24 +0200
+Subject: [PATCH] Add first image viewer design
+
+---
+ app/build.gradle | 1 +
+ .../activity/ImageViewFragment.java | 77 +++++++++++++++++++
+ .../activity/MainActivity.java | 4 +
+ .../service/ImageDownloadTask.java | 17 ++++
+ .../web/ContextMenuWebView.java | 16 ++++
+ .../main/res/layout/image_view__fragment.xml | 19 +++++
+ 6 files changed, 134 insertions(+)
+ create mode 100644 app/src/main/java/com/github/dfa/diaspora_android/activity/ImageViewFragment.java
+ create mode 100644 app/src/main/res/layout/image_view__fragment.xml
+
+diff --git a/app/build.gradle b/app/build.gradle
+index 5449e9fc..c46301ed 100644
+--- a/app/build.gradle
++++ b/app/build.gradle
+@@ -85,6 +85,7 @@ dependencies {
+ compile 'info.guardianproject.netcipher:netcipher:2.0.0-alpha1'
+ compile 'info.guardianproject.netcipher:netcipher-webkit:2.0.0-alpha1'
+ compile 'com.github.DASAR:ShiftColorPicker:v0.5'
++ compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.6.0'
+ apt 'com.jakewharton:butterknife-compiler:8.0.1'
+ }
+
+diff --git a/app/src/main/java/com/github/dfa/diaspora_android/activity/ImageViewFragment.java b/app/src/main/java/com/github/dfa/diaspora_android/activity/ImageViewFragment.java
+new file mode 100644
+index 00000000..164e37ae
+--- /dev/null
++++ b/app/src/main/java/com/github/dfa/diaspora_android/activity/ImageViewFragment.java
+@@ -0,0 +1,77 @@
++package com.github.dfa.diaspora_android.activity;
++
++import android.graphics.Bitmap;
++import android.os.Bundle;
++import android.view.LayoutInflater;
++import android.view.Menu;
++import android.view.MenuInflater;
++import android.view.View;
++import android.view.ViewGroup;
++import android.widget.ProgressBar;
++
++import com.davemorrissey.labs.subscaleview.ImageSource;
++import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
++import com.github.dfa.diaspora_android.R;
++import com.github.dfa.diaspora_android.service.ImageDownloadTask;
++import com.github.dfa.diaspora_android.ui.theme.ThemedFragment;
++import com.github.dfa.diaspora_android.util.AppLog;
++
++import butterknife.BindView;
++import butterknife.ButterKnife;
++
++/**
++ * Created by vanitas on 10.04.17.
++ */
++
++public class ImageViewFragment extends ThemedFragment {
++ public static final String TAG = "com.github.dfa.diaspora_android.ImageViewFragment";
++ public static final String IMAGE_SOURCE = "IMAGE_SOURCE";
++
++ @BindView(R.id.imageView)
++ SubsamplingScaleImageView imageView;
++ @BindView(R.id.marker_progress)
++ ProgressBar progressBar;
++
++ @Override
++ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
++ AppLog.d(this, "onCreateView()");
++ View view = inflater.inflate(R.layout.image_view__fragment, container, false);
++ ButterKnife.bind(this, view);
++ return view;
++ }
++
++ @Override
++ public void onViewCreated(View view, Bundle savedInstanceState) {
++ super.onViewCreated(view, savedInstanceState);
++ new ImageDownloadTask.ImageViewFragmentDownloadTask(this)
++ .execute(getArguments().getString(IMAGE_SOURCE));
++ imageView.setMaxScale(5);
++ imageView.setDoubleTapZoomStyle(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER);
++ imageView.setZoomEnabled(true);
++ }
++
++ @Override
++ protected void applyColorToViews() {
++
++ }
++
++ @Override
++ public String getFragmentTag() {
++ return TAG;
++ }
++
++ @Override
++ public void onCreateBottomOptionsMenu(Menu menu, MenuInflater inflater) {
++
++ }
++
++ @Override
++ public boolean onBackPressed() {
++ return false;
++ }
++
++ public void showBitmap(Bitmap bitmap) {
++ progressBar.setVisibility(View.GONE);
++ imageView.setImage(ImageSource.bitmap(bitmap));
++ }
++}
+diff --git a/app/src/main/java/com/github/dfa/diaspora_android/activity/MainActivity.java b/app/src/main/java/com/github/dfa/diaspora_android/activity/MainActivity.java
+index 8019fb6d..031b624f 100644
+--- a/app/src/main/java/com/github/dfa/diaspora_android/activity/MainActivity.java
++++ b/app/src/main/java/com/github/dfa/diaspora_android/activity/MainActivity.java
+@@ -321,6 +321,10 @@ protected CustomFragment getFragment(String fragmentTag) {
+ PodSelectionFragment psf = new PodSelectionFragment();
+ fm.beginTransaction().add(psf, fragmentTag).commit();
+ return psf;
++ case ImageViewFragment.TAG:
++ ImageViewFragment ivf = new ImageViewFragment();
++ fm.beginTransaction().add(ivf, fragmentTag).commit();
++ return ivf;
+ default:
+ AppLog.e(this, "Invalid Fragment Tag: " + fragmentTag
+ + "\nAdd Fragments Tag to getFragment()'s switch case.");
+diff --git a/app/src/main/java/com/github/dfa/diaspora_android/service/ImageDownloadTask.java b/app/src/main/java/com/github/dfa/diaspora_android/service/ImageDownloadTask.java
+index 0834ee95..f11cfb82 100644
+--- a/app/src/main/java/com/github/dfa/diaspora_android/service/ImageDownloadTask.java
++++ b/app/src/main/java/com/github/dfa/diaspora_android/service/ImageDownloadTask.java
+@@ -24,6 +24,9 @@
+ import android.support.annotation.Nullable;
+ import android.widget.ImageView;
+
++import com.davemorrissey.labs.subscaleview.ImageSource;
++import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
++import com.github.dfa.diaspora_android.activity.ImageViewFragment;
+ import com.github.dfa.diaspora_android.util.AppLog;
+
+ import java.io.FileOutputStream;
+@@ -95,4 +98,18 @@ protected void onPostExecute(Bitmap result) {
+ imageView.setImageBitmap(result);
+ }
+ }
++
++ public static class ImageViewFragmentDownloadTask extends ImageDownloadTask {
++ ImageViewFragment ivf;
++
++ public ImageViewFragmentDownloadTask(ImageViewFragment imageViewFragment) {
++ super(null, null);
++ this.ivf = imageViewFragment;
++ }
++
++ @Override
++ protected void onPostExecute(Bitmap result) {
++ ivf.showBitmap(result);
++ }
++ }
+ }
+diff --git a/app/src/main/java/com/github/dfa/diaspora_android/web/ContextMenuWebView.java b/app/src/main/java/com/github/dfa/diaspora_android/web/ContextMenuWebView.java
+index c4c0e278..6c8947bd 100644
+--- a/app/src/main/java/com/github/dfa/diaspora_android/web/ContextMenuWebView.java
++++ b/app/src/main/java/com/github/dfa/diaspora_android/web/ContextMenuWebView.java
+@@ -30,6 +30,7 @@
+ import android.content.pm.PackageManager;
+ import android.graphics.Bitmap;
+ import android.net.Uri;
++import android.os.Bundle;
+ import android.os.Environment;
+ import android.support.v4.content.LocalBroadcastManager;
+ import android.util.AttributeSet;
+@@ -38,6 +39,7 @@
+ import android.widget.Toast;
+
+ import com.github.dfa.diaspora_android.R;
++import com.github.dfa.diaspora_android.activity.ImageViewFragment;
+ import com.github.dfa.diaspora_android.activity.MainActivity;
+ import com.github.dfa.diaspora_android.service.ImageDownloadTask;
+
+@@ -53,6 +55,7 @@
+ public static final int ID_SAVE_IMAGE = 10;
+ public static final int ID_IMAGE_EXTERNAL_BROWSER = 11;
+ public static final int ID_COPY_IMAGE_LINK = 15;
++ public static final int ID_VIEW_IMAGE = 16;
+ public static final int ID_COPY_LINK = 12;
+ public static final int ID_SHARE_LINK = 13;
+ public static final int ID_SHARE_IMAGE = 14;
+@@ -82,6 +85,18 @@ public boolean onMenuItemClick(MenuItem item) {
+ HitTestResult result = getHitTestResult();
+ String url = result.getExtra();
+ switch (item.getItemId()) {
++
++ case ID_VIEW_IMAGE: {
++ ImageViewFragment ivf = new ImageViewFragment();
++ Bundle b = new Bundle();
++ b.putString(ImageViewFragment.IMAGE_SOURCE, url);
++ ivf.setArguments(b);
++ ((MainActivity) parentActivity).getSupportFragmentManager().beginTransaction()
++ .addToBackStack(null)
++ .replace(R.id.fragment_container, ivf).commit();
++ break;
++ }
++
+ //Save image to external memory
+ case ID_SAVE_IMAGE: {
+ boolean writeToStoragePermitted = true;
+@@ -224,6 +239,7 @@ protected void onPostExecute(Bitmap result) {
+ menu.add(0, ID_IMAGE_EXTERNAL_BROWSER, 0, context.getString(R.string.context_menu_open_external_browser)).setOnMenuItemClickListener(handler);
+ menu.add(0, ID_SHARE_IMAGE, 0, context.getString(R.string.context_menu_share_image)).setOnMenuItemClickListener(handler);
+ menu.add(0, ID_COPY_IMAGE_LINK, 0, context.getString(R.string.context_menu_copy_image_link)).setOnMenuItemClickListener(handler);
++ menu.add(0, ID_VIEW_IMAGE, 0, "View").setOnMenuItemClickListener(handler);
+ } else if (result.getType() == HitTestResult.ANCHOR_TYPE ||
+ result.getType() == HitTestResult.SRC_ANCHOR_TYPE) {
+ // Menu options for a hyperlink.
+diff --git a/app/src/main/res/layout/image_view__fragment.xml b/app/src/main/res/layout/image_view__fragment.xml
+new file mode 100644
+index 00000000..2b91c501
+--- /dev/null
++++ b/app/src/main/res/layout/image_view__fragment.xml
+@@ -0,0 +1,19 @@
++
++
++
++
++
+\ No newline at end of file
diff --git a/tools/localization/.gitignore b/tools/localization/.gitignore
deleted file mode 100755
index 98626981..00000000
--- a/tools/localization/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-crowdin.yaml
diff --git a/tools/localization/downloadLocalizations.sh b/tools/localization/downloadLocalizations.sh
deleted file mode 100755
index 86fc3252..00000000
--- a/tools/localization/downloadLocalizations.sh
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/bash
-#########################################################
-#
-# Title
-#
-# Created by Gregor Santer (gsantner), 2016
-# https://gsantner.github.io/
-#
-#########################################################
-
-
-#Pfade
-SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
-SCRIPTFILE=$(readlink -f $0)
-SCRIPTPATH=$(dirname $SCRIPTFILE)
-argc=$#
-
-#########################################################
-cd "$SCRIPTDIR"
-
-if [ ! -f "crowdin.yaml" ] ; then
- echo "project_identifier: diaspora-for-android" > 'crowdin.yaml'
- echo "base_path: $(realpath '../../')" >>'crowdin.yaml'
- echo "api_key: DONT_PUSH_API_KEY" >>'crowdin.yaml'
- cat "../../crowdin.yaml" >> "crowdin.yaml"
- echo "# Add all non locality languages here" >> "crowdin.yaml"
- echo "# (e.g. enUS, enUK, deCH, deAT will automatically go into the right folder)" >> "crowdin.yaml"
- echo "# Otherwise e.g. en would get added into the folder enEN (which is wrong)." >> "crowdin.yaml"
- echo "# https://crowdin.com/page/api/language-codes contains supported language codes" >> "crowdin.yaml"
- echo "# The first listed ones here are diffently managed by crowdin than on android" >> "crowdin.yaml"
-fi
-
-if grep -q "DONT_PUSH" "crowdin.yaml" ; then
- echo "Insert API key to crowdin.yaml"
- echo "and update folder to the root folder of the repository"
- exit
-fi
-
-# Load latest translations
-crowdin-cli download -b master