<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
- <classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
+ <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
+ <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
+ <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>
# generated files
bin/
gen/
+target/
-# Local configuration file (sdk path, etc)
+# Local configuration files (sdk path, etc)
local.properties
+oc_workaround/local.properties
+oc_framework/local.properties
+oc_framework-test-project/local.properties
+tests/local.properties
# Mac .DS_Store files
.DS_Store
+
+# Proguard README
+proguard-project.txt
+oc_workaround/proguard-project.txt
+oc_framework/proguard-project.txt
+oc_framework-test-project/proguard-project.txt
+tests/proguard-project.txt
+
+# Should not be commited inside this repo:
+actionbarsherlock/
\ No newline at end of file
[submodule "actionbarsherlock"]
path = actionbarsherlock
url = git://github.com/JakeWharton/ActionBarSherlock.git
+[submodule "owncloud-android-library"]
+ path = owncloud-android-library
+ url = git://github.com/owncloud/android-library.git
eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.source=1.6
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
--- /dev/null
+language: java
+jdk: oraclejdk7
+before_install:
+ # Install base Android SDK
+ - sudo apt-get update -qq
+ - sudo apt-get install -qq libstdc++6:i386 lib32z1
+ - export COMPONENTS=build-tools-18.1.0,android-14,android-17,android-19,sysimg-19,extra-android-support
+ - curl -L https://raw.github.com/embarkmobile/android-sdk-installer/master/android-sdk-installer | bash /dev/stdin --install=$COMPONENTS
+ - source ~/.android-sdk-installer/env
+ - rm pom.xml
+ - ./setup_env.sh
+
+script:
+ - ant clean
+ - ant debug
+
file_filter = res/values-<lang>/strings.xml
source_file = res/values/strings.xml
source_lang = en
-lang_map = af_ZA: af-rZA, am_ET: am-rET, ar_AE: ar-rAE, ar_BH: ar-rBH, ar_DZ: ar-rDZ, ar_EG: ar-rEG, ar_IQ: ar-rIQ, ar_JO: ar-rJO, ar_KW: ar-rKW, ar_LB: ar-rLB, ar_LY: ar-rLY, ar_MA: ar-rMA, ar_OM: ar-rOM, ar_QA: ar-rQA, ar_SA: ar-rSA, ar_SY: ar-rSY, ar_TN: ar-rTN, ar_YE: ar-rYE, arn_CL: arn-rCL, as_IN: as-rIN, az_AZ: az-rAZ, ba_RU: ba-rRU, be_BY: be-rBY, bg_BG: bg-rBG, bn_BD: bn-rBD, bn_IN: bn-rIN, bo_CN: bo-rCN, br_FR: br-rFR, bs_BA: bs-rBA, ca_ES: ca-rES, co_FR: co-rFR, cs_CZ: cs-rCZ, cy_GB: cy-rGB, da_DK: da-rDK, de_AT: de-rAT, de_CH: de-rCH, de_DE: de-rDE, de_LI: de-rLI, de_LU: de-rLU, dsb_DE: dsb-rDE, dv_MV: dv-rMV, el_GR: el-rGR, en_AU: en-rAU, en_BZ: en-rBZ, en_CA: en-rCA, en_GB: en-rGB, en_IE: en-rIE, en_IN: en-rIN, en_JM: en-rJM, en_MY: en-rMY, en_NZ: en-rNZ, en_PH: en-rPH, en_SG: en-rSG, en_TT: en-rTT, en_US: en-rUS, en_ZA: en-rZA, en_ZW: en-rZW, es_AR: es-rAR, es_BO: es-rBO, es_CL: es-rCL, es_CO: es-rCO, es_CR: es-rCR, es_DO: es-rDO, es_EC: es-rEC, es_ES: es-rES, es_GT: es-rGT, es_HN: es-rHN, es_MX: es-rMX, es_NI: es-rNI, es_PA: es-rPA, es_PE: es-rPE, es_PR: es-rPR, es_PY: es-rPY, es_SV: es-rSV, es_US: es-rUS, es_UY: es-rUY, es_VE: es-rVE, et_EE: et-rEE, eu_ES: eu-rES, fa_IR: fa-rIR, fi_FI: fi-rFI, fil_PH: fil-rPH, fo_FO: fo-rFO, fr_BE: fr-rBE, fr_CA: fr-rCA, fr_CH: fr-rCH, fr_FR: fr-rFR, fr_LU: fr-rLU, fr_MC: fr-rMC, fy_NL: fy-rNL, ga_IE: ga-rIE, gd_GB: gd-rGB, gl_ES: gl-rES, gsw_FR: gsw-rFR, gu_IN: gu-rIN, ha_NG: ha-rNG, he_IL: he-rIL, hi_IN: hi-rIN, hr_BA: hr-rBA, hr_HR: hr-rHR, hsb_DE: hsb-rDE, hu_HU: hu-rHU, hy_AM: hy-rAM, id_ID: id-rID, ig_NG: ig-rNG, ii_CN: ii-rCN, is_IS: is-rIS, it_CH: it-rCH, it_IT: it-rIT, iu_CA: iu-rCA, ja_JP: ja-rJP, ka_GE: ka-rGE, kk_KZ: kk-rKZ, kl_GL: kl-rGL, km_KH: km-rKH, kn_IN: kn-rIN, ko_KR: ko-rKR, kok_IN: kok-rIN, ku_IQ: ku-rIQ, ky_KG: ky-rKG, lb_LU: lb-rLU, lo_LA: lo-rLA, lt_LT: lt-rLT, lv_LV: lv-rLV, mi_NZ: mi-rNZ, mk_MK: mk-rMK, ml_IN: ml-rIN, mn_CN: mn-rCN, mn_MN: mn-rMN, moh_CA: moh-rCA, mr_IN: mr-rIN, ms_BN: ms-rBN, ms_MY: ms-rMY, my_MM: my, mt_MT: mt-rMT, nb_NO: nb-rNO, ne_NP: ne-rNP, nl_BE: nl-rBE, nl_NL: nl-rNL, nn_NO: nn-rNO, nso_ZA: nso-rZA, oc_FR: oc-rFR, or_IN: or-rIN, pa_IN: pa-rIN, pl_PL: pl-rPL, prs_AF: prs-rAF, ps_AF: ps-rAF, pt_BR: pt-rBR, pt_PT: pt-rPT, qut_GT: qut-rGT, quz_BO: quz-rBO, quz_EC: quz-rEC, quz_PE: quz-rPE, rm_CH: rm-rCH, ro_RO: ro-rRO, ru_RU: ru-rRU, rw_RW: rw-rRW, sa_IN: sa-rIN, sah_RU: sah-rRU, se_FI: se-rFI, se_NO: se-rNO, se_SE: se-rSE, si_LK: si-rLK, sk_SK: sk-rSK, sl_SI: sl-rSI, sma_NO: sma-rNO, sma_SE: sma-rSE, smj_NO: smj-rNO, smj_SE: smj-rSE, smn_FI: smn-rFI, sms_FI: sms-rFI, sq_AL: sq-rAL, sr_BA: sr-rBA, sr_CS: sr-rCS, sr_ME: sr-rME, sr_RS: sr-rRS, sr@latin: sr-rSP, sv_FI: sv-rFI, sv_SE: sv-rSE, sw_KE: sw-rKE, syr_SY: syr-rSY, ta_IN: ta-rIN, ta_LK: ta-rLK, te_IN: te-rIN, tg_TJ: tg-rTJ, th_TH: th-rTH, tk_TM: tk-rTM, tn_ZA: tn-rZA, tr_TR: tr-rTR, tt_RU: tt-rRU, tzm_DZ: tzm-rDZ, ug_CN: ug-rCN, uk_UA: uk-rUA, ur_PK: ur-rPK, uz_UZ: uz-rUZ, vi_VN: vi-rVN, wo_SN: wo-rSN, xh_ZA: xh-rZA, yo_NG: yo-rNG, zh_CN: zh-rCN, zh_CN.GB2312:zh-rBG, zh_HK: zh-rHK, zh_MO: zh-rMO, zh_SG: zh-rSG, zh_TW: zh-rTW, zu_ZA: zu-rZA
+lang_map = af_ZA: af-rZA, am_ET: am-rET, ar_AE: ar-rAE, ar_BH: ar-rBH, ar_DZ: ar-rDZ, ar_EG: ar-rEG, ar_IQ: ar-rIQ, ar_JO: ar-rJO, ar_KW: ar-rKW, ar_LB: ar-rLB, ar_LY: ar-rLY, ar_MA: ar-rMA, ar_OM: ar-rOM, ar_QA: ar-rQA, ar_SA: ar-rSA, ar_SY: ar-rSY, ar_TN: ar-rTN, ar_YE: ar-rYE, arn_CL: arn-rCL, as_IN: as-rIN, az_AZ: az-rAZ, ba_RU: ba-rRU, be_BY: be-rBY, bg_BG: bg-rBG, bn_BD: bn-rBD, bn_IN: bn-rIN, bo_CN: bo-rCN, br_FR: br-rFR, bs_BA: bs-rBA, ca_ES: ca-rES, co_FR: co-rFR, cs_CZ: cs-rCZ, cy_GB: cy-rGB, da_DK: da-rDK, de_AT: de-rAT, de_CH: de-rCH, de_DE: de-rDE, de_LI: de-rLI, de_LU: de-rLU, dsb_DE: dsb-rDE, dv_MV: dv-rMV, el_GR: el-rGR, en_AU: en-rAU, en_BZ: en-rBZ, en_CA: en-rCA, en_GB: en-rGB, en_IE: en-rIE, en_IN: en-rIN, en_JM: en-rJM, en_MY: en-rMY, en_NZ: en-rNZ, en_PH: en-rPH, en_SG: en-rSG, en_TT: en-rTT, en_US: en-rUS, en_ZA: en-rZA, en_ZW: en-rZW, en@pirate: en-rpirate, es_AR: es-rAR, es_BO: es-rBO, es_CL: es-rCL, es_CO: es-rCO, es_CR: es-rCR, es_DO: es-rDO, es_EC: es-rEC, es_ES: es-rES, es_GT: es-rGT, es_HN: es-rHN, es_MX: es-rMX, es_NI: es-rNI, es_PA: es-rPA, es_PE: es-rPE, es_PR: es-rPR, es_PY: es-rPY, es_SV: es-rSV, es_US: es-rUS, es_UY: es-rUY, es_VE: es-rVE, et_EE: et-rEE, eu_ES: eu-rES, fa_IR: fa-rIR, fi_FI: fi-rFI, fil_PH: fil-rPH, fo_FO: fo-rFO, fr_BE: fr-rBE, fr_CA: fr-rCA, fr_CH: fr-rCH, fr_FR: fr-rFR, fr_LU: fr-rLU, fr_MC: fr-rMC, fy_NL: fy-rNL, ga_IE: ga-rIE, gd_GB: gd-rGB, gl_ES: gl-rES, gsw_FR: gsw-rFR, gu_IN: gu-rIN, ha_NG: ha-rNG, he_IL: he-rIL, hi_IN: hi-rIN, hr_BA: hr-rBA, hr_HR: hr-rHR, hsb_DE: hsb-rDE, hu_HU: hu-rHU, hy_AM: hy-rAM, id_ID: id-rID, ig_NG: ig-rNG, ii_CN: ii-rCN, is_IS: is-rIS, it_CH: it-rCH, it_IT: it-rIT, iu_CA: iu-rCA, ja_JP: ja-rJP, ka_GE: ka-rGE, kk_KZ: kk-rKZ, kl_GL: kl-rGL, km_KH: km-rKH, kn_IN: kn-rIN, ko_KR: ko-rKR, kok_IN: kok-rIN, ku_IQ: ku-rIQ, ky_KG: ky-rKG, lb_LU: lb-rLU, lo_LA: lo-rLA, lt_LT: lt-rLT, lv_LV: lv-rLV, mi_NZ: mi-rNZ, mk_MK: mk-rMK, ml_IN: ml-rIN, mn_CN: mn-rCN, mn_MN: mn-rMN, moh_CA: moh-rCA, mr_IN: mr-rIN, ms_BN: ms-rBN, ms_MY: ms-rMY, my_MM: my, mt_MT: mt-rMT, nb_NO: nb-rNO, ne_NP: ne-rNP, nl_BE: nl-rBE, nl_NL: nl-rNL, nn_NO: nn-rNO, nso_ZA: nso-rZA, oc_FR: oc-rFR, or_IN: or-rIN, pa_IN: pa-rIN, pl_PL: pl-rPL, prs_AF: prs-rAF, ps_AF: ps-rAF, pt_BR: pt-rBR, pt_PT: pt-rPT, qut_GT: qut-rGT, quz_BO: quz-rBO, quz_EC: quz-rEC, quz_PE: quz-rPE, rm_CH: rm-rCH, ro_RO: ro-rRO, ru_RU: ru-rRU, rw_RW: rw-rRW, sa_IN: sa-rIN, sah_RU: sah-rRU, se_FI: se-rFI, se_NO: se-rNO, se_SE: se-rSE, si_LK: si-rLK, sk_SK: sk-rSK, sl_SI: sl-rSI, sma_NO: sma-rNO, sma_SE: sma-rSE, smj_NO: smj-rNO, smj_SE: smj-rSE, smn_FI: smn-rFI, sms_FI: sms-rFI, sq_AL: sq-rAL, sr_BA: sr-rBA, sr_CS: sr-rCS, sr_ME: sr-rME, sr_RS: sr-rRS, sr@latin: sr-rSP, sv_FI: sv-rFI, sv_SE: sv-rSE, sw_KE: sw-rKE, syr_SY: syr-rSY, ta_IN: ta-rIN, ta_LK: ta-rLK, te_IN: te-rIN, tg_TJ: tg-rTJ, th_TH: th-rTH, tk_TM: tk-rTM, tn_ZA: tn-rZA, tr_TR: tr-rTR, tt_RU: tt-rRU, tzm_DZ: tzm-rDZ, ug_CN: ug-rCN, uk_UA: uk-rUA, ur_PK: ur-rPK, uz_UZ: uz-rUZ, vi_VN: vi-rVN, wo_SN: wo-rSN, xh_ZA: xh-rZA, yo_NG: yo-rNG, zh_CN: zh-rCN, zh_CN.GB2312:zh-rBG, zh_HK: zh-rHK, zh_MO: zh-rMO, zh_SG: zh-rSG, zh_TW: zh-rTW, zu_ZA: zu-rZA
ownCloud Android client application
Copyright (C) 2012 Bartek Przybylski
- Copyright (C) 2012-2013 ownCloud Inc.
+ Copyright (C) 2012-2014 ownCloud Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2,
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<manifest package="com.owncloud.android"
- android:versionCode="104000"
- android:versionName="1.4.0" xmlns:android="http://schemas.android.com/apk/res/android">
+ android:versionCode="105005"
+ android:versionName="1.5.5" xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-sdk
android:minSdkVersion="8"
- android:targetSdkVersion="13" />
+ android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission>
<application
+ android:name=".MainApp"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@style/Theme.ownCloud">
<activity
android:name=".ui.activity.FileDisplayActivity"
- android:label="@string/app_name">
+ android:label="@string/app_name"
+ >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
-
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ui.activity.InstantUploadActivity">
</activity>
<activity android:name=".ui.activity.FailedUploadActivity" android:theme="@android:style/Theme.Dialog" android:excludeFromRecents="true"/>
- <activity android:name=".Uploader" >
+ <activity android:name=".ui.activity.Uploader" >
<intent-filter>
<action android:name="android.intent.action.SEND" >
</action>
<data android:mimeType="*/*" >
</data>
- </intent-filter>
+
+ </intent-filter>
</activity>
<activity
android:name=".ui.activity.Preferences"
<activity android:name=".ui.activity.PreferencesNewSessionewSession" >
</activity>
- <activity android:name="com.owncloud.android.ui.preview.PreviewImageActivity" />
+ <activity
+ android:name=".ui.preview.PreviewImageActivity"
+ />
- <activity android:name="com.owncloud.android.ui.preview.PreviewVideoActivity"
- android:label="@string/app_name"
- android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
+ <activity
+ android:name=".ui.preview.PreviewVideoActivity"
+ android:label="@string/app_name"
+ android:theme="@style/Theme.ownCloud.Fullscreen"
+ >
</activity>
<service
- android:name=".authenticator.AccountAuthenticatorService"
+ android:name=".authentication.AccountAuthenticatorService"
android:exported="true">
<intent-filter android:priority="100">
<action android:name="android.accounts.AccountAuthenticator" />
</service>
<service
android:name=".syncadapter.FileSyncService"
- android:exported="true" >
+ android:exported="true"
+ >
<intent-filter>
<action android:name="android.content.SyncAdapter" />
</intent-filter>
<provider
android:name=".providers.FileContentProvider"
- android:authorities="org.owncloud"
+ android:authorities="@string/authority"
android:enabled="true"
android:exported="false"
android:label="@string/sync_string_files"
</provider>
<activity
- android:name=".ui.activity.AuthenticatorActivity"
+ android:name=".authentication.AuthenticatorActivity"
android:exported="true"
- android:theme="@style/Theme.ownCloud.noActionBar" >
+ android:theme="@style/Theme.ownCloud.noActionBar"
+ android:launchMode="singleTask">
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <data android:scheme="@string/oauth2_redirect_scheme" />
+ </intent-filter>
<intent-filter>
<action android:name="com.owncloud.android.workaround.accounts.CREATE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
+ <service android:name=".services.OperationsService" />
<service android:name=".files.services.FileDownloader" />
<service android:name=".files.services.FileUploader" />
<service android:name=".media.MediaService" />
- <activity android:name=".ui.activity.FileDetailActivity" />
<activity android:name=".ui.activity.PinCodeActivity" />
- <activity android:name=".extensions.ExtensionsAvailableActivity"></activity>
- <activity android:name=".extensions.ExtensionsListActivity"></activity>
<activity android:name=".ui.activity.AccountSelectActivity" android:uiOptions="none" android:label="@string/prefs_accounts"></activity>
<activity android:name=".ui.activity.ConflictsResolveActivity"/>
<activity android:name=".ui.activity.GenericExplanationActivity"/>
<receiver android:name=".files.InstantUploadBroadcastReceiver">
<intent-filter>
+ <!-- unofficially supported by many Android phones but not by HTC devices: -->
+ <action android:name="com.android.camera.NEW_PICTURE" />
+ <!-- officially supported since Android 4.0 (SDK 14, works even for HTC devices): -->
<action android:name="android.hardware.action.NEW_PICTURE" />
<data android:mimeType="image/*" />
</intent-filter>
</intent-filter>
</receiver>
<service android:name=".files.services.FileObserverService"/>
+
+ <activity
+ android:name=".ui.activity.CopyToClipboardActivity"
+ android:label="@string/copy_link"
+ android:icon="@drawable/copy_link" />
+
</application>
-
+
</manifest>
-This is the android client for [owncloud][0].
+This is the Android client for [ownCloud][0].
+
+The app performs file synchronization with an ownCloud server. Other ownCloud features may be added in the future, but they are not a priority right now.
Make sure you read [SETUP.md][1] when you start working on this project.
- If you want to start development of ownCloud android client you have two way to do so:
+If you want to start help developing ownCloud please follow the [contribution guidelines][0] and observe these instructions:
+
+### 1. Fork and download android/develop repository:
+
+NOTE: You must have git in your environment path variable to perform the next operations.
+
+* Navigate to https://github.com/owncloud/android, click fork.
+* Clone your new repo: "git clone git@github.com:YOURGITHUBNAME/android.git"
+* Move to the project folder with "cd android"
+* Checkout remote develop branch: "git checkout -b develop remotes/origin/develop"
+* Pull changes from your develop branch: "git pull origin develop"
+* Make official ownCloud repo known as upstream: "git remote add upstream git@github.com:owncloud/android.git"
+* Make sure to get the latest changes from official android/develop branch: "git pull upstream develop"
+* Complete the setup of project properties and resolve pending dependencies running "setup_env.bat" or "./setup_env.sh" .
- 1. Building with console:
+At this point you can continue using different tools to build the project. Section 2, 3 and 4 describe some of the existing alternatives.
- - Use setup_env.sh or setup_env.bat
- - NOTE: You must have git, ant/bin, android/tools in your enviroment path
+### 2. Building with Ant:
- 2. Building with eclipse:
+NOTE: You must have the Android SDK 'tools/', and 'platforms-tools/' folders in your environment path variable.
+
+* Run "ant clean" .
+* Run "ant debug" to generate a debuggable version of the ownCloud app.
+
+### 3. Building with console/maven:
+
+NOTE: You must have mvn (version >= 3.1.1) in your environment path. Current Android 'platforms-tools' need to be installed.
- - Run ant clean debug
- - Open Eclipse and import *actionbarsherlock/library* project to your workspace
- - NOTE: You must have 'tools' and 'platforms-tools' in your path in order to run setup_env.sh
+Download/install Android plugin for Maven, install owncloud-android-library, then build ownCloud with mvn:
- After those actions you should be good to go.
+* cd ..
+* git clone https://github.com/mosabua/maven-android-sdk-deployer.git
+* cd maven-android-sdk-deployer
+* mvn -pl com.simpligility.android.sdk-deployer:android-19 -am install
+* cd ../android/owncloud-android-library
+* mvn install
+* cd ..
- HAVE FUN!
+Now you can create ownCloud APK using "mvn package"
+
+### 4. Building with Eclipse:
+
+NOTE: You must have the Android SDK 'tools/', and 'platforms-tools/' folders in your environment path variable.
+
+* Complete the setup of project properties and resolve pending dependencies running "setup_env.bat" or "./setup_env.sh" .
+* Open Eclipse and create new "Android Project from Existing Code". Choose android/actionbarsherlock/library as root.
+* Clean project and compile.
+* If any error appear, check the project properties; in the 'Android' section, API Level should be greater or equal than 14.
+* Make sure android/actionbarsherlock/library/bin/library.jar was created.
+* Create a new "Android Project from Existing Code". Choose android/owncloud-android-library as root.
+* Clean project and compile.
+* If any error appear, check the project properties; in the 'Android' section, API Level should be 19 or greater.
+* Make sure android/owncloud-android-library/bin/classes.jar was created.
+* Import ownCloud Android project.
+* Clean project and compile.
+* If any error appears, check the project properties of owncloud-android project; in the 'Android' section:
+ - API Level should be 19 or greater.
+ - Two library projects should appear referred in the bottom square: actionbarsherlock/library and owncloud-android-library. Add them if needed.
+* After those actions you should be good to go. HAVE FUN!
+
+NOTE: Even though API level is set to 19, APK also runs on older devices because in AndroidManifest.xml minSdkVersion is set to 8.
+
+### 5. Create pull request:
+
+NOTE: You must sign the [Contributor Agreement][1] before your changes can be accepted!
+* Commit your changes locally: "git commit -a"
+* Push your changes to your Github repo: "git push"
+* Browse to https://github.com/YOURGITHUBNAME/android/pulls and issue pull request
+* Click "Edit" and set "base:develop"
+* Again, click "Edit" and set "compare:develop"
+* Enter description and send pull request.
+### 6. Create another pull request:
+To make sure your new pull request does not contain commits which are already contained in previous PRs, create a new branch which is a clone of upstream/develop.
+* git fetch upstream
+* git checkout -b my_new_develop_branch upstream/develop
+* If you want to rename that branch later: "git checkout -b my_new_develop_branch_with_new_name"
+* Push branch to server: "git push -u origin name_of_local_develop_branch"
+* Use Github to issue PR
+[0]: https://github.com/owncloud/android/blob/master/CONTRIBUTING.md
+[1]: http://owncloud.org/about/contributor-agreement/
Original license document included at libs/LICENSE.txt
See http://jackrabbit.apache.org/
- * Transifex client.JavaMail API, version 1.4.3
+ * Transifex client.
Copyright (C) Transifex.
Licensed under GNU General Public License.
Placed at third_party/transifex-client.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<profiles version="12">
-<profile kind="CodeFormatterProfile" name="Owncloud" version="12">
+<profile kind="CodeFormatterProfile" name="OwnCloud-Convention" version="12">
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="32"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.compiler.source" value="1.7"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
+<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="8"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
-<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="tab"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
-<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="2"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="120"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="2"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="0"/>
-<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.7"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="49"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="2"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<lint>
+</lint>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
- <classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
+ <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
+ <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
+ <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="output" path="bin/classes"/>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.owncloud.android.workaround.accounts"
- android:versionCode="0100002"
- android:versionName="1.0.2" >
+ android:versionCode="0100014"
+ android:versionName="1.0.14" >
<uses-sdk
android:minSdkVersion="16"
- android:targetSdkVersion="16" />
+ android:targetSdkVersion="19" />
<application
android:allowBackup="false"
- android:icon="@drawable/oc_workaround_icon"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
+ android:icon="@drawable/workaround_app_icon"
+ android:label="@string/workaround_app_name"
+ >
<service
android:name=".AccountAuthenticatorService"
android:exported="false">
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="oc_jb_workaround" default="help">
+
+ <!-- The local.properties file is created and updated by the 'android' tool.
+ It contains the path to the SDK. It should *NOT* be checked into
+ Version Control Systems. -->
+ <property file="local.properties" />
+
+ <!-- The ant.properties file can be created by you. It is only edited by the
+ 'android' tool to add properties to it.
+ This is the place to change some Ant specific build properties.
+ Here are some properties you may want to change/update:
+
+ source.dir
+ The name of the source directory. Default is 'src'.
+ out.dir
+ The name of the output directory. Default is 'bin'.
+
+ For other overridable properties, look at the beginning of the rules
+ files in the SDK, at tools/ant/build.xml
+
+ Properties related to the SDK location or the project target should
+ be updated using the 'android' tool with the 'update' action.
+
+ This file is an integral part of the build system for your
+ application and should be checked into Version Control Systems.
+
+ -->
+ <property file="ant.properties" />
+
+ <!-- if sdk.dir was not set from one of the property file, then
+ get it from the ANDROID_HOME env var.
+ This must be done before we load project.properties since
+ the proguard config can use sdk.dir -->
+ <property environment="env" />
+ <condition property="sdk.dir" value="${env.ANDROID_HOME}">
+ <isset property="env.ANDROID_HOME" />
+ </condition>
+
+ <!-- The project.properties file is created and updated by the 'android'
+ tool, as well as ADT.
+
+ This contains project specific properties such as project target, and library
+ dependencies. Lower level build properties are stored in ant.properties
+ (or in .classpath for Eclipse projects).
+
+ This file is an integral part of the build system for your
+ application and should be checked into Version Control Systems. -->
+ <loadproperties srcFile="project.properties" />
+
+ <!-- quick check on sdk.dir -->
+ <fail
+ message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
+ unless="sdk.dir"
+ />
+
+ <!--
+ Import per project custom build rules if present at the root of the project.
+ This is the place to put custom intermediary targets such as:
+ -pre-build
+ -pre-compile
+ -post-compile (This is typically used for code obfuscation.
+ Compiled code location: ${out.classes.absolute.dir}
+ If this is not done in place, override ${out.dex.input.absolute.dir})
+ -post-package
+ -post-build
+ -pre-clean
+ -->
+ <import file="custom_rules.xml" optional="true" />
+
+ <!-- Import the actual build file.
+
+ To customize existing targets, there are two options:
+ - Customize only one target:
+ - copy/paste the target into this file, *before* the
+ <import> task.
+ - customize it to your needs.
+ - Customize the whole content of build.xml
+ - copy/paste the content of the rules files (minus the top node)
+ into this file, replacing the <import> task.
+ - customize to your needs.
+
+ ***********************
+ ****** IMPORTANT ******
+ ***********************
+ In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
+ in order to avoid having your file be overridden by tools such as "android update project"
+ -->
+ <!-- version-tag: 1 -->
+ <import file="${sdk.dir}/tools/ant/build.xml" />
+
+</project>
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
-target=android-16
+target=android-17
+++ /dev/null
-<resources>
-
- <!--
- Base application theme for API 11+. This theme completely replaces
- AppBaseTheme from res/values/styles.xml on API 11+ devices.
- -->
- <style name="AppBaseTheme" parent="android:Theme.Holo.Light">
- <!-- API 11 theme customizations can go here. -->
- </style>
-
-</resources>
\ No newline at end of file
+++ /dev/null
-<resources>
-
- <!--
- Base application theme for API 14+. This theme completely replaces
- AppBaseTheme from BOTH res/values/styles.xml and
- res/values-v11/styles.xml on API 14+ devices.
- -->
- <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
- <!-- API 14 theme customizations can go here. -->
- </style>
-
-</resources>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ownCloud Android client application
+
+ Copyright (C) 2012-2013 ownCloud Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2,
+ as published by the Free Software Foundation.
+
+ 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.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+-->
+<resources>
+
+ <string name="workaround_app_name">ownCloud Jelly Bean Workaround for lost credentials</string>
+ <string name="main_app_name">ownCloud</string>
+ <string name="account_type">owncloud</string>
+
+</resources>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
- <string name="app_name">ownCloud Jelly Bean Workaround for lost credentials</string>
- <string name="oc_app_name">ownCloud</string>
-
-</resources>
\ No newline at end of file
+++ /dev/null
-<resources>
-
- <!--
- Base application theme, dependent on API level. This theme is replaced
- by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
- -->
- <style name="AppBaseTheme" parent="android:Theme.Light">
- <!--
- Theme customizations available in newer API levels can go in
- res/values-vXX/styles.xml, while customizations related to
- backward-compatibility can go here.
- -->
- </style>
-
- <!-- Application theme. -->
- <style name="AppTheme" parent="AppBaseTheme">
- <!-- All customizations that are NOT specific to a particular API-level can go here. -->
- </style>
-
-</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
- android:accountType="owncloud"
- android:icon="@drawable/oc_icon"
- android:label="@string/oc_app_name"
- android:smallIcon="@drawable/oc_icon">
+ android:accountType="@string/account_type"
+ android:icon="@drawable/main_app_icon"
+ android:label="@string/main_app_name"
+ android:smallIcon="@drawable/main_app_icon">
</account-authenticator>
\ No newline at end of file
public class AccountAuthenticatorService extends Service {
private AccountAuthenticator mAuthenticator;
- static final public String ACCOUNT_TYPE = "owncloud";
+ //static final public String ACCOUNT_TYPE = "owncloud";
@Override
public void onCreate() {
--- /dev/null
+Subproject commit d066e9da51a04837504f9be3e266bdc82caabc64
<modelVersion>4.0.0</modelVersion>
<groupId>com.owncloud.android</groupId>
<artifactId>owncloud</artifactId>
- <version>1.3.21-SNAPSHOT</version>
+ <version>${owncloud.version}</version>
<packaging>apk</packaging>
<name>Owncloud Android</name>
<properties>
+ <owncloud.version>1.5.1-SNAPSHOT</owncloud.version>
<java-version>1.6</java-version>
- <google.android-version>4.1.1.4</google.android-version>
- <google.android.support-version>r7</google.android.support-version>
+ <!-- Given by maven-android-sdk-deployer -->
+ <google.android-version>4.4.2_r2</google.android-version>
+ <!-- Usually the latest Android API -->
+ <google.android-api>19</google.android-api>
<actionbarsherlock-version>4.2.0</actionbarsherlock-version>
</properties>
<developerConnection>scm:git:git@github.com:owncloud/android.git</developerConnection>
<url>https://github.com/owncloud/android</url>
</scm>
-
+
<dependencies>
<dependency>
- <groupId>com.google.android</groupId>
+ <groupId>android</groupId>
<artifactId>android</artifactId>
<version>${google.android-version}</version>
<scope>provided</scope>
</dependency>
<dependency>
- <groupId>com.google.android</groupId>
- <artifactId>support-v4</artifactId>
- <version>${google.android.support-version}</version>
- </dependency>
-
- <dependency>
<groupId>com.actionbarsherlock</groupId>
<artifactId>actionbarsherlock</artifactId>
<version>${actionbarsherlock-version}</version>
<type>apklib</type>
</dependency>
+ <!-- MUST BE INSTALLED FIRST: cd owncloud-android-library; mvn install -->
<dependency>
- <groupId>org.apache.jackrabbit</groupId>
- <artifactId>jackrabbit-webdav</artifactId>
- <version>2.5.2</version>
- </dependency>
+ <groupId>com.owncloud.android</groupId>
+ <artifactId>owncloud-android-library</artifactId>
+ <version>${owncloud.version}</version>
+ </dependency>
</dependencies>
<plugin>
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
<artifactId>android-maven-plugin</artifactId>
- <version>3.5.0</version>
+ <version>3.8.0</version>
<configuration>
<sdk>
- <!-- platform or api level (api level 4 = platform 1.6)-->
<path>${env.ANDROID_HOME}</path>
- <platform>17</platform>
+ <platform>${google.android-api}</platform>
</sdk>
</configuration>
<extensions>true</extensions>
# project structure.
# Project target.
-target=android-17
+target=android-19
android.library.reference.1=actionbarsherlock/library
+android.library.reference.2=owncloud-android-library
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ownCloud Android client application
-
- Copyright (C) 2012 Bartek Przybylski
- Copyright (C) 2012-2013 ownCloud Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License version 2,
- as published by the Free Software Foundation.
-
- 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.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
--->
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <gradient android:endColor="#8dc73f" android:centerColor="#d4d4d4"
- android:startColor="#d4d4d4">
- <stroke android:width="1dp" android:color="#8dc73f">
- <corners android:radius="5dp">
- <padding android:left="7dp" android:top="7dp" android:right="7dp"
- android:bottom="7dp">
- </padding>
- </corners>
- </stroke>
- </gradient>
-</shape>
<item android:drawable="@color/owncloud_blue_bright" android:state_pressed="true"/>
<item android:drawable="@color/owncloud_blue_bright" android:state_focused="true"/>
- <item android:drawable="@color/owncloud_white" />
+ <item android:drawable="@color/background_color" />
</selector>
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
- android:startColor="#1D2D44"
- android:endColor="#1D2D44"
+ android:startColor="@color/actionbar_start_color"
+ android:endColor="@color/actionbar_end_color"
android:angle="270"
/>
<corners android:radius="0dp" />
-<?xml version="1.0" encoding="utf-8"?>
-<!--
+<?xml version="1.0" encoding="utf-8"?>\r
+<!--\r
ownCloud Android client application\r
\r
- Copyright (C) 2012 Bartek Przybylski
- Copyright (C) 2012-2013 ownCloud Inc.
+ Copyright (C) 2012 Bartek Przybylski\r
+ Copyright (C) 2012-2013 ownCloud Inc.\r
\r
This program is free software: you can redistribute it and/or modify\r
- it under the terms of the GNU General Public License version 2,
+ it under the terms of the GNU General Public License version 2,\r
as published by the Free Software Foundation.\r
\r
This program is distributed in the hope that it will be useful,\r
\r
You should have received a copy of the GNU General Public License\r
along with this program. If not, see <http://www.gnu.org/licenses/>.\r
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:oc="http://schemas.android.com/apk/res/com.owncloud.android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:focusable="true"
- android:gravity="center|fill"
- android:orientation="vertical" >
-
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
- android:layout_weight="1" >
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
-
- <ImageView
- android:id="@+id/imageView1"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_margin="7dp"
- android:layout_weight="1"
- android:src="@drawable/owncloud_logo" />
-
- <LinearLayout
- android:id="@+id/LinearLayout1"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1"
- android:orientation="vertical" >
-
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1" >
-
- <EditText
- android:id="@+id/host_URL"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:ems="10"
- android:hint="@string/auth_host_url"
- android:inputType="textNoSuggestions">
- <requestFocus />
- </EditText>
-
- <ImageView
- android:id="@+id/refreshButton"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="right|center_vertical"
- android:src="@drawable/ic_action_refresh_black"
- android:visibility="invisible" />
- </FrameLayout>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="50dp"
- android:layout_weight="1" >
-
- <ImageView
- android:id="@+id/action_indicator"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="5dp"
- android:layout_marginRight="5dp"
- android:src="@android:drawable/stat_notify_sync"
- android:visibility="invisible" />
-
- <TextView
- android:id="@+id/status_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="TextView"
- android:visibility="invisible" />
- </LinearLayout>
-
- <TextView
- android:id="@+id/textView2"
- android:layout_width="wrap_content"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:text="@string/auth_login_details"
- android:textAppearance="?android:attr/textAppearanceSmall" />
-
- <EditText
- android:id="@+id/account_username"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:ems="10"
- android:hint="@string/auth_username"
- android:inputType="textNoSuggestions" />
-
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1" >
-
- <EditText
- android:id="@+id/account_password"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:ems="10"
- android:hint="@string/auth_password"
- android:inputType="textPassword"/>
-
- <ImageView
- android:id="@+id/viewPassword"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="right|center_vertical"
- android:src="@android:drawable/ic_menu_view"
- android:visibility="invisible" />
- </FrameLayout>
- </LinearLayout>
- </LinearLayout>
- </FrameLayout>
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true" >
-
- <LinearLayout
- android:id="@+id/buttons_layout"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:weightSum="1">
-
- <Button
- android:id="@+id/buttonCancel"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight=".5"
- android:onClick="onCancelClick"
- android:text="@string/common_cancel" />
-
- <Button
- android:id="@+id/buttonOK"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight=".5"
- android:enabled="false"
- android:onClick="onOkClick"
- android:text="@string/setup_btn_connect"
- android:textColor="@android:color/black" />
-
- </LinearLayout>
-
- <Button
- android:id="@+id/account_register"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/buttons_layout"
- android:layout_centerHorizontal="true"
- android:onClick="onRegisterClick"
- android:paddingTop="10dp"
- android:paddingBottom="10dp"
- android:textColor="#0000FF"
- android:background="@android:color/transparent" />
- <!-- android:text="@string/app_name @string/auth_register" /-->
-
- </RelativeLayout>
-
-</LinearLayout>
+-->\r
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="match_parent"\r
+ android:background="@color/login_background_color"\r
+ android:padding="8dip"\r
+ >\r
+\r
+ <LinearLayout\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:layout_above="@+id/bottom_block"\r
+ android:layout_alignParentTop="true"\r
+ android:orientation="horizontal" >\r
+ \r
+ <ImageView\r
+ android:id="@+id/imageView1"\r
+ android:layout_width="0dp"\r
+ android:layout_height="wrap_content"\r
+ android:layout_weight="1"\r
+ android:layout_gravity="center"\r
+ android:background="@color/login_logo_background_color"\r
+ android:src="@drawable/logo" \r
+ />\r
+ \r
+ <ScrollView\r
+ android:layout_width="0dp"\r
+ android:layout_height="match_parent"\r
+ android:layout_weight="1"\r
+ android:id="@+id/scroll"\r
+ android:fillViewport="true"\r
+ android:orientation="vertical" >\r
+ \r
+ <LinearLayout\r
+ android:id="@+id/LinearLayout1"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:gravity="center"\r
+ android:orientation="vertical"\r
+ android:padding="8dp" >\r
+ \r
+ <Button\r
+ android:id="@+id/centeredRefreshButton"\r
+ android:layout_width="wrap_content"\r
+ android:layout_height="wrap_content"\r
+ android:layout_gravity="center_horizontal"\r
+ android:layout_marginBottom="10dp"\r
+ android:onClick="onRefreshClick"\r
+ android:text="@string/auth_check_server"\r
+ android:visibility="gone" />\r
+ <TextView\r
+ android:id="@+id/instructions_message"\r
+ android:layout_width="wrap_content"\r
+ android:layout_height="wrap_content"\r
+ android:layout_gravity="fill_horizontal"\r
+ android:text="@string/auth_expired_basic_auth_toast" \r
+ android:visibility="gone"\r
+ android:layout_marginBottom="10dp"/>\r
+ <FrameLayout \r
+ android:id="@+id/hostUrlFrame"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:layout_marginBottom="10dp"\r
+ >\r
+ <EditText\r
+ android:id="@+id/hostUrlInput"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:layout_gravity="bottom"\r
+ android:hint="@string/auth_host_url"\r
+ android:inputType="textUri"\r
+ android:drawablePadding="5dp"\r
+ android:paddingRight="55dp"\r
+ >\r
+ <requestFocus />\r
+ </EditText>\r
+ <ImageButton\r
+ android:id="@+id/embeddedRefreshButton"\r
+ android:layout_width="48dp"\r
+ android:layout_height="48dp"\r
+ android:layout_gravity="center_vertical|right"\r
+ android:layout_marginRight="5dp"\r
+ android:padding="0dp"\r
+ android:scaleType="fitCenter"\r
+ android:src="@drawable/ic_action_refresh_black"\r
+ android:onClick="onRefreshClick"\r
+ android:visibility="gone"\r
+ android:background="@android:color/transparent"\r
+ />\r
+ </FrameLayout>\r
+ \r
+ <TextView\r
+ android:id="@+id/server_status_text"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:layout_marginBottom="10dp"\r
+ android:drawableLeft="@android:drawable/stat_notify_sync"\r
+ android:drawablePadding="5dp"\r
+ android:gravity="center_vertical"\r
+ android:text="@string/auth_testing_connection" />\r
+ \r
+ <CheckBox\r
+ android:id="@+id/oauth_onOff_check"\r
+ android:layout_width="wrap_content"\r
+ android:layout_height="wrap_content"\r
+ android:checked="false"\r
+ android:onClick="onCheckClick"\r
+ android:text="@string/oauth_check_onoff"\r
+ android:textAppearance="?android:attr/textAppearanceSmall"\r
+ />\r
+ \r
+ <EditText\r
+ android:id="@+id/oAuthEntryPoint_1"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:ems="10"\r
+ android:enabled="false"\r
+ android:text="@string/oauth2_url_endpoint_auth"\r
+ android:singleLine="true"\r
+ android:inputType="textUri"\r
+ android:visibility="gone" >\r
+ </EditText> \r
+ \r
+ <EditText\r
+ android:id="@+id/oAuthEntryPoint_2"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:ems="10"\r
+ android:enabled="false"\r
+ android:text="@string/oauth2_url_endpoint_access"\r
+ android:singleLine="true"\r
+ android:inputType="textUri"\r
+ android:visibility="gone" >\r
+ <requestFocus />\r
+ </EditText> \r
+ \r
+ <EditText\r
+ android:id="@+id/account_username"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:ems="10"\r
+ android:hint="@string/auth_username"\r
+ android:inputType="textNoSuggestions" />\r
+ \r
+ <EditText\r
+ android:id="@+id/account_password"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:ems="10"\r
+ android:hint="@string/auth_password"\r
+ android:inputType="textPassword"\r
+ android:drawablePadding="5dp"\r
+ />\r
+ \r
+ <TextView\r
+ android:id="@+id/auth_status_text"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:gravity="center_vertical"\r
+ android:text="@string/auth_unauthorized"\r
+ android:drawableLeft="@android:drawable/stat_notify_sync"\r
+ android:drawablePadding="5dip"\r
+ />\r
+\r
+ </LinearLayout>\r
+ \r
+ </ScrollView>\r
+ \r
+ </LinearLayout>\r
+ \r
+ <LinearLayout\r
+ android:id="@id/bottom_block"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:layout_alignParentBottom="true"\r
+ android:orientation="vertical" >\r
+ \r
+ <Button\r
+ android:id="@+id/buttonOK"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:layout_gravity="center_horizontal"\r
+ android:enabled="false"\r
+ android:onClick="onOkClick"\r
+ android:text="@string/setup_btn_connect" />\r
+ \r
+ <Button\r
+ android:id="@+id/welcome_link"\r
+ android:layout_width="wrap_content"\r
+ android:layout_height="wrap_content"\r
+ android:layout_gravity="center_horizontal"\r
+ android:background="@android:color/transparent"\r
+ android:onClick="onRegisterClick"\r
+ android:paddingBottom="5dp"\r
+ android:paddingTop="5dp"\r
+ android:text="@string/auth_register"\r
+ android:textColor="#0000FF"/>\r
+ </LinearLayout>\r
+ \r
+</RelativeLayout>\r
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>\r
-<!--\r
- ownCloud Android client application\r
-\r
- Copyright (C) 2011 Bartek Przybylski\r
- Copyright (C) 2012-2013 ownCloud Inc.\r
-\r
- This program is free software: you can redistribute it and/or modify\r
- it under the terms of the GNU General Public License version 2,\r
- as published by the Free Software Foundation.\r
-\r
- This program is distributed in the hope that it will be useful,\r
- but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- GNU General Public License for more details.\r
-\r
- You should have received a copy of the GNU General Public License\r
- along with this program. If not, see <http://www.gnu.org/licenses/>.\r\r
--->\r
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"\r
- android:layout_width="fill_parent"\r
- android:layout_height="fill_parent"\r
- android:background="@color/owncloud_white"\r
- android:orientation="horizontal" >\r
-\r
- <LinearLayout\r
- android:id="@+id/file_list_container"\r
- android:layout_width="0dp"\r
- android:layout_height="fill_parent"\r
- android:layout_weight="1" >\r
-\r
- <fragment\r
- android:id="@+id/fileList"\r
- android:layout_width="fill_parent"\r
- android:layout_height="fill_parent"\r
- class="com.owncloud.android.ui.fragment.OCFileListFragment" >\r
-\r
- <!-- Preview: layout=@layout/list_layout -->\r
- </fragment>\r
- </LinearLayout>\r
-\r
- <LinearLayout android:id="@+id/file_details_container"\r
- android:layout_width="0dp"\r
- android:layout_height="fill_parent"\r
- android:layout_weight="2" >\r
-\r
- <!-- Preview: layout=@layout/file_details_empty -->\r
- </LinearLayout>\r
-\r
-</LinearLayout>\r
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ownCloud Android client application
+
+ Copyright (C) 2012-2014 ownCloud Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2,
+ as published by the Free Software Foundation.
+
+ 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.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/list_item"
+ android:layout_width="match_parent"
+ android:layout_height="48dp"
+ android:paddingStart="16dip"
+ android:paddingEnd="16dip"
+ android:paddingRight="16dip"
+ android:paddingLeft="16dip"
+ android:minWidth="196dip"
+ android:background="?android:attr/activatedBackgroundIndicator"
+ android:orientation="vertical" >
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:duplicateParentState="true" >
+
+ <ImageView
+ android:id="@+id/icon"
+ android:layout_width="40dip"
+ android:layout_height="40dip"
+ android:layout_gravity="center_vertical"
+ android:layout_marginEnd="8dip"
+ android:layout_marginRight="8dip"
+ android:duplicateParentState="true" />
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:textAppearance="?android:attr/textAppearanceLargePopupMenu"
+ android:duplicateParentState="true"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal" />
+
+ </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ownCloud Android client application
+ Copyright (C) 2014 ownCloud Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2,
+ as published by the Free Software Foundation.
+
+ 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.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ >
+ <ImageView android:id="@+id/icon"
+ android:layout_width="@android:dimen/notification_large_icon_width"
+ android:layout_height="@android:dimen/notification_large_icon_height"
+ android:scaleType="center"
+ />
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:minHeight="64dp"
+ android:orientation="vertical"
+ android:paddingRight="12dp"
+ android:paddingLeft="12dp"
+ >
+ <TextView android:id="@+id/title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal"
+ style="@style/Theme.ownCloud.NotificationText.Title"
+ />
+ <TextView android:id="@+id/text"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="-2dp"
+ android:layout_marginBottom="-2dp"
+ android:singleLine="true"
+ android:fadingEdge="horizontal"
+ android:ellipsize="marquee"
+ style="@style/Theme.ownCloud.NotificationText.Content"
+ />
+ <FrameLayout android:id="@+id/progressHolder"
+ android:layout_width="match_parent"
+ android:layout_height="12dp"
+ >
+ <!-- the FrameLayout is needed to change visibility of the
+ progress bar in Android 2.2, even though
+ https://code.google.com/p/android/issues/detail?id=11040 -->
+ <ProgressBar
+ android:id="@+id/progress"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ style="?android:attr/progressBarStyleHorizontal"
+ />
+ </FrameLayout>
+ </LinearLayout>
+</LinearLayout>
\ No newline at end of file
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@color/owncloud_white"
+ android:background="@color/background_color"
android:id="@+id/explanation"
android:orientation="vertical">
android:layout_weight="2"
android:padding="10dip"
android:scrollbarAlwaysDrawVerticalTrack="true"
- android:text="@string/text_placeholder"
+ android:text="@string/placeholder_sentence"
/>
<ListView
-<?xml version="1.0" encoding="utf-8"?>
-<!--
+<?xml version="1.0" encoding="utf-8"?>\r
+<!--\r
ownCloud Android client application\r
\r
- Copyright (C) 2012 Bartek Przybylski
- Copyright (C) 2012-2013 ownCloud Inc.
+ Copyright (C) 2012 Bartek Przybylski\r
+ Copyright (C) 2012-2013 ownCloud Inc.\r
\r
This program is free software: you can redistribute it and/or modify\r
- it under the terms of the GNU General Public License version 2,
+ it under the terms of the GNU General Public License version 2,\r
as published by the Free Software Foundation.\r
\r
This program is distributed in the hope that it will be useful,\r
\r
You should have received a copy of the GNU General Public License\r
along with this program. If not, see <http://www.gnu.org/licenses/>.\r
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:focusable="true"
- android:gravity="center|fill"
- android:orientation="vertical" >
-
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
- android:layout_weight="1" >
-
- <LinearLayout
- android:id="@+id/LinearLayout1"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_weight="1"
- android:orientation="vertical" >
-
- <ImageView
- android:id="@+id/imageView1"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="10dp"
- android:layout_weight="1"
- android:src="@drawable/owncloud_logo" />
-
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1" >
-
- <EditText
- android:id="@+id/host_URL"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:ems="10"
- android:hint="@string/auth_host_url"
- android:inputType="textNoSuggestions" >
- <requestFocus />
- </EditText>
-
- <ImageView
- android:id="@+id/refreshButton"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/ic_action_refresh_black"
- android:layout_gravity="right|center_vertical"
- android:visibility="invisible" />
-
- </FrameLayout>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="50dp"
- android:layout_weight="1" >
-
- <ImageView
- android:id="@+id/action_indicator"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="5dp"
- android:layout_marginRight="5dp"
- android:src="@android:drawable/stat_notify_sync"
- android:visibility="invisible" />
-
- <TextView
- android:id="@+id/status_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="TextView"
- android:visibility="invisible" />
-
- </LinearLayout>
-
- <TextView
- android:id="@+id/textView2"
- android:layout_width="wrap_content"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:text="@string/auth_login_details"
- android:textAppearance="?android:attr/textAppearanceSmall" />
-
- <EditText
- android:id="@+id/account_username"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:ems="10"
- android:hint="@string/auth_username"
- android:inputType="textNoSuggestions" />
-
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1" >
-
- <EditText
- android:id="@+id/account_password"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:ems="10"
- android:hint="@string/auth_password"
- android:inputType="textPassword"/>
-
- <ImageView
- android:id="@+id/viewPassword"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="right|center_vertical"
- android:src="@android:drawable/ic_menu_view"
- android:visibility="invisible" />
-
- </FrameLayout>
-
- </LinearLayout>
-
- </FrameLayout>
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
-
- <LinearLayout
- android:id="@+id/buttons_layout"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:weightSum="1" >
-
- <Button
- android:id="@+id/buttonCancel"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight=".5"
- android:onClick="onCancelClick"
- android:text="@string/common_cancel" />
-
- <Button
- android:id="@+id/buttonOK"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight=".5"
- android:enabled="false"
- android:onClick="onOkClick"
- android:text="@string/setup_btn_connect"
- android:textColor="@android:color/black" />
-
- </LinearLayout>
-
- <Button
- android:id="@+id/account_register"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/buttons_layout"
- android:layout_centerHorizontal="true"
- android:onClick="onRegisterClick"
- android:paddingTop="10dp"
- android:paddingBottom="10dp"
- android:textColor="#0000FF"
- android:background="@android:color/transparent" />
- <!-- android:text="@string/app_name @string/auth_register" /-->
-
- </RelativeLayout>
-
-</LinearLayout>
+-->\r
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="match_parent"\r
+ android:layout_gravity="center"\r
+ android:fillViewport="true"\r
+ android:orientation="vertical" \r
+ android:id="@+id/scroll"\r
+ >\r
+\r
+ <LinearLayout\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:background="@color/login_background_color"\r
+ android:gravity="center"\r
+ android:orientation="vertical"\r
+ android:padding="8dp" >\r
+\r
+ <ImageView\r
+ android:id="@+id/imageView1"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:layout_marginBottom="10dp"\r
+ android:layout_marginTop="10dp"\r
+ android:background="@color/login_logo_background_color"\r
+ android:src="@drawable/logo" />\r
+\r
+ <Button\r
+ android:id="@+id/centeredRefreshButton"\r
+ android:layout_width="wrap_content"\r
+ android:layout_height="wrap_content"\r
+ android:layout_gravity="center_horizontal"\r
+ android:layout_marginBottom="10dp"\r
+ android:onClick="onRefreshClick"\r
+ android:text="@string/auth_check_server"\r
+ android:visibility="gone" />\r
+ \r
+ <TextView\r
+ android:id="@+id/instructions_message"\r
+ android:layout_width="wrap_content"\r
+ android:layout_height="wrap_content"\r
+ android:layout_gravity="fill_horizontal"\r
+ android:text="@string/auth_expired_basic_auth_toast"\r
+ android:visibility="gone"\r
+ android:layout_marginBottom="10dp" />\r
+\r
+ <FrameLayout \r
+ android:id="@+id/hostUrlFrame"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:layout_marginBottom="10dp"\r
+ >\r
+ <EditText\r
+ android:id="@+id/hostUrlInput"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:layout_gravity="bottom"\r
+ android:hint="@string/auth_host_url"\r
+ android:inputType="textUri"\r
+ android:drawablePadding="5dp"\r
+ android:paddingRight="55dp"\r
+ >\r
+ <requestFocus />\r
+ </EditText>\r
+ <ImageButton\r
+ android:id="@+id/embeddedRefreshButton"\r
+ android:layout_width="48dp"\r
+ android:layout_height="48dp"\r
+ android:layout_gravity="center_vertical|right"\r
+ android:layout_marginRight="5dp"\r
+ android:padding="0dp"\r
+ android:scaleType="fitCenter"\r
+ android:src="@drawable/ic_action_refresh_black"\r
+ android:onClick="onRefreshClick"\r
+ android:visibility="gone"\r
+ android:background="@android:color/transparent"\r
+ />\r
+ </FrameLayout>\r
+\r
+ <TextView\r
+ android:id="@+id/server_status_text"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:layout_marginBottom="10dp"\r
+ android:drawableLeft="@android:drawable/stat_notify_sync"\r
+ android:drawablePadding="5dp"\r
+ android:gravity="center_vertical"\r
+ android:text="@string/auth_testing_connection" />\r
+\r
+ <CheckBox\r
+ android:id="@+id/oauth_onOff_check"\r
+ android:layout_width="wrap_content"\r
+ android:layout_height="wrap_content"\r
+ android:checked="false"\r
+ android:onClick="onCheckClick"\r
+ android:text="@string/oauth_check_onoff"\r
+ android:textAppearance="?android:attr/textAppearanceSmall"\r
+ />\r
+\r
+ <EditText\r
+ android:id="@+id/oAuthEntryPoint_1"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:ems="10"\r
+ android:enabled="false"\r
+ android:text="@string/oauth2_url_endpoint_auth"\r
+ android:singleLine="true"\r
+ android:inputType="textUri"\r
+ android:visibility="gone" >\r
+ </EditText>\r
+\r
+ <EditText\r
+ android:id="@+id/oAuthEntryPoint_2"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:ems="10"\r
+ android:enabled="false"\r
+ android:text="@string/oauth2_url_endpoint_access"\r
+ android:singleLine="true"\r
+ android:inputType="textUri"\r
+ android:visibility="gone" />\r
+\r
+ <EditText\r
+ android:id="@+id/account_username"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:ems="10"\r
+ android:hint="@string/auth_username"\r
+ android:inputType="textNoSuggestions" \r
+ />\r
+\r
+ <EditText\r
+ android:id="@+id/account_password"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:drawablePadding="5dp"\r
+ android:ems="10"\r
+ android:hint="@string/auth_password"\r
+ android:inputType="textPassword" \r
+ />\r
+ \r
+ <TextView\r
+ android:id="@+id/auth_status_text"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:layout_marginBottom="10dp"\r
+ android:drawableLeft="@android:drawable/stat_notify_sync"\r
+ android:drawablePadding="5dp"\r
+ android:gravity="center_vertical"\r
+ android:text="@string/auth_unauthorized" />\r
+\r
+ <Button\r
+ android:id="@+id/buttonOK"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:layout_gravity="center_horizontal"\r
+ android:enabled="false"\r
+ android:onClick="onOkClick"\r
+ android:text="@string/setup_btn_connect" />\r
+\r
+ <Button\r
+ android:id="@+id/welcome_link"\r
+ android:layout_width="wrap_content"\r
+ android:layout_height="wrap_content"\r
+ android:background="@android:color/transparent"\r
+ android:onClick="onRegisterClick"\r
+ android:paddingBottom="5dp"\r
+ android:paddingTop="5dp"\r
+ android:text="@string/auth_register"\r
+ android:textColor="#0000FF"/>\r
+\r
+ </LinearLayout>\r
+\r
+</ScrollView>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ownCloud Android client application
+
+ Copyright (C) 2012-2014 ownCloud Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2,
+ as published by the Free Software Foundation.
+
+ 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.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/list_item"
+ android:layout_width="match_parent"
+ android:layout_height="48dp"
+ android:paddingRight="16dip"
+ android:paddingLeft="16dip"
+ android:minWidth="196dip"
+ android:orientation="vertical" >
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:duplicateParentState="true" >
+
+ <ImageView
+ android:id="@+id/icon"
+ android:layout_width="40dip"
+ android:layout_height="40dip"
+ android:layout_gravity="center_vertical"
+ android:layout_marginRight="8dip"
+ android:duplicateParentState="true" />
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:duplicateParentState="true"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal" />
+
+ </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/main_audio_view"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:orientation="vertical">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:text="Now playing:"
- android:textSize="25sp"
- android:textStyle="bold"
- />
- <TextView
- android:id="@+id/now_playing_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="20dip"
- android:layout_marginLeft="10dip"
- android:layout_marginRight="10dip"
- android:layout_gravity="center"
- android:text="Now playing.."
- android:textSize="16sp"
- android:textStyle="italic"
- />
-</LinearLayout>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ownCloud Android client application
-
- Copyright (C) 2012 Bartek Przybylski
- Copyright (C) 2012-2013 ownCloud Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License version 2,
- as published by the Free Software Foundation.
-
- 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.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="#F7F7F7"
- android:focusable="true"
- android:orientation="vertical" >
-
- <TextView
- android:id="@+id/textView1"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="Large Text"/>
-
-</LinearLayout>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ownCloud Android client application
-
- Copyright (C) 2012 Bartek Przybylski
- Copyright (C) 2012-2013 ownCloud Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License version 2,
- as published by the Free Software Foundation.
-
- 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.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/extensions_avail"
- android:layout_width="wrap_content" android:layout_height="wrap_content"
- android:layout_gravity="center" android:orientation="vertical" >
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="7dp"
- android:text="@string/extensions_avail_message" />
-
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_margin="5dp"
- android:weightSum="1.0" >
-
- <Button
- android:id="@+id/buttonNo"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/common_no"
- android:layout_weight="0.5"/>
-
- <Button
- android:id="@+id/buttonYes"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/common_yes"
- android:layout_weight="0.5"/>
-
- </LinearLayout>
-
-</LinearLayout>
\ No newline at end of file
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"\r
android:layout_width="fill_parent"\r
android:layout_height="fill_parent"\r
- android:background="@color/owncloud_white"\r
+ android:background="@color/background_color"\r
android:orientation="vertical"\r
android:id="@+id/failed_files_list_view">\r
\r
android:id="@+id/failed_upload_message_view"\r
android:layout_width="fill_parent"\r
android:layout_height="fill_parent"\r
- android:background="@color/owncloud_white"\r
+ android:background="@color/background_color"\r
android:orientation="vertical" >\r
\r
<TextView android:id="@+id/faild_upload_message" \r
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>\r
-<!--\r
- ownCloud Android client application\r
-\r
- Copyright (C) 2012 Bartek Przybylski\r
- Copyright (C) 2012-2013 ownCloud Inc.\r
-\r
- This program is free software: you can redistribute it and/or modify\r
- it under the terms of the GNU General Public License version 2,\r
- as published by the Free Software Foundation.\r
-\r
- This program is distributed in the hope that it will be useful,\r
- but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- GNU General Public License for more details.\r
-\r
- You should have received a copy of the GNU General Public License\r
- along with this program. If not, see <http://www.gnu.org/licenses/>.\r
-\r
--->\r
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"\r
- android:layout_width="fill_parent"\r
- android:layout_height="fill_parent"\r
- android:orientation="vertical" >\r
-\r
- <LinearLayout\r
- android:id="@+id/fragment"\r
- android:layout_width="fill_parent"\r
- android:layout_height="fill_parent" >\r
- <!-- Preview: layout=@layout/file_details_fragment -->\r
- </LinearLayout>\r
-\r
-</LinearLayout>
\ No newline at end of file
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:background="#F7F7F7"
android:orientation="vertical" >
-->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fdScrollView"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" >
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ >
<RelativeLayout
android:layout_width="match_parent"
android:text="@string/downloader_download_in_progress_ticker"
/>
- <ProgressBar android:id="@+id/fdProgressBar"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:progressDrawable="@android:drawable/progress_horizontal"
- android:indeterminate="false"
- android:indeterminateOnly="false"
- />
-
<LinearLayout
+ android:id="@+id/fdProgressBlock"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:gravity="center_horizontal"
+ android:gravity="center"
android:layout_marginTop="12dp"
+ android:layout_marginBottom="12dp"
+ android:orientation="horizontal"
>
- <Button
- android:id="@+id/fdDownloadBtn"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="@string/filedetails_download" />
-
- <Button
- android:id="@+id/fdOpenBtn"
+ <ProgressBar
+ android:id="@+id/fdProgressBar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
- android:text="@string/filedetails_open" />
-
- </LinearLayout>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center_horizontal"
- android:layout_marginTop="12dp"
- >
-
- <Button
- android:id="@+id/fdRenameBtn"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="@string/common_rename" />
-
- <Button
- android:id="@+id/fdRemoveBtn"
- android:layout_width="0dp"
+ android:progressDrawable="@android:drawable/progress_horizontal"
+ android:indeterminate="false"
+ android:indeterminateOnly="false"
+ />
+
+ <ImageButton
+ android:id="@+id/fdCancelBtn"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="@string/common_remove" />
+ android:layout_marginLeft="12dp"
+ android:src="@drawable/btn_cancel"
+ android:background="@android:color/transparent"
+ />
</LinearLayout>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ownCloud Android client application
-
- Copyright (C) 2012 Bartek Przybylski
- Copyright (C) 2012-2013 ownCloud Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License version 2,
- as published by the Free Software Foundation.
-
- 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.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center_horizontal" android:gravity="center_horizontal">
- <ImageView android:layout_width="wrap_content"
- android:layout_height="wrap_content" android:src="@drawable/icon"
- android:id="@+id/imageView1" android:layout_gravity="center_vertical"></ImageView>
- <TextView android:text="TextView" android:id="@+id/textView1"
- android:layout_width="wrap_content" android:layout_height="wrap_content"
- android:layout_gravity="center_vertical" android:textSize="11pt"></TextView>
-</LinearLayout>
android:layout_marginBottom="15dp"
/>
- <ProgressBar android:id="@+id/progressBar"
- android:layout_width="match_parent"
+ <LinearLayout
+ android:id="@+id/fdProgressBlock"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:progressDrawable="@android:drawable/progress_horizontal"
- android:indeterminate="false"
- android:indeterminateOnly="false"
+ android:gravity="center"
+ android:layout_marginTop="12dp"
android:layout_marginBottom="15dp"
- />
-
- <Button
- android:id="@+id/cancelBtn"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/common_cancel"
- android:layout_marginBottom="15dp"
- />
-
+ android:orientation="horizontal"
+ >
+
+ <ProgressBar android:id="@+id/progressBar"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:progressDrawable="@android:drawable/progress_horizontal"
+ android:indeterminate="false"
+ android:indeterminateOnly="false"
+
+ />
+
+ <ImageButton
+ android:id="@+id/cancelBtn"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="12dp"
+ android:src="@drawable/btn_cancel"
+ android:background="@android:color/transparent"
+ />
+
+ </LinearLayout>
+
<ImageView
android:id="@+id/error_image"
android:layout_width="wrap_content"
android:id="@+id/top"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@color/owncloud_white"
+ android:background="@color/background_color"
android:gravity="center"
tools:context=".ui.fragment.FilePreviewFragment" >
android:layout_margin="16dp"
android:layout_gravity="center"
android:contentDescription="@string/preview_image_description"
- android:src="@drawable/owncloud_logo" />
+ android:src="@drawable/logo" />
<VideoView
android:id="@+id/video_preview"
along with this program. If not, see <http://www.gnu.org/licenses/>.\r
-->\r
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"\r
- android:layout_width="fill_parent"\r
- android:layout_height="fill_parent"\r
- android:background="@color/owncloud_white"\r
- android:orientation="vertical"\r
- android:id="@+id/file_list_view">\r
+ android:layout_width="match_parent"\r
+ android:layout_height="match_parent"\r
+ android:background="@color/background_color"\r
+ android:orientation="horizontal"\r
+ android:baselineAligned="false"\r
+ >\r
\r
- <fragment\r
- android:id="@+id/fileList"\r
- android:layout_width="fill_parent"\r
- android:layout_height="fill_parent"\r
- class="com.owncloud.android.ui.fragment.OCFileListFragment" >\r
-\r
- <!-- Preview: layout=@layout/list_layout -->\r
- </fragment>\r
-\r
-</LinearLayout>\r
+ <FrameLayout \r
+ android:layout_width="0dp"\r
+ android:layout_height="match_parent"\r
+ android:layout_weight="1"\r
+ android:id="@+id/left_fragment_container"\r
+ />\r
+ \r
+ <FrameLayout \r
+ android:layout_width="0dp"\r
+ android:layout_height="match_parent"\r
+ android:layout_weight="2"\r
+ android:id="@+id/right_fragment_container"\r
+ />\r
+ \r
+ </LinearLayout>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ownCloud Android client application
-
- Copyright (C) 2012-2013 ownCloud Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License version 2,
- as published by the Free Software Foundation.
-
- 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.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@color/owncloud_white"
- android:id="@+id/explanation"
- android:orientation="vertical">
-
- <TextView
- android:id="@+id/message"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="2"
- android:padding="10dip"
- android:scrollbarAlwaysDrawVerticalTrack="true"
- android:text="@string/text_placeholder"
- android:autoLink="all"
- />
-
- <!-- LinearLayout
- android:id="@+id/buttons"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:orientation="horizontal" >
-
- <Button
- android:id="@+id/ok"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="@string/common_ok" />
-
- <Button
- android:id="@+id/cancel"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="@string/common_cancel" />
-
- </LinearLayout -->
-
-</LinearLayout>
\ No newline at end of file
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@color/owncloud_white"
+ android:background="@color/background_color"
android:id="@+id/explanation"
android:orientation="vertical">
android:layout_weight="2"
android:padding="10dip"
android:scrollbarAlwaysDrawVerticalTrack="true"
- android:text="@string/text_placeholder"
+ android:text="@string/placeholder_sentence"
/>
<ListView
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>\r
-<!-- \r
- ownCloud Android client application\r
-\r
- Copyright (C) 2012 Bartek Przybylski\r
- Copyright (C) 2012-2013 ownCloud Inc.\r
-\r
- This program is free software: you can redistribute it and/or modify\r
- it under the terms of the GNU General Public License version 2,\r
- as published by the Free Software Foundation.\r
-\r
- This program is distributed in the hope that it will be useful,\r
- but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- GNU General Public License for more details.\r
-\r
- You should have received a copy of the GNU General Public License\r
- along with this program. If not, see <http://www.gnu.org/licenses/>.\r
- -->\r
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"\r
- android:id="@+id/linearLayout1"\r
- android:layout_width="fill_parent"\r
- android:layout_height="wrap_content"\r
- android:orientation="vertical" >\r
-\r
- <ListView\r
- android:id="@+id/homeScreenList"\r
- android:layout_width="fill_parent"\r
- android:layout_height="fill_parent"\r
- android:layout_gravity="center_horizontal"\r
- android:stretchMode="columnWidth" \r
- android:divider="@android:color/black">\r
- </ListView>\r
-\r
-</LinearLayout>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>\r
-<!-- \r
- ownCloud Android client application\r
-\r
- Copyright (C) 2012 Bartek Przybylski\r
- Copyright (C) 2012-2013 ownCloud Inc.\r
-\r
- This program is free software: you can redistribute it and/or modify\r
- it under the terms of the GNU General Public License version 2,\r
- as published by the Free Software Foundation.\r
-\r
- This program is distributed in the hope that it will be useful,\r
- but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- GNU General Public License for more details.\r
-\r
- You should have received a copy of the GNU General Public License\r
- along with this program. If not, see <http://www.gnu.org/licenses/>.\r
- -->\r
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"\r
- android:layout_width="fill_parent"\r
- android:layout_height="fill_parent" >\r
-\r
- <ImageView\r
- android:id="@+id/gridImage"\r
- android:layout_width="wrap_content"\r
- android:layout_height="wrap_content"\r
- android:layout_alignParentTop="true"\r
- android:layout_centerHorizontal="true"\r
- android:src="@drawable/action_item_btn" />
-\r\r\r
- <TextView\r
- android:id="@+id/gridText"\r
- android:layout_width="wrap_content"\r
- android:layout_height="wrap_content"\r
- android:layout_below="@+id/gridImage"\r
- android:layout_centerHorizontal="true"\r
- android:text="Medium Text"\r
- android:textAppearance="?android:attr/textAppearanceMedium"\r
- android:textColor="@color/setup_text_hint" />\r
-\r
-</RelativeLayout>
\ No newline at end of file
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:orientation="vertical" >
<com.owncloud.android.ui.ExtendedListView
android:id="@+id/list_root"
android:src="@drawable/ic_favorite" />\r
\r
</FrameLayout>\r
-\r\r\r\r
+\r
<LinearLayout\r
android:layout_width="0dp"\r
android:layout_height="match_parent"\r
android:layout_weight="1"\r
android:gravity="center_vertical"\r
android:orientation="vertical" >\r
-\r\r
+\r
<TextView\r
android:id="@+id/Filename"\r
android:layout_width="wrap_content"\r
</LinearLayout>\r
\r
</LinearLayout>\r
-\r\r\r\r
+\r
+ <ImageView\r
+ android:id="@+id/shareIcon"\r
+ android:layout_width="wrap_content"\r
+ android:layout_height="wrap_content"\r
+ android:layout_gravity="center_vertical"\r
+ android:layout_marginLeft="4dp"\r
+ android:layout_marginRight="4dp"\r
+ android:src="@drawable/sharedlink" />\r
+\r
<ImageView\r
android:id="@+id/custom_checkbox"\r
android:layout_width="wrap_content"\r
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/loadingLayout"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal" >
+
+ <ProgressBar
+ android:id="@+id/loadingBar"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:layout_marginBottom="10dp"
+ android:layout_marginLeft="10dp"
+ android:layout_marginRight="5dp"
+ android:layout_marginTop="10dp" />
+
+ <TextView
+ android:id="@+id/loadingText"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:layout_marginRight="20dp"
+ android:text="TextView" />
+
+</LinearLayout>
android:layout_height="wrap_content"
android:gravity="bottom">
- <Button android:id="@+id/deleteLogHistoryButton"
+ <Button
+ android:id="@+id/deleteLogHistoryButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/prefs_log_delete_history_button"/>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>\r
-<!-- \r
- ownCloud Android client application\r
-\r
- Copyright (C) 2012 Bartek Przybylski\r
- Copyright (C) 2012-2013 ownCloud Inc.\r
-\r
- This program is free software: you can redistribute it and/or modify\r
- it under the terms of the GNU General Public License version 2,\r
- as published by the Free Software Foundation.\r
-\r
- This program is distributed in the hope that it will be useful,\r
- but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- GNU General Public License for more details.\r
-\r
- You should have received a copy of the GNU General Public License\r
- along with this program. If not, see <http://www.gnu.org/licenses/>.\r
- -->\r
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"\r
- android:layout_width="fill_parent"\r
- android:layout_height="fill_parent"\r
- android:orientation="vertical" >\r
- \r
- <GridView\r
- android:id="@+id/homeScreenGrid"\r
- android:layout_width="fill_parent"\r
- android:layout_height="fill_parent"\r
- android:layout_gravity="center_horizontal"\r
- android:columnWidth="90dp"\r
- android:gravity="center"\r
- android:horizontalSpacing="20dp"\r
- android:verticalSpacing="20dp"\r
- android:layout_marginTop="20dp"\r
- android:numColumns="2"\r
- android:stretchMode="columnWidth" >\r
- </GridView>\r
-\r
- \r
-\r
-</LinearLayout>
\ No newline at end of file
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
- android:paddingTop="4dip"
+ android:paddingTop="4dp"
android:orientation="horizontal"
>
android:id="@+id/currentTimeText"
android:textSize="14sp"
android:textStyle="bold"
- android:paddingTop="4dip"
- android:paddingStart="4dip"
+ android:paddingTop="4dp"
+ android:paddingStart="4dp"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:paddingEnd="4dip"
+ android:paddingEnd="4dp"
android:text="@string/placeholder_media_time"
/>
<SeekBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
- android:layout_width="0dip"
+ android:layout_width="0dp"
android:layout_weight="1"
- android:layout_height="32dip"
+ android:layout_height="32dp"
android:layout_alignParentStart="true"
android:layout_alignParentEnd="true" />
<TextView android:id="@+id/totalTimeText"
android:textSize="14sp"
android:textStyle="bold"
- android:paddingTop="4dip"
- android:paddingEnd="4dip"
+ android:paddingTop="4dp"
+ android:paddingEnd="4dp"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:paddingStart="4dip"
+ android:paddingStart="4dp"
android:text="@string/placeholder_media_time"
/>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ownCloud Android client application
-
- Copyright (C) 2012 Bartek Przybylski
- Copyright (C) 2012-2013 ownCloud Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License version 2,
- as published by the Free Software Foundation.
-
- 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.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" android:gravity="center_vertical|center_horizontal">
-
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:orientation="vertical" android:gravity="center_vertical|center_horizontal">
-
- <TextView
- android:id="@+id/textView1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_marginLeft="3dp"
- android:layout_marginRight="3dp"
- android:gravity="center"
- android:text="@string/main_wrn_accsetup"
- android:textAppearance="?android:attr/textAppearanceMedium" />
-
- <Button
- android:id="@+id/setup_account"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:text="@string/main_tit_accsetup" />
-
- </LinearLayout>
-
-</LinearLayout>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ownCloud Android client application
+ Copyright (C) 2014 ownCloud Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2,
+ as published by the Free Software Foundation.
+
+ 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.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:paddingTop="5dp"
+ android:paddingLeft="5dp"
+ >
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:paddingTop="3dp"
+ >
+ <ImageView android:id="@+id/icon"
+ android:layout_width="25dp"
+ android:layout_height="25dp"
+ android:scaleType="centerInside"
+ />
+ <TextView android:id="@+id/title"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal"
+ android:paddingLeft="4dp"
+ style="@style/Theme.ownCloud.NotificationText.Title"
+ />
+ </LinearLayout>
+ <TextView android:id="@+id/text"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal"
+ style="@style/Theme.ownCloud.NotificationText.Content"
+ />
+ <FrameLayout android:id="@+id/progressHolder"
+ android:layout_width="match_parent"
+ android:layout_height="10dp"
+ android:paddingTop="2dp"
+ android:paddingBottom="2dp"
+ >
+ <!-- the FrameLayout is needed to change visibility of the
+ progress bar in Android 2.2, even though
+ https://code.google.com/p/android/issues/detail?id=11040 -->
+ <ProgressBar
+ android:id="@+id/progress"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ style="?android:attr/progressBarStyleHorizontal"
+ />
+ </FrameLayout>
+</LinearLayout>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ownCloud Android client application
-
- Copyright (C) 2012 Bartek Przybylski
- Copyright (C) 2012-2013 ownCloud Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License version 2,
- as published by the Free Software Foundation.
-
- 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.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal" >
-
- <TextView
- android:id="@+id/textView1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="TextView" />
-
-</LinearLayout>
\ No newline at end of file
style="@style/PassCodeStyle" />\r
</LinearLayout>\r
\r
- <Button android:layout_width="wrap_content"\r
+ <Button\r
+ android:id="@+id/cancel"\r
+ android:layout_width="wrap_content"\r
android:layout_height="wrap_content"\r
- android:text="@string/common_cancel"\r
- android:textColor="@android:color/black"\r
- android:id="@+id/cancel"/>\r
+ android:text="@string/common_cancel" />\r
+\r
</LinearLayout>\r
android:id="@+id/fdScrollView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
- android:background="@color/owncloud_white"
+ android:background="@color/background_color"
android:gravity="center_horizontal"
-->
-
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/top"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
- android:background="@color/owncloud_white"
+ android:background="#000000"
tools:context=".ui.fragment.PreviewImageFragment" >
<ProgressBar
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ownCloud Android client application
-
- Copyright (C) 2012 Bartek Przybylski
- Copyright (C) 2012-2013 ownCloud Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License version 2,
- as published by the Free Software Foundation.
-
- 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.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
--->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent" android:layout_height="fill_parent"
- android:padding="5dp">
- <ImageView android:id="@+id/status_icon"
- android:layout_width="wrap_content" android:layout_height="fill_parent"
- android:layout_alignParentLeft="true" />
-
- <RelativeLayout android:layout_width="fill_parent"
- android:layout_height="fill_parent" android:layout_toRightOf="@id/status_icon">
-
- <TextView android:id="@+id/status_text" android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:layout_alignParentTop="true" />
- <ProgressBar android:id="@+id/status_progress"
- android:layout_width="fill_parent" android:layout_height="wrap_content"
- android:layout_below="@id/status_text"
- android:progressDrawable="@android:drawable/progress_horizontal"
- android:indeterminate="false" android:indeterminateOnly="false" />
-
- </RelativeLayout>
-
-</RelativeLayout>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ownCloud Android client application
-
- Copyright (C) 2012 Bartek Przybylski
- Copyright (C) 2012-2013 ownCloud Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License version 2,
- as published by the Free Software Foundation.
-
- 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.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
-
- <TextView
- android:id="@+id/textView1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="TextView" />
-
-</LinearLayout>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ownCloud Android client application
+
+ Copyright (C) 2012-2013 ownCloud Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2,
+ as published by the Free Software Foundation.
+
+ 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.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/root"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:orientation="vertical" >
+
+ <TextView
+ android:id="@+id/header"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="0"
+ android:text="@string/ssl_validator_header"
+ android:padding="5dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ />
+
+ <TextView
+ android:id="@+id/reason_cert_not_trusted"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="0"
+ android:layout_gravity="left"
+ android:paddingLeft="20dp"
+ android:text="@string/ssl_validator_reason_cert_not_trusted"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+
+ <TextView
+ android:id="@+id/reason_cert_expired"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="left"
+ android:paddingLeft="20dp"
+ android:text="@string/ssl_validator_reason_cert_expired"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/reason_cert_not_yet_valid"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="left"
+ android:paddingLeft="20dp"
+ android:text="@string/ssl_validator_reason_cert_not_yet_valid"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/reason_hostname_not_verified"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="left"
+ android:paddingLeft="20dp"
+ android:text="@string/ssl_validator_reason_hostname_not_verified"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/reason_no_info_about_error"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="left"
+ android:paddingLeft="20dp"
+ android:text="@string/ssl_validator_no_info_about_error"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <ScrollView
+ android:id="@+id/details_scroll"
+ android:visibility="gone"
+ android:padding="20dp"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ >
+
+ <LinearLayout
+ android:id="@+id/details_view"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="left"
+ android:orientation="vertical" >
+
+ <TextView
+ android:id="@+id/null_cert"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="left"
+ android:paddingLeft="20dp"
+ android:text="@string/ssl_validator_null_cert"
+ android:textAppearance="?android:attr/textAppearanceSmall" />
+
+ <TextView
+ android:id="@+id/label_subject"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp"
+ android:text="@string/ssl_validator_label_subject"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ />
+
+ <TextView
+ android:id="@+id/label_subject_CN"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/ssl_validator_label_CN"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/value_subject_CN"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp"
+ android:text=""
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/label_subject_O"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/ssl_validator_label_O"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/value_subject_O"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp"
+ android:text=""
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/label_subject_OU"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/ssl_validator_label_OU"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/value_subject_OU"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp"
+ android:text=""
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/label_subject_ST"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/ssl_validator_label_ST"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/value_subject_ST"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp"
+ android:text=""
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/label_subject_C"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/ssl_validator_label_C"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/value_subject_C"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp"
+ android:text=""
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/label_subject_L"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/ssl_validator_label_L"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/value_subject_L"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp"
+ android:text=""
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+
+ <TextView
+ android:id="@+id/label_issuer"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp"
+ android:text="@string/ssl_validator_label_issuer"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ />
+
+ <TextView
+ android:id="@+id/label_issuer_CN"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/ssl_validator_label_CN"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/value_issuer_CN"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp"
+ android:text=""
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/label_issuer_O"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/ssl_validator_label_O"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/value_issuer_O"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp"
+ android:text=""
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/label_issuer_OU"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/ssl_validator_label_OU"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/value_issuer_OU"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp"
+ android:text=""
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/label_issuer_ST"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/ssl_validator_label_ST"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/value_issuer_ST"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp"
+ android:text=""
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/label_issuer_C"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/ssl_validator_label_C"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/value_issuer_C"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp"
+ android:text=""
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/label_issuer_L"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/ssl_validator_label_L"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/value_issuer_L"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp"
+ android:text=""
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/label_validity"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp"
+ android:text="@string/ssl_validator_label_validity"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ />
+
+ <TextView
+ android:id="@+id/label_validity_from"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/ssl_validator_label_validity_from"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/value_validity_from"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp"
+ android:text=""
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/label_validity_to"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/ssl_validator_label_validity_to"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/value_validity_to"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp"
+ android:text=""
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+
+ <TextView
+ android:id="@+id/label_signature"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp"
+ android:text="@string/ssl_validator_label_signature"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ />
+
+ <TextView
+ android:id="@+id/label_signature_algorithm"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/ssl_validator_label_signature_algorithm"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ <TextView
+ android:id="@+id/value_signature_algorithm"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp"
+ android:text=""
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+
+ <TextView
+ android:id="@+id/value_signature"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp"
+ android:text=""
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+
+ </LinearLayout>
+
+ </ScrollView>
+
+ <TextView
+ android:id="@+id/question"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="0"
+ android:padding="5dp"
+ android:text="@string/ssl_validator_question"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ >
+ </TextView>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="0"
+ android:gravity="center" >
+
+ <Button
+ android:id="@+id/cancel"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="@string/common_cancel" />
+
+ <Button
+ android:id="@+id/details_btn"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="@string/ssl_validator_btn_details_see" />
+
+ <Button
+ android:id="@+id/ok"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="@string/common_ok" />
+
+ </LinearLayout>
+
+</LinearLayout>
android:layout_width="wrap_content"
android:layout_height="180dp">
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ <LinearLayout
android:id="@+id/details_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ownCloud Android client application
+
+ Copyright (C) 2012-2013 ownCloud Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2,
+ as published by the Free Software Foundation.
+
+ 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.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ >
+
+ <!-- com.owncloud.android.ui.dialog.SsoWebView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/sso_webview"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:clickable="true"
+ /-->
+
+</RelativeLayout>
android:id="@+id/upload_files_layout"\r
android:layout_width="fill_parent"\r
android:layout_height="fill_parent"\r
- android:background="@color/owncloud_white"\r
+ android:background="@color/background_color"\r
android:orientation="vertical" >\r
<fragment\r
android:layout_width="fill_parent" android:layout_alignParentBottom="true" android:layout_height="wrap_content" android:orientation="vertical">
<Button android:layout_gravity="bottom" android:layout_height="wrap_content"
android:layout_width="fill_parent" android:id="@+id/uploader_choose_folder"
- android:text="@string/uploader_btn_upload_text"></Button>
+ android:text="@string/uploader_btn_upload_text"/>
</LinearLayout>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" >
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" >
<VideoView android:id="@+id/videoPlayer"
android:layout_width="wrap_content"
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
+ <item android:id="@+id/change_password" android:title="@string/change_password"></item>
<item android:id="@+id/delete_account" android:title="@string/delete_account"></item>
-
-
</menu>
\ No newline at end of file
-->
<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@+id/action_open_file_with" android:title="@string/filedetails_open" android:icon="@android:drawable/ic_menu_edit" android:orderInCategory="1" />
- <item android:id="@+id/action_download_file" android:title="@string/filedetails_download" android:orderInCategory="1" />
+ <item android:id="@+id/action_share_file" android:title="@string/action_share_file" android:icon="@android:drawable/ic_menu_share" android:orderInCategory="1" />
+ <item android:id="@+id/action_unshare_file" android:title="@string/action_unshare_file" android:icon="@android:drawable/ic_menu_share" android:orderInCategory="1" />
+ <item android:id="@+id/action_open_file_with" android:title="@string/actionbar_open_with" android:icon="@android:drawable/ic_menu_edit" android:orderInCategory="1" />
+ <item android:id="@+id/action_download_file" android:title="@string/filedetails_download" android:icon="@drawable/ic_action_download" android:orderInCategory="1" />
+ <item android:id="@+id/action_sync_file" android:title="@string/filedetails_sync_file" android:icon="@drawable/ic_action_refresh" android:orderInCategory="1" />
<item android:id="@+id/action_cancel_download" android:title="@string/common_cancel_download" android:icon="@android:drawable/ic_menu_close_clear_cancel" android:orderInCategory="1" />
<item android:id="@+id/action_cancel_upload" android:title="@string/common_cancel_upload" android:icon="@android:drawable/ic_menu_close_clear_cancel" android:orderInCategory="1" />
<item android:id="@+id/action_rename_file" android:title="@string/common_rename" android:icon="@android:drawable/ic_menu_set_as" android:orderInCategory="1" />
<item android:id="@+id/action_remove_file" android:title="@string/common_remove" android:icon="@android:drawable/ic_menu_delete" android:orderInCategory="1" />
- <item android:id="@+id/action_see_details" android:title="@string/actionbar_see_details" android:icon="@android:drawable/ic_menu_view" android:orderInCategory="1" />
+ <item android:id="@+id/action_see_details" android:title="@string/actionbar_see_details" android:icon="@android:drawable/ic_menu_info_details" android:orderInCategory="1" />
+ <item android:id="@+id/action_send_file" android:title="@string/actionbar_send_file" android:icon="@android:drawable/ic_menu_info_details" android:orderInCategory="1" />
</menu>
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
-<menu
- xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@+id/action_sync_account" android:title="@string/actionbar_sync" android:icon="@drawable/ic_action_refresh" android:orderInCategory="2" />
- <item android:id="@+id/action_create_dir" android:title="@string/actionbar_mkdir" android:icon="@drawable/ic_action_create_dir" android:orderInCategory="2" />
- <item android:id="@+id/action_upload" android:title="@string/actionbar_upload" android:icon="@drawable/ic_action_upload" android:orderInCategory="2" />
- <item android:id="@+id/action_settings" android:title="@string/actionbar_settings" android:icon="@android:drawable/ic_menu_preferences" android:orderInCategory="2" />
-
- <!-- <item android:id="@+id/search" android:title="@string/actionbar_search" android:icon="@drawable/ic_action_search"></item>-->
-</menu>
+<menu xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <item
+ android:id="@+id/action_upload"
+ android:icon="@drawable/ic_action_upload"
+ android:orderInCategory="2"
+ android:showAsAction="always"
+ android:title="@string/actionbar_upload"/>
+ <item
+ android:id="@+id/action_create_dir"
+ android:icon="@drawable/ic_action_create_dir"
+ android:orderInCategory="2"
+ android:showAsAction="always"
+ android:title="@string/actionbar_mkdir"/>
+ <item
+ android:id="@+id/action_sync_account"
+ android:icon="@drawable/ic_action_refresh"
+ android:orderInCategory="2"
+ android:showAsAction="never"
+ android:title="@string/actionbar_sync"/>
+ <item
+ android:id="@+id/action_settings"
+ android:icon="@drawable/ic_action_settings"
+ android:orderInCategory="2"
+ android:showAsAction="never"
+ android:title="@string/actionbar_settings"/>
+
+ <!-- <item android:id="@+id/search" android:title="@string/actionbar_search" android:icon="@drawable/ic_action_search"></item> -->
+
+</menu>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ownCloud Android client application
-
- Copyright (C) 2012 Bartek Przybylski
- Copyright (C) 2012-2013 ownCloud Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License version 2,
- as published by the Free Software Foundation.
-
- 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.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
--->
-<menu
- xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@+id/SessionContextEdit" android:title="Edit"></item>
- <item android:id="@+id/SessionContextRemove" android:title="REmove"></item>
-</menu>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="main_settings">Instellings</string>
<string name="actionbar_settings">Instellings</string>
+ <string name="prefs_help">Hulp</string>
<string name="auth_username">Gebruikersnaam</string>
<string name="auth_password">Wagwoord</string>
- <string name="setup_hint_username">Gebruikersnaam</string>
- <string name="setup_hint_password">Wagwoord</string>
</resources>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources/>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources/>
+++ /dev/null
-<?xml version='1.0' encoding='UTF-8'?>
-<resources/>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="main_button_login">تسجيل الدخول</string>
- <string name="main_files">الملفات</string>
- <string name="main_music">الموسيقى</string>
- <string name="main_contacts">المعارف</string>
- <string name="main_settings">تعديلات</string>
- <string name="actionbar_upload">إرفع</string>
+ <string name="about_android">%1$s تطبيق أندرويد</string>
+ <string name="about_version">الإصدار %1$s</string>
+ <string name="actionbar_sync">تحديث الحساب</string>
+ <string name="actionbar_upload">رفع</string>
+ <string name="actionbar_upload_from_apps">محتويات من تطبيقات أخرى</string>
<string name="actionbar_upload_files">الملفات</string>
- <string name="actionbar_settings">تعديلات</string>
+ <string name="actionbar_open_with">فتح باستخدام</string>
+ <string name="actionbar_mkdir">مجلد جديد</string>
+ <string name="actionbar_settings">إعدادات</string>
+ <string name="actionbar_see_details">تفاصيل</string>
+ <string name="actionbar_send_file">أرسل</string>
<string name="prefs_category_general">عام</string>
- <string name="auth_host_url">عنوان الموقع</string>
+ <string name="prefs_category_more">المزيد</string>
+ <string name="prefs_accounts">حسابات</string>
+ <string name="prefs_manage_accounts">إدارة الحسابات</string>
+ <string name="prefs_pincode">كلمة سر التطبيق</string>
+ <string name="prefs_pincode_summary">حماية العميل</string>
+ <string name="prefs_instant_upload">تفعيل الرفع الفوري</string>
+ <string name="prefs_instant_upload_summary">رفع الصور فور التقاطها بالكاميرا </string>
+ <string name="prefs_log_title">تفعيل الدخول</string>
+ <string name="prefs_log_summary">يستخدم هذا لتسجيل المشاكل</string>
+ <string name="prefs_log_title_history">تاريخ الدخول</string>
+ <string name="prefs_log_summary_history">هذا يعرض السجلات المسجلة</string>
+ <string name="prefs_log_delete_history_button">حذف التاريخ</string>
+ <string name="prefs_help">المساعدة</string>
+ <string name="prefs_recommend">توصية الى صديق</string>
+ <string name="prefs_feedback">ملاحظات</string>
+ <string name="prefs_imprint">الدمغة.</string>
+ <string name="recommend_subject">جرب %1$s على جهازك الذكي</string>
+ <string name="auth_check_server">تحقق من الخادم</string>
+ <string name="auth_host_url">عنوان الخادم https://…</string>
<string name="auth_username">إسم المستخدم</string>
- <string name="auth_password">كلمات السر</string>
+ <string name="auth_password">كلمة السر</string>
+ <string name="auth_register">جديد في %1$s ؟</string>
<string name="sync_string_files">الملفات</string>
- <string name="setup_hint_username">إسم المستخدم</string>
- <string name="setup_hint_password">كلمات السر</string>
- <string name="uploader_btn_upload_text">إرفع</string>
- <string name="filedetails_download">انزال</string>
- <string name="filedetails_open">افتح</string>
+ <string name="setup_btn_connect">اتصال</string>
+ <string name="uploader_btn_upload_text">رفع</string>
+ <string name="uploader_wrn_no_account_title">لم يتم العثور على أي حساب</string>
+ <string name="uploader_wrn_no_account_text">لا توجد حسابات %1$s على جهازك. يرجى تهيئة حساب أولاً.</string>
+ <string name="uploader_wrn_no_account_setup_btn_text">تهيئة</string>
+ <string name="uploader_wrn_no_account_quit_btn_text">خروج</string>
+ <string name="uploader_wrn_no_content_title">لا يوجد محتوى للرفع</string>
+ <string name="uploader_wrn_no_content_text">لم يتم استلام أي محتوى. لا شيء للرفع.</string>
+ <string name="uploader_error_forbidden_content">%1$s غير مسموح له بالوصول للمحتوى المشارك</string>
+ <string name="uploader_info_uploading">يتم الرفع</string>
+ <string name="file_list_empty">لا توجد ملفات في هذا المجلد.\nيمكن إنشاء ملف جديد باختيار \"رفع\" القائمة.</string>
+ <string name="filedetails_select_file">اضغظ على الملف ليتم عرض خيارات أكثر</string>
+ <string name="filedetails_size">الحجم :</string>
+ <string name="filedetails_type">النوع :</string>
+ <string name="filedetails_created">انشئ في :</string>
+ <string name="filedetails_modified">عُدل في :</string>
+ <string name="filedetails_download">تحميل</string>
+ <string name="filedetails_sync_file">تحديث الملف</string>
+ <string name="filedetails_renamed_in_upload_msg">تم تغيير اسم الملف إلى %1$s أثناء الرفع</string>
+ <string name="action_share_file">شارك الرابط</string>
+ <string name="action_unshare_file">الغاء مشاركة الرابط</string>
<string name="common_yes">نعم</string>
<string name="common_no">لا</string>
- <string name="common_cancel">الغاء</string>
+ <string name="common_ok">تم</string>
+ <string name="common_cancel_download">إلغاء التحميل</string>
+ <string name="common_cancel_upload">إلغاء الرفع</string>
+ <string name="common_cancel">إلغاء</string>
+ <string name="common_save_exit">حفظ + خروج</string>
<string name="common_error">خطأ</string>
- <string name="sync_string_contacts">المعارف</string>
- <string name="common_share">شارك</string>
- <string name="common_remove">الغى</string>
+ <string name="common_loading">تحميل ...</string>
+ <string name="common_error_unknown">خطأ غير معروف. </string>
+ <string name="about_title">حول</string>
+ <string name="change_password">عدل كلمة السر</string>
+ <string name="delete_account">حذف الحساب</string>
+ <string name="create_account">حساب جديد</string>
+ <string name="upload_chooser_title">الرفع من ...</string>
+ <string name="uploader_info_dirname">اسم المجلد</string>
+ <string name="uploader_upload_in_progress_ticker">يتم الرفع ...</string>
+ <string name="uploader_upload_in_progress_content">%1$d%% رفع %2$s</string>
+ <string name="uploader_upload_succeeded_ticker">تم الرفع بنجاح</string>
+ <string name="uploader_upload_succeeded_content_single">تم رفع %1$s بنجاح </string>
+ <string name="uploader_upload_failed_ticker">فشل الرفع</string>
+ <string name="uploader_upload_failed_content_single">لم يكتمل رفع %1$s </string>
+ <string name="downloader_download_in_progress_ticker">يتم التحميل ...</string>
+ <string name="downloader_download_in_progress_content">%1$d%% تحميل %2$s</string>
+ <string name="downloader_download_succeeded_ticker">تم التحميل بنجاح</string>
+ <string name="downloader_download_succeeded_content">تم تحميل %1$s بنجاح </string>
+ <string name="downloader_download_failed_ticker">فشل التحميل</string>
+ <string name="downloader_download_failed_content"> لم يكتمل تحميل %1$s</string>
+ <string name="downloader_not_downloaded_yet">لم يتم تحميلها بعد</string>
+ <string name="common_choose_account">اختر حسابا</string>
+ <string name="sync_fail_ticker">فشلت المزامنة.</string>
+ <string name="sync_fail_content">لم تكتمل مزامنة %1$s </string>
+ <string name="sync_fail_content_unauthorized">كلمة السر غير صالحة لـ %1$s</string>
+ <string name="sync_conflicts_in_favourites_ticker">هناك تعارض</string>
+ <string name="sync_conflicts_in_favourites_content">لم تنجح المزامنة الدائمة لـ %1$d ملفات</string>
+ <string name="sync_fail_in_favourites_ticker">لم تنجح المزامنة التلقائية للملفات</string>
+ <string name="sync_fail_in_favourites_content"> لا يمكن مزامنة جهات اتصال %1$d ( %2$d تعارض) </string>
+ <string name="sync_foreign_files_forgotten_ticker">تم نسيان بعض الملفات المحلية</string>
+ <string name="sync_current_folder_was_removed">لا يوجد مجلد %1$s بعد الان</string>
+ <string name="foreign_files_move">نقل الكل</string>
+ <string name="foreign_files_success">تم نقل جميع الملفات</string>
+ <string name="foreign_files_fail">لم ينجح نقل بعض الملفات</string>
+ <string name="foreign_files_local_text">محلي :%1$s</string>
+ <string name="foreign_files_remote_text">خارجي : %1$s</string>
+ <string name="upload_query_move_foreign_files">لا يوجد مساحة كافية لنسخ الملفات المحددة إلى مجلد %1$s . هل ترغب بنقلها بدلاَ من ذلك؟</string>
+ <string name="pincode_enter_pin_code">يرجى إدخال كلمة السر</string>
+ <string name="pincode_configure_your_pin">أدخل كلمة السر</string>
+ <string name="pincode_configure_your_pin_explanation">سيتم طلب PIN في كل مرة يتم فيها تشغيل التطبيق</string>
+ <string name="pincode_reenter_your_pincode">يرجى إدخال كلمة السر مرة أخرى</string>
+ <string name="pincode_remove_your_pincode">إزالة كلمة السر</string>
+ <string name="pincode_mismatch">كلمتا السر غير متطابقتين</string>
+ <string name="pincode_wrong">كلمه السر غير صحيحة</string>
+ <string name="pincode_removed">تمت إزالة كلمه السر</string>
+ <string name="pincode_stored">تم تسجيل كلمت السر</string>
+ <string name="media_notif_ticker">مشغل الموسيقى %1$s </string>
+ <string name="media_state_playing">%1$s (يتم التشغيل)</string>
+ <string name="media_state_loading">%1$s (يتم التحميل)</string>
+ <string name="media_event_done">انتهى تشغيل %1$s </string>
+ <string name="media_err_nothing_to_play">لا يوجد ملف وسائط</string>
+ <string name="media_err_no_account">لم يتم تقديم أي حساب</string>
+ <string name="media_err_not_in_owncloud">الملف ليس في حساب صحيح</string>
+ <string name="media_err_unsupported">ترميز غير مدعّم</string>
+ <string name="media_err_io">لا يمكن قراءة ملف الوسائط</string>
+ <string name="media_err_malformed">الملف غير مرمز بشكل صحيح</string>
+ <string name="media_err_timeout">انتهت المهلة أثناء محاولة العرض</string>
+ <string name="media_err_invalid_progressive_playback">لا يمكن بث ملف الوسائط</string>
+ <string name="media_err_unknown">لا يمكن عرض ملف الوسائط مع عارض الوسائط المستعمل</string>
+ <string name="media_err_security_ex">خطا امني اثناء محاولة عرض %1$s</string>
+ <string name="media_err_io_ex">خطا في المدخلات اثناء محاولة عرض %1$s</string>
+ <string name="media_err_unexpected">خطا غير متوقع اثناء محاولة عرض %1$s</string>
+ <string name="media_rewind_description">زر الترجيع</string>
+ <string name="media_play_pause_description">زر التشغيل أو الإيقاف</string>
+ <string name="media_forward_description">زر التقدم للأمام</string>
+ <string name="auth_trying_to_login">محاولة الدخول ...</string>
+ <string name="auth_no_net_conn_title">لا يتوفر اتصال</string>
+ <string name="auth_nossl_plain_ok_title">الاتصال الآمن غير متاح</string>
+ <string name="auth_connection_established">تم الاتصال</string>
+ <string name="auth_testing_connection">اختبار الاتصال ...</string>
+ <string name="auth_not_configured_title">إعداد الخادم غير صحيحة</string>
+ <string name="auth_account_not_new">الحساب لنفس المستخدم والخادم موجود مسبقا على الجهاز </string>
+ <string name="auth_account_not_the_same">المستخدم المدخل لا يتوافق مع المستخدم الموجود في الحساب </string>
+ <string name="auth_unknown_error_title">حدث خطأ غير معروف !</string>
+ <string name="auth_unknown_host_title">فشل في العثور على المضيف</string>
+ <string name="auth_incorrect_path_title">لم يتم إيجاد الخادم</string>
+ <string name="auth_timeout_title">الخادم أخذ كثيرا من الوقت للرد</string>
+ <string name="auth_incorrect_address_title">رابط غير سليم</string>
+ <string name="auth_ssl_general_error_title">فشل في تهيئة SSL</string>
+ <string name="auth_ssl_unverified_server_title">لا يمكن التحقق من هوية خادم SSL</string>
+ <string name="auth_bad_oc_version_title">إصدار الخادم غير معروف</string>
+ <string name="auth_wrong_connection_title">لم ينجح الاتصال</string>
+ <string name="auth_secure_connection">نجح الاتصال آمن</string>
+ <string name="auth_unauthorized">اسم المستخدم أو كلمة المرور خاطئة</string>
+ <string name="auth_oauth_error">فشل في التحقق</string>
+ <string name="auth_oauth_error_access_denied">تم رفض الوصول من قبل الخادم المرخص</string>
+ <string name="auth_wtf_reenter_URL">حالة غير متوقعة: الرجاء, ادخال عنوان الخادم مرة اخرى</string>
+ <string name="auth_expired_oauth_token_toast">مدة التحقق انتهت , يرجى اعادة التحقق </string>
+ <string name="auth_expired_basic_auth_toast">يرجى ادخال كلمة المرور الحالية</string>
+ <string name="auth_expired_saml_sso_token_toast">مدة الجلسة انتهت , يرجى اعادة الاتصال</string>
+ <string name="auth_connecting_auth_server">يتم الاتصال بالخادم للتحقق</string>
+ <string name="auth_unsupported_auth_method">الخادم لا يدعم طريقة التحقق هذه</string>
+ <string name="auth_unsupported_multiaccount">%1$s لا يدعم الحسابات المتعددة </string>
+ <string name="fd_keep_in_sync"> جعل الملف محدثا</string>
+ <string name="common_rename">إعادة التسمية</string>
+ <string name="common_remove">حذف</string>
+ <string name="confirmation_remove_alert">هل تود حقاَ إزالة %1$s ؟ </string>
+ <string name="confirmation_remove_folder_alert">هل ترغب حقا في إزالة %1$s و محتوياته ؟</string>
+ <string name="confirmation_remove_local">محليا فقط</string>
+ <string name="confirmation_remove_folder_local">المحتويات المحلية فقط</string>
+ <string name="confirmation_remove_remote">الحذف من الخادم</string>
+ <string name="confirmation_remove_remote_and_local">محليا و عن بعد</string>
+ <string name="remove_success_msg">تم الحذف بنجاح</string>
+ <string name="remove_fail_msg">فشل الحذف</string>
+ <string name="rename_dialog_title">أدخل اسما جديدا</string>
+ <string name="rename_local_fail_msg">لم تنجح إعادة تسمية النسخة المحلية، جرب اسما آخر</string>
+ <string name="rename_server_fail_msg">لم تكتمل إعادة التسمية</string>
+ <string name="sync_file_fail_msg">لا يمكن التحقق من الملف الخارجي</string>
+ <string name="sync_file_nothing_to_do_msg">تمت مزامنة محتويات الملفات من قبل</string>
+ <string name="filename_forbidden_characters">رموز ممنوعة: / \\ < > : \" | ? *</string>
+ <string name="wait_a_moment">انتظر للحظة</string>
+ <string name="filedisplay_unexpected_bad_get_content">خطا غير متوقع : الرجاء اختيار الملف من تطبيق آخر</string>
+ <string name="filedisplay_no_file_selected">لم يتم اختيار أي ملف</string>
+ <string name="activity_chooser_title">ارسل الرابط الى ...</string>
+ <string name="oauth_check_onoff">تسجيل الدخول باستخدام oAuth2</string>
+ <string name="oauth_login_connection">الاتصال مع خادم oAuth2</string>
+ <string name="ssl_validator_header">لا يمكن التحقق من هوية الموقع</string>
+ <string name="ssl_validator_reason_cert_not_trusted">شهادة الخادم غير موثوقة</string>
+ <string name="ssl_validator_reason_cert_expired">شهادة الخادم منتهية الصلاحية</string>
+ <string name="ssl_validator_reason_cert_not_yet_valid">وقت صلاحية شهادة الخادم لم يحن بعد</string>
+ <string name="ssl_validator_reason_hostname_not_verified">الرابط لا يوافق اسم المضيف فى شهاده الحماية </string>
+ <string name="ssl_validator_question">هل تريد أن تثق في هذه الشهادة على اي حال ؟</string>
+ <string name="ssl_validator_not_saved">لم ينجح حفظ الشهادة </string>
+ <string name="ssl_validator_btn_details_see">تفاصيل</string>
+ <string name="ssl_validator_btn_details_hide">إخفاء</string>
+ <string name="ssl_validator_label_subject">أصدرت لـ :</string>
+ <string name="ssl_validator_label_issuer">أصدرت بواسطة</string>
+ <string name="ssl_validator_label_CN">الاسم الشائع :</string>
+ <string name="ssl_validator_label_O">منظمة :</string>
+ <string name="ssl_validator_label_OU">الوحدة التنظيمية :</string>
+ <string name="ssl_validator_label_C">البلد :</string>
+ <string name="ssl_validator_label_ST">الحالة :</string>
+ <string name="ssl_validator_label_L">المكان :</string>
+ <string name="ssl_validator_label_validity">الصلاحية :</string>
+ <string name="ssl_validator_label_validity_from">من :</string>
+ <string name="ssl_validator_label_validity_to">إلى :</string>
+ <string name="ssl_validator_label_signature">التوقيع :</string>
+ <string name="ssl_validator_label_signature_algorithm">الخوارزمية :</string>
+ <string name="ssl_validator_null_cert">لا يمكن إظهار الشهادة</string>
+ <string name="ssl_validator_no_info_about_error">- لا معلومات عن الخطأ.</string>
+ <string name="placeholder_sentence">هذه مساحة محجوزة</string>
+ <string name="placeholder_filename">placeholder.txt</string>
+ <string name="placeholder_filetype">صورة PNG</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 مساء</string>
+ <string name="placeholder_media_time">12:23:45</string>
+ <string name="instant_upload_on_wifi">رفع الصور من خلال الـ WiFi فقط</string>
+ <string name="instant_upload_path">/InstantUpload</string>
+ <string name="conflict_title">تعارض في التحديث </string>
+ <string name="conflict_message">الملف %s غير </string>
+ <string name="conflict_keep_both">الاحتفاظ بالنسختين</string>
+ <string name="conflict_overwrite">استبدال</string>
+ <string name="conflict_dont_upload">عدم الرفع</string>
+ <string name="preview_image_description">معاينة الصورة</string>
+ <string name="preview_image_error_unknown_format">هذه الصورة لا يمكن أن تظهر</string>
+ <string name="actionbar_failed_instant_upload">فشل في محاولة الرفع الفوري</string>
+ <string name="failed_upload_headline_text">فشل في الرفع الفوري</string>
+ <string name="failed_upload_headline_hint">ملخص لكل الاخطاء في عملية الرفع الفوري</string>
+ <string name="failed_upload_all_cb">تحديد الكل</string>
+ <string name="failed_upload_headline_retryall_btn">اعادة كل المختارات</string>
+ <string name="failed_upload_headline_delete_all_btn">حذف كل المختارات من قائمة انتظار الرفع</string>
+ <string name="failed_upload_retry_text">اعادة المحاولة لرفع الصورة:</string>
+ <string name="failed_upload_load_more_images">تحميل المزيد من الصور</string>
+ <string name="failed_upload_retry_do_nothing_text">do nothing you are not online for instant upload</string>
+ <string name="failed_upload_failure_text">رسالة خطا:</string>
+ <string name="failed_upload_quota_exceeded_text">الرجاء التاكد من اعدادات الخادم, من الممكن انك تعديت الحد في quota</string>
+ <string name="share_link_file_no_exist">لم يتمكن من مشاركة الملف او المجلد. يرجى التاكد من وجوده </string>
+ <string name="share_link_file_error">حدث خطأ ما أثناء محاولة مشاركة هذا الملف أو المجلد</string>
+ <string name="unshare_link_file_no_exist">غير قادر على إلغاء مشاركة هذا الملف أو المجلد.لا وجود له</string>
+ <string name="unshare_link_file_error">حدث خطأ ما أثناء محاولة إلغاء مشاركة هذا الملف أو المجلد</string>
+ <string name="activity_chooser_send_file_title">أرسل</string>
+ <string name="copy_link">نسخ الرابط</string>
+ <string name="clipboard_text_copied">تم النسخ للحافظة</string>
</resources>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources/>
<?xml version='1.0' encoding='UTF-8'?>
-<resources/>
+<resources>
+ <string name="actionbar_settings">Налады</string>
+ <string name="common_yes">Так</string>
+ <string name="common_no">Не</string>
+ <string name="common_error">Памылка</string>
+</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Парола:</string>
- <string name="main_login">Потребител:</string>
- <string name="main_button_login">Вход</string>
- <string name="main_welcome">Добре дошли</string>
- <string name="main_files">Файлове</string>
- <string name="main_music">Музика</string>
- <string name="main_contacts">Контакти</string>
- <string name="main_calendar">Календар</string>
- <string name="main_bookmarks">Предпочитани</string>
- <string name="main_settings">Настройки</string>
<string name="actionbar_upload">Качване</string>
+ <string name="actionbar_upload_from_apps">Съдържание от други приложения</string>
<string name="actionbar_upload_files">Файлове</string>
+ <string name="actionbar_mkdir">Нова папка</string>
<string name="actionbar_settings">Настройки</string>
+ <string name="actionbar_send_file">Изпрати</string>
<string name="prefs_category_general">Общи</string>
- <string name="auth_host_url">Уеб адрес</string>
+ <string name="prefs_category_more">Още</string>
+ <string name="prefs_accounts">Профили</string>
+ <string name="prefs_instant_upload_summary">Своевременно качване на снимки направени с камерата</string>
+ <string name="prefs_help">Помощ</string>
+ <string name="auth_username">Потребител</string>
<string name="auth_password">Парола</string>
<string name="sync_string_files">Файлове</string>
- <string name="setup_hint_password">Парола</string>
+ <string name="setup_btn_connect">Свързване</string>
<string name="uploader_btn_upload_text">Качване</string>
+ <string name="uploader_wrn_no_account_title">Няма открит профил</string>
+ <string name="uploader_wrn_no_account_setup_btn_text">Инсталиране</string>
<string name="uploader_wrn_no_account_quit_btn_text">Изход</string>
+ <string name="uploader_wrn_no_content_title">Няма съдържание за качване</string>
+ <string name="uploader_wrn_no_content_text">Не беше получено съдържание. Няма какво да се качи.</string>
+ <string name="uploader_info_uploading">Качване</string>
+ <string name="filedetails_select_file">Натиснете върху файл за да видите повече информация.</string>
+ <string name="filedetails_size">Размер:</string>
+ <string name="filedetails_type">Тип:</string>
+ <string name="filedetails_created">Създаден:</string>
+ <string name="filedetails_modified">Променен:</string>
<string name="filedetails_download">Изтегляне</string>
+ <string name="common_yes">Да</string>
+ <string name="common_no">Не</string>
+ <string name="common_ok">ОК</string>
<string name="common_cancel_upload">Спри качването</string>
+ <string name="common_cancel">Отказ</string>
+ <string name="common_save_exit">Запази и Излез</string>
<string name="common_error">Грешка</string>
- <string name="sync_string_contacts">Контакти</string>
- <string name="common_share">Споделяне</string>
+ <string name="about_title">Относно</string>
+ <string name="change_password">Промяна на паролата</string>
+ <string name="delete_account">Изтрий акаунт</string>
+ <string name="create_account">Създай акаунт</string>
+ <string name="upload_chooser_title">Качено от ...</string>
+ <string name="uploader_info_dirname">Име на папката</string>
+ <string name="uploader_upload_in_progress_ticker">Качване ...</string>
+ <string name="uploader_upload_in_progress_content">%1$d%% Качване %2$s</string>
+ <string name="uploader_upload_succeeded_ticker">Качване е успешно</string>
+ <string name="uploader_upload_failed_ticker">Качването е неуспешно</string>
+ <string name="uploader_upload_failed_content_single">Качването на %1$s не може да бъде завършено</string>
+ <string name="downloader_download_in_progress_ticker">Сваляне ...</string>
+ <string name="downloader_download_in_progress_content">%1$d%% Сваляне %2$s</string>
+ <string name="downloader_download_failed_ticker">Свалянето е неуспешно</string>
+ <string name="downloader_download_failed_content">Свалянето на %1$s не може да бъде завършено</string>
+ <string name="common_choose_account">Изберете акаунт</string>
+ <string name="sync_fail_ticker">Синхронизацияте е неуспешна</string>
+ <string name="sync_fail_content">Синхронизацията на %1$s не може да бъде осъществена</string>
+ <string name="pincode_enter_pin_code">Моля въведете Вашия App ПИН</string>
+ <string name="auth_no_net_conn_title">Няма мрежова свързаност</string>
+ <string name="auth_nossl_plain_ok_title">Защитена връзка не е налична</string>
+ <string name="auth_connection_established">Осъществена връзка</string>
+ <string name="auth_unknown_error_title">Появи се неизвестна грешка!</string>
+ <string name="auth_unknown_host_title">Невъзможност за намиране на хоста</string>
+ <string name="auth_timeout_title">Сървърът се забави прекалено много с отговора</string>
+ <string name="auth_incorrect_address_title">Грешен URL</string>
+ <string name="auth_ssl_general_error_title">Инициализацията на SSL е неуспешна</string>
+ <string name="auth_wrong_connection_title">Невъзможност за осъществяване на връзка</string>
+ <string name="auth_secure_connection">Осъществена защитена връзка</string>
+ <string name="fd_keep_in_sync">Дръж файлът обновен</string>
<string name="common_rename">Преименуване</string>
<string name="common_remove">Премахване</string>
+ <string name="confirmation_remove_alert">Наистина ли искате да изтриете %1$s ?</string>
+ <string name="confirmation_remove_local">Само локално</string>
+ <string name="confirmation_remove_remote">Премахни от сървъра</string>
+ <string name="rename_server_fail_msg">Преименуването не може да се осъществи</string>
+ <string name="wait_a_moment">Изчакайте малко</string>
+ <string name="filedisplay_no_file_selected">Не е избран файл</string>
+ <string name="ssl_validator_header">Самоличността на сайта не може да бъде проверена</string>
+ <string name="activity_chooser_send_file_title">Изпрати</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="main_button_login">প্রবেশ</string>
- <string name="main_welcome">সুস্বাগতম</string>
- <string name="main_files">ফাইল</string>
- <string name="main_music">গানবাজনা</string>
- <string name="main_contacts">ঠিকানাপঞ্জী</string>
- <string name="main_calendar">দিনপঞ্জী</string>
- <string name="main_bookmarks">ঠিকা</string>
- <string name="main_settings">নিয়ামকসমূহ</string>
- <string name="main_tit_accsetup">একাউন্ট সেটআপ</string>
- <string name="actionbar_sync">নবোদ্যম</string>
<string name="actionbar_upload">আপলোড</string>
<string name="actionbar_upload_files">ফাইল</string>
- <string name="actionbar_mkdir">ডিরেক্টরি তৈরী কর</string>
- <string name="actionbar_search">অনুসন্ধান</string>
<string name="actionbar_settings">নিয়ামকসমূহ</string>
+ <string name="actionbar_send_file">পাঠাও</string>
<string name="prefs_category_general">সাধারণ</string>
- <string name="prefs_category_trackmydevice">ডিভাইস ট্র্যাকিং</string>
- <string name="prefs_add_session">নতুন সেসন যোগ কর</string>
- <string name="prefs_create_img_thumbnails">ছবির অঙ্গুলিবীক্ষণ তৈরী কর</string>
- <string name="prefs_select_oc_account">একাউন্ট নির্বাচন কর</string>
- <string name="prefs_trackmydevice">ডিভাইস ট্র্যাকিং</string>
- <string name="prefs_trackmydevice_interval">পরিবর্ধনের মধ্যবিরতি</string>
+ <string name="prefs_category_more">বেশী</string>
<string name="prefs_accounts">একাউন্ট</string>
- <string name="auth_host_url">URL</string>
+ <string name="prefs_help">সহায়িকা</string>
<string name="auth_username">ব্যবহারকারি</string>
<string name="auth_password">কূটশব্দ</string>
- <string name="new_session_uri_error">ভুল ঠিকানা প্রদান করা হয়েছে</string>
- <string name="new_session_session_name_error">সেসনের নামটি ভুল</string>
<string name="sync_string_files">ফাইল</string>
- <string name="uploader_no_file_selected">আপলোড করার জন্য কোন ফাইল নির্বাচন করা হয় নি</string>
- <string name="setup_hint_username">ব্যবহারকারি</string>
- <string name="setup_hint_password">কূটশব্দ</string>
- <string name="setup_hint_address">ওয়েব ঠিকানা</string>
- <string name="setup_hint_show_password">কূটশব্দ প্রদর্শন করবে ?</string>
<string name="setup_btn_connect">সংযুক্ত হও</string>
<string name="uploader_btn_upload_text">আপলোড</string>
<string name="uploader_wrn_no_account_title">কোন একাউন্ট খুঁজে পাওয়া গেল না</string>
<string name="filedetails_created">তৈরীর নির্ঘন্টঃ</string>
<string name="filedetails_modified">পরিবর্তিতঃ</string>
<string name="filedetails_download">ডাউনলোড</string>
- <string name="filedetails_open">খোল</string>
<string name="common_yes">হ্যাঁ</string>
<string name="common_no">না</string>
<string name="common_ok">তথাস্তু</string>
<string name="common_cancel">বাতিল</string>
<string name="common_save_exit">সংরক্ষণ কর এবং &প্রস্থান</string>
<string name="common_error">সমস্যা</string>
- <string name="uploader_info_dirname">ডিরেক্টরির নাম</string>
+ <string name="change_password">কূটশব্দ পরিবর্তন করুন</string>
<string name="common_choose_account">একাউন্ট নির্বাচন</string>
- <string name="common_share">ভাগাভাগি কর</string>
<string name="common_rename">পূনঃনামকরণ</string>
+ <string name="common_remove">অপসারণ</string>
+ <string name="activity_chooser_send_file_title">পাঠাও</string>
</resources>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="actionbar_mkdir">Nova fascikla</string>
+</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Contrasenya:</string>
- <string name="main_login">Nom d\'usuari:</string>
- <string name="main_button_login">Accés</string>
- <string name="main_welcome">Benvingut al vostre ownCloud</string>
- <string name="main_files">Fitxers</string>
- <string name="main_music">Música</string>
- <string name="main_contacts">Contactes</string>
- <string name="main_calendar">Calendari</string>
- <string name="main_bookmarks">Adreces d\'interès</string>
- <string name="main_settings">Configuració</string>
- <string name="main_tit_accsetup">Configuració de comptes</string>
- <string name="main_wrn_accsetup">No hi ha comptes d\'ownCloud en el dispositiu. Per usar l\'aplicació, n\'heu de crear un.</string>
- <string name="about_message">Client ownCloud per Android\n\nversió: %1$s</string>
- <string name="actionbar_sync">Sincronitza el compte</string>
+ <string name="about_android">%1$s aplicació per Android</string>
+ <string name="about_version">versió %1$s</string>
+ <string name="actionbar_sync">Actualitza compte</string>
<string name="actionbar_upload">Puja un fitxer</string>
<string name="actionbar_upload_from_apps">Contingut d\'altres aplicacions</string>
<string name="actionbar_upload_files">Fitxers</string>
- <string name="actionbar_mkdir">Crea una carpeta</string>
- <string name="actionbar_search">Cerca</string>
+ <string name="actionbar_open_with">Obre amb</string>
+ <string name="actionbar_mkdir">Carpeta nova</string>
<string name="actionbar_settings">Configuració</string>
+ <string name="actionbar_see_details">Detalls</string>
+ <string name="actionbar_send_file">Envia</string>
<string name="prefs_category_general">General</string>
- <string name="prefs_category_trackmydevice">Seguiment del dispositiu</string>
- <string name="prefs_add_session">Afegeix una sessió nova</string>
- <string name="prefs_create_img_thumbnails">Crea miniatures d\'imatges</string>
- <string name="prefs_select_oc_account">Seleccioneu un compte</string>
- <string name="prefs_summary_select_oc_account">Escolliu quin dels comptes hauria d\'usar l\'aplicació</string>
- <string name="prefs_trackmydevice">Seguiment del dispositiu</string>
- <string name="prefs_trackmydevice_summary_off">Permet que owCloud faci el seguiment del dispositiu</string>
- <string name="prefs_trackmydevice_summary_on">ownCloud manté el seguiment d\'aquest dispositiu</string>
- <string name="prefs_trackmydevice_interval">Actualitza l\'interval</string>
- <string name="prefs_trackmydevice_interval_summary">Actualitza cada %1$s minuts</string>
+ <string name="prefs_category_more">Més</string>
<string name="prefs_accounts">Comptes</string>
<string name="prefs_manage_accounts">Gestió de comptes</string>
- <string name="prefs_pincode">PIN de l\'aplicació ownCloud</string>
- <string name="prefs_pincode_summary">Protegiu el client ownCloud</string>
+ <string name="prefs_pincode">PIN de l\'aplicació</string>
+ <string name="prefs_pincode_summary">Protegiu el client</string>
<string name="prefs_instant_upload">Activa la pujada instantània</string>
<string name="prefs_instant_upload_summary">Puja instantàniament les fotografies preses amb la càmera</string>
- <string name="auth_host_url">URL de ownCloud</string>
+ <string name="prefs_log_title">Habilita el registre</string>
+ <string name="prefs_log_summary">Això s\'usa per registrar problemes</string>
+ <string name="prefs_log_title_history">Història del registre</string>
+ <string name="prefs_log_summary_history">Això mostra els registres desats</string>
+ <string name="prefs_log_delete_history_button">Esborra la història</string>
+ <string name="prefs_help">Ajuda</string>
+ <string name="prefs_recommend">Recomana a un amic</string>
+ <string name="prefs_feedback">Comentaris</string>
+ <string name="prefs_imprint">Imprint</string>
+ <string name="recommend_subject">Proveu %1$s a un telèfon avançat!</string>
+ <string name="auth_check_server">Comprova el servidor</string>
+ <string name="auth_host_url">Adreça del servidor https://…</string>
<string name="auth_username">Nom d\'usuari</string>
<string name="auth_password">Contrasenya</string>
- <string name="auth_register">Sóc nou a ownCloud</string>
- <string name="new_session_uri_error">La URL proporcionada és incorrecta</string>
- <string name="new_session_session_name_error">El nom de la sessió no és correcte</string>
+ <string name="auth_register">Nou a %1$s?</string>
<string name="sync_string_files">Fitxers</string>
- <string name="uploader_no_file_selected">No heu seleccionat cap fitxer per a la pujada</string>
- <string name="setup_hint_username">Nom d\'usuari</string>
- <string name="setup_hint_password">Contrasenya</string>
- <string name="setup_hint_address">Adreça web</string>
- <string name="setup_hint_show_password">Mostra la contrasenya</string>
- <string name="setup_title">Connecta amb ownCloud</string>
<string name="setup_btn_connect">Connecta</string>
<string name="uploader_btn_upload_text">Puja</string>
<string name="uploader_wrn_no_account_title">No s\'ha trobat el compte</string>
- <string name="uploader_wrn_no_account_text">No hi ha comptes ownCloud en el dispositiu. Configureu un compte primer</string>
+ <string name="uploader_wrn_no_account_text">No hi ha comptes %1$s en el dispositiu. Configureu un compte primer</string>
<string name="uploader_wrn_no_account_setup_btn_text">Configura</string>
<string name="uploader_wrn_no_account_quit_btn_text">Surt</string>
<string name="uploader_wrn_no_content_title">No hi ha continguts per pujar</string>
<string name="uploader_wrn_no_content_text">No s\'ha rebut cap contingut. Res per pujar</string>
- <string name="uploader_error_forbidden_content">ownCloud no pot accedir al contingut compartit</string>
+ <string name="uploader_error_forbidden_content">%1$s no pot accedir al contingut compartit</string>
<string name="uploader_info_uploading">S\'està pujant</string>
- <string name="uploader_btn_create_dir_text">Crea una carpeta per les pujades</string>
<string name="file_list_empty">No hi ha fitxers en aquesta carpeta.\nPodeu afegir fitxers a través de l\'opció \"Puja\" del menú.</string>
<string name="filedetails_select_file">Feu clic en un fitxer per mostrar informació addicional.</string>
<string name="filedetails_size">Mida:</string>
<string name="filedetails_created">Creat:</string>
<string name="filedetails_modified">Modificat:</string>
<string name="filedetails_download">Baixa</string>
- <string name="filedetails_sync_file">Refrescar</string>
- <string name="filedetails_redownload">Baixa de nou</string>
- <string name="filedetails_open">Obre</string>
+ <string name="filedetails_sync_file">Actualitza el fitxer</string>
<string name="filedetails_renamed_in_upload_msg">L\'arxiu s\'ha canviat de nom a %1$s durant la càrrega</string>
+ <string name="action_share_file">Enllaç de compartició</string>
+ <string name="action_unshare_file">Deixa de compartir l\'enllaç</string>
<string name="common_yes">Sí</string>
<string name="common_no">No</string>
<string name="common_ok">D\'acord</string>
<string name="common_cancel_upload">Cancel·la la pujada</string>
<string name="common_cancel">Cancel·la</string>
<string name="common_save_exit">Desa & Surt</string>
- <string name="common_exit">Surt de ownCloud</string>
<string name="common_error">Error</string>
+ <string name="common_loading">Carregant...</string>
+ <string name="common_error_unknown">Error desconegut</string>
<string name="about_title">Quant a</string>
+ <string name="change_password">Canvia la contrasenya</string>
<string name="delete_account">Elimina compte</string>
<string name="create_account">Crea un compte</string>
<string name="upload_chooser_title">Puja fitxer des de ...</string>
<string name="uploader_upload_in_progress_content">%1$d%% Pujant %2$s</string>
<string name="uploader_upload_succeeded_ticker">La pujada ha estat correcte</string>
<string name="uploader_upload_succeeded_content_single">%1$s s\'ha pujat correctament</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d fitxers s\'han pujat correctament</string>
<string name="uploader_upload_failed_ticker">La pujada ha fallat</string>
<string name="uploader_upload_failed_content_single">La pujada de %1$s no s\'ha pogut acabar</string>
- <string name="uploader_upload_failed_content_multiple">La pujada ha fallat: s\'han pujat %1$d/%2$d fitxers</string>
<string name="downloader_download_in_progress_ticker">S\'està baixant ...</string>
<string name="downloader_download_in_progress_content">%1$d%% pujant %2$s</string>
<string name="downloader_download_succeeded_ticker">La baixada ha estat correcte</string>
<string name="downloader_download_succeeded_content">%1$s s\'han baixat correctament</string>
<string name="downloader_download_failed_ticker">La baixada ha fallat</string>
<string name="downloader_download_failed_content">La baixada de %1$s no s\'ha pogut acabar</string>
+ <string name="downloader_not_downloaded_yet">No baixat encara</string>
<string name="common_choose_account">Escolliu el compte</string>
- <string name="sync_string_contacts">Contactes</string>
<string name="sync_fail_ticker">La sincronització ha fallat</string>
<string name="sync_fail_content">La sincronització de %1$s no s\'ha pogut acabar</string>
+ <string name="sync_fail_content_unauthorized">Contrasenya no vàlida per %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">S\'han trobat conflictes</string>
<string name="sync_conflicts_in_favourites_content">%1$d mantinguts els arxius que no podien ser sincronitzats</string>
<string name="sync_fail_in_favourites_ticker">Es mantenent els arxius a sincronitzar erronis</string>
<string name="sync_fail_in_favourites_content">El contingut de %1$d arxius no es va poder sincronitzar (%2$d conflictes)</string>
- <string name="use_ssl">Usa connexió segura</string>
- <string name="location_no_provider">ownCloud no pot fer el seguiment de l\'equip. Comproveu la configuració d\'ubicuació</string>
+ <string name="sync_foreign_files_forgotten_ticker">S\'han oblidat alguns fitxers locals</string>
+ <string name="sync_current_folder_was_removed">La carpeta %1$s ja no existeix</string>
+ <string name="foreign_files_move">Mou-los tots</string>
+ <string name="foreign_files_success">S\'han mogut tots els fitxers</string>
+ <string name="foreign_files_fail">Alguns fitxers no s\'han pogut moure</string>
+ <string name="foreign_files_local_text">Local: %1$s</string>
+ <string name="foreign_files_remote_text">Remot: %1$s</string>
+ <string name="upload_query_move_foreign_files">No hi ha prou espai per copiar els fitxers seleccionats a la carpeta %1$s. Els hi voleu moure?</string>
<string name="pincode_enter_pin_code">Escriviu el PIN de l\'aplicació</string>
- <string name="pincode_enter_new_pin_code">Escriviu el nou PIN de l\'aplicació</string>
- <string name="pincode_configure_your_pin">Escriviu el PIN de l\'aplicació ownCloud</string>
+ <string name="pincode_configure_your_pin">Escriviu el PIN de l\'aplicació</string>
<string name="pincode_configure_your_pin_explanation">es requerirà el PIN cada vegada que s\'iniciï l\'aplicació</string>
- <string name="pincode_reenter_your_pincode">Torneu a escriure el PIN de l\'aplicació ownCloud</string>
- <string name="pincode_remove_your_pincode">Elimina el PIN de l\'aplicació ownCloud</string>
+ <string name="pincode_reenter_your_pincode">Torneu a escriure el PIN de l\'aplicació </string>
+ <string name="pincode_remove_your_pincode">Elimina el PIN de l\'aplicació</string>
<string name="pincode_mismatch">Els PINs de l\'aplicació no coincideixen</string>
- <string name="pincode_wrong">El PIN de l\'aplicació ownCloud no és correcte</string>
- <string name="pincode_removed">S\'ha eliminat el PIN de l\'aplicació ownCloud</string>
- <string name="pincode_stored">S\'ha desat el PIN de l\'aplicació ownCloud</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 Minuts</item>
- <item>30 Minuts</item>
- <item>60 Minuts</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_wrong">El PIN de l\'aplicació no és correcte</string>
+ <string name="pincode_removed">S\'ha eliminat el PIN de l\'aplicació </string>
+ <string name="pincode_stored">S\'ha desat el PIN de l\'aplicació </string>
+ <string name="media_notif_ticker">reproductor de música %1$s</string>
+ <string name="media_state_playing">%1$s (sonant)</string>
+ <string name="media_state_loading">%1$s (carregant)</string>
+ <string name="media_event_done">reproducció acabada %1$s</string>
+ <string name="media_err_nothing_to_play">No s\'han trobat fitxers multimedia</string>
+ <string name="media_err_no_account">No s\'ha proporcionat cap compte</string>
+ <string name="media_err_not_in_owncloud">El fitxer no és en un compte vàlid</string>
+ <string name="media_err_unsupported">El codec multimèdia no és compatible</string>
+ <string name="media_err_io">El fitxer multimèdia no es pot llegir</string>
+ <string name="media_err_malformed">El fitxer multimèdia no està codificat correctament</string>
+ <string name="media_err_timeout">Temps exhaurit en intentar reproduir-ho</string>
+ <string name="media_err_invalid_progressive_playback">El fitxer multimèdia no es pot transmetre</string>
+ <string name="media_err_unknown">El fitxer multimèdia no es pot reproduir amb el reproductor per defecte</string>
+ <string name="media_err_security_ex">Error de seguretat en intentar reproduir %1$s</string>
+ <string name="media_err_io_ex">Error d\'entrada intentant reproduir %1$s</string>
+ <string name="media_err_unexpected">Error inesperat intentant reproduir %1$s</string>
+ <string name="media_rewind_description">Botó de rebobinat</string>
+ <string name="media_play_pause_description">Botó de reproducció o pausa</string>
+ <string name="media_forward_description">Botó de reproducció ràpida</string>
<string name="auth_trying_to_login">S\'està intentant acreditar-vos...</string>
<string name="auth_no_net_conn_title">Sense connexió de xarxa</string>
- <string name="auth_no_net_conn_message">No s\'ha detectat cap connexió, comproveu la connexió i torneu a intentar-ho.</string>
- <string name="auth_connect_anyway">Connecta igualment</string>
<string name="auth_nossl_plain_ok_title">La connexió segura no està disponible.</string>
- <string name="auth_nossl_plain_ok_message">L\'aplicació no ha pogut establir una connexió segura amb el servidor. Malgrat tot, una connexió no segura està disponible. Podeu continuar o cancel·lar.</string>
<string name="auth_connection_established">S\'ha establert la connexió</string>
<string name="auth_testing_connection">S\'està comprovant la connexió...</string>
- <string name="auth_not_configured_title">La configuració de ownCloud està malformada</string>
- <string name="auth_not_configured_message">Sembla que la instància ownCloud no està configurada correctament. Per més detalls contacteu amb l\'administrador.</string>
+ <string name="auth_not_configured_title">La configuració del servidor està malformada</string>
+ <string name="auth_account_not_new">Ja hi ha un compte al dispositiu pel mateix usuari i mateix servidor</string>
+ <string name="auth_account_not_the_same">L\'usuari introduït no coincideix amb l\'usuari d\'aquest compte</string>
<string name="auth_unknown_error_title">S\'ha produït un error desconegut</string>
- <string name="auth_unknown_error_message">S\'ha produït un error desconegut. Contacteu els autors i inclogueu els registres del dispositiu.</string>
<string name="auth_unknown_host_title">No s\'ha trobat el servidor</string>
- <string name="auth_unknown_host_message">No s\'ha trobat el servidor. Comproveu el nom del servidor i la seva disponibilitat i intenteu-ho de nou.</string>
- <string name="auth_incorrect_path_title">No s\'ha trobat la instància ownCloud</string>
- <string name="auth_incorrect_path_message">L\'aplicació no ha trobat la instància ownCloud al camí indicat. Comproveu el camí i torneu-ho a intentar.</string>
+ <string name="auth_incorrect_path_title">No s\'ha trobat la instància del servidor</string>
<string name="auth_timeout_title">El servidor ha trigat massa en respondre</string>
<string name="auth_incorrect_address_title">La URL esà malformada</string>
<string name="auth_ssl_general_error_title">La inicialització SSL ha fallat</string>
<string name="auth_ssl_unverified_server_title">No s\'ha pogut verificar la identitat SSL del servidor</string>
- <string name="auth_bad_oc_version_title">Versió del servidor ownCloud desconeguda</string>
+ <string name="auth_bad_oc_version_title">Versió del servidor desconeguda</string>
<string name="auth_wrong_connection_title">No s\'ha pogut establir la connexió</string>
<string name="auth_secure_connection">S\'ha establert la connexió segura</string>
- <string name="auth_login_details">Detalls de connexió</string>
- <string name="auth_unauthorized">Login / contrasenya incorrectes</string>
- <string name="auth_not_found">Camí equivocat</string>
- <string name="auth_internal">Error intern del servidor, codi %1$d</string>
- <string name="crashlog_message">L\'aplicació s\'ha aturat de manera no prevista. Voleu enviar el registre d\'errors?</string>
- <string name="crashlog_send_report">Envia el registre d\'errors</string>
- <string name="crashlog_dont_send_report">No envïis el registre d\'errors</string>
- <string name="extensions_avail_title">Hi ha extensions disponibles!</string>
- <string name="extensions_avail_message">Sembla que la instància ownCloud té suport per extensions avançades. Voleu veure les extensions disponibles per Android?</string>
+ <string name="auth_unauthorized">Nom d\'usuari o contrasenya incorrectes</string>
+ <string name="auth_oauth_error">Autorització sense èxit</string>
+ <string name="auth_oauth_error_access_denied">El servidor d\'autenticació us ha denegat l\'accés</string>
+ <string name="auth_wtf_reenter_URL">Estat inesperat; escriviu l\'adreça de nou</string>
+ <string name="auth_expired_oauth_token_toast">La vostra autorització ha vençut. Acrediteu-vos de nou</string>
+ <string name="auth_expired_basic_auth_toast">Escriviu la contrasenya actual</string>
+ <string name="auth_expired_saml_sso_token_toast">La sessió ha vençut. Connecteu-vos de nou</string>
+ <string name="auth_connecting_auth_server">S\'està connectant a un servidor d\'autenticació...</string>
+ <string name="auth_unsupported_auth_method">El serivdor no permet aquest mètode d\'autenticació</string>
+ <string name="auth_unsupported_multiaccount">%1$s no permet comptes múltiples</string>
+ <string name="auth_can_not_auth_against_server">No es pot autenticar en aquest servidor</string>
<string name="fd_keep_in_sync">Mantén el fitxer actualitzat</string>
- <string name="common_share">Comparteix</string>
<string name="common_rename">Reanomena</string>
<string name="common_remove">Elimina</string>
<string name="confirmation_remove_alert">Esteu segur que voleu eliminar %1$s?</string>
<string name="confirmation_remove_local">Només local</string>
<string name="confirmation_remove_folder_local">Només contiguts locals</string>
<string name="confirmation_remove_remote">Elimina del servidor</string>
- <string name="confirmation_remove_remote_and_local">Tant el remot com el local</string>
+ <string name="confirmation_remove_remote_and_local">Remot i local</string>
<string name="remove_success_msg">L\'eliminació ha tingut èxit</string>
<string name="remove_fail_msg">No s\'ha pogut completar l\'eliminació</string>
<string name="rename_dialog_title">Introdueix un nom nou</string>
<string name="rename_server_fail_msg">El canvi de nom no s\'ha pogut completar</string>
<string name="sync_file_fail_msg">L\'arxiu remot no ha pogut ser comprovat</string>
<string name="sync_file_nothing_to_do_msg">Contingut de l\'arxiu ja sincronitzat</string>
- <string name="create_dir_fail_msg">La carpeta no s\'ha pogut crear</string>
+ <string name="filename_forbidden_characters">Caràcters no permesos: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Espereu</string>
<string name="filedisplay_unexpected_bad_get_content">S\'ha produït un problema inesperat; proveu una altra aplicació per seleccionar el fitxer</string>
<string name="filedisplay_no_file_selected">No heu seleccionat cap fitxer</string>
- <string name="ssl_validator_title">Avís</string>
+ <string name="activity_chooser_title">Envia l\'enllaç a...</string>
+ <string name="oauth_check_onoff">Accés amb oAuth2</string>
+ <string name="oauth_login_connection">Connectant amb el servidor oAuth2...</string>
<string name="ssl_validator_header">No s\'ha pogut verificar la identitat del lloc web</string>
<string name="ssl_validator_reason_cert_not_trusted">- El certificat del servidor no està autenticat</string>
<string name="ssl_validator_reason_cert_expired">- El certificat del servidor ha expirat</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- El certificat del servidor és massa jove</string>
<string name="ssl_validator_reason_hostname_not_verified">- La URL no coincideix el nom del servidor en el certificat</string>
- <string name="ssl_validator_certificate_not_available">No s\'ha pogut obtenir el certificat del servidor</string>
<string name="ssl_validator_question">Voleu confiar en aquest certificat igualment?</string>
<string name="ssl_validator_not_saved">El certificat no s\'ha pogu desar</string>
<string name="ssl_validator_btn_details_see">Detalls</string>
<string name="ssl_validator_label_validity_to">A:</string>
<string name="ssl_validator_label_signature">Signatura:</string>
<string name="ssl_validator_label_signature_algorithm">Algoritme:</string>
- <string name="text_placeholder">Això és un text variable</string>
+ <string name="ssl_validator_null_cert">No s\'ha pogut mostrar el certificat.</string>
+ <string name="ssl_validator_no_info_about_error">- No hi ha informació de l\'error</string>
+ <string name="placeholder_sentence">Això és un text variable</string>
+ <string name="placeholder_filename">placeholder.txt</string>
+ <string name="placeholder_filetype">Imatge PNG</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Puja les fotos només via WiFi</string>
<string name="instant_upload_path">/CarregaInstantània</string>
<string name="conflict_title">Conflicte d\'actualització</string>
<string name="conflict_keep_both">Mantén-los ambdós</string>
<string name="conflict_overwrite">Sobrescriu</string>
<string name="conflict_dont_upload">No el pugis</string>
+ <string name="preview_image_description">Visualització prèvia d\'imatge</string>
+ <string name="preview_image_error_unknown_format">Auquesta imatge no es pot mostrar</string>
+ <string name="actionbar_failed_instant_upload">La pujada instantània ha fallat</string>
+ <string name="failed_upload_headline_text">Fallada de pujades instantànies</string>
+ <string name="failed_upload_headline_hint">Resum de totes les pujades instantànies que han fallat</string>
+ <string name="failed_upload_all_cb">selecciona-ho tot</string>
+ <string name="failed_upload_headline_retryall_btn">reintenta els seleccionats</string>
+ <string name="failed_upload_headline_delete_all_btn">elimina tots els seleccionats de la cua de pujada</string>
+ <string name="failed_upload_retry_text">intenta pujar de nou la imatge:</string>
+ <string name="failed_upload_load_more_images">Carrega més imatges</string>
+ <string name="failed_upload_retry_do_nothing_text">no facis res, no estàs en lína per la pujada instantània</string>
+ <string name="failed_upload_failure_text">Missatge d\'Error:</string>
+ <string name="failed_upload_quota_exceeded_text">Comproveu la configuració del servidor, potser heu excedit la quota.</string>
+ <string name="share_link_file_no_exist">No es pot compartir aquest fitxer o carpeta. Assegureu-vos que existeix</string>
+ <string name="share_link_file_error">S\'ha produït un error en intentar compartir aquest fitxer o carpeta</string>
+ <string name="unshare_link_file_no_exist">No es pot deixar de compartir aquest fitxer o carpeta. No existeix.</string>
+ <string name="unshare_link_file_error">S\'ha produït un error en intentar deixar de compartir aquest fitxer o carpeta</string>
+ <string name="activity_chooser_send_file_title">Envia</string>
+ <string name="copy_link">Copia l\'enllaç</string>
+ <string name="clipboard_text_copied">S\'ha copiat al porta-retalls</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Heslo:</string>
- <string name="main_login">Uživatelské jméno:</string>
- <string name="main_button_login">Přihlásit</string>
- <string name="main_welcome">Vítejte ve svém ownCloudu</string>
- <string name="main_files">Soubory</string>
- <string name="main_music">Hudba</string>
- <string name="main_contacts">Kontakty</string>
- <string name="main_calendar">Kalendář</string>
- <string name="main_bookmarks">Záložky</string>
- <string name="main_settings">Nastavení</string>
- <string name="main_tit_accsetup">Nastavit účet</string>
- <string name="main_wrn_accsetup">Nemáte nastavené žádné účty ownCloud. Aby bylo možné tuto aplikaci používat, musíte si nějaký vytvořit.</string>
- <string name="about_message">klient ownCloud pro Android\n\nverze: %1$s</string>
- <string name="actionbar_sync">Obnovit</string>
+ <string name="about_android">%1$s Android aplikace</string>
+ <string name="about_version">verze %1$s</string>
+ <string name="actionbar_sync">Obnovit účet</string>
<string name="actionbar_upload">Odeslat</string>
<string name="actionbar_upload_from_apps">Obsah z ostatních aplikací</string>
<string name="actionbar_upload_files">Soubory</string>
- <string name="actionbar_mkdir">Vytvořit adresář</string>
- <string name="actionbar_search">Hledat</string>
+ <string name="actionbar_open_with">Otevřít pomocí</string>
+ <string name="actionbar_mkdir">Nová složka</string>
<string name="actionbar_settings">Nastavení</string>
+ <string name="actionbar_see_details">Podrobnosti</string>
+ <string name="actionbar_send_file">Odeslat</string>
<string name="prefs_category_general">Obecné</string>
- <string name="prefs_category_trackmydevice">Sledování zařízení</string>
- <string name="prefs_add_session">Přidat nové sezení</string>
- <string name="prefs_create_img_thumbnails">Vytvořit náhledy obrázků</string>
- <string name="prefs_select_oc_account">Vybrat účet</string>
- <string name="prefs_summary_select_oc_account">Vyberte, který účet má tato aplikace používat.</string>
- <string name="prefs_trackmydevice">Sledování zařízení</string>
- <string name="prefs_trackmydevice_summary_off">Povolit ownCloudu sledovat polohu Vašeho zařízení</string>
- <string name="prefs_trackmydevice_summary_on">Váš ownCloud sleduje toto zařízení</string>
- <string name="prefs_trackmydevice_interval">Interval aktualizace</string>
- <string name="prefs_trackmydevice_interval_summary">Aktualizovat každých %1$s minut</string>
+ <string name="prefs_category_more">Více</string>
<string name="prefs_accounts">Účty</string>
<string name="prefs_manage_accounts">Spravovat účty</string>
- <string name="prefs_pincode">PIN aplikace ownCloud</string>
- <string name="prefs_pincode_summary">Chraňte svého klienta ownCloud</string>
+ <string name="prefs_pincode">PIN aplikace</string>
+ <string name="prefs_pincode_summary">Chraňte svého klienta</string>
<string name="prefs_instant_upload">Povolit okamžité odeslání</string>
<string name="prefs_instant_upload_summary">Okamžitě odesílat vytvořené fotografie</string>
- <string name="auth_host_url">URL ownCloud</string>
+ <string name="prefs_log_title">Povolit logování</string>
+ <string name="prefs_log_summary">Použito k zaznamenávání problémů</string>
+ <string name="prefs_log_title_history">Historie logování</string>
+ <string name="prefs_log_summary_history">Zobrazuje zaznamenané logy</string>
+ <string name="prefs_log_delete_history_button">Smazat historii</string>
+ <string name="prefs_help">Nápověda</string>
+ <string name="prefs_recommend">Doporučit příteli</string>
+ <string name="prefs_feedback">Odezva</string>
+ <string name="prefs_imprint">Imprint</string>
+ <string name="recommend_subject">Zkuste %1$s na vašem smartphonu!</string>
+ <string name="auth_check_server">Zkontrolovat server</string>
+ <string name="auth_host_url">Adresa serveru https://...</string>
<string name="auth_username">Uživatelské jméno</string>
<string name="auth_password">Heslo</string>
- <string name="auth_register">Jsem nový na ownCloud.</string>
- <string name="new_session_uri_error">Zadané neplatné URL</string>
- <string name="new_session_session_name_error">Neplatný název sezení</string>
+ <string name="auth_register">Nováček s %1$s?</string>
<string name="sync_string_files">Soubory</string>
- <string name="uploader_no_file_selected">Žádný soubor nevybrán k odeslání</string>
- <string name="setup_hint_username">Uživatelské jméno</string>
- <string name="setup_hint_password">Heslo</string>
- <string name="setup_hint_address">Webová adresa</string>
- <string name="setup_hint_show_password">Zobrazit heslo?</string>
- <string name="setup_title">Připojit k Vašemu ownCloudu</string>
<string name="setup_btn_connect">Připojit</string>
<string name="uploader_btn_upload_text">Odeslat</string>
<string name="uploader_wrn_no_account_title">Nenalezen žádný účet</string>
- <string name="uploader_wrn_no_account_text">Nemáte žádné ownCloud účty. Vytvořte si, prosím, nejdříve účet.</string>
+ <string name="uploader_wrn_no_account_text">Nemáte žádné %1$s účty. Vytvořte si, prosím, nejdříve účet.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Nastavení</string>
<string name="uploader_wrn_no_account_quit_btn_text">Ukončit</string>
<string name="uploader_wrn_no_content_title">Žádný obsah k odeslání</string>
<string name="uploader_wrn_no_content_text">Neobdržen žádný obsah. Nic k odeslání.</string>
- <string name="uploader_error_forbidden_content">ownCloud nemá právo přistupovat ke sdílenému obsahu</string>
+ <string name="uploader_error_forbidden_content">%1$s nemá právo přistupovat ke sdílenému obsahu</string>
<string name="uploader_info_uploading">Odesílání</string>
- <string name="uploader_btn_create_dir_text">Vytvořit adresář pro odesílání</string>
<string name="file_list_empty">Ve složce nejsou žádné soubory.\nNové soubory mohou být přidány pomocí volby \"Odeslat\".</string>
<string name="filedetails_select_file">Více informací získáte klepnutím na soubor.</string>
<string name="filedetails_size">Velikost:</string>
<string name="filedetails_created">Vytvořen:</string>
<string name="filedetails_modified">Upraven:</string>
<string name="filedetails_download">Stáhnout</string>
- <string name="filedetails_sync_file">Obnovit</string>
- <string name="filedetails_redownload">Znovu stáhnout</string>
- <string name="filedetails_open">Otevřít</string>
+ <string name="filedetails_sync_file">Obnovit soubor</string>
<string name="filedetails_renamed_in_upload_msg">Soubor byl v průběhu odesílání přejmenován na %1$s</string>
+ <string name="action_share_file">Sdílet odkaz</string>
+ <string name="action_unshare_file">Zrušit sdílení odkazu</string>
<string name="common_yes">Ano</string>
<string name="common_no">Ne</string>
<string name="common_ok">OK</string>
<string name="common_cancel_upload">Zrušit odesílání</string>
<string name="common_cancel">Zrušit</string>
<string name="common_save_exit">Uložit a ukončit</string>
- <string name="common_exit">Opustit ownCloud</string>
<string name="common_error">Chyba</string>
+ <string name="common_loading">Načítání ...</string>
+ <string name="common_error_unknown">Neznámá chyba</string>
<string name="about_title">O aplikaci</string>
+ <string name="change_password">Změnit heslo</string>
<string name="delete_account">Smazat účet</string>
<string name="create_account">Vytvořit účet</string>
- <string name="upload_chooser_title">Odeslat z...</string>
- <string name="uploader_info_dirname">Název adresáře</string>
+ <string name="upload_chooser_title">Odeslat z ...</string>
+ <string name="uploader_info_dirname">Název složky</string>
<string name="uploader_upload_in_progress_ticker">Odesílám...</string>
<string name="uploader_upload_in_progress_content">%1$d%% Odesílám %2$s</string>
<string name="uploader_upload_succeeded_ticker">Odesílání úspěšné</string>
<string name="uploader_upload_succeeded_content_single">%1$s byl úspěšně odeslán</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$s soubory byly úspěšně odeslány</string>
<string name="uploader_upload_failed_ticker">Odesílání selhalo</string>
<string name="uploader_upload_failed_content_single">Odesílání %1$s nemohlo být dokončeno</string>
- <string name="uploader_upload_failed_content_multiple">Nahrávání selhalo: %1$d/%2$d souborů odesláno</string>
<string name="downloader_download_in_progress_ticker">Stahuji ...</string>
<string name="downloader_download_in_progress_content">%1$d%% Stahuji %2$s</string>
<string name="downloader_download_succeeded_ticker">Stažení úspěšné</string>
<string name="downloader_download_succeeded_content">%1$s byl úspěšně stažen</string>
<string name="downloader_download_failed_ticker">Stažení selhalo</string>
<string name="downloader_download_failed_content">Stažení %1$s nemohlo být dokončeno</string>
+ <string name="downloader_not_downloaded_yet">Ještě nestaženo</string>
<string name="common_choose_account">Vybrat účet</string>
- <string name="sync_string_contacts">Kontakty</string>
<string name="sync_fail_ticker">Synchronizace selhala</string>
<string name="sync_fail_content">Synchronizaci %1$s nelze dokončit</string>
+ <string name="sync_fail_content_unauthorized">Chybné heslo pro %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Nalezeny konflikty</string>
<string name="sync_conflicts_in_favourites_content">%1$d souborů z automatické synchronizace nelze synchronizovat</string>
<string name="sync_fail_in_favourites_ticker">Automatická synchronizace souborů selhala</string>
<string name="sync_fail_in_favourites_content">Obsah %1$d souborů nemohl být synchronizován (počet konfliktů: %2$d)</string>
- <string name="use_ssl">Použít zabezpečené spojení</string>
- <string name="location_no_provider">ownCloud nemůže sledovat vaše zařízení. Zkontroluje nastavení zjišťování polohy.</string>
+ <string name="sync_foreign_files_forgotten_ticker">Některé místní soubory byly zapomenuty</string>
+ <string name="sync_current_folder_was_removed">Složka %1$s již neexistuje</string>
+ <string name="foreign_files_move">Přesunout vše</string>
+ <string name="foreign_files_success">Všechny soubory byly přesunuty</string>
+ <string name="foreign_files_fail">Některé soubory nebylo možno přesunout</string>
+ <string name="foreign_files_local_text">Místní: %1$s</string>
+ <string name="foreign_files_remote_text">Vzdálené: %1$s</string>
+ <string name="upload_query_move_foreign_files">Nedostatek místa pro zkopírování vybraných souborů do složky %1$s. Přejete si je místo kopírování přesunout?</string>
<string name="pincode_enter_pin_code">Zadejte PIN aplikace</string>
- <string name="pincode_enter_new_pin_code">Zadejte nový PIN aplikace</string>
- <string name="pincode_configure_your_pin">Zadat PIN ownCloud aplikace</string>
+ <string name="pincode_configure_your_pin">Zadat PIN aplikace</string>
<string name="pincode_configure_your_pin_explanation">Při každém spuštění aplikace bude vyžadováno zadání PIN</string>
- <string name="pincode_reenter_your_pincode">Zopakovat PIN ownCloud aplikace</string>
- <string name="pincode_remove_your_pincode">Odstranit PIN ownCloud aplikace</string>
- <string name="pincode_mismatch">PINy se neshodují</string>
- <string name="pincode_wrong">Neplatný PIN</string>
- <string name="pincode_removed">PIN ownCloud aplikace odstraněn</string>
- <string name="pincode_stored">PIN ownCloud aplikace uložen</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 Minut</item>
- <item>30 Minut</item>
- <item>60 Minut</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_reenter_your_pincode">Zadejte znovu PIN aplikace</string>
+ <string name="pincode_remove_your_pincode">Odstranit PIN aplikace</string>
+ <string name="pincode_mismatch">PINy aplikace se neshodují</string>
+ <string name="pincode_wrong">Neplatný PIN aplikace</string>
+ <string name="pincode_removed">PIN aplikace odstraněn</string>
+ <string name="pincode_stored">PIN aplikace uložen</string>
+ <string name="media_notif_ticker">Hudební přehrávač %1$s</string>
+ <string name="media_state_playing">%1$s (přehrává)</string>
+ <string name="media_state_loading">%1$s (načítá)</string>
+ <string name="media_event_done">%1$s přehrávání dokončeno</string>
+ <string name="media_err_nothing_to_play">Nenalezen žádný multimediální soubor</string>
+ <string name="media_err_no_account">Neposkytnut žádný účet</string>
+ <string name="media_err_not_in_owncloud">Soubor není v platném účtu</string>
+ <string name="media_err_unsupported">Nepodporovaný kodek</string>
+ <string name="media_err_io">Multimediální soubor nelze přečíst</string>
+ <string name="media_err_malformed">Multimediální soubor není správně kódován</string>
+ <string name="media_err_timeout">Vypršel čas při pokusu o přehrání</string>
+ <string name="media_err_invalid_progressive_playback">Multimediální soubor nelze proudově odesílat</string>
+ <string name="media_err_unknown">Multimediální soubor nemůže být přehrán s výchozím přehrávačem</string>
+ <string name="media_err_security_ex">Chyba zabezpečení při pokusu o přehrání %1$s</string>
+ <string name="media_err_io_ex">Chyba vstupu při pokusu o přehrání %1$s</string>
+ <string name="media_err_unexpected">Neočekávaná chyba při pokusu o přehrání %1$s</string>
+ <string name="media_rewind_description">Tlačítko Přetočit</string>
+ <string name="media_play_pause_description">Tlačítko Přehrát/Pozastavit</string>
+ <string name="media_forward_description">Tlačítko Rychle vpřed</string>
<string name="auth_trying_to_login">Zkouším se přihlásit...</string>
<string name="auth_no_net_conn_title">Žádné síťové spojení</string>
- <string name="auth_no_net_conn_message">Nebylo nalezeno připojení k síti, zkontrolujte svoje připojení a zkuste to znovu.</string>
- <string name="auth_connect_anyway">I přesto připojit</string>
<string name="auth_nossl_plain_ok_title">Zabezpečené spojení není k dispozici</string>
- <string name="auth_nossl_plain_ok_message">Aplikace nemůže navázat zabezpečené spojení se serverem. Ačkoliv nezabezpečené spojení je k dispozici. Můžete pokračovat, či přerušit spojení.</string>
<string name="auth_connection_established">Spojení navázáno</string>
<string name="auth_testing_connection">Zkouším spojení...</string>
- <string name="auth_not_configured_title">Neplatné nastavení ownCloudu</string>
- <string name="auth_not_configured_message">Vypadá to že nastavení Vaší instance ownCloud není správné. Kontaktujte svého správce pro více informací.</string>
+ <string name="auth_not_configured_title">Neplatné nastavení serveru</string>
+ <string name="auth_account_not_new">Účet pro stejného uživatele a server již v zařízení existuje</string>
+ <string name="auth_account_not_the_same">Zadaný uživatel neodpovídá uživateli tohoto účtu</string>
<string name="auth_unknown_error_title">Nastala neznámá chyba</string>
- <string name="auth_unknown_error_message">Nastala neznámá chyba. Prosím kontaktujte autory a připojte záznam z Vašeho zařízení.</string>
<string name="auth_unknown_host_title">Nelze najít hostitele</string>
- <string name="auth_unknown_host_message">Nemůžu navázat spojení se serverem. Zkontrolujte zda máje správnou adresu, zda server běží a zkuste to znovu.</string>
- <string name="auth_incorrect_path_title">Instance ownCloud nenalezena</string>
- <string name="auth_incorrect_path_message">Aplikace nenalezla na zadané adrese instanci ownCloud. Zkontrolujte cestu a zkuste znovu.</string>
+ <string name="auth_incorrect_path_title">Instance serveru nenalezena</string>
<string name="auth_timeout_title">Serveru trvalo příliš dlouho odpovědět</string>
<string name="auth_incorrect_address_title">Neplatné URL</string>
<string name="auth_ssl_general_error_title">Inicializace SSL selhala</string>
- <string name="auth_ssl_unverified_server_title">Neověřená identita SSL serveru</string>
- <string name="auth_bad_oc_version_title">Nerozpoznaná verze serveru ownCloud</string>
+ <string name="auth_ssl_unverified_server_title">Nemohu ověřit SSL identitu serveru</string>
+ <string name="auth_bad_oc_version_title">Nerozpoznaná verze serveru</string>
<string name="auth_wrong_connection_title">Nemohu navázat spojení</string>
<string name="auth_secure_connection">Zabezpečené spojení navázáno</string>
- <string name="auth_login_details">Podrobnosti přihlášení</string>
- <string name="auth_unauthorized">Neplatné přihlašovací údaje</string>
- <string name="auth_not_found">Zadána neplatná cesta</string>
- <string name="auth_internal">Interní chyba serveru, kód %1$d</string>
- <string name="crashlog_message">Aplikace neočekávaně skončila. Chcete odeslat zprávu o chybě?</string>
- <string name="crashlog_send_report">Odeslat zprávu</string>
- <string name="crashlog_dont_send_report">Neodesílat zprávu</string>
- <string name="extensions_avail_title">Rozšíření jsou dostupná!</string>
- <string name="extensions_avail_message">Vypadá to, že Vaše instance ownCloud podporuje pokročilá rozšíření. Přejete si zobrazit rozšíření dostupná pro android?</string>
+ <string name="auth_unauthorized">Chybné přihlašovací jméno nebo heslo</string>
+ <string name="auth_oauth_error">Neúspěšné přihlášení</string>
+ <string name="auth_oauth_error_access_denied">Přístup zamítnut autorizačním serverem</string>
+ <string name="auth_wtf_reenter_URL">Neočekávaný stav; prosím vložte znovu URL adresu serveru</string>
+ <string name="auth_expired_oauth_token_toast">Vaše přihlášení vypršelo. Přihlašte se, prosím, znovu</string>
+ <string name="auth_expired_basic_auth_toast">Zadejte prosím aktuální heslo</string>
+ <string name="auth_expired_saml_sso_token_toast">Vaše přihlášení vypršelo. Přihlašte se, prosím, znovu</string>
+ <string name="auth_connecting_auth_server">Připojuji se k přihlašovacímu serveru...</string>
+ <string name="auth_unsupported_auth_method">Server nepodporuje tuto přihlašovací metodu</string>
+ <string name="auth_unsupported_multiaccount">%1$s nepodporuje více účtů</string>
+ <string name="auth_can_not_auth_against_server">Není možné provést ověření </string>
<string name="fd_keep_in_sync">Udržovat soubor aktuální</string>
- <string name="common_share">Sdílet</string>
<string name="common_rename">Přejmenovat</string>
<string name="common_remove">Odstranit</string>
- <string name="confirmation_remove_alert">opravdu si přejete odstranit %1$s ?</string>
+ <string name="confirmation_remove_alert">Opravdu si přejete odstranit %1$s ?</string>
<string name="confirmation_remove_folder_alert">Opravdu si přejete odstranit %1$s a jeho obsah?</string>
<string name="confirmation_remove_local">Pouze místní</string>
<string name="confirmation_remove_folder_local">Pouze místní obsah</string>
<string name="rename_server_fail_msg">Přejmenování nelze dokončit</string>
<string name="sync_file_fail_msg">Vzdálený soubor nemohl být zkontrolován</string>
<string name="sync_file_nothing_to_do_msg">Obsah souboru je již synchronizován</string>
- <string name="create_dir_fail_msg">Adresář nelze vytvořit</string>
+ <string name="filename_forbidden_characters">Zakázané znaky: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Počkejte chvíli</string>
<string name="filedisplay_unexpected_bad_get_content">Neočekávaný problém - zkuste zvolit soubor jinou aplikací</string>
<string name="filedisplay_no_file_selected">Žádný soubor nebyl vybrán</string>
- <string name="ssl_validator_title">Varování</string>
+ <string name="activity_chooser_title">Odeslat odkaz ...</string>
+ <string name="oauth_check_onoff">Přihlásit se s oAuth2</string>
+ <string name="oauth_login_connection">Připojuji se k oAuth2 serveru...</string>
<string name="ssl_validator_header">Identitu stránky nelze ověřit</string>
<string name="ssl_validator_reason_cert_not_trusted">- Certifikát serveru je nedůvěryhodný</string>
<string name="ssl_validator_reason_cert_expired">- Certifikátu serveru vypršela platnost</string>
- <string name="ssl_validator_reason_cert_not_yet_valid">- Certifikát serveru je příliš nový</string>
+ <string name="ssl_validator_reason_cert_not_yet_valid">- Datum platnosti certifikátu je v budoucnosti</string>
<string name="ssl_validator_reason_hostname_not_verified">- URL neodpovídá hodnotě hostname certifikátu</string>
- <string name="ssl_validator_certificate_not_available">Nelze získat certifikát serveru</string>
<string name="ssl_validator_question">Přejete si přesto tomuto certifikátu důvěřovat?</string>
<string name="ssl_validator_not_saved">Certifikát nelze uložit</string>
<string name="ssl_validator_btn_details_see">Detaily</string>
<string name="ssl_validator_label_validity_to">Pro:</string>
<string name="ssl_validator_label_signature">Podpis:</string>
<string name="ssl_validator_label_signature_algorithm">Alogritmus:</string>
- <string name="text_placeholder">Zástupný text</string>
+ <string name="ssl_validator_null_cert">Certifikát nemohl být zobrazen.</string>
+ <string name="ssl_validator_no_info_about_error">- Žádné informace o této chybě</string>
+ <string name="placeholder_sentence">Zástupný text</string>
+ <string name="placeholder_filename">placeholder.txt</string>
+ <string name="placeholder_filetype">Obrázek PNG</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Odesílat obrázky pouze skrze WiFi</string>
<string name="instant_upload_path">/InstantUpload</string>
<string name="conflict_title">Konflikt při aktualizaci</string>
<string name="conflict_keep_both">Ponechat oba</string>
<string name="conflict_overwrite">Přepsat</string>
<string name="conflict_dont_upload">Nenahrávat</string>
+ <string name="preview_image_description">Náhled obrázku</string>
+ <string name="preview_image_error_unknown_format">Obrázek nemůže být zobrazen</string>
+ <string name="actionbar_failed_instant_upload">Selhalo Okamžité odeslání</string>
+ <string name="failed_upload_headline_text">Selhaná okamžitá odeslání</string>
+ <string name="failed_upload_headline_hint">Souhrn všech selhaných okamžitých odeslání</string>
+ <string name="failed_upload_all_cb">vybrat vše</string>
+ <string name="failed_upload_headline_retryall_btn">zkusit znovu vybrané</string>
+ <string name="failed_upload_headline_delete_all_btn">smazat vybrané z fronty k nahrání</string>
+ <string name="failed_upload_retry_text">zkusit znovu odeslat obrázek:</string>
+ <string name="failed_upload_load_more_images">Načíst více obrázků</string>
+ <string name="failed_upload_retry_do_nothing_text">nic nedělat nejste připojeni pro okamžité odeslání</string>
+ <string name="failed_upload_failure_text">Chybová zpráva:</string>
+ <string name="failed_upload_quota_exceeded_text">Zkontrolujte prosím nastavení vašeho serveru, možná jste překročili kvótu.</string>
+ <string name="share_link_file_no_exist">Nepodařilo se sdílet tento soubor či složku. Ujistěte se, že existuje.</string>
+ <string name="share_link_file_error">Při pokusu o sdílení tohoto souboru či složky nastala chyba</string>
+ <string name="unshare_link_file_no_exist">Nepodařilo se zrušit sdílení tohoto souboru nebo složky, protože neexistuje.</string>
+ <string name="unshare_link_file_error">Při pokusu o zrušení sdílení tohoto souboru či složky nastala chyba</string>
+ <string name="activity_chooser_send_file_title">Odeslat</string>
+ <string name="copy_link">Zkopírovat odkaz</string>
+ <string name="clipboard_text_copied">Zkopírováno do schránky</string>
</resources>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="actionbar_upload">Llwytho i fyny</string>
+ <string name="actionbar_upload_from_apps">Cynnwys o becynnau eraill</string>
+ <string name="actionbar_upload_files">Ffeiliau</string>
+ <string name="actionbar_settings">Gosodiadau</string>
+ <string name="actionbar_send_file">Anfon</string>
+ <string name="prefs_category_general">Cyffredinol</string>
+ <string name="prefs_accounts">Cyfrifon</string>
+ <string name="prefs_manage_accounts">Rheoli Cyfrifon</string>
+ <string name="prefs_pincode">PIN Ap</string>
+ <string name="prefs_pincode_summary">Amddiffyn eich cleient</string>
+ <string name="prefs_instant_upload">Galluogi llwytho i fyny\'n syth</string>
+ <string name="prefs_instant_upload_summary">Llwytho lluniau dynnwyd â chamera i fyny\'n syth</string>
+ <string name="prefs_help">Cymorth</string>
+ <string name="prefs_imprint">Imprint</string>
+ <string name="auth_username">Enw defnyddiwr</string>
+ <string name="auth_password">Cyfrinair</string>
+ <string name="sync_string_files">Ffeiliau</string>
+ <string name="setup_btn_connect">Cysylltu</string>
+ <string name="uploader_btn_upload_text">Llwytho i fyny</string>
+ <string name="uploader_wrn_no_account_title">Heb ganfod cyfrif</string>
+ <string name="uploader_wrn_no_account_text">Does dim cyfrifon %1$s ar eich dyfais. Sefydlwch gyfrif yn gyntaf.</string>
+ <string name="uploader_wrn_no_account_setup_btn_text">Gosod</string>
+ <string name="uploader_wrn_no_account_quit_btn_text">Gadael</string>
+ <string name="uploader_wrn_no_content_title">Dim cynnwys i lwytho i fyny</string>
+ <string name="uploader_wrn_no_content_text">Heb dderbyn cynnwys. Dim cynnwys i lwytho i fyny</string>
+ <string name="uploader_error_forbidden_content">Does dim mynediad gan %1$s i gynnwys a rennir</string>
+ <string name="uploader_info_uploading">Yn llwytho i fyny</string>
+ <string name="file_list_empty">Does dim ffeilau yn y blygell hon.\nGellir ychwanegu rhai newydd drwy ddewis \"Llwytho i fyny\" yn y ddewislen.</string>
+ <string name="filedetails_select_file">Tapiwch ffeil i ddangos gwybodaeth ychwanegol</string>
+ <string name="filedetails_size">Maint:</string>
+ <string name="filedetails_type">Math:</string>
+ <string name="filedetails_created">Crewyd:</string>
+ <string name="filedetails_modified">Addaswyd:</string>
+ <string name="filedetails_download">Llwytho i lawr</string>
+ <string name="filedetails_renamed_in_upload_msg">Ailenwyd y ffeil i %1$s wrth lwytho i fyny</string>
+ <string name="common_yes">Ie</string>
+ <string name="common_no">Na</string>
+ <string name="common_ok">Iawn</string>
+ <string name="common_cancel_download">Diddymu llwytho i lawr</string>
+ <string name="common_cancel_upload">Diddymu llwytho i fyny</string>
+ <string name="common_cancel">Diddymu</string>
+ <string name="common_save_exit">Cadw & Gadael</string>
+ <string name="common_error">Gwall</string>
+ <string name="about_title">Ynglyn â</string>
+ <string name="delete_account">Dileu cyfrif</string>
+ <string name="create_account">Creu cyfrif</string>
+ <string name="upload_chooser_title">Llwytho i fyny o ...</string>
+ <string name="uploader_upload_in_progress_ticker">Yn llwytho i fyny ...</string>
+ <string name="uploader_upload_in_progress_content">%1$d%% Llwytho i fyny %2$s</string>
+ <string name="uploader_upload_succeeded_ticker">Llwytho i fyny\'n llwyddiannus</string>
+ <string name="uploader_upload_succeeded_content_single">Llwythwyd %1$s i fyny\'n llwyddiannus</string>
+ <string name="uploader_upload_failed_ticker">Methwyd llwytho i fyny</string>
+ <string name="uploader_upload_failed_content_single">Methwyd cwblhau llwytho %1$s i fyny</string>
+ <string name="downloader_download_in_progress_ticker">Llwytho i lawr ...</string>
+ <string name="downloader_download_in_progress_content">%1$d%% Llwytho i lawr %2$s</string>
+ <string name="downloader_download_succeeded_ticker">Llwyddiant llwytho i lawr</string>
+ <string name="downloader_download_succeeded_content">Llwythwyd %1$s i lawr yn llwyddiannus</string>
+ <string name="downloader_download_failed_ticker">Methwyd llwytho i lawr</string>
+ <string name="downloader_download_failed_content">Methwyd cwblhau llwytho %1$s i lawr</string>
+ <string name="common_choose_account">Dewiswch gyfrif</string>
+ <string name="sync_fail_ticker">Methodd y cydamseriad</string>
+ <string name="sync_fail_content">Methwyd cwblhau cydamseru %1$s</string>
+ <string name="sync_conflicts_in_favourites_ticker">Canfuwyd gwrthdaro</string>
+ <string name="sync_conflicts_in_favourites_content">Methwyd cydamseru\'r ffeil cadw-yn-gydamserol %1$d</string>
+ <string name="sync_fail_in_favourites_ticker">Methodd ffeiliau cadw-yn-gydamserol</string>
+ <string name="sync_fail_in_favourites_content">Methwyd cydamseru cynnwys ffeiliau %1$d (gwrthdaro %2$d )</string>
+ <string name="sync_foreign_files_forgotten_ticker">Anghofiwyd am rai ffeiliau lleol</string>
+ <string name="foreign_files_move">Symud y cyfan</string>
+ <string name="foreign_files_success">Symudwyd pob ffeil</string>
+ <string name="foreign_files_fail">Methwyd symud rhai ffeiliau</string>
+ <string name="foreign_files_local_text">Lleol: %1$s</string>
+ <string name="foreign_files_remote_text">Pell: %1$s</string>
+ <string name="upload_query_move_foreign_files">Does dim digon o le i gopïo\'r ffeiliau ddewiswyd i blygell %1$s . Would like to move them into instead? </string>
+ <string name="pincode_enter_pin_code">Cyflwynwch PIN eich Ap</string>
+ <string name="pincode_configure_your_pin">Cyflwynwch PIN eich Ap</string>
+ <string name="pincode_configure_your_pin_explanation">Bydd cais am y PIN bob tro mae\'r ap yn cychwyn</string>
+ <string name="pincode_reenter_your_pincode">Ailgyflwynwch PIN eich Ap</string>
+ <string name="pincode_remove_your_pincode">Gwaredwch PIN eich Ap</string>
+ <string name="pincode_mismatch">Nid yw PINau yr Ap yr un fath</string>
+ <string name="pincode_wrong">PIN Ap anghywir</string>
+ <string name="pincode_removed">Gwaredwyd PIN Ap</string>
+ <string name="pincode_stored">Cadwyd PIN Ap</string>
+ <string name="auth_no_net_conn_title">Dim cysylltiad rhwydwaith</string>
+ <string name="auth_nossl_plain_ok_title">Nid oes cysylltiad diogel ar gael.</string>
+ <string name="auth_connection_established">Sefydlwyd y cysylltiad</string>
+ <string name="auth_not_configured_title">Cyfluniad gweinydd wedi\'i gamffurfio</string>
+ <string name="auth_unknown_error_title">Digwyddodd gwall anhysbys!</string>
+ <string name="auth_unknown_host_title">Methwyd canfod gwesteiwr</string>
+ <string name="auth_incorrect_path_title">Enghraifft o\'r gweinydd heb ei ganfod</string>
+ <string name="auth_timeout_title">Cymrodd y gweinydd rhy hir i ymateb</string>
+ <string name="auth_incorrect_address_title">URL Camffurfiedig</string>
+ <string name="auth_ssl_general_error_title">Methwyd ymgychwyn SSL</string>
+ <string name="auth_bad_oc_version_title">Fersiwn gweinydd heb ei gydnabod</string>
+ <string name="auth_wrong_connection_title">Methwyd creu cysylltiad</string>
+ <string name="auth_secure_connection">Sefydlwyd cysylltiad diogel</string>
+ <string name="fd_keep_in_sync">Cadw\'r ffeil yn gyfredol</string>
+ <string name="common_rename">Ailenwi</string>
+ <string name="common_remove">Gwaredu</string>
+ <string name="confirmation_remove_alert">Ydych chi wir am gael gwared ar %1$s ?</string>
+ <string name="confirmation_remove_folder_alert">Ydych chi wir am waredu %1$s a\'i gynnwys?</string>
+ <string name="confirmation_remove_local">Lleol yn unig</string>
+ <string name="confirmation_remove_folder_local">Cynnwys lleol yn unig</string>
+ <string name="confirmation_remove_remote">Gwaredu o\'r gweinydd</string>
+ <string name="confirmation_remove_remote_and_local">Pell a lleol</string>
+ <string name="remove_success_msg">Gwaredwyd yn llwyddiannus</string>
+ <string name="remove_fail_msg">Methwyd gwaredu</string>
+ <string name="rename_dialog_title">Rhowch enw newydd</string>
+ <string name="rename_local_fail_msg">Methwyd ailenwi copi lleol; rhowch gynnig ar enw arall</string>
+ <string name="rename_server_fail_msg">Methwyd cwblhau\'r ailenwi</string>
+ <string name="sync_file_fail_msg">Methwyd gwirio\'r ffeil bell</string>
+ <string name="sync_file_nothing_to_do_msg">Cynnwys y ffeil eisoes wedi cydamseru</string>
+ <string name="wait_a_moment">Arhoswch eiliad</string>
+ <string name="filedisplay_unexpected_bad_get_content">Gwall annisgwyl ; dewiswch y ffeil o ap gwahanol</string>
+ <string name="filedisplay_no_file_selected">Ni ddewiswyd ffeil</string>
+ <string name="ssl_validator_header">Methwyd gwirio hunaniaeth y safle</string>
+ <string name="ssl_validator_reason_cert_not_trusted">- Nid yw tystysgrif y gweinydd yn ddibynadwy</string>
+ <string name="ssl_validator_reason_cert_expired">- Mae tystysgrif y gweinydd wedi dod i ben</string>
+ <string name="ssl_validator_reason_cert_not_yet_valid">- Mae dyddiadau dilysrwydd tystysgrif y gweinydd yn y dyfodol</string>
+ <string name="ssl_validator_reason_hostname_not_verified">- Nid yw\'r URL yn cyfateb i\'r enw gwesteiwr yn y dystysgrif</string>
+ <string name="ssl_validator_question">Ydych chi\'n ymddiried yn y dystysgrif hon beth bynnag?</string>
+ <string name="ssl_validator_not_saved">Methwyd cadw\'r dystysgrif</string>
+ <string name="ssl_validator_btn_details_see">Manylion</string>
+ <string name="ssl_validator_btn_details_hide">Cuddio</string>
+ <string name="ssl_validator_label_subject">Rhoddwyd i:</string>
+ <string name="ssl_validator_label_issuer">Rhoddwyd gan:</string>
+ <string name="ssl_validator_label_CN">Enw cyffredin:</string>
+ <string name="ssl_validator_label_O">Sefydliad:</string>
+ <string name="ssl_validator_label_OU">Uned sefydliad:</string>
+ <string name="ssl_validator_label_C">Gwlad:</string>
+ <string name="ssl_validator_label_ST">Sir:</string>
+ <string name="ssl_validator_label_L">Lleoliad:</string>
+ <string name="ssl_validator_label_validity">Dilysrwydd:</string>
+ <string name="ssl_validator_label_validity_from">O:</string>
+ <string name="ssl_validator_label_validity_to">I:</string>
+ <string name="ssl_validator_label_signature">Llofnod:</string>
+ <string name="ssl_validator_label_signature_algorithm">Algorithm:</string>
+ <string name="instant_upload_on_wifi">Llwytho lluniau i fyny drwy WiFi\'n unig</string>
+ <string name="instant_upload_path">/LlwythoSyth</string>
+ <string name="conflict_title">Gwrthdaro diweddaru</string>
+ <string name="conflict_message">Nid yw ffeil bell %s wedi cydamseru â\'r ffeil leol. Bydd parhau yn amnewid cynnwys y ffeil ar y gweinydd.</string>
+ <string name="conflict_keep_both">Cadw\'r ddau</string>
+ <string name="conflict_overwrite">Trosysgrifio</string>
+ <string name="conflict_dont_upload">Peidio llwytho i fyny</string>
+ <string name="activity_chooser_send_file_title">Anfon</string>
+</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Kodeord:</string>
- <string name="main_login">Brugernavn:</string>
- <string name="main_button_login">Log ind</string>
- <string name="main_welcome">Velkommen til dit ownCloud</string>
- <string name="main_files">Filer</string>
- <string name="main_music">Musik</string>
- <string name="main_contacts">Kontakter</string>
- <string name="main_calendar">Kalender</string>
- <string name="main_bookmarks">Bogmærker</string>
- <string name="main_settings">Indstillinger</string>
- <string name="main_tit_accsetup">Opsæt konto</string>
- <string name="main_wrn_accsetup">Der er ingen ownCloud konti på enheden. For at bruge denne App, skal du oprette en.</string>
- <string name="about_message">ownCloud Android klient\n\nversion: %1$s</string>
- <string name="actionbar_sync">Opdater</string>
+ <string name="about_android">%1$s Android App</string>
+ <string name="about_version">version %1$s</string>
+ <string name="actionbar_sync">Genindlæs konto</string>
<string name="actionbar_upload">Upload</string>
<string name="actionbar_upload_from_apps">Indhold fra andre apps</string>
<string name="actionbar_upload_files">Filer</string>
- <string name="actionbar_mkdir">Opret mappe</string>
- <string name="actionbar_search">Søg</string>
+ <string name="actionbar_open_with">Åben med</string>
+ <string name="actionbar_mkdir">Ny Mappe</string>
<string name="actionbar_settings">Indstillinger</string>
+ <string name="actionbar_see_details">Detaljer</string>
+ <string name="actionbar_send_file">Send</string>
<string name="prefs_category_general">Generel</string>
- <string name="prefs_category_trackmydevice">Enheds sporing</string>
- <string name="prefs_add_session">Tilføj ny session</string>
- <string name="prefs_create_img_thumbnails">Opret billede thumbnails</string>
- <string name="prefs_select_oc_account">Vælg en konto</string>
- <string name="prefs_summary_select_oc_account">Vælg hvilken af dine brugere denne app skal bruge.</string>
- <string name="prefs_trackmydevice">Enhedssporing</string>
- <string name="prefs_trackmydevice_summary_off">Tillad ownCloud at spore denne enheds placering</string>
- <string name="prefs_trackmydevice_summary_on">Din ownCloud sporer denne enhed</string>
- <string name="prefs_trackmydevice_interval">Opdateringsinterval</string>
- <string name="prefs_trackmydevice_interval_summary">Opdater hvert %1$s minut</string>
+ <string name="prefs_category_more">Mere</string>
<string name="prefs_accounts">Konti</string>
<string name="prefs_manage_accounts">Administrer konti</string>
- <string name="prefs_pincode">ownCloud App PIN</string>
- <string name="prefs_pincode_summary">Beskyt din ownCloud klient</string>
+ <string name="prefs_pincode">App PIN</string>
+ <string name="prefs_pincode_summary">Beskyt din klient</string>
<string name="prefs_instant_upload">Slå øjeblikkelig upload til</string>
<string name="prefs_instant_upload_summary">Upload billeder taget med kamera med det samme</string>
- <string name="auth_host_url">ownCloud URL</string>
+ <string name="prefs_log_title">Aktiver Logning</string>
+ <string name="prefs_log_summary">Dette bruges til at logge problemer</string>
+ <string name="prefs_log_title_history">Logger Historik</string>
+ <string name="prefs_log_summary_history">Dette viser de optagne logger</string>
+ <string name="prefs_log_delete_history_button">Slet Historik</string>
+ <string name="prefs_help">Hjælp</string>
+ <string name="prefs_recommend">Anbefal til en ven</string>
+ <string name="prefs_feedback">Feedback</string>
+ <string name="prefs_imprint">Imprint</string>
+ <string name="recommend_subject">Prøv %1$s på din smartphone!</string>
+ <string name="auth_check_server">Check Server</string>
+ <string name="auth_host_url">Server addresse https://…</string>
<string name="auth_username">Brugernavn</string>
<string name="auth_password">Kodeord</string>
- <string name="auth_register">Jeg er ny til ownCloud</string>
- <string name="new_session_uri_error">Forkert URL givet</string>
- <string name="new_session_session_name_error">Forkert session navn</string>
+ <string name="auth_register">Uvant med %1$s</string>
<string name="sync_string_files">Filer</string>
- <string name="uploader_no_file_selected">Ingen fil valgt til at uploade</string>
- <string name="setup_hint_username">Brugernavn</string>
- <string name="setup_hint_password">Kodeord</string>
- <string name="setup_hint_address">Web adresse</string>
- <string name="setup_hint_show_password">Hvis kodeord?</string>
- <string name="setup_title">Tilslut til din ownCloud</string>
<string name="setup_btn_connect">Tilslut</string>
<string name="uploader_btn_upload_text">Upload</string>
<string name="uploader_wrn_no_account_title">Ingen konto fundet</string>
- <string name="uploader_wrn_no_account_text">Der er ingen ownCloud brugere på din enhed. Sæt venligst en bruger op først.</string>
+ <string name="uploader_wrn_no_account_text">Der er ingen %1$s brugere på din enhed. Sæt venligst en bruger op først.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Opsætning</string>
<string name="uploader_wrn_no_account_quit_btn_text">Afslut</string>
<string name="uploader_wrn_no_content_title">Intet indhold at uploade</string>
<string name="uploader_wrn_no_content_text">Intet indhold blev modtaget. Intet at uploade.</string>
- <string name="uploader_error_forbidden_content">ownCloud er ikke tilladt adgang til delt indhold</string>
+ <string name="uploader_error_forbidden_content">%1$s er ikke tilladt adgang til delt indhold</string>
<string name="uploader_info_uploading">Uploader</string>
- <string name="uploader_btn_create_dir_text">Opret mappe til uploads</string>
<string name="file_list_empty">Der er ingen filer i denne mappe.\nNye filer kan tilføjes med menu valgmuligheden \"Upload\".</string>
<string name="filedetails_select_file">Tryk på en fil for at vise yderligere information.</string>
<string name="filedetails_size">Størelse:</string>
<string name="filedetails_created">Oprettet:</string>
<string name="filedetails_modified">Ændret:</string>
<string name="filedetails_download">Hent</string>
- <string name="filedetails_sync_file">Opdater</string>
- <string name="filedetails_redownload">Download igen</string>
- <string name="filedetails_open">Åben</string>
+ <string name="filedetails_sync_file">Opdater fil</string>
<string name="filedetails_renamed_in_upload_msg">Filen blev omdøbt til %1$s under upload</string>
+ <string name="action_share_file">Del link</string>
+ <string name="action_unshare_file">Ophæv deling</string>
<string name="common_yes">Ja</string>
<string name="common_no">Nej</string>
<string name="common_ok">OK</string>
<string name="common_cancel_upload">Fortryd upload</string>
<string name="common_cancel">Annuller</string>
<string name="common_save_exit">Gem & Afslut</string>
- <string name="common_exit">Forlad ownCloud</string>
<string name="common_error">Fejl</string>
+ <string name="common_loading">Indlæser...</string>
+ <string name="common_error_unknown">Ukendt fejl</string>
<string name="about_title">Om</string>
+ <string name="change_password">Skift kodeord</string>
<string name="delete_account">Slet konto</string>
<string name="create_account">Opret konto</string>
<string name="upload_chooser_title">Upload fra ...</string>
- <string name="uploader_info_dirname">mappenavn</string>
+ <string name="uploader_info_dirname">Mappenavn</string>
<string name="uploader_upload_in_progress_ticker">Uploader ...</string>
<string name="uploader_upload_in_progress_content">%1$d%% Uploader %2$s</string>
<string name="uploader_upload_succeeded_ticker">Upload færdig</string>
<string name="uploader_upload_succeeded_content_single">%1$s blev uploadet med success</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d filer blev uploadet med success</string>
<string name="uploader_upload_failed_ticker">Upload fejlede</string>
<string name="uploader_upload_failed_content_single">Upload af %1$s kunne ikke gennemføres</string>
- <string name="uploader_upload_failed_content_multiple">Upload fejlede: %1$d/%2$d filer blev uploadet</string>
<string name="downloader_download_in_progress_ticker">Downloader ...</string>
<string name="downloader_download_in_progress_content">%1$d%% Downloader %2$s</string>
<string name="downloader_download_succeeded_ticker">Download fuldført</string>
<string name="downloader_download_succeeded_content">%1$s blev downloadet med success</string>
<string name="downloader_download_failed_ticker">Download fejlede</string>
<string name="downloader_download_failed_content">Download af %1$s kunne ikke fuldføres</string>
+ <string name="downloader_not_downloaded_yet">Endnu ikke downloadet</string>
<string name="common_choose_account">Vælg konto</string>
- <string name="sync_string_contacts">Kontakter</string>
<string name="sync_fail_ticker">Synkronisering fejlede</string>
<string name="sync_fail_content">Synkronisering af %1$s kunne ikke gennemføres</string>
+ <string name="sync_fail_content_unauthorized">Ugyldig adgangskode for %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Konflikter fundet</string>
<string name="sync_conflicts_in_favourites_content">%1$d hold-synkroniseret filer kunne ikke synkroniseres</string>
<string name="sync_fail_in_favourites_ticker">Hold-synkroniseret filer mislykkedes</string>
<string name="sync_fail_in_favourites_content">Indholdet af %1$d filer ikke kunne synkroniseres (%2$d konflikter)</string>
- <string name="use_ssl">Brug sikker forbindelse</string>
- <string name="location_no_provider">ownCloud kan ikke spore din enhed. Tjek venligst dine indstillinger for brug af GPS</string>
+ <string name="sync_foreign_files_forgotten_ticker">Visse lokale filer blev glemt</string>
+ <string name="sync_current_folder_was_removed">Mappen %1$s eksistere ikke længere</string>
+ <string name="foreign_files_move">Flyt alle</string>
+ <string name="foreign_files_success">Alle filer blev flyttet</string>
+ <string name="foreign_files_fail">Visse filer kunne ikke flyttes</string>
+ <string name="foreign_files_local_text">Lokal: %1$s</string>
+ <string name="foreign_files_remote_text">Fjernplacering: %1$s</string>
+ <string name="upload_query_move_foreign_files">Der er ikke tilstrækkelig plads til at kopiere de valgte filer ind i %1$s mappen. Vil du flytte dem i stedet?</string>
<string name="pincode_enter_pin_code">Indsæt venligst din App PIN</string>
- <string name="pincode_enter_new_pin_code">Indsæt venligst din nye App PIN</string>
- <string name="pincode_configure_your_pin">Indtast ownCloud App PIN</string>
+ <string name="pincode_configure_your_pin">Indtast App PIN</string>
<string name="pincode_configure_your_pin_explanation">PIN koden vil blive anmodet om hver gang applikationen bliver startet</string>
- <string name="pincode_reenter_your_pincode">Indtast venligst ownCloud App PIN igen</string>
- <string name="pincode_remove_your_pincode">Fjern din ownCloud App PIN</string>
- <string name="pincode_mismatch">ownCloud App PIN er ikke ens</string>
- <string name="pincode_wrong">Forkert ownCloud App PIN</string>
- <string name="pincode_removed">ownCloud App PIN fjernet</string>
- <string name="pincode_stored">ownCloud App PIN gemt</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 Minutter</item>
- <item>30 Minutter</item>
- <item>60 Minutter</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_reenter_your_pincode">Indtast venligst App PIN igen</string>
+ <string name="pincode_remove_your_pincode">Fjern din App PIN</string>
+ <string name="pincode_mismatch">App PIN er ikke ens</string>
+ <string name="pincode_wrong">Forkert App PIN</string>
+ <string name="pincode_removed">App PIN fjernet</string>
+ <string name="pincode_stored">App PIN gemt</string>
+ <string name="media_notif_ticker">%1$s musikafspiller</string>
+ <string name="media_state_playing">%1$s (afspiller)</string>
+ <string name="media_state_loading">%1$s (indlæser)</string>
+ <string name="media_event_done">%1$s afspilning færdig</string>
+ <string name="media_err_nothing_to_play">Mediefil ikke fundet</string>
+ <string name="media_err_no_account">Ingen konto angivet</string>
+ <string name="media_err_not_in_owncloud">Fil er ikke en gyldig konto</string>
+ <string name="media_err_unsupported">Ikke-understøttet medie codec</string>
+ <string name="media_err_io">Mediefilen kunne ikke læses</string>
+ <string name="media_err_malformed">Mediefilen er ikke korrekt kodet</string>
+ <string name="media_err_timeout">Tiden udløb under forsøg på at afspille</string>
+ <string name="media_err_invalid_progressive_playback">Mediefilen kan ikke streames</string>
+ <string name="media_err_unknown">Mediefil kan ikke afspilles med tilgængelige medieafspiller</string>
+ <string name="media_err_security_ex">Sikkerhedsfejl ved forsøg på afspilning af </string>
+ <string name="media_err_io_ex">Inputfejl ved forsøg på afspilning af %1$s</string>
+ <string name="media_err_unexpected">Uventet fejl ved forsøg på afspilning af %1$s</string>
+ <string name="media_rewind_description">Tilbagespolings knap</string>
+ <string name="media_play_pause_description">Afspil eller pause knap</string>
+ <string name="media_forward_description">Hurtigt fremad kanp</string>
<string name="auth_trying_to_login">Forsøger at logge ind...</string>
<string name="auth_no_net_conn_title">Ingen netværksforbindelse</string>
- <string name="auth_no_net_conn_message">Der blev ikke fundet nogen netværksforbindelse, tjek din internetforbindelse, og prøv igen</string>
- <string name="auth_connect_anyway">Forbind alligevel</string>
<string name="auth_nossl_plain_ok_title">Sikker forbindelse ikke tilgængelig.</string>
- <string name="auth_nossl_plain_ok_message">Applikationen kunne ikke oprette en sikker forbindelse med serveren. Selvom en sikker forbindelse ikke er tilgængeligt, kan du vælge at fortsætte eller annullere.</string>
<string name="auth_connection_established">Forbindelse oprettet</string>
<string name="auth_testing_connection">Afprøver forbindelse ...</string>
- <string name="auth_not_configured_title">Misdannet ownCloud konfiguration</string>
- <string name="auth_not_configured_message">Det ser ud til, at din ownCloud instans ikke er konfigureret korrekt. KOntakt din administrator for flere detaljer.</string>
+ <string name="auth_not_configured_title">Misdannet server konfiguration</string>
+ <string name="auth_account_not_new">En konto for den samme bruger og server eksisterer allerede på enheden</string>
+ <string name="auth_account_not_the_same">Den indtastede bruger passer ikke til brugeren for denne konto</string>
<string name="auth_unknown_error_title">Ukendt fejl opstod!</string>
- <string name="auth_unknown_error_message">Der forekom en ukendt fejl. Kontakt venligst forfattere og inkluder logfiler fra din enhed.</string>
<string name="auth_unknown_host_title">Kunne ikke finde host</string>
- <string name="auth_unknown_host_message">Kunne ikke finde den indtastede host. Tjek venligst host\'ens navn og om serveren er tilgængelig og prøv derefter igen.</string>
- <string name="auth_incorrect_path_title">ownCloud instans blev ikke fundet</string>
- <string name="auth_incorrect_path_message">Applikation kunne ikke finde ownCloud instans på den givne placering. Tjek venligst din placering og prøv igen.</string>
+ <string name="auth_incorrect_path_title">Server instans blev ikke fundet</string>
<string name="auth_timeout_title">Serveren var for længe om at svare</string>
<string name="auth_incorrect_address_title">Deform URL</string>
<string name="auth_ssl_general_error_title">SSL initialisering fejlede</string>
- <string name="auth_ssl_unverified_server_title">Ikke verifiseret SSL servers identitet</string>
- <string name="auth_bad_oc_version_title">Ikke genkendt ownCloud server version</string>
+ <string name="auth_ssl_unverified_server_title">Kunne ikke bekræfte SSl-serverens identitet</string>
+ <string name="auth_bad_oc_version_title">Ikke genkendt server version</string>
<string name="auth_wrong_connection_title">Ikke ikke oprette forbindelse</string>
<string name="auth_secure_connection">Sikker forbindelse oprettet</string>
- <string name="auth_login_details">Login detaljer</string>
- <string name="auth_unauthorized">Ugyldig login / password</string>
- <string name="auth_not_found">Forkert sti angivet</string>
- <string name="auth_internal">Intern serverfejl, kode %1$d</string>
- <string name="crashlog_message">Applikation afsluttede mod forventning. Vil du indsende en fejl rapport?</string>
- <string name="crashlog_send_report">Send rapport</string>
- <string name="crashlog_dont_send_report">Send ikke rapport</string>
- <string name="extensions_avail_title">Udvidelser tilgængelige!</string>
- <string name="extensions_avail_message">Det ser ud til at dit instans af ownCloud har understøttelse af avancerede tilføjelser. Vil du se udvidelser tilgængelig til Android?</string>
+ <string name="auth_unauthorized">Forkert brugernavn eller kodeord</string>
+ <string name="auth_oauth_error">Mislykket godkendelse</string>
+ <string name="auth_oauth_error_access_denied">Adgang afvist af autorisationsserver</string>
+ <string name="auth_wtf_reenter_URL">Uventet tilstand; angiv server-URL\'en igen</string>
+ <string name="auth_expired_oauth_token_toast">Din godkendelse udløb. Gentag godkendelse</string>
+ <string name="auth_expired_basic_auth_toast">Indtast venligst dit nuværende kodeord</string>
+ <string name="auth_expired_saml_sso_token_toast">Din session udløb. Forbind venligst igen</string>
+ <string name="auth_connecting_auth_server">Forbinder til godkendelsesserver ...</string>
+ <string name="auth_unsupported_auth_method">Serveren understøtter ikke denne godkendelsesmetode</string>
+ <string name="auth_unsupported_multiaccount">%1$s understøtter ikke multiple konti</string>
+ <string name="auth_can_not_auth_against_server">Kan ikke autentificere mod denne server</string>
<string name="fd_keep_in_sync">Hold fil opdateret</string>
- <string name="common_share">Del</string>
<string name="common_rename">Omdøb</string>
<string name="common_remove">Fjern</string>
<string name="confirmation_remove_alert">Er du sikker på at du vil fjerne %1$s ?</string>
<string name="rename_server_fail_msg">Omdøbning kunne ikke gennemføres</string>
<string name="sync_file_fail_msg">Ekstern fil kunne ikke kontrolleres</string>
<string name="sync_file_nothing_to_do_msg">Filindholdet allerede synkroniseret</string>
- <string name="create_dir_fail_msg">Mappe kunne ikke oprettes</string>
+ <string name="filename_forbidden_characters">Ugyldige tegn: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Vent et øjeblik</string>
<string name="filedisplay_unexpected_bad_get_content">Uforventet problem; prøv venligst anden applikation til at vælge filen</string>
<string name="filedisplay_no_file_selected">Ingen fil blev valgt</string>
- <string name="ssl_validator_title">Advarsel</string>
+ <string name="activity_chooser_title">Send link til ...</string>
+ <string name="oauth_check_onoff">Log på med oAuth2</string>
+ <string name="oauth_login_connection">Forbinder til oAuth2 server...</string>
<string name="ssl_validator_header">Sidens identitet kunne ikke verificeres</string>
<string name="ssl_validator_reason_cert_not_trusted">- Serverens certifikat er ikke troværdigt</string>
<string name="ssl_validator_reason_cert_expired">- Serverens certifikat er udløbet</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- Serverens certifikat er for ung</string>
<string name="ssl_validator_reason_hostname_not_verified">- URL adressen stemmer ikke overens med værtsnavnet i certifikatet</string>
- <string name="ssl_validator_certificate_not_available">Serverens certifikat kunne ikke hentes</string>
<string name="ssl_validator_question">Stoler du på certifikatet alligevel?</string>
<string name="ssl_validator_not_saved">Certifikatet kunne ikke gemmes</string>
<string name="ssl_validator_btn_details_see">Detaljer</string>
<string name="ssl_validator_label_validity_to">Til:</string>
<string name="ssl_validator_label_signature">Signatur:</string>
<string name="ssl_validator_label_signature_algorithm">Algoritme:</string>
- <string name="text_placeholder">Dette er en pladsholder</string>
+ <string name="ssl_validator_null_cert">Certifikatet kunne ikke vises.</string>
+ <string name="ssl_validator_no_info_about_error">- Ingen information om fejlen</string>
+ <string name="placeholder_sentence">Dette er en pladsholder</string>
+ <string name="placeholder_filename">stedfortræder.txt</string>
+ <string name="placeholder_filetype">PNG Billede</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Upload billeder kun via WiFi </string>
<string name="instant_upload_path">/Øjeblikkelig upload</string>
<string name="conflict_title">Opdaterings konflikt</string>
<string name="conflict_keep_both">Behold begge</string>
<string name="conflict_overwrite">Overskriv</string>
<string name="conflict_dont_upload">Upload ikke</string>
+ <string name="preview_image_description">Billede preview</string>
+ <string name="preview_image_error_unknown_format">Dette billede kan ikke vises</string>
+ <string name="actionbar_failed_instant_upload">Fejlede Umiddelbar upload</string>
+ <string name="failed_upload_headline_text">Øjeblikkelige uploads mislykkedes</string>
+ <string name="failed_upload_headline_hint">Sammenfatning af alle mislykkede øjeblikkelige uploads</string>
+ <string name="failed_upload_all_cb">Vælg alle</string>
+ <string name="failed_upload_headline_retryall_btn">prøv alle markerede igen</string>
+ <string name="failed_upload_headline_delete_all_btn">slet alle markerede fra uploadkøen</string>
+ <string name="failed_upload_retry_text">prøv at uploade billedet igen:</string>
+ <string name="failed_upload_load_more_images">Indlæs flere billeder</string>
+ <string name="failed_upload_retry_do_nothing_text">gør intet, du er ikke online til øjeblikkelig upload</string>
+ <string name="failed_upload_failure_text">Fejlmeddelelse</string>
+ <string name="failed_upload_quota_exceeded_text">Tjek din serverkonfiguration, måske er din kvota overskredet.</string>
+ <string name="share_link_file_no_exist">Kan ikke dele denne fil eller mappe. Find venligst ud af om den eksisterer</string>
+ <string name="share_link_file_error">Der opstod en fejl ved deling af denne fil eller mappe</string>
+ <string name="unshare_link_file_no_exist">Kan ikke fjerne delingen af denne fil eller mappe. Den findes ikke.</string>
+ <string name="unshare_link_file_error">Der opstod en fejl ved stopning af deling af denne mappe.</string>
+ <string name="activity_chooser_send_file_title">Send</string>
+ <string name="copy_link">Kopier link</string>
+ <string name="clipboard_text_copied">Kopieret til udklipsholder</string>
</resources>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="actionbar_settings">Einstellungen</string>
+ <string name="prefs_category_general">Allgemein</string>
+ <string name="auth_password">Passwort</string>
+ <string name="filedetails_download">Herunterladen</string>
+ <string name="common_cancel">Abbrechen</string>
+</resources>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="about_android">%1$s Android App</string>
+ <string name="about_version">Version %1$s</string>
+ <string name="actionbar_sync">Konto aktualisieren</string>
+ <string name="actionbar_upload">Datei hochladen</string>
+ <string name="actionbar_upload_from_apps">Inhalt von anderen Apps</string>
+ <string name="actionbar_upload_files">Dateien</string>
+ <string name="actionbar_open_with">Öffnen mit</string>
+ <string name="actionbar_mkdir">Neues Verzeichnis</string>
+ <string name="actionbar_settings">Einstellungen</string>
+ <string name="actionbar_see_details">Details</string>
+ <string name="actionbar_send_file">Senden</string>
+ <string name="prefs_category_general">Allgemein</string>
+ <string name="prefs_category_more">Mehr</string>
+ <string name="prefs_accounts">Konten</string>
+ <string name="prefs_manage_accounts">Konten verwalten</string>
+ <string name="prefs_pincode">App-PIN</string>
+ <string name="prefs_pincode_summary">Schützen Sie Ihren Client</string>
+ <string name="prefs_instant_upload">Aktiviert den sofortigen Upload</string>
+ <string name="prefs_instant_upload_summary">Laden Sie Ihre Fotos von der Kamera sofort hoch</string>
+ <string name="prefs_log_title">Protokollierung aktivieren</string>
+ <string name="prefs_log_summary">Dies wird zur Protokollierung von Problemen genutzt</string>
+ <string name="prefs_log_title_history">Protokollierungsverlauf</string>
+ <string name="prefs_log_summary_history">Dies zeigt die gespeicherten Protokollierungen</string>
+ <string name="prefs_log_delete_history_button">Verlauf löschen</string>
+ <string name="prefs_help">Hilfe</string>
+ <string name="prefs_feedback">Rückmeldungen</string>
+ <string name="prefs_imprint">Impressum</string>
+ <string name="auth_check_server">Server überprüfen</string>
+ <string name="auth_username">Benutzername</string>
+ <string name="auth_password">Passwort</string>
+ <string name="auth_register">Ist %1$s neu für Sie?</string>
+ <string name="sync_string_files">Dateien</string>
+ <string name="setup_btn_connect">Verbinden</string>
+ <string name="uploader_btn_upload_text">Hochladen</string>
+ <string name="uploader_wrn_no_account_title">Kein Konto gefunden</string>
+ <string name="uploader_wrn_no_account_text">Es sind keine %1$s-Konten auf Ihrem Gerät eingerichtet. Bitte richten Sie zuerst ein Konto ein.</string>
+ <string name="uploader_wrn_no_account_setup_btn_text">Einrichten</string>
+ <string name="uploader_wrn_no_account_quit_btn_text">Beenden</string>
+ <string name="uploader_wrn_no_content_title">Keine Inhalte zum Hochladen vorhanden</string>
+ <string name="uploader_wrn_no_content_text">Es wurden keine Inhalte empfangen. Es gibt nichts zum Hochladen.</string>
+ <string name="uploader_error_forbidden_content">%1$s darf den freigegebenen Inhalt nicht nutzen.</string>
+ <string name="uploader_info_uploading">Lade hoch</string>
+ <string name="file_list_empty">Es sind keine Dateien im Verzeichnis vorhanden.\nNeue Dateien können mit der Menüfunktion «Hochladen» hinzugefügt werden.</string>
+ <string name="filedetails_select_file">Klicken Sie auf eine Datei für weitere Informationen.</string>
+ <string name="filedetails_size">Grösse:</string>
+ <string name="filedetails_type">Art:</string>
+ <string name="filedetails_created">Erstellt:</string>
+ <string name="filedetails_modified">Geändert:</string>
+ <string name="filedetails_download">Herunterladen</string>
+ <string name="filedetails_sync_file">Datei aktualisieren</string>
+ <string name="filedetails_renamed_in_upload_msg">Datei wurde wärend des Uploads zu %1$s umbenannt</string>
+ <string name="common_yes">Ja</string>
+ <string name="common_no">Nein</string>
+ <string name="common_ok">OK</string>
+ <string name="common_cancel_download">Download abbrechen</string>
+ <string name="common_cancel_upload">Upload abbrechen</string>
+ <string name="common_cancel">Abbrechen</string>
+ <string name="common_save_exit">Speichern & Schliessen</string>
+ <string name="common_error">Fehler</string>
+ <string name="common_loading">Lade...</string>
+ <string name="common_error_unknown">Unbekannter Fehler</string>
+ <string name="about_title">Über</string>
+ <string name="change_password">Passwort ändern</string>
+ <string name="delete_account">Account löschen</string>
+ <string name="create_account">Account erstellen</string>
+ <string name="upload_chooser_title">Dateien hochladen von...</string>
+ <string name="uploader_info_dirname">Ordnername</string>
+ <string name="uploader_upload_in_progress_ticker">Hochladen...</string>
+ <string name="uploader_upload_in_progress_content">%1$d%% Hochladen %2$s</string>
+ <string name="uploader_upload_succeeded_ticker">Hochladen erfolgreich</string>
+ <string name="uploader_upload_succeeded_content_single">%1$s wurde(n) erfolgreich hochgeladen</string>
+ <string name="uploader_upload_failed_ticker">Hochladen fehlgeschlagen</string>
+ <string name="uploader_upload_failed_content_single">Hochladen von %1$s konnte nicht abgeschlossen werden</string>
+ <string name="downloader_download_in_progress_ticker">Herunterladen...</string>
+ <string name="downloader_download_in_progress_content">%1$d%% Herunterladen %2$s</string>
+ <string name="downloader_download_succeeded_ticker">Herunterladen erfolgreich</string>
+ <string name="downloader_download_succeeded_content">%1$s wurde erfolgreich heruntergeladen</string>
+ <string name="downloader_download_failed_ticker">Herunterladen fehlgeschlagen</string>
+ <string name="downloader_download_failed_content">Herunterladen von %1$s konnte nicht abgeschlossen werden</string>
+ <string name="downloader_not_downloaded_yet">Noch nicht heruntergeladen</string>
+ <string name="common_choose_account">Konto auswählen</string>
+ <string name="sync_fail_ticker">Synchronisation fehlgeschlagen</string>
+ <string name="sync_fail_content">Bei der Synchronisation konnte %1$s nicht übertragen werden</string>
+ <string name="sync_fail_content_unauthorized">Ungültiges Passwort für %1$s</string>
+ <string name="sync_conflicts_in_favourites_ticker">Konflikte gefunden</string>
+ <string name="sync_conflicts_in_favourites_content">%1$d Synchronisationsdateien konnten nicht synchronisiert werden.</string>
+ <string name="sync_fail_in_favourites_ticker">Synchronisationsdateien konnten nicht synchronisiert werden.</string>
+ <string name="sync_fail_in_favourites_content">Inhalte von %1$d konnte nicht synchronisiert werden (%2$d Konflikte)</string>
+ <string name="sync_foreign_files_forgotten_ticker">Einige lokale Dateien wurden vergessen</string>
+ <string name="foreign_files_move">Verschiebe alle</string>
+ <string name="foreign_files_success">Alle Dateien wurden verschoben</string>
+ <string name="foreign_files_fail">Einige Dateien konnten nicht verschoben werden</string>
+ <string name="foreign_files_local_text">Lokal: %1$s</string>
+ <string name="foreign_files_remote_text">Remote: %1$s</string>
+ <string name="upload_query_move_foreign_files">Es steht nicht genügend Speicherplatz zur Verfügung, um die ausgewählten Dateien in den %1$s Ordner zu kopieren. Möchten Sie sie stattdessen verschieben?</string>
+ <string name="pincode_enter_pin_code">Bitte geben Sie Ihre App-PIN ein</string>
+ <string name="pincode_configure_your_pin">Bitte geben Sie Ihre App-PIN ein</string>
+ <string name="pincode_configure_your_pin_explanation">PIN-Abfrage erfolgt nach Starten der App.</string>
+ <string name="pincode_reenter_your_pincode">Bitte geben Sie Ihre App-PIN erneut ein.</string>
+ <string name="pincode_remove_your_pincode">App-PIN entfernen</string>
+ <string name="pincode_mismatch">Die App-PINs stimmen nicht überein</string>
+ <string name="pincode_wrong">Falsche App-PIN</string>
+ <string name="pincode_removed">Die App-PIN wurde entfernt</string>
+ <string name="pincode_stored">Die App-PIN wurde gespeichert</string>
+ <string name="media_notif_ticker">%1$s Musikplayer</string>
+ <string name="media_state_playing">%1$s (abspielend)</string>
+ <string name="media_state_loading">%1$s (lädt)</string>
+ <string name="media_event_done">%1$s Wiedergabe beendet</string>
+ <string name="media_err_nothing_to_play">Keine Mediadatei gefunden</string>
+ <string name="media_err_no_account">Kein Account angegeben</string>
+ <string name="media_err_not_in_owncloud">Datei nicht in einem gültigen Account</string>
+ <string name="media_err_unsupported">Nicht unterstützter Media-codec</string>
+ <string name="media_err_io">Mediendatei konnte nicht gelesen werden</string>
+ <string name="media_err_malformed">Mediendatei nicht korrekt kodiert</string>
+ <string name="media_err_invalid_progressive_playback">Mediendatei kann nicht gestreamt werden</string>
+ <string name="media_err_unknown">Die Mediendatei kann nicht mit dem vorinstallierten Media Player abgespielt werden</string>
+ <string name="media_err_security_ex">Sicherheitsfehler beim abspielen von %1$s</string>
+ <string name="media_err_io_ex">Eingabefehler beim Versuch %1$s abzuspielen</string>
+ <string name="media_err_unexpected">Unerwarteter Fehler beim Versuch %1$s abzuspielen</string>
+ <string name="media_rewind_description">Zurückspulen Button</string>
+ <string name="media_play_pause_description">Abspielen oder Pausieren Button</string>
+ <string name="media_forward_description">Vorspulen Button</string>
+ <string name="auth_trying_to_login">Anmeldungsversuch...</string>
+ <string name="auth_no_net_conn_title">Keine Netzwerkverbindung</string>
+ <string name="auth_nossl_plain_ok_title">Sichere Verbindung nicht verfügbar.</string>
+ <string name="auth_connection_established">Verbindung hergestellt</string>
+ <string name="auth_testing_connection">Verbindung testen...</string>
+ <string name="auth_not_configured_title">Fehlerhafte Server Konfiguration</string>
+ <string name="auth_unknown_error_title">Ein unbekannter Fehler ist aufgetreten!</string>
+ <string name="auth_unknown_host_title">Konnte den Host nicht finden.</string>
+ <string name="auth_incorrect_path_title">Server-Installation nicht gefunden</string>
+ <string name="auth_timeout_title">Der Server braucht zu lange für eine Antwort.</string>
+ <string name="auth_incorrect_address_title">Fehlerhafte URL</string>
+ <string name="auth_ssl_general_error_title">SSL-Initialisierung fehlgeschlagen.</string>
+ <string name="auth_bad_oc_version_title">Unbekannte Server-Version</string>
+ <string name="auth_wrong_connection_title">Konnte keine Verbindung aufbauen.</string>
+ <string name="auth_secure_connection">Sichere Verbindung hergestellt</string>
+ <string name="auth_unauthorized">Falscher Benutzername oder Passwort</string>
+ <string name="auth_oauth_error">Autorisierung nicht erfolgreich</string>
+ <string name="auth_oauth_error_access_denied">Zugriff durch den Autorisierungsserver abgelehnt</string>
+ <string name="auth_wtf_reenter_URL">Unerwarteter Zustand; bitte geben Sie die URL des Servers nochmals ein</string>
+ <string name="auth_expired_basic_auth_toast">Bitte geben Sie Ihr aktuelles Passwort ein</string>
+ <string name="fd_keep_in_sync">Datei aktuell halten</string>
+ <string name="common_rename">Umbenennen</string>
+ <string name="common_remove">Löschen</string>
+ <string name="confirmation_remove_alert">Möchten Sie %1$s wirklich löschen?</string>
+ <string name="confirmation_remove_folder_alert">Möchten Sie wirklich %1$s und dessen Inhalte entfernen?</string>
+ <string name="confirmation_remove_local">Nur lokal</string>
+ <string name="confirmation_remove_folder_local">Nur lokale Inhalte</string>
+ <string name="confirmation_remove_remote">Vom Server entfernen</string>
+ <string name="confirmation_remove_remote_and_local">Lokal und auf dem Server</string>
+ <string name="remove_success_msg">Erfolgreich gelöscht</string>
+ <string name="remove_fail_msg">Der Löschvorgang konnte nicht beendet werden</string>
+ <string name="rename_dialog_title">Geben Sie einen neuen Namen ein</string>
+ <string name="rename_local_fail_msg">Die lokale Kopie konnte nicht umbenannt werden. Versuchen Sie es mit einem anderen neuen Namen.</string>
+ <string name="rename_server_fail_msg">Die Umbenennung konnte nicht abgeschlossen werden.</string>
+ <string name="sync_file_fail_msg">Die entfernte Datei konnte nicht überprüft werden</string>
+ <string name="sync_file_nothing_to_do_msg">Dateiinhalte bereits synchronisiert</string>
+ <string name="wait_a_moment">Bitte warten Sie einen Moment.</string>
+ <string name="filedisplay_unexpected_bad_get_content">Ein unerwartetes Problem ist aufgetreten. Bitte versuchen Sie, die Datei in einer anderen App zu öffnen.</string>
+ <string name="filedisplay_no_file_selected">Es wurde keine Datei ausgewählt.</string>
+ <string name="oauth_login_connection">Verbinde mit dem oAuth2-Server...</string>
+ <string name="ssl_validator_header">Die Identität der Website konnte nicht überprüft werden</string>
+ <string name="ssl_validator_reason_cert_not_trusted">- Das Zertifikat des Servers ist nicht vertrauenswürdig</string>
+ <string name="ssl_validator_reason_cert_expired">- Das Zertifikat des Servers ist abgelaufen</string>
+ <string name="ssl_validator_reason_cert_not_yet_valid">- Das Gültigkeitsdatum des Serverzertifikats liegt in der Zukunft</string>
+ <string name="ssl_validator_reason_hostname_not_verified">- Die Adresse stimmt nicht mit dem im Zertifikat angegebenen Hostnamen überein</string>
+ <string name="ssl_validator_question">Möchten Sie diesem Zertifikat trotzdem vertrauen?</string>
+ <string name="ssl_validator_not_saved">Das Zertifikat konnte nicht gespeichert werden</string>
+ <string name="ssl_validator_btn_details_see">Details</string>
+ <string name="ssl_validator_btn_details_hide">Ausblenden</string>
+ <string name="ssl_validator_label_subject">Ausgestellt für:</string>
+ <string name="ssl_validator_label_issuer">Ausgestellt von:</string>
+ <string name="ssl_validator_label_CN">Üblicher Name:</string>
+ <string name="ssl_validator_label_O">Organisation:</string>
+ <string name="ssl_validator_label_OU">Organisationseinheit:</string>
+ <string name="ssl_validator_label_C">Land:</string>
+ <string name="ssl_validator_label_ST">Bundesland:</string>
+ <string name="ssl_validator_label_L">Ort:</string>
+ <string name="ssl_validator_label_validity">Gültigkeit:</string>
+ <string name="ssl_validator_label_validity_from">Von:</string>
+ <string name="ssl_validator_label_validity_to">An:</string>
+ <string name="ssl_validator_label_signature">Signatur:</string>
+ <string name="ssl_validator_label_signature_algorithm">Algorithmus:</string>
+ <string name="placeholder_sentence">Dies ist ein Platzhalter</string>
+ <string name="placeholder_filename">platzhalter.txt</string>
+ <string name="placeholder_filetype">PNG Bild</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">18.05.2012 12:23</string>
+ <string name="placeholder_media_time">12:23:45</string>
+ <string name="instant_upload_on_wifi">Fotos nur über WiFi hochladen</string>
+ <string name="instant_upload_path">/SofortUpload</string>
+ <string name="conflict_title">Konflikt beim Update</string>
+ <string name="conflict_message">Serverdatei %s ist nicht synchronisiert mit der lokalen Datei. Weitermachen bedeutet, dass der Inhalt der Datei auf dem Server ersetzt wird.</string>
+ <string name="conflict_keep_both">Beide behalten</string>
+ <string name="conflict_overwrite">Überschreiben</string>
+ <string name="conflict_dont_upload">Nicht hochladen</string>
+ <string name="preview_image_description">Bildvorschau</string>
+ <string name="preview_image_error_unknown_format">Dieses Bild kann nicht angezeigt werden</string>
+ <string name="failed_upload_headline_text">Sofortige Uploads fehlgeschlagen</string>
+ <string name="failed_upload_headline_hint">Zusammenfassung aller fehlgeschlagenen Uploads</string>
+ <string name="failed_upload_all_cb">Alle auswählen</string>
+ <string name="failed_upload_headline_retryall_btn">Versuche alle ausgewählten erneut</string>
+ <string name="failed_upload_headline_delete_all_btn">Lösche alle ausgewählten aus der Uploadwarteschlange</string>
+ <string name="failed_upload_retry_text">Bildupload erneut versuchen:</string>
+ <string name="failed_upload_load_more_images">Lade weitere Bilder</string>
+ <string name="failed_upload_retry_do_nothing_text">Nicht durchgeführt - Nicht online für sofortigen Upload</string>
+ <string name="failed_upload_failure_text">Fehlermeldung:</string>
+ <string name="failed_upload_quota_exceeded_text">Bitte überprüfen Sie Ihre Serverkonfiguration. Vielleicht ist Ihr Nutzungslimit überschritten.</string>
+ <string name="activity_chooser_send_file_title">Senden</string>
+ <string name="clipboard_text_copied">In die Zwischenablage kopiert</string>
+</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Passwort:</string>
- <string name="main_login">Benutzername:</string>
- <string name="main_button_login">Anmelden</string>
- <string name="main_welcome">Willkommen</string>
- <string name="main_files">Dateien</string>
- <string name="main_music">Musik</string>
- <string name="main_contacts">Kontakte</string>
- <string name="main_calendar">Kalender</string>
- <string name="main_bookmarks">Lesezeichen</string>
- <string name="main_settings">Einstellungen</string>
- <string name="main_tit_accsetup">Konto einrichten</string>
- <string name="main_wrn_accsetup">Auf Ihrem Gerät sind keine Konten eingerichtet. Bitte erstellen Sie ein Konto, um diese App zu nutzen.</string>
- <string name="about_message">%1$s Android App\n\nVersion: %2$s</string>
- <string name="actionbar_sync">Aktualisieren</string>
+ <string name="about_android">%1$s Android App</string>
+ <string name="about_version">Version %1$s</string>
+ <string name="actionbar_sync">Konto aktualisieren</string>
<string name="actionbar_upload">Datei hochladen</string>
<string name="actionbar_upload_from_apps">Inhalt von anderen Apps</string>
<string name="actionbar_upload_files">Dateien</string>
- <string name="actionbar_mkdir">Ordner anlegen</string>
- <string name="actionbar_search">Suche</string>
+ <string name="actionbar_open_with">Öffnen mit</string>
+ <string name="actionbar_mkdir">Neues Ordner</string>
<string name="actionbar_settings">Einstellungen</string>
+ <string name="actionbar_see_details">Details</string>
+ <string name="actionbar_send_file">Senden</string>
<string name="prefs_category_general">Allgemein</string>
- <string name="prefs_category_trackmydevice">Gerät verfolgen</string>
- <string name="prefs_add_session">Neue Sitzung hinzufügen</string>
- <string name="prefs_create_img_thumbnails">Bildvorschau erstellen</string>
- <string name="prefs_select_oc_account">Account auswählen</string>
- <string name="prefs_summary_select_oc_account">Bitte wählen Sie, welches Konto von der App verwendet werden soll.</string>
- <string name="prefs_trackmydevice">Gerät verfolgen</string>
- <string name="prefs_trackmydevice_summary_off">Geräteverfolgung in dieser App aktivieren</string>
- <string name="prefs_trackmydevice_summary_on">Ihre App verfolgt dieses Gerät</string>
- <string name="prefs_trackmydevice_interval">Aktualisierungsintervall</string>
- <string name="prefs_trackmydevice_interval_summary">Alle %1$s Minuten aktualisieren</string>
+ <string name="prefs_category_more">Mehr</string>
<string name="prefs_accounts">Konten</string>
<string name="prefs_manage_accounts">Konten verwalten</string>
<string name="prefs_pincode">App-PIN</string>
<string name="prefs_pincode_summary">Schützen Sie Ihren Client</string>
<string name="prefs_instant_upload">Aktiviert den sofortigen Upload</string>
<string name="prefs_instant_upload_summary">Laden Sie Ihre Fotos von der Kamera sofort hoch</string>
- <string name="auth_host_url">URL</string>
+ <string name="prefs_log_title">Protokollierung aktivieren</string>
+ <string name="prefs_log_summary">Dies wird zur Protokollierung von Problemen genutzt</string>
+ <string name="prefs_log_title_history">Protokollierungsverlauf</string>
+ <string name="prefs_log_summary_history">Dies zeigt die gespeicherten Protokollierungen</string>
+ <string name="prefs_log_delete_history_button">Verlauf löschen</string>
+ <string name="prefs_help">Hilfe</string>
+ <string name="prefs_recommend">Empfehlen Sie dies einem Freund</string>
+ <string name="prefs_feedback">Rückmeldungen</string>
+ <string name="prefs_imprint">Impressum</string>
+ <string name="recommend_subject">Probieren Sie %1$s auf Ihrem Smartphone!</string>
+ <string name="auth_check_server">Server überprüfen</string>
+ <string name="auth_host_url">Server-Adresse https://…</string>
<string name="auth_username">Benutzername</string>
<string name="auth_password">Passwort</string>
- <string name="auth_register">Ich bin neu bei %1$s</string>
- <string name="new_session_uri_error">Falsche URL angegeben</string>
- <string name="new_session_session_name_error">Falscher Sitzungsname</string>
+ <string name="auth_register">Ist %1$s neu für Sie?</string>
<string name="sync_string_files">Dateien</string>
- <string name="uploader_no_file_selected">Sie haben keine Datei zum Hochladen ausgewählt</string>
- <string name="setup_hint_username">Benutzername</string>
- <string name="setup_hint_password">Passwort</string>
- <string name="setup_hint_address">Internetadresse</string>
- <string name="setup_hint_show_password">Passwort anzeigen?</string>
- <string name="setup_title">Mit Ihrer %1$s verbinden</string>
<string name="setup_btn_connect">Verbinden</string>
<string name="uploader_btn_upload_text">Hochladen</string>
- <string name="uploader_top_message">Wähle Zielverzeichnis:</string>
+ <string name="uploader_top_message">Wähle Zielordner:</string>
<string name="uploader_wrn_no_account_title">Kein Konto gefunden</string>
<string name="uploader_wrn_no_account_text">Es sind keine %1$s-Konten auf Ihrem Gerät eingerichtet. Bitte richten Sie zuerst ein Konto ein.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Einrichten</string>
<string name="uploader_wrn_no_content_text">Es wurden keine Inhalte empfangen. Es gibt nichts zum Hochladen.</string>
<string name="uploader_error_forbidden_content">%1$s darf den freigegebenen Inhalt nicht nutzen.</string>
<string name="uploader_info_uploading">Lade hoch</string>
- <string name="uploader_btn_create_dir_text">Verzeichnis für hochzuladene Dateien erstellen</string>
<string name="file_list_empty">Es sind keine Dateien im Verzeichnis vorhanden.\nNeue Dateien können mit der Menüfunktion \"Hochladen\" hinzugefügt werden.</string>
<string name="filedetails_select_file">Klicken Sie auf eine Datei für weitere Informationen.</string>
<string name="filedetails_size">Größe:</string>
<string name="filedetails_created">Erstellt:</string>
<string name="filedetails_modified">Geändert:</string>
<string name="filedetails_download">Herunterladen</string>
- <string name="filedetails_sync_file">Aktualisieren</string>
- <string name="filedetails_redownload">Neu laden</string>
- <string name="filedetails_open">Öffnen</string>
+ <string name="filedetails_sync_file">Datei aktualisieren</string>
<string name="filedetails_renamed_in_upload_msg">Datei wurde wärend des Uploads zu %1$s umbenannt</string>
+ <string name="action_share_file">Link teilen</string>
+ <string name="action_unshare_file">Link nicht mehr teilen</string>
<string name="common_yes">Ja</string>
<string name="common_no">Nein</string>
<string name="common_ok">OK</string>
<string name="common_cancel_upload">Upload abbrechen</string>
<string name="common_cancel">Abbrechen</string>
<string name="common_save_exit">Speichern & Schließen</string>
- <string name="common_exit">%1$s verlassen</string>
<string name="common_error">Fehler</string>
- <string name="common_loading">Wird geladen …</string>
+ <string name="common_loading">Lade …</string>
<string name="common_error_unknown">Unbekannter Fehler</string>
<string name="about_title">Über</string>
+ <string name="change_password">Passwort ändern</string>
<string name="delete_account">Account löschen</string>
<string name="create_account">Account erstellen</string>
<string name="upload_chooser_title">Dateien hochladen von...</string>
<string name="uploader_upload_in_progress_content">%1$d%% Hochladen %2$s</string>
<string name="uploader_upload_succeeded_ticker">Hochladen erfolgreich</string>
<string name="uploader_upload_succeeded_content_single">%1$s wurde(n) erfolgreich hochgeladen</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d Datei(en) wurde(n) erfolgreich hochgeladen</string>
<string name="uploader_upload_failed_ticker">Hochladen fehlgeschlagen</string>
<string name="uploader_upload_failed_content_single">Hochladen von %1$s konnte nicht abgeschlossen werden</string>
- <string name="uploader_upload_failed_content_multiple">Hochladen fehlgeschlagen: %1$d/%2$d Dateien wurden hochgeladen</string>
<string name="downloader_download_in_progress_ticker">Herunterladen...</string>
<string name="downloader_download_in_progress_content">%1$d%% Herunterladen %2$s</string>
<string name="downloader_download_succeeded_ticker">Herunterladen erfolgreich</string>
<string name="downloader_download_failed_content">Herunterladen von %1$s konnte nicht abgeschlossen werden</string>
<string name="downloader_not_downloaded_yet">Noch nicht heruntergeladen</string>
<string name="common_choose_account">Konto auswählen</string>
- <string name="sync_string_contacts">Kontakte</string>
<string name="sync_fail_ticker">Synchronisation fehlgeschlagen</string>
<string name="sync_fail_content">Bei der Synchronisation konnte %1$s nicht übertragen werden</string>
+ <string name="sync_fail_content_unauthorized">Ungültiges Passwort für %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Konflikte gefunden</string>
<string name="sync_conflicts_in_favourites_content">%1$d Synchronisationsdateien konnten nicht synchronisiert werden.</string>
<string name="sync_fail_in_favourites_ticker">Synchronisationsdateien konnten nicht synchronisiert werden.</string>
<string name="sync_fail_in_favourites_content">Inhalte von %1$d konnte nicht synchronisiert werden (%2$d Konflikte)</string>
- <string name="use_ssl">Sichere Verbindung benutzen</string>
- <string name="location_no_provider">%1$s kann Ihr Gerät nicht verfolgen. Bitte überprüfen Sie Ihre Standorteinstellungen.</string>
+ <string name="sync_foreign_files_forgotten_ticker">Einige lokale Dateien wurden vergessen</string>
+ <string name="sync_foreign_files_forgotten_content">%1$d Dateien aus dem %2$s Verzeichnis konnten nicht kopiert werden nach</string>
+ <string name="sync_foreign_files_forgotten_explanation">Mit Version 1.3.16 werden Dateien die von diesem Gerät aus hochgeladen werden in den lokalen Ordner %1$s kopiert um Datenverlust zu vermeiden, wenn eine einzelne Datei mit mehreren Accounts synchronisiert wird.\n\nInfolge dieser Änderung wurden alle Dateien, die mit vorherigen Versionen dieser App hochgeladen wurden, in den Ordner %2$s verschoben. Jedoch ist während der Account-Synchronisation ein Fehler aufgetreten, der das Abschließen dieses Vorgangs verhindert. Sie können die Datei(en) entweder wie sie sind belassen und den Link zu %3$s entfernen oder die Datei(en) in den %1$s Ordner verschieben und den Link zu %4$s beibehalten.\n\nUnten befindet sich eine Liste der lokalen Datei(en) und der mit ihnen verbundenen Remote-Datei(en) in %5$s.</string>
+ <string name="sync_current_folder_was_removed">Das Verzeichnis %1$s existiert nicht mehr</string>
+ <string name="foreign_files_move">Verschiebe alle</string>
+ <string name="foreign_files_success">Alle Dateien wurden verschoben</string>
+ <string name="foreign_files_fail">Einige Dateien konnten nicht verschoben werden</string>
+ <string name="foreign_files_local_text">Lokal: %1$s</string>
+ <string name="foreign_files_remote_text">Remote: %1$s</string>
+ <string name="upload_query_move_foreign_files">Es steht nicht genügend Speicherplatz zur Verfügung, um die ausgewählten Dateien in den %1$s Ordner zu kopieren. Möchten Sie sie stattdessen verschieben?</string>
<string name="pincode_enter_pin_code">Bitte geben Sie Ihre App-PIN ein</string>
- <string name="pincode_enter_new_pin_code">Bitte geben Sie Ihre neue App-PIN ein</string>
<string name="pincode_configure_your_pin">Bitte geben Sie Ihre App-PIN ein</string>
<string name="pincode_configure_your_pin_explanation">PIN-Abfrage erfolgt nach Starten der App.</string>
<string name="pincode_reenter_your_pincode">Bitte geben Sie Ihre App-PIN erneut ein.</string>
<string name="pincode_wrong">Falsche App-PIN</string>
<string name="pincode_removed">Die App-PIN wurde entfernt</string>
<string name="pincode_stored">Die App-PIN wurde gespeichert</string>
- <string name="media_notif_ticker">"%1$s Musik Player"</string>
- <string name="media_state_playing">"%1$s (wird abgespielt)"</string>
- <string name="media_state_loading">"%1$s (wird geladen)"</string>
- <string name="media_event_done">"%1$s Wiedergabe beendet"</string>
- <string name="media_err_nothing_to_play">Keine Media-Datei gefunden</string>
- <string name="media_err_no_account">Ungültiger Account</string>
- <string name="media_err_not_in_owncloud">Datei ist nicht in einem gültigen Account</string>
- <string name="media_err_unsupported">Nicht unterstützter Medien-Codec</string>
- <string name="media_err_io">Media-Datei konnte nicht gelesen werden</string>
- <string name="media_err_malformed">Die Media-Datei ist noch nicht kodiert</string>
- <string name="media_err_timeout">Zeitüberschreitung ist beim Abspielen aufgetreten</string>
- <string name="media_err_invalid_progressive_playback">Media-Datei konnte nicht gestreamt werden</string>
- <string name="media_err_unknown">Media-Datei kann nicht vom Standard Player wiedergegeben werden</string>
- <string name="media_err_security_ex">Sicherheits-Fehler ist beim Abspielen aufgetreten %1$s</string>
- <string name="media_err_io_ex">Eingabe-Fehler ist beim Abspielen aufgetreten %1$s</string>
- <string name="media_err_unexpected">Unerwarteter Fehler bei der Wiedergabe %1$s</string>
- <string name="media_rewind_description">Zurückspulen</string>
- <string name="media_play_pause_description">Wiedergabe oder Pause</string>
- <string name="media_forward_description">Vorspulen</string>
-
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 Minuten</item>
- <item>30 Minuten</item>
- <item>60 Minuten</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="media_notif_ticker">%1$s Musikplayer</string>
+ <string name="media_state_playing">%1$s (abspielend)</string>
+ <string name="media_state_loading">%1$s (lädt)</string>
+ <string name="media_event_done">%1$s Wiedergabe beendet</string>
+ <string name="media_err_nothing_to_play">Keine Mediadatei gefunden</string>
+ <string name="media_err_no_account">Kein Account angegeben</string>
+ <string name="media_err_not_in_owncloud">Datei nicht in einem gültigen Account</string>
+ <string name="media_err_unsupported">Nicht unterstützter Media-codec</string>
+ <string name="media_err_io">Mediendatei konnte nicht gelesen werden</string>
+ <string name="media_err_malformed">Mediendatei nicht korrekt kodiert</string>
+ <string name="media_err_timeout">Wartezeit beim Abspielversuch abgelaufen</string>
+ <string name="media_err_invalid_progressive_playback">Mediendatei kann nicht gestreamt werden</string>
+ <string name="media_err_unknown">Die Mediendatei kann nicht mit dem vorinstallierten Media Player abgespielt werden</string>
+ <string name="media_err_security_ex">Sicherheitsfehler beim abspielen von %1$s</string>
+ <string name="media_err_io_ex">Eingabefehler beim Versuch %1$s abzuspielen</string>
+ <string name="media_err_unexpected">Unerwarteter Fehler beim Versuch %1$s abzuspielen</string>
+ <string name="media_rewind_description">Zurückspulen Button</string>
+ <string name="media_play_pause_description">Abspielen oder Pausieren Button</string>
+ <string name="media_forward_description">Vorspulen Button</string>
<string name="auth_trying_to_login">Anmeldungsversuch...</string>
<string name="auth_no_net_conn_title">Keine Netzwerkverbindung</string>
- <string name="auth_no_net_conn_message">Es konnte keine Netzwerkverbindung gefunden werden, bitte überprüfen Sie Ihre Internetverbindung.</string>
- <string name="auth_connect_anyway">Trotzdem verbinden</string>
<string name="auth_nossl_plain_ok_title">Sichere Verbindung nicht verfügbar.</string>
- <string name="auth_nossl_plain_ok_message">Die App konnte keine sichere Verbindung zum Server herstellen. Eine unsichere Verbindung ist verfügbar. Möchten Sie fortfahren oder abbrechen?</string>
<string name="auth_connection_established">Verbindung hergestellt</string>
<string name="auth_testing_connection">Verbindung testen...</string>
<string name="auth_not_configured_title">Fehlerhafte Server Konfiguration</string>
- <string name="auth_not_configured_message">Es scheint, als wäre Ihre Server-Installation nicht richtig konfiguriert. Bitte kontaktieren Sie Ihren Administrator, um weitere Details zu erhalten.</string>
+ <string name="auth_account_not_new">Ein Benutzerkonto für den gleichen Benutzer und Server existiert auf diesem Gerät bereits</string>
+ <string name="auth_account_not_the_same">Der eingegebene Benutzer passt nicht zu dem Benutzer dieses Benutzerkontos</string>
<string name="auth_unknown_error_title">Ein unbekannter Fehler ist aufgetreten!</string>
- <string name="auth_unknown_error_message">Ein unbekannter Fehler ist aufgetreten. Bitte kontaktieren Sie Ihren Administrator unter Zuhilfenahme der Log-Dateien Ihres Gerätes.</string>
<string name="auth_unknown_host_title">Konnte den Host nicht finden.</string>
- <string name="auth_unknown_host_message">Konnte den eingetragenen Host nicht finden. Bitte prüfen Sie den Hostnamen und die Verfügbarkeit des Servers und versuchen es erneut.</string>
<string name="auth_incorrect_path_title">Server-Installation nicht gefunden</string>
- <string name="auth_incorrect_path_message">Die App konnte den Server unter dem angegebenen Pfad nicht finden. Bitte überprüfen Sie den Pfad und versuchen es erneut.</string>
<string name="auth_timeout_title">Der Server braucht zu lange für eine Antwort.</string>
<string name="auth_incorrect_address_title">Fehlerhafte URL</string>
<string name="auth_ssl_general_error_title">SSL-Initialisierung fehlgeschlagen.</string>
- <string name="auth_ssl_unverified_server_title">Nichtüberprüfte SSL-Server-Identität</string>
+ <string name="auth_ssl_unverified_server_title">SSL-Server-Identität konnte nicht überprüft werden</string>
<string name="auth_bad_oc_version_title">Unbekannte Server-Version</string>
<string name="auth_wrong_connection_title">Konnte keine Verbindung aufbauen.</string>
<string name="auth_secure_connection">Sichere Verbindung hergestellt</string>
- <string name="auth_login_details">Anmeldedetails</string>
- <string name="auth_unauthorized">Benutzername oder Passwort ungültig</string>
- <string name="auth_not_found">Falsche Pfadangabe</string>
- <string name="auth_internal">Interner Server Fehler, Fehlercode %1$d</string>
- <string name="crashlog_message">Die Anwendung ist abgestürzt. Möchten Sie einen Bericht senden?</string>
- <string name="crashlog_send_report">Bericht senden</string>
- <string name="crashlog_dont_send_report">Keinen Bericht senden</string>
- <string name="extensions_avail_title">Erweiterung verfügbar!</string>
- <string name="extensions_avail_message">Scheinbar unterstützt Ihr Server weitere Erweiterungen. Möchten Sie die verfügbaren Erweiterungen für Android sehen?</string>
+ <string name="auth_unauthorized">Falscher Benutzername oder Passwort</string>
+ <string name="auth_oauth_error">Autorisierung nicht erfolgreich</string>
+ <string name="auth_oauth_error_access_denied">Zugriff durch den Autorisierungsserver abgelehnt</string>
+ <string name="auth_wtf_reenter_URL">Unerwarteter Zustand; bitte geben Sie die URL des Servers nochmals ein</string>
+ <string name="auth_expired_oauth_token_toast">Ihre Autorisierung ist abgelaufen. Bitte Autorisierung nochmals durchführen</string>
+ <string name="auth_expired_basic_auth_toast">Bitte geben Sie Ihr aktuelles Passwort ein</string>
+ <string name="auth_expired_saml_sso_token_toast">Ihre Sitzung ist abgelaufen. Bitte Anmeldung nochmals durchführen</string>
+ <string name="auth_connecting_auth_server">Verbinde mit dem Authentifizierung-Server…</string>
+ <string name="auth_unsupported_auth_method">Der Server unterstützt diese Authentifizierung-Methode nicht</string>
+ <string name="auth_unsupported_multiaccount">%1$s unterstützt nicht mehrere Benutzerkonten</string>
+ <string name="auth_can_not_auth_against_server">Die Authentifizierung gegenüber dem Server konnte nicht durchgeführt werden</string>
<string name="fd_keep_in_sync">Datei aktuell halten</string>
- <string name="common_share">Teilen</string>
<string name="common_rename">Umbenennen</string>
<string name="common_remove">Löschen</string>
<string name="confirmation_remove_alert">Möchten Sie %1$s wirklich löschen?</string>
<string name="rename_server_fail_msg">Die Umbenennung konnte nicht abgeschlossen werden.</string>
<string name="sync_file_fail_msg">Die entfernte Datei konnte nicht überprüft werden</string>
<string name="sync_file_nothing_to_do_msg">Dateiinhalte bereits synchronisiert</string>
- <string name="create_dir_fail_msg">Das Verzeichnis konnte nicht erstellt werden.</string>
+ <string name="create_dir_fail_msg">Verzeichnis konnte nicht erstellt werden</string>
+ <string name="filename_forbidden_characters">Verbotene Zeichen: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Bitte warten Sie einen Moment.</string>
<string name="filedisplay_unexpected_bad_get_content">Ein unerwartetes Problem ist aufgetreten. Bitte versuchen Sie, die Datei in einer anderen App zu öffnen.</string>
<string name="filedisplay_no_file_selected">Es wurde keine Datei ausgewählt.</string>
- <string name="ssl_validator_title">Warnung</string>
+ <string name="activity_chooser_title">Link senden an ...</string>
+ <string name="oauth_check_onoff">Anmelden mit oAuth2</string>
+ <string name="oauth_login_connection">Verbinde mit dem oAuth2-Server…</string>
<string name="ssl_validator_header">Die Identität der Website konnte nicht überprüft werden</string>
<string name="ssl_validator_reason_cert_not_trusted">- Das Zertifikat des Servers ist nicht vertrauenswürdig</string>
<string name="ssl_validator_reason_cert_expired">- Das Zertifikat des Servers ist abgelaufen</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- Das Gültigkeitsdatum des Serverzertifikats liegt in der Zukunft</string>
<string name="ssl_validator_reason_hostname_not_verified">- Die Adresse stimmt nicht mit dem im Zertifikat angegebenen Hostnamen überein</string>
- <string name="ssl_validator_certificate_not_available">Das Zertifikat des Servers konnte nicht abgerufen werden</string>
<string name="ssl_validator_question">Möchten Sie diesem Zertifikat trotzdem vertrauen?</string>
<string name="ssl_validator_not_saved">Das Zertifikat konnte nicht gespeichert werden</string>
<string name="ssl_validator_btn_details_see">Details</string>
<string name="ssl_validator_label_validity_to">An:</string>
<string name="ssl_validator_label_signature">Signatur:</string>
<string name="ssl_validator_label_signature_algorithm">Algorithmus:</string>
- <string name="text_placeholder">Dies ist ein Platzhalter</string>
+ <string name="ssl_validator_null_cert">Das Zertifikat konnte nicht gezeigt werden.</string>
+ <string name="ssl_validator_no_info_about_error">- Keine Informationen über den Fehler</string>
+ <string name="placeholder_sentence">Dies ist ein Platzhalter</string>
+ <string name="placeholder_filename">platzhalter.txt</string>
+ <string name="placeholder_filetype">PNG Bild</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">18.05.2012 12:23</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Fotos nur über WiFi hochladen</string>
<string name="instant_upload_path">/SofortUpload</string>
<string name="conflict_title">Konflikt beim Update</string>
<string name="conflict_overwrite">Überschreiben</string>
<string name="conflict_dont_upload">Nicht hochladen</string>
<string name="preview_image_description">Bildvorschau</string>
- <string name="preview_image_error_unknown_format">Das Bild kann nicht angezeigt werden</string>
- <string name="preview_image_error_out_of_memory">"Nicht genug Speicherplatz um das Bild anzuzeigen</string>
-
- <string name="actionbar_failed_instant_upload">Fehlgeschlagene Sofortuploads</string>
- <string name="failed_upload_headline_text">Fehlgeschlagene Sofortuploads</string>
- <string name="failed_upload_headline_hint">Auflistung aller fehlgeschlagenen Softuploads</string>
+ <string name="preview_image_error_unknown_format">Dieses Bild kann nicht angezeigt werden</string>
+ <string name="error__upload__local_file_not_copied">%1$s konnte nicht in den lokalen %2$s Ordner kopiert werden</string>
+ <string name="actionbar_failed_instant_upload">Sofort-Upload fehlgeschlagen</string>
+ <string name="failed_upload_headline_text">Sofortige Uploads fehlgeschlagen</string>
+ <string name="failed_upload_headline_hint">Zusammenfassung aller fehlgeschlagenen Uploads</string>
<string name="failed_upload_all_cb">Alle auswählen</string>
- <string name="failed_upload_headline_retryall_btn">Ausgewählte wiederholen</string>
- <string name="failed_upload_headline_delete_all_btn">Ausgewählte löschen </string>
- <string name="failed_upload_retry_text">Versuche ausgewählte erneut hochzuladen</string>
- <string name="failed_upload_load_more_images">Load more Picrures</string>
- <string name="failed_upload_retry_do_nothing_text">do nothing you are not online for instant upload</string>
+ <string name="failed_upload_headline_retryall_btn">Versuche alle ausgewählten erneut</string>
+ <string name="failed_upload_headline_delete_all_btn">Lösche alle ausgewählten aus der Uploadwarteschlange</string>
+ <string name="failed_upload_retry_text">Bildupload erneut versuchen:</string>
+ <string name="failed_upload_load_more_images">Lade weitere Bilder</string>
+ <string name="failed_upload_retry_do_nothing_text">Nicht durchgeführt - Nicht online für sofortigen Upload</string>
+ <string name="failed_upload_failure_text">Fehlermeldung:</string>
+ <string name="failed_upload_quota_exceeded_text">Bitte überprüfen Sie Ihre Serverkonfiguration. Vielleicht ist Ihr Nutzungslimit überschritten.</string>
+ <string name="share_link_file_no_exist">Die Freigabe der Datei oder des Ordners ist nicht möglich. Bitte stellen Sie sicher, dass diese existiert.</string>
+ <string name="share_link_file_error">Es ist ein Fehler beim Freigeben der Datei oder des Ordners aufgetreten.</string>
+ <string name="unshare_link_file_no_exist">Das Entfernen der Freigabe für die Datei oder den Ordner ist nicht möglich. Diese existieren nicht.</string>
+ <string name="unshare_link_file_error">Es ist ein Fehler beim Entfernen der Freigabe für diese Datei oder den Ordner aufgetreten.</string>
+ <string name="activity_chooser_send_file_title">Senden</string>
+ <string name="copy_link">Link kopieren</string>
+ <string name="clipboard_text_copied">In die Zwischenablage kopiert</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Passwort:</string>
- <string name="main_login">Benutzername:</string>
- <string name="main_button_login">Anmelden</string>
- <string name="main_welcome">Willkommen</string>
- <string name="main_files">Dateien</string>
- <string name="main_music">Musik</string>
- <string name="main_contacts">Kontakte</string>
- <string name="main_calendar">Kalender</string>
- <string name="main_bookmarks">Lesezeichen</string>
- <string name="main_settings">Einstellungen</string>
- <string name="main_tit_accsetup">Account einrichten</string>
- <string name="main_wrn_accsetup">Auf Deinem Gerät sind keine Konten eingerichtet. Bitte erstelle ein Konto, um diese App zu nutzen.</string>
- <string name="about_message">%1$s Android App\n\nVersion: %2$s</string>
- <string name="actionbar_sync">Aktualisieren</string>
+ <string name="about_android">%1$s Android-App</string>
+ <string name="about_version">Version %1$s</string>
+ <string name="actionbar_sync">Konto aktualisieren</string>
<string name="actionbar_upload">Datei hochladen</string>
<string name="actionbar_upload_from_apps">Inhalt von anderen Apps</string>
<string name="actionbar_upload_files">Dateien</string>
- <string name="actionbar_mkdir">Ordner anlegen</string>
- <string name="actionbar_search">Suche</string>
+ <string name="actionbar_open_with">Öffnen mit</string>
+ <string name="actionbar_mkdir">Neuer Ordner</string>
<string name="actionbar_settings">Einstellungen</string>
+ <string name="actionbar_see_details">Details</string>
+ <string name="actionbar_send_file">Senden</string>
<string name="prefs_category_general">Allgemein</string>
- <string name="prefs_category_trackmydevice">Gerät verfolgen</string>
- <string name="prefs_add_session">Neue Sitzung hinzufügen</string>
- <string name="prefs_create_img_thumbnails">Bildvorschau erstellen</string>
- <string name="prefs_select_oc_account">Account auswählen</string>
- <string name="prefs_summary_select_oc_account">Bitte wähle, welches Konto von der App verwendet werden soll.</string>
- <string name="prefs_trackmydevice">Gerät verfolgen</string>
- <string name="prefs_trackmydevice_summary_off">Geräteverfolgung in dieser App aktivieren</string>
- <string name="prefs_trackmydevice_summary_on">Deine App verfolgt dieses Gerät</string>
- <string name="prefs_trackmydevice_interval">Aktualisierungsintervall</string>
- <string name="prefs_trackmydevice_interval_summary">Alle %1$s Minuten aktualisieren</string>
+ <string name="prefs_category_more">Mehr</string>
<string name="prefs_accounts">Konten</string>
<string name="prefs_manage_accounts">Konten verwalten</string>
<string name="prefs_pincode">App-PIN</string>
<string name="prefs_pincode_summary">Schütze Deinen Client</string>
<string name="prefs_instant_upload">Aktiviert den sofortigen Upload</string>
<string name="prefs_instant_upload_summary">Lade Deine Fotos von der Kamera sofort hoch</string>
- <string name="auth_host_url">URL</string>
+ <string name="prefs_log_title">Protokollierung aktivieren</string>
+ <string name="prefs_log_summary">Dies wird zur Protokollierung von Problemen genutzt</string>
+ <string name="prefs_log_title_history">Protokollierungsverlauf</string>
+ <string name="prefs_log_summary_history">Dies zeigt die gespeicherten Protokollierungen</string>
+ <string name="prefs_log_delete_history_button">Verlauf löschen</string>
+ <string name="prefs_help">Hilfe</string>
+ <string name="prefs_recommend">Empfehle dies einem Freund</string>
+ <string name="prefs_feedback">Rückmeldungen</string>
+ <string name="prefs_imprint">Impressum</string>
+ <string name="recommend_subject">Probiere %1$s auf Deinem Smartphone!</string>
+ <string name="auth_check_server">Überprüfe den Server</string>
+ <string name="auth_host_url">Server-Adresse https://…</string>
<string name="auth_username">Benutzername</string>
<string name="auth_password">Passwort</string>
- <string name="auth_register">Ich bin neu bei %1$s</string>
- <string name="new_session_uri_error">Falsche URL angegeben</string>
- <string name="new_session_session_name_error">Falscher Sitzungsname</string>
+ <string name="auth_register">Ist %1$s neu für dich?</string>
<string name="sync_string_files">Dateien</string>
- <string name="uploader_no_file_selected">Du hast keine Datei zum Hochladen ausgewählt</string>
- <string name="setup_hint_username">Benutzername</string>
- <string name="setup_hint_password">Passwort</string>
- <string name="setup_hint_address">Internetadresse</string>
- <string name="setup_hint_show_password">Passwort anzeigen?</string>
- <string name="setup_title">Mit Deiner %1$s verbinden</string>
<string name="setup_btn_connect">Verbinden</string>
<string name="uploader_btn_upload_text">Hochladen</string>
- <string name="uploader_top_message">Wähle Zielverzeichnis:</string>
+ <string name="uploader_top_message">Wähle Zielordner:</string>
<string name="uploader_wrn_no_account_title">Kein Account gefunden</string>
<string name="uploader_wrn_no_account_text">Es sind keine %1$s-Accounts auf Deinem Gerät eingerichtet. Bitte richte zuerst ein Konto ein.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Einrichten</string>
<string name="uploader_wrn_no_content_text">Es wurden keine Inhalte empfangen. Es gibt nichts zum Hochladen.</string>
<string name="uploader_error_forbidden_content">%1$s darf den freigegebenen Inhalt nicht nutzen.</string>
<string name="uploader_info_uploading">Lade hoch</string>
- <string name="uploader_btn_create_dir_text">Ordner für hochzuladene Dateien erstellen</string>
<string name="file_list_empty">Es sind keine Dateien im Verzeichnis vorhanden.\nNeue Dateien können mit der \"Hochladen\" Menüfunktion hinzugefügt werden.</string>
<string name="filedetails_select_file">Klicken Sie auf eine Datei für weitere Informationen.</string>
<string name="filedetails_size">Größe:</string>
<string name="filedetails_created">Erstellt:</string>
<string name="filedetails_modified">Geändert:</string>
<string name="filedetails_download">Herunterladen</string>
- <string name="filedetails_sync_file">Aktualisieren</string>
- <string name="filedetails_redownload">Neu laden</string>
- <string name="filedetails_open">Öffnen</string>
+ <string name="filedetails_sync_file">Datei aktualisieren</string>
<string name="filedetails_renamed_in_upload_msg">Datei wurde wärend des Uploads zu %1$s umbenannt</string>
+ <string name="action_share_file">Link Teilen</string>
+ <string name="action_unshare_file">Link nicht mehr freigeben</string>
<string name="common_yes">Ja</string>
<string name="common_no">Nein</string>
<string name="common_ok">OK</string>
<string name="common_cancel_upload">Upload abbrechen</string>
<string name="common_cancel">Abbrechen</string>
<string name="common_save_exit">Speichern & schließen</string>
- <string name="common_exit">%1$s verlasse</string>
<string name="common_error">Fehler</string>
+ <string name="common_loading">Lädt ...</string>
+ <string name="common_error_unknown">Unbekannter Fehler</string>
<string name="about_title">Über</string>
+ <string name="change_password">Passwort ändern</string>
<string name="delete_account">Account löschen</string>
<string name="create_account">Account erstellen</string>
<string name="upload_chooser_title">Dateien hochladen von...</string>
<string name="uploader_upload_in_progress_content">%1$d%% Hochladen %2$s</string>
<string name="uploader_upload_succeeded_ticker">Hochladen erfolgreich</string>
<string name="uploader_upload_succeeded_content_single">%1$s wurde(n) erfolgreich hochgeladen</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d Datei(en) wurde(n) erfolgreich hochgeladen</string>
<string name="uploader_upload_failed_ticker">Hochladen fehlgeschlagen</string>
<string name="uploader_upload_failed_content_single">Hochladen von %1$s konnte nicht abgeschlossen werden</string>
- <string name="uploader_upload_failed_content_multiple">Hochladen fehlgeschlagen: %1$d/%2$d Dateien wurden hochgeladen</string>
<string name="downloader_download_in_progress_ticker">Herunterladen...</string>
<string name="downloader_download_in_progress_content">%1$d%% Herunterladen %2$s</string>
<string name="downloader_download_succeeded_ticker">Herunterladen erfolgreich</string>
<string name="downloader_download_succeeded_content">%1$s wurde erfolgreich heruntergeladen</string>
<string name="downloader_download_failed_ticker">Herunterladen fehlgeschlagen</string>
<string name="downloader_download_failed_content">Herunterladen von %1$s konnte nicht abgeschlossen werden</string>
+ <string name="downloader_not_downloaded_yet">Noch nicht Heruntergeladen</string>
<string name="common_choose_account">Account auswählen</string>
- <string name="sync_string_contacts">Kontakte</string>
<string name="sync_fail_ticker">Synchronisation fehlgeschlagen</string>
<string name="sync_fail_content">Bei der Synchronisation konnte %1$s nicht übertragen werden</string>
+ <string name="sync_fail_content_unauthorized">Falsches Passwort für %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Konflikte gefunden</string>
<string name="sync_conflicts_in_favourites_content">%1$d synchron zu haltende Dateien konnte nicht synchronisiert werden.</string>
<string name="sync_fail_in_favourites_ticker">Synchron halten schlug fehl.</string>
<string name="sync_fail_in_favourites_content">Inhalte von %1$d konnte nicht synchronisiert werden (%2$d Konflikte)</string>
- <string name="use_ssl">Sichere Verbindung benutzen</string>
- <string name="location_no_provider">%1$s kann Dein Gerät nicht verfolgen. Bitte überprüfe Deine Standorteinstellungen</string>
+ <string name="sync_foreign_files_forgotten_ticker">Einige lokale Dateien wurden vergessen</string>
+ <string name="sync_foreign_files_forgotten_content">%1$d Dateien aus dem %2$s Verzeichnis konnten nicht kopiert werden nach</string>
+ <string name="sync_foreign_files_forgotten_explanation">Mit Version 1.3.16 werden Dateien die von diesem Gerät aus hochgeladen werden in den lokalen Ordner %1$s kopiert um Datenverlust zu vermeiden, wenn eine einzelne Datei mit mehreren Accounts synchronisiert wird.\n\nInfolge dieser Änderung wurden alle Dateien, die mit vorherigen Versionen dieser App hochgeladen wurden, in den Ordner %2$s verschoben. Jedoch ist während der Account-Synchronisation ein Fehler aufgetreten, der das Abschließen dieses Vorgangs verhindert. Du kannst die Datei(en) entweder wie sie sind belassen und den Link zu %3$s entfernen oder die Datei(en) in den %1$s Ordner verschieben und den Link zu %4$s beibehalten.\n\nUnten befindet sich eine Liste der lokalen Datei(en) und der mit ihnen verbundenen Remote-Datei(en) in %5$s.</string>
+ <string name="sync_current_folder_was_removed">Das Verzeichnis %1$s existiert nicht mehr</string>
+ <string name="foreign_files_move">Verschiebe alle</string>
+ <string name="foreign_files_success">Alle Dateien wurden verschoben</string>
+ <string name="foreign_files_fail">Einige Dateien konnten nicht verschoben werden</string>
+ <string name="foreign_files_local_text">Lokal: %1$s</string>
+ <string name="foreign_files_remote_text">Remote: %1$s</string>
+ <string name="upload_query_move_foreign_files">Es steht nicht genügend Speicherplatz zur Verfügung, um die ausgewählten Dateien in den %1$s Ordner zu kopieren. Möchtest Du sie stattdessen verschieben?</string>
<string name="pincode_enter_pin_code">Bitte gib Deine App-PIN ein</string>
- <string name="pincode_enter_new_pin_code">Bitte gib eine neue App-PIN ein</string>
<string name="pincode_configure_your_pin">Bitte gib Deine App-PIN ein</string>
<string name="pincode_configure_your_pin_explanation">PIN-Abfrage erfolgt nach Starten der App.</string>
<string name="pincode_reenter_your_pincode">Bitte gib Deine App-PIN erneut ein.</string>
<string name="pincode_wrong">Falsche App-PIN</string>
<string name="pincode_removed">Die App-PIN wurde entfernt</string>
<string name="pincode_stored">Die App-PIN wurde gespeichert</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 Minuten</item>
- <item>30 Minuten</item>
- <item>60 Minuten</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="media_notif_ticker">%1$s Musik Player</string>
+ <string name="media_state_playing">%1$s (playing)</string>
+ <string name="media_state_loading">%1$s (loading)</string>
+ <string name="media_event_done">%1$s Beendet</string>
+ <string name="media_err_nothing_to_play">Keine Meidendatei gefunden</string>
+ <string name="media_err_no_account">Kein Konto angeben</string>
+ <string name="media_err_not_in_owncloud">Datei ist nicht in einem gültigen Account</string>
+ <string name="media_err_unsupported">Codierung wird nicht unterstützt</string>
+ <string name="media_err_io">Fehler beim Lesen der Datei</string>
+ <string name="media_err_malformed">Mediendatei nicht korrekt encodiert</string>
+ <string name="media_err_timeout">Wartezeit beim Abspielversuch abgelaufen</string>
+ <string name="media_err_invalid_progressive_playback">Mediendatei konnte nicht gestreamt werden</string>
+ <string name="media_err_unknown">Diese Mediendatei konnte nicht mit dem Standardplayer geöffnet werden</string>
+ <string name="media_err_security_ex">Sicherheitsfehler beim Versuch %1$s zu spielen</string>
+ <string name="media_err_io_ex">Eingabefehler beim Versuch %1$s zu spielen</string>
+ <string name="media_err_unexpected">Ein unerwarteter Fehler ist aufgetreten beim Versuch %1$s abzuspielen</string>
+ <string name="media_rewind_description">Zurückspielen Knopf</string>
+ <string name="media_play_pause_description">Play-/Pause Knopf</string>
+ <string name="media_forward_description">Vorspulen Knopf</string>
<string name="auth_trying_to_login">Anmeldungsversuch...</string>
<string name="auth_no_net_conn_title">Keine Netzwerkverbindung</string>
- <string name="auth_no_net_conn_message">Es konnte keine Netzwerkverbindung gefunden werden, bitte überprüfe Deine Internetverbindung.</string>
- <string name="auth_connect_anyway">Trotzdem verbinden</string>
<string name="auth_nossl_plain_ok_title">Sichere Verbindung nicht verfügbar.</string>
- <string name="auth_nossl_plain_ok_message">Die App konnte keine sichere Verbindung zum Server herstellen. Eine nicht sichere Verbindung ist nichtsdestotrotz verfügbar. Möchtest Du fortfahren oder abbrechen?</string>
<string name="auth_connection_established">Verbindung hergestellt</string>
<string name="auth_testing_connection">Verbindung testen...</string>
<string name="auth_not_configured_title">Fehlerhafte Server Konfiguration</string>
- <string name="auth_not_configured_message">Es scheint, als wäre Deine Server-Installation nicht richtig konfiguriert. Bitte kontaktiere Deinen Administrator, um weitere Details zu erhalten.</string>
+ <string name="auth_account_not_new">Ein Benutzerkonto für den gleichen Benutzer und Server existiert auf diesem Gerät bereits</string>
+ <string name="auth_account_not_the_same">Der eingegebene Benutzer passt nicht zu dem Benutzer dieses Benutzerkontos</string>
<string name="auth_unknown_error_title">Ein unbekannter Fehler ist aufgetreten!</string>
- <string name="auth_unknown_error_message">Ein unbekannter Fehler ist aufgetreten. Bitte kontaktiere Deinen Administrator unter Zuhilfenahme der Log-Dateien Deines Gerätes.</string>
<string name="auth_unknown_host_title">Konnte den Host nicht finden.</string>
- <string name="auth_unknown_host_message">Konnte den eingetragenen Host nicht finden. Bitte prüfe den Hostnamen und die Verfügbarkeit des Servers und versuche es erneut.</string>
<string name="auth_incorrect_path_title">Server-Installation nicht gefunden</string>
- <string name="auth_incorrect_path_message">Die App konnte den Server unter dem angegebenen Pfad nicht finden. Bitte überprüfe den Pfad und versuche es erneut.</string>
<string name="auth_timeout_title">Der Server braucht zu lange für eine Antwort.</string>
<string name="auth_incorrect_address_title">Fehlerhafte URL</string>
<string name="auth_ssl_general_error_title">SSL-Initialisierung fehlgeschlagen.</string>
- <string name="auth_ssl_unverified_server_title">Nichtüberprüfte SSL-Server-Identität</string>
+ <string name="auth_ssl_unverified_server_title">SSL-Server-Identität konnte nicht überprüft werden</string>
<string name="auth_bad_oc_version_title">Unbekannte Server-Version</string>
<string name="auth_wrong_connection_title">Konnte keine Verbindung aufbauen.</string>
<string name="auth_secure_connection">Sichere Verbindung hergestellt</string>
- <string name="auth_login_details">Anmeldedetails</string>
- <string name="auth_unauthorized">Benutzername oder Passwort ungültig</string>
- <string name="auth_not_found">Falsche Pfadangabe</string>
- <string name="auth_internal">Interner Server Fehler, Fehlercode %1$d</string>
- <string name="crashlog_message">Die Andwendung ist abgestürzt. Möchtest Du einen Bericht senden?</string>
- <string name="crashlog_send_report">Bericht senden</string>
- <string name="crashlog_dont_send_report">Keinen Bericht senden</string>
- <string name="extensions_avail_title">Erweiterung verfügbar!</string>
- <string name="extensions_avail_message">Scheinbar unterstützt Dein Server weitere Erweiterungen. Möchtest Du die verfügbaren Erweiterungen für Android sehen?</string>
+ <string name="auth_unauthorized">Benutzername oder Passwort stimmen nicht!</string>
+ <string name="auth_oauth_error">Autorisierung nicht erfolgreich</string>
+ <string name="auth_oauth_error_access_denied">Zugriff durch den Autorisierungsserver abgelehnt</string>
+ <string name="auth_wtf_reenter_URL">Unerwarteter Zustand; bitte gib die URL des Servers nochmals ein</string>
+ <string name="auth_expired_oauth_token_toast">Deine Autorisierung ist abgelaufen. Bitte Autorisierung nochmals durchführen</string>
+ <string name="auth_expired_basic_auth_toast">Bitte gib dein aktuelles Passwort ein</string>
+ <string name="auth_expired_saml_sso_token_toast">Deine Sitzung ist abgelaufen. Bitte Anmeldung nochmals durchführen</string>
+ <string name="auth_connecting_auth_server">Verbinde mit dem Authentifizierung-Server…</string>
+ <string name="auth_unsupported_auth_method">Der Server unterstützt diese Authentifizierung-Methode nicht</string>
+ <string name="auth_unsupported_multiaccount">%1$s unterstützt nicht mehrere Benutzerkonten</string>
+ <string name="auth_can_not_auth_against_server">Die Authentifizierung gegenüber dem Server konnte nicht durchgeführt werden</string>
<string name="fd_keep_in_sync">Datei aktuell halten</string>
- <string name="common_share">Teilen</string>
<string name="common_rename">Umbenennen</string>
<string name="common_remove">Löschen</string>
<string name="confirmation_remove_alert">Möchtest Du %1$s wirklich löschen?</string>
<string name="rename_server_fail_msg">Die Umbenennung konnte nicht abgeschlossen werden.</string>
<string name="sync_file_fail_msg">Die entfernte Datei konnte nicht überprüft werden</string>
<string name="sync_file_nothing_to_do_msg">Dateiinhalte bereits synchronisiert</string>
- <string name="create_dir_fail_msg">Das Verzeichnis konnte nicht erstellt werden.</string>
+ <string name="create_dir_fail_msg">Verzeichnis konnte nicht erstellt werden</string>
+ <string name="filename_forbidden_characters">Verbotene Zeichen: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Bitte warte einen Moment.</string>
<string name="filedisplay_unexpected_bad_get_content">Ein unerwartetes Problem ist aufgetreten. Bitte versuche, die Datei in einer anderen App zu öffnen</string>
<string name="filedisplay_no_file_selected">Es wurde keine Datei ausgewählt.</string>
- <string name="ssl_validator_title">Warnung</string>
+ <string name="activity_chooser_title">Link senden an ...</string>
+ <string name="oauth_check_onoff">Anmelden mit oAuth2</string>
+ <string name="oauth_login_connection">Verbinde mit dem oAuth2-Server.</string>
<string name="ssl_validator_header">Die Identität der Website konnte nicht überprüft werden</string>
<string name="ssl_validator_reason_cert_not_trusted">- Das Zertifikat des Servers ist nicht vertrauenswürdig</string>
<string name="ssl_validator_reason_cert_expired">- Das Zertifikat des Servers ist abgelaufen</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- Das Gültigkeitsdatum des Serverzertifikats liegt in der Zukunft</string>
<string name="ssl_validator_reason_hostname_not_verified">- Die Adresse stimmt nicht mit dem im Zertifikat angegebenen Hostnamen überein</string>
- <string name="ssl_validator_certificate_not_available">Das Zertifikat des Servers konnte nicht abgerufen werden</string>
<string name="ssl_validator_question">Möchtest Du diesem Zertifikat trotzdem vertrauen?</string>
<string name="ssl_validator_not_saved">Das Zertifikat konnte nicht gespeichert werden</string>
<string name="ssl_validator_btn_details_see">Details</string>
<string name="ssl_validator_label_validity_to">Bis:</string>
<string name="ssl_validator_label_signature">Signatur:</string>
<string name="ssl_validator_label_signature_algorithm">Algorithmus:</string>
- <string name="text_placeholder">Dies ist ein Platzhalter</string>
+ <string name="ssl_validator_null_cert">Das Zertifikat konnte nicht gezeigt werden.</string>
+ <string name="ssl_validator_no_info_about_error">- Keine Informationen über den Fehler</string>
+ <string name="placeholder_sentence">Dies ist ein Platzhalter</string>
+ <string name="placeholder_filename">platzhalter.txt</string>
+ <string name="placeholder_filetype">PNG-Bild</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">18.5.2012 12:23</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Fotos nur über WiFi hochladen</string>
<string name="instant_upload_path">/SofortUpload</string>
<string name="conflict_title">Konflikt beim Update</string>
<string name="conflict_keep_both">Beide behalten</string>
<string name="conflict_overwrite">Überschreiben</string>
<string name="conflict_dont_upload">Nicht hochladen</string>
-
- <string name="actionbar_failed_instant_upload">Fehlgeschlagene Sofortuploads</string>
- <string name="failed_upload_headline_text">Fehlgeschlagene Sofortuploads</string>
- <string name="failed_upload_headline_hint">Auflistung aller fehlgeschlagenen Softuploads</string>
- <string name="failed_upload_all_cb">Alle auswählen</string>
- <string name="failed_upload_headline_retryall_btn">Ausgewählte wiederholen</string>
- <string name="failed_upload_headline_delete_all_btn">Ausgewählte löschen </string>
- <string name="failed_upload_retry_text">Versuche ausgewählte erneut hochzuladen</string>
+ <string name="preview_image_description">Bildvorschau</string>
+ <string name="preview_image_error_unknown_format">Dieses Bild kann nicht angezeigt werden</string>
+ <string name="error__upload__local_file_not_copied">%1$s konnte nicht in den lokalen %2$s Ordner kopiert werden</string>
+ <string name="actionbar_failed_instant_upload">Sofort-Upload fehlgeschlagen</string>
+ <string name="failed_upload_headline_text">SofortUpload fehlgeschlagen</string>
+ <string name="failed_upload_headline_hint">Übersicht aller fehlgeschlagenen SofortUploads</string>
+ <string name="failed_upload_all_cb">Alles auswählen</string>
+ <string name="failed_upload_headline_retryall_btn">Alles auswählen erneut versuchen</string>
+ <string name="failed_upload_headline_delete_all_btn">Auswahl aus der Upload Warteschlange entfernen</string>
+ <string name="failed_upload_retry_text">Hochladen des Bildes erneut versuchen:</string>
<string name="failed_upload_load_more_images">Weitere Bilder laden</string>
- <string name="failed_upload_retry_do_nothing_text">Upload nicht gestarted, Sie sind nicht online für ein Softupload</string>
- <string name="failed_upload_failure_text">Fehlermeldung: </string>
- <string name="failed_upload_quota_exceeded_text">Bitte überprüfen sie ihre Serverkonfiguration, möglicherweise ist ihre Upload Limit überschritten</string>
+ <string name="failed_upload_retry_do_nothing_text">Nicht durchgeführt - Nicht online für sofortigen Upload</string>
+ <string name="failed_upload_failure_text">Fehlermeldung:</string>
+ <string name="failed_upload_quota_exceeded_text">Bitte überprüfe Deine Servereinstellungen. Eventuell ist Dein Nutzungslimit überschritten.</string>
+ <string name="share_link_file_no_exist">Die Freigabe der Datei oder des Ordners ist nicht möglich. Bitte stelle sicher, dass diese existiert.</string>
+ <string name="share_link_file_error">Es ist ein Fehler beim Freigeben der Datei oder des Ordners aufgetreten.</string>
+ <string name="unshare_link_file_no_exist">Das Entfernen der Freigabe für die Datei oder den Ordner ist nicht möglich. Diese existieren nicht.</string>
+ <string name="unshare_link_file_error">Es ist ein Fehler beim Entfernen der Freigabe für diese Datei oder den Ordner aufgetreten.</string>
+ <string name="activity_chooser_send_file_title">Senden</string>
+ <string name="copy_link">Link kopieren</string>
+ <string name="clipboard_text_copied">In die Zwischenablage kopiert</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Συνθηματικό:</string>
- <string name="main_login">Όνομα Χρήστη:</string>
- <string name="main_button_login">Σύνδεση</string>
- <string name="main_welcome">Καλώς ήλθατε στο ownCloud</string>
- <string name="main_files">Αρχεία</string>
- <string name="main_music">Μουσική</string>
- <string name="main_contacts">Επαφές</string>
- <string name="main_calendar">Ημερολόγιο</string>
- <string name="main_bookmarks">Σελιδοδείκτες</string>
- <string name="main_settings">Ρυθμίσεις</string>
- <string name="main_tit_accsetup">Ρύθμιση Λογαριασμού</string>
- <string name="main_wrn_accsetup">Δεν υπάρχουν λογαριασμοί ownCloud στη συσκευή σας. Για να χρησιμοποιήσετε την εφαρμογή, πρέπει να δημιουργήσετε ένα.</string>
- <string name="about_message">ownCloud εφαρμογή για Android\n\nέκδοση: %1$s</string>
- <string name="actionbar_sync">Ανανέωση </string>
+ <string name="about_android">%1$s Εφαρμογή για Android</string>
+ <string name="about_version">έκδοση %1$s</string>
+ <string name="actionbar_sync">Ανανέωση λογαριασμού</string>
<string name="actionbar_upload">Μεταφόρτωση</string>
<string name="actionbar_upload_from_apps">Περιεχόμενο από άλλες εφαρμογές</string>
<string name="actionbar_upload_files">Αρχεία</string>
- <string name="actionbar_mkdir">Δημιουργία καταλόγου</string>
- <string name="actionbar_search">Αναζήτηση</string>
+ <string name="actionbar_open_with">Άνοιγμα με</string>
+ <string name="actionbar_mkdir">Νέος φάκελος</string>
<string name="actionbar_settings">Ρυθμίσεις</string>
+ <string name="actionbar_see_details">Λεπτομέρειες</string>
+ <string name="actionbar_send_file">Αποστολή</string>
<string name="prefs_category_general">Γενικά</string>
- <string name="prefs_category_trackmydevice">Παρακολούθηση συσκευής</string>
- <string name="prefs_add_session">Προσθήκη νέας συνεδρίας</string>
- <string name="prefs_create_img_thumbnails">Δημιουργία μικρογραφιών εικόνων</string>
- <string name="prefs_select_oc_account">Επιλογή λογαριασμού</string>
- <string name="prefs_summary_select_oc_account">Επιλέξτε, ποιόν από τους λογαρισμούς σας θα χρησιμοποιήσει η εφαρμογή.</string>
- <string name="prefs_trackmydevice">Παρακολούθηση συσκευής</string>
- <string name="prefs_trackmydevice_summary_off">Επιτρέψτε στο ownCloud να ανιχνεύει την τοποθεσία στης συσκευής σας</string>
- <string name="prefs_trackmydevice_summary_on">Το ownCloud ανιχνεύει την τοποθεσία αυτής της συσκευής</string>
- <string name="prefs_trackmydevice_interval">Περίοδος ανανέωσης</string>
- <string name="prefs_trackmydevice_interval_summary">Ενημέρωση κάθε %1$s λεπτά</string>
+ <string name="prefs_category_more">Περισσότερα</string>
<string name="prefs_accounts">Λογαριασμοί</string>
<string name="prefs_manage_accounts">Διαχείριση λογαριασμών</string>
- <string name="prefs_pincode">PIN της εφαρμογής ownCloud</string>
- <string name="prefs_pincode_summary">Προστατέψτε την ownCloud εφαρμογή</string>
+ <string name="prefs_pincode">PIN της εφαρμογής</string>
+ <string name="prefs_pincode_summary">Προστατέψτε την εφαρμογή</string>
<string name="prefs_instant_upload">Ενεργοποιήστε την άμεση μεταφόρτωση</string>
<string name="prefs_instant_upload_summary">Άμεση μεταφόρτωση των φωτογραφιών που τραβάει η φωτογρ. μηχανή</string>
- <string name="auth_host_url">ownCloud URL</string>
+ <string name="prefs_log_title">Ενεργοποίηση Καταγραφής Ιστορικού</string>
+ <string name="prefs_log_summary">Χρησιμοποιείται για την καταγραφή προβλημάτων</string>
+ <string name="prefs_log_title_history">Ιστορικό Καταγραφής</string>
+ <string name="prefs_log_summary_history">Εδώ μπορείτε να δείτε το καταγεγραμμένο ιστορικό</string>
+ <string name="prefs_log_delete_history_button">Διαγραφή Ιστορικού</string>
+ <string name="prefs_help">Βοήθεια</string>
+ <string name="prefs_recommend">Προτείνετε σε ένα φίλο</string>
+ <string name="prefs_feedback">Σχόλια </string>
+ <string name="prefs_imprint">Αποτύπωμα</string>
+ <string name="recommend_subject">Δοκιμάστε %1$s στο κινητό σας!</string>
+ <string name="auth_check_server">Έλεγχος Διακομιστή</string>
+ <string name="auth_host_url">Διεύθυνση εξυπηρέτη https://…</string>
<string name="auth_username">Όνομα χρήστη</string>
<string name="auth_password">Συνθηματικό</string>
- <string name="auth_register">Είμαι νέος στο ownCloud</string>
- <string name="new_session_uri_error">Εσφαλμένη διεύθυνση URL</string>
- <string name="new_session_session_name_error">Εσφαλμένο όνομα συνεδρίας</string>
+ <string name="auth_register">Νέος στο %1$s;</string>
<string name="sync_string_files">Αρχεία</string>
- <string name="uploader_no_file_selected">Δεν επιλέχθηκε αρχείο για μεταφόρτωση</string>
- <string name="setup_hint_username">Όνομα χρήστη</string>
- <string name="setup_hint_password">Συνθηματικό</string>
- <string name="setup_hint_address">Διεύθυνση ιστοσελίδας</string>
- <string name="setup_hint_show_password">Προβολή κωδικού;</string>
- <string name="setup_title">Σύνδεση στο ownCloud σας</string>
<string name="setup_btn_connect">Σύνδεση</string>
<string name="uploader_btn_upload_text">Μεταφόρτωση</string>
<string name="uploader_wrn_no_account_title">Δεν βρέθηκε λογαριασμός</string>
- <string name="uploader_wrn_no_account_text">Δεν υπάρχουν λογαριασμοί ownCloud στη συσκευή σας. Παρακαλώ ρυθμίστε πρώτα ένα λογαριασμό.</string>
+ <string name="uploader_wrn_no_account_text">Δεν υπάρχουν λογαριασμοί %1$s στη συσκευή σας. Παρακαλώ ρυθμίστε πρώτα ένα λογαριασμό.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Ρύθμιση</string>
<string name="uploader_wrn_no_account_quit_btn_text">Κλείσιμο</string>
<string name="uploader_wrn_no_content_title">Δεν υπάρχει περιεχόμενο για να μεταφορτώσετε</string>
<string name="uploader_wrn_no_content_text">Δεν ελήφθη περιεχόμενο. Δεν υπάρχει τίποτα να μεταφορτώσετε.</string>
- <string name="uploader_error_forbidden_content">Το ownCloud δεν επιτρέπεται να έχει πρόσβαση στο κοινόχρηστο περιεχόμενο</string>
+ <string name="uploader_error_forbidden_content">Το %1$s δεν επιτρέπεται να έχει πρόσβαση στο κοινόχρηστο περιεχόμενο</string>
<string name="uploader_info_uploading">Μεταφόρτωση</string>
- <string name="uploader_btn_create_dir_text">Δημιουργία καταλόγου για μεταφόρτωση</string>
<string name="file_list_empty">Δεν υπάρχουν αρχεία σε αυτόν τον φάκελο.\nΝέα αρχεία μπορούν να προστεθούν με την επιλογή \"Μεταφόρτωση\" του μενού.</string>
<string name="filedetails_select_file">Αγγίξτε κάποιο αρχείο για να προβάλετε περισσότερες πληροφορίες.</string>
<string name="filedetails_size">Μέγεθος:</string>
<string name="filedetails_created">Δημιουργήθηκε:</string>
<string name="filedetails_modified">Τροποποιήθηκε:</string>
<string name="filedetails_download">Λήψη</string>
- <string name="filedetails_sync_file">Ανανέωση </string>
- <string name="filedetails_redownload">Κατέβασμα ξανά</string>
- <string name="filedetails_open">Άνοιγμα</string>
+ <string name="filedetails_sync_file">Ανανέωση αρχείου</string>
<string name="filedetails_renamed_in_upload_msg">Το αρχείο μετονομάστηκε σε %1$s κατά την μεταφόρτωση</string>
+ <string name="action_share_file">Διαμοιρασμός συνδέσμου</string>
+ <string name="action_unshare_file">Ακύρωση διαμοιρασμού συνδέσμου</string>
<string name="common_yes">Ναι</string>
<string name="common_no">Όχι</string>
<string name="common_ok">ΟΚ</string>
<string name="common_cancel_upload">Ακύρωση αποστολής</string>
<string name="common_cancel">Άκυρο</string>
<string name="common_save_exit">Αποθήκευση & Έξοδος</string>
- <string name="common_exit">Κλείσιμο</string>
<string name="common_error">Σφάλμα</string>
+ <string name="common_loading">Φόρτωση ...</string>
+ <string name="common_error_unknown">Άγνωστο σφάλμα</string>
<string name="about_title">Σχετικά</string>
+ <string name="change_password">Αλλαγή συνθηματικού</string>
<string name="delete_account">Διαγραφή λογαριασμού</string>
<string name="create_account">Δημιουργία λογαριασμού</string>
<string name="upload_chooser_title">Μεταφόρτωση από ...</string>
- <string name="uploader_info_dirname">Όνομα καταλόγου</string>
+ <string name="uploader_info_dirname">Όνομα φακέλου</string>
<string name="uploader_upload_in_progress_ticker">Μεταφορτώνεται ...</string>
<string name="uploader_upload_in_progress_content">%1$d%% Μεταφορτώνονται %2$s</string>
<string name="uploader_upload_succeeded_ticker">Η μεταφόρτωση ολοκληρώθηκε επιτυχώς</string>
<string name="uploader_upload_succeeded_content_single">Το %1$s μεταφορτώθηκε με επιτυχία</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d αρχεία μεταφορτώθηκαν με επιτυχία</string>
<string name="uploader_upload_failed_ticker">Η μεταφόρτωση απέτυχε</string>
<string name="uploader_upload_failed_content_single">Η μεταφόρτωση του %1$s δεν ήταν δυνατόν να ολοκληρωθεί</string>
- <string name="uploader_upload_failed_content_multiple">Αποτυχία μεταφόρτωσης: %1$d/%2$d αρχεία μεταφορτώθηκαν</string>
<string name="downloader_download_in_progress_ticker">Κατέβασμα ...</string>
<string name="downloader_download_in_progress_content">%1$d%% Λαμβάνονται %2$s</string>
<string name="downloader_download_succeeded_ticker">Το κατέβασμα ολοκληρώθηκε επιτυχώς</string>
<string name="downloader_download_succeeded_content">%1$s αρχεία λήφθηκαν με επιτυχία</string>
<string name="downloader_download_failed_ticker">Το κατέβασμα απέτυχε</string>
<string name="downloader_download_failed_content">Η λήψη του %1$s δεν μπόρεσε να ολοκληρωθεί με επιτυχία</string>
+ <string name="downloader_not_downloaded_yet">Δεν έχει κατέβει ακόμα</string>
<string name="common_choose_account">Επιλογή λογαριασμού</string>
- <string name="sync_string_contacts">Επαφές</string>
<string name="sync_fail_ticker">Ο συγχρονισμός απέτυχε</string>
<string name="sync_fail_content">Ο συγχρονισμός του %1$s δεν μπόρεσε να ολοκληρωθεί</string>
+ <string name="sync_fail_content_unauthorized">Λάθος κωδικός για %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Βρέθηκαν διενέξεις</string>
<string name="sync_conflicts_in_favourites_content">%1$d αρχεία σε αναμονή συγχρονισμού, δεν μπόρεσαν να συγχρονιστούν</string>
<string name="sync_fail_in_favourites_ticker">Τα αρχεία σε αναμονή συγχρονισμού απέτυχαν</string>
<string name="sync_fail_in_favourites_content">Τα περιεχόμενα των %1$d αρχείων δεν μπόρεσαν να συγχρονιστούν (%2$d διενέξεις)</string>
- <string name="use_ssl">Χρήση ασφαλούς σύνδεσης</string>
- <string name="location_no_provider">Το ownCloud δεν μπορεί να ανιχνεύσει την τοποθεσία της συσκευής. Παρακαλώ ελέγξτε τις ρυθμίσεις σύνδεσης. </string>
+ <string name="sync_foreign_files_forgotten_ticker">Ορισμένα τοπικά αρχεία ξεχάστηκαν</string>
+ <string name="sync_current_folder_was_removed">Ο φάκελος %1$s δεν υπάρχει πια</string>
+ <string name="foreign_files_move">Μετακινηση ολων</string>
+ <string name="foreign_files_success">Ολα τα αρχεια μετακινηθηκαν</string>
+ <string name="foreign_files_fail">Μερικα αρχεια δεν μπορεσαν να μετακινηθουν</string>
+ <string name="foreign_files_local_text">Τοπικα: %1$s</string>
+ <string name="foreign_files_remote_text">Remote: %1$s</string>
+ <string name="upload_query_move_foreign_files">Δεν υπαρχει αρκετος χωρος για να αντιγραφθουν τα επιλεγμενα αρχεια στον χωρο αποθηκευσης %1$s. Θελετε να μετακινηθουν μερικα?</string>
<string name="pincode_enter_pin_code">Παρακαλώ, εισάγετε το PIN σας</string>
- <string name="pincode_enter_new_pin_code">Παρακαλώ, εισάγετε το νέο PIN σας</string>
- <string name="pincode_configure_your_pin">Εισάγετε το PIN της εφαρμογής ownCloud</string>
+ <string name="pincode_configure_your_pin">Εισάγετε το PIN της εφαρμογής</string>
<string name="pincode_configure_your_pin_explanation">Το PIN θα ζητείται κάθε φορά στην εκκίνηση </string>
- <string name="pincode_reenter_your_pincode">Παρακαλώ επαναεισάγετε το PIN της εφαρμογής ownCloud</string>
- <string name="pincode_remove_your_pincode">Αφαιρέστε τον PIN της εφαρμογής ownCloud</string>
- <string name="pincode_mismatch">Δεν ταιριάζουν τα PIN της εφαρμογής ownCloud</string>
- <string name="pincode_wrong">Εσφαλμένο PIN της εφαρμογής ownCloud</string>
- <string name="pincode_removed">Αφαιρέθηκε το PIN της εφαρμογής ownCloud</string>
- <string name="pincode_stored">Το PIN της εφαρμογής ownCloud αποθηκεύτηκε</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 Λεπτά</item>
- <item>30 Λεπτά</item>
- <item>60 Λεπτά</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_reenter_your_pincode">Παρακαλώ επαναεισάγετε το PIN της εφαρμογής</string>
+ <string name="pincode_remove_your_pincode">Αφαιρέστε τον PIN της εφαρμογής</string>
+ <string name="pincode_mismatch">Δεν ταιριάζουν τα PIN της εφαρμογής </string>
+ <string name="pincode_wrong">Εσφαλμένο PIN της εφαρμογής</string>
+ <string name="pincode_removed">Αφαιρέθηκε το PIN της εφαρμογής</string>
+ <string name="pincode_stored">Το PIN της εφαρμογής αποθηκεύτηκε</string>
+ <string name="media_notif_ticker">%1$s αναπαραγωγή μουσικής</string>
+ <string name="media_state_playing">%1$s (αναπαραγωγή)</string>
+ <string name="media_state_loading">%1$s (φόρτωση)</string>
+ <string name="media_event_done">%1$s αναπαραγωγή τελείωσε</string>
+ <string name="media_err_nothing_to_play">Δεν βρέθηκε αρχείο πολυμέσων</string>
+ <string name="media_err_no_account">Δεν δόθηκε λογαριασμός</string>
+ <string name="media_err_not_in_owncloud">Το αρχείο δεν βρίσκεται σε έγκυρο λογαριασμό</string>
+ <string name="media_err_unsupported">Αυτή η μορφή κωδικοποιήσης πολυμέσων δεν υποστηρίζεται</string>
+ <string name="media_err_io">Το αρχείο πολυμέσων δεν μπόρεσε να διαβαστεί</string>
+ <string name="media_err_malformed">Το αρχείο πολυμέσων δεν είναι σωστά κοδικοποιημένο</string>
+ <string name="media_err_timeout">Λήξη χρόνου κατά την προσπάθεια αναπαραγωγής</string>
+ <string name="media_err_invalid_progressive_playback">Το αρχείο πολυμέσων δεν μπορεί να μεταδοθεί</string>
+ <string name="media_err_unknown">Το αρχείο πολυμέσων δεν μπορεί να αναπαραχθεί με την παρεχόμενη εφαρμογή αναπαραγωγής πολυμέσων</string>
+ <string name="media_err_security_ex">Σφάλμα ασφαλείας κατά την προσπάθεια αναπαραγωγής του %1$s</string>
+ <string name="media_err_io_ex">Σφάλμα εισόδου κατά την προσπάθεια αναπαραγωγής του %1$s</string>
+ <string name="media_err_unexpected">Απροσδόκτο σφάλμα κατά την προσπάθεια αναπαραγωγής του %1$s</string>
+ <string name="media_rewind_description">Κουμπί επαναφοράς</string>
+ <string name="media_play_pause_description">Κουμπί αναπαραγωγής ή παύσης</string>
+ <string name="media_forward_description">Κουμπί προώθησης</string>
<string name="auth_trying_to_login">Προσπάθεια σύνδεσης...</string>
<string name="auth_no_net_conn_title">Δεν υπάρχει σύνδεση στο δίκτυο</string>
- <string name="auth_no_net_conn_message">Δεν ανιχνεύθηκε σύνδεση δικτύου, ελέγξτε την σύνδεση στο Internet και προσπαθήστε ξανά.</string>
- <string name="auth_connect_anyway">Συνδεθείτε παρ\' αυτά</string>
<string name="auth_nossl_plain_ok_title">Μη διαθέσιμη ασφαλής σύνδεση.</string>
- <string name="auth_nossl_plain_ok_message">Αδυναμία καθιέρωσης ασφαλούς σύνδεσης με τον διακομιστή. Παρόλο που είναι διαθέσιμη μη ασφαλή σύνδεση. Μπορείτε να συνεχίσετε ή να ακυρώσετε.</string>
<string name="auth_connection_established">Επετεύχθη σύνδεση</string>
<string name="auth_testing_connection">Έλεγχος σύνδεσης...</string>
- <string name="auth_not_configured_title">Λανθασμένες ρυθμίσεις ownCloud</string>
- <string name="auth_not_configured_message">Φαίνεται ότι το ownCloud δεν είναι σωστά ρυθμισμένο. Παρακαλώ επικοινωνήστε με τον διαχειριστή σας, για περισσότερες πληροφορίες. </string>
+ <string name="auth_not_configured_title">Λανθασμένες ρυθμίσεις </string>
+ <string name="auth_account_not_new">Ένας λογαριασμός για τον ίδιο χρήστη και διακομιστή υπάρχει ήδη στη συσκευή</string>
+ <string name="auth_account_not_the_same">Ο χρήστης που εισάγατε δεν ταιριάζει με το χρήστη αυτού του λογαριασμού</string>
<string name="auth_unknown_error_title">Παρουσιάστηκε άγνωστο σφάλμα</string>
- <string name="auth_unknown_error_message">Παρουσιάστηκε άγνωστο σφάλμα. Παρακαλώ επικοινωνήστε με τους προγραμματιστές και συμπεριλάβετε το ιστορικό από την συσκευή σας.</string>
<string name="auth_unknown_host_title">Δεν βρέθηκε υπολογιστής</string>
- <string name="auth_unknown_host_message">Δεν βρέθηκε ο ζητούμενος υπολογιστής. Παρακαλώ ελέγξτε το όνομα του υπολογιστή και την διαθεσιμότητα του εξυπηρετητή και προσπαθήστε πάλι. </string>
- <string name="auth_incorrect_path_title">Δεν βρέθηκε στιγμιότυπο ownCloud</string>
- <string name="auth_incorrect_path_message">Η εφαρμογή δεν βρήκε να υπάρχει ownCloud στον δοσμένο μονοπάτι. Παρακαλώ ελέγξτε το μονοπάτι και ξαναπροσπαθήστε.</string>
+ <string name="auth_incorrect_path_title">Δεν βρέθηκε στιγμιότυπο server σας</string>
<string name="auth_timeout_title">Ο εξυπηρετητής αργεί πολύ να απαντήσει</string>
<string name="auth_incorrect_address_title">Κακώς διατυπωμένο URL</string>
<string name="auth_ssl_general_error_title">Η αρχικοποίηση του SLL απέτυχε</string>
- <string name="auth_ssl_unverified_server_title">Î\9cη εÏ\80ιβεβαιÏ\89μÎνη Ï\84αÏ\85Ï\84Ï\8cÏ\84ηÏ\84α SSL Ï\84οÏ\85 εξÏ\85Ï\80ηÏ\81εÏ\84ητή</string>
- <string name="auth_bad_oc_version_title">Μη αναγνωρίσιμη έκδοση διακομιστή ownCloud</string>
+ <string name="auth_ssl_unverified_server_title">Î\91δÏ\85ναμία εÏ\80ιβεβαίÏ\89Ï\83ηÏ\82 Ï\84ην Ï\84αÏ\85Ï\84Ï\8cÏ\84ηÏ\84α SSL Ï\84οÏ\85 διακομιÏ\83τή</string>
+ <string name="auth_bad_oc_version_title">Μη αναγνωρίσιμη έκδοση διακομιστή server σας</string>
<string name="auth_wrong_connection_title">Δεν ήταν δυνατή η σύνδεση</string>
<string name="auth_secure_connection">Επιτεύχθηκε ασφαλής σύνδεση</string>
- <string name="auth_login_details">Λεπτομέρειες σύνδεσης</string>
- <string name="auth_unauthorized">Μη έγκυρο συνθηματικό εισόδου</string>
- <string name="auth_not_found">Δόθηκε εσφαλμένη διαδρομή</string>
- <string name="auth_internal">Εσωτερικό σφάλμα διακομιστή, κωδικός %1$d</string>
- <string name="crashlog_message">Η εφαρμογή τερματίστηκε ξαφνικά. Θα θέλατε να υποβάλετε αναφορά σφάλματος;</string>
- <string name="crashlog_send_report">Αποστολή αναφοράς</string>
- <string name="crashlog_dont_send_report">Να μην αποσταλεί αναφορά</string>
- <string name="extensions_avail_title">Διαθέσιμες επεκτάσεις!</string>
- <string name="extensions_avail_message">Φαίνεται ότι το ownCloud σας υποστηρίζει προηγμένες επεκτάσεις. Θα θέλατε να δείτε τις διαθέσιμες επεκτάσεις για το android;</string>
+ <string name="auth_unauthorized">Λάθος όνομα χρήστη ή κωδικός</string>
+ <string name="auth_oauth_error">Η πιστοποίηση απέτυχε</string>
+ <string name="auth_oauth_error_access_denied">Ο διακομιστής πιστοποίησης αρνήθηκε την πρόσβαση</string>
+ <string name="auth_wtf_reenter_URL">Απρόοπτη κατάσταση - παρακαλώ εισάγετε τη διεύθυνση URL του διακομιστή ξανά</string>
+ <string name="auth_expired_oauth_token_toast">Η εξουσιοδότησή σας έληξε. Παρακαλώ εξουσιοδοτείστε ξανά</string>
+ <string name="auth_expired_basic_auth_toast">Παρακαλώ είσάγετε τον τρέχοντα κωδικό</string>
+ <string name="auth_expired_saml_sso_token_toast">Η συνεδρία σας έληξε. Παρακαλώ συνδεθείτε ξανά</string>
+ <string name="auth_connecting_auth_server">Σύνδεση με το διακομιστή πιστοποίησης σε εξέλιξη...</string>
+ <string name="auth_unsupported_auth_method">Ο διακομιστής δεν υποστηρίζει αυτή τη μέθοδο πιστοποίησης</string>
+ <string name="auth_unsupported_multiaccount">Ο %1$s δεν υποστηρίζει πολλαπλούς λογαριασμούς</string>
+ <string name="auth_can_not_auth_against_server">Δεν είναι δυνατός ο έλεγχος ταυτότητας με αυτόν τον διακομιστή</string>
<string name="fd_keep_in_sync">Διατήρηση αρχείου ενημερωμένo</string>
- <string name="common_share">Διαμοιρασμός</string>
<string name="common_rename">Μετονομασία</string>
<string name="common_remove">Αφαίρεση</string>
<string name="confirmation_remove_alert">Θέλετε να αφαιρέσετε το %1$s ;</string>
<string name="rename_server_fail_msg">Η μετονομασία δεν ήταν επιτυχής</string>
<string name="sync_file_fail_msg">Αδυναμία ελέγχου του απομακρυσμένου αρχείου</string>
<string name="sync_file_nothing_to_do_msg">Τα περιεχόμενα του αρχείου έχουν ήδη συγχρονιστεί</string>
- <string name="create_dir_fail_msg">Ο κατάλογος δεν ήταν δυνατόν να δημιουργηθεί</string>
+ <string name="filename_forbidden_characters">Μη-επιτρεπόμενοι χαρακτήρες: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Παρακαλούμε περιμένετε</string>
<string name="filedisplay_unexpected_bad_get_content">Απροσδόκητο σφάλμα, δοκιμάστε με άλλη εφαρμογή</string>
<string name="filedisplay_no_file_selected">Δεν επιλέχθηκαν αρχεία </string>
- <string name="ssl_validator_title">Προειδοποίηση</string>
+ <string name="activity_chooser_title">Αποστολή συνδέσμου σε ...</string>
+ <string name="oauth_check_onoff">Σύνδεση με oAuth2</string>
+ <string name="oauth_login_connection">Σύνδεση με το διακομιστή oAuth2 σε εξέλιξη...</string>
<string name="ssl_validator_header">Η ταυτότητα της σελίδας δεν μπορεί να εγκριθεί</string>
<string name="ssl_validator_reason_cert_not_trusted">- Το πιστοποιητικό του διακομιστή δεν είναι αξιόπιστο</string>
<string name="ssl_validator_reason_cert_expired">- Το πιστοποιητικό του διακομιστή έχει λήξει</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- Το πιστοποιητικό του διακομιστή είναι πολύ νέο</string>
<string name="ssl_validator_reason_hostname_not_verified">- Η διεύθυνση URL δεν ταιριάζει με το όνομα στο πιστοποιητικό</string>
- <string name="ssl_validator_certificate_not_available">Το πιστοποιητικό του διακομιστή δεν μπόρεσε να ανακτηθεί</string>
<string name="ssl_validator_question">Θέλετε να θεωρείται έμπιστο το πιστοποιητικό αυτό ούτως ή άλλως;</string>
<string name="ssl_validator_not_saved">Το πιστοποιητικό δεν ήταν δυνατόν να αποθηκευτεί</string>
<string name="ssl_validator_btn_details_see">Λεπτομέρειες</string>
<string name="ssl_validator_label_validity_to">Μέχρι</string>
<string name="ssl_validator_label_signature">Υπογραφή:</string>
<string name="ssl_validator_label_signature_algorithm">Αλγόριθμος:</string>
- <string name="text_placeholder">Αυτό είναι ένα σημείο κράτησης θέσης</string>
+ <string name="ssl_validator_null_cert">Δεν μπορεί να εμφανιστεί το πιστοποιητικό.</string>
+ <string name="ssl_validator_no_info_about_error">- Καμία πληροφορία σχετικά με το σφάλμα</string>
+ <string name="placeholder_sentence">Αυτό είναι ένα σημείο κράτησης θέσης</string>
+ <string name="placeholder_filename">placeholder.txt</string>
+ <string name="placeholder_filetype">Εικόνα PNG</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Μεταφόρτωση εικόνων μόνο μέσω WiFi</string>
<string name="instant_upload_path">/InstantUpload</string>
<string name="conflict_title">Ενημέρωση σύγκρουσης</string>
<string name="conflict_keep_both">Διατήρηση και των δύο</string>
<string name="conflict_overwrite">Αντικατάσταση</string>
<string name="conflict_dont_upload">Δεν μεταφορτώθηκε</string>
+ <string name="preview_image_description">Προεπισκόπηση εικόνας</string>
+ <string name="preview_image_error_unknown_format">Αυτή η εικόνε δεν μπόρεσε να προβληθεί</string>
+ <string name="actionbar_failed_instant_upload">Αποτυχημένη στιγμιαία φόρτωση</string>
+ <string name="failed_upload_headline_text">Αποτυχημένες στιγμιαίες φορτώσεις</string>
+ <string name="failed_upload_headline_hint">Σύνοψη όλων των αποτυχημένων φορτώσεων</string>
+ <string name="failed_upload_all_cb">επιλογή όλων</string>
+ <string name="failed_upload_headline_retryall_btn">επανάληψη για όλα τα επιλεγμένα</string>
+ <string name="failed_upload_headline_delete_all_btn">διαγραφή όλων των επιλεγμένων από τη λίστα προς μεταφόρτωση</string>
+ <string name="failed_upload_retry_text">επανάληψη προσπάθειας μεταφόρτωσης της εικόνας:</string>
+ <string name="failed_upload_load_more_images">Φόρτωση περισσότερων εικόνων</string>
+ <string name="failed_upload_retry_do_nothing_text">μην κάνετε τίποτε, δεν είστε συνδεμένος για άμεση μεταφόρτωση</string>
+ <string name="failed_upload_failure_text">Μήνυμα Αποτυχίας:</string>
+ <string name="failed_upload_quota_exceeded_text">Παρακαλώ ελέγξτε τις ρυθμίσεις του διακομιστή σας, ίσως έχετε υπερβεί τη διαθέσιμη μερίδα σας.</string>
+ <string name="share_link_file_no_exist">Αδυναμία διαμοιρασμού αυτού του αρχείου ή φακέλου. Παρακαλώ βεβαιωθείτε ότι υπάρχει</string>
+ <string name="share_link_file_error">Ένα σφάλμα προέκυψε κατά την προσπάθεια διαμοιρασμού αυτού του αρχείου ή φακέλου</string>
+ <string name="unshare_link_file_no_exist">Ήταν αδύνατη η ακύρωση διαμοιρασμού αυτού του αρχείου ή φακέλου. Δεν υπάρχει.</string>
+ <string name="unshare_link_file_error">Ένα σφάλμα προέκυψε κατά τη διάρκεια ακύρωσης διαμοιρασμού αυτού του αρχείου ή φακέλου</string>
+ <string name="activity_chooser_send_file_title">Αποστολή</string>
+ <string name="copy_link">Αντιγραφή συνδέσμου</string>
+ <string name="clipboard_text_copied">Αντιγραφθηκε στο clipboard</string>
</resources>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="about_android">%1$s Android App</string>
+ <string name="about_version">version %1$s</string>
+ <string name="actionbar_sync">Refresh account</string>
+ <string name="actionbar_upload">Upload</string>
+ <string name="actionbar_upload_from_apps">Content from other apps</string>
+ <string name="actionbar_upload_files">Files</string>
+ <string name="actionbar_open_with">Open with</string>
+ <string name="actionbar_mkdir">New folder</string>
+ <string name="actionbar_settings">Settings</string>
+ <string name="actionbar_see_details">Details</string>
+ <string name="actionbar_send_file">Send</string>
+ <string name="prefs_category_general">General</string>
+ <string name="prefs_category_more">More</string>
+ <string name="prefs_accounts">Accounts</string>
+ <string name="prefs_manage_accounts">Manage Accounts</string>
+ <string name="prefs_pincode">App PIN</string>
+ <string name="prefs_pincode_summary">Protect your client</string>
+ <string name="prefs_instant_upload">Enable instant uploads</string>
+ <string name="prefs_instant_upload_summary">Instantly upload photos taken by camera</string>
+ <string name="prefs_log_title">Enable Logging</string>
+ <string name="prefs_log_summary">This is used to log problems</string>
+ <string name="prefs_log_title_history">Logging History</string>
+ <string name="prefs_log_summary_history">This shows the recorded logs</string>
+ <string name="prefs_log_delete_history_button">Delete History</string>
+ <string name="prefs_help">Help</string>
+ <string name="prefs_recommend">Recommend to a friend</string>
+ <string name="prefs_feedback">Feedback</string>
+ <string name="prefs_imprint">Imprint</string>
+ <string name="recommend_subject">Try %1$s on your smartphone!</string>
+ <string name="auth_check_server">Check Server</string>
+ <string name="auth_host_url">Server address https://…</string>
+ <string name="auth_username">Username</string>
+ <string name="auth_password">Password</string>
+ <string name="auth_register">New to %1$s?</string>
+ <string name="sync_string_files">Files</string>
+ <string name="setup_btn_connect">Connect</string>
+ <string name="uploader_btn_upload_text">Upload</string>
+ <string name="uploader_top_message">Choose upload folder:</string>
+ <string name="uploader_wrn_no_account_title">No account found</string>
+ <string name="uploader_wrn_no_account_text">There are no %1$s accounts on your device. Please setup an account first.</string>
+ <string name="uploader_wrn_no_account_setup_btn_text">Setup</string>
+ <string name="uploader_wrn_no_account_quit_btn_text">Quit</string>
+ <string name="uploader_wrn_no_content_title">No content to upload</string>
+ <string name="uploader_wrn_no_content_text">No content was received. Nothing to upload.</string>
+ <string name="uploader_error_forbidden_content">%1$s is not allowed to access the shared content</string>
+ <string name="uploader_info_uploading">Uploading</string>
+ <string name="file_list_empty">There are no files in this folder.\nNew files can be added with the \"Upload\" menu option.</string>
+ <string name="filedetails_select_file">Tap on a file to display additional information.</string>
+ <string name="filedetails_size">Size:</string>
+ <string name="filedetails_type">Type:</string>
+ <string name="filedetails_created">Created:</string>
+ <string name="filedetails_modified">Modified:</string>
+ <string name="filedetails_download">Download</string>
+ <string name="filedetails_sync_file">Refresh file</string>
+ <string name="filedetails_renamed_in_upload_msg">File was renamed to %1$s during upload</string>
+ <string name="action_share_file">Share link</string>
+ <string name="action_unshare_file">Unshare link</string>
+ <string name="common_yes">Yes</string>
+ <string name="common_no">No</string>
+ <string name="common_ok">OK</string>
+ <string name="common_cancel_download">Cancel download</string>
+ <string name="common_cancel_upload">Cancel upload</string>
+ <string name="common_cancel">Cancel</string>
+ <string name="common_save_exit">Save & Exit</string>
+ <string name="common_error">Error</string>
+ <string name="common_loading">Loading …</string>
+ <string name="common_error_unknown">Unknown error</string>
+ <string name="about_title">About</string>
+ <string name="change_password">Change password</string>
+ <string name="delete_account">Delete account</string>
+ <string name="create_account">Create account</string>
+ <string name="upload_chooser_title">Upload from …</string>
+ <string name="uploader_info_dirname">Folder name</string>
+ <string name="uploader_upload_in_progress_ticker">Uploading …</string>
+ <string name="uploader_upload_in_progress_content">%1$d%% Uploading %2$s</string>
+ <string name="uploader_upload_succeeded_ticker">Upload succeeded</string>
+ <string name="uploader_upload_succeeded_content_single">%1$s was successfully uploaded</string>
+ <string name="uploader_upload_failed_ticker">Upload failed</string>
+ <string name="uploader_upload_failed_content_single">Upload of %1$s could not be completed</string>
+ <string name="downloader_download_in_progress_ticker">Downloading …</string>
+ <string name="downloader_download_in_progress_content">%1$d%% Downloading %2$s</string>
+ <string name="downloader_download_succeeded_ticker">Download succeeded</string>
+ <string name="downloader_download_succeeded_content">%1$s was successfully downloaded</string>
+ <string name="downloader_download_failed_ticker">Download failed</string>
+ <string name="downloader_download_failed_content">Download of %1$s could not be completed</string>
+ <string name="downloader_not_downloaded_yet">Not downloaded yet</string>
+ <string name="common_choose_account">Choose account</string>
+ <string name="sync_fail_ticker">Synchronisation failed</string>
+ <string name="sync_fail_content">Synchronisation of %1$s could not be completed</string>
+ <string name="sync_fail_content_unauthorized">Invalid password for %1$s</string>
+ <string name="sync_conflicts_in_favourites_ticker">Conflicts found</string>
+ <string name="sync_conflicts_in_favourites_content">%1$d kept-in-sync files could not be synced</string>
+ <string name="sync_fail_in_favourites_ticker">Kept-in-sync files failed</string>
+ <string name="sync_fail_in_favourites_content">Contents of %1$d files could not be synced (%2$d conflicts)</string>
+ <string name="sync_foreign_files_forgotten_ticker">Some local files were forgotten</string>
+ <string name="sync_foreign_files_forgotten_content">%1$d files out of the %2$s folder could not be copied into</string>
+ <string name="sync_foreign_files_forgotten_explanation">As of version 1.3.16, files uploaded from this device are copied into the local %1$s folder to prevent data loss when a single file is synced with multiple accounts.\n\nDue to this change, all files uploaded in previous versions of this app were copied into the %2$s folder. However, an error prevented the completion of this operation during account synchronisation. You may either leave the file(s) as is and remove the link to %3$s, or move the file(s) into the %1$s folder and retain the link to %4$s.\n\nListed below are the local file(s), and the remote file(s) in %5$s they were linked to.</string>
+ <string name="sync_current_folder_was_removed">Folder %1$s does not exist anymore</string>
+ <string name="foreign_files_move">Move all</string>
+ <string name="foreign_files_success">All files were moved</string>
+ <string name="foreign_files_fail">Some files could not be moved</string>
+ <string name="foreign_files_local_text">Local: %1$s</string>
+ <string name="foreign_files_remote_text">Remote: %1$s</string>
+ <string name="upload_query_move_foreign_files">There is not enough space to copy the selected files into the %1$s folder. Would you like to move them instead? </string>
+ <string name="pincode_enter_pin_code">Please, insert your App PIN</string>
+ <string name="pincode_configure_your_pin">Enter your App PIN</string>
+ <string name="pincode_configure_your_pin_explanation">The PIN will be requested every time the app is started</string>
+ <string name="pincode_reenter_your_pincode">Please, re-enter your App PIN</string>
+ <string name="pincode_remove_your_pincode">Remove your App PIN</string>
+ <string name="pincode_mismatch">The App PINs are not the same</string>
+ <string name="pincode_wrong">Incorrect App PIN</string>
+ <string name="pincode_removed">App PIN removed</string>
+ <string name="pincode_stored">App PIN stored</string>
+ <string name="media_notif_ticker">%1$s music player</string>
+ <string name="media_state_playing">%1$s (playing)</string>
+ <string name="media_state_loading">%1$s (loading)</string>
+ <string name="media_event_done">%1$s playback finished</string>
+ <string name="media_err_nothing_to_play">No media file found</string>
+ <string name="media_err_no_account">No account provided</string>
+ <string name="media_err_not_in_owncloud">File not in a valid account</string>
+ <string name="media_err_unsupported">Unsupported media codec</string>
+ <string name="media_err_io">Media file could not be read</string>
+ <string name="media_err_malformed">Media file not correctly encoded</string>
+ <string name="media_err_timeout">Timed out whilst trying to play</string>
+ <string name="media_err_invalid_progressive_playback">Media file cannot be streamed</string>
+ <string name="media_err_unknown">Media file cannot be played with the stock media player</string>
+ <string name="media_err_security_ex">Security error trying to play %1$s</string>
+ <string name="media_err_io_ex">Input error trying to play %1$s</string>
+ <string name="media_err_unexpected">Unexpected error trying to play %1$s</string>
+ <string name="media_rewind_description">Rewind button</string>
+ <string name="media_play_pause_description">Play or pause button</string>
+ <string name="media_forward_description">Fast-forward button</string>
+ <string name="auth_trying_to_login">Trying to login…</string>
+ <string name="auth_no_net_conn_title">No network connection</string>
+ <string name="auth_nossl_plain_ok_title">Secure connection unavailable.</string>
+ <string name="auth_connection_established">Connection established</string>
+ <string name="auth_testing_connection">Testing connection…</string>
+ <string name="auth_not_configured_title">Malformed server configuration</string>
+ <string name="auth_account_not_new">An account for the same user and server already exists on the device</string>
+ <string name="auth_account_not_the_same">The entered user does not match the user of this account</string>
+ <string name="auth_unknown_error_title">Unknown error occurred!</string>
+ <string name="auth_unknown_host_title">Couldn\'t find host</string>
+ <string name="auth_incorrect_path_title">Server instance not found</string>
+ <string name="auth_timeout_title">The server took too long to respond</string>
+ <string name="auth_incorrect_address_title">Malformed URL</string>
+ <string name="auth_ssl_general_error_title">SSL initialisation failed</string>
+ <string name="auth_ssl_unverified_server_title">Couldn\'t verify SSL server\'s identity</string>
+ <string name="auth_bad_oc_version_title">Unrecognised server version</string>
+ <string name="auth_wrong_connection_title">Couldn\'t establish connection</string>
+ <string name="auth_secure_connection">Secure connection established</string>
+ <string name="auth_unauthorized">Wrong username or password</string>
+ <string name="auth_oauth_error">Unsuccessful authorisation</string>
+ <string name="auth_oauth_error_access_denied">Access denied by authorisation server</string>
+ <string name="auth_wtf_reenter_URL">Unexpected state; please, enter the server URL again</string>
+ <string name="auth_expired_oauth_token_toast">Your authorisation expired. Please, authorise again</string>
+ <string name="auth_expired_basic_auth_toast">Please enter the current password</string>
+ <string name="auth_expired_saml_sso_token_toast">Your session expired. Please connect again</string>
+ <string name="auth_connecting_auth_server">Connecting to authentication server…</string>
+ <string name="auth_unsupported_auth_method">The server does not support this authentication method</string>
+ <string name="auth_unsupported_multiaccount">%1$s does not support multiple accounts</string>
+ <string name="auth_can_not_auth_against_server">Cannot authenticate against this server</string>
+ <string name="fd_keep_in_sync">Keep file up to date</string>
+ <string name="common_rename">Rename</string>
+ <string name="common_remove">Remove</string>
+ <string name="confirmation_remove_alert">Do you really want to remove %1$s ?</string>
+ <string name="confirmation_remove_folder_alert">Do you really want to remove %1$s and its contents ?</string>
+ <string name="confirmation_remove_local">Local only</string>
+ <string name="confirmation_remove_folder_local">Local contents only</string>
+ <string name="confirmation_remove_remote">Remove from server</string>
+ <string name="confirmation_remove_remote_and_local">Remote and local</string>
+ <string name="remove_success_msg">Removal succeeded</string>
+ <string name="remove_fail_msg">Removal failed</string>
+ <string name="rename_dialog_title">Enter a new name</string>
+ <string name="rename_local_fail_msg">Local copy could not be renamed; try a different name</string>
+ <string name="rename_server_fail_msg">Rename could not be completed</string>
+ <string name="sync_file_fail_msg">Remote file could not be checked</string>
+ <string name="sync_file_nothing_to_do_msg">File contents already synchronised</string>
+ <string name="create_dir_fail_msg">Folder could not be created</string>
+ <string name="filename_forbidden_characters">Forbidden characters: / \\ < > : \" | ? *</string>
+ <string name="wait_a_moment">Wait a moment</string>
+ <string name="filedisplay_unexpected_bad_get_content">Unexpected problem; please select the file from a different app</string>
+ <string name="filedisplay_no_file_selected">No file was selected</string>
+ <string name="activity_chooser_title">Send link to …</string>
+ <string name="oauth_check_onoff">Log in with oAuth2</string>
+ <string name="oauth_login_connection">Connecting to oAuth2 server…</string>
+ <string name="ssl_validator_header">The identity of the site could not be verified</string>
+ <string name="ssl_validator_reason_cert_not_trusted">- The server certificate is not trusted</string>
+ <string name="ssl_validator_reason_cert_expired">- The server certificate expired</string>
+ <string name="ssl_validator_reason_cert_not_yet_valid">- The server certificate valid dates are in the future</string>
+ <string name="ssl_validator_reason_hostname_not_verified">- The URL does not match the hostname in the certificate</string>
+ <string name="ssl_validator_question">Do you want to trust this certificate anyway?</string>
+ <string name="ssl_validator_not_saved">The certificate could not be saved</string>
+ <string name="ssl_validator_btn_details_see">Details</string>
+ <string name="ssl_validator_btn_details_hide">Hide</string>
+ <string name="ssl_validator_label_subject">Issued to:</string>
+ <string name="ssl_validator_label_issuer">Issued by:</string>
+ <string name="ssl_validator_label_CN">Common name:</string>
+ <string name="ssl_validator_label_O">Organisation:</string>
+ <string name="ssl_validator_label_OU">Organisational unit:</string>
+ <string name="ssl_validator_label_C">Country:</string>
+ <string name="ssl_validator_label_ST">State:</string>
+ <string name="ssl_validator_label_L">Location:</string>
+ <string name="ssl_validator_label_validity">Validity:</string>
+ <string name="ssl_validator_label_validity_from">From:</string>
+ <string name="ssl_validator_label_validity_to">To:</string>
+ <string name="ssl_validator_label_signature">Signature:</string>
+ <string name="ssl_validator_label_signature_algorithm">Algorithm:</string>
+ <string name="ssl_validator_null_cert">The certificate could not be shown.</string>
+ <string name="ssl_validator_no_info_about_error">- No information about the error</string>
+ <string name="placeholder_sentence">This is a placeholder</string>
+ <string name="placeholder_filename">placeholder.txt</string>
+ <string name="placeholder_filetype">PNG Image</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
+ <string name="instant_upload_on_wifi">Upload pictures via WiFi only</string>
+ <string name="instant_upload_path">/InstantUpload</string>
+ <string name="conflict_title">Update conflict</string>
+ <string name="conflict_message">Remote file %s is not synchronised with local file. Continuing will replace content of file on server.</string>
+ <string name="conflict_keep_both">Keep both</string>
+ <string name="conflict_overwrite">Overwrite</string>
+ <string name="conflict_dont_upload">Don\'t upload</string>
+ <string name="preview_image_description">Image preview</string>
+ <string name="preview_image_error_unknown_format">This image cannot be shown</string>
+ <string name="error__upload__local_file_not_copied">%1$s could not be copied to %2$s local folder</string>
+ <string name="actionbar_failed_instant_upload">Failed InstantUpload</string>
+ <string name="failed_upload_headline_text">Failed instant uploads</string>
+ <string name="failed_upload_headline_hint">Summary of all failed instant uploads</string>
+ <string name="failed_upload_all_cb">select all</string>
+ <string name="failed_upload_headline_retryall_btn">retry all selected</string>
+ <string name="failed_upload_headline_delete_all_btn">delete all selected from uploadqueue</string>
+ <string name="failed_upload_retry_text">retry uploading the image: </string>
+ <string name="failed_upload_load_more_images">Load more Pictures</string>
+ <string name="failed_upload_retry_do_nothing_text">do nothing you are not online for instant upload</string>
+ <string name="failed_upload_failure_text">Failure Message: </string>
+ <string name="failed_upload_quota_exceeded_text">Please check your server configuration, perhaps your quota is exceeded.</string>
+ <string name="share_link_file_no_exist">Unable to share this file or folder. Please, make sure it exists</string>
+ <string name="share_link_file_error">An error occurred while trying to share this file or folder</string>
+ <string name="unshare_link_file_no_exist">Unable to unshare this file or folder. It does not exist.</string>
+ <string name="unshare_link_file_error">An error occurred while trying to unshare this file or folder</string>
+ <string name="activity_chooser_send_file_title">Send</string>
+ <string name="copy_link">Copy link</string>
+ <string name="clipboard_text_copied">Copied to clipboard</string>
+</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Pasvorto:</string>
- <string name="main_login">Uzantonomo:</string>
- <string name="main_button_login">Ensaluti</string>
- <string name="main_welcome">Bonvenon al via ownCloud</string>
- <string name="main_files">Dosieroj</string>
- <string name="main_music">Muziko</string>
- <string name="main_contacts">Kontaktoj</string>
- <string name="main_calendar">Kalendaro</string>
- <string name="main_bookmarks">Legosignoj</string>
- <string name="main_settings">Agordo</string>
- <string name="main_tit_accsetup">Agordi konton</string>
- <string name="main_wrn_accsetup">Estas neniu konto de ownCloud en via aparato. Por povi uzi ĉi tiun aplikaĵon, vi devas krei iun.</string>
- <string name="about_message">Android-aplikaĵo %1$s\n\neldono: %2$s</string>
- <string name="actionbar_sync">Refreŝigi</string>
<string name="actionbar_upload">Alŝuti dosieron</string>
<string name="actionbar_upload_from_apps">Enhavo el aliaj aplikaĵoj</string>
<string name="actionbar_upload_files">Dosieroj</string>
- <string name="actionbar_mkdir">Krei dosierujon</string>
- <string name="actionbar_search">Serĉi</string>
+ <string name="actionbar_mkdir">Nova dosierujo</string>
<string name="actionbar_settings">Agordo</string>
+ <string name="actionbar_see_details">Detaloj</string>
+ <string name="actionbar_send_file">Sendi</string>
<string name="prefs_category_general">Ĝeneralo</string>
- <string name="prefs_category_trackmydevice">Spurado de aparato</string>
- <string name="prefs_add_session">Aldoni novan sesion</string>
- <string name="prefs_create_img_thumbnails">Krei bildetojn</string>
- <string name="prefs_select_oc_account">Elekti konton</string>
- <string name="prefs_summary_select_oc_account">Elektu kiun el viaj kontoj la aplikaĵo uzu.</string>
- <string name="prefs_trackmydevice">Spurado de aparato</string>
- <string name="prefs_trackmydevice_summary_off">Kapabligi ownCloud-on spuri la lokon de via aparato</string>
- <string name="prefs_trackmydevice_interval">Ĝisdatiga intervalo</string>
- <string name="prefs_trackmydevice_interval_summary">Ĝisdatigi je ĉiuj %1$s minutoj</string>
+ <string name="prefs_category_more">Pli</string>
<string name="prefs_accounts">Kontoj</string>
<string name="prefs_manage_accounts">Administri kontojn</string>
- <string name="prefs_pincode">PIN de ownCloud-aplikaĵo</string>
- <string name="prefs_pincode_summary">Protekti vian ownCloud-klienton</string>
+ <string name="prefs_pincode">PIN de App-aplikaĵo</string>
+ <string name="prefs_pincode_summary">Protekti vian klienton</string>
<string name="prefs_instant_upload">Kapabligi tujan alŝuton</string>
<string name="prefs_instant_upload_summary">Tuje alŝuti fotojn faritajn per fotilo</string>
- <string name="auth_host_url">URL de ownCloud</string>
+ <string name="prefs_help">Helpo</string>
<string name="auth_username">Uzantonomo</string>
<string name="auth_password">Pasvorto</string>
- <string name="auth_register">Mi estas nova ĉe ownCloud</string>
- <string name="new_session_uri_error">Malĝusta URL doniĝis</string>
- <string name="new_session_session_name_error">Malĝusta sesionomo</string>
<string name="sync_string_files">Dosieroj</string>
- <string name="uploader_no_file_selected">Neniu dosiero estas elektita por alŝuto</string>
- <string name="setup_hint_username">Uzantonomo</string>
- <string name="setup_hint_password">Pasvorto</string>
- <string name="setup_hint_address">TTT-adreso</string>
- <string name="setup_hint_show_password">Ĉu montri la pasvorton?</string>
- <string name="setup_title">Konekti al via ownCloud</string>
<string name="setup_btn_connect">Konekti</string>
<string name="uploader_btn_upload_text">Alŝuti</string>
<string name="uploader_wrn_no_account_title">Neniu konto troviĝis</string>
- <string name="uploader_wrn_no_account_text">Estas neniu ownCloud-konto en via aparato. Bonvolu agordi konton unue.</string>
+ <string name="uploader_wrn_no_account_text">Estas neniu $1%s-konto en via aparato. Bonvolu agordi konton unue.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Agordi</string>
<string name="uploader_wrn_no_account_quit_btn_text">Forlasi</string>
<string name="uploader_wrn_no_content_title">Neniu enhavo alŝutota</string>
<string name="uploader_wrn_no_content_text">Neniu enhavo riceviĝis. Nenio alŝutota.</string>
- <string name="uploader_error_forbidden_content">ownCloud ne estas permesata aliri la kunhavigitan enhavon</string>
+ <string name="uploader_error_forbidden_content">$1%s ne estas permesata aliri la kunhavigitan enhavon</string>
<string name="uploader_info_uploading">Alŝutante</string>
- <string name="uploader_btn_create_dir_text">Krei dosierujon por alŝuto</string>
<string name="file_list_empty">Neniu dosiero estas en ĉi tiu dosierujo.\nNovajn dosierojn vi povas aldoni per la menuero “Alŝuti”.</string>
<string name="filedetails_size">Grando:</string>
<string name="filedetails_type">Tipo:</string>
<string name="filedetails_created">Kreita je:</string>
<string name="filedetails_modified">Modifita je:</string>
<string name="filedetails_download">Elŝuti</string>
- <string name="filedetails_sync_file">Refreŝigi</string>
- <string name="filedetails_redownload">Reelŝuti</string>
- <string name="filedetails_open">Malfermi</string>
<string name="filedetails_renamed_in_upload_msg">La dosiero alinomiĝis al %1$s dum alŝuto</string>
+ <string name="action_share_file">Konhavigi ligilon</string>
<string name="common_yes">Jes</string>
<string name="common_no">Ne</string>
<string name="common_ok">Akcepti</string>
<string name="common_cancel_upload">Nuligi alŝuton</string>
<string name="common_cancel">Nuligi</string>
<string name="common_save_exit">Konservi kaj forlasi</string>
- <string name="common_exit">Forlasi ownCloud-on</string>
<string name="common_error">Eraro</string>
+ <string name="common_error_unknown">Nekonata eraro</string>
<string name="about_title">Pri</string>
+ <string name="change_password">Ŝanĝi la pasvorton</string>
<string name="delete_account">Forigi konton</string>
<string name="create_account">Krei konton</string>
<string name="upload_chooser_title">Alŝuti dosieron el...</string>
<string name="uploader_upload_in_progress_content">%1$d%% Alŝutante %2$s</string>
<string name="uploader_upload_succeeded_ticker">Alŝuto sukcesis</string>
<string name="uploader_upload_succeeded_content_single">%1$s sukcese alŝutiĝis</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d dosieroj sukcese alŝutiĝis</string>
<string name="uploader_upload_failed_ticker">Alŝuto malsukcesis</string>
<string name="uploader_upload_failed_content_single">Alŝuto de %1s ne eblis plenumiĝi</string>
- <string name="uploader_upload_failed_content_multiple">Alŝuto malsukcesis: %1$d el %2$d dosieroj alŝutiĝis</string>
<string name="downloader_download_in_progress_ticker">Elŝutante...</string>
<string name="downloader_download_in_progress_content">%1$d%% Elŝutante %2$s</string>
<string name="downloader_download_succeeded_ticker">Elŝuto sukcesis</string>
<string name="downloader_download_failed_ticker">Elŝuto malsukcesis</string>
<string name="downloader_download_failed_content">Elŝuto de %1$s ne eblis plenumiĝi</string>
<string name="common_choose_account">Elekti konton</string>
- <string name="sync_string_contacts">Kontaktoj</string>
<string name="sync_fail_ticker">Sinkronigo malsukcesis</string>
<string name="sync_fail_content">Sinkronigo de %1$s ne povis plenumiĝi</string>
<string name="sync_conflicts_in_favourites_ticker">Konfliktoj troviĝis</string>
<string name="sync_conflicts_in_favourites_content">%1$d ade sinkronigataj dosieroj ne povis sinkroniĝi</string>
<string name="sync_fail_in_favourites_ticker">Malsukcesis ada sinkronigo de dosieroj</string>
<string name="sync_fail_in_favourites_content">Enhavoj de %1$d dosieroj ne povis sinkroniĝi (%2$d konfliktas)</string>
- <string name="use_ssl">Uzi sekuran konekton</string>
- <string name="location_no_provider">ownCloud ne povas spuri vian aparaton. Bonvolu kontroli vian lokagordon.</string>
<string name="pincode_enter_pin_code">Bonvolu enigi vian PIN-on de aplikaĵo</string>
- <string name="pincode_enter_new_pin_code">Bonvolu enigi vian novan PIN-on de aplikaĵo</string>
- <string name="pincode_configure_your_pin">Enigu PIN-on de ownCloud-aplikaĵo</string>
- <string name="pincode_reenter_your_pincode">Bonvolu reenigi PIN-on de ownCloud-aplikaĵo</string>
- <string name="pincode_remove_your_pincode">Forigu vian PIN-on de ownCloud-aplikaĵo</string>
- <string name="pincode_mismatch">La du PIN-oj de ownCloud-aplikaĵo malsamas</string>
- <string name="pincode_wrong">Malĝusta PIN de ownCloud-aplikaĵo</string>
- <string name="pincode_removed">PIN de ownCloud-aplikaĵo foriĝis</string>
- <string name="pincode_stored">PIN de ownCloud-aplikaĵo konserviĝis</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 minutoj</item>
- <item>30 minutoj</item>
- <item>60 minutoj</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_configure_your_pin">Enigu PIN-on de aplikaĵo</string>
+ <string name="pincode_reenter_your_pincode">Bonvolu reenigi PIN-on de aplikaĵo</string>
+ <string name="pincode_remove_your_pincode">Forigu vian PIN-on de aplikaĵo</string>
+ <string name="pincode_mismatch">La du PIN-oj de aplikaĵo malsamas</string>
+ <string name="pincode_wrong">Malĝusta PIN de aplikaĵo</string>
+ <string name="pincode_removed">PIN de aplikaĵo foriĝis</string>
+ <string name="pincode_stored">PIN de aplikaĵo konserviĝis</string>
<string name="auth_trying_to_login">Provante ensaluti...</string>
<string name="auth_no_net_conn_title">Neniu reta konekto</string>
- <string name="auth_no_net_conn_message">Neniu reta konekto detektiĝis; kontrolu vian Interretan konekton kaj provu denove.</string>
- <string name="auth_connect_anyway">Konekti ĉiuokaze</string>
<string name="auth_nossl_plain_ok_title">Sekura konekto ne haveblas.</string>
<string name="auth_connection_established">Konekto stariĝis</string>
<string name="auth_testing_connection">Testante konekton...</string>
- <string name="auth_not_configured_title">Malĝuste formita ownCloud-agordo</string>
+ <string name="auth_not_configured_title">Malĝuste formita servilo-agordo</string>
<string name="auth_unknown_error_title">Nekonata eraro okazis</string>
- <string name="auth_unknown_error_message">Nekonata eraro okazis. Bonvolu kontakti verkintojn kaj inkluzivigi registrojn el via aparato.</string>
<string name="auth_unknown_host_title">Ne eblis trovi gastigon</string>
- <string name="auth_incorrect_path_title">Apero de ownCloud ne troviĝis</string>
- <string name="auth_incorrect_path_message">La aplikaĵo ne povis trovi ownCloud-aperon en la vojo donita. Bonvolu kontroli vian vojon kaj provi denove.</string>
+ <string name="auth_incorrect_path_title">Apero de servilo ne troviĝis</string>
<string name="auth_timeout_title">La servilo tro malfruis por respondi</string>
<string name="auth_incorrect_address_title">Malĝuste formita URL</string>
<string name="auth_ssl_general_error_title">SSL-ekigo malsukcesis</string>
- <string name="auth_ssl_unverified_server_title">Nekontrolita idento de SSL-servilo</string>
- <string name="auth_bad_oc_version_title">Nerekonita eldono de ownCloud-servilo</string>
+ <string name="auth_bad_oc_version_title">Nerekonita eldono de servilo</string>
<string name="auth_wrong_connection_title">Ne eblis starigi konekton</string>
<string name="auth_secure_connection">Sekura konekto stariĝis</string>
- <string name="auth_login_details">Ensalutaj detaloj</string>
- <string name="auth_unauthorized">Nevalida ensalutonomo/pasvorto</string>
- <string name="auth_not_found">Malĝusta vojo doniĝis</string>
- <string name="auth_internal">Ena servila eraro: kodo %1$d</string>
- <string name="crashlog_message">Aplikaĵo finis neatendite. Ĉu vi volus sendi paneoraporton?</string>
- <string name="crashlog_send_report">Sendi raporton</string>
- <string name="crashlog_dont_send_report">Ne sendi raporton</string>
- <string name="extensions_avail_title">Kromaĵoj haveblas!</string>
<string name="fd_keep_in_sync">Teni dosieron ĝisdatigita</string>
- <string name="common_share">Kunhavigi</string>
<string name="common_rename">Alinomigi</string>
<string name="common_remove">Forigi</string>
<string name="confirmation_remove_alert">Ĉu vi vere volas forigi %1$s?</string>
<string name="rename_server_fail_msg">Alinomigo ne povis plenumiĝi</string>
<string name="sync_file_fail_msg">Malloka dosiero ne povis kontroliĝi</string>
<string name="sync_file_nothing_to_do_msg">Dosierenhavoj jam sinkroniĝis</string>
- <string name="create_dir_fail_msg">Dosierujo ne povis kreiĝi</string>
<string name="wait_a_moment">Atendu momenton</string>
<string name="filedisplay_unexpected_bad_get_content">Neatendita problemo; bonvolu provi alian aplikaĵon por elekti la dosieron</string>
<string name="filedisplay_no_file_selected">Neniu dosiero elektiĝis</string>
- <string name="ssl_validator_title">Averto</string>
<string name="ssl_validator_header">La idento de la ejo ne povis kontroliĝi</string>
<string name="ssl_validator_reason_cert_not_trusted">- La servila atestilo ne fidindas</string>
<string name="ssl_validator_reason_cert_expired">- La servila atestilo eksvalidiĝis</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- La servila atestilo tro junas</string>
<string name="ssl_validator_reason_hostname_not_verified">- La URL ne kongruas kun la gastignomo en la atestilo</string>
- <string name="ssl_validator_certificate_not_available">La servila atestilo ne povis ekhaviĝi</string>
<string name="ssl_validator_question">Ĉu vi volas fidi ĉi tiun atestilon ĉiuokaze?</string>
<string name="ssl_validator_not_saved">La atestino ne povis konserviĝi</string>
<string name="ssl_validator_btn_details_see">Detaloj</string>
<string name="ssl_validator_label_validity_to">Al:</string>
<string name="ssl_validator_label_signature">Subskribo:</string>
<string name="ssl_validator_label_signature_algorithm">Algoritmo:</string>
- <string name="text_placeholder">Ĉi tio estas lokokupilo</string>
+ <string name="placeholder_sentence">Ĉi tio estas lokokupilo</string>
<string name="instant_upload_on_wifi">Alŝuti bildojn nur per WiFi</string>
<string name="conflict_title">Alŝuta konflikto</string>
<string name="conflict_message">La malloka dosiero %s estas ne sinkronigita kun loka dosiero. Se la ago daŭrus, enhavo de la dosiero en la servilo anstataŭiĝus.</string>
<string name="conflict_keep_both">Konservi ambaŭ</string>
<string name="conflict_overwrite">Anstataŭigi</string>
<string name="conflict_dont_upload">Ne alŝuti</string>
+ <string name="activity_chooser_send_file_title">Sendi</string>
+ <string name="clipboard_text_copied">Kopiita en la tondejon</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Password:</string>
- <string name="main_login">Nombre de usuario:</string>
- <string name="main_button_login">Entrar</string>
- <string name="main_welcome">Bienvenido</string>
- <string name="main_files">Archivos</string>
- <string name="main_music">Música</string>
- <string name="main_contacts">Contactos</string>
- <string name="main_calendar">Calendario</string>
- <string name="main_bookmarks">Marcadores</string>
- <string name="main_settings">Configuración</string>
- <string name="main_tit_accsetup">Configurar cuenta</string>
- <string name="main_wrn_accsetup">No hay cuentas en tu dispositivo. Para usar esta aplicación, tenés que crear una.</string>
- <string name="about_message">%1$s para Android\n\nversión: %2$s</string>
- <string name="actionbar_sync">Recargar</string>
+ <string name="about_android">App Android %1$s</string>
+ <string name="about_version">versión %1$s</string>
+ <string name="actionbar_sync">Actualizar cuenta</string>
<string name="actionbar_upload">Subir</string>
<string name="actionbar_upload_from_apps">Contenido de otras aplicaciones</string>
<string name="actionbar_upload_files">Archivos</string>
- <string name="actionbar_mkdir">Crear directorio</string>
- <string name="actionbar_search">Buscar</string>
+ <string name="actionbar_open_with">Abrir con</string>
+ <string name="actionbar_mkdir">Nueva Carpeta</string>
<string name="actionbar_settings">Configuración</string>
+ <string name="actionbar_see_details">Detalles</string>
+ <string name="actionbar_send_file">Mandar</string>
<string name="prefs_category_general">General</string>
- <string name="prefs_category_trackmydevice">Seguimiento del dispositivo</string>
- <string name="prefs_add_session">Agregar una sesión nueva</string>
- <string name="prefs_create_img_thumbnails">Crear miniaturas de las imágenes</string>
- <string name="prefs_select_oc_account">Elegir una cuenta</string>
- <string name="prefs_summary_select_oc_account">Elegí cual de tus cuentas esta aplicación debería usar.</string>
- <string name="prefs_trackmydevice">Rastreo de dispositivo</string>
- <string name="prefs_trackmydevice_summary_off">Habilitar la localización de tu dispositivo</string>
- <string name="prefs_trackmydevice_summary_on">La aplicación está haciendo un seguimiento de este dispositivo</string>
- <string name="prefs_trackmydevice_interval">Intervalo de actualización</string>
- <string name="prefs_trackmydevice_interval_summary">Actualizar cada %1$s minutos</string>
+ <string name="prefs_category_more">Más</string>
<string name="prefs_accounts">Cuentas</string>
<string name="prefs_manage_accounts">Gestionar cuentas</string>
<string name="prefs_pincode">PIN de aplicación</string>
<string name="prefs_pincode_summary">Protejé tu cliente</string>
<string name="prefs_instant_upload">Habilitar la subida inmediata</string>
<string name="prefs_instant_upload_summary">Subir inmediatamente las fotos sacadas con la cámara</string>
- <string name="auth_host_url">URL</string>
+ <string name="prefs_log_title">Habilitar registro</string>
+ <string name="prefs_log_summary">Esto es usado para registrar problemas</string>
+ <string name="prefs_log_title_history">Historia del Registro</string>
+ <string name="prefs_log_summary_history">Esto muestra los registros grabados</string>
+ <string name="prefs_log_delete_history_button">Eliminar Historial</string>
+ <string name="prefs_help">Ayuda</string>
+ <string name="prefs_recommend">Recomendar a un amigo</string>
+ <string name="prefs_feedback">Sugerencias</string>
+ <string name="prefs_imprint">Imprint</string>
+ <string name="recommend_subject">¡Intento %1$s en tu teléfono inteligente!</string>
+ <string name="auth_check_server">Verificar Servidor</string>
+ <string name="auth_host_url">Dirección del servidor https://...</string>
<string name="auth_username">Nombre de usuario</string>
<string name="auth_password">Contraseña</string>
- <string name="auth_register">Soy nuevo en %1$s</string>
- <string name="new_session_uri_error">La URL es incorrecta</string>
- <string name="new_session_session_name_error">Nombre de sesión equivocado</string>
+ <string name="auth_register">¿Sos nuevo para %1$s?</string>
<string name="sync_string_files">Archivos</string>
- <string name="uploader_no_file_selected">No se seleccionaron archivos para subir</string>
- <string name="setup_hint_username">Nombre de usuario</string>
- <string name="setup_hint_password">Contraseña</string>
- <string name="setup_hint_address">Dirección web</string>
- <string name="setup_hint_show_password">Mostrar contraseña?</string>
- <string name="setup_title">Conectate a tu %1$s</string>
<string name="setup_btn_connect">Conectar</string>
<string name="uploader_btn_upload_text">Subir</string>
<string name="uploader_wrn_no_account_title">No se encontraron cuentas</string>
<string name="uploader_wrn_no_content_text">No se recibió ningún contenido. No hay nada para subir.</string>
<string name="uploader_error_forbidden_content">%1$s no está autorizado para acceder al contenido compartido</string>
<string name="uploader_info_uploading">Subiendo</string>
- <string name="uploader_btn_create_dir_text">Crear directorio para subir</string>
<string name="file_list_empty">No hay archivos en este directorio.\nPodés agregar archivos a través de la opción del menú \"Subir\".</string>
<string name="filedetails_select_file">Pulsá sobre un archivo para mostrar información adicional.</string>
<string name="filedetails_size">Tamaño:</string>
<string name="filedetails_created">Creado:</string>
<string name="filedetails_modified">Modificado:</string>
<string name="filedetails_download">Descargar</string>
- <string name="filedetails_sync_file">Recargar</string>
- <string name="filedetails_redownload">Volver a descargar</string>
- <string name="filedetails_open">Abrir</string>
+ <string name="filedetails_sync_file">Actualizar archivo</string>
<string name="filedetails_renamed_in_upload_msg">El archivo fue renombrado como %1$s durante la subida</string>
+ <string name="action_share_file">Compartir vínculo</string>
<string name="common_yes">Sí</string>
<string name="common_no">No</string>
<string name="common_ok">Aceptar</string>
<string name="common_cancel_upload">Cancelar subida</string>
<string name="common_cancel">Cancelar</string>
<string name="common_save_exit">Guardar y salir</string>
- <string name="common_exit">Salir de %1$s</string>
<string name="common_error">Error</string>
+ <string name="common_loading">Cargando ...</string>
+ <string name="common_error_unknown">Error desconocido</string>
<string name="about_title">Acerca de</string>
+ <string name="change_password">Cambiar contraseña</string>
<string name="delete_account">Eliminar cuenta</string>
<string name="create_account">Crear cuenta</string>
<string name="upload_chooser_title">Subir desde ...</string>
- <string name="uploader_info_dirname">Nombre del directorio</string>
+ <string name="uploader_info_dirname">Nombre de la carpeta</string>
<string name="uploader_upload_in_progress_ticker">Subiendo...</string>
<string name="uploader_upload_in_progress_content">%1$d%% Subiendo %2$s</string>
<string name="uploader_upload_succeeded_ticker">Subido con éxito</string>
<string name="uploader_upload_succeeded_content_single">%1$s se ha subido con éxito</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d archivos se han subido con éxito</string>
<string name="uploader_upload_failed_ticker">Error al subir el archivo</string>
<string name="uploader_upload_failed_content_single">No se pudo completar la subida de %1$s </string>
- <string name="uploader_upload_failed_content_multiple">Error al subir: %1$d/%2$d archivos fueron subidos</string>
<string name="downloader_download_in_progress_ticker">Descargando ...</string>
<string name="downloader_download_in_progress_content">%1$d%% descargando %2$s</string>
<string name="downloader_download_succeeded_ticker">Descarga completa</string>
<string name="downloader_download_succeeded_content">%1$s fue descargado con éxito</string>
<string name="downloader_download_failed_ticker">Error al descargar</string>
<string name="downloader_download_failed_content">No fue posible completar la descarga de %1$s</string>
+ <string name="downloader_not_downloaded_yet">No descargado</string>
<string name="common_choose_account">Elegí una cuenta</string>
- <string name="sync_string_contacts">Contactos</string>
<string name="sync_fail_ticker">Error en la sincronización</string>
<string name="sync_fail_content">No se pudo completar la sincronización de %1$s </string>
+ <string name="sync_fail_content_unauthorized">Contraseña no válida para %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Se encontraron conflictos</string>
<string name="sync_conflicts_in_favourites_content">No se pudieron sincronizar %1$d archivos</string>
<string name="sync_fail_in_favourites_ticker">Fallo la sincronización de archivos</string>
<string name="sync_fail_in_favourites_content">%1$d archivos no pudieron ser sincronizados (%2$d conflictos)</string>
- <string name="use_ssl">Usar conexión segura</string>
- <string name="location_no_provider">%1$s no puede rastear tu dispositivo. Verificá la configuración de localización</string>
+ <string name="sync_foreign_files_forgotten_ticker">Algunos archivos locales fueron olvidados</string>
+ <string name="sync_current_folder_was_removed">El directorio %1$s ya no existe</string>
+ <string name="foreign_files_move">Mover todos</string>
+ <string name="foreign_files_success">Todos los archivos fueron movidos</string>
+ <string name="foreign_files_fail">Algunos archivos no pudieron ser movidos</string>
+ <string name="foreign_files_local_text">Local: %1$s</string>
+ <string name="foreign_files_remote_text">Remote: %1$s</string>
+ <string name="upload_query_move_foreign_files">No hay suficiente espacio para copiar los archivos seleccionados al directorio %1$s. Querés moverlos ahí?</string>
<string name="pincode_enter_pin_code">Por favor, escribí el PIN de la aplicación</string>
- <string name="pincode_enter_new_pin_code">Por favor, escribí el nuevo PIN de la aplicación</string>
<string name="pincode_configure_your_pin">Ingresá el PIN de la aplicación</string>
<string name="pincode_configure_your_pin_explanation">Se te pedirá el PIN cada vez que esta app sea iniciada.</string>
<string name="pincode_reenter_your_pincode">Por favor, ingresá nuevamente el PIN de la aplicación</string>
<string name="pincode_wrong">El PIN de la aplicación es incorrecto</string>
<string name="pincode_removed">El PIN de la aplicación fue borrado</string>
<string name="pincode_stored">El PIN de la aplicación fue almacenado</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 minutos</item>
- <item>30 minutos</item>
- <item>60 minutos</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="media_notif_ticker">Reproductor de música %1$s</string>
+ <string name="media_state_playing">%1$s (reproduciendo)</string>
+ <string name="media_state_loading">%1$s (cargando)</string>
+ <string name="media_event_done">%1$s reproducción finalizada</string>
+ <string name="media_err_nothing_to_play">No se encuentra archivo de medio</string>
+ <string name="media_err_no_account">No se proporcionó cuenta</string>
+ <string name="media_err_not_in_owncloud">El archivo no está en una cuenta válida </string>
+ <string name="media_err_unsupported">Codec no soportado</string>
+ <string name="media_err_io">El archivo de medios no pudo ser leído </string>
+ <string name="media_err_malformed">Archivo no está correctamente codificado</string>
+ <string name="media_err_timeout">Tiempo expirado mientras se intentaba reproducir</string>
+ <string name="media_err_invalid_progressive_playback">Archivo de medios no puede ser transmitido</string>
+ <string name="media_err_unknown">El archivo de medios no se puede reproducir con el reproductor de medios por defecto </string>
+ <string name="media_err_security_ex">Error de seguridad al intentar reproducir %1$s</string>
+ <string name="media_err_io_ex">Error de entrada al intentar reproducir %1$s</string>
+ <string name="media_err_unexpected">Error inesperado intentando reproducir %1$s</string>
+ <string name="media_rewind_description">Botón rebobinado</string>
+ <string name="media_play_pause_description">Botón de reproducción o pausa </string>
+ <string name="media_forward_description">Botón avance rápido</string>
<string name="auth_trying_to_login">Intentado iniciar sesión...</string>
<string name="auth_no_net_conn_title">Sin conexión de red</string>
- <string name="auth_no_net_conn_message">No se ha detectado una conexión de red, revisá tu conexión a internet e intentá nuevamente.</string>
- <string name="auth_connect_anyway">Conectar de todos modos</string>
<string name="auth_nossl_plain_ok_title">Conexión segura no disponible.</string>
- <string name="auth_nossl_plain_ok_message">La aplicación no pudo establecer una conexión segura al servidor. Aunque no haya una conexión segura disponible, podés continuar o cancelar.</string>
<string name="auth_connection_established">Conexión establecida</string>
<string name="auth_testing_connection">Probando conexión...</string>
<string name="auth_not_configured_title">Configuración de servidor en formato incorrecto</string>
- <string name="auth_not_configured_message">Parece ser que la instancia de tu servidor no está configurada correctamente. Comunicate con el administrador para más detalles.</string>
+ <string name="auth_account_not_new">Una cuenta para el mismo usuario y servidor ya existe en el dispositivo</string>
+ <string name="auth_account_not_the_same">El usuario ingresado no concuerda con el usuario de esta cuenta</string>
<string name="auth_unknown_error_title">¡Ocurrió un error desconocido!</string>
- <string name="auth_unknown_error_message">Ocurrió un error desconocido. Por favor, comunicate con los autores e incluí los registros de tu dispositivo.</string>
<string name="auth_unknown_host_title">No fue posible encontrar la dirección</string>
- <string name="auth_unknown_host_message">No se pudo encontrar el servidor. Consultá si el servidor está disponible, su dirección, e intentalo nuevamete.</string>
<string name="auth_incorrect_path_title">Instancia de servidor no encontrada</string>
- <string name="auth_incorrect_path_message">La aplicación no pudo encontrar la instancia del servidor en la ruta de acceso dada. Por favor verificá la ruta de acceso e intentalo nuevamente.</string>
<string name="auth_timeout_title">El servidor tardó demasiado en responder</string>
<string name="auth_incorrect_address_title">URL no válida</string>
<string name="auth_ssl_general_error_title">Error al inicializar el SSL</string>
- <string name="auth_ssl_unverified_server_title">No se puede verificar la Identidad del servidor SSL</string>
+ <string name="auth_ssl_unverified_server_title">No se ha podido verifica la identidad SSL del servidor</string>
<string name="auth_bad_oc_version_title">No es posible reconocer la versión del servidor</string>
<string name="auth_wrong_connection_title">No fue posible establecer la conexión</string>
<string name="auth_secure_connection">Conexión segura establecida</string>
- <string name="auth_login_details">Detalles de inicio de sesión</string>
- <string name="auth_unauthorized">Nombre / contraseña incorrectos</string>
- <string name="auth_not_found">Ruta incorrecta</string>
- <string name="auth_internal">Error interno en el servidor, código %1$d</string>
- <string name="crashlog_message">La aplicación finalizó inesperadamente. ¿Querés mandar un reporte de error?</string>
- <string name="crashlog_send_report">Enviar reporte</string>
- <string name="crashlog_dont_send_report">No enviar reporte</string>
- <string name="extensions_avail_title">¡Hay extensiones disponibles!</string>
- <string name="extensions_avail_message">Parece que tu instancia de servidor soporta extensiones avanzadas. ¿Querés ver las extensiones disponibles para Android?</string>
+ <string name="auth_unauthorized">Nombre de usuario o contraseña no válidas</string>
+ <string name="auth_oauth_error">Autorización no satisfactoria</string>
+ <string name="auth_oauth_error_access_denied">Acceso denegado por el servidor de autorización</string>
+ <string name="auth_wtf_reenter_URL">Estado inesperado; por favor, introducí la URL del servidor de nuevo</string>
+ <string name="auth_expired_oauth_token_toast">Tu autorización ha expirado. Por favor, obtenga una nueva autorización</string>
+ <string name="auth_expired_basic_auth_toast">Por favor, ingresá tu contraseña actual</string>
+ <string name="auth_expired_saml_sso_token_toast">Su sesión ha expirado. Por favor, conéctese de nuevo</string>
+ <string name="auth_connecting_auth_server">Conectando al servidor de autenticación...</string>
+ <string name="auth_unsupported_auth_method">El servidor no soporta este método de autenticación</string>
+ <string name="auth_unsupported_multiaccount">%1$s no soporta múltiples cuentas</string>
<string name="fd_keep_in_sync">Mantener el archivo actualizado</string>
- <string name="common_share">Compartir</string>
<string name="common_rename">Renombrar</string>
<string name="common_remove">Borrar</string>
<string name="confirmation_remove_alert">¿Estás seguro que querés borrar %1$s?</string>
<string name="rename_server_fail_msg">No se pudo cambiar el nombre</string>
<string name="sync_file_fail_msg">No pudo comprobarse el archivo remoto</string>
<string name="sync_file_nothing_to_do_msg">Ya está sincronizado</string>
- <string name="create_dir_fail_msg">No fue posible crear el directorio</string>
+ <string name="filename_forbidden_characters">Caracteres prohibidos: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Esperá un momento</string>
<string name="filedisplay_unexpected_bad_get_content">Problema inesperado; por favor, intentá con otra aplicación para abrir el archivo</string>
<string name="filedisplay_no_file_selected">No se seleccionó ningún archivo</string>
- <string name="ssl_validator_title">Alerta</string>
+ <string name="oauth_check_onoff">Iniciando sesión con oAuth2</string>
+ <string name="oauth_login_connection">Conectando al servidor oAuth2...</string>
<string name="ssl_validator_header">La identidad del sitio no pudo ser verificada</string>
<string name="ssl_validator_reason_cert_not_trusted">- El certificado del servidor no es confiable</string>
<string name="ssl_validator_reason_cert_expired">- El certificado del servidor caducó</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- El certificado del servidor es demasiado nuevo</string>
<string name="ssl_validator_reason_hostname_not_verified">- La URL no se condice con el nombre del servidor en el certificado</string>
- <string name="ssl_validator_certificate_not_available">No se pudo obtener el certificado del servidor </string>
<string name="ssl_validator_question">¿Confiás en el certificado de todos modos?</string>
<string name="ssl_validator_not_saved">No fue posible guardar el certificado</string>
<string name="ssl_validator_btn_details_see">Detalles</string>
<string name="ssl_validator_label_validity_to">Para:</string>
<string name="ssl_validator_label_signature">Firma:</string>
<string name="ssl_validator_label_signature_algorithm">Algoritmo:</string>
- <string name="text_placeholder">Este es un texto temporario</string>
+ <string name="placeholder_sentence">Este es un texto temporario</string>
+ <string name="placeholder_filename">marcadordeposición.txt</string>
+ <string name="placeholder_filetype">Imagen PNG</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Subir imágenes solamente a través de WiFi</string>
<string name="instant_upload_path">/SubidasInstantáneas</string>
<string name="conflict_title">Conflicto en la actualización</string>
<string name="conflict_keep_both">Mantener ambas</string>
<string name="conflict_overwrite">Sobrescribir</string>
<string name="conflict_dont_upload">No subir</string>
+ <string name="preview_image_description">Previsualización de imagen</string>
+ <string name="preview_image_error_unknown_format">No se puede mostrar la imagen</string>
+ <string name="actionbar_failed_instant_upload">Falló InstantUpload</string>
+ <string name="failed_upload_headline_text">Error en Cargas instantánea </string>
+ <string name="failed_upload_headline_hint">Resumen de todas las cargas instantáneas con error</string>
+ <string name="failed_upload_all_cb">Seleccionar todos</string>
+ <string name="failed_upload_headline_retryall_btn">Reintentar con todos los seleccionados</string>
+ <string name="failed_upload_headline_delete_all_btn">Eliminar todo de la cola de subida</string>
+ <string name="failed_upload_retry_text">Reintentar subida de imagen:</string>
+ <string name="failed_upload_load_more_images">Cargar mas imágenes</string>
+ <string name="failed_upload_retry_do_nothing_text">No hacer nada, no estás conectado para subida instantánea</string>
+ <string name="failed_upload_failure_text">Mensaje de error:</string>
+ <string name="failed_upload_quota_exceeded_text">Por favor, revisá la configuración de servidor, posiblemente tu cuota se haya excedido.</string>
+ <string name="activity_chooser_send_file_title">Mandar</string>
+ <string name="clipboard_text_copied">Copiado al portapapeles</string>
</resources>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="actionbar_upload">Subir</string>
+ <string name="actionbar_upload_files">Archivos</string>
+ <string name="actionbar_settings">Configuración</string>
+ <string name="prefs_category_general">General</string>
+ <string name="prefs_accounts">Cuentas</string>
+ <string name="auth_username">Usuario</string>
+ <string name="auth_password">Clave</string>
+ <string name="sync_string_files">Archivos</string>
+ <string name="setup_btn_connect">Conectar</string>
+ <string name="uploader_btn_upload_text">Subir</string>
+ <string name="uploader_wrn_no_account_title">No se encuentra la cuenta</string>
+ <string name="uploader_info_uploading">Subiendo</string>
+ <string name="filedetails_select_file">Seleccione un archivo para desplegar información adicional.</string>
+ <string name="filedetails_size">Tamaño:</string>
+ <string name="filedetails_type">Tipo:</string>
+ <string name="filedetails_created">Creado:</string>
+ <string name="filedetails_modified">Modificado:</string>
+ <string name="filedetails_download">Descargar</string>
+ <string name="common_yes">Si</string>
+ <string name="common_no">No</string>
+ <string name="common_ok">OK</string>
+ <string name="common_cancel">Cancelar</string>
+ <string name="common_error">Error</string>
+ <string name="common_choose_account">Elija una cuenta</string>
+ <string name="pincode_enter_pin_code">Por favor, ingreses su PIN de aplicación</string>
+ <string name="pincode_configure_your_pin">Ingrese su PIN de aplicación</string>
+ <string name="pincode_reenter_your_pincode">Por favor, reingrese su PIN de aplicación</string>
+</resources>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="about_android">App Android %1$s</string>
+ <string name="about_version">versión %1$s</string>
+ <string name="actionbar_sync">Actualizar cuenta</string>
+ <string name="actionbar_upload">Subir archivo</string>
+ <string name="actionbar_upload_from_apps">Contenido de otras aplicaciones</string>
+ <string name="actionbar_upload_files">Archivos</string>
+ <string name="actionbar_open_with">Abrir con</string>
+ <string name="actionbar_mkdir">Nueva carpeta</string>
+ <string name="actionbar_settings">Ajustes</string>
+ <string name="actionbar_see_details">Detalles</string>
+ <string name="actionbar_send_file">Enviar</string>
+ <string name="prefs_category_general">General</string>
+ <string name="prefs_category_more">Más</string>
+ <string name="prefs_accounts">Cuentas</string>
+ <string name="prefs_manage_accounts">Gestionar cuentas</string>
+ <string name="prefs_pincode">PIN de aplicación </string>
+ <string name="prefs_pincode_summary">Proteja su cliente</string>
+ <string name="prefs_instant_upload">Habilita la subida instantánea</string>
+ <string name="prefs_instant_upload_summary">Subir instantáneamente las fotos tomadas por la cámara</string>
+ <string name="prefs_log_title">Habilitar registro</string>
+ <string name="prefs_log_summary">Esto es usado para registrar problemas</string>
+ <string name="prefs_log_title_history">Historia del Registro</string>
+ <string name="prefs_log_summary_history">Esto muestra los registros grabados</string>
+ <string name="prefs_log_delete_history_button">Eliminar Historial</string>
+ <string name="prefs_help">Ayuda</string>
+ <string name="prefs_recommend">Recomendar a un amigo</string>
+ <string name="prefs_feedback">Mensajes de retroalimentación</string>
+ <string name="prefs_imprint">Imprint</string>
+ <string name="recommend_subject">Prueba %1$s en tu smarthphone!</string>
+ <string name="auth_check_server">Compruebe el servidor.</string>
+ <string name="auth_host_url">Dirección del servidor https://…</string>
+ <string name="auth_username">Nombre de usuario</string>
+ <string name="auth_password">Contraseña</string>
+ <string name="auth_register">New to %1$s?</string>
+ <string name="sync_string_files">Archivos</string>
+ <string name="setup_btn_connect">Conectar</string>
+ <string name="uploader_btn_upload_text">Subir</string>
+ <string name="uploader_wrn_no_account_title">No se encontraron cuentas</string>
+ <string name="uploader_wrn_no_account_text">No hay cuentas de %1$s en tu dispositivo. Por favor configura una cuenta primero.</string>
+ <string name="uploader_wrn_no_account_setup_btn_text">Configuración</string>
+ <string name="uploader_wrn_no_account_quit_btn_text">Salir</string>
+ <string name="uploader_wrn_no_content_title">No hay contenido para subir</string>
+ <string name="uploader_wrn_no_content_text">Ningún contenido ha sido recibido. No hay nada que subir.</string>
+ <string name="uploader_error_forbidden_content">%1$s no está autorizado para acceder al contenido compartido</string>
+ <string name="uploader_info_uploading">Enviando</string>
+ <string name="file_list_empty">No hay archivos en esta carpeta.\nPuedes añadir nuevos archivos con la opción \"Subir\" del menú.</string>
+ <string name="filedetails_select_file">Pulsa sobre un archivo para mostrar información adicional.</string>
+ <string name="filedetails_size">Tamaño:</string>
+ <string name="filedetails_type">Tipo:</string>
+ <string name="filedetails_created">Creado:</string>
+ <string name="filedetails_modified">Modificado:</string>
+ <string name="filedetails_download">Descargar</string>
+ <string name="filedetails_sync_file">Actualizar archivo</string>
+ <string name="filedetails_renamed_in_upload_msg">El archivo fue renombrado como %1$s durante la subida</string>
+ <string name="action_share_file">Enlace compartido</string>
+ <string name="common_yes">Sí</string>
+ <string name="common_no">No</string>
+ <string name="common_ok">Aceptar</string>
+ <string name="common_cancel_download">Cancelar descarga</string>
+ <string name="common_cancel_upload">Cancelar subida</string>
+ <string name="common_cancel">Cancelar</string>
+ <string name="common_save_exit">Guardar & Salir</string>
+ <string name="common_error">Error</string>
+ <string name="common_loading">Cargando ...</string>
+ <string name="common_error_unknown">Error desconocido</string>
+ <string name="about_title">Acerca de</string>
+ <string name="change_password">Cambiar contraseña</string>
+ <string name="delete_account">Eliminar cuenta</string>
+ <string name="create_account">Crear cuenta</string>
+ <string name="upload_chooser_title">Subir</string>
+ <string name="uploader_info_dirname">Nombre de la carpeta</string>
+ <string name="uploader_upload_in_progress_ticker">Subiendo...</string>
+ <string name="uploader_upload_in_progress_content">%1$d%% Subiendo %2$s</string>
+ <string name="uploader_upload_succeeded_ticker">Subido con éxito</string>
+ <string name="uploader_upload_succeeded_content_single">%1$s se ha subido con éxito</string>
+ <string name="uploader_upload_failed_ticker">Error en la subida</string>
+ <string name="uploader_upload_failed_content_single">La subida de %1$s no se pudo completar</string>
+ <string name="downloader_download_in_progress_ticker">Descargando ...</string>
+ <string name="downloader_download_in_progress_content">%1$s Descargada de %2$s</string>
+ <string name="downloader_download_succeeded_ticker">Descarga completa</string>
+ <string name="downloader_download_succeeded_content">%1$s se ha descargado con éxito</string>
+ <string name="downloader_download_failed_ticker">Falló la descarga</string>
+ <string name="downloader_download_failed_content">La descarga de %1$s no se pudo completar</string>
+ <string name="downloader_not_downloaded_yet">No descargado</string>
+ <string name="common_choose_account">Elige una cuenta</string>
+ <string name="sync_fail_ticker">Falló la sincronización</string>
+ <string name="sync_fail_content">La sincronización de %1$s s no se pudo completar</string>
+ <string name="sync_fail_content_unauthorized">Contraseña no válida para %1$s</string>
+ <string name="sync_conflicts_in_favourites_ticker">Se encontraron conflictos</string>
+ <string name="sync_conflicts_in_favourites_content">Falló la sincronización de contenidos de %1$d archivos</string>
+ <string name="sync_fail_in_favourites_ticker">Fallos en la sincronización de contenidos</string>
+ <string name="sync_fail_in_favourites_content">Los contenidos de %1$d archivos no fueron sincronizados (%2$d conflictos)</string>
+ <string name="sync_foreign_files_forgotten_ticker">Algunos archivos locales se han perdido</string>
+ <string name="sync_current_folder_was_removed">La carpeta local %1$s no existe.</string>
+ <string name="foreign_files_move">Mover todo</string>
+ <string name="foreign_files_success">Todos los archivos fueron movidos</string>
+ <string name="foreign_files_fail">Algunos archivos no han podido ser movidos</string>
+ <string name="foreign_files_local_text">Local: %1$s</string>
+ <string name="foreign_files_remote_text">Remoto: %1$s</string>
+ <string name="upload_query_move_foreign_files">No hay suficiente espacio para copiar los archivos seleccionados en la carpeta %1$s. ¿Quiere moverlos en lugar de copiarlos?</string>
+ <string name="pincode_enter_pin_code">Por favor, inserta tu PIN de aplicación</string>
+ <string name="pincode_configure_your_pin">Introduzca un PIN para la aplicación</string>
+ <string name="pincode_configure_your_pin_explanation">Se solicitará el PIN cada vez que se inicie la aplicación</string>
+ <string name="pincode_reenter_your_pincode">Repita el PIN para la aplicación, por favor</string>
+ <string name="pincode_remove_your_pincode">Borre su PIN de aplicación</string>
+ <string name="pincode_mismatch">Los PIN introducidos no son iguales</string>
+ <string name="pincode_wrong">PIN de aplicación incorrecto</string>
+ <string name="pincode_removed">PIN de aplicación borrado</string>
+ <string name="pincode_stored">PIN de aplicación guardado</string>
+ <string name="media_notif_ticker">Reproductor de música %1$s</string>
+ <string name="media_state_playing">%1$s (reproduciendo)</string>
+ <string name="media_state_loading">%1$s (cargando)</string>
+ <string name="media_event_done">%1$s reproducción finalizada</string>
+ <string name="media_err_nothing_to_play">No se encuentra archivo de medio</string>
+ <string name="media_err_no_account">No se ha proporcionado cuenta</string>
+ <string name="media_err_not_in_owncloud">El archivo no esta en una cuenta valida </string>
+ <string name="media_err_unsupported">Codec No Soportado</string>
+ <string name="media_err_io">El archivo de medios no pudo ser leído </string>
+ <string name="media_err_malformed">Archivo no codificado correctamente</string>
+ <string name="media_err_timeout">Tiempo de espera agotado en el intento de reproducción</string>
+ <string name="media_err_invalid_progressive_playback">Archivo de medio no puede ser transmitido</string>
+ <string name="media_err_unknown">El archivo de medios no se puede reproducir con el reproductor de medios por defecto </string>
+ <string name="media_err_security_ex">Error de seguridad al intentar reproducir %1$s</string>
+ <string name="media_err_io_ex">Error de entrada al intentar reproducir %1$s</string>
+ <string name="media_err_unexpected">Error inesperado intentando reproducir %1$s</string>
+ <string name="media_rewind_description">Botón Rebobinado</string>
+ <string name="media_play_pause_description">Botón de reproducción o pausa </string>
+ <string name="media_forward_description">Botón avance rápido</string>
+ <string name="auth_trying_to_login">Intentado iniciar sesión...</string>
+ <string name="auth_no_net_conn_title">Sin conexión de red</string>
+ <string name="auth_nossl_plain_ok_title">Conexión segura no disponible.</string>
+ <string name="auth_connection_established">Conexión establecida</string>
+ <string name="auth_testing_connection">Probando conexión...</string>
+ <string name="auth_not_configured_title">Configuración de servidor en formato incorrecto</string>
+ <string name="auth_account_not_new">Una cuenta para el mismo usuario y servidor ya existen en el dispositivo</string>
+ <string name="auth_account_not_the_same">El usuario introducido no concuerda con el usuario de esta cuenta</string>
+ <string name="auth_unknown_error_title">Ocurrió un error desconocido</string>
+ <string name="auth_unknown_host_title">No se pudo encontrar la dirección</string>
+ <string name="auth_incorrect_path_title">Instancia de servidor no encontrada</string>
+ <string name="auth_timeout_title">El servidor ha tardado demasiado en responder</string>
+ <string name="auth_incorrect_address_title">URL no válida</string>
+ <string name="auth_ssl_general_error_title">Falló la inicialización SSL</string>
+ <string name="auth_ssl_unverified_server_title">No fue posible verificar la identidad del servidor SLL</string>
+ <string name="auth_bad_oc_version_title">No se reconoce la versión del servidor </string>
+ <string name="auth_wrong_connection_title">No se ha podido establecer la conexión</string>
+ <string name="auth_secure_connection">Conexión segura establecida</string>
+ <string name="auth_unauthorized">Nombre de usuario o contraseña incorrecta</string>
+ <string name="auth_oauth_error">Autorización no satisfactoria</string>
+ <string name="auth_oauth_error_access_denied">Acceso denegado por servidor de autorización</string>
+ <string name="auth_wtf_reenter_URL">Estado inesperado; por favor, introduzca la URL del servidor de nuevo</string>
+ <string name="auth_expired_oauth_token_toast">Su autorización ha expirado. Por favor, autorice de nuevo</string>
+ <string name="auth_expired_basic_auth_toast">Por favor, introduzca la contraseña actual.</string>
+ <string name="auth_expired_saml_sso_token_toast">Su sesión ha expirado. Favor de conectarse de nuevo</string>
+ <string name="auth_connecting_auth_server">Conectando al servidor de autenticación...</string>
+ <string name="auth_unsupported_auth_method">El servidor no soporta este método de autenticación</string>
+ <string name="auth_unsupported_multiaccount">%1$s no soporta cuentas múltiples</string>
+ <string name="fd_keep_in_sync">Mantener el archivo actualizado</string>
+ <string name="common_rename">Renombrar</string>
+ <string name="common_remove">Borrar</string>
+ <string name="confirmation_remove_alert">¿Está seguro que desea borrar %1$s ?</string>
+ <string name="confirmation_remove_folder_alert">¿Desea elimiar %1$s y sus descendientes?</string>
+ <string name="confirmation_remove_local">Sólo local</string>
+ <string name="confirmation_remove_folder_local">Sólo archivos locales</string>
+ <string name="confirmation_remove_remote">Eliminar del servidor</string>
+ <string name="confirmation_remove_remote_and_local">Tanto remoto como local</string>
+ <string name="remove_success_msg">Borrado correctamente</string>
+ <string name="remove_fail_msg">El borrado no pudo ser completado</string>
+ <string name="rename_dialog_title">Introduzca un nombre nuevo</string>
+ <string name="rename_local_fail_msg">No se pudo cambiar el nombre de la copia local, trata con un nombre differente</string>
+ <string name="rename_server_fail_msg">No se pudo cambiar el nombre</string>
+ <string name="sync_file_fail_msg">No pudo comprobarse el archivo remoto</string>
+ <string name="sync_file_nothing_to_do_msg">Ya está sincronizado</string>
+ <string name="filename_forbidden_characters">Carácteres ilegales: / \\ < > : \" | ? *</string>
+ <string name="wait_a_moment">Espere un momento</string>
+ <string name="filedisplay_unexpected_bad_get_content">Problema inesperado; por favor, prueba otra app para seleccionar el archivo</string>
+ <string name="filedisplay_no_file_selected">No fué seleccionado ningún archivo</string>
+ <string name="oauth_check_onoff">Ingresar con oAuth2</string>
+ <string name="oauth_login_connection">Conectando al servidor oAuth2...</string>
+ <string name="ssl_validator_header">La identidad del sitio no puede ser verificada</string>
+ <string name="ssl_validator_reason_cert_not_trusted">- El certificado del servidor no es de confianza</string>
+ <string name="ssl_validator_reason_cert_expired">- El certificado del servidor expiró</string>
+ <string name="ssl_validator_reason_cert_not_yet_valid">- El certificado del servidor es demasiado reciente</string>
+ <string name="ssl_validator_reason_hostname_not_verified">- La URL no coincide con el nombre de dominio del certificado</string>
+ <string name="ssl_validator_question">¿Confías de todas formas en este certificado?</string>
+ <string name="ssl_validator_not_saved">El certificado no pudo ser guardado</string>
+ <string name="ssl_validator_btn_details_see">Detalles</string>
+ <string name="ssl_validator_btn_details_hide">Ocultar</string>
+ <string name="ssl_validator_label_subject">Emitido para:</string>
+ <string name="ssl_validator_label_issuer">Emitido por:</string>
+ <string name="ssl_validator_label_CN">Nombre común:</string>
+ <string name="ssl_validator_label_O">Organización:</string>
+ <string name="ssl_validator_label_OU">Unidad organizativa</string>
+ <string name="ssl_validator_label_C">Pais:</string>
+ <string name="ssl_validator_label_ST">Estado:</string>
+ <string name="ssl_validator_label_L">Ubicación:</string>
+ <string name="ssl_validator_label_validity">Validez:</string>
+ <string name="ssl_validator_label_validity_from">De:</string>
+ <string name="ssl_validator_label_validity_to">A:</string>
+ <string name="ssl_validator_label_signature">Firma:</string>
+ <string name="ssl_validator_label_signature_algorithm">Algoritmo:</string>
+ <string name="placeholder_sentence">Esto es un marcador de posición</string>
+ <string name="placeholder_filename">marcadordeposición.txt</string>
+ <string name="placeholder_filetype">Imagen PNG</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
+ <string name="instant_upload_on_wifi">Subir imágenes sólo via WiFi</string>
+ <string name="instant_upload_path">/SubidasInstantáneas</string>
+ <string name="conflict_title">Conflicto en la actualización</string>
+ <string name="conflict_message">El archivo remoto %s no está sincronizado con el archivo local. Si continúa, se reemplazará el contenido del archivo en el servidor.</string>
+ <string name="conflict_keep_both">Mantener ambas</string>
+ <string name="conflict_overwrite">Sobrescribir</string>
+ <string name="conflict_dont_upload">No subir</string>
+ <string name="preview_image_description">Previsualización de imagen</string>
+ <string name="preview_image_error_unknown_format">No se puede mostrar la imagen</string>
+ <string name="actionbar_failed_instant_upload">Carga instantánea fallida</string>
+ <string name="failed_upload_headline_text">Cargas instantáneas fallidas</string>
+ <string name="failed_upload_headline_hint">Resumen de todas las cargas instantáneas fallidas</string>
+ <string name="failed_upload_all_cb">Seleccionar todos</string>
+ <string name="failed_upload_headline_retryall_btn">Reintentar todos los seleccionados</string>
+ <string name="failed_upload_headline_delete_all_btn">Eliminar todo de la cola de subida</string>
+ <string name="failed_upload_retry_text">Reintentar subida de imagen:</string>
+ <string name="failed_upload_load_more_images">Cargar mas imágenes</string>
+ <string name="failed_upload_retry_do_nothing_text">No hacer nada no está conectado para subida instantánea</string>
+ <string name="failed_upload_failure_text">Mensaje de error:</string>
+ <string name="failed_upload_quota_exceeded_text">Por favor revise su configuración de servidor, posiblemente su cuota se haya excedido.</string>
+ <string name="activity_chooser_send_file_title">Enviar</string>
+ <string name="clipboard_text_copied">Copiado al portapapeles</string>
+</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Contraseña:</string>
- <string name="main_login">Nombre de usuario:</string>
- <string name="main_button_login">Inicio de sesión</string>
- <string name="main_welcome">Bienvenido</string>
- <string name="main_files">Archivos</string>
- <string name="main_music">Música</string>
- <string name="main_contacts">Contactos</string>
- <string name="main_calendar">Calendario</string>
- <string name="main_bookmarks">Marcadores</string>
- <string name="main_settings">Ajustes</string>
- <string name="main_tit_accsetup">Configuración de cuenta</string>
- <string name="main_wrn_accsetup">No hay cuentas en tu dispositivo. Para usar esta aplicación, necesitas crear una.</string>
- <string name="about_message">%1$s para Android\n\nversión: %2$s</string>
- <string name="actionbar_sync">Sincronización de cuenta</string>
- <string name="actionbar_upload">Subir archivo</string>
+ <string name="about_android">%1$s para Android</string>
+ <string name="about_version">versión %1$s</string>
+ <string name="actionbar_sync">Actualizar cuenta</string>
+ <string name="actionbar_upload">Subir</string>
<string name="actionbar_upload_from_apps">Contenido de otras aplicaciones</string>
<string name="actionbar_upload_files">Archivos</string>
- <string name="actionbar_mkdir">Crear directorio</string>
- <string name="actionbar_search">Buscar</string>
- <string name="actionbar_settings">Ajustes</string>
+ <string name="actionbar_open_with">Abrir con</string>
+ <string name="actionbar_mkdir">Nueva carpeta</string>
+ <string name="actionbar_settings">Configuración</string>
+ <string name="actionbar_see_details">Detalles</string>
+ <string name="actionbar_send_file">Enviar</string>
<string name="prefs_category_general">General</string>
- <string name="prefs_category_trackmydevice">Rastreo de dispositivo</string>
- <string name="prefs_add_session">Agregar nueva sesión</string>
- <string name="prefs_create_img_thumbnails">Crear miniaturas de imagen</string>
- <string name="prefs_select_oc_account">Seleccionar una cuenta</string>
- <string name="prefs_summary_select_oc_account">Elige, cuál de tus cuentas la aplicación debería usar.</string>
- <string name="prefs_trackmydevice">Rastreo de dispositivo</string>
- <string name="prefs_trackmydevice_summary_off">Permitir la localización de tu dispositivo</string>
- <string name="prefs_trackmydevice_summary_on">La app realiza un seguimiento de este dispositivo</string>
- <string name="prefs_trackmydevice_interval">Intervalo de actualización</string>
- <string name="prefs_trackmydevice_interval_summary">Actualizar cada %1$s minutos</string>
+ <string name="prefs_category_more">Más</string>
<string name="prefs_accounts">Cuentas</string>
<string name="prefs_manage_accounts">Gestionar cuentas</string>
<string name="prefs_pincode">PIN de aplicación </string>
<string name="prefs_pincode_summary">Proteja su cliente</string>
- <string name="prefs_instant_upload">Habilita la subida instantánea</string>
+ <string name="prefs_instant_upload">Activar la subida instantánea</string>
<string name="prefs_instant_upload_summary">Subir instantáneamente las fotos tomadas por la cámara</string>
- <string name="auth_host_url">URL</string>
+ <string name="prefs_log_title">Habilitar registro</string>
+ <string name="prefs_log_summary">Esto es usado para registrar problemas</string>
+ <string name="prefs_log_title_history">Historia del Registro</string>
+ <string name="prefs_log_summary_history">Esto muestra los registros grabados</string>
+ <string name="prefs_log_delete_history_button">Eliminar Historial</string>
+ <string name="prefs_help">Ayuda</string>
+ <string name="prefs_recommend">Recomendar a un amigo</string>
+ <string name="prefs_feedback">Mensajes de retroalimentación</string>
+ <string name="prefs_imprint">Imprint</string>
+ <string name="recommend_subject">¡Prueba %1$s en tu teléfono inteligente!</string>
+ <string name="auth_check_server">Compruebe el servidor.</string>
+ <string name="auth_host_url">Dirección del servidor https://…</string>
<string name="auth_username">Nombre de usuario</string>
<string name="auth_password">Contraseña</string>
- <string name="auth_register">Soy nuevo en %1$s</string>
- <string name="new_session_uri_error">La URL dada es incorrecta</string>
- <string name="new_session_session_name_error">Nombre de sesión incorrecto</string>
+ <string name="auth_register">New to %1$s?</string>
<string name="sync_string_files">Archivos</string>
- <string name="uploader_no_file_selected">No se seleccionaron archivos para enviar</string>
- <string name="setup_hint_username">Nombre de usuario</string>
- <string name="setup_hint_password">Contraseña</string>
- <string name="setup_hint_address">Dirección web</string>
- <string name="setup_hint_show_password">¿Mostrar contraseña?</string>
- <string name="setup_title">Conectar a tu %1$s</string>
<string name="setup_btn_connect">Conectar</string>
<string name="uploader_btn_upload_text">Subir</string>
- <string name="uploader_wrn_no_account_title">No se encontraron cuentas</string>
+ <string name="uploader_top_message">Escoger carpeta de carga:</string>
+ <string name="uploader_wrn_no_account_title">No se encontró la cuenta</string>
<string name="uploader_wrn_no_account_text">No hay cuentas de %1$s en tu dispositivo. Por favor configura una cuenta primero.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Configuración</string>
<string name="uploader_wrn_no_account_quit_btn_text">Salir</string>
<string name="uploader_wrn_no_content_title">No hay contenido para subir</string>
<string name="uploader_wrn_no_content_text">Ningún contenido ha sido recibido. No hay nada que subir.</string>
<string name="uploader_error_forbidden_content">%1$s no está autorizado para acceder al contenido compartido</string>
- <string name="uploader_info_uploading">Enviando</string>
- <string name="uploader_btn_create_dir_text">Crear directorio para envío</string>
+ <string name="uploader_info_uploading">Subiendo...</string>
<string name="file_list_empty">No hay archivos en esta carpeta.\nPuedes añadir nuevos archivos con la opción \"Subir\" del menú.</string>
<string name="filedetails_select_file">Pulsa sobre un archivo para mostrar información adicional.</string>
<string name="filedetails_size">Tamaño:</string>
<string name="filedetails_created">Creado:</string>
<string name="filedetails_modified">Modificado:</string>
<string name="filedetails_download">Descargar</string>
- <string name="filedetails_sync_file">Actualizar</string>
- <string name="filedetails_redownload">Volver a descargar</string>
- <string name="filedetails_open">Abrir</string>
+ <string name="filedetails_sync_file">Actualizar archivo</string>
<string name="filedetails_renamed_in_upload_msg">El fichero fue renombrado como %1$s durante la subida</string>
+ <string name="action_share_file">Compartir</string>
+ <string name="action_unshare_file">Descompartir</string>
<string name="common_yes">Sí</string>
<string name="common_no">No</string>
<string name="common_ok">Aceptar</string>
<string name="common_cancel_upload">Cancelar subida</string>
<string name="common_cancel">Cancelar</string>
<string name="common_save_exit">Guardar & Salir</string>
- <string name="common_exit">Salir de %1$s</string>
<string name="common_error">Error</string>
+ <string name="common_loading">Cargando ...</string>
+ <string name="common_error_unknown">Error desconocido</string>
<string name="about_title">Acerca de</string>
+ <string name="change_password">Cambiar contraseña</string>
<string name="delete_account">Eliminar cuenta</string>
<string name="create_account">Crear cuenta</string>
- <string name="upload_chooser_title">Subir</string>
- <string name="uploader_info_dirname">Nombre de directorio</string>
+ <string name="upload_chooser_title">Subir desde...</string>
+ <string name="uploader_info_dirname">Nombre de la carpeta</string>
<string name="uploader_upload_in_progress_ticker">Subiendo...</string>
<string name="uploader_upload_in_progress_content">%1$d%% Subiendo %2$s</string>
<string name="uploader_upload_succeeded_ticker">Subido con éxito</string>
<string name="uploader_upload_succeeded_content_single">%1$s se ha subido con éxito</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d archivos se han subido con éxito</string>
<string name="uploader_upload_failed_ticker">Error en la subida</string>
<string name="uploader_upload_failed_content_single">La subida de %1$s no se pudo completar</string>
- <string name="uploader_upload_failed_content_multiple">Error de subida: %1$d/%2$d archivos fueron cargados</string>
<string name="downloader_download_in_progress_ticker">Descargando ...</string>
- <string name="downloader_download_in_progress_content">%1$s Descargada de %2$s</string>
+ <string name="downloader_download_in_progress_content">%1$d%% Descargado de %2$s</string>
<string name="downloader_download_succeeded_ticker">Descarga completa</string>
<string name="downloader_download_succeeded_content">%1$s se ha descargado con éxito</string>
<string name="downloader_download_failed_ticker">Falló la descarga</string>
<string name="downloader_download_failed_content">La descarga de %1$s no se pudo completar</string>
+ <string name="downloader_not_downloaded_yet">No descargado</string>
<string name="common_choose_account">Elige una cuenta</string>
- <string name="sync_string_contacts">Contactos</string>
<string name="sync_fail_ticker">Falló la sincronización</string>
<string name="sync_fail_content">La sincronización de %1$s s no se pudo completar</string>
+ <string name="sync_fail_content_unauthorized">Contraseña no válida para %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Se encontraron conflictos</string>
<string name="sync_conflicts_in_favourites_content">Falló la sincronización de contenidos de %1$d ficheros</string>
<string name="sync_fail_in_favourites_ticker">Fallos en la sincronización de contenidos</string>
- <string name="sync_fail_in_favourites_content">Los contenidos de %1$d ficheros no fueron sincronizados (%2$d conflictos)</string>
- <string name="use_ssl">Usar conexión segura</string>
- <string name="location_no_provider">%1$s no puede rastear tu dispositivo. Por favor chequea tu configuración de localización</string>
+ <string name="sync_fail_in_favourites_content">Los contenidos de %1$d ficheros no se han sincronizado (%2$d conflictos)</string>
+ <string name="sync_foreign_files_forgotten_ticker">Algunos archivos locales se han perdido</string>
+ <string name="sync_foreign_files_forgotten_content">%1$d archivos en la carpeta %2$s no pudieron ser copiados a</string>
+ <string name="sync_current_folder_was_removed">La carpeta local %1$s no existe.</string>
+ <string name="foreign_files_move">Mover todo</string>
+ <string name="foreign_files_success">Todos los archivos fueron movidos</string>
+ <string name="foreign_files_fail">No se han podido mover algunos archivos</string>
+ <string name="foreign_files_local_text">Local: %1$s</string>
+ <string name="foreign_files_remote_text">Remoto: %1$s</string>
+ <string name="upload_query_move_foreign_files">No hay suficiente espacio para copiar los archivos seleccionados en la carpeta %1$s. ¿Quiere moverlos en lugar de copiarlos?</string>
<string name="pincode_enter_pin_code">Por favor, inserta tu PIN de aplicación</string>
- <string name="pincode_enter_new_pin_code">Por favor, inserta tu nuevo PIN de aplicación</string>
<string name="pincode_configure_your_pin">Introduzca un PIN para la aplicación</string>
<string name="pincode_configure_your_pin_explanation">Se solicitará el PIN cada vez que se inicie la aplicación</string>
<string name="pincode_reenter_your_pincode">Repita el PIN para la aplicación, por favor</string>
<string name="pincode_wrong">PIN de aplicación incorrecto</string>
<string name="pincode_removed">PIN de aplicación borrado</string>
<string name="pincode_stored">PIN de aplicación guardado</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 minutos</item>
- <item>30 minutos</item>
- <item>60 minutos</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="media_notif_ticker">Reproductor de música %1$s</string>
+ <string name="media_state_playing">%1$s (reproduciendo)</string>
+ <string name="media_state_loading">%1$s (cargando)</string>
+ <string name="media_event_done">%1$s reproducción finalizada</string>
+ <string name="media_err_nothing_to_play">No se encuentra archivo de medio</string>
+ <string name="media_err_no_account">No se ha proporcionado cuenta</string>
+ <string name="media_err_not_in_owncloud">El archivo no esta en una cuenta valida </string>
+ <string name="media_err_unsupported">Codec No Soportado</string>
+ <string name="media_err_io">El archivo de medios no pudo ser leído </string>
+ <string name="media_err_malformed">Archivo no codificado correctamente</string>
+ <string name="media_err_timeout">Tiempo de espera agotado en el intento de reproducción</string>
+ <string name="media_err_invalid_progressive_playback">Archivo de medio no puede ser transmitido</string>
+ <string name="media_err_unknown">El archivo de medios no se puede reproducir con el reproductor de medios por defecto </string>
+ <string name="media_err_security_ex">Error de seguridad al intentar reproducir %1$s</string>
+ <string name="media_err_io_ex">Error de entrada al intentar reproducir %1$s</string>
+ <string name="media_err_unexpected">Error inesperado intentando reproducir %1$s</string>
+ <string name="media_rewind_description">Botón Rebobinado</string>
+ <string name="media_play_pause_description">Botón de reproducción o pausa </string>
+ <string name="media_forward_description">Botón avance rápido</string>
<string name="auth_trying_to_login">Intentado iniciar sesión...</string>
<string name="auth_no_net_conn_title">Sin conexión de red</string>
- <string name="auth_no_net_conn_message">No se ha detectado una conexión de red, chequea tu conexión a internet e intenta nuevamente.</string>
- <string name="auth_connect_anyway">Conectar de todos modos</string>
<string name="auth_nossl_plain_ok_title">Conexión segura no disponible.</string>
- <string name="auth_nossl_plain_ok_message">La aplicación no pudo establecer una conexión segura al servidor. Aunque no haya una conexión segura disponible, puedes continuar o cancelar.</string>
<string name="auth_connection_established">Conexión establecida</string>
<string name="auth_testing_connection">Probando conexión...</string>
<string name="auth_not_configured_title">Configuración de servidor en formato incorrecto</string>
- <string name="auth_not_configured_message">Parece que tu servidor no está correctamente configurado. Contacta a tu administrador para más detalles.</string>
+ <string name="auth_account_not_new">Una cuenta para el mismo usuario y servidor ya existen en el dispositivo</string>
+ <string name="auth_account_not_the_same">El usuario introducido no concuerda con el usuario de esta cuenta</string>
<string name="auth_unknown_error_title">Ocurrió un error desconocido</string>
- <string name="auth_unknown_error_message">Ocurrió un error desconocido. Por favor, contacta a los autores e incluye los registros de tu dispositivo.</string>
<string name="auth_unknown_host_title">No se pudo encontrar la dirección</string>
- <string name="auth_unknown_host_message">No se pudo encontrar el dirección introducida. Consulte la disponibilidad del servidor y la dirección e intenta nuevamete.</string>
<string name="auth_incorrect_path_title">Instancia de servidor no encontrada</string>
- <string name="auth_incorrect_path_message">La aplicación no pudo encontrar la instancia del servidor en la ruta de acceso dada. Por favor, compruebe la ruta de acceso e inténtelo de nuevo.</string>
<string name="auth_timeout_title">El servidor ha tardado demasiado en responder</string>
<string name="auth_incorrect_address_title">URL no válida</string>
<string name="auth_ssl_general_error_title">Falló la inicialización SSL</string>
- <string name="auth_ssl_unverified_server_title">Identidad del Servidor SSL no verificada</string>
+ <string name="auth_ssl_unverified_server_title">No fue posible verificar la identidad del servidor SLL</string>
<string name="auth_bad_oc_version_title">No se reconoce la versión del servidor </string>
<string name="auth_wrong_connection_title">No se ha podido establecer la conexión</string>
<string name="auth_secure_connection">Conexión segura establecida</string>
- <string name="auth_login_details">Detalles de inicio de sesión</string>
- <string name="auth_unauthorized">Nombre / contraseña incorrectos</string>
- <string name="auth_not_found">Ruta errónea</string>
- <string name="auth_internal">Error interno en el servidor, código %1$d</string>
- <string name="crashlog_message">La aplicación finalizó inesperadamente. ¿Desea enviar un reporte de error?</string>
- <string name="crashlog_send_report">Enviar reporte</string>
- <string name="crashlog_dont_send_report">No enviar reporte</string>
- <string name="extensions_avail_title">¡Extensiones disponibles!</string>
- <string name="extensions_avail_message">Parece que su servidor soporta extensiones avanzadas. ¿Desea ver las extensiones disponibles para Android?</string>
+ <string name="auth_unauthorized">Nombre de usuario o contraseña incorrecta</string>
+ <string name="auth_oauth_error">Autorización no satisfactoria</string>
+ <string name="auth_oauth_error_access_denied">Acceso denegado por servidor de autorización</string>
+ <string name="auth_wtf_reenter_URL">Estado inesperado; por favor, introduzca la URL del servidor de nuevo</string>
+ <string name="auth_expired_oauth_token_toast">Su autorización ha expirado. Por favor, autorice de nuevo</string>
+ <string name="auth_expired_basic_auth_toast">Por favor, introduzca la contraseña actual.</string>
+ <string name="auth_expired_saml_sso_token_toast">Tu sesión ha expirado. Por favor, intenta conectarte de nuevo</string>
+ <string name="auth_connecting_auth_server">Conectando al servidor de autenticación...</string>
+ <string name="auth_unsupported_auth_method">El servidor no soporta este método de autenticación</string>
+ <string name="auth_unsupported_multiaccount">%1$s no soporta cuentas múltiples</string>
+ <string name="auth_can_not_auth_against_server">No puede autenticarse en este servidor.</string>
<string name="fd_keep_in_sync">Mantener el archivo actualizado</string>
- <string name="common_share">Compartir</string>
<string name="common_rename">Renombrar</string>
<string name="common_remove">Borrar</string>
<string name="confirmation_remove_alert">¿Está seguro que desea borrar %1$s ?</string>
- <string name="confirmation_remove_folder_alert">¿Desea elimiar %1$s y sus descendientes?</string>
+ <string name="confirmation_remove_folder_alert">¿Desea eliminar %1$s y sus descendientes?</string>
<string name="confirmation_remove_local">Sólo local</string>
<string name="confirmation_remove_folder_local">Sólo ficheros locales</string>
<string name="confirmation_remove_remote">Eliminar del servidor</string>
<string name="rename_dialog_title">Introduzca un nombre nuevo</string>
<string name="rename_local_fail_msg">No se pudo cambiar el nombre de la copia local, trata con un nombre differente</string>
<string name="rename_server_fail_msg">No se pudo cambiar el nombre</string>
- <string name="sync_file_fail_msg">No pudo comprobarse el fichero remoto</string>
+ <string name="sync_file_fail_msg">No se ha podido comprobar el fichero remoto</string>
<string name="sync_file_nothing_to_do_msg">Ya está sincronizado</string>
- <string name="create_dir_fail_msg">El directorio no pudo ser creado</string>
+ <string name="create_dir_fail_msg">No se pudo crear la carpeta</string>
+ <string name="filename_forbidden_characters">Carácteres ilegales: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Espere un momento</string>
<string name="filedisplay_unexpected_bad_get_content">Problema inesperado; por favor, prueba otra app para seleccionar el archivo</string>
- <string name="filedisplay_no_file_selected">No fué seleccionado ningún archivo</string>
- <string name="ssl_validator_title">Atención</string>
+ <string name="filedisplay_no_file_selected">No hay ficheros seleccionados.</string>
+ <string name="activity_chooser_title">Enviar enlace a...</string>
+ <string name="oauth_check_onoff">Ingresar con oAuth2</string>
+ <string name="oauth_login_connection">Conectando al servidor oAuth2...</string>
<string name="ssl_validator_header">La identidad del sitio no puede ser verificada</string>
<string name="ssl_validator_reason_cert_not_trusted">- El certificado del servidor no es de confianza</string>
<string name="ssl_validator_reason_cert_expired">- El certificado del servidor expiró</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- El certificado del servidor es demasiado reciente</string>
<string name="ssl_validator_reason_hostname_not_verified">- La URL no coincide con el nombre de dominio del certificado</string>
- <string name="ssl_validator_certificate_not_available">No se pudo obtener el certificado del servidor</string>
<string name="ssl_validator_question">¿Confías de todas formas en este certificado?</string>
<string name="ssl_validator_not_saved">El certificado no pudo ser guardado</string>
<string name="ssl_validator_btn_details_see">Detalles</string>
<string name="ssl_validator_label_CN">Nombre común:</string>
<string name="ssl_validator_label_O">Organización:</string>
<string name="ssl_validator_label_OU">Unidad organizativa</string>
- <string name="ssl_validator_label_C">Pais:</string>
+ <string name="ssl_validator_label_C">País:</string>
<string name="ssl_validator_label_ST">Estado:</string>
<string name="ssl_validator_label_L">Ubicación:</string>
<string name="ssl_validator_label_validity">Validez:</string>
<string name="ssl_validator_label_validity_to">A:</string>
<string name="ssl_validator_label_signature">Firma:</string>
<string name="ssl_validator_label_signature_algorithm">Algoritmo:</string>
- <string name="text_placeholder">Es un marcador de posición</string>
- <string name="instant_upload_on_wifi">Subir imágenes sólo via WiFi</string>
+ <string name="ssl_validator_null_cert">No se ha podido mostrar el certificado</string>
+ <string name="ssl_validator_no_info_about_error">- No hay información acerca del error</string>
+ <string name="placeholder_sentence">Esto es un marcador de posición</string>
+ <string name="placeholder_filename">marcadordeposición.txt</string>
+ <string name="placeholder_filetype">Imagen PNG</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
+ <string name="instant_upload_on_wifi">Subir imágenes sólo cuando hay WiFi</string>
<string name="instant_upload_path">/SubidasInstantáneas</string>
<string name="conflict_title">Conflicto en la actualización</string>
<string name="conflict_message">El archivo remoto %s no está sincronizado con el archivo local. Si continúa, se reemplazará el contenido del archivo en el servidor.</string>
- <string name="conflict_keep_both">Mantener ambas</string>
+ <string name="conflict_keep_both">Mantener ambos</string>
<string name="conflict_overwrite">Sobrescribir</string>
<string name="conflict_dont_upload">No subir</string>
+ <string name="preview_image_description">Previsualización de imagen</string>
+ <string name="preview_image_error_unknown_format">No se puede mostrar la imagen</string>
+ <string name="error__upload__local_file_not_copied">%1$s no pudo ser copiado a la carpeta local %2$s</string>
+ <string name="actionbar_failed_instant_upload">Carga instantánea fallida</string>
+ <string name="failed_upload_headline_text">Cargas instantáneas fallidas</string>
+ <string name="failed_upload_headline_hint">Resumen de todas las cargas instantáneas fallidas</string>
+ <string name="failed_upload_all_cb">Seleccionar todos</string>
+ <string name="failed_upload_headline_retryall_btn">Reintentar todos los seleccionados</string>
+ <string name="failed_upload_headline_delete_all_btn">Eliminar todo de la cola de subida</string>
+ <string name="failed_upload_retry_text">Reintentar subida de imagen:</string>
+ <string name="failed_upload_load_more_images">Cargar mas imágenes</string>
+ <string name="failed_upload_retry_do_nothing_text">No hacer nada no está conectado para subida instantánea</string>
+ <string name="failed_upload_failure_text">Mensaje de error:</string>
+ <string name="failed_upload_quota_exceeded_text">Por favor revise su configuración de servidor, posiblemente su cuota se haya excedido.</string>
+ <string name="share_link_file_no_exist">No es posible compartir este archivo o carpeta. Asegúrese de que existe.</string>
+ <string name="share_link_file_error">Ocurrió un error al tratar de compartir este archivo o carpeta</string>
+ <string name="unshare_link_file_no_exist">No se puede dejar de compartir este archivo o carpeta. No existe.</string>
+ <string name="unshare_link_file_error">Ocurrió un error al tratar de ya no compartir este archivo o carpeta</string>
+ <string name="activity_chooser_send_file_title">Enviar</string>
+ <string name="copy_link">Copiar enlace</string>
+ <string name="clipboard_text_copied">Copiado al portapapeles</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Parool:</string>
- <string name="main_login">Kasutajanimi:</string>
- <string name="main_button_login">Logi sisse</string>
- <string name="main_welcome">Teretulemast sinu enda ownCloudi</string>
- <string name="main_files">Failid</string>
- <string name="main_music">uusika</string>
- <string name="main_contacts">ntaktid</string>
- <string name="main_calendar">Kalender</string>
- <string name="main_bookmarks">Järjehoidjad</string>
- <string name="main_settings">Seaded</string>
- <string name="main_tit_accsetup">Konto seadistamine</string>
- <string name="main_wrn_accsetup">Sinu seadmes pole ühtegi ownCloudi kontot. Selle rakenduse kasutamiseks pead sa ühe looma.</string>
- <string name="about_message">ownCloud Androidi klient\n\nversioon: %1$s</string>
- <string name="actionbar_sync">Värskenda</string>
+ <string name="about_android">%1$s Android App</string>
+ <string name="about_version">versioon %1$s</string>
+ <string name="actionbar_sync">Värskenda kontot</string>
<string name="actionbar_upload">Lae fail üles</string>
<string name="actionbar_upload_from_apps">Sisu teistest rakendustest</string>
<string name="actionbar_upload_files">Failid</string>
- <string name="actionbar_mkdir">Loo kaust</string>
- <string name="actionbar_search">Otsi</string>
+ <string name="actionbar_open_with">Ava rakendusega</string>
+ <string name="actionbar_mkdir">Uus kaust</string>
<string name="actionbar_settings">Seaded</string>
+ <string name="actionbar_see_details">Üksikasjad</string>
+ <string name="actionbar_send_file">Saada</string>
<string name="prefs_category_general">Üldine</string>
- <string name="prefs_category_trackmydevice">Seadme jälgimine</string>
- <string name="prefs_add_session">Lisa uus sessioon</string>
- <string name="prefs_create_img_thumbnails">Loo pisipildid</string>
- <string name="prefs_select_oc_account">Vali konto</string>
- <string name="prefs_summary_select_oc_account">Vali, milliseid sinu kontosid peaks rakendus kasutama.</string>
- <string name="prefs_trackmydevice">Seadme jälgimine</string>
- <string name="prefs_trackmydevice_summary_off">Luba ownCloudil jälgida oma seadme asukohta</string>
- <string name="prefs_trackmydevice_summary_on">Sinu ownCloud jälgib seda seadet</string>
- <string name="prefs_trackmydevice_interval">Uuendamise intervall</string>
- <string name="prefs_trackmydevice_interval_summary">Uuenda iga %1$s minuti tagant</string>
+ <string name="prefs_category_more">Rohkem</string>
<string name="prefs_accounts">Kontod</string>
<string name="prefs_manage_accounts">Halda kontosid</string>
- <string name="prefs_pincode">ownCloud rakenduse PIN</string>
- <string name="prefs_pincode_summary">Kaitse oma ownCloudi klienti</string>
+ <string name="prefs_pincode">Rakenduse PIN</string>
+ <string name="prefs_pincode_summary">Kaitse oma klienti</string>
<string name="prefs_instant_upload">Luba kohene üleslaadimine</string>
<string name="prefs_instant_upload_summary">Lae kaamera poolt tehtud fotod automaatselt üles</string>
- <string name="auth_host_url">ownCloudi URL</string>
+ <string name="prefs_log_title">Luba logimine</string>
+ <string name="prefs_log_summary">Kasutatakse probleemide logimiseks</string>
+ <string name="prefs_log_title_history">Logi ajalugu</string>
+ <string name="prefs_log_summary_history">See näitab salvestatud logisid</string>
+ <string name="prefs_log_delete_history_button">Kustuta ajalugu</string>
+ <string name="prefs_help">Abiinfo</string>
+ <string name="prefs_recommend">Soovita sõbrale</string>
+ <string name="prefs_feedback">Tagasiside</string>
+ <string name="prefs_imprint">Impressum</string>
+ <string name="recommend_subject">Proovi oma nutitelefonil rakendust %1$s!</string>
+ <string name="auth_check_server">Kontrolli serverit</string>
+ <string name="auth_host_url">Serveri aadress https://...</string>
<string name="auth_username">Kasutajanimi</string>
<string name="auth_password">Parool</string>
- <string name="auth_register">Olen uus ownCloudi kasutaja</string>
- <string name="new_session_uri_error">Anti vale URL</string>
- <string name="new_session_session_name_error">Vale sessiooni nimi</string>
+ <string name="auth_register">Uus %1$s kasutaja?</string>
<string name="sync_string_files">Failid</string>
- <string name="uploader_no_file_selected">Üleslaadimiseks pole ühtegi faili laetud</string>
- <string name="setup_hint_username">Kasutajanimi</string>
- <string name="setup_hint_password">Parool</string>
- <string name="setup_hint_address">Veebiaadress</string>
- <string name="setup_hint_show_password">Näita parooli?</string>
- <string name="setup_title">Ühenda oma ownCloudiga</string>
<string name="setup_btn_connect">Ühenda</string>
<string name="uploader_btn_upload_text">Lae üles</string>
+ <string name="uploader_top_message">Vali kataloog serveris: </string>
<string name="uploader_wrn_no_account_title">Kontot ei leitud</string>
- <string name="uploader_wrn_no_account_text">Selles seadmes pole ühtegi ownCloudi kontot. Palun seadista esmalt konto.</string>
+ <string name="uploader_wrn_no_account_text">Selles seadmes pole ühtegi %1$si kontot. Palun seadista esmalt konto.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Seadista</string>
<string name="uploader_wrn_no_account_quit_btn_text">Lõpeta</string>
<string name="uploader_wrn_no_content_title">Pole sisu, mida üles laadida</string>
<string name="uploader_wrn_no_content_text">Sisu ei saadud. Pole midagi üles laadida.</string>
- <string name="uploader_error_forbidden_content">ownCloudile pole lubatud ligipääs jagatud sisule</string>
+ <string name="uploader_error_forbidden_content">%1$sile pole lubatud ligipääs jagatud sisule</string>
<string name="uploader_info_uploading">Üleslaadimine</string>
- <string name="uploader_btn_create_dir_text">Loo üleslaadimise jaoks kaust</string>
<string name="file_list_empty">Selles kaustas pole ühtegi faili.\nUusi faile saab lisada kasutades menüü valikut \"Lae üles\".</string>
<string name="filedetails_select_file">Lisainfo vaatamiseks vajuta failile.</string>
<string name="filedetails_size">Suurus:</string>
<string name="filedetails_created">Loodud:</string>
<string name="filedetails_modified">Muudetud:</string>
<string name="filedetails_download">Lae alla</string>
- <string name="filedetails_sync_file">Värskenda</string>
- <string name="filedetails_redownload">Lae uuesti alla</string>
- <string name="filedetails_open">Ava</string>
+ <string name="filedetails_sync_file">Värskenda faili</string>
+ <string name="filedetails_renamed_in_upload_msg">Fail nimetati üleslaadimise käigus ümber %1$ </string>
+ <string name="action_share_file">Jaga linki</string>
+ <string name="action_unshare_file">Tühista lingi jagamine</string>
<string name="common_yes">Jah</string>
<string name="common_no">Ei</string>
<string name="common_ok">OK</string>
<string name="common_cancel_upload">Tühista üleslaadimine</string>
<string name="common_cancel">Loobu</string>
<string name="common_save_exit">Salvesta & Välju</string>
- <string name="common_exit">Lahku ownCloudist</string>
<string name="common_error">Viga</string>
+ <string name="common_loading">Laadimine ...</string>
+ <string name="common_error_unknown">Tundmatu viga</string>
<string name="about_title">Info</string>
+ <string name="change_password">Muuda parooli</string>
<string name="delete_account">Kustuta konto</string>
<string name="create_account">Loo konto</string>
<string name="upload_chooser_title">Lae fail üles kohast ...</string>
<string name="uploader_upload_in_progress_content">%1$d%% üleslaadimine %2$s</string>
<string name="uploader_upload_succeeded_ticker">Üleslaadimine oli edukas</string>
<string name="uploader_upload_succeeded_content_single">%1$s laeti üles</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d faili laeti üles</string>
<string name="uploader_upload_failed_ticker">Üleslaadimine ebaõnnestus</string>
<string name="uploader_upload_failed_content_single">%1$s üleslaadimise lõpetamine ebaõnnestus</string>
- <string name="uploader_upload_failed_content_multiple">Üleslaadimine ebaõnnestus: %1$d/%2$d faili laeti üles</string>
<string name="downloader_download_in_progress_ticker">Allalaadimine ...</string>
<string name="downloader_download_in_progress_content">%1$d%% allalaadimine %2$s</string>
<string name="downloader_download_succeeded_ticker">Allalaadimine oli edukas</string>
<string name="downloader_download_succeeded_content">%1$s laeti alla</string>
<string name="downloader_download_failed_ticker">Allalaadimine ebaõnnestus</string>
<string name="downloader_download_failed_content">%1$s allalaadimist ei õnnestunud lõpetada</string>
+ <string name="downloader_not_downloaded_yet">Allalaadimata</string>
<string name="common_choose_account">Vali konto</string>
- <string name="sync_string_contacts">Kontaktid</string>
<string name="sync_fail_ticker">Sünkroniseerimine ebaõnnestus</string>
<string name="sync_fail_content">%1$s sünkroniseerimise lõpetamine ebaõnnestus</string>
+ <string name="sync_fail_content_unauthorized">Vigane parool %1$s jaoks</string>
<string name="sync_conflicts_in_favourites_ticker">Leite konflikte</string>
- <string name="use_ssl">Kasuta turvalist ühendust</string>
- <string name="location_no_provider">ownCloud ei saa sinu seadet jälgida. Palun kontrolli oma asukoha seadeid</string>
+ <string name="sync_conflicts_in_favourites_content">%1$d sünkroniseeritavad faile ei suudeta sünkroniseerida</string>
+ <string name="sync_fail_in_favourites_ticker">Sünkroniseeritavad failid ebaõnnestusid</string>
+ <string name="sync_fail_in_favourites_content">Faili %1$d sisu ei suudeta sünkroniseerida (konflikt %2$d)</string>
+ <string name="sync_foreign_files_forgotten_ticker">Osad kohalikud faili ununesid</string>
+ <string name="sync_foreign_files_forgotten_content">%1$d faili %2$s kataloogis ei saa kopeerida</string>
+ <string name="sync_foreign_files_forgotten_explanation">Alates versioonist 1.3.16 failid, mis on üles laaditud kopeeritakse kohalikku kataloogi %1$s vältimaks andmete kadu vältimaks andmete kadu juhul, kui ühte faili sünkroniseeritakse mitmelt kontolt.\n\nSelle muudatusega seoses kõik failid, mis on üles laetud rakenduse vanemate versioonidega, kopeeriti kataloogi %2$s. Selle tegevuse peatas viga, mis tekkis konto sünkroniseerimise käigus. Sa saad jätta faili(d) nagu nad on ning eemaldata viite %3$s või tõsta faili(d) %1$s kataloogi ja säilitada viite %4$s. \n\nAllpool on loend kohalikest failidest ning serveris asuvatest failidest %5$s, millele nad viitavad.</string>
+ <string name="sync_current_folder_was_removed">Kausta %1$s pole enam olemas</string>
+ <string name="foreign_files_move">Tõsta kõik ümber</string>
+ <string name="foreign_files_success">Kõik failid tõsteti ümber</string>
+ <string name="foreign_files_fail">Mõningaid faile ei saa ümber tõsta</string>
+ <string name="foreign_files_local_text">Kohalik: %1$s</string>
+ <string name="foreign_files_remote_text">Serveris: %1$s</string>
+ <string name="upload_query_move_foreign_files">Pole piisavalt ruumi kopeerimaks valitud faile kataloogi %1$s. Soovid kopeerimise asemel neid ümber tõsta?</string>
<string name="pincode_enter_pin_code">Palun sisesta oma rakenduse PIN</string>
- <string name="pincode_enter_new_pin_code">Palun sisesta oma rakenduse uus PIN</string>
- <string name="pincode_configure_your_pin">Palun ownCloudi rakenduse PIN</string>
+ <string name="pincode_configure_your_pin">Sisesta oma rakenduse PIN</string>
<string name="pincode_configure_your_pin_explanation">PIN-i nõutakse iga kord, kui rakendus käivitatakse</string>
- <string name="pincode_reenter_your_pincode">Palun sisesta oma ownCloudi rakenduse PIN uuesti</string>
- <string name="pincode_remove_your_pincode">Eemalda oma ownCloud rakenduse PIN</string>
- <string name="pincode_mismatch">Mõlemad ownCloudi rakenduse PIN-id pole samad</string>
- <string name="pincode_wrong">Vigane ownCloudii rakenduse PIN</string>
- <string name="pincode_removed">ownCloud rakenduse PIN on eemaldatud</string>
- <string name="pincode_stored">ownCloud rakenduse PIN on salvestatud</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 minutit</item>
- <item>30 minutit</item>
- <item>60 minutit</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_reenter_your_pincode">Palun sisesta oma rakenduse PIN uuesti</string>
+ <string name="pincode_remove_your_pincode">Eemalda oma rakenduse PIN</string>
+ <string name="pincode_mismatch">Mõlemad rakenduse PIN-id pole samad</string>
+ <string name="pincode_wrong">Vigane rakenduse PIN</string>
+ <string name="pincode_removed">Rakenduse PIN on eemaldatud</string>
+ <string name="pincode_stored">Rakenduse PIN on salvestatud</string>
+ <string name="media_notif_ticker">%1$s muusika mängija</string>
+ <string name="media_state_playing">%1$s (mängib)</string>
+ <string name="media_state_loading">%1$s (laeb)</string>
+ <string name="media_event_done">%1$s esitus lõpetatud</string>
+ <string name="media_err_nothing_to_play">Meedia faili ei leitud</string>
+ <string name="media_err_no_account">Ühtegi kontot pole antud</string>
+ <string name="media_err_not_in_owncloud">Fail ei kuulu õigele kontole</string>
+ <string name="media_err_unsupported">Mittetoetatud meedia koodek</string>
+ <string name="media_err_io">Ei suuda lugeda meediafaili</string>
+ <string name="media_err_malformed">Meediafail pole korralikult kodeeritud</string>
+ <string name="media_err_timeout">Esitamise ajal aegunud</string>
+ <string name="media_err_invalid_progressive_playback">Ei suuda voogesitada meediafaili</string>
+ <string name="media_err_unknown">Meediafaili ei saa mängida Stock Media Player-iga</string>
+ <string name="media_err_security_ex">Turbe viga %1$s esitamisel</string>
+ <string name="media_err_io_ex">Sisendi viga %1$s esitamisel</string>
+ <string name="media_err_unexpected">Ootamatu viga %1$s esitamisel</string>
+ <string name="media_rewind_description">Tagasikerimise nupp</string>
+ <string name="media_play_pause_description">Mängimise või pausi nupp</string>
+ <string name="media_forward_description">Kiire kerimise nupp</string>
<string name="auth_trying_to_login">Proovitakse sisse logida...</string>
<string name="auth_no_net_conn_title">Võrguühendust pole</string>
- <string name="auth_no_net_conn_message">Internetiühendust ei leitud, kontrolli oma interneti ühendust ja proovi uuesti.</string>
- <string name="auth_connect_anyway">Ühenda sellegipoolest</string>
<string name="auth_nossl_plain_ok_title">Turvaline ühendus pole saadaval</string>
- <string name="auth_nossl_plain_ok_message">Rakendus ei suutnud serveriga turvalist ühendust luua. Kuid saadaval on mitteturvaline ühendus. Sa võid jätkata või loobuda.</string>
<string name="auth_connection_established">Saadi ühendus</string>
<string name="auth_testing_connection">Ühenduse testimine...</string>
- <string name="auth_not_configured_title">Vigases vormingus ownCloud seadistus</string>
- <string name="auth_not_configured_message">Näib, et sinu ownCloud pole korralikult seadistatud. Lisainfo saamiseks võta ühendust oma administraatoriga.</string>
+ <string name="auth_not_configured_title">Vigases vormingus server seadistus</string>
+ <string name="auth_account_not_new">Sama konto kasutaja ja server on juba selles seadmes olemas</string>
+ <string name="auth_account_not_the_same">Sisestatud kasutaja ei kattu selle konto kasutajaga</string>
<string name="auth_unknown_error_title">Tekkis tundmatu tõrge!</string>
- <string name="auth_unknown_error_message">Tekkis tundmatu tõrge. Palun võta autoritega ühendust ja kaasa oma seadme logid.</string>
<string name="auth_unknown_host_title">Hosti ei leitud</string>
- <string name="auth_unknown_host_message">Sisestatud hosti ei leitud. Palun kontrolli hostiinme ja serveri kättesaadavust ning proovi seejärel uuesti.</string>
- <string name="auth_incorrect_path_title">ownCloud protsessi ei leitud</string>
- <string name="auth_incorrect_path_message">Rakendus antud asukohast ownCloundi. Palun kontrolli asukohta ja proovi uuesti.</string>
+ <string name="auth_incorrect_path_title">server protsessi ei leitud</string>
<string name="auth_timeout_title">Serveri vastus võttis liiga kaua aega</string>
<string name="auth_incorrect_address_title">Vigases vormingus URL</string>
<string name="auth_ssl_general_error_title">SSL-i käivitamine ebaõnnestus</string>
- <string name="auth_ssl_unverified_server_title">Kinnitamata SSL serveri identiteet</string>
- <string name="auth_bad_oc_version_title">Tundmatu ownCloud serveri versioon</string>
+ <string name="auth_ssl_unverified_server_title">Serveri SSL identiteedi tuvastamine ebaõnnestus</string>
+ <string name="auth_bad_oc_version_title">Tundmatu serveri versioon</string>
<string name="auth_wrong_connection_title">Ühenduse loomine ebaõnnestus</string>
<string name="auth_secure_connection">Saavutati turvaline ühendus</string>
- <string name="auth_login_details">Sisselogimise andmed</string>
- <string name="auth_unauthorized">Vigane kasutajanimi /parool</string>
- <string name="auth_not_found">Sisestati vale asukoht</string>
- <string name="auth_internal">Sisemine serveri viga, kood %1$d</string>
- <string name="crashlog_message">Rakdnus suleti ootamatult. Kas sa sooviksid saata kokkujooksmise kohta teavitust arendajale?</string>
- <string name="crashlog_send_report">Saada veateade</string>
- <string name="crashlog_dont_send_report">Ära saada veateadet</string>
- <string name="extensions_avail_title">Saadaval on lisaprogrammid!</string>
- <string name="extensions_avail_message">Näib, et sinu ownCloud toetab laienduste kasutamist. Kas sa sooviksid näha androidile saada olevaid lisaprogramme ?</string>
+ <string name="auth_unauthorized">Vale kasutajanimi või parool</string>
+ <string name="auth_oauth_error">Autoriseerimine ebaõnnestus</string>
+ <string name="auth_oauth_error_access_denied">Ligipääs keelatud autoriseeriva serveri poolt</string>
+ <string name="auth_wtf_reenter_URL">Ootamatu seisund; palun sisesta serveri URL uuesti</string>
+ <string name="auth_expired_oauth_token_toast">Sinu autoriseerimine aegus. Palun autoriseeri uuesti</string>
+ <string name="auth_expired_basic_auth_toast">Palun sisesta kehtiv parool</string>
+ <string name="auth_expired_saml_sso_token_toast">Sinu sessioon aegus. Palun ühenda uuesti</string>
+ <string name="auth_connecting_auth_server">Autentimisserveriga ühendumine ...</string>
+ <string name="auth_unsupported_auth_method">See server ei toeta seda autentimise viisi</string>
+ <string name="auth_unsupported_multiaccount">%1$s ei toeta mitme konto kasutamist</string>
+ <string name="auth_can_not_auth_against_server">Ei suuda autoriseerida selle serveriga.</string>
<string name="fd_keep_in_sync">Hoia faili ajakohasena</string>
- <string name="common_share">Jaga</string>
<string name="common_rename">Nimeta ümber</string>
<string name="common_remove">Eemalda</string>
<string name="confirmation_remove_alert">Oled sa kindel, et soovid %1$s eemaldada ?</string>
<string name="confirmation_remove_local">Ainult kohalik</string>
<string name="confirmation_remove_folder_local">Ainult kohalik sisu</string>
<string name="confirmation_remove_remote">Eemalda serverist</string>
- <string name="confirmation_remove_remote_and_local">Mõlemad nii eemalolev kui ka kohalik</string>
+ <string name="confirmation_remove_remote_and_local">Eemalolev ja kohalik</string>
<string name="remove_success_msg">Eemaldamine oli edukas</string>
- <string name="remove_fail_msg">Eemaldamist ei suudetud lõpetada</string>
+ <string name="remove_fail_msg">Eemaldamine ebaõnnestus</string>
<string name="rename_dialog_title">Sisesta uus nimi</string>
<string name="rename_local_fail_msg">Kohalikku faili ei saa ümber nimetada; proovi teist uut nime</string>
<string name="rename_server_fail_msg">Ümbernimetamine ebaõnnestus</string>
<string name="sync_file_fail_msg">Mujaloleva faili kontrollimine ebaõnnestus</string>
<string name="sync_file_nothing_to_do_msg">Faili sisu on juba sünkroniseeritud</string>
- <string name="create_dir_fail_msg">Kausta loomine ebaõnnestus</string>
+ <string name="create_dir_fail_msg">Kataloogi ei saa tekitada</string>
+ <string name="filename_forbidden_characters">Keelatud sümbolid: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Oota hetk</string>
<string name="filedisplay_unexpected_bad_get_content">Ootamatu tõrge ; palun kasuta faili valimiseks mõnda teist rakendust</string>
<string name="filedisplay_no_file_selected">Ühtegi faili pole valitud</string>
- <string name="ssl_validator_title">Hoiatus</string>
+ <string name="activity_chooser_title">Saada link</string>
+ <string name="oauth_check_onoff">Logi sisse oAuth2-ga</string>
+ <string name="oauth_login_connection">oAuth2 serveriga ühendumine...</string>
<string name="ssl_validator_header">Saidi identiteeti ei suudetud kinnitada</string>
<string name="ssl_validator_reason_cert_not_trusted">- Serveri sertifikaat pole usaldusväärne</string>
<string name="ssl_validator_reason_cert_expired">- Serveri sertifikaat on aegunud</string>
- <string name="ssl_validator_reason_cert_not_yet_valid">- Serveri sertifikaat on liiga noor</string>
+ <string name="ssl_validator_reason_cert_not_yet_valid">- Serveri sertifikaat kehtivad kuupäevad on alles tulevikus</string>
<string name="ssl_validator_reason_hostname_not_verified">- URL ei kattu sertifikaadis oleva hostinimega</string>
- <string name="ssl_validator_certificate_not_available">Serveri sertifikaati ei õnnestunud hankida</string>
<string name="ssl_validator_question">Kas sa soovid siiski seda sertifikaati usaldada?</string>
<string name="ssl_validator_not_saved">Sertifikaadi salvestamine ebaõnnestus</string>
<string name="ssl_validator_btn_details_see">Üksikasjad</string>
<string name="ssl_validator_btn_details_hide">Peida</string>
+ <string name="ssl_validator_label_subject">Väljastatud:</string>
+ <string name="ssl_validator_label_issuer">Väljastaja:</string>
+ <string name="ssl_validator_label_CN">Üldnimetus:</string>
<string name="ssl_validator_label_O">Organisatsioon:</string>
<string name="ssl_validator_label_OU">Organisatsiooni üksus:</string>
<string name="ssl_validator_label_C">Riik:</string>
<string name="ssl_validator_label_ST">Maakond:</string>
<string name="ssl_validator_label_L">Asukoht:</string>
<string name="ssl_validator_label_validity">Kehtivus:</string>
+ <string name="ssl_validator_label_validity_from">Saatja:</string>
+ <string name="ssl_validator_label_validity_to">Saaja:</string>
<string name="ssl_validator_label_signature">Allkiri:</string>
<string name="ssl_validator_label_signature_algorithm">Algoritm:</string>
- <string name="text_placeholder">See on kohahoidja</string>
+ <string name="ssl_validator_null_cert">Ei suuda kuvada sertifikaati.</string>
+ <string name="ssl_validator_no_info_about_error">- Vea kohta puudub info</string>
+ <string name="placeholder_sentence">See on kohahoidja</string>
+ <string name="placeholder_filename">placeholder.txt</string>
+ <string name="placeholder_filetype">PNG pilt</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Lae pilte üles ainult läbi WiFi</string>
<string name="instant_upload_path">/InstantUpload</string>
<string name="conflict_title">Uuenduse konflikt</string>
+ <string name="conflict_message">Serveris asuvat faili ei sünkroniseeritud kohaliku failiga. Jätkates kirjutatakse serveris asuva faili sisu üle.</string>
<string name="conflict_keep_both">Säilita mõlemad</string>
<string name="conflict_overwrite">Kirjuta üle</string>
<string name="conflict_dont_upload">Ära uuenda</string>
+ <string name="preview_image_description">Pildi eelvaade</string>
+ <string name="preview_image_error_unknown_format">Seda pilti ei saa näidata</string>
+ <string name="error__upload__local_file_not_copied">%1$s ei suudetud kopeerida kohalikku kataloogi %2$s</string>
+ <string name="actionbar_failed_instant_upload">Ebaõnnestunud kohene üleslaadimine</string>
+ <string name="failed_upload_headline_text">Ebaõnnestunud kohesed üleslaadimised</string>
+ <string name="failed_upload_headline_hint">Kõikide ebaõnnestunud üleslaadimiste kokkuvõte</string>
+ <string name="failed_upload_all_cb">vali kõik</string>
+ <string name="failed_upload_headline_retryall_btn">proovi uuesti kõik valitud</string>
+ <string name="failed_upload_headline_delete_all_btn">eemalda kõik valitud üleslaadimise järjekorrast</string>
+ <string name="failed_upload_retry_text">proovi uuesti pilti üles laadida:</string>
+ <string name="failed_upload_load_more_images">Lae veel pilte</string>
+ <string name="failed_upload_retry_do_nothing_text">ära tee midagi, sa pole võrku ühendatud koheseks üleslaadimiseks</string>
+ <string name="failed_upload_failure_text">Veateade:</string>
+ <string name="failed_upload_quota_exceeded_text">Palun kontrolli oma serveri seadeid, võib-olla on mahulimiit ületatud.</string>
+ <string name="share_link_file_no_exist">Antud faili või kausta ei saa jagada. Tee kindlaks, et see on olemas</string>
+ <string name="share_link_file_error">Faili või kausta jagamisel esines viga</string>
+ <string name="unshare_link_file_no_exist">Antud faili või kausta jagamist pole võimalik tühistada</string>
+ <string name="unshare_link_file_error">Faili või kausta jagamise tühistamisel esines viga</string>
+ <string name="activity_chooser_send_file_title">Saada</string>
+ <string name="copy_link">Kopeeri link</string>
+ <string name="clipboard_text_copied">Kopeeritud lõikepuhvrisse</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
-<resources/>
+<resources>
+ <string name="filedetails_download">Deskargatu</string>
+ <string name="common_cancel">Ezeztatu</string>
+</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Pasahitza:</string>
- <string name="main_login">Erabiltzaile izena:</string>
- <string name="main_button_login">Saioa hasi</string>
- <string name="main_welcome">Ongi etorria zure ownCloudera</string>
- <string name="main_files">Fitxategiak</string>
- <string name="main_music">Musika</string>
- <string name="main_contacts">Kontaktuak</string>
- <string name="main_calendar">Egutegia</string>
- <string name="main_bookmarks">Laster-markak</string>
- <string name="main_settings">Ezarpenak</string>
- <string name="main_tit_accsetup">Konfiguratu kontua</string>
- <string name="main_wrn_accsetup"> Ez dago ownCloud konturik zure gailuan. Programa hau erabiltzeko, kontu bat sortu behar duzu.</string>
- <string name="about_message">ownCloud Android bezeroa\n\nBertsioa: %1$s</string>
- <string name="actionbar_sync">Birkargatu</string>
+ <string name="about_android">%1$s Android Aplikazioa</string>
+ <string name="about_version">%1$s bertsioa</string>
+ <string name="actionbar_sync">Freskatu kontua</string>
<string name="actionbar_upload">Igo fitxategia</string>
<string name="actionbar_upload_from_apps">Beste app-en edukia</string>
<string name="actionbar_upload_files">Fitxategiak</string>
- <string name="actionbar_mkdir">Sortu karpeta</string>
- <string name="actionbar_search">Bilatu</string>
+ <string name="actionbar_open_with">Ireki honekin</string>
+ <string name="actionbar_mkdir">Karpeta berria</string>
<string name="actionbar_settings">Ezarpenak</string>
+ <string name="actionbar_see_details">Xehetasunak</string>
+ <string name="actionbar_send_file">Bidali</string>
<string name="prefs_category_general">Orokorra</string>
- <string name="prefs_category_trackmydevice">Gailuaren jarraipena</string>
- <string name="prefs_add_session">Gehitu saio berria</string>
- <string name="prefs_create_img_thumbnails">Sortu irudien koadro txikiak</string>
- <string name="prefs_select_oc_account">Aukeratu kontu bat</string>
- <string name="prefs_summary_select_oc_account">Aukeratu aplikazioak ze kontu erabiliko duen. </string>
- <string name="prefs_trackmydevice">Gailuaren jarraipena</string>
- <string name="prefs_trackmydevice_summary_off">Gaitu ownCloud zure gailuaren kokapena jarraitzeari</string>
- <string name="prefs_trackmydevice_summary_on">ownCloudek gailu honen jarraipena egiten du</string>
- <string name="prefs_trackmydevice_interval">Eguneraketa tartea</string>
- <string name="prefs_trackmydevice_interval_summary">Eguneratu %1$s minuturo</string>
+ <string name="prefs_category_more">Gehiago</string>
<string name="prefs_accounts">Kontuak</string>
<string name="prefs_manage_accounts">Kontuak kudeatu</string>
- <string name="prefs_pincode">ownCloud App PIN</string>
- <string name="prefs_pincode_summary">Babestu zure ownCloud bezeroa</string>
+ <string name="prefs_pincode">App PIN</string>
+ <string name="prefs_pincode_summary">Babestu zure bezeroa</string>
<string name="prefs_instant_upload">Gaitu berehalako igoera</string>
<string name="prefs_instant_upload_summary">Igo berehala kamerak ateratako argazkiak</string>
- <string name="auth_host_url">ownCloud URL</string>
+ <string name="prefs_log_title">Gaitu erregistroa</string>
+ <string name="prefs_log_summary">Arazoen erregistroa gordetzeko erabiltzen da</string>
+ <string name="prefs_log_title_history">Erregistro historia</string>
+ <string name="prefs_log_summary_history">Honek gordetako erregistroak bistaratzen ditu.</string>
+ <string name="prefs_log_delete_history_button">Ezabatu historia</string>
+ <string name="prefs_help">Laguntza</string>
+ <string name="prefs_recommend">Lagun bati aholkatu</string>
+ <string name="prefs_feedback">Oharrak</string>
+ <string name="prefs_imprint">Imprint</string>
+ <string name="recommend_subject">Probatu %1$s zure telefono adimentsuan!</string>
+ <string name="auth_check_server">Egiaztatu zerbitzaria</string>
+ <string name="auth_host_url">Zerbitzariaren helbidea https://</string>
<string name="auth_username">Erabiltzaile izena</string>
<string name="auth_password">Pasahitza</string>
- <string name="auth_register">Berria naiz ownCloud-en</string>
- <string name="new_session_uri_error">Emandako URLa gaizki dago</string>
- <string name="new_session_session_name_error">Saio izen okerra</string>
+ <string name="auth_register">Berria %1$s-n?</string>
<string name="sync_string_files">Fitxategiak</string>
- <string name="uploader_no_file_selected">Ez duzu igotzeko fitxategirik hautatu</string>
- <string name="setup_hint_username">Erabiltzaile izena</string>
- <string name="setup_hint_password">Pasahitza</string>
- <string name="setup_hint_address">Web helbidea</string>
- <string name="setup_hint_show_password">Bistaratu pasahitza?</string>
- <string name="setup_title">Konektatu zure ownCloudera</string>
<string name="setup_btn_connect">Konektatu</string>
<string name="uploader_btn_upload_text">Igo</string>
<string name="uploader_wrn_no_account_title">Ez da konturik aurkitu</string>
- <string name="uploader_wrn_no_account_text">Zure gailuan ez dago ownCloud konturik. Mesedez konfiguratu kontu bat lehenengo.</string>
+ <string name="uploader_wrn_no_account_text">Zure gailuan ez dago %1$s konturik. Mesedez konfiguratu kontu bat lehenengo.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Konfiguratu</string>
<string name="uploader_wrn_no_account_quit_btn_text">Irten</string>
<string name="uploader_wrn_no_content_title">Ez dago igotzeko edukirik</string>
<string name="uploader_wrn_no_content_text">Ez da edukirik jaso. Ez dago ezer igotzeko.</string>
<string name="uploader_error_forbidden_content">%1$s-(e)k ez du baimenik elkarbanatutako edukian sartzeko</string>
<string name="uploader_info_uploading">Igotzen</string>
- <string name="uploader_btn_create_dir_text">Sortu igotzeko karpeta bat</string>
<string name="file_list_empty">Ez dago fitxategirik karpeta honetan.\nFitxategi berriak \"Igo\" menu aukerarekin gehi daitezke.</string>
<string name="filedetails_select_file">Sakatu fitxategi baten gainean informazio gehiago lortzeko</string>
<string name="filedetails_size">Tamaina:</string>
<string name="filedetails_created">Sortuta:</string>
<string name="filedetails_modified">Aldatuta:</string>
<string name="filedetails_download">Deskargatu</string>
- <string name="filedetails_sync_file">Birkargatu</string>
- <string name="filedetails_redownload">Birdeskargatzen</string>
- <string name="filedetails_open">Ireki</string>
+ <string name="filedetails_sync_file">Freskatu fitxaegia</string>
<string name="filedetails_renamed_in_upload_msg">Fitxategiaren izena %1$sra aldatu da igotzean</string>
+ <string name="action_share_file">Elkarbanatu lotura</string>
+ <string name="action_unshare_file">Lotura partekatzeari utzi</string>
<string name="common_yes">Bai</string>
<string name="common_no">Ez</string>
<string name="common_ok">Ados</string>
<string name="common_cancel_upload">Ezeztatu igoera</string>
<string name="common_cancel">Ezeztatu</string>
<string name="common_save_exit">Gorde eta Irten</string>
- <string name="common_exit">Utzi ownCloud</string>
<string name="common_error">Errorea</string>
+ <string name="common_loading">Kargatzen ...</string>
+ <string name="common_error_unknown">Errore ezezaguna</string>
<string name="about_title">Honi buruz</string>
+ <string name="change_password">Aldatu pasahitza</string>
<string name="delete_account">Ezabatu kontua</string>
<string name="create_account">Sortu kontua</string>
<string name="upload_chooser_title">Igo fitxategia hemendik ...</string>
<string name="uploader_upload_in_progress_content">%1$d%% Igotzen %2$s</string>
<string name="uploader_upload_succeeded_ticker">Igotzea ongi burutu da</string>
<string name="uploader_upload_succeeded_content_single">%1$s ongi igo da</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d fitxategi ongi igo dira</string>
<string name="uploader_upload_failed_ticker">igotzeak huts egin du</string>
<string name="uploader_upload_failed_content_single">%1$s fitxategiaren igoera ezin izan da burutu</string>
- <string name="uploader_upload_failed_content_multiple">Igoerak huts egin du: %1$d/%2$d fitxategi igo dira</string>
<string name="downloader_download_in_progress_ticker">Deskargatzen ...</string>
<string name="downloader_download_in_progress_content">%1$d%% Deskargatzen %2$s</string>
<string name="downloader_download_succeeded_ticker">Deskarga ongi burutu da</string>
<string name="downloader_download_succeeded_content">%1$s ongi deskargatu da</string>
<string name="downloader_download_failed_ticker">Deskargak huts egin du</string>
<string name="downloader_download_failed_content">%1$s fitxategiaren deskarga ezin izan da burutu</string>
+ <string name="downloader_not_downloaded_yet">Oraindik deskargatu gabe</string>
<string name="common_choose_account">Hautatu kontua</string>
- <string name="sync_string_contacts">Kontaktuak</string>
<string name="sync_fail_ticker">Sinkronizazioak huts egin du</string>
<string name="sync_fail_content">%1$s fitxategiaren sinkronizazioa ezin da burutu</string>
+ <string name="sync_fail_content_unauthorized">Okerreko pasahitza %1$s-rako</string>
<string name="sync_conflicts_in_favourites_ticker">Gatazkak aurkituak </string>
<string name="sync_conflicts_in_favourites_content">sinkronizatu beharreko %1$d fitxategiak ezin dira sinkronizatu</string>
<string name="sync_fail_in_favourites_ticker">edukien sinkronizazioak huts egin du</string>
<string name="sync_fail_in_favourites_content">%1$d fitxategien edukiak ezin dira sinkronizatu (%2$d gatazka)</string>
- <string name="use_ssl">Erabili konexio segurua</string>
- <string name="location_no_provider">ownCloudek ezin du zure gailua jarraitu. Mesedez begiratu zure kokapen ezarpenak</string>
+ <string name="sync_foreign_files_forgotten_ticker">Bertako fitxategi batzuk ahaztu dira</string>
+ <string name="sync_current_folder_was_removed">%1$s karpeta dagoeneko ez da existitzen</string>
+ <string name="foreign_files_move">Mugitu denak</string>
+ <string name="foreign_files_success">Fitxategi guztiak mugitu dira</string>
+ <string name="foreign_files_fail">Fitxategi batzuk ezin dira mugitu</string>
+ <string name="foreign_files_local_text">Bertakoa: %1$s</string>
+ <string name="foreign_files_remote_text">Urrunekoa: %1$s</string>
+ <string name="upload_query_move_foreign_files">Ez dago leku nahikorik hautatutako fitxategiak %1$s karpetan kopiatzeko. Nahi al duzu kopiatu ordez bertara mugitzea?</string>
<string name="pincode_enter_pin_code">Mesedez, sartu zure aplikazioaren PINa</string>
- <string name="pincode_enter_new_pin_code">Mesedez, sartu zure aplikazioaren PIN berria</string>
- <string name="pincode_configure_your_pin">Sartu ownCloud aplikazioaren PINa</string>
+ <string name="pincode_configure_your_pin">Sartu aplikazioaren PINa</string>
<string name="pincode_configure_your_pin_explanation">PINa aplikazioa abiarazten den bakoitzean eskatuko da</string>
- <string name="pincode_reenter_your_pincode">Sartu berriz ownCloud aplikazioarenPINa, mesedez</string>
- <string name="pincode_remove_your_pincode">Ezabatu zure ownCloud aplikazioaren PINa</string>
- <string name="pincode_mismatch">ownCloud aplikazioko bi PINak ez dira berdinak</string>
- <string name="pincode_wrong">ownCloud aplikazioaren PINa ezda zuzena</string>
- <string name="pincode_removed">ownCloud aplikazioaren PINa kendu da</string>
- <string name="pincode_stored">ownCloud aplikazioaren PINa gorde da</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 Minutu</item>
- <item>30 Minutu</item>
- <item>60 Minutu</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_reenter_your_pincode">Sartu berriz aplikazioarenPINa, mesedez</string>
+ <string name="pincode_remove_your_pincode">Ezabatu zure aplikazioaren PINa</string>
+ <string name="pincode_mismatch">Aplikazioko bi PINak ez dira berdinak</string>
+ <string name="pincode_wrong">Aplikazioaren PINa ezda zuzena</string>
+ <string name="pincode_removed">Aplikazioaren PINa kendu da</string>
+ <string name="pincode_stored">Aplikazioaren PINa gorde da</string>
+ <string name="media_notif_ticker">%1$s musika erreproduzigailua</string>
+ <string name="media_state_playing">%1$s (jotzen)</string>
+ <string name="media_state_loading">%1$s (kargatzen)</string>
+ <string name="media_event_done">%1$s erreprodukzioa amaitua</string>
+ <string name="media_err_nothing_to_play">Ez da euskarri fitxategia aurkitu</string>
+ <string name="media_err_no_account">Ez da konturik eman</string>
+ <string name="media_err_not_in_owncloud">Fitxategiak ez du baliozko kontu bat</string>
+ <string name="media_err_unsupported">Onartzen ez de euskarri kodeka</string>
+ <string name="media_err_io">Euskarri fitxategia ezin da bihurtu</string>
+ <string name="media_err_malformed">Euskarri fitxategia ezin da kodetu</string>
+ <string name="media_err_timeout">Erreproduzitzen saiatzean denbora iraungitu da</string>
+ <string name="media_err_invalid_progressive_playback">Euskarri fitxategia ezin da jariotu</string>
+ <string name="media_err_unknown">Euskarri fitxategia ezin erreproduzitu stock euskarri erreproduzigailuarekin</string>
+ <string name="media_err_security_ex">Segurtasun errorea %1$s erreproduzitzen saiatzean</string>
+ <string name="media_err_io_ex">Sarrera errorea %1$s erreproduzitzen saiatzean</string>
+ <string name="media_err_unexpected">Ezusteko errorea %1$s erreproduzitzen saiatzean</string>
+ <string name="media_rewind_description">Atzeratu botoia</string>
+ <string name="media_play_pause_description">Erreproduzitu edo pausatu botoia</string>
+ <string name="media_forward_description">Azkar aurreratu botoia</string>
<string name="auth_trying_to_login">Saioa hasten saiatzen...</string>
<string name="auth_no_net_conn_title">Ez dago sare konexiorik</string>
- <string name="auth_no_net_conn_message">Ez da sare konexiorik antzeman, egiaztatu zure interneteko konexioa eta saiatu berriz.</string>
- <string name="auth_connect_anyway">Konektatu hala ere</string>
<string name="auth_nossl_plain_ok_title">Konexio segurua ez dago eskuragarri</string>
- <string name="auth_nossl_plain_ok_message">Aplikazioak ezin izan du zerbitzariarekin konexio seguru bat ezarri. Hala ere konexio ez segurua egin daiteke. Jarraitu edo ezeztatu dezakezu.</string>
<string name="auth_connection_established">Konexioa ezarri da</string>
<string name="auth_testing_connection">Konexioa probatzen...</string>
- <string name="auth_not_configured_title">gaizki egindako ownCloud konfigurazioa</string>
- <string name="auth_not_configured_message">Badirudi zure ownCloud instantzia ez dagoela ongi konfiguratuta. Jarri zure harremanetan administradorearkin informazio gehiago izateko.</string>
+ <string name="auth_not_configured_title">gaizki egindako server konfigurazioa</string>
+ <string name="auth_account_not_new">Erabiltzaile eta zerbitzari hauendako dagoeneko kontu bat existitzen da gailu honetan</string>
+ <string name="auth_account_not_the_same">Sartutako erabiltzaileak ez du bat egiten kontu honetako erabiltzailearekin</string>
<string name="auth_unknown_error_title">Errore ezezagun bat gertatu da</string>
- <string name="auth_unknown_error_message">Errore ezezagun bat gertatu da. Mezedez jarri harremanetan egileekin eta zure gailuko log-ak erantsi.</string>
<string name="auth_unknown_host_title">Ezin izan da hostalaria aurkitu</string>
- <string name="auth_unknown_host_message">Ezin da sartutako hostalaria aurkitu. Mezedez egiaztatu hostalari izena eta zerbitzariaren eskuragarritasuna eta saiatu berriz.</string>
- <string name="auth_incorrect_path_title">ez da ownClouden instalaziorik aurkitu</string>
- <string name="auth_incorrect_path_message">Programak ezin du ownCloud instantzia aurkitu emandako bidean. Mesedez egiaztatu bidea eta saiatu berriz.</string>
+ <string name="auth_incorrect_path_title">ez da serveren instalaziorik aurkitu</string>
<string name="auth_timeout_title">Zerbitzariak denbora asko hartu du erantzuteko</string>
<string name="auth_incorrect_address_title">Gaizki sortutako URLa</string>
<string name="auth_ssl_general_error_title">SSL abiaratzeak huts egin du</string>
- <string name="auth_ssl_unverified_server_title">Egiaztatu gabeko SSL zerbitzariaren identitaea</string>
- <string name="auth_bad_oc_version_title">ownCloud zerbitzari bertsio ezezaguna</string>
+ <string name="auth_ssl_unverified_server_title">Ezin izan da SSL zerbitzariaren identitaea egiaztatu</string>
+ <string name="auth_bad_oc_version_title">server zerbitzari bertsio ezezaguna</string>
<string name="auth_wrong_connection_title">Ezin izan da konexioa egin</string>
<string name="auth_secure_connection">Konexio segurua ezarri da</string>
- <string name="auth_login_details">Saio hasierako ezarpenak</string>
- <string name="auth_unauthorized">Erabiltzaile / pasahitz baliogabea</string>
- <string name="auth_not_found">Okerreko bidea emanda</string>
- <string name="auth_internal">Barne zerbitzari errorea, kodea: %1$d</string>
- <string name="crashlog_message">Programa ezustekoan bukatu da. Nahiko zenuke huts egitearen berri eman?</string>
- <string name="crashlog_send_report">Bidali txostena</string>
- <string name="crashlog_dont_send_report">Ez bidali txostena</string>
- <string name="extensions_avail_title">Hedapenak eskuragarri!</string>
- <string name="extensions_avail_message">Badirudi zure ownCloud instantziak aukera aurreratuak eskuragarri dituela. Nahiko zenuke aukera horiek zure androidean ikustea?</string>
+ <string name="auth_unauthorized">Okerreko erabiltzaile izen edo pasahitza</string>
+ <string name="auth_oauth_error">Baimena ez da lortu</string>
+ <string name="auth_oauth_error_access_denied">Sarrera autorizazio zerbitzariak ukatua</string>
+ <string name="auth_wtf_reenter_URL">Egoera esperogabea, mesedez idatzi berriz zerbitzari URLa</string>
+ <string name="auth_expired_oauth_token_toast">Zure baimena iraungitu da.\nMesedez, baimendu berriz</string>
+ <string name="auth_expired_basic_auth_toast">Mesedez, sartu oraingo pasahitza</string>
+ <string name="auth_expired_saml_sso_token_toast">Zure saioa iraungitu da. Mesdez konektatu berriro</string>
+ <string name="auth_connecting_auth_server">Konektatzen autentikazio zerbitzarira...</string>
+ <string name="auth_unsupported_auth_method">Zerbitzariak ez du autentikazio metodo hau onartzen</string>
+ <string name="auth_unsupported_multiaccount">%1$s ez du kontu anitzak onartzen</string>
<string name="fd_keep_in_sync">Mantendu fitxategia eguneratuta</string>
- <string name="common_share">Elkarbanatu</string>
<string name="common_rename">Berrizendatu</string>
<string name="common_remove">Ezabatu</string>
<string name="confirmation_remove_alert">Nahi duzu %1$s ezabatu?</string>
<string name="rename_server_fail_msg">Izen aldaketa ezin izan da burutu</string>
<string name="sync_file_fail_msg">Urruneko fitxategia ezin izan da arakatu</string>
<string name="sync_file_nothing_to_do_msg">Fitxategi edukiak dagoeneko sinkronizaturik</string>
- <string name="create_dir_fail_msg">Karpeta ezin da sortu</string>
+ <string name="filename_forbidden_characters">Debekatutako karaktereak: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Itxaron momentu bat</string>
<string name="filedisplay_unexpected_bad_get_content">Ezusteko arazoa; mesedez, saiatu beste app batekin fitxategia hautatzeko</string>
<string name="filedisplay_no_file_selected">Ez da fitxategirik hautatu</string>
- <string name="ssl_validator_title">Abisua</string>
+ <string name="activity_chooser_title">Bidali lotura honi...</string>
+ <string name="oauth_check_onoff">Saioa hasi oAuth2-rekin</string>
+ <string name="oauth_login_connection">Konektatzen oAuth2 zerbitzarira...</string>
<string name="ssl_validator_header">Lekuaren identitatea ezin da egiaztatu</string>
<string name="ssl_validator_reason_cert_not_trusted">- Zerbitzariaren ziurtagiria ez da fidagarria</string>
<string name="ssl_validator_reason_cert_expired">- Zerbitzariaren ziurtagiria iraungi da</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- Zerbitzariaren ziurtagiria oso gaztea da</string>
<string name="ssl_validator_reason_hostname_not_verified">- URLa ez dator bat ziurtagiriaren hostalari izenarekin</string>
- <string name="ssl_validator_certificate_not_available">Zerbitzariaren ziurtagiria ezin da lortu</string>
<string name="ssl_validator_question">Nahi duzu, hala ere, ziurtagiriaz fidatu?</string>
<string name="ssl_validator_not_saved">Ziurtagiria ezin da gorde</string>
<string name="ssl_validator_btn_details_see">Xehetasunak</string>
<string name="ssl_validator_label_validity_to">Noiz arte:</string>
<string name="ssl_validator_label_signature">Sinadura:</string>
<string name="ssl_validator_label_signature_algorithm">Algoritmoa:</string>
- <string name="text_placeholder">Hau leku-marka da</string>
+ <string name="placeholder_sentence">Hau leku-marka da</string>
+ <string name="placeholder_filename">kokalekua.txt</string>
+ <string name="placeholder_filetype">PNG Irudia</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Igo irudiak bakarrik WIFIren bidez</string>
<string name="instant_upload_path">/BerehalakoIgoerak</string>
<string name="conflict_title">Igoera konfliktoa</string>
<string name="conflict_keep_both">Mantendu biak</string>
<string name="conflict_overwrite">Gainidatzi</string>
<string name="conflict_dont_upload">Ez igo</string>
+ <string name="preview_image_description">Irudi aurreikuspena</string>
+ <string name="preview_image_error_unknown_format">Ezin da irudi hau erakutsi</string>
+ <string name="actionbar_failed_instant_upload">UnekoIgoerak huts egin du</string>
+ <string name="failed_upload_headline_text">Uneko igoerek huts egin dute</string>
+ <string name="failed_upload_headline_hint">Huts egindako igoeren laburpena</string>
+ <string name="failed_upload_all_cb">Hautatu dena</string>
+ <string name="failed_upload_headline_retryall_btn">Berriz saiatu hautatutakoak</string>
+ <string name="failed_upload_headline_delete_all_btn">kendu hautatutakoak igoera-ilaratik</string>
+ <string name="failed_upload_retry_text">Berriz saiatu irudia igotzen:</string>
+ <string name="failed_upload_load_more_images">Kargatu irudi gehiago</string>
+ <string name="failed_upload_retry_do_nothing_text">ez egin ezer ez zaude on-line uneko igoerarentzat</string>
+ <string name="failed_upload_failure_text">Hutsegite mezua:</string>
+ <string name="failed_upload_quota_exceeded_text">Egiaztatu zure konfigurazioa, agian zure kuota muga gainditu duzu.</string>
+ <string name="share_link_file_no_exist">Ezin izan da karpeta edo fitxategi hau partekatu. Mesedez, ziurtatu existitzen dela</string>
+ <string name="share_link_file_error">Errore bat egon da fitxategaia edo karpeta partekatzerakoan</string>
+ <string name="unshare_link_file_no_exist">Ezin izan da karpeta edo fitxategi honen partekatzeari utzi. Ez da existitzen.</string>
+ <string name="unshare_link_file_error">Errore bat egon da fitxategaia edo karpeta partekatzeari uzterakoan</string>
+ <string name="activity_chooser_send_file_title">Bidali</string>
+ <string name="copy_link">Lotura kopiatu</string>
+ <string name="clipboard_text_copied">Arbelera kopiatua</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">رمز عبور:</string>
- <string name="main_login">نام کاربری:</string>
- <string name="main_button_login">ورود</string>
- <string name="main_welcome">به ownCloud خود خوشآمدید</string>
- <string name="main_files">پروندهها</string>
- <string name="main_music">موزیک</string>
- <string name="main_contacts">ارتباطها</string>
- <string name="main_calendar">تقویم</string>
- <string name="main_bookmarks">نشانکها</string>
- <string name="main_settings">تنظیمات</string>
- <string name="main_tit_accsetup">نصب حساب کاربری</string>
- <string name="main_wrn_accsetup">حساب کاربری ownCloud در دستگاه شما وجود ندارد. برای استفاده از این برنامه میبایست یکی ایجاد کنید.</string>
- <string name="actionbar_sync">بازنمایی</string>
+ <string name="about_android">%1$s برنامه اندروید</string>
+ <string name="about_version">%1$s نسخه</string>
+ <string name="actionbar_sync">بازنمایی حساب کاربری</string>
<string name="actionbar_upload">بارگزاری</string>
+ <string name="actionbar_upload_from_apps">محتوا از دیگر برنامه ها</string>
<string name="actionbar_upload_files">پروندهها</string>
- <string name="actionbar_mkdir">ایجاد پوشه</string>
- <string name="actionbar_search">جستوجو</string>
+ <string name="actionbar_open_with">باز کردن با</string>
+ <string name="actionbar_mkdir">پوشه جدید</string>
<string name="actionbar_settings">تنظیمات</string>
+ <string name="actionbar_see_details">جزئیات</string>
+ <string name="actionbar_send_file">ارسال</string>
<string name="prefs_category_general">عمومی</string>
- <string name="prefs_category_trackmydevice">ردیابی دستگاه</string>
- <string name="prefs_add_session">ایجاد جلسه جدید</string>
- <string name="prefs_create_img_thumbnails">ایجاد پیش نمایش تصاویر</string>
- <string name="prefs_select_oc_account">انتخاب یک حساب</string>
- <string name="prefs_trackmydevice">ردیابی دستگاه</string>
- <string name="prefs_trackmydevice_summary_off">برنامه را فعال کنید تا محل دستگاه شما پیگیری شود</string>
- <string name="prefs_trackmydevice_interval">به روز رسانی بازه</string>
+ <string name="prefs_category_more">بیشتر</string>
<string name="prefs_accounts">حسابها</string>
- <string name="auth_host_url">آدرس ownCloud </string>
+ <string name="prefs_manage_accounts">مدیریت حسابها</string>
+ <string name="prefs_pincode">PIN برنامه</string>
+ <string name="prefs_pincode_summary">حفاظت از مشتری</string>
+ <string name="prefs_instant_upload">فعال کردن بارگذاری فوری</string>
+ <string name="prefs_instant_upload_summary">فورا عکسهایی را که با دوربین گرفته شده است را آپلود کن</string>
+ <string name="prefs_log_title">فعال کردن ورود</string>
+ <string name="prefs_log_summary">این برای مشکلات ورود استفاده شده است.</string>
+ <string name="prefs_log_title_history">تاریخچه ورود</string>
+ <string name="prefs_log_summary_history">این وقایع ثبت شده را نمایش می دهد.</string>
+ <string name="prefs_log_delete_history_button">حذف تاریخچه</string>
+ <string name="prefs_help">راهنما</string>
+ <string name="prefs_recommend">پیشنهاد دادن به یک دوست</string>
+ <string name="prefs_feedback">باز خورد</string>
+ <string name="prefs_imprint">مهر زدن</string>
+ <string name="recommend_subject">%1$s را بر روی گوشی هوشمند خود امتحان کنید.</string>
+ <string name="auth_check_server">چک کردن سرور</string>
+ <string name="auth_host_url">آدرس سرور https://…</string>
<string name="auth_username">نام کاربری</string>
<string name="auth_password">رمز عبور</string>
+ <string name="auth_register">جدید نسبت به %1$s?</string>
<string name="sync_string_files">پروندهها</string>
- <string name="setup_hint_username">نام کاربری</string>
- <string name="setup_hint_password">رمز عبور</string>
- <string name="setup_hint_address">آدرس وب</string>
- <string name="setup_hint_show_password">نمایش رمز عبور؟</string>
<string name="setup_btn_connect">اتصال</string>
<string name="uploader_btn_upload_text">بارگزاری</string>
+ <string name="uploader_wrn_no_account_title">هیچ حسابی یافت نشد</string>
+ <string name="uploader_wrn_no_account_text">هیچ حسابی در %1$s بر روی دستگاه شما موجود نیست.لطفا اول یک حساب ترتیب دهید.</string>
<string name="uploader_wrn_no_account_setup_btn_text">نصب</string>
<string name="uploader_wrn_no_account_quit_btn_text">خروج</string>
<string name="uploader_wrn_no_content_title">هیچ مطلبی بارگزاری نشده است</string>
<string name="uploader_wrn_no_content_text">هیچ مطلبی دریافت نشده است. هیچچیزی بارگزاری نشده.</string>
+ <string name="uploader_error_forbidden_content">%1$s اجازه ی دسترسی به محتوای مشترک را نمی دهد</string>
<string name="uploader_info_uploading">در حال بارگزاری</string>
- <string name="uploader_btn_create_dir_text">ایجاد دایرکتوری برای بارگذاری</string>
+ <string name="file_list_empty">هیچ فایل در این پوشه نیست.\nفایل های جدید می توانند بوسیله ی گزینه ی \"بارگزاری\" در لیست اضافه کنید.</string>
+ <string name="filedetails_select_file">روی هر فایل کلیک کنید تا اطلاعات اضافی نمایش داده شود.</string>
<string name="filedetails_size">اندازه</string>
<string name="filedetails_type">نوع:</string>
<string name="filedetails_created">ایجاد شده توسط:</string>
<string name="filedetails_modified">تغییر یافته توسط:</string>
<string name="filedetails_download">بارگیری</string>
- <string name="filedetails_sync_file">بازنمایی</string>
- <string name="filedetails_redownload">بارگزاری دوباره</string>
+ <string name="filedetails_sync_file">بازنمایی فایل</string>
+ <string name="filedetails_renamed_in_upload_msg">فایل در هنگام بارگزاری به %1$s تغییر نام یافت</string>
+ <string name="action_share_file">اشتراک گذاشتن لینک</string>
+ <string name="action_unshare_file">لغو اشتراک گذاشتن لینک</string>
<string name="common_yes">بله</string>
<string name="common_no">نه</string>
<string name="common_ok">باشه</string>
+ <string name="common_cancel_download">قطع دانلود</string>
<string name="common_cancel_upload">متوقف کردن بار گذاری</string>
<string name="common_cancel">منصرف شدن</string>
+ <string name="common_save_exit">ذخیره سازی و خروج</string>
<string name="common_error">خطا</string>
+ <string name="common_loading">بارگذاری ...</string>
+ <string name="common_error_unknown">خطای نامشخص</string>
<string name="about_title">درباره</string>
+ <string name="change_password">تغییر گذر واژه</string>
<string name="delete_account">حذف حساب</string>
<string name="create_account">ساخت حساب</string>
<string name="upload_chooser_title">بارگزاری از ...</string>
+ <string name="uploader_info_dirname">نام پوشه</string>
<string name="uploader_upload_in_progress_ticker">در حال بارگزاری ...</string>
+ <string name="uploader_upload_in_progress_content">%1$d%% در حال بارگزاری %2$s</string>
<string name="uploader_upload_succeeded_ticker">بارگزاری موفقیتآمیز بود</string>
+ <string name="uploader_upload_succeeded_content_single">%1$s با موفقیت بار گذاری شد</string>
<string name="uploader_upload_failed_ticker">بارگزاری ناموفق بود</string>
+ <string name="uploader_upload_failed_content_single">بارگزاری %1$s نتوانست به طور کامل انجام شود</string>
<string name="downloader_download_in_progress_ticker">در حال بارگیری ...</string>
+ <string name="downloader_download_in_progress_content">%1$d%% در حال دانلود %2$s</string>
<string name="downloader_download_succeeded_ticker">بارگیری موفقیتآمیز بود</string>
+ <string name="downloader_download_succeeded_content">%1$s با موفقیت دانلود شد</string>
<string name="downloader_download_failed_ticker">بارگیری ناموفق بود</string>
- <string name="sync_string_contacts">ارتباطها</string>
+ <string name="downloader_download_failed_content">دانلود %1$s نمی توانست به طور کامل انجام شود.</string>
+ <string name="downloader_not_downloaded_yet">دانلود هنوز به پایان نرسیده است.</string>
+ <string name="common_choose_account">حساب کاربری را انتخاب کنید</string>
+ <string name="sync_fail_ticker">همگام سازی ناموفق</string>
+ <string name="sync_fail_content">همگام سازی %1$s نتوانست به طور کامل انجام شود</string>
+ <string name="sync_fail_content_unauthorized">رمز عبور نامعتبر برای %1$s</string>
+ <string name="sync_conflicts_in_favourites_ticker">ناسازگاری ها یافت شدند</string>
+ <string name="sync_conflicts_in_favourites_content">%1$d پرونده ها نمیتوانند همگام سازی شوند.</string>
+ <string name="sync_fail_in_favourites_ticker">همگام سازی پرونده ها ناموفق بود.</string>
+ <string name="sync_fail_in_favourites_content">محتوای %1$d فایل ها نمی توانند همگام باشند(%2$d ناسازگاری)</string>
+ <string name="sync_foreign_files_forgotten_ticker">بعضی از فایلهای محلی فراموش شده اند</string>
+ <string name="sync_current_folder_was_removed">پوشه %1$s دیگر وجود ندارد</string>
+ <string name="foreign_files_move">انتقال همه</string>
+ <string name="foreign_files_success">همه ی فایل ها جا به جا شدند</string>
+ <string name="foreign_files_fail">بعضی از فایل ها نمی توانند انتقال یابند</string>
+ <string name="foreign_files_local_text">محلی: %1$s</string>
+ <string name="foreign_files_remote_text">دور از دسترس: %1$s</string>
+ <string name="upload_query_move_foreign_files">فضایی به اندازه ی کافی برای کپی کردن فایل ها در پوشه ی %1$s نیست.آیا می خواهید آنها را به جای دیگری انتقال دهید؟</string>
+ <string name="pincode_enter_pin_code">لطفا PIN برنامه خودتان را وارد کنید</string>
+ <string name="pincode_configure_your_pin">PIN برنامه را وارد کنید</string>
+ <string name="pincode_configure_your_pin_explanation">هر زمان که برنامه آغاز شود PIN درخواست خواهد شد.</string>
+ <string name="pincode_reenter_your_pincode">لطفا PIN برنامه خودتان را دوباره وارد کنید</string>
+ <string name="pincode_remove_your_pincode">PIN برنامه خودتان را حذف کنید</string>
+ <string name="pincode_mismatch">PIN های برنامه یکسان نیستند</string>
+ <string name="pincode_wrong">PIN برنامه نادرست است</string>
+ <string name="pincode_removed">PIN برنامه حذف شده است</string>
+ <string name="pincode_stored">PIN برنامه ذخیره شده است</string>
+ <string name="media_notif_ticker">%1$s پخش کننده موسیقی</string>
+ <string name="media_state_playing">%1$s ( در حال پخش موسیقی )</string>
+ <string name="media_state_loading">%1$s (درحال بارگذاری)</string>
+ <string name="media_event_done">%1$s پخش به پایان رسید.</string>
+ <string name="media_err_nothing_to_play">هیچ رسانه ای یافت نشد.</string>
+ <string name="media_err_no_account">هیچ حسابی ارائه نشده است.</string>
+ <string name="media_err_not_in_owncloud">پرونده در حساب کاربری معتبر نیست.</string>
+ <string name="media_err_unsupported">کدک رسانه پشتیبانی نشده است.</string>
+ <string name="media_err_io">فایل رسانه نمیتواند خوانده شود.</string>
+ <string name="media_err_malformed">فایل رسانه به شکل صحیح رمزگذاری نشده است.</string>
+ <string name="media_err_timeout">در حین تلاش برای پخش کردن، مهلت به پایان رسیده است</string>
+ <string name="media_err_invalid_progressive_playback">فایل رسانه نمیتواند جریان داشته باشد.</string>
+ <string name="media_err_unknown">فایل رسانه با استفاده از پخش کننده stock media player قابل پخش نیست.</string>
+ <string name="media_err_security_ex">خطای امنیتی، تلاش برای پخش %1$s</string>
+ <string name="media_err_io_ex">خطای وارد کردن، تلاش برای پخش %1$s</string>
+ <string name="media_err_unexpected">خطای غیرمنتظره، تلاش برای پخش %1$s</string>
+ <string name="media_rewind_description">دکمه عقبگرد</string>
+ <string name="media_play_pause_description">دکمه پخش یا توقف</string>
+ <string name="media_forward_description">دکمه رو به جلو سریع</string>
+ <string name="auth_trying_to_login">تلاش برای ورود...</string>
+ <string name="auth_no_net_conn_title">هیچ ارتباطی به شبکه موجود نیست</string>
<string name="auth_nossl_plain_ok_title">اتصال امن در دسترس نیست</string>
<string name="auth_connection_established">اتصال برقرار شد</string>
<string name="auth_testing_connection">آزمایش اتصال...</string>
- <string name="auth_unknown_error_title">خطای ناشناخته رخ داده است!</string>
- <string name="auth_login_details">جزئیات ورود</string>
- <string name="crashlog_send_report">ارسال گزارش</string>
- <string name="crashlog_dont_send_report">گزارش را ارسال نکن</string>
- <string name="common_share">اشتراکگزاری</string>
+ <string name="auth_not_configured_title">پیکربندی سرور ناقص است</string>
+ <string name="auth_account_not_new">یک اکانت با همین نام کاربری و سرور بر روی این دستگاه موجود میباشد.</string>
+ <string name="auth_account_not_the_same">نام کاربری وارد شده با نام کاربری این اکانت مطابقت ندارد</string>
+ <string name="auth_unknown_error_title">خطای نامشخص رخ داده است!</string>
+ <string name="auth_unknown_host_title">میزبان را نمیتواند پیدا نماید.</string>
+ <string name="auth_incorrect_path_title">نمونه ی سرور یافت نشد</string>
+ <string name="auth_timeout_title">زمان زیادی برای پاسخ سرور صورت گرفت.</string>
+ <string name="auth_incorrect_address_title">آدرس ناقص</string>
+ <string name="auth_ssl_general_error_title">مقداردهی SSL ناموفق بود.</string>
+ <string name="auth_ssl_unverified_server_title">نمیتوان اصالت SSL سرور را احراز نمود</string>
+ <string name="auth_bad_oc_version_title">نسخه ی سرور ناشناخته</string>
+ <string name="auth_wrong_connection_title">نمیتوان ارتباط برقرار نمود.</string>
+ <string name="auth_secure_connection">ایجاد ارتباط ایمن</string>
+ <string name="auth_unauthorized">نام کاربری یا رمز ورود اشتباه است</string>
+ <string name="auth_oauth_error">اجازه ناموفق</string>
+ <string name="auth_oauth_error_access_denied">دسترسی توسط سرور احراز هویت رد شده است.</string>
+ <string name="auth_wtf_reenter_URL">حالت غیرمنتظره؛ لطفا آدرس URL سرور را مجددا وارد نمایید.</string>
+ <string name="auth_expired_oauth_token_toast">احراز هویت شما منقضی شده است. لطفا، مجددا احراز هویت فرمایید.</string>
+ <string name="auth_expired_basic_auth_toast">لطفاً رمز کاربری فعلی را وارد نمایید</string>
+ <string name="auth_connecting_auth_server">اتصال به سرور احراز هویت...</string>
+ <string name="auth_unsupported_auth_method">سرور این نوع احراز هویت را پشتیبانی نمیکند</string>
+ <string name="auth_unsupported_multiaccount">%1$s چند اکانته بودن را پشتیبانی نمیکند</string>
+ <string name="fd_keep_in_sync">فایل را به روز نگه دار</string>
<string name="common_rename">تغییرنام</string>
<string name="common_remove">حذف</string>
+ <string name="confirmation_remove_alert">آیا واقعا می خواهید %1$s حذف شود؟</string>
+ <string name="confirmation_remove_folder_alert">آیا واقعا می خواهید %1$s و محتوای آن را حذف کنید؟</string>
+ <string name="confirmation_remove_local">فقط محلی</string>
+ <string name="confirmation_remove_folder_local">فقط محتوای محلی</string>
<string name="confirmation_remove_remote">پاک کردن از سرور</string>
+ <string name="confirmation_remove_remote_and_local">راه دور و محلی</string>
+ <string name="remove_success_msg">حذف با موفقیت انجام شد</string>
+ <string name="remove_fail_msg">حذف نا موفق بود</string>
+ <string name="rename_dialog_title">نام جدید وارد کنید</string>
+ <string name="rename_local_fail_msg">کپی محلی نمی تواند تغییر نام پیدا کند، لطفا نام دیگری انتخاب نمایید.</string>
+ <string name="rename_server_fail_msg">نامگذاری نمی تواند به طور کامل انجام شود</string>
+ <string name="sync_file_fail_msg">پرونده های دور از دسترس نمی توانند بررسی شوند.</string>
+ <string name="sync_file_nothing_to_do_msg">محتوای فایل قبلا همگام شده</string>
+ <string name="filename_forbidden_characters">کاراکترهای ممنوع: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">لحظهای صبر کنید</string>
+ <string name="filedisplay_unexpected_bad_get_content">مشکل غیر متقربه، لطفا پرونده را از یک برنامه متفاوت انتخاب کنید.</string>
<string name="filedisplay_no_file_selected">هیچ پروندهای انتخاب نشده است</string>
- <string name="ssl_validator_title">اخطار</string>
+ <string name="activity_chooser_title">ارسال لینک به ...</string>
+ <string name="oauth_check_onoff">ورود با oAuth2 </string>
+ <string name="oauth_login_connection">اتصال به سرور oAuth2 ...</string>
+ <string name="ssl_validator_header">هویت این سایت نمی تواند تایید شود</string>
+ <string name="ssl_validator_reason_cert_not_trusted">- گواهی سرور نامعتبر است</string>
+ <string name="ssl_validator_reason_cert_expired">- گواهی سرور انقضا یافته</string>
+ <string name="ssl_validator_reason_cert_not_yet_valid">زمان اعتبار گواهی نامه سرویس دهنده فرانرسیده است</string>
+ <string name="ssl_validator_reason_hostname_not_verified">URL با آدرس هاست موجود در گواهی نامه مطابقت ندارد.</string>
+ <string name="ssl_validator_question">آیا می خواهید در هر صورت به این مدرک اطمینان کنید؟</string>
+ <string name="ssl_validator_not_saved">گواهی نمی تواند ذخیره شود</string>
<string name="ssl_validator_btn_details_see">جزییات</string>
<string name="ssl_validator_btn_details_hide">پنهان کردن</string>
+ <string name="ssl_validator_label_subject">صدور به:</string>
+ <string name="ssl_validator_label_issuer">صدور بوسیله:</string>
+ <string name="ssl_validator_label_CN">نام مشترک:</string>
+ <string name="ssl_validator_label_O">سازمان</string>
+ <string name="ssl_validator_label_OU">واحد سازمان</string>
<string name="ssl_validator_label_C">کشور:</string>
+ <string name="ssl_validator_label_ST">ایالت</string>
+ <string name="ssl_validator_label_L">مکان:</string>
+ <string name="ssl_validator_label_validity">اعتبار:</string>
+ <string name="ssl_validator_label_validity_from">از:</string>
+ <string name="ssl_validator_label_validity_to">به:</string>
+ <string name="ssl_validator_label_signature">امضا:</string>
+ <string name="ssl_validator_label_signature_algorithm">الگوریتم:</string>
+ <string name="placeholder_sentence">این یک حفره است.</string>
+ <string name="placeholder_filename">placeholder.txt</string>
+ <string name="placeholder_filetype">تصویربا فرمت PNG </string>
+ <string name="placeholder_filesize">389 کیلو بایت</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 بعد از ظهر</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">تصاویر را فقط از طریق wifi بارگذاری کن</string>
+ <string name="instant_upload_path">آپلود فوری</string>
+ <string name="conflict_title">بارگذاری ناسازگار</string>
+ <string name="conflict_message">فایل های دور از دسترس %s با فایل های محلی همگام نشده اند. ادامه کار، محتوا را بر روی فایل در سرور جایگزین خواهد کرد.</string>
+ <string name="conflict_keep_both">نگهداشتن هر دو</string>
+ <string name="conflict_overwrite">دوباره نویسی</string>
+ <string name="conflict_dont_upload">آپلود نکن</string>
+ <string name="preview_image_description">پیش نمایش تصویر</string>
+ <string name="preview_image_error_unknown_format">این تصویر نمی تواند نمایش داده شود.</string>
+ <string name="actionbar_failed_instant_upload">آپلود فوری انجام نشد</string>
+ <string name="failed_upload_headline_text">آپلود های فوری انجام نشدند.</string>
+ <string name="failed_upload_headline_hint">خلاصه ای از تمام ارسال های فور ی ناموفق.</string>
+ <string name="failed_upload_all_cb">انتخاب همه</string>
+ <string name="failed_upload_headline_retryall_btn">تلاش مجدد بر روی همه موارد انتخاب شده</string>
+ <string name="failed_upload_headline_delete_all_btn">حذف تمام انتخاب شده ها از صف ارسال.</string>
+ <string name="failed_upload_retry_text">تلاش برای آپلود کردن تصویر:</string>
+ <string name="failed_upload_load_more_images">بارگذاری تصاویر بیشتر</string>
+ <string name="failed_upload_retry_do_nothing_text">هیچ کاری انجام ندهید، شما برای آپلود فوری آنلاین نیستید.</string>
+ <string name="failed_upload_failure_text">پیغام عدم موفقیت:</string>
+ <string name="failed_upload_quota_exceeded_text">لطفا پیکربندی سرورتان را بررسی کنید، شاید سهمیه شما بیش از حد شده باشد.</string>
+ <string name="share_link_file_no_exist">به اشتراک گذاری این فایل یا پوشه ممکن نیست. لطفاً از وجود آن اطمینان حاصل نمایید</string>
+ <string name="share_link_file_error">در حین اشتراک گذاری این فایل یا پوشه خطایی رخ داده است</string>
+ <string name="unshare_link_file_no_exist">حذف اشتراک گذاری این فایل یا پوشه ممکن نیست. لطفاً از وجود آن اطمینان حاصل نمایید</string>
+ <string name="unshare_link_file_error">در حین حذف اشتراک گذاری این فایل یا پوشه خطایی رخ داده است</string>
+ <string name="activity_chooser_send_file_title">ارسال</string>
+ <string name="clipboard_text_copied">کپی به کلیپ بورد</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Salasana:</string>
- <string name="main_login">Käyttäjätunnus:</string>
- <string name="main_button_login">Kirjaudu</string>
- <string name="main_welcome">Tervetuloa ownCloudiin</string>
- <string name="main_files">Tiedostot</string>
- <string name="main_music">Musiikki</string>
- <string name="main_contacts">Yhteystiedot</string>
- <string name="main_calendar">Kalenteri</string>
- <string name="main_bookmarks">Kirjanmerkit</string>
- <string name="main_settings">Asetukset</string>
- <string name="main_tit_accsetup">Aseta tili</string>
- <string name="main_wrn_accsetup">Laitteessasi ei ole ownCloud-tilejä. Luo tili käyttääksesi tätä sovellusta.</string>
- <string name="about_message">ownCloudin Android-sovellus\n\nversio: %1$s</string>
- <string name="actionbar_sync">Päivitä</string>
+ <string name="about_android">%1$s-Android-sovellus</string>
+ <string name="about_version">versio %1$s</string>
+ <string name="actionbar_sync">Päivitä tili</string>
<string name="actionbar_upload">Lähetä tiedosto</string>
<string name="actionbar_upload_from_apps">Sisältö toisista sovelluksista</string>
<string name="actionbar_upload_files">Tiedostot</string>
- <string name="actionbar_mkdir">Luo kansio</string>
- <string name="actionbar_search">Etsi</string>
+ <string name="actionbar_open_with">Avaa sovelluksella</string>
+ <string name="actionbar_mkdir">Uusi kansio</string>
<string name="actionbar_settings">Asetukset</string>
+ <string name="actionbar_see_details">Tiedot</string>
+ <string name="actionbar_send_file">Lähetä</string>
<string name="prefs_category_general">Yleiset</string>
- <string name="prefs_category_trackmydevice">Laitteen jäljitys</string>
- <string name="prefs_add_session">Lisää uusi istunto</string>
- <string name="prefs_create_img_thumbnails">Luo kuvista pikkukuvat</string>
- <string name="prefs_select_oc_account">Valitse tili</string>
- <string name="prefs_summary_select_oc_account">Valitse sovelluksen käyttämät tilit.</string>
- <string name="prefs_trackmydevice">Laitteen jäljitys</string>
- <string name="prefs_trackmydevice_summary_off">Salli ownCloudin jäljittää laitteesi sijainti</string>
- <string name="prefs_trackmydevice_summary_on">ownCloud jäljittää tätä laitetta</string>
- <string name="prefs_trackmydevice_interval">Päivitysväli</string>
- <string name="prefs_trackmydevice_interval_summary">Päivitä %1$s minuutin välein</string>
+ <string name="prefs_category_more">Enemmän</string>
<string name="prefs_accounts">Tilit</string>
<string name="prefs_manage_accounts">Tilien hallinta</string>
- <string name="prefs_pincode">ownCloud-sovelluksen PIN-koodi</string>
- <string name="prefs_pincode_summary">Suojaa ownCloud-asiakasohjelmasi</string>
+ <string name="prefs_pincode">Sovelluksen PIN-koodi</string>
+ <string name="prefs_pincode_summary">Suojaa Asiakasohjelmasi</string>
<string name="prefs_instant_upload">Käytä välitöntä lähetystä</string>
<string name="prefs_instant_upload_summary">Lähetä kameralla otetut kuvat välittömästi</string>
- <string name="auth_host_url">ownCloud-osoite</string>
+ <string name="prefs_log_title">Käytä lokitusta</string>
+ <string name="prefs_log_summary_history">Tämä näyttää tallennetut lokit</string>
+ <string name="prefs_log_delete_history_button">Poista historia</string>
+ <string name="prefs_help">Ohje</string>
+ <string name="prefs_recommend">Suosittele kaverille</string>
+ <string name="prefs_feedback">Palaute</string>
+ <string name="recommend_subject">Kokeile %1$sia älypuhelimellasi!</string>
+ <string name="auth_check_server">Tarkista palvelin</string>
+ <string name="auth_host_url">Palvelinosoite https://…</string>
<string name="auth_username">Käyttäjätunnus</string>
<string name="auth_password">Salasana</string>
- <string name="auth_register">Olen uusi ownCloudin kanssa</string>
- <string name="new_session_uri_error">Väärä osoite</string>
- <string name="new_session_session_name_error">Väärä istuntonimi</string>
+ <string name="auth_register">Onko %1$s uusi tuttavuus sinulle?</string>
<string name="sync_string_files">Tiedostot</string>
- <string name="uploader_no_file_selected">Tiedostoa ei valittu lähetettäväksi</string>
- <string name="setup_hint_username">Käyttäjätunnus</string>
- <string name="setup_hint_password">Salasana</string>
- <string name="setup_hint_address">Verkko-osoite</string>
- <string name="setup_hint_show_password">Näytä salasana</string>
- <string name="setup_title">Yhdistä omaan ownCloudiin</string>
<string name="setup_btn_connect">Yhdistä</string>
<string name="uploader_btn_upload_text">Lähetä</string>
<string name="uploader_wrn_no_account_title">Tiliä ei löytynyt</string>
- <string name="uploader_wrn_no_account_text">Laitteelle ei ole asetettu ownCloud-tiliä. Luo tili ensin.</string>
+ <string name="uploader_wrn_no_account_text">Laitteelle ei ole asetettu %1$s-tiliä. Luo tili ensin.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Asetukset</string>
<string name="uploader_wrn_no_account_quit_btn_text">Lopeta</string>
<string name="uploader_wrn_no_content_title">Ei sisältöä ladattavaksi</string>
<string name="uploader_wrn_no_content_text">Sisältöä ei saatu. Ei lähetettävää palvelimelle.</string>
- <string name="uploader_error_forbidden_content">ownCloudilla ei ole oikeuksia jaettuun sisältöön</string>
+ <string name="uploader_error_forbidden_content">%1$silla ei ole oikeuksia jaettuun sisältöön</string>
<string name="uploader_info_uploading">Lähetetään</string>
- <string name="uploader_btn_create_dir_text">Luo kansio latausta varten</string>
<string name="file_list_empty">Tässä kansiossa ei ole tiedostoja.\nUusia tiedostoja voi lisätä käyttäen valikon \"Lähetä\"-toimintoa.</string>
<string name="filedetails_select_file">Napauta tiedostoa nähdäksesi lisätietoja.</string>
<string name="filedetails_size">Koko:</string>
<string name="filedetails_created">Luotu:</string>
<string name="filedetails_modified">Muokattu:</string>
<string name="filedetails_download">Lataa</string>
- <string name="filedetails_sync_file">Päivitä</string>
- <string name="filedetails_redownload">Lataa uudelleen</string>
- <string name="filedetails_open">Avaa</string>
+ <string name="filedetails_sync_file">Päivitä tiedosto</string>
<string name="filedetails_renamed_in_upload_msg">Tiedoston nimeksi muutettiin %1$s siirron yhteydessä</string>
+ <string name="action_share_file">Jaa linkki</string>
<string name="common_yes">Kyllä</string>
<string name="common_no">Ei</string>
<string name="common_ok">OK</string>
<string name="common_cancel_upload">Peru lähetys</string>
<string name="common_cancel">Peru</string>
<string name="common_save_exit">Tallenna ja poistu</string>
- <string name="common_exit">Jätä ownCloud</string>
<string name="common_error">Virhe</string>
+ <string name="common_loading">Ladataan…</string>
+ <string name="common_error_unknown">Tuntematon virhe</string>
<string name="about_title">Tietoja</string>
+ <string name="change_password">Vaihda salasana</string>
<string name="delete_account">Poista tili</string>
<string name="create_account">Luo tili</string>
<string name="upload_chooser_title">Lataus täältä:</string>
<string name="uploader_upload_in_progress_content">%1$d%% Lähetetään palvelimelle %2$s</string>
<string name="uploader_upload_succeeded_ticker">Lähetys onnistui</string>
<string name="uploader_upload_succeeded_content_single">%1$s lähetettiin onnistuneesti</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d tiedostoa lähetettiin onnistuneesti</string>
<string name="uploader_upload_failed_ticker">Lähetys epäonnistui</string>
<string name="uploader_upload_failed_content_single">%1$s :n lähetys palvelimelle jäi kesken</string>
- <string name="uploader_upload_failed_content_multiple">Lähetys epäonnistui: %1$d/%2$d tiedostoa lähetettiin</string>
<string name="downloader_download_in_progress_ticker">Ladataan...</string>
<string name="downloader_download_in_progress_content">%1$d%% ladataan palvelimelta %2$s</string>
<string name="downloader_download_succeeded_ticker">Lataus tänne onnistui</string>
<string name="downloader_download_succeeded_content">%1$s ladattu palvelimelta onnistuneesti</string>
<string name="downloader_download_failed_ticker">Lataus epäonnistui</string>
<string name="downloader_download_failed_content">%1$s :n latausta ei pystytty suorittamaan loppuun asti</string>
+ <string name="downloader_not_downloaded_yet">Ei vielä ladattu</string>
<string name="common_choose_account">Valitse tili</string>
- <string name="sync_string_contacts">Yhteystiedot</string>
<string name="sync_fail_ticker">Synkronointi epäonnistui</string>
<string name="sync_fail_content">Kohteen %1$s synkronointia ei voitu suorittaa loppuun</string>
+ <string name="sync_fail_content_unauthorized">Virheellinen salasana tilille %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Ristiriitoja löytynyt</string>
<string name="sync_conflicts_in_favourites_content">%1$d \"pidä synkronoituna\" tiedostoja ei voitu synkronoida</string>
<string name="sync_fail_in_favourites_ticker">\"Pidä synkronoituna\" epäonnistui</string>
<string name="sync_fail_in_favourites_content">Hakemiston %1$d tiedostoja ei voitu synkronoida (%2$d konfliktia)</string>
- <string name="use_ssl">Käytä salattua yhteyttä</string>
- <string name="location_no_provider">ownCloud ei voi jäljittää laitettasi. Tarkista laitteesi sijaintiasetukset</string>
+ <string name="sync_current_folder_was_removed">Kansiota %1$s ei ole enää olemassa</string>
+ <string name="foreign_files_move">Siirrä kaikki</string>
+ <string name="foreign_files_success">Kaikki tiedostot siirrettiin</string>
+ <string name="foreign_files_fail">Joidenkin tiedostojen siirtäminen epäonnistui</string>
+ <string name="foreign_files_local_text">Paikallinen: %1$s</string>
+ <string name="foreign_files_remote_text">Etä: %1$s</string>
<string name="pincode_enter_pin_code">Aseta sovelluksesi PIN</string>
- <string name="pincode_enter_new_pin_code">Anna uuden sovelluksesi PIN-koodi</string>
- <string name="pincode_configure_your_pin">Anna ownCloud-sovelluksen PIN</string>
+ <string name="pincode_configure_your_pin">Anna sovelluksen PIN</string>
<string name="pincode_configure_your_pin_explanation">PIN kysytään joka kerta, kun sovellus käynnistetään</string>
- <string name="pincode_reenter_your_pincode">Anna ownCloud-sovelluksen PIN uudestaan</string>
- <string name="pincode_remove_your_pincode">Poista ownCloud-sovelluksen PIN</string>
- <string name="pincode_mismatch">ownCloud-sovelluksen PIN-koodit eivät täsmää</string>
- <string name="pincode_wrong">Väärä ownCloud-sovelluksen PIN</string>
- <string name="pincode_removed">ownCloud-sovelluksen PIN poistettu</string>
- <string name="pincode_stored">ownCloud-sovelluksen PIN-koodi tallennettu</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 minuuttia</item>
- <item>30 minuuttia</item>
- <item>60 minuuttia</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_reenter_your_pincode">Anna sovelluksen PIN uudestaan</string>
+ <string name="pincode_remove_your_pincode">Poista sovelluksen PIN</string>
+ <string name="pincode_mismatch">Sovelluksen PIN-koodit eivät täsmää</string>
+ <string name="pincode_wrong">Väärä sovelluksen PIN</string>
+ <string name="pincode_removed">Sovelluksen PIN poistettu</string>
+ <string name="pincode_stored">Sovelluksen PIN-koodi tallennettu</string>
+ <string name="media_state_playing">%1$s (toistetaan)</string>
+ <string name="media_state_loading">%1$s (ladataan)</string>
+ <string name="media_err_nothing_to_play">Mediatiedostoa ei löytynyt</string>
+ <string name="media_err_no_account">Tiliä ei määritetty</string>
+ <string name="media_err_not_in_owncloud">Tiedosto ei ole kelvollisella tilillä</string>
+ <string name="media_err_io">Mediatiedoston luku ei onnistunut</string>
+ <string name="media_err_timeout">Aikakatkaisu toistoa yrittäessä</string>
+ <string name="media_err_invalid_progressive_playback">Mediatiedostoa ei voi suoratoistaa</string>
+ <string name="media_rewind_description">Taaksepäin kelaus -painike</string>
+ <string name="media_play_pause_description">Toisto tai keskeytys -painike</string>
+ <string name="media_forward_description">Eteenpäin kelaus -painike</string>
<string name="auth_trying_to_login">Yritetään kirjautua...</string>
<string name="auth_no_net_conn_title">Ei verkkoyhteyttä</string>
- <string name="auth_no_net_conn_message">Verkkoyhteyttä ei havaittu. Tarkista internetyhteyden tila ja yritä uudelleen.</string>
- <string name="auth_connect_anyway">Yhdistä silti</string>
<string name="auth_nossl_plain_ok_title">Salattu yhteys ei ole käytettävissä.</string>
- <string name="auth_nossl_plain_ok_message">Sovellus ei voinut luoda salattua yhteyttä palvelimeen. Kuitenkin salaamaton yhteys on olemassa. Jatka sitä käyttäen tai lopeta tähän.</string>
<string name="auth_connection_established">Yhteys muodostettu</string>
<string name="auth_testing_connection">Testataan yhteyttä...</string>
- <string name="auth_not_configured_title">Väärin tehdyt ownCloud-asetukset</string>
- <string name="auth_not_configured_message">Vaikuttaa ettei ownCloud ole oikein määritetty. Ota yhteyttä ylläpitäjään.</string>
+ <string name="auth_not_configured_title">Väärin tehdyt palvelin-asetukset</string>
+ <string name="auth_account_not_new">Laitteella on jo tili samalle käyttäjälle ja palvelimelle</string>
<string name="auth_unknown_error_title">Tuntematon virhe</string>
- <string name="auth_unknown_error_message">Tuntematon virhe tapahtui. Ota yhteyttä tekijöihin ja liitä mukaan lokitiedostot laitteestasi.</string>
<string name="auth_unknown_host_title">Isäntää ei löydy</string>
- <string name="auth_unknown_host_message">Annettua isäntää ei löydy. Tarkista nimi ja onko palvelin käytettävissä, yritä sitten uudestaan.</string>
- <string name="auth_incorrect_path_title">ownCloud-instanssia ei löydetty</string>
- <string name="auth_incorrect_path_message">Sovellus ei löydä ownCloud-instanssia annetusta polusta. Tarkista polku ja yritä uudestaan.</string>
+ <string name="auth_incorrect_path_title">Palvelin-instanssia ei löydetty</string>
<string name="auth_timeout_title">Palvelimen vastaus viipyy liian kauan</string>
<string name="auth_incorrect_address_title">Väärin annettu osoite</string>
<string name="auth_ssl_general_error_title">SSL:n alustus epäonnistui</string>
- <string name="auth_ssl_unverified_server_title">SSL-palvelimen identiteettiä ei voida varmistaa</string>
- <string name="auth_bad_oc_version_title">Tuntematon ownCloud-palvelimen versio</string>
+ <string name="auth_bad_oc_version_title">Tuntematon palvelimen versio</string>
<string name="auth_wrong_connection_title">Yhteyden muodostus epäonnistui</string>
<string name="auth_secure_connection">Salattu yhteys muodostettu</string>
- <string name="auth_login_details">Kirjautumistiedot</string>
- <string name="auth_unauthorized">Virheellinen tunnus tai salasana</string>
- <string name="auth_not_found">Väärä polku</string>
- <string name="auth_internal">Sisäinen palvelinvirhe, koodi %1$d</string>
- <string name="crashlog_message">Sovellus sulkeutui yllättäen. Haluatko lähettää vikailmoituksen?</string>
- <string name="crashlog_send_report">Lähetä ilmoitus</string>
- <string name="crashlog_dont_send_report">Älä lähetä ilmoitusta</string>
- <string name="extensions_avail_title">Laajennuksia saatavilla!</string>
- <string name="extensions_avail_message">ownCloud-instanssisi näyttäisi tukevan laajennuksia. Haluatko nähdä Androidille saatavilla olevat laajennukset?</string>
+ <string name="auth_unauthorized">Väärä käyttäjätunnus tai salasana</string>
+ <string name="auth_oauth_error">Epäonnistunut valtuutus</string>
+ <string name="auth_oauth_error_access_denied">Valtuutuspalvelun esti käytön</string>
+ <string name="auth_wtf_reenter_URL">Odottamaton tila; anna palvelimen osoite uudelleen</string>
+ <string name="auth_expired_oauth_token_toast">Valtuutus vanhentui. Valtuuta uudelleen</string>
+ <string name="auth_expired_basic_auth_toast">Anna nykyinen salasana</string>
+ <string name="auth_expired_saml_sso_token_toast">Istunto vanhentui. Yhdistä uudelleen</string>
+ <string name="auth_connecting_auth_server">Yhdistetään tunnistautumispalvelimeen…</string>
+ <string name="auth_unsupported_auth_method">Palvelin ei tue tätä tunnistautumistapaa</string>
+ <string name="auth_unsupported_multiaccount">%1$s ei tue useita tilejä</string>
+ <string name="auth_can_not_auth_against_server">Tunnistautuminen palvelimeen ei onnistunut</string>
<string name="fd_keep_in_sync">Pidä tiedosto ajan tasalla</string>
- <string name="common_share">Jaa</string>
<string name="common_rename">Nimeä uudelleen</string>
<string name="common_remove">Poista</string>
<string name="confirmation_remove_alert">Haluatko poistaa kohteen %1$s?</string>
<string name="rename_server_fail_msg">Nimen muutos epäonnistui</string>
<string name="sync_file_fail_msg">Etäpään tiedostoa ei voitu tarkistaa</string>
<string name="sync_file_nothing_to_do_msg">Tiedoston sisältö on jo synkronoitu</string>
- <string name="create_dir_fail_msg">Kansion luonti epäonnistui</string>
+ <string name="filename_forbidden_characters">Kielletyt merkit: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Odota hetki</string>
<string name="filedisplay_unexpected_bad_get_content">Odottamaton ongelma; kokeile valita tiedosto toisella sovelluksella</string>
<string name="filedisplay_no_file_selected">Tiedostoa ei valittu</string>
- <string name="ssl_validator_title">Varoitus</string>
+ <string name="activity_chooser_title">Lähetä linkki…</string>
+ <string name="oauth_check_onoff">Kirjaudu oAuth2:lla</string>
+ <string name="oauth_login_connection">Yhdistetään oAuth2-palvelimeen…</string>
<string name="ssl_validator_header">Sivuston identiteetin vahvistaminen ei onnistunut</string>
<string name="ssl_validator_reason_cert_not_trusted">- Palvelimen varmenteeseen ei luoteta</string>
<string name="ssl_validator_reason_cert_expired">- Palvelimen varmenne on vanhentunut</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- Palvelimen varmenteen kelvolliset päivät ovat tulevaisuudessa</string>
<string name="ssl_validator_reason_hostname_not_verified">- Osoite ei vastaa sertifikaatissa mainittua isäntänimeä</string>
- <string name="ssl_validator_certificate_not_available">Palvelimen varmenteen noutaminen epäonnistui</string>
<string name="ssl_validator_question">Haluatko silti luottaa tähän varmenteeseen?</string>
<string name="ssl_validator_not_saved">Varmenteen tallennus epäonnistui</string>
<string name="ssl_validator_btn_details_see">Tiedot</string>
<string name="ssl_validator_label_validity_to">Päättyen:</string>
<string name="ssl_validator_label_signature">Allekirjoitus:</string>
<string name="ssl_validator_label_signature_algorithm">Algoritmi:</string>
- <string name="text_placeholder">Tämä on paikkavaraus</string>
+ <string name="ssl_validator_null_cert">Varmennetta ei voi näyttää.</string>
+ <string name="ssl_validator_no_info_about_error">- Ei lisätietoja virheestä</string>
+ <string name="placeholder_filetype">PNG-kuva</string>
+ <string name="placeholder_filesize">389 kt</string>
<string name="instant_upload_on_wifi">Lähetä kuvat vain WiFi-verkossa</string>
<string name="instant_upload_path">/InstantUpload</string>
<string name="conflict_title">Päivitysristiriita</string>
<string name="conflict_keep_both">Säilytä molemmat</string>
<string name="conflict_overwrite">Korvaa</string>
<string name="conflict_dont_upload">Älä lähetä</string>
+ <string name="preview_image_description">Kuvan esikatselu</string>
+ <string name="preview_image_error_unknown_format">Kuvaa ei voi näyttää</string>
+ <string name="failed_upload_all_cb">valitse kaikki</string>
+ <string name="failed_upload_headline_retryall_btn">yritä uudelleen kaikkia valittuja</string>
+ <string name="failed_upload_load_more_images">Lataa lisää kuvia</string>
+ <string name="failed_upload_failure_text">Virheviesti:</string>
+ <string name="share_link_file_no_exist">Valitettavasti tämän tiedoston tai kansion jakaminen ei onnistu. Varmista että se on olemassa</string>
+ <string name="share_link_file_error">Virhe tiedoston tai kansion jakamista yrittäessä</string>
+ <string name="activity_chooser_send_file_title">Lähetä</string>
+ <string name="copy_link">Kopioi linkki</string>
+ <string name="clipboard_text_copied">Kopioitu leikepöydälle</string>
</resources>
+++ /dev/null
-<?xml version='1.0' encoding='UTF-8'?>
-<resources>
- <string name="main_settings">asetukset</string>
- <string name="actionbar_settings">asetukset</string>
- <string name="auth_username">Käyttäjätunnus</string>
- <string name="setup_hint_username">Käyttäjätunnus</string>
- <string name="filedetails_open">avata</string>
-</resources>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources/>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Mot de passe : </string>
- <string name="main_login">Utilisateur : </string>
- <string name="main_button_login">Connexion</string>
- <string name="main_welcome">Bienvenue dans votre ownCloud</string>
- <string name="main_files">Fichiers</string>
- <string name="main_music">Musique</string>
- <string name="main_contacts">Contacts</string>
- <string name="main_calendar">Calendrier</string>
- <string name="main_bookmarks">Marque-pages</string>
- <string name="main_settings">Paramètres</string>
- <string name="main_tit_accsetup">Paramètres du compte</string>
- <string name="main_wrn_accsetup">Aucun compte ownCloud n\'est encore paramétré. Pour utiliser cette application, il vous faut en ajouter un.</string>
- <string name="about_message">client ownCloud pour Android\n\nversion : %1$s</string>
- <string name="actionbar_sync">Synchronisation du compte</string>
- <string name="actionbar_upload">Téléverser un fichier</string>
+ <string name="about_android">%1$s Android App</string>
+ <string name="about_version">version %1$s</string>
+ <string name="actionbar_sync">Actualiser le compte</string>
+ <string name="actionbar_upload">Téléverser</string>
<string name="actionbar_upload_from_apps">Contenu d\'une autre application</string>
<string name="actionbar_upload_files">Fichiers</string>
- <string name="actionbar_mkdir">Créer un répertoire</string>
- <string name="actionbar_search">Rechercher</string>
+ <string name="actionbar_open_with">Ouvrir avec</string>
+ <string name="actionbar_mkdir">Nouveau dossier</string>
<string name="actionbar_settings">Paramètres</string>
- <string name="prefs_category_general">Généraux</string>
- <string name="prefs_category_trackmydevice">Traçage de l\'appareil</string>
- <string name="prefs_add_session">Ajouter une nouvelle session</string>
- <string name="prefs_create_img_thumbnails">Créer les miniatures</string>
- <string name="prefs_select_oc_account">Sélectionnez un compte</string>
- <string name="prefs_summary_select_oc_account">Choisissez quel compte utiliser</string>
- <string name="prefs_trackmydevice">Traçage de l\'appareil</string>
- <string name="prefs_trackmydevice_summary_off">Permettre à ownCloud de suivre votre position</string>
- <string name="prefs_trackmydevice_summary_on">Votre ownCloud trace actuellement cet appareil</string>
- <string name="prefs_trackmydevice_interval">Intervalle de mise à jour</string>
- <string name="prefs_trackmydevice_interval_summary">Mettre à jour toutes les %1$s minutes</string>
+ <string name="actionbar_see_details">Détails</string>
+ <string name="actionbar_send_file">Envoyer</string>
+ <string name="prefs_category_general">Général</string>
+ <string name="prefs_category_more">Plus</string>
<string name="prefs_accounts">Comptes</string>
<string name="prefs_manage_accounts">Gestion des comptes utilisateur</string>
- <string name="prefs_pincode">Utilisation d\'un code de sécurité ownCloud</string>
- <string name="prefs_pincode_summary">Protéger l\'accès aux données maniplulées par le client ownCloud</string>
+ <string name="prefs_pincode">Utilisation d\'un code de sécurité</string>
+ <string name="prefs_pincode_summary">Protéger l\'accès aux données maniplulées par le client</string>
<string name="prefs_instant_upload">Activer le téléversement instantané</string>
<string name="prefs_instant_upload_summary">Import instantané des photos prises par la caméra</string>
- <string name="auth_host_url">URL ownCloud</string>
+ <string name="prefs_log_title">Activer les logs</string>
+ <string name="prefs_log_summary">Utilisé pour enregistrer les problèmes dans les logs</string>
+ <string name="prefs_log_title_history">Historique des logs</string>
+ <string name="prefs_log_summary_history">Cela affiche les logs enregistrés</string>
+ <string name="prefs_log_delete_history_button">Supprimer l\'historique</string>
+ <string name="prefs_help">Aide</string>
+ <string name="prefs_recommend">Recommander à un ami</string>
+ <string name="prefs_feedback">Commentaires</string>
+ <string name="prefs_imprint">Empreinte</string>
+ <string name="recommend_subject">Essayez %1$s sur votre smartphone !</string>
+ <string name="auth_check_server">Vérifier le serveur</string>
+ <string name="auth_host_url">Adresse du serveur https://...</string>
<string name="auth_username">Nom d\'utilisateur</string>
<string name="auth_password">Mot de passe</string>
- <string name="auth_register">Je suis nouveau sur ownCloud</string>
- <string name="new_session_uri_error">L\'URL spécifiée n\'est pas correcte</string>
- <string name="new_session_session_name_error">Le nom de session spécifié n\'est pas correct</string>
+ <string name="auth_register">Nouveau dans %1$s ?</string>
<string name="sync_string_files">Fichiers</string>
- <string name="uploader_no_file_selected">Aucun fichier n\'est sélectionné pour le téléversement</string>
- <string name="setup_hint_username">Nom d\'utilisateur</string>
- <string name="setup_hint_password">Mot de passe</string>
- <string name="setup_hint_address">Adresse web</string>
- <string name="setup_hint_show_password">Afficher le mot de passe ?</string>
- <string name="setup_title">Me connecter à mon ownCloud</string>
<string name="setup_btn_connect">Connecter</string>
<string name="uploader_btn_upload_text">Téléverser</string>
+ <string name="uploader_top_message">Sélectionner le dossier d\'envoi :</string>
<string name="uploader_wrn_no_account_title">Aucun compte n\'a été trouvé</string>
- <string name="uploader_wrn_no_account_text">Aucun compte ownCloud n\'a été trouvé. Veuillez commencer par en configurer un.</string>
+ <string name="uploader_wrn_no_account_text">Aucun compte %1$s n\'a été trouvé. Veuillez commencer par en configurer un.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Paramètres</string>
<string name="uploader_wrn_no_account_quit_btn_text">Quitter</string>
<string name="uploader_wrn_no_content_title">Rien à envoyer</string>
<string name="uploader_wrn_no_content_text">Aucun contenu reçu. Rien à envoyer</string>
- <string name="uploader_error_forbidden_content">ownCloud n\'est pas autorisé à accéder au contenu partagé</string>
+ <string name="uploader_error_forbidden_content">%1$s n\'est pas autorisé à accéder au contenu partagé</string>
<string name="uploader_info_uploading">Téléversement</string>
- <string name="uploader_btn_create_dir_text">Créer un répertoire pour le téléversement</string>
<string name="file_list_empty">Ce répertoire ne contient aucun fichier.\nDe nouveaux fichiers peuvent être importés en cliquant sur le bouton « Téléverser un fichier » du menu des options</string>
<string name="filedetails_select_file">Effleurez un fichier pour afficher les informations complémentaires</string>
<string name="filedetails_size">Taille :</string>
<string name="filedetails_created">Créé le :</string>
<string name="filedetails_modified">Modifié le :</string>
<string name="filedetails_download">Télécharger</string>
- <string name="filedetails_sync_file">Rafraîchir</string>
- <string name="filedetails_redownload">Télécharger à nouveau</string>
- <string name="filedetails_open">Ouvrir</string>
+ <string name="filedetails_sync_file">Actualiser le fichier</string>
<string name="filedetails_renamed_in_upload_msg">Le fichier a été renommé en %s pendant le téléversement</string>
+ <string name="action_share_file">Partager le lien</string>
+ <string name="action_unshare_file">Ne plus partager ce lien</string>
<string name="common_yes">Oui</string>
<string name="common_no">Non</string>
<string name="common_ok">OK</string>
<string name="common_cancel_upload">Annuler l\'envoi</string>
<string name="common_cancel">Annuler</string>
<string name="common_save_exit">Sauvegarder & Quitter</string>
- <string name="common_exit">Quitter ownCloud</string>
<string name="common_error">Erreur</string>
+ <string name="common_loading">Chargement ...</string>
+ <string name="common_error_unknown">Erreur Inconnue </string>
<string name="about_title">À propos de</string>
+ <string name="change_password">Changer de mot de passe</string>
<string name="delete_account">Effacer ce compte</string>
<string name="create_account">Créer un compte</string>
<string name="upload_chooser_title">Téléverser un fichier depuis…</string>
<string name="uploader_upload_in_progress_content">Envoi du fichier %2$s en cours, %1$d%% effectués</string>
<string name="uploader_upload_succeeded_ticker">Téléversement réussi</string>
<string name="uploader_upload_succeeded_content_single">Le fichier %1$s a été envoyé avec succès</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d fichiers ont été envoyés avec succès</string>
<string name="uploader_upload_failed_ticker">Échec de l\'envoi</string>
<string name="uploader_upload_failed_content_single">L\'envoi de %1$s a échoué</string>
- <string name="uploader_upload_failed_content_multiple">Échec de l\'envoi : %1$d sur %2$d fichiers ont été importés</string>
<string name="downloader_download_in_progress_ticker">Téléchargement en cours…</string>
<string name="downloader_download_in_progress_content">Téléchargement en cours de %2$s, %1$d%% effectués</string>
<string name="downloader_download_succeeded_ticker">Téléchargement réussi</string>
<string name="downloader_download_succeeded_content">%1$s a été téléchargé avec succès</string>
<string name="downloader_download_failed_ticker">Le téléchargement a échoué</string>
<string name="downloader_download_failed_content">Le téléchargement de %1$s a échoué</string>
+ <string name="downloader_not_downloaded_yet">Pas encore téléchargé</string>
<string name="common_choose_account">Choisissez un compte</string>
- <string name="sync_string_contacts">Contacts</string>
<string name="sync_fail_ticker">La synchronisation a échoué</string>
<string name="sync_fail_content">La synchronisation de %1$s ne peut pas être complétée</string>
+ <string name="sync_fail_content_unauthorized">Mot de passe invalide pour %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Des conflits ont été trouvés</string>
<string name="sync_conflicts_in_favourites_content">%1$d fichiers à garder synchronisés n\'ont put être synchronisé</string>
<string name="sync_fail_in_favourites_ticker">La synchronisation des fichiers a échoué</string>
<string name="sync_fail_in_favourites_content">Le contenu de %1$d fichiers n\'a put être synchronisé (%2$d conflits)</string>
- <string name="use_ssl">Utiliser une connexion sécurisée</string>
- <string name="location_no_provider">ownCloud ne peut pister votre appareil, veuillez vérifier vos paramètres de localisation</string>
+ <string name="sync_foreign_files_forgotten_ticker">Certains fichiers locaux ont été oubliés</string>
+ <string name="sync_foreign_files_forgotten_content">%1$d fichiers du dossier %2$s n\'ont pas pu être copiés dans</string>
+ <string name="sync_current_folder_was_removed">Le dossier %1$s n\'existe plus</string>
+ <string name="foreign_files_move">Tout déplacer</string>
+ <string name="foreign_files_success">Tous les fichiers ont été déplacés</string>
+ <string name="foreign_files_fail">Certains fichiers n\'ont pu être déplacés</string>
+ <string name="foreign_files_local_text">Local: %1$s</string>
+ <string name="foreign_files_remote_text">Distant: %1$s</string>
+ <string name="upload_query_move_foreign_files">Il n\'y a pas assez de place disponible pour copier les fichiers sélectionnés dans le dossier %1$s. Voulez-vous les déplacer à la place ?</string>
<string name="pincode_enter_pin_code">Veuillez saisir votre code de sécurité</string>
- <string name="pincode_enter_new_pin_code">Veuillez saisir votre nouveau code de sécurité</string>
- <string name="pincode_configure_your_pin">Veuillez saisir votre code de sécurité ownCloud</string>
+ <string name="pincode_configure_your_pin">Veuillez saisir votre code de sécurité </string>
<string name="pincode_configure_your_pin_explanation">Le code PIN vous sera demandé à chaque lancement de l\'application</string>
- <string name="pincode_reenter_your_pincode">Veuillez saisir à nouveau votre code de sécurité ownCloud</string>
- <string name="pincode_remove_your_pincode">Retirer le code de sécurité ownCloud</string>
+ <string name="pincode_reenter_your_pincode">Veuillez saisir à nouveau votre code de sécurité</string>
+ <string name="pincode_remove_your_pincode">Retirer le code de sécurité</string>
<string name="pincode_mismatch">Les deux codes saisis ne concordent pas</string>
- <string name="pincode_wrong">code de sécurité ownCloud incorrect</string>
- <string name="pincode_removed">code de sécurité ownCloud retiré</string>
- <string name="pincode_stored">code de sécurité ownCloud enregistré</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 minutes</item>
- <item>30 minutes</item>
- <item>60 minutes</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_wrong">Code de sécurité incorrect</string>
+ <string name="pincode_removed">Code de sécurité retiré</string>
+ <string name="pincode_stored">Code de sécurité enregistré</string>
+ <string name="media_notif_ticker">%1$s lecteur de musique</string>
+ <string name="media_state_playing">%1$s (lecture)</string>
+ <string name="media_state_loading">%1$s (chargement)</string>
+ <string name="media_event_done">%1$s pourcentage de lecture finie</string>
+ <string name="media_err_nothing_to_play">Fichier média introuvable </string>
+ <string name="media_err_no_account">Aucun compte n\'a été trouvé</string>
+ <string name="media_err_not_in_owncloud">Le fichier n\'est pas dans un compte valide</string>
+ <string name="media_err_unsupported">Le codec de ce média n\'est pas supporté </string>
+ <string name="media_err_io">Le fichier média ne peut pas être lu</string>
+ <string name="media_err_malformed">Le fichier média n\'est pas correctement encodé</string>
+ <string name="media_err_timeout">Délai dépassé pour la lecture du morceau.</string>
+ <string name="media_err_invalid_progressive_playback">Le fichier média ne peut pas être diffusé</string>
+ <string name="media_err_unknown">Fichier média ne peut être joué avec le stock de media player</string>
+ <string name="media_err_security_ex">taux %1$s erreurs de sécurité essayant de jouer</string>
+ <string name="media_err_io_ex">Taux %1$s d\'erreurs de saisie essayant de jouer</string>
+ <string name="media_err_unexpected">Taux %1$s d\'erreurs inattendues essayant de jouer</string>
+ <string name="media_rewind_description">Bouton de rem-bobinage</string>
+ <string name="media_play_pause_description">Bouton de Lecture ou de Pause</string>
+ <string name="media_forward_description">Bouton d\'avance rapide</string>
<string name="auth_trying_to_login">Tentative de connexion …</string>
<string name="auth_no_net_conn_title">Pas de connexion réseau</string>
- <string name="auth_no_net_conn_message">Aucune connexion réseau n\'a été trouvée, veuillez vérifier votre connectivité à internet puis réessayez.</string>
- <string name="auth_connect_anyway">Se connecter malgré tout</string>
<string name="auth_nossl_plain_ok_title">Connexion sécurisée non disponible</string>
- <string name="auth_nossl_plain_ok_message">L\'application ne peut établir de connexion sécurisée avec le serveur. Cependant, une connexion non sécurisée est disponible. Vous pouvez continuer en utilisant celle-ci ou annuler.</string>
<string name="auth_connection_established">Connexion établie</string>
<string name="auth_testing_connection">Test de la connexion…</string>
- <string name="auth_not_configured_title">Configuration ownCloud erronée</string>
- <string name="auth_not_configured_message">Il semblerait que votre instance ownCloud ne soit pas correctement configurée. Veuillez contacter votre administrateur pour plus de détails.</string>
+ <string name="auth_not_configured_title">Configuration du serveur erronée</string>
+ <string name="auth_account_not_new">Un compte pour le même utilisateur et serveur existe déjà sur ce périphérique</string>
+ <string name="auth_account_not_the_same">L\'utilisateur entré ne correspond pas à l\'utilisateur de ce compte</string>
<string name="auth_unknown_error_title">Une erreur inconnue s\'est produite</string>
- <string name="auth_unknown_error_message">Une erreur inconnue s\'est produite, merci de bien vouloir contacter les auteurs du programme en y incluant les messages d\'erreurs.</string>
<string name="auth_unknown_host_title">Impossible de trouver l\'hôte</string>
- <string name="auth_unknown_host_message">Impossible de trouver l\'hôte spécifié. Veuillez vérifier le nom du serveur, qu\'il est disponible, et essayer à nouveau.</string>
- <string name="auth_incorrect_path_title">Aucune instance ownCloud n\'a été trouvée</string>
- <string name="auth_incorrect_path_message">L\'application n\'a pu trouver une instance ownCloud à cette adresse. Veuillez vérifier l\'adresse et essayez à nouveau</string>
+ <string name="auth_incorrect_path_title">Aucune instance du serveur n\'a été trouvée</string>
<string name="auth_timeout_title">Le serveur met trop longtemps à répondre</string>
<string name="auth_incorrect_address_title">Adresse invalide</string>
<string name="auth_ssl_general_error_title">Échec de l\'initialisation SSL</string>
- <string name="auth_ssl_unverified_server_title">L\'identité SSL du serveur n\'a pu être vérifiée</string>
- <string name="auth_bad_oc_version_title">La version ownCloud du serveur n\'est pas reconnue</string>
+ <string name="auth_ssl_unverified_server_title">Impossible de vérifier l\'identité du serveur SSL.</string>
+ <string name="auth_bad_oc_version_title">La version du serveur n\'est pas reconnue</string>
<string name="auth_wrong_connection_title">Impossible d\'établir la connexion</string>
<string name="auth_secure_connection">Connexion sécurisée établie</string>
- <string name="auth_login_details">Détails des informations de connexion</string>
- <string name="auth_unauthorized">Login / mot de passe invalides</string>
- <string name="auth_not_found">Le chemin fourni est erroné</string>
- <string name="auth_internal">Erreur interne du serveur, code %1$d</string>
- <string name="crashlog_message">L\'application s\'est fermée de façon inattendue, voulez-vous envoyer un rapport d\'erreur ?</string>
- <string name="crashlog_send_report">Envoyer un rapport</string>
- <string name="crashlog_dont_send_report">Ne rien envoyer</string>
- <string name="extensions_avail_title">Des extensions sont disponibles !</string>
- <string name="extensions_avail_message">Il semblerait que votre ownCloud supporte les extensions avancées. Voulez-vous afficher les extensions disponibles pour android ?</string>
+ <string name="auth_unauthorized">Nom d\'utilisateur ou mot de passe invalide</string>
+ <string name="auth_oauth_error">Echec d\'autorisation</string>
+ <string name="auth_oauth_error_access_denied">Accès refusé par le serveur d\'autorisation</string>
+ <string name="auth_wtf_reenter_URL">État inattendu ; veuillez entrer à nouveau l\'URL du serveur</string>
+ <string name="auth_expired_oauth_token_toast">Votre autorisation a expiré. Merci de vous authentifier à nouveau</string>
+ <string name="auth_expired_basic_auth_toast">Veuillez saisir le mot de passe courant</string>
+ <string name="auth_expired_saml_sso_token_toast">Votre session a expiré. Merci de vous reconnecter</string>
+ <string name="auth_connecting_auth_server">Connexion au serveur d\'authentification...</string>
+ <string name="auth_unsupported_auth_method">Le serveur ne supporte pas cette méthode d\'authentification</string>
+ <string name="auth_unsupported_multiaccount">%1$s ne supporte pas les comptes multiples</string>
+ <string name="auth_can_not_auth_against_server">Impossible de s\'authentifier sur ce serveur</string>
<string name="fd_keep_in_sync">Maintenir le fichier à jour</string>
- <string name="common_share">Partager</string>
<string name="common_rename">Renommer</string>
<string name="common_remove">Supprimer</string>
<string name="confirmation_remove_alert">Voulez-vous vraiment supprimer %1$s ?</string>
<string name="rename_server_fail_msg">Renommage impossible</string>
<string name="sync_file_fail_msg">Le fichier distant n\'a pu être vérifié</string>
<string name="sync_file_nothing_to_do_msg">Le contenu des fichiers est déjà synchronisé</string>
- <string name="create_dir_fail_msg">Création du répertoire impossible</string>
+ <string name="create_dir_fail_msg">Le dossier n\'a pas pu être créé</string>
+ <string name="filename_forbidden_characters">Caractères interdits : / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Veuillez patienter</string>
<string name="filedisplay_unexpected_bad_get_content">Problème inattendu ; veuillez essayer une autre app pour la sélection du fichier</string>
<string name="filedisplay_no_file_selected">Aucun fichier sélectionné</string>
- <string name="ssl_validator_title">Attention</string>
+ <string name="activity_chooser_title">Envoyer un lien à…</string>
+ <string name="oauth_check_onoff">Connexion avec aAuth2.</string>
+ <string name="oauth_login_connection">Connexion au serveur aAuth2...</string>
<string name="ssl_validator_header">L\'identité du site ne peut être vérifiée</string>
<string name="ssl_validator_reason_cert_not_trusted">- Le certificat du serveur n\'est pas sûr</string>
<string name="ssl_validator_reason_cert_expired">- Le certificat du serveur a expiré</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- Le certificat du serveur n\'est pas encore valide</string>
<string name="ssl_validator_reason_hostname_not_verified">- L\'URL ne correspond pas au nom d\'hôte du certificat</string>
- <string name="ssl_validator_certificate_not_available">Impossible d\'obtenir le certificat du serveur</string>
<string name="ssl_validator_question">Voulez-vous tout de même faire confiance à ce certificat ?</string>
<string name="ssl_validator_not_saved">Impossible de sauvegarder le certificat</string>
<string name="ssl_validator_btn_details_see">Détails</string>
<string name="ssl_validator_label_validity_to">À :</string>
<string name="ssl_validator_label_signature">Signature :</string>
<string name="ssl_validator_label_signature_algorithm">Algorithme :</string>
- <string name="text_placeholder">Ceci est un espace réservé</string>
+ <string name="ssl_validator_null_cert">Impossible d\'afficher le certificat.</string>
+ <string name="ssl_validator_no_info_about_error">- Aucune information sur l\'erreur</string>
+ <string name="placeholder_sentence">Ceci est un espace réservé</string>
+ <string name="placeholder_filename">placeholder.txt</string>
+ <string name="placeholder_filetype">Image PNG</string>
+ <string name="placeholder_filesize">389 Ko</string>
+ <string name="placeholder_timestamp">18/05/2012 12:23</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Ne téléverser les images que via une connexion WiFi</string>
<string name="instant_upload_path">/TéléversementInstantané</string>
<string name="conflict_title">Conflit de mise à jour</string>
<string name="conflict_keep_both">Garder les deux versions</string>
<string name="conflict_overwrite">Écraser</string>
<string name="conflict_dont_upload">Ne pas téléverser</string>
+ <string name="preview_image_description">Prévisualisation de l\'image</string>
+ <string name="preview_image_error_unknown_format">Cette image ne peut pas être affichée</string>
+ <string name="error__upload__local_file_not_copied">%1$s n\'a pas pu être copié dans le dossier local %2$s</string>
+ <string name="actionbar_failed_instant_upload">Échec du téléversement instantané</string>
+ <string name="failed_upload_headline_text">Téléchargements instantanés échoués</string>
+ <string name="failed_upload_headline_hint">Résumé de tous les téléchargements instantanés échoués</string>
+ <string name="failed_upload_all_cb">Tous sélectionner</string>
+ <string name="failed_upload_headline_retryall_btn">réessayer de tous sélectionner</string>
+ <string name="failed_upload_headline_delete_all_btn">Supprimez tous les sélectionnés de la file d\'attente de téléchargement</string>
+ <string name="failed_upload_retry_text">Ré-essayer de charger l\'image:</string>
+ <string name="failed_upload_load_more_images">Charger plus d\'images</string>
+ <string name="failed_upload_retry_do_nothing_text">Ne rien faire vous n\'êtes pas connecté pour le téléchargement instantané</string>
+ <string name="failed_upload_failure_text">Message d\'échec:</string>
+ <string name="failed_upload_quota_exceeded_text">Veuillez vérifier la configuration de votre serveur, peut-être que votre quota est dépassé.</string>
+ <string name="share_link_file_no_exist">Impossible de partager ce fichier ou répertoire. Vérifiez qu’il est bien présent</string>
+ <string name="share_link_file_error">Une erreur est survenue lors de la tentative de partage de ce fichier ou répertoire</string>
+ <string name="unshare_link_file_no_exist">Impossible d’annuler le partage de ce fichier ou répertoire : il n’existe pas.</string>
+ <string name="unshare_link_file_error">Une erreur est survenue lors de la tentative d’annulation du partage de ce fichier ou répertoire</string>
+ <string name="activity_chooser_send_file_title">Envoyer</string>
+ <string name="copy_link">Copier le lien</string>
+ <string name="clipboard_text_copied">Copié dans le presse-papiers</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Contrasinal:</string>
- <string name="main_login">Nome de usuario:</string>
- <string name="main_button_login">Acceso</string>
- <string name="main_welcome">Benvido/a</string>
- <string name="main_files">Ficheiros</string>
- <string name="main_music">Música</string>
- <string name="main_contacts">Contactos</string>
- <string name="main_calendar">Calendario</string>
- <string name="main_bookmarks">Marcadores</string>
- <string name="main_settings">Preferencias</string>
- <string name="main_tit_accsetup">Activar a conta</string>
- <string name="main_wrn_accsetup">Non hai ningunha conta configurada no seu dispositivo. Para empregar o aplicativo necesita crear unha.</string>
- <string name="about_message">O aplicativo %1$s para Android\n\nversión: %2$s</string>
- <string name="actionbar_sync">Actualizar</string>
+ <string name="about_android">Aplicativo Android %1$s</string>
+ <string name="about_version">versión %1$s</string>
+ <string name="actionbar_sync">Actualizar a conta</string>
<string name="actionbar_upload">Enviar</string>
<string name="actionbar_upload_from_apps">Contido doutros aplicativos</string>
<string name="actionbar_upload_files">Ficheiros</string>
- <string name="actionbar_mkdir">Crear un directorio</string>
- <string name="actionbar_search">Buscar</string>
+ <string name="actionbar_open_with">Abrir con</string>
+ <string name="actionbar_mkdir">Novo cartafol</string>
<string name="actionbar_settings">Preferencias</string>
+ <string name="actionbar_see_details">Detalles</string>
+ <string name="actionbar_send_file">Enviar</string>
<string name="prefs_category_general">Xeral</string>
- <string name="prefs_category_trackmydevice">Seguimento do dispositivo</string>
- <string name="prefs_add_session">Engadir unha nova sesión</string>
- <string name="prefs_create_img_thumbnails">Crear miniaturas das imaxes</string>
- <string name="prefs_select_oc_account">Escoller unha conta</string>
- <string name="prefs_summary_select_oc_account">Escolla cal das súas contas ten que usar o aplicativo.</string>
- <string name="prefs_trackmydevice">Rastrexamento do dispositivo</string>
- <string name="prefs_trackmydevice_summary_off">Permitir que este aplicativo rexistre as posicións do seu dispositivo</string>
- <string name="prefs_trackmydevice_summary_on">Este aplicativo mantén o rexistro de posicións do seu dispositivo</string>
- <string name="prefs_trackmydevice_interval">Intervalo de actualizacións</string>
- <string name="prefs_trackmydevice_interval_summary">Actualizar cada %1$s minutos</string>
+ <string name="prefs_category_more">Máis</string>
<string name="prefs_accounts">Contas</string>
<string name="prefs_manage_accounts">Xestionar as contas</string>
<string name="prefs_pincode">PIN do aplicativo</string>
<string name="prefs_pincode_summary">Protexe o seu cliente</string>
<string name="prefs_instant_upload">Activar o envío instantáneo</string>
<string name="prefs_instant_upload_summary">Enviar instantaneamente as fotos tiradas coa cámara</string>
- <string name="auth_host_url">URL</string>
+ <string name="prefs_log_title">Activar o rexistro</string>
+ <string name="prefs_log_summary">Isto empregase para rexistrar os problemas</string>
+ <string name="prefs_log_title_history">Historial do rexistro</string>
+ <string name="prefs_log_summary_history">Isto amosa os rexistros gravados</string>
+ <string name="prefs_log_delete_history_button">Eliminar o historial</string>
+ <string name="prefs_help">Axuda</string>
+ <string name="prefs_recommend">Recomendar a un amigo</string>
+ <string name="prefs_feedback">Comentarios</string>
+ <string name="prefs_imprint">Impresión</string>
+ <string name="recommend_subject">Tente %1$s no seu teléfono intelixente!</string>
+ <string name="auth_check_server">Comprobar o servidor</string>
+ <string name="auth_host_url">Enderezo do servidor https://…</string>
<string name="auth_username">Nome de usuario</string>
<string name="auth_password">Contrasinal</string>
- <string name="auth_register">Son novo en %1$s</string>
- <string name="new_session_uri_error">Deuse un enderezo incorrecto</string>
- <string name="new_session_session_name_error">Nome de sesión incorrecto</string>
+ <string name="auth_register">Novo en %1$s?</string>
<string name="sync_string_files">Ficheiros</string>
- <string name="uploader_no_file_selected">Non se escolleron ficheiros para enviar</string>
- <string name="setup_hint_username">Nome de usuario</string>
- <string name="setup_hint_password">Contrasinal</string>
- <string name="setup_hint_address">Enderezo web</string>
- <string name="setup_hint_show_password">Amosar o contrasinal?</string>
- <string name="setup_title">Conectar co seu %1$s</string>
<string name="setup_btn_connect">Conectar</string>
<string name="uploader_btn_upload_text">Enviar</string>
+ <string name="uploader_top_message">Escolla o cartafol de envío:</string>
<string name="uploader_wrn_no_account_title">Non se atoparon contas</string>
<string name="uploader_wrn_no_account_text">Non hai contas de %1$s no seu dispositivo. Cree unha nova conta primeiro.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Instalación</string>
<string name="uploader_wrn_no_content_text">Non se recibiu contido. Non hai nada para enviar.</string>
<string name="uploader_error_forbidden_content">%1$s non ten permiso para acceder ao contido compartido</string>
<string name="uploader_info_uploading">Enviando</string>
- <string name="uploader_btn_create_dir_text">Crear un directorio para os envíos</string>
<string name="file_list_empty">Non hai ficheiros neste cartafol.\nOs novos ficheiros pódense engadir ca opción do menú «Enviar».</string>
<string name="filedetails_select_file">Prema nun ficheiro para que amose a información adicional.</string>
<string name="filedetails_size">Tamaño:</string>
<string name="filedetails_created">Creado:</string>
<string name="filedetails_modified">Modificado:</string>
<string name="filedetails_download">Descargar</string>
- <string name="filedetails_sync_file">Actualizar</string>
- <string name="filedetails_redownload">Descargar de novo</string>
- <string name="filedetails_open">Abrir</string>
+ <string name="filedetails_sync_file">Actualizar o ficheiro</string>
<string name="filedetails_renamed_in_upload_msg">O ficheiro foi renomeado a %1$s durante o envío</string>
+ <string name="action_share_file">Ligazón para compartir</string>
+ <string name="action_unshare_file">Deixar de compartir a ligazón</string>
<string name="common_yes">Si</string>
<string name="common_no">Non</string>
<string name="common_ok">Aceptar</string>
<string name="common_cancel_upload">Cancelar o envío</string>
<string name="common_cancel">Cancelar</string>
<string name="common_save_exit">Gardar e saír</string>
- <string name="common_exit">Abandonar %1$s</string>
<string name="common_error">Erro</string>
+ <string name="common_loading">Cargando ...</string>
+ <string name="common_error_unknown">Produciuse un erro descoñecido</string>
<string name="about_title">Sobre</string>
+ <string name="change_password">Cambiar o contrasinal</string>
<string name="delete_account">Eliminar a conta</string>
<string name="create_account">Crear unha conta</string>
<string name="upload_chooser_title">Enviar desde…</string>
- <string name="uploader_info_dirname">Nome do directorio</string>
+ <string name="uploader_info_dirname">Nome do cartafol</string>
<string name="uploader_upload_in_progress_ticker">Enviando…</string>
<string name="uploader_upload_in_progress_content">%1$d%% enviando %2$s</string>
<string name="uploader_upload_succeeded_ticker">Enviado correctamente</string>
<string name="uploader_upload_succeeded_content_single">%1$s foi enviado correctamente</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d ficheiros foron enviados correctamente</string>
<string name="uploader_upload_failed_ticker">Produciuse un fallou no envío</string>
<string name="uploader_upload_failed_content_single">Non foi posíbel completar o envío de %1$s</string>
- <string name="uploader_upload_failed_content_multiple">Produciuse un fallou no envío: enviáronse %1$d/%2$d ficheiros</string>
<string name="downloader_download_in_progress_ticker">Descargando…</string>
<string name="downloader_download_in_progress_content">%1$d%% descargando %2$s</string>
<string name="downloader_download_succeeded_ticker">Completouse a descarga</string>
<string name="downloader_download_succeeded_content">%1$s descargouse correctamente</string>
<string name="downloader_download_failed_ticker">Produciuse un fallo na descarga</string>
<string name="downloader_download_failed_content">Non foi posíbel completar a descarga de %1$s</string>
+ <string name="downloader_not_downloaded_yet">Non descargado aínda</string>
<string name="common_choose_account">Escoller unha conta</string>
- <string name="sync_string_contacts">Contactos</string>
<string name="sync_fail_ticker">Produciuse un fallo na sincronización</string>
<string name="sync_fail_content">Non foi posíbel completar a sincronización de %1$s</string>
+ <string name="sync_fail_content_unauthorized">Contrasinal incorrecto para %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Atopáronse conflictos</string>
- <string name="sync_conflicts_in_favourites_content">Non foi posíbel sincronizar %1$d ficheiros «kept-in-sync»</string>
- <string name="sync_fail_in_favourites_ticker">Produciuse un fallou ao sincronizar ficheiros «kept-in-sync»</string>
+ <string name="sync_conflicts_in_favourites_content">%1$d ficheiros «manter sincronizados» non foi posíbel sincronizalos</string>
+ <string name="sync_fail_in_favourites_ticker">Produciuse unha falla no mantemento sincronizado de ficheiros</string>
<string name="sync_fail_in_favourites_content">Non foi posíbel sincronizar o contido de %1$d ficheiros (%2$d conflitos)</string>
- <string name="use_ssl">Empregar a conexión segura</string>
- <string name="location_no_provider">%1$s non pode rastrexar o seu dispositivo. Comprobe as configuracións de localización.</string>
+ <string name="sync_foreign_files_forgotten_ticker">Algúns ficheiros locais foron esquecidos</string>
+ <string name="sync_foreign_files_forgotten_content">Non é posíbel copiar %1$d ficheiros do cartafol %2$s en</string>
+ <string name="sync_foreign_files_forgotten_explanation">Desde a versión 1.3.16, os ficheiros enviados desde este dispositivo cópianse no cartafol local %1$s para evitar a perda de datos cando se sincroniza un ficheiro con varias contas.\n\nPor mor deste cambio, todos os ficheiros enviados coas versións anteriores deste aplicativo cópianse no cartafol %2$s. Porén, un erro impediu a finalización desta operación durante a sincronización da conta. É posíbel deixar o(s) ficheiro(s) como está(n) e retirar a ligazón a %3$s, ou mover o(s) ficheiro(s) ao directorio %1$s e manter a ligazón a %4$s.\n\nA seguir enuméranse o(s) ficheiro(s) local(is), e o(s) ficheiro(s) remoto(s) en %5$s co(s) que estaba(n) ligado(s).</string>
+ <string name="sync_current_folder_was_removed">O cartafol %1$s xa non existe</string>
+ <string name="foreign_files_move">Mover todo</string>
+ <string name="foreign_files_success">Foron movidos todos os ficheiros</string>
+ <string name="foreign_files_fail">Algúns ficheiros non puideron seren movidos</string>
+ <string name="foreign_files_local_text">Local: %1$s</string>
+ <string name="foreign_files_remote_text">Remoto: %1$s</string>
+ <string name="upload_query_move_foreign_files">Non hai espazo abondo para copiar os ficheiros seleccionados no cartafol %1$s. Quere movelos no canto de copialos?</string>
<string name="pincode_enter_pin_code">Insira o seu PIN do aplicativo</string>
- <string name="pincode_enter_new_pin_code">Insira o seu novo PIN do aplicativo</string>
<string name="pincode_configure_your_pin">Introduza o seu PIN do aplicativo</string>
<string name="pincode_configure_your_pin_explanation">Pediráselle o PIN cada vez que se inicie o aplicativo</string>
<string name="pincode_reenter_your_pincode">Volva a introducir o seu PIN do aplicativo</string>
<string name="pincode_wrong">PIN do aplicativo incorrecto</string>
<string name="pincode_removed">O PIN do aplicativo foi retirado</string>
<string name="pincode_stored">Almacenouse o PIN do aplicativo</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 minutos</item>
- <item>30 minutos</item>
- <item>60 minutos</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
- <string name="auth_trying_to_login">Tentando acceder…</string>
+ <string name="media_notif_ticker">%1$s reprodutor musical</string>
+ <string name="media_state_playing">%1$s (reproducindo)</string>
+ <string name="media_state_loading">%1$s (cargando)</string>
+ <string name="media_event_done">Rematou a reprodución de %1$s</string>
+ <string name="media_err_nothing_to_play">Non se atopan ficheiros multimedia</string>
+ <string name="media_err_no_account">Non foi fornecida unha conta</string>
+ <string name="media_err_not_in_owncloud">O ficheiro non está nunha conta axeitada</string>
+ <string name="media_err_unsupported">Códec multimedia non admitido</string>
+ <string name="media_err_io">Non é posíbel ler o ficheiro multimedia</string>
+ <string name="media_err_malformed">O ficheiro multimedia non está codificado correctamente</string>
+ <string name="media_err_timeout">Esgotouse o tempo de espera tentando reproducir</string>
+ <string name="media_err_invalid_progressive_playback">Non é posíbel enviar como fluxo o ficheiro multimedia</string>
+ <string name="media_err_unknown">Non é posíbel reproducir o ficheiro multimedia co reprodutor «stock»</string>
+ <string name="media_err_security_ex">Produciuse un erro de seguranza tentando reproducir %1$s</string>
+ <string name="media_err_io_ex">Produciuse un erro de entrada tentando reproducir %1$s</string>
+ <string name="media_err_unexpected">Produciuse un erro non agardado tentando reproducir %1$s</string>
+ <string name="media_rewind_description">Botón de retroceso</string>
+ <string name="media_play_pause_description">Botón de reprodución/pausa</string>
+ <string name="media_forward_description">Botón de avance rápido</string>
+ <string name="auth_trying_to_login">Intentando acceder...</string>
<string name="auth_no_net_conn_title">Sen conexión de rede</string>
- <string name="auth_no_net_conn_message">Non se detectaron conexións de rede. Comprobe a conexión a Internet e tenteo de novo.</string>
- <string name="auth_connect_anyway">Conectar igualmente</string>
<string name="auth_nossl_plain_ok_title">Non hai conexión seguras dispoñíbeis.</string>
- <string name="auth_nossl_plain_ok_message">O aplicativo non puido facer unha conexión segura co servidor. Inda que non é segura, hai unha conexión posíbel. Pode continuar ou cancelala.</string>
<string name="auth_connection_established">Estabeleceuse a conexión</string>
- <string name="auth_testing_connection">Comprobando a conexión…</string>
+ <string name="auth_testing_connection">Comprobando a conexión...</string>
<string name="auth_not_configured_title">Configuración errada do servidor</string>
- <string name="auth_not_configured_message">Semella que a súa instancia do servidor non está configurada correctamente. Contacte co seu administrador para máis detalles.</string>
+ <string name="auth_account_not_new">Xa existe unha conta do mesmo usuario e servidor neste dispositivo</string>
+ <string name="auth_account_not_the_same">O usuario que introduciu non coincide co usuario desta conta</string>
<string name="auth_unknown_error_title">Produciuse un erro descoñecido!</string>
- <string name="auth_unknown_error_message">Produciuse un erro descoñecido. Contacte cos autores e infórmeos do fallo cos rexistros de erro do seu dispositivo.</string>
<string name="auth_unknown_host_title">Non foi posíbel atopar a máquina</string>
- <string name="auth_unknown_host_message">Non foi posíbel atopar a máquina indicada. Comprobe o nome da máquina e tenteo de novo.</string>
<string name="auth_incorrect_path_title">Non se atopou unha instancia do servidor</string>
- <string name="auth_incorrect_path_message">O aplicativo non atopou instancias do servidor na ruta indicada. Comprobe a ruta e tenteo de novo.</string>
<string name="auth_timeout_title">O servidor tardou demasiado en responder</string>
<string name="auth_incorrect_address_title">URL incorrecto</string>
<string name="auth_ssl_general_error_title">Produciuse un fallo ao iniciar o SSL</string>
- <string name="auth_ssl_unverified_server_title">A identidade SSL do servidor non foi verficada</string>
+ <string name="auth_ssl_unverified_server_title">Non foi posíbel verificar a identidade do servidor SSL</string>
<string name="auth_bad_oc_version_title">Versión do servidor non recoñecida</string>
<string name="auth_wrong_connection_title">Non é posíbel estabelecer a conexión</string>
<string name="auth_secure_connection">Estabeleceuse unha conexión segura</string>
- <string name="auth_login_details">Detalles do acceso</string>
- <string name="auth_unauthorized">Usuario ou contrasinal incorrectos</string>
- <string name="auth_not_found">Deuse unha ruta incorrecta</string>
- <string name="auth_internal">Produciuse un erro interno do servidor, código %1$d</string>
- <string name="crashlog_message">O aplicativo deixou de funcionar de xeito inesperado. Quere enviar un informe desta quebra?</string>
- <string name="crashlog_send_report">Enviar un informe</string>
- <string name="crashlog_dont_send_report">Non enviar un informe</string>
- <string name="extensions_avail_title">Extensión dispoñíbel!</string>
- <string name="extensions_avail_message">Semella que a súa instancia do servidor admite extensións avanzadas. Quere ver se hai extensións dispoñíbeis para Android ?</string>
+ <string name="auth_unauthorized">Nome de usuario ou contrasinal incorrecto</string>
+ <string name="auth_oauth_error">A autorización non foi aceptada</string>
+ <string name="auth_oauth_error_access_denied">O acceso foi denegado polo servidor de autorización</string>
+ <string name="auth_wtf_reenter_URL">Estado inesperado, introduza de novo o enderezo URL do servidor</string>
+ <string name="auth_expired_oauth_token_toast">A súa autorización caducou. Autorícese de novo</string>
+ <string name="auth_expired_basic_auth_toast">Introduza o contrasinal actual</string>
+ <string name="auth_expired_saml_sso_token_toast">A súa sesión caducou. Acceda de novo</string>
+ <string name="auth_connecting_auth_server">Conectando co servidor de autenticación…</string>
+ <string name="auth_unsupported_auth_method">O servidor non admite este método de autenticación</string>
+ <string name="auth_unsupported_multiaccount">%1$s non admite contas múltipes</string>
+ <string name="auth_can_not_auth_against_server">Non é posíbel autenticalo neste servidor</string>
<string name="fd_keep_in_sync">Manter actualizado o ficheiro</string>
- <string name="common_share">Compartir</string>
<string name="common_rename">Renomear</string>
<string name="common_remove">Retirar</string>
<string name="confirmation_remove_alert">Confirma que quere retirar %1$s ?</string>
<string name="rename_server_fail_msg">Non foi posíbel completar a operación de cambio de nome</string>
<string name="sync_file_fail_msg">Non foi posíbel comprobar o ficheiro remoto</string>
<string name="sync_file_nothing_to_do_msg">Os contidos do ficheiro xa están sincronizados</string>
- <string name="create_dir_fail_msg">Non foi posíbel crear o directorio</string>
+ <string name="create_dir_fail_msg">Non foi posíbel crear o cartafol</string>
+ <string name="filename_forbidden_characters">Caracteres non permitidos: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Agarde un chisco</string>
<string name="filedisplay_unexpected_bad_get_content">Produciuse un erro non agardado. Seleccione o ficheiro con outro aplicativo diferente</string>
<string name="filedisplay_no_file_selected">Non se escolleu ningún ficheiro</string>
- <string name="ssl_validator_title">Aviso</string>
+ <string name="activity_chooser_title">Enviar a ligazón a ...</string>
+ <string name="oauth_check_onoff">Acceder con oAuth2</string>
+ <string name="oauth_login_connection">Conectando co servidor oAuth2…</string>
<string name="ssl_validator_header">Non foi posíbel verificar a identidade do sitio</string>
<string name="ssl_validator_reason_cert_not_trusted">- O certificado do servidor non é de confianza</string>
<string name="ssl_validator_reason_cert_expired">- O certificado do servidor caducou</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- As datas de validez do certificado están son do futuro</string>
<string name="ssl_validator_reason_hostname_not_verified">- O URL non coincide co nome de máquina no certificado</string>
- <string name="ssl_validator_certificate_not_available">Non foi posíbel obter o certificado do servidor</string>
<string name="ssl_validator_question">Aínda así, quere fiar neste certificado igualmente?</string>
<string name="ssl_validator_not_saved">Non foi posíbel gardar o certificado</string>
<string name="ssl_validator_btn_details_see">Detalles</string>
<string name="ssl_validator_label_validity_to">A:</string>
<string name="ssl_validator_label_signature">Sinatura:</string>
<string name="ssl_validator_label_signature_algorithm">Algoritmo:</string>
- <string name="text_placeholder">Isto é unha marca de posición</string>
+ <string name="ssl_validator_null_cert">Non é posíbel amosar o certificado.</string>
+ <string name="ssl_validator_no_info_about_error">- Non hai información sobre este erro</string>
+ <string name="placeholder_sentence">Isto é un marcador de posición</string>
+ <string name="placeholder_filename">marcador_de_posición.txt</string>
+ <string name="placeholder_filetype">Imaxe PNG</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Enviar imaxes só medinte WiFi</string>
<string name="instant_upload_path">/EnvíoInstantáneo</string>
<string name="conflict_title">Conflito de actualización</string>
<string name="conflict_keep_both">Manter ambos</string>
<string name="conflict_overwrite">Sobrescribir</string>
<string name="conflict_dont_upload">Non enviar</string>
+ <string name="preview_image_description">Vista previa da imaxe</string>
+ <string name="preview_image_error_unknown_format">Esta imaxe non pode ser amosada</string>
+ <string name="error__upload__local_file_not_copied">Non foi posíbel copiar %1$s no cartafol local %2$s</string>
+ <string name="actionbar_failed_instant_upload">produciuse un fallo de EnvíoInstantáneo</string>
+ <string name="failed_upload_headline_text">Envíos instantáneos fallados</string>
+ <string name="failed_upload_headline_hint">Resumo de todos os envíos instantáneos fallados</string>
+ <string name="failed_upload_all_cb">seleccionar todo</string>
+ <string name="failed_upload_headline_retryall_btn">tentar de novo todo o seleccionado</string>
+ <string name="failed_upload_headline_delete_all_btn">eliminar todo o seleccionado da cola de envío</string>
+ <string name="failed_upload_retry_text">tentar de novo o envío da imaxe:</string>
+ <string name="failed_upload_load_more_images">Cargar máis imaxes</string>
+ <string name="failed_upload_retry_do_nothing_text">non facer nada que non estea en liña para o envío instantáneo</string>
+ <string name="failed_upload_failure_text">Mensaxe de fallo:</string>
+ <string name="failed_upload_quota_exceeded_text">Comprobe a configuración do seu servidor. é probábel que xa excedera a cota.</string>
+ <string name="share_link_file_no_exist">Non foi posíbel compartir este ficheiro ou cartafol. Asegurese de que existe.</string>
+ <string name="share_link_file_error">Produciuse un erro ao tentar compartir este ficheiro ou cartafol.</string>
+ <string name="unshare_link_file_no_exist">Non foi posíbel deixar de compartir este ficheiro ou cartafol xa que non existe.</string>
+ <string name="unshare_link_file_error">Produciuse un erro ao tentar deixar de compartir este ficheiro ou cartafol</string>
+ <string name="activity_chooser_send_file_title">Enviar</string>
+ <string name="copy_link">Copiar a ligazón</string>
+ <string name="clipboard_text_copied">Copiado no portapapeis.</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">ססמה:</string>
- <string name="main_login">שם משתמש:</string>
- <string name="main_button_login">התחברות</string>
- <string name="main_welcome">ברוך בואך</string>
- <string name="main_files">קבצים</string>
- <string name="main_music">מוזיקה</string>
- <string name="main_contacts">אנשי קשר</string>
- <string name="main_calendar">יומן</string>
- <string name="main_bookmarks">סימניות</string>
- <string name="main_settings">הגדרות</string>
- <string name="main_tit_accsetup">הגדרת חשבון</string>
- <string name="main_wrn_accsetup">לא הוגדר חשבון בהתקן שלך. כדי להשתמש ביישום זה עליך ליצור אחד.</string>
- <string name="about_message">יישום האנדרויד של %1$s\n\nגרסה: %2$s</string>
- <string name="actionbar_sync">רענון</string>
<string name="actionbar_upload">העלאה</string>
<string name="actionbar_upload_from_apps">תוכן מיישומים אחרים</string>
<string name="actionbar_upload_files">קבצים</string>
- <string name="actionbar_mkdir">יצירת תיקייה</string>
- <string name="actionbar_search">חיפוש</string>
<string name="actionbar_settings">הגדרות</string>
+ <string name="actionbar_see_details">פרטים</string>
+ <string name="actionbar_send_file">שליחה</string>
<string name="prefs_category_general">כללי</string>
- <string name="prefs_category_trackmydevice">מעקב אחר מכשירים</string>
- <string name="prefs_add_session">הוספת הפעלה חדשה</string>
- <string name="prefs_create_img_thumbnails">יצירת תמונות ממוזערות</string>
- <string name="prefs_select_oc_account">נא לבחור בחשבון</string>
- <string name="prefs_summary_select_oc_account">נא לבחור באיזה מהחשבונות שלך היישום אמור להשתמש.</string>
- <string name="prefs_trackmydevice">מעקב אחר מכשירים</string>
- <string name="prefs_trackmydevice_summary_off">יש להפעיל יישום זה כדי לעקוב אחר מיקום ההתקן שלך</string>
- <string name="prefs_trackmydevice_summary_on">יישום זה עוקב אחר ההתקן</string>
- <string name="prefs_trackmydevice_interval">מרווח בין עדכונים</string>
- <string name="prefs_trackmydevice_interval_summary">לעדכן בכל %1$s דקות</string>
+ <string name="prefs_category_more">יותר</string>
<string name="prefs_accounts">חשבונות</string>
<string name="prefs_manage_accounts">ניהול חשבונות</string>
<string name="prefs_pincode">קוד יישום</string>
<string name="prefs_pincode_summary">הגנה על הלקוח שלך</string>
<string name="prefs_instant_upload">הפעלת העלאות מהירות</string>
<string name="prefs_instant_upload_summary">העלאה מהירה של תמונות שמצולמות במצלמה שלך</string>
- <string name="auth_host_url">כתובת</string>
+ <string name="prefs_help">עזרה</string>
<string name="auth_username">שם משתמש</string>
<string name="auth_password">ססמה</string>
- <string name="auth_register">%1$s חדש לי</string>
- <string name="new_session_uri_error">הכתובת שצוינה שגויה</string>
- <string name="new_session_session_name_error">שם ההפעלה שגוי</string>
<string name="sync_string_files">קבצים</string>
- <string name="uploader_no_file_selected">לא נבחר שום קובץ להעלאה</string>
- <string name="setup_hint_username">שם משתמש</string>
- <string name="setup_hint_password">ססמה</string>
- <string name="setup_hint_address">כתובת אתר</string>
- <string name="setup_hint_show_password">האם להציג את הססמה?</string>
- <string name="setup_title">התחברות ל־%1$s שלך</string>
<string name="setup_btn_connect">התחברות</string>
<string name="uploader_btn_upload_text">העלאה</string>
<string name="uploader_wrn_no_account_title">לא נמצא חשבון</string>
<string name="uploader_wrn_no_content_text">לא התקבל תוכן. אין מה להעלות.</string>
<string name="uploader_error_forbidden_content">ל־%1$s אין הרשאה לגשת לתוכן המשותף שלך</string>
<string name="uploader_info_uploading">בהעלאה</string>
- <string name="uploader_btn_create_dir_text">יצירת תיקייה להעלאה</string>
<string name="file_list_empty">אין קבצים בתיקייה זו.\nניתן להוסיף קבצים חדשים בעזרת האפשרות „העלאה“ מהתפריט.</string>
<string name="filedetails_select_file">יש לגעת בקובץ כדי להציג פרטים נוספים.</string>
<string name="filedetails_size">גודל:</string>
<string name="filedetails_created">מועד היצירה:</string>
<string name="filedetails_modified">מועד השינוי:</string>
<string name="filedetails_download">הורדה</string>
- <string name="filedetails_sync_file">רענון</string>
- <string name="filedetails_redownload">הורדה מחדש</string>
- <string name="filedetails_open">פתיחה</string>
<string name="filedetails_renamed_in_upload_msg">שם הקובץ השתנה ל־ %1$s במהלך ההעלאה</string>
<string name="common_yes">כן</string>
<string name="common_no">לא</string>
<string name="common_cancel_upload">ביטול ההעלאה</string>
<string name="common_cancel">ביטול</string>
<string name="common_save_exit">לשמור ולצאת</string>
- <string name="common_exit">לעזוב את %1$s</string>
<string name="common_error">שגיאה</string>
+ <string name="common_loading">בטעינה …</string>
+ <string name="common_error_unknown">שגיאה בלתי ידועה</string>
<string name="about_title">על אודות</string>
+ <string name="change_password">שינוי ססמה</string>
<string name="delete_account">מחיקת חשבון</string>
<string name="create_account">יצירת חשבון</string>
<string name="upload_chooser_title">העלאה מהמיקום …</string>
<string name="uploader_upload_in_progress_content">%1$d%% בהעלאה %2$s</string>
<string name="uploader_upload_succeeded_ticker">ההעלאה הצליחה</string>
<string name="uploader_upload_succeeded_content_single">%1$s נשלח בהצלחה</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d קבצים נשלחו בהצלחה</string>
<string name="uploader_upload_failed_ticker">ההעלאה נכשלה</string>
<string name="uploader_upload_failed_content_single">אין אפשרות להשלים את ההעלאה של %1$s</string>
- <string name="uploader_upload_failed_content_multiple">ההעלאה נכשלה: %1$d/%2$d קבצים נשלחו</string>
<string name="downloader_download_in_progress_ticker">בהורדה …</string>
<string name="downloader_download_in_progress_content">%1$d%% בהורדה %2$s</string>
<string name="downloader_download_succeeded_ticker">ההורדה הצליחה</string>
<string name="downloader_download_failed_ticker">ההורדה נכשלה</string>
<string name="downloader_download_failed_content">לא ניתן להשלים את ההורדה של </string>
<string name="common_choose_account">נא לבחור בחשבון</string>
- <string name="sync_string_contacts">אנשי קשר</string>
<string name="sync_fail_ticker">הסנכרון נכשל</string>
<string name="sync_fail_content">לא ניתן להשלים את הסנכרון של </string>
<string name="sync_conflicts_in_favourites_ticker">נמצאו התנגשויות</string>
<string name="sync_conflicts_in_favourites_content">לא ניתן לסנכרן %1$d קבצים שהוגדרו לסנכרון</string>
<string name="sync_fail_in_favourites_ticker">קבצים שהוגדרו לסנכרון נכשלו</string>
<string name="sync_fail_in_favourites_content">לא ניתן לסנכרם את תוכנם של %1$d מהקבצים (%2$d התנגשויות)</string>
- <string name="use_ssl">להשתמש בחיבור מאובטח</string>
- <string name="location_no_provider">ל־%1$s אין אפשרות לעקוב אחר ההתקן שלך. נא לבדוק את הגדרות המיקום שלך</string>
+ <string name="sync_foreign_files_forgotten_ticker">חלק מהקבצים המקומיים נשכחו</string>
+ <string name="foreign_files_move">להעביר הכול</string>
+ <string name="foreign_files_success">כל הקבצים הועברו</string>
+ <string name="foreign_files_fail">לא ניתן להעביר חלק מהקבצים</string>
+ <string name="foreign_files_local_text">מקומי: %1$s</string>
+ <string name="foreign_files_remote_text">מרוחק: %1$s</string>
<string name="pincode_enter_pin_code">נא להזין את קוד היישום שלך</string>
- <string name="pincode_enter_new_pin_code">נא להזין את הקוד החדש של היישום שלך</string>
<string name="pincode_configure_your_pin">נא להזין את קוד היישום שלך</string>
<string name="pincode_configure_your_pin_explanation">תופיע בקשה לקוד בכל פעם שהיישום מופעל</string>
<string name="pincode_reenter_your_pincode">נא להזין את קוד היישום שלך מחדש</string>
<string name="pincode_wrong">קוד היישום שגוי</string>
<string name="pincode_removed">קוד היישום הוסר</string>
<string name="pincode_stored">קוד היישום אוחסן</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>רבע שעה</item>
- <item>חצי שעה</item>
- <item>שעה</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="media_notif_ticker">נגנן המוזיקה %1$s</string>
+ <string name="media_state_playing">%1$s (מתנגן)</string>
+ <string name="media_state_loading">%1$s (בטעינה)</string>
+ <string name="media_err_nothing_to_play">לא נמצא קובץ מדיה</string>
+ <string name="media_err_no_account">לא צוין חשבון</string>
+ <string name="media_err_not_in_owncloud">הקובץ אינו בחשבון תקני</string>
+ <string name="media_err_unsupported">מקודד המדיה אינו נתמך</string>
+ <string name="media_err_io">לא ניתן לקרוא את קובץ המדיה</string>
<string name="auth_trying_to_login">מתבצע ניסיון כניסה…</string>
<string name="auth_no_net_conn_title">אין חיבור לאינטרנט</string>
- <string name="auth_no_net_conn_message">לא נבחר חיבור לאינטרנט, נא לבדוק את החיבור שלך לאינטרנט ולנסות שוב.</string>
- <string name="auth_connect_anyway">להתחבר בכל זאת</string>
<string name="auth_nossl_plain_ok_title">אין חיבור מוצפן זמין.</string>
- <string name="auth_nossl_plain_ok_message">היישום לא יכול לקיים חיבור מאובטח לשרת. עם זאת קיים חיבור שאינו מאובטח. ניתן להמשיך או לבטל.</string>
<string name="auth_connection_established">החיבור נוצר</string>
<string name="auth_testing_connection">החיבור נבדק…</string>
<string name="auth_not_configured_title">תצורת השרת פגומה</string>
- <string name="auth_not_configured_message">מסתבר כי עותק השרת שלך אינו מוגדר נכון. נא ליצור קשר עם המנהל שלך לקבלת פרטים נוספים.</string>
<string name="auth_unknown_error_title">אירעה שגיאה בלתי ידועה!</string>
- <string name="auth_unknown_error_message">אירעה שגיאה בלתי ידועה. נא ליצור קשר עם התמיכה ולכלול את קובצי הרישום (log) מההתקן שלך.</string>
<string name="auth_unknown_host_title">לא ניתן למצוא את המארח</string>
- <string name="auth_unknown_host_message">לא ניתן למצוא את המארח שהוזן. נא לבדוק את שם המארח ואת זמינות השרת ולנסות שוב.</string>
<string name="auth_incorrect_path_title">לא נמצא מופע שרת</string>
- <string name="auth_incorrect_path_message">היישום לא הצליח למצוא עותק שרת בנתיב שצוין. נא לבדוק את הנתיב שלך ולנסות שוב.</string>
<string name="auth_timeout_title">לשרת לקח יותר מדי זמן להגיב</string>
<string name="auth_incorrect_address_title">כתובת שגויה</string>
<string name="auth_ssl_general_error_title">הפעלת ה־SSL נכשלה</string>
- <string name="auth_ssl_unverified_server_title">זהות ה־SSL של השרת לא מאומתת</string>
<string name="auth_bad_oc_version_title">גרסה השרת אינה מזוהה</string>
<string name="auth_wrong_connection_title">לא ניתן ליצור את החיבור</string>
<string name="auth_secure_connection">נוצר חיבור מאובטח</string>
- <string name="auth_login_details">פרטי הכניסה</string>
- <string name="auth_unauthorized">שם משתמש / ססמה שגויים</string>
- <string name="auth_not_found">הנתיב שצוין שגוי</string>
- <string name="auth_internal">שגיאת שרת פנימית, קוד </string>
- <string name="crashlog_message">היישום הושבת באופן בלתי צפוי. האם לשלוח דוח קריסה?</string>
- <string name="crashlog_send_report">שליחת דוח</string>
- <string name="crashlog_dont_send_report">לא לשלוח דוח</string>
- <string name="extensions_avail_title">יש הרחבות זמינות!</string>
- <string name="extensions_avail_message">מסתבר כי השרת שלך תומך בהרחבות מתקדמות. האם ברצונך לצפות בהרחבות הזמינות לאנדרויד?</string>
<string name="fd_keep_in_sync">לשמור על קובץ עדכני</string>
- <string name="common_share">שתף</string>
<string name="common_rename">שינוי שם</string>
<string name="common_remove">הסרה</string>
<string name="confirmation_remove_alert">האם אכן להסיר את </string>
<string name="rename_server_fail_msg">לא ניתן להשלים את פעולת שינוי השם</string>
<string name="sync_file_fail_msg">לא ניתן לבדוק את הקובץ המרוחק </string>
<string name="sync_file_nothing_to_do_msg">תוכן הקובץ כבר מסונכרן</string>
- <string name="create_dir_fail_msg">לא ניתן ליצור את התיקייה</string>
<string name="wait_a_moment">נא להמתין רגע</string>
<string name="filedisplay_unexpected_bad_get_content">תקלה בלתי צפויה ; נא לבחור בקובץ מיישום אחר</string>
<string name="filedisplay_no_file_selected">לא נבחרו קבצים</string>
- <string name="ssl_validator_title">אזהרה</string>
<string name="ssl_validator_header">לא ניתן לאמת את זהות האתר</string>
<string name="ssl_validator_reason_cert_not_trusted">- תעודת השרת אינה מהימנה</string>
<string name="ssl_validator_reason_cert_expired">- תוקף תעודת השרת פג</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- תוקף תעודת השרת מתייחס לתאריכים בעתיד</string>
<string name="ssl_validator_reason_hostname_not_verified">- הכתובת אינה תואמת לשם המארח בתעודה</string>
- <string name="ssl_validator_certificate_not_available">לא ניתן לקבל את תעודת השרת</string>
<string name="ssl_validator_question">האם לתת אמון בתעודה זו בכל אופן?</string>
<string name="ssl_validator_not_saved">לא ניתן לשמור את התעודה</string>
<string name="ssl_validator_btn_details_see">פרטים</string>
<string name="ssl_validator_label_validity_to">סיום:</string>
<string name="ssl_validator_label_signature">חתימה:</string>
<string name="ssl_validator_label_signature_algorithm">אלגוריתם:</string>
- <string name="text_placeholder">זהו ממלא מקום</string>
+ <string name="placeholder_sentence">זהו ממלא מקום</string>
+ <string name="placeholder_filetype">תמונת PNG</string>
+ <string name="placeholder_filesize">389 ק״ב</string>
<string name="instant_upload_on_wifi">העלאת תמונות דרך WiFi בלבד</string>
<string name="instant_upload_path">/InstantUpload</string>
<string name="conflict_title">התנגשות עדכון</string>
<string name="conflict_keep_both">להשאיר את שניהם</string>
<string name="conflict_overwrite">לשכתב</string>
<string name="conflict_dont_upload">לא להעלות</string>
+ <string name="failed_upload_headline_hint">הסיכום של כל ההעלאות המהירות שנכשלו</string>
+ <string name="failed_upload_all_cb">לבחור הכול</string>
+ <string name="failed_upload_headline_retryall_btn">לנסות שוב את כל הנבחרים</string>
+ <string name="failed_upload_headline_delete_all_btn">למחוק את כל הנבחרים מתור ההעלאה</string>
+ <string name="failed_upload_retry_text">לנסות להעלות את התמונה מחדש:</string>
+ <string name="failed_upload_load_more_images">טעינת תמונות נוספות</string>
+ <string name="failed_upload_failure_text">הודעת התקלה:</string>
+ <string name="failed_upload_quota_exceeded_text">נא לבדוק את תצורת שרת שלך, יתכן שחרגת מהמיכסה שלך.</string>
+ <string name="activity_chooser_send_file_title">שליחה</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="main_settings">सेटिंग्स</string>
+ <string name="actionbar_upload">अपलोड </string>
<string name="actionbar_settings">सेटिंग्स</string>
+ <string name="actionbar_send_file">भेजें</string>
+ <string name="prefs_category_general">सामान्य </string>
+ <string name="prefs_help">सहयोग</string>
<string name="auth_username">प्रयोक्ता का नाम</string>
<string name="auth_password">पासवर्ड</string>
- <string name="setup_hint_username">प्रयोक्ता का नाम</string>
- <string name="setup_hint_password">पासवर्ड</string>
+ <string name="uploader_btn_upload_text">अपलोड </string>
+ <string name="common_error">त्रुटि</string>
+ <string name="activity_chooser_send_file_title">भेजें</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Lozinka:</string>
- <string name="main_login">Korisničko ime:</string>
- <string name="main_button_login">Prijava</string>
- <string name="main_files">Datoteke</string>
- <string name="main_music">Muzika</string>
- <string name="main_contacts">Kontakti</string>
- <string name="main_calendar">Kalendar</string>
- <string name="main_bookmarks">Zabilješke</string>
- <string name="main_settings">Postavke</string>
- <string name="actionbar_sync">Osvježi</string>
<string name="actionbar_upload">Učitaj</string>
<string name="actionbar_upload_files">Datoteke</string>
- <string name="actionbar_mkdir">Kreiraj direktorij</string>
- <string name="actionbar_search">pretraži</string>
<string name="actionbar_settings">Postavke</string>
<string name="prefs_category_general">Općenito</string>
- <string name="prefs_add_session">Dodaj novo pretraživanje</string>
- <string name="prefs_select_oc_account">Izaberi račun</string>
+ <string name="prefs_category_more">više</string>
<string name="prefs_accounts">Korisnićki računi</string>
- <string name="auth_host_url">ownCloud URL</string>
+ <string name="prefs_help">Pomoć</string>
<string name="auth_username">Korisničko ime</string>
<string name="auth_password">Lozinka</string>
<string name="sync_string_files">Datoteke</string>
- <string name="setup_hint_username">Korisničko ime</string>
- <string name="setup_hint_password">Lozinka</string>
- <string name="setup_hint_address">Web adresa</string>
- <string name="setup_hint_show_password">Prikaži lozinku?</string>
<string name="setup_btn_connect">Poveži</string>
<string name="uploader_btn_upload_text">Učitaj</string>
<string name="uploader_wrn_no_account_quit_btn_text">Izlaz</string>
<string name="filedetails_download">Preuzimanje</string>
- <string name="filedetails_sync_file">Osvježi</string>
- <string name="filedetails_redownload">Osvježi</string>
<string name="common_yes">Da</string>
+ <string name="common_no">Ne</string>
<string name="common_cancel_upload">Prekini upload</string>
<string name="common_cancel">Odustani</string>
<string name="common_error">Greška</string>
- <string name="sync_string_contacts">Kontakti</string>
+ <string name="change_password">Izmjena lozinke</string>
<string name="auth_trying_to_login">Trying to login…</string>
- <string name="common_share">Podijeli</string>
<string name="common_rename">Promjeni ime</string>
<string name="common_remove">Makni</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Jelszó:</string>
- <string name="main_login">Felhasználói név:</string>
- <string name="main_button_login">Belépés</string>
- <string name="main_welcome">Üdv</string>
- <string name="main_files">Fájlok</string>
- <string name="main_music">Zene</string>
- <string name="main_contacts">Címjegyzék</string>
- <string name="main_calendar">Naptár</string>
- <string name="main_bookmarks">Könyvjelzők</string>
- <string name="main_settings">Beállítások</string>
- <string name="main_tit_accsetup">Fiók beállítása</string>
- <string name="main_wrn_accsetup">Nincs beállított fiók a készülékén. Ahhoz, hogy használja ezt a programot, létre kell hozzon egyet.</string>
- <string name="about_message">%1$s Android alkalmazás\nverzió: %2$s</string>
- <string name="actionbar_sync">Frissítés</string>
+ <string name="about_android">%1$s Android Alkalmazás</string>
+ <string name="about_version">verzió %1$s</string>
+ <string name="actionbar_sync">Fiók frissítése</string>
<string name="actionbar_upload">Feltöltés</string>
<string name="actionbar_upload_from_apps">Más alkalmazásokból származó tartalom</string>
<string name="actionbar_upload_files">Fájlok</string>
- <string name="actionbar_mkdir">Mappa létrehozása</string>
- <string name="actionbar_search">Keresés</string>
+ <string name="actionbar_open_with">Megnyitás a következővel</string>
+ <string name="actionbar_mkdir">Új mappa</string>
<string name="actionbar_settings">Beállítások</string>
+ <string name="actionbar_see_details">Részletek</string>
+ <string name="actionbar_send_file">Küldjük el</string>
<string name="prefs_category_general">Általános</string>
- <string name="prefs_category_trackmydevice">Eszközkövetés</string>
- <string name="prefs_add_session">Új munkafolyamat létrehozása</string>
- <string name="prefs_create_img_thumbnails">Bélyegkép készítése</string>
- <string name="prefs_select_oc_account">Válasszon egy felhasználónevet</string>
- <string name="prefs_summary_select_oc_account">Válassza ki, hogy a program milyen fiókot használjon.</string>
- <string name="prefs_trackmydevice">Eszközkövetés</string>
- <string name="prefs_trackmydevice_summary_off">Engedélyezze ennek a programnak a helykövetést</string>
- <string name="prefs_trackmydevice_summary_on">Ez a program eltárolja ennek a készüléknek az útvonalát</string>
- <string name="prefs_trackmydevice_interval">A frissítés gyakorisága</string>
- <string name="prefs_trackmydevice_interval_summary">Minden %1$s percben</string>
+ <string name="prefs_category_more">Több</string>
<string name="prefs_accounts">Fiókok</string>
<string name="prefs_manage_accounts">Fiókok kezelése</string>
<string name="prefs_pincode">Alkalmazás PIN</string>
<string name="prefs_pincode_summary">Védje meg az alkalmazást</string>
<string name="prefs_instant_upload">Az azonnali feltöltés engedélyezése</string>
<string name="prefs_instant_upload_summary">Az eszköz által készített fényképek azonnali feltöltése</string>
- <string name="auth_host_url">URL</string>
+ <string name="prefs_log_title">Naplózás engedélyezése</string>
+ <string name="prefs_log_summary">Ez használható a problémák naplózásához</string>
+ <string name="prefs_log_title_history">Naplózás előzménye</string>
+ <string name="prefs_log_summary_history">Ez megjeleníti a rögzitett eseményeket</string>
+ <string name="prefs_log_delete_history_button">Elözmények törlése</string>
+ <string name="prefs_help">Súgó</string>
+ <string name="prefs_recommend">Ajánlja egy barátjának</string>
+ <string name="prefs_feedback">Visszajelzés</string>
+ <string name="prefs_imprint">Impresszum</string>
+ <string name="recommend_subject">Próbálja ki %1$s-t az okostelefonján!</string>
+ <string name="auth_check_server">Szerver állapot ellenörzés</string>
+ <string name="auth_host_url">Kiszolgáló címe https://...</string>
<string name="auth_username">Felhasználói név</string>
<string name="auth_password">Jelszó</string>
- <string name="auth_register">Új kapcsolat: %1$s</string>
- <string name="new_session_uri_error">A megadott cím helytelen</string>
- <string name="new_session_session_name_error">A megadott munkafolyamatnév érvénytelen</string>
+ <string name="auth_register">Új vagy a %1$s területen?</string>
<string name="sync_string_files">Fájlok</string>
- <string name="uploader_no_file_selected">A feltöltéshez nincs fájl kiválasztva</string>
- <string name="setup_hint_username">Felhasználói név</string>
- <string name="setup_hint_password">Jelszó</string>
- <string name="setup_hint_address">Web cím</string>
- <string name="setup_hint_show_password">A jelszó megjelenjen?</string>
- <string name="setup_title">Kapcsolódás ehhez: %1$s</string>
<string name="setup_btn_connect">Kapcsolódás</string>
<string name="uploader_btn_upload_text">Feltöltés</string>
<string name="uploader_wrn_no_account_title">Nincs ilyen felhasználói fiók</string>
<string name="uploader_wrn_no_content_text">Nem jött tartalom. Nincs mit feltölteni.</string>
<string name="uploader_error_forbidden_content">%1$s nem jogosult a megosztott tartalom elérésére</string>
<string name="uploader_info_uploading">Feltöltés</string>
- <string name="uploader_btn_create_dir_text">Könyvtár létrehozása a feltöltésekhez</string>
<string name="file_list_empty">Ebben a mappában nincsenek állományok. A \"Feltöltés\" menüpont segítségével tölthet föl fájlokat.</string>
<string name="filedetails_select_file">Érintsen meg egy fájlt a további információkért.</string>
<string name="filedetails_size">Méret:</string>
<string name="filedetails_created">Készült:</string>
<string name="filedetails_modified">Módosítva:</string>
<string name="filedetails_download">Letöltés</string>
- <string name="filedetails_sync_file">Frissítés</string>
- <string name="filedetails_redownload">Ismételt letöltés</string>
- <string name="filedetails_open">Megnyitás</string>
+ <string name="filedetails_sync_file">File frissítése</string>
<string name="filedetails_renamed_in_upload_msg">A feltöltés során az állmányt erre neveztük át: %1$s</string>
+ <string name="action_share_file">Megosztás hivatkozással</string>
+ <string name="action_unshare_file">Megosztás visszavonása</string>
<string name="common_yes">Igen</string>
<string name="common_no">Nem</string>
<string name="common_ok">OK</string>
<string name="common_cancel_upload">A feltöltés megszakítása</string>
<string name="common_cancel">Mégsem</string>
<string name="common_save_exit">Mentés & Kilépés</string>
- <string name="common_exit">%1$s elhagyása</string>
<string name="common_error">Hiba</string>
+ <string name="common_loading">Betöltés ...</string>
+ <string name="common_error_unknown">Ismeretlen hiba</string>
<string name="about_title">Rólunk</string>
+ <string name="change_password">A jelszó megváltoztatása</string>
<string name="delete_account">Fiók törlése</string>
<string name="create_account">Fiók létrehozása</string>
<string name="upload_chooser_title">Feltöltés innen ...</string>
<string name="uploader_upload_in_progress_content">%1$d%% Feltöltés %2$s</string>
<string name="uploader_upload_succeeded_ticker">A feltöltés sikerült</string>
<string name="uploader_upload_succeeded_content_single">%1$s sikeresen fel lett töltve</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d fájl sikeresen fel lett töltve</string>
<string name="uploader_upload_failed_ticker">A feltöltés nem sikerült</string>
<string name="uploader_upload_failed_content_single"> %1$s fájl feltöltése sikertelen</string>
- <string name="uploader_upload_failed_content_multiple">Hibás feltöltés: %1$d/%2$d fájl feltöltve</string>
<string name="downloader_download_in_progress_ticker">Letöltés ...</string>
<string name="downloader_download_in_progress_content">%1$d%% Letöltés %2$s</string>
<string name="downloader_download_succeeded_ticker">A letöltés sikeres</string>
<string name="downloader_download_succeeded_content">%1$s sikeresen letöltve</string>
<string name="downloader_download_failed_ticker">A letöltés sikertelen</string>
<string name="downloader_download_failed_content">A letöltésből %1$s nem lett befejezve</string>
+ <string name="downloader_not_downloaded_yet">Még nem töltötte le</string>
<string name="common_choose_account">Válasszon azonosítót</string>
- <string name="sync_string_contacts">Címtár</string>
<string name="sync_fail_ticker">A szinkronizálás sikertelen</string>
<string name="sync_fail_content">%1$s szinkronizációját nem sikerült befejezni</string>
+ <string name="sync_fail_content_unauthorized">Érvénytelen jelszó a következőhöz %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Ütközések vannak</string>
<string name="sync_conflicts_in_favourites_content">%1$d szinkronizálandó állományokat nem sikerült szinkronizálni</string>
<string name="sync_fail_in_favourites_ticker">A szinkronizálandó fájlokat nem sikerült szinkronizálni</string>
<string name="sync_fail_in_favourites_content">%1$d fájl szinkronizálása nem sikerült (%2$d ütközés)</string>
- <string name="use_ssl">Biztonságos kapcsolat használata</string>
- <string name="location_no_provider">%1$s nem tudja követni az eszközét. Kérem ellenőrizze a helybeállításait</string>
+ <string name="sync_foreign_files_forgotten_ticker">Néhány helyi fájlt figyelmen kívül hagytunk</string>
+ <string name="sync_current_folder_was_removed">A %1$s mappa már nem létezik</string>
+ <string name="foreign_files_move">Helyezzük át mindet</string>
+ <string name="foreign_files_success">Az összes fájlt áthelyeztük</string>
+ <string name="foreign_files_fail">Egyes fájlokat nem sikerült áthelyezni</string>
+ <string name="foreign_files_local_text">Helyi: %1$s</string>
+ <string name="foreign_files_remote_text">Távoli: %1$s</string>
+ <string name="upload_query_move_foreign_files">Nincs elég hely ahhoz, hogy a kiválasztott fájlokat a %1$s mappába másoljuk. Akkor inkább helyezzük át őket oda?</string>
<string name="pincode_enter_pin_code">Kérem adja meg az alkalmazás PIN-kódját</string>
- <string name="pincode_enter_new_pin_code">Kérem adja meg az alkalmazás új PIN-kódját</string>
<string name="pincode_configure_your_pin">Az alkalmazás PIN-kódja</string>
<string name="pincode_configure_your_pin_explanation">A PIN-t kötelező lesz megadni az alkalmazás minden indításakor</string>
<string name="pincode_reenter_your_pincode">Kérem, adja meg újra az alkalmazás PIN-kódját</string>
<string name="pincode_wrong">Rossz a megadott PIN</string>
<string name="pincode_removed">Az alkalmazás PIN-ját eltávolítottuk</string>
<string name="pincode_stored">Az alkalmazás PIN-jét eltároltuk</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 perc</item>
- <item>30 perc</item>
- <item>60 perc</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="media_notif_ticker">%1$s zene lejátszó</string>
+ <string name="media_state_playing">%1$s (lejátszás)</string>
+ <string name="media_state_loading">%1$s (betöltés)</string>
+ <string name="media_event_done">%1$s lejátszás véget ért</string>
+ <string name="media_err_nothing_to_play">Nincs média fájl találat</string>
+ <string name="media_err_no_account">Nincs felhasználói fiók</string>
+ <string name="media_err_not_in_owncloud">A fájl nincs egy felhasználó fiókban</string>
+ <string name="media_err_unsupported">Nem támogatott média kodek</string>
+ <string name="media_err_io">Media fájl nem olvasható</string>
+ <string name="media_err_malformed">Médiafájl kódolása nem megfelelő</string>
+ <string name="media_err_timeout">A lejátszás közben időtúllépés történt</string>
+ <string name="media_err_invalid_progressive_playback">A média fájlt nem lehet streamelni.</string>
+ <string name="media_err_unknown">A média fájlt nem tudja lejátszani a jelenlegi médialejátszó</string>
+ <string name="media_err_security_ex">Biztonsági hiba amikor megpróbálja lejátszani a %1$s</string>
+ <string name="media_err_io_ex">Bemeneteli hiba amikor megpróbálja lejátszani a %1$s</string>
+ <string name="media_err_unexpected">Váratlan hiba amikor megpróbálja lejátszani a %1$s</string>
+ <string name="media_rewind_description">Következő button</string>
+ <string name="media_play_pause_description">Lejátszás vagy pillanat állj gomb</string>
+ <string name="media_forward_description">Gyors előre gomb</string>
<string name="auth_trying_to_login">Bejelentkezés...</string>
<string name="auth_no_net_conn_title">Nincs hálózati kapcsolat</string>
- <string name="auth_no_net_conn_message">Nem található hálózati kapcsolat, ellenőrizze az internetkapcsolatát, és próbálja újra.</string>
- <string name="auth_connect_anyway">Csatlakozás mindenképpen</string>
<string name="auth_nossl_plain_ok_title">Nem érhető el biztonságos kapcsolat.</string>
- <string name="auth_nossl_plain_ok_message">Az alkalmazás nem tudott titkosított kapcsolatot kialakítani a kiszolgálóval. A nem titkosított kapcsolat elérhető. Folytathatja vagy kiléphet.</string>
<string name="auth_connection_established">A kapcsolat létrejött</string>
<string name="auth_testing_connection">Kapcsolat tesztelése...</string>
<string name="auth_not_configured_title">Hibás a kiszolgáló beállítása</string>
- <string name="auth_not_configured_message">Úgy tűnik a kiszolgáló nincs megfelelően beállítva. Lépjen kapcsolatba a rendszergazdával további információkért.</string>
+ <string name="auth_account_not_new">Egy bejelentkezési beállítás már létezik ugyanehhez a kiszolgálóhoz és felhasználóhoz</string>
+ <string name="auth_account_not_the_same">A megadott felhasználó nem azonos ezzel a belépési jogosultsággal</string>
<string name="auth_unknown_error_title">Ismeretlen hiba történt!</string>
- <string name="auth_unknown_error_message">Ismeretlen hiba történt. Értesítse a terméktámogatást csatolva a az eszközének a naplóbejegyzéseit.</string>
<string name="auth_unknown_host_title">A kiszolgáló nem található</string>
- <string name="auth_unknown_host_message">Nem található a keresett kiszolgáló. Ellenőrizze a nevét és a szerver elérhetőségét majd próbálja újra.</string>
<string name="auth_incorrect_path_title">Kiszolgáló nem található</string>
- <string name="auth_incorrect_path_message">A program nem találta a kiszolgálót a megadott útvonalon. Kérem ellenőrizze az útvonalat, majd próbálja újra.</string>
<string name="auth_timeout_title">A kiszolgáló túl sokára válaszolt</string>
<string name="auth_incorrect_address_title">Hibás URL</string>
<string name="auth_ssl_general_error_title">Nem sikerült az SSL kapcsolat felépítése</string>
- <string name="auth_ssl_unverified_server_title">Nem ellenőrizhető az kiszolgáló biztonsági tanúsítványa</string>
+ <string name="auth_ssl_unverified_server_title">Az SSL kiszolgáló tanúsítványát nem sikerült ellenőrizni</string>
<string name="auth_bad_oc_version_title">Ismeretlen változat a kiszolgálón</string>
<string name="auth_wrong_connection_title">A kapcsolat nem hozható létre</string>
<string name="auth_secure_connection">Létrejött a titkosított kapcsolat</string>
- <string name="auth_login_details">Belépési adatok</string>
- <string name="auth_unauthorized">Érvénytelen felhasználónév / jelszó</string>
- <string name="auth_not_found">Rossz a megadott útvonal</string>
- <string name="auth_internal">Belső hiba történt a kiszolgálón, hibakód: %1$d</string>
- <string name="crashlog_message">A program összeomlott. El akar küldeni egy összeomlási jelentést?</string>
- <string name="crashlog_send_report">Jelentés küldése</string>
- <string name="crashlog_dont_send_report">Ne küldjön jelentést</string>
- <string name="extensions_avail_title">Kiegészítők állnak rendelkezésre!</string>
- <string name="extensions_avail_message">Úgy tűnik a programja támogatja a haladó kiterjesztéseket. Látni akarja az androidon elérhető kiterjesztéseket?</string>
+ <string name="auth_unauthorized">Hibás felhasználónév vagy jelszó</string>
+ <string name="auth_oauth_error">Sikertelen azonosítás</string>
+ <string name="auth_oauth_error_access_denied">Hozzáférés megtagadva az azonsítást végző szerver által</string>
+ <string name="auth_wtf_reenter_URL">Nem várt állapot; kérlek, menj a szerver URL-jére újra.</string>
+ <string name="auth_expired_oauth_token_toast">A jogosultsága lejárt. Kérjük jelentkezzen be ismét!</string>
+ <string name="auth_expired_basic_auth_toast">Kélek, írd be a jelenlegi jelszavadat</string>
+ <string name="auth_expired_saml_sso_token_toast">Lejárt a munkamenetének érvényessége. Kérjük jelentkezzen be ismét!</string>
+ <string name="auth_connecting_auth_server">Kapcsolódás a felhasználóazonosítást végző kiszolgálóhoz...</string>
+ <string name="auth_unsupported_auth_method">A kiszolgáló nem támogatja ezt a felhasználóazonosítási módszert</string>
+ <string name="auth_unsupported_multiaccount">%1$s nem támogat több bejelenkezési jogosultságot</string>
+ <string name="auth_can_not_auth_against_server">Nem hiteleíthető a szerverrel szemben</string>
<string name="fd_keep_in_sync">Automatikusan frissítse a fájlokat</string>
- <string name="common_share">Megosztás</string>
<string name="common_rename">Átnevezés</string>
<string name="common_remove">Eltávolítás</string>
<string name="confirmation_remove_alert">Tényleg szeretné törölni ezt: %1$s ?</string>
<string name="rename_server_fail_msg">Az átnevezés nem sikerült</string>
<string name="sync_file_fail_msg">A távoli fájl nem volt ellenőrizhető</string>
<string name="sync_file_nothing_to_do_msg">Az állományok már szinkonizálva vannak</string>
- <string name="create_dir_fail_msg">A mappa nem hozható létre</string>
+ <string name="filename_forbidden_characters">Nem megendedett karakterek: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Egy pillanat...</string>
<string name="filedisplay_unexpected_bad_get_content">Váratlan hiba; válassza ki a fájlt más programból</string>
<string name="filedisplay_no_file_selected">Egy fájl sincs kiválasztva</string>
- <string name="ssl_validator_title">Figyelmeztetés</string>
+ <string name="activity_chooser_title">Hivatkozás küldése ...</string>
+ <string name="oauth_check_onoff">Bejelentkezés oAuth2-vel</string>
+ <string name="oauth_login_connection">Kapcsolódás az oAuth2 szerverhez...</string>
<string name="ssl_validator_header">A kiszolgálót nem sikerült azonosítani</string>
<string name="ssl_validator_reason_cert_not_trusted">- A kiszolgáló tanúsítványa nem megbízható</string>
<string name="ssl_validator_reason_cert_expired">- A kiszolgáló tanúsítványának lejárt az érvényessége</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- A kiszolgáló tanúsítványa most még nem érvényes</string>
<string name="ssl_validator_reason_hostname_not_verified">- Az URL nem egyezik a tanúsítványban szereplő kiszolgálónévvel</string>
- <string name="ssl_validator_certificate_not_available">A kiszolgáló tanúsítványa nem érhető el</string>
<string name="ssl_validator_question">Mégis megbízik ebben a tanúsítványban?</string>
<string name="ssl_validator_not_saved">A tanúsítvány nem menthető el</string>
<string name="ssl_validator_btn_details_see">Részletek</string>
<string name="ssl_validator_label_validity_to">Eddig a dátumig:</string>
<string name="ssl_validator_label_signature">Aláírás:</string>
<string name="ssl_validator_label_signature_algorithm">Algoritmus:</string>
- <string name="text_placeholder">Ez egy helykitöltő</string>
+ <string name="ssl_validator_null_cert">A tanúsítvány nem megjeleníthető.</string>
+ <string name="ssl_validator_no_info_about_error">- Nincs információ a hibáról</string>
+ <string name="placeholder_sentence">Ez egy helyőrző</string>
+ <string name="placeholder_filename">helyörző.txt</string>
+ <string name="placeholder_filetype">PNG kép</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Képeket csak WiFi kapcsolaton keresztül töltsünk föl</string>
<string name="instant_upload_path">/InstantUpload</string>
<string name="conflict_title">Frissítési ütközés</string>
<string name="conflict_keep_both">Mindkettő megtartása</string>
<string name="conflict_overwrite">Felülírás</string>
<string name="conflict_dont_upload">Ne töltsük föl</string>
+ <string name="preview_image_description">Előnézeti kép</string>
+ <string name="preview_image_error_unknown_format">Ez a kép nem jelenik meg</string>
+ <string name="actionbar_failed_instant_upload">Sikertelen azonnali feltöltés\"</string>
+ <string name="failed_upload_headline_text">Sikertelen Azonnali feltöltés</string>
+ <string name="failed_upload_headline_hint">Összefoglaló az összes sikertelen instant feltöltésről</string>
+ <string name="failed_upload_all_cb">Összes kijelölése</string>
+ <string name="failed_upload_headline_retryall_btn">újra az összes kiválasztott</string>
+ <string name="failed_upload_headline_delete_all_btn">törölje az összes kiválasztottat a feltöltési sorból</string>
+ <string name="failed_upload_retry_text">újra feltölteni a képet:</string>
+ <string name="failed_upload_load_more_images">További képek betöltése</string>
+ <string name="failed_upload_retry_do_nothing_text">nem vagyunk online üzemmódban az azonnali feltöltéshez</string>
+ <string name="failed_upload_failure_text">Hibaüzenet</string>
+ <string name="failed_upload_quota_exceeded_text">Kérjük ellenőrizd a szerver konfigurációt, mert lehet, hogy a kvótát túllépted.</string>
+ <string name="share_link_file_no_exist">A mappa nem osztható meg. Lehet, hogy nem is létezik.</string>
+ <string name="share_link_file_error">Hiba lépett fel a mappa megosztásakor</string>
+ <string name="unshare_link_file_no_exist">Nem lehet a megosztást megszüntetni. A mappa vagy fájl nem létezik.</string>
+ <string name="unshare_link_file_error">Hiba lépett fel a mappa megosztásának visszavonásakor</string>
+ <string name="activity_chooser_send_file_title">Küldjük el</string>
+ <string name="copy_link">Link másolása</string>
+ <string name="clipboard_text_copied">Bemásolva a vágólapra</string>
</resources>
+++ /dev/null
-<?xml version='1.0' encoding='UTF-8'?>
-<resources/>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="main_files">Files</string>
- <string name="main_music">Musica</string>
- <string name="main_contacts">Contactos</string>
- <string name="main_settings">Configurationes</string>
<string name="actionbar_upload">Incargar</string>
<string name="actionbar_upload_files">Files</string>
<string name="actionbar_settings">Configurationes</string>
+ <string name="actionbar_send_file">Invia</string>
+ <string name="prefs_category_general">General</string>
+ <string name="prefs_category_more">Plus</string>
+ <string name="prefs_help">Adjuta</string>
<string name="auth_username">Nomine de usator</string>
<string name="auth_password">Contrasigno</string>
<string name="sync_string_files">Files</string>
- <string name="setup_hint_username">Nomine de usator</string>
- <string name="setup_hint_password">Contrasigno</string>
+ <string name="setup_btn_connect">Connecte</string>
<string name="uploader_btn_upload_text">Incargar</string>
<string name="filedetails_download">Discargar</string>
<string name="common_cancel">Cancellar</string>
- <string name="sync_string_contacts">Contactos</string>
- <string name="common_share">Compartir</string>
+ <string name="common_error">Error</string>
+ <string name="common_error_unknown">Error Incognite</string>
+ <string name="change_password">Cambiar contrasigno</string>
+ <string name="activity_chooser_send_file_title">Invia</string>
</resources>
+++ /dev/null
-<?xml version='1.0' encoding='UTF-8'?>
-<resources/>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Password:</string>
- <string name="main_login">Nama Pengguna:</string>
- <string name="main_button_login">login</string>
- <string name="main_welcome">Selamat Datang</string>
- <string name="main_files">Berkas</string>
- <string name="main_music">Musik</string>
- <string name="main_contacts">kontak</string>
- <string name="main_calendar">Kalendar</string>
- <string name="main_bookmarks">Bookmark</string>
- <string name="main_settings">pengaturan</string>
- <string name="main_tit_accsetup">Mengatur Akun</string>
- <string name="main_wrn_accsetup">Tidak ada akun yang diatur di alat anda. Dalam rangka menggunakan App ini, anda hrus membuatnya.</string>
+ <string name="about_android">%1$s Apl Android</string>
+ <string name="about_version">versi %1$s</string>
+ <string name="actionbar_sync">Segarkan akun</string>
+ <string name="actionbar_upload">Unggah</string>
+ <string name="actionbar_upload_from_apps">Konten dari apl lain</string>
<string name="actionbar_upload_files">Berkas</string>
+ <string name="actionbar_open_with">Bukan dengan</string>
+ <string name="actionbar_mkdir">Folder baru</string>
<string name="actionbar_settings">pengaturan</string>
+ <string name="actionbar_see_details">Rincian</string>
+ <string name="actionbar_send_file">Kirim</string>
<string name="prefs_category_general">umum</string>
- <string name="auth_host_url">tautan</string>
- <string name="auth_username">nama pengguna</string>
- <string name="auth_password">kata kunci</string>
+ <string name="prefs_category_more">Lainnya</string>
+ <string name="prefs_accounts">Akun</string>
+ <string name="prefs_manage_accounts">Kelola Akun</string>
+ <string name="prefs_pincode">PIN Apl</string>
+ <string name="prefs_pincode_summary">Lindungi klien Anda</string>
+ <string name="prefs_instant_upload">Aktifkan unggah instan</string>
+ <string name="prefs_instant_upload_summary">Unggah langsung foto yang diambil oleh kamera</string>
+ <string name="prefs_log_title">Aktifkan Pencatatan</string>
+ <string name="prefs_log_summary">Ini digunakan untuk mencatat masalah</string>
+ <string name="prefs_log_title_history">Riwayat Catatan</string>
+ <string name="prefs_log_summary_history">Ini menampilkan catatan yang disimpan</string>
+ <string name="prefs_log_delete_history_button">Riwayat Hapus</string>
+ <string name="prefs_help">Bantuan</string>
+ <string name="prefs_recommend">Rekomendasikan ke teman</string>
+ <string name="prefs_feedback">Umpan balik</string>
+ <string name="prefs_imprint">Imprint</string>
+ <string name="recommend_subject">Coba %1$s pada smartphone Anda!</string>
+ <string name="auth_check_server">Periksa Server</string>
+ <string name="auth_host_url">Alamat server https://…</string>
+ <string name="auth_username">Nama Pengguna</string>
+ <string name="auth_password">Sandi</string>
+ <string name="auth_register">Baru di %1$s?</string>
<string name="sync_string_files">Berkas</string>
- <string name="setup_hint_username">nama pengguna</string>
- <string name="setup_hint_password">kata kunci</string>
- <string name="filedetails_download">unduh</string>
- <string name="filedetails_open">buka</string>
+ <string name="setup_btn_connect">Sambungkan</string>
+ <string name="uploader_btn_upload_text">Unggah</string>
+ <string name="uploader_wrn_no_account_title">Tidak ada akun yang ditemukan</string>
+ <string name="uploader_wrn_no_account_text">Belum ada akun %1$s pada perangkat Anda. Silahkan buat akun terlebih dahulu.</string>
+ <string name="uploader_wrn_no_account_setup_btn_text">Pengaturan</string>
+ <string name="uploader_wrn_no_account_quit_btn_text">Keluar</string>
+ <string name="uploader_wrn_no_content_title">Tidak ada konten untuk diunggah</string>
+ <string name="uploader_wrn_no_content_text">Tidak ada konten yang diterima. Tidak ada yang diunggah</string>
+ <string name="uploader_error_forbidden_content">%1$s tidak diizinkan mengakses konten berbagi</string>
+ <string name="uploader_info_uploading">Mengunggah</string>
+ <string name="file_list_empty">Tidak ada berkas dalam folder ini.\nBerkas baru dapat ditambahkan dengan opsi menu \"Unggah\".</string>
+ <string name="filedetails_select_file">Sentuh pada berkas untuk menampilkan informasi tambahan</string>
+ <string name="filedetails_size">Ukuran:</string>
+ <string name="filedetails_type">Tipe:</string>
+ <string name="filedetails_created">Dibuat:</string>
+ <string name="filedetails_modified">Diubah:</string>
+ <string name="filedetails_download">Unduh</string>
+ <string name="filedetails_sync_file">Segarkan berkas</string>
+ <string name="filedetails_renamed_in_upload_msg">Berkas diubah namanya menjadi %1$s saat pengunggahan</string>
+ <string name="action_share_file">Bagikan tautan</string>
<string name="common_yes">Ya</string>
+ <string name="common_no">Tidak</string>
+ <string name="common_ok">Oke</string>
+ <string name="common_cancel_download">Batal mengunduh</string>
<string name="common_cancel_upload">Batal mengunggah</string>
- <string name="common_cancel">batal</string>
- <string name="common_error">kesalahan</string>
- <string name="sync_string_contacts">kontak</string>
- <string name="common_share">berbagi</string>
- <string name="common_remove">hilangkan</string>
- <string name="ssl_validator_title">peringatan</string>
- <string name="ssl_validator_btn_details_hide">sembunyikan</string>
+ <string name="common_cancel">Batal</string>
+ <string name="common_save_exit">Simpan & Keluar</string>
+ <string name="common_error">Kesalahan</string>
+ <string name="common_loading">Memuat ...</string>
+ <string name="common_error_unknown">Galat tidak diketahui</string>
+ <string name="about_title">Tentang</string>
+ <string name="change_password">Ubah sandi</string>
+ <string name="delete_account">Hapus akun</string>
+ <string name="create_account">Buat akun</string>
+ <string name="upload_chooser_title">Unggah dari...</string>
+ <string name="uploader_info_dirname">Nama folder</string>
+ <string name="uploader_upload_in_progress_ticker">Mengungggah...</string>
+ <string name="uploader_upload_in_progress_content">%1$d%% Mengunggah %2$s</string>
+ <string name="uploader_upload_succeeded_ticker">Berhasil mengunggah</string>
+ <string name="uploader_upload_succeeded_content_single">%1$s berhasil diunggah</string>
+ <string name="uploader_upload_failed_ticker">Gagal mengunggah</string>
+ <string name="uploader_upload_failed_content_single">Unggah %1$s tidak selesai</string>
+ <string name="downloader_download_in_progress_ticker">Mengunduh...</string>
+ <string name="downloader_download_in_progress_content">%1$d%% Mengunduh %2$s</string>
+ <string name="downloader_download_succeeded_ticker">Berhasil mengunduh</string>
+ <string name="downloader_download_succeeded_content">%1$s berhasil diunduh</string>
+ <string name="downloader_download_failed_ticker">Gagal Mengunduh</string>
+ <string name="downloader_download_failed_content">Mengunduh %1$s tidak selesai</string>
+ <string name="downloader_not_downloaded_yet">Belum diunduh</string>
+ <string name="common_choose_account">Pilih akun</string>
+ <string name="sync_fail_ticker">Sinkronisasi gagal</string>
+ <string name="sync_fail_content">Sinkronisasi %1$s tidak selesai</string>
+ <string name="sync_fail_content_unauthorized">Sandi salah untuk %1$s</string>
+ <string name="sync_conflicts_in_favourites_ticker">Konflik ditemukan</string>
+ <string name="sync_fail_in_favourites_content">Konten berkas %1$d tidak dapat disinkronasikan (%2$d konflik)</string>
+ <string name="sync_foreign_files_forgotten_ticker">Beberapa berkas lokal terlupakan</string>
+ <string name="sync_current_folder_was_removed">Folder %1$s tidak ada lagi</string>
+ <string name="foreign_files_move">Pindahkan semua</string>
+ <string name="foreign_files_success">Semua berkas sudah dipindahkan</string>
+ <string name="foreign_files_fail">Beberapa berkas tidak dapat dipindahkan</string>
+ <string name="foreign_files_local_text">Lokal: %1$s</string>
+ <string name="foreign_files_remote_text">Jauh: %1$s</string>
+ <string name="pincode_enter_pin_code">Silakan masukkan PIN Apl</string>
+ <string name="pincode_configure_your_pin">Masukkan PIN Apl</string>
+ <string name="pincode_configure_your_pin_explanation">PIN akan selalu diminta setiap kali apl dijalankan</string>
+ <string name="pincode_reenter_your_pincode">Silakan masukkan ulang PIN Apl</string>
+ <string name="pincode_remove_your_pincode">Hapus PIN Apl</string>
+ <string name="pincode_mismatch">PIN Apl tidak sama</string>
+ <string name="pincode_wrong">PIN Apl salah</string>
+ <string name="pincode_removed">PIN Apl dihapus</string>
+ <string name="pincode_stored">PIN Apl disimpan</string>
+ <string name="media_notif_ticker">Pemutar musik %1$s</string>
+ <string name="media_state_playing">%1$s (dimainkan)</string>
+ <string name="media_state_loading">%1$s (sedang dimuat)</string>
+ <string name="media_err_nothing_to_play">Tidak ditemukan berkas media</string>
+ <string name="media_err_no_account">Tidak ada akun yang diberikan</string>
+ <string name="media_err_not_in_owncloud">Brkas tidak didalam akun yang sah</string>
+ <string name="media_err_unsupported">Kodek media tidak didukung</string>
+ <string name="media_err_io">Berkas media tidak dapat dibaca</string>
+ <string name="media_err_malformed">Berkas media tidak di enkode dengan benar</string>
+ <string name="media_err_timeout">Waktu habis saat mencoba untuk main</string>
+ <string name="media_err_invalid_progressive_playback">Berkas media tidak bisa dialirkan</string>
+ <string name="media_err_unknown">Berkas media tidak dapat dimainkan dengan pemutar media</string>
+ <string name="media_err_security_ex">Kesalahan keamanan saat mencoba memutar %1$s</string>
+ <string name="media_err_io_ex">Kesalahan masukkan saat mencoba memutar %1$s</string>
+ <string name="media_err_unexpected">Kesalahan tak terduga saat mencoba memutar %1$s</string>
+ <string name="media_rewind_description">Tombol mundur</string>
+ <string name="media_play_pause_description">Tombol main dan jeda</string>
+ <string name="media_forward_description">Tombol maju</string>
+ <string name="auth_trying_to_login">Mencoba untuk masuk...</string>
+ <string name="auth_no_net_conn_title">Tidak ada koneksi internet</string>
+ <string name="auth_nossl_plain_ok_title">Sambungan aman tidak tersedia</string>
+ <string name="auth_connection_established">Sambungan dibuat</string>
+ <string name="auth_testing_connection">Pengetesan koneksi ...</string>
+ <string name="auth_not_configured_title">Konfigurasi server cacat</string>
+ <string name="auth_account_not_new">Akun untuk pengguna dan server yang sama sudah ada dalam perangkat</string>
+ <string name="auth_account_not_the_same">Pengguna yang dimasukkan tidak cocok dengan pengguna akun ini</string>
+ <string name="auth_unknown_error_title">Terjadi kesalahan yang tidak diketahui!</string>
+ <string name="auth_unknown_host_title">Tidak menemukan host</string>
+ <string name="auth_incorrect_path_title">Instansi server tidak ditemukan</string>
+ <string name="auth_timeout_title">Server terlalu lama merespon</string>
+ <string name="auth_incorrect_address_title">Format URL salah</string>
+ <string name="auth_ssl_general_error_title">Menginisiasi SSL gagal</string>
+ <string name="auth_ssl_unverified_server_title">Tidak dapat memverifikasi identitas server SSL</string>
+ <string name="auth_bad_oc_version_title">Versi server tidak dikenal</string>
+ <string name="auth_wrong_connection_title">Tidak dapat membuat koneksi</string>
+ <string name="auth_secure_connection">Sambungan aman dibuat</string>
+ <string name="auth_unauthorized">Nama pengguna dan sandi salah</string>
+ <string name="auth_oauth_error">Otorisasi tidak berhasil</string>
+ <string name="auth_oauth_error_access_denied">Akses ditolak oleh server otorisasi</string>
+ <string name="auth_wtf_reenter_URL">Keadaan tak terduga, silahkan masukkan URL server yang lagi</string>
+ <string name="auth_expired_oauth_token_toast">Otorisasi Anda telah berakhir. Silakan mengotorisasi lagi</string>
+ <string name="auth_expired_basic_auth_toast">Silakan mesukkan sandi saat ini</string>
+ <string name="auth_expired_saml_sso_token_toast">Sesi Anda telah berakhir. Silakan masuk kembali</string>
+ <string name="auth_connecting_auth_server">Menyambungkan ke server otentikasi...</string>
+ <string name="auth_unsupported_auth_method">Server tidak mendukung medote otentikasi ini</string>
+ <string name="auth_unsupported_multiaccount">%1$s tidak mendukung banyak akun </string>
+ <string name="fd_keep_in_sync">Biarkan berkas tetap terbaru</string>
+ <string name="common_rename">Ubah nama</string>
+ <string name="common_remove">Hapus</string>
+ <string name="confirmation_remove_alert">Apakah Anda yakin ingin menghapus %1$s ?</string>
+ <string name="confirmation_remove_folder_alert">Apakah Anda benar-benar ingin menghapus %1$s beserta isinya?</string>
+ <string name="confirmation_remove_local">Lokal saja</string>
+ <string name="confirmation_remove_folder_local">Konten lokal saja</string>
+ <string name="confirmation_remove_remote">Hapus dari server</string>
+ <string name="confirmation_remove_remote_and_local">Jarak jauh dan lokal</string>
+ <string name="remove_success_msg">Penghapusan berhasil</string>
+ <string name="remove_fail_msg">Penghapusan gagal</string>
+ <string name="rename_dialog_title">Masukkan nama baru</string>
+ <string name="rename_local_fail_msg">Salinan lokal tidak dapat diubah nama, coba dengan nama yang berbeda</string>
+ <string name="rename_server_fail_msg">Mengubah nama tidak selesai</string>
+ <string name="sync_file_fail_msg">Berkas jauh tidak dapat diperiksa</string>
+ <string name="sync_file_nothing_to_do_msg">Isi berkas sudah diselaraskan</string>
+ <string name="filename_forbidden_characters">Karakter yang dilarang: / \\ < > : \" | ? *</string>
+ <string name="wait_a_moment">Tunggu sejenak</string>
+ <string name="filedisplay_unexpected_bad_get_content">Masalah tidak terduga, silahkan pilih berkas dari apl yang berbeda</string>
+ <string name="filedisplay_no_file_selected">Tidak ada berkas yang terpilih</string>
+ <string name="oauth_check_onoff">Masuk dengan oAuth2</string>
+ <string name="oauth_login_connection">Menyambungkan ke server oAuth2...</string>
+ <string name="ssl_validator_header">Identitas situs tidak dapat diverfikasi</string>
+ <string name="ssl_validator_reason_cert_not_trusted">- Sertifikat server tidak terpercaya</string>
+ <string name="ssl_validator_reason_cert_expired">- Sertifikat server kadaluarsa</string>
+ <string name="ssl_validator_reason_cert_not_yet_valid">- Tanggal sertifikat server yang valid adalah di masa depan</string>
+ <string name="ssl_validator_reason_hostname_not_verified">- URL tidak cocok dengan nama host dalam sertifikat</string>
+ <string name="ssl_validator_question">Apakah Anda percaya dengan sertifikat ini?</string>
+ <string name="ssl_validator_not_saved">Sertifikat tidak dapat disimpan</string>
+ <string name="ssl_validator_btn_details_see">Rincian</string>
+ <string name="ssl_validator_btn_details_hide">Sembunyikan</string>
+ <string name="ssl_validator_label_subject">Diterbitkan untuk:</string>
+ <string name="ssl_validator_label_issuer">Diterbitkan oleh:</string>
+ <string name="ssl_validator_label_CN">Nama panggilan:</string>
+ <string name="ssl_validator_label_O">Organisasi:</string>
+ <string name="ssl_validator_label_OU">Unit Organisasi:</string>
+ <string name="ssl_validator_label_C">Negara:</string>
+ <string name="ssl_validator_label_ST">Negara bagian:</string>
+ <string name="ssl_validator_label_L">Lokasi:</string>
+ <string name="ssl_validator_label_validity">Masa berlaku:</string>
+ <string name="ssl_validator_label_validity_from">Dari:</string>
+ <string name="ssl_validator_label_validity_to">Untuk:</string>
+ <string name="ssl_validator_label_signature">Tanda tangan:</string>
+ <string name="ssl_validator_label_signature_algorithm">Algoritma:</string>
+ <string name="placeholder_sentence">Ini adalah placeholder</string>
+ <string name="placeholder_filename">placeholder.txt</string>
+ <string name="placeholder_filetype">Gambar PNG</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">18/05/2012 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
+ <string name="instant_upload_on_wifi">Hanya unggah gambar via WiFi</string>
+ <string name="instant_upload_path">/UnggahInstan</string>
+ <string name="conflict_title">Perbarui benturan</string>
+ <string name="conflict_message">Berkas jauh %s tidak sinkron dengan berkas lokal. Melanjutkan akan menggantikan konten berkas di server.</string>
+ <string name="conflict_keep_both">Biarkan keduannya</string>
+ <string name="conflict_overwrite">Timpa</string>
+ <string name="conflict_dont_upload">Jangan mengunggah</string>
+ <string name="preview_image_description">Pratilik gambar</string>
+ <string name="preview_image_error_unknown_format">Gambar ini tidak dapat ditampilkan</string>
+ <string name="actionbar_failed_instant_upload">UnggahInsatan Gagal</string>
+ <string name="failed_upload_headline_text">Unggahan instan gagal</string>
+ <string name="failed_upload_headline_hint">Ringkasan dari semua unggahan instan yang gagal</string>
+ <string name="failed_upload_all_cb">pilih semua</string>
+ <string name="failed_upload_headline_retryall_btn">Ulangi semua yang terpilih</string>
+ <string name="failed_upload_headline_delete_all_btn">hapus semua yang terpilih dari antrian unggahan</string>
+ <string name="failed_upload_retry_text">ulangi unggah gambar:</string>
+ <string name="failed_upload_load_more_images">Muat Gambar selengkapnya</string>
+ <string name="failed_upload_retry_do_nothing_text">Tidak melakukan apapun, Anda tidak sedang online</string>
+ <string name="failed_upload_failure_text">Pesan Kegagalan:</string>
+ <string name="failed_upload_quota_exceeded_text">Silakan periksa konfigurasi server Anda, kemungkinan kuota terlampaui.</string>
+ <string name="activity_chooser_send_file_title">Kirim</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="main_files">Skrár</string>
- <string name="main_music">Tónlist</string>
- <string name="main_bookmarks">Bókamerki</string>
- <string name="main_settings">Stillingar</string>
<string name="actionbar_upload">Senda inn</string>
<string name="actionbar_upload_files">Skrár</string>
<string name="actionbar_settings">Stillingar</string>
- <string name="auth_host_url">URL</string>
+ <string name="actionbar_send_file">Senda</string>
+ <string name="prefs_category_more">Meira</string>
+ <string name="prefs_help">Hjálp</string>
<string name="auth_username">Notendanafn</string>
<string name="auth_password">Lykilorð</string>
<string name="sync_string_files">Skrár</string>
- <string name="setup_hint_username">Notendanafn</string>
- <string name="setup_hint_password">Lykilorð</string>
<string name="uploader_btn_upload_text">Senda inn</string>
<string name="filedetails_download">Niðurhal</string>
- <string name="filedetails_open">Opna</string>
<string name="common_yes">Já</string>
<string name="common_no">Nei</string>
<string name="common_cancel_upload">Hætta við innsendingu</string>
<string name="common_cancel">Hætta við</string>
<string name="common_error"><strong>Villa</strong></string>
- <string name="common_share">Deila</string>
+ <string name="change_password">Breyta lykilorði</string>
+ <string name="uploader_info_dirname">Nafn möppu</string>
<string name="common_rename">Endurskýra</string>
<string name="common_remove">Fjarlægja</string>
- <string name="ssl_validator_title">Aðvörun</string>
+ <string name="activity_chooser_send_file_title">Senda</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Password:</string>
- <string name="main_login"> Nome utente:</string>
- <string name="main_button_login">Accedi</string>
- <string name="main_welcome">Benvenuto nel tuo ownCloud</string>
- <string name="main_files">File</string>
- <string name="main_music">Musica</string>
- <string name="main_contacts">Contatti</string>
- <string name="main_calendar">Calendario</string>
- <string name="main_bookmarks">Segnalibri</string>
- <string name="main_settings">Impostazioni</string>
- <string name="main_tit_accsetup">Configurazione account</string>
- <string name="main_wrn_accsetup">Non ci sono account ownCloud su questo dispositivo. Per utilizzare questa applicazione, devi crearne uno.</string>
- <string name="about_message">%1$s per Android\n\nversione: %2$s</string>
- <string name="actionbar_sync">Sincronizza account</string>
+ <string name="about_android">Applicazione Android di %1$s </string>
+ <string name="about_version">versione %1$s</string>
+ <string name="actionbar_sync">Aggiorna account</string>
<string name="actionbar_upload">Carica un file</string>
<string name="actionbar_upload_from_apps">Contenuti da altre applicazioni</string>
<string name="actionbar_upload_files">File</string>
- <string name="actionbar_mkdir">Crea cartella</string>
- <string name="actionbar_search">Cerca</string>
+ <string name="actionbar_open_with">Apri con</string>
+ <string name="actionbar_mkdir">Nuova cartella</string>
<string name="actionbar_settings">Impostazioni</string>
+ <string name="actionbar_see_details">Dettagli</string>
+ <string name="actionbar_send_file">Invia</string>
<string name="prefs_category_general">Generale</string>
- <string name="prefs_category_trackmydevice">Tracciamento dispositivo</string>
- <string name="prefs_add_session">Aggiungi nuova sessione</string>
- <string name="prefs_create_img_thumbnails">Crea anteprime immagini</string>
- <string name="prefs_select_oc_account">Scegli un account</string>
- <string name="prefs_summary_select_oc_account">Scegli quale dei tuoi account sarà utilizzato dall\'applicazione</string>
- <string name="prefs_trackmydevice">Tracciamento del dispositivo</string>
- <string name="prefs_trackmydevice_summary_off">Abilita ownCloud a tracciare la posizione del tuo dispositivo</string>
- <string name="prefs_trackmydevice_summary_on">Il tuo ownCloud tiene traccia di questo dispositivo</string>
- <string name="prefs_trackmydevice_interval">Intervallo di aggiornamento</string>
- <string name="prefs_trackmydevice_interval_summary">Aggiorna ogni %1$s minuti</string>
+ <string name="prefs_category_more">Altro</string>
<string name="prefs_accounts">Account</string>
<string name="prefs_manage_accounts">Gestisci account</string>
- <string name="prefs_pincode">PIN ownCloud App</string>
- <string name="prefs_pincode_summary">Proteggi il tuo client ownCloud</string>
+ <string name="prefs_pincode">PIN App</string>
+ <string name="prefs_pincode_summary">Proteggi il tuo client l\'applicazione</string>
<string name="prefs_instant_upload">Caricamento immediato</string>
<string name="prefs_instant_upload_summary">Carica immediatamente le foto dalla fotocamera</string>
- <string name="auth_host_url">URL ownCloud</string>
+ <string name="prefs_log_title">Abilita registrazione log</string>
+ <string name="prefs_log_summary">Usato per registrare i problemi nei log</string>
+ <string name="prefs_log_title_history">Cronologia di registrazione log</string>
+ <string name="prefs_log_summary_history">Mostra i log registrati</string>
+ <string name="prefs_log_delete_history_button">Elimina la cronologia</string>
+ <string name="prefs_help">Aiuto</string>
+ <string name="prefs_recommend">Consiglia ad un amico</string>
+ <string name="prefs_feedback">Segnalazioni</string>
+ <string name="prefs_imprint">Imprint</string>
+ <string name="recommend_subject">Prova %1$s sul tuo smartphone!</string>
+ <string name="auth_check_server">Verifica server</string>
+ <string name="auth_host_url">Indirizzo server https://...</string>
<string name="auth_username">Nome utente</string>
<string name="auth_password">Password</string>
- <string name="auth_register">Sono nuovo di ownCloud</string>
- <string name="new_session_uri_error">URL fornito errato</string>
- <string name="new_session_session_name_error">Nome di sessione errato</string>
+ <string name="auth_register">Prima volta su %1$s?</string>
<string name="sync_string_files">File</string>
- <string name="uploader_no_file_selected">Nessun file selezionato per l\'invio</string>
- <string name="setup_hint_username">Nome utente</string>
- <string name="setup_hint_password">Password</string>
- <string name="setup_hint_address">Indirizzo web</string>
- <string name="setup_hint_show_password">Mostrare la password?</string>
- <string name="setup_title">Connettiti al tuo ownCloud</string>
<string name="setup_btn_connect">Connetti</string>
<string name="uploader_btn_upload_text">Carica</string>
+ <string name="uploader_top_message">Scegliere la cartella da caricare:</string>
<string name="uploader_wrn_no_account_title">Nessun account trovato</string>
- <string name="uploader_wrn_no_account_text">Non ci sono account ownCloud sul tuo dispositivo. Configura prima un account.</string>
+ <string name="uploader_wrn_no_account_text">Non ci sono account %1$s sul tuo dispositivo. Configura prima un account.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Configurazione</string>
<string name="uploader_wrn_no_account_quit_btn_text">Esci</string>
<string name="uploader_wrn_no_content_title">Nessun contenuto da caricare</string>
<string name="uploader_wrn_no_content_text">Non è stato ricevuto alcun contenuto. Niente da caricare.</string>
- <string name="uploader_error_forbidden_content">ownCloud non è abilitato ad accedere al contenuto condiviso</string>
+ <string name="uploader_error_forbidden_content">%1$s non è abilitato ad accedere al contenuto condiviso</string>
<string name="uploader_info_uploading">Caricamento in corso</string>
- <string name="uploader_btn_create_dir_text">Crea cartella per il caricamento</string>
<string name="file_list_empty">Non ci sono file in questa cartella.\nNuovi file possono essere aggiunti con l\'opzione di menu \"Carica\".</string>
<string name="filedetails_select_file">Tocca un file per visualizzare informazioni aggiuntive.</string>
<string name="filedetails_size">Dimensione:</string>
<string name="filedetails_created">Creato:</string>
<string name="filedetails_modified">Modificato:</string>
<string name="filedetails_download">Scarica</string>
- <string name="filedetails_sync_file">Aggiorna</string>
- <string name="filedetails_redownload">Scarica nuovamente</string>
- <string name="filedetails_open">Apri</string>
+ <string name="filedetails_sync_file">Aggiorna file</string>
<string name="filedetails_renamed_in_upload_msg">Il file è stato rinominato in %1$s durante il caricamento</string>
+ <string name="action_share_file">Condividi collegamento</string>
+ <string name="action_unshare_file">Rimuovi condivisione collegamento</string>
<string name="common_yes">Sì</string>
<string name="common_no">No</string>
<string name="common_ok">OK</string>
<string name="common_cancel_upload">Annulla invio</string>
<string name="common_cancel">Annulla</string>
<string name="common_save_exit">Salva ed esci</string>
- <string name="common_exit">Esci da ownCloud</string>
<string name="common_error">Errore</string>
+ <string name="common_loading">Caricamento in corso...</string>
+ <string name="common_error_unknown">Errore sconosciuto</string>
<string name="about_title">Informazioni</string>
+ <string name="change_password">Modifica la password</string>
<string name="delete_account">Elimina account</string>
<string name="create_account">Crea account</string>
<string name="upload_chooser_title">Carica file da...</string>
- <string name="uploader_info_dirname">Nome cartella</string>
+ <string name="uploader_info_dirname">Nome della cartella</string>
<string name="uploader_upload_in_progress_ticker">Caricamento in corso...</string>
<string name="uploader_upload_in_progress_content">%1$d%% Caricamento di %2$s</string>
<string name="uploader_upload_succeeded_ticker">Caricamento effettuato</string>
<string name="uploader_upload_succeeded_content_single">%1$s è stato caricato correttamente</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d file sono stati caricati correttamente</string>
<string name="uploader_upload_failed_ticker">Caricamento non riuscito</string>
<string name="uploader_upload_failed_content_single">Il caricamento di %1$s non può essere completato</string>
- <string name="uploader_upload_failed_content_multiple">Caricamento non riuscito: %1$d/%2$d file sono stati caricati</string>
<string name="downloader_download_in_progress_ticker">Scaricamento in corso...</string>
<string name="downloader_download_in_progress_content">%1$d%% Scaricamento di %2$s</string>
<string name="downloader_download_succeeded_ticker">Scaricamento effettuato</string>
<string name="downloader_download_succeeded_content">%1$s è stato scaricato correttamente</string>
<string name="downloader_download_failed_ticker">Scaricamento non riuscito</string>
<string name="downloader_download_failed_content">Scaricamento di %1$s non è stato completato</string>
+ <string name="downloader_not_downloaded_yet">Non ancora scaricato</string>
<string name="common_choose_account">Scegli account</string>
- <string name="sync_string_contacts">Contatti</string>
<string name="sync_fail_ticker">Sincronizzazione non riuscita</string>
<string name="sync_fail_content">La sincronizzazione di %1$s non può essere completata</string>
+ <string name="sync_fail_content_unauthorized">Password non valida per %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Conflitti rilevati</string>
<string name="sync_conflicts_in_favourites_content">%1$d file non possono essere sincronizzati</string>
<string name="sync_fail_in_favourites_ticker">Sincronizzazione dei file non riuscita</string>
<string name="sync_fail_in_favourites_content">I contenuti di %1$d file non possono essere sincronizzati (%2$d conflitti)</string>
- <string name="use_ssl">Usa connessione sicura</string>
- <string name="location_no_provider">ownCloud non può tracciare questo dispositivo. Controlla le impostazioni di posizionamento</string>
+ <string name="sync_foreign_files_forgotten_ticker">Alcuni file locali sono stati trascurati</string>
+ <string name="sync_foreign_files_forgotten_content">i file %1$d della cartella %2$s non possono essere copiati</string>
+ <string name="sync_foreign_files_forgotten_explanation">Nella versione 1.3.16, i file caricati da questo dispositivo vengono copiati nella cartella locale %1$s per prevenire la perdita dei dati quando un singolo file è sincronizzato con diversi account.\n\nA causa di questo cambiamento, tutti i file caricati nelle versioni precedenti di quest\'applicazione sono stati copiati nella cartella %2$s. Tuttavia, un errore non ha permesso il completamento di questa operazione durante la sincronizzazione dell\'account. Puoi, dunque, sia lasciare i (il) file come sono e rimuovere il collegamento a %3$s, o spostare i (il) file nella cartella %1$s e mantenere il collegamento a %4$s.\n\nIn basso sono elencati i (il) file locali, e i (il) file rimossi in %5$s a cui sono collegati.</string>
+ <string name="sync_current_folder_was_removed">La cartella %1$s non esiste più</string>
+ <string name="foreign_files_move">Sposta tutto</string>
+ <string name="foreign_files_success">Tutti i file sono stati spostati</string>
+ <string name="foreign_files_fail">Alcuni file non possono essere spostati</string>
+ <string name="foreign_files_local_text">Locale: %1$s</string>
+ <string name="foreign_files_remote_text">Remoto %1$s</string>
+ <string name="upload_query_move_foreign_files">Non c\'è spazio sufficiente per copiare i file selezionati nella cartella %1$s. Vuoi invece spostarli nella cartella?</string>
<string name="pincode_enter_pin_code">Inserisci il PIN dell\'applicazione</string>
- <string name="pincode_enter_new_pin_code">Inserisci il nuovo PIN dell\'applicazione</string>
- <string name="pincode_configure_your_pin">Inserisci il PIN di ownCloud</string>
+ <string name="pincode_configure_your_pin">Inserisci il PIN di l\'applicazione</string>
<string name="pincode_configure_your_pin_explanation">Il PIN sarà richiesto ad ogni avvio dell\'applicazione</string>
- <string name="pincode_reenter_your_pincode">Inserisci nuovamente il PIN di ownCloud</string>
- <string name="pincode_remove_your_pincode">Rimuovi il PIN di ownCloud</string>
- <string name="pincode_mismatch">I PIN di ownCloud non corrispondono</string>
- <string name="pincode_wrong">PIN di ownCloud non corretto</string>
- <string name="pincode_removed">PIN di ownCloud rimosso</string>
- <string name="pincode_stored">PIN di ownCloud memorizzato</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 minuti</item>
- <item>30 minuti</item>
- <item>60 minuti</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_reenter_your_pincode">Inserisci nuovamente il PIN di l\'applicazione</string>
+ <string name="pincode_remove_your_pincode">Rimuovi il PIN di l\'applicazione</string>
+ <string name="pincode_mismatch">I PIN di l\'applicazione non corrispondono</string>
+ <string name="pincode_wrong">PIN di l\'applicazione non corretto</string>
+ <string name="pincode_removed">PIN di l\'applicazione rimosso</string>
+ <string name="pincode_stored">PIN di l\'applicazione memorizzato</string>
+ <string name="media_notif_ticker">Lettore musicale %1$s</string>
+ <string name="media_state_playing">%1$s (in riproduzione)</string>
+ <string name="media_state_loading">%1$s (in caricamento)</string>
+ <string name="media_event_done">Riproduzione di %1$s terminata</string>
+ <string name="media_err_nothing_to_play">Nessun file multimediale trovato</string>
+ <string name="media_err_no_account">Nessun account fornito</string>
+ <string name="media_err_not_in_owncloud">Il file non è in un account valido</string>
+ <string name="media_err_unsupported">Codificatore multimediale non supportato</string>
+ <string name="media_err_io">Il file multimediale non può essere letto</string>
+ <string name="media_err_malformed">File multimediale non codificato correttamente</string>
+ <string name="media_err_timeout">La riproduzione ha richiesto troppo tempo</string>
+ <string name="media_err_invalid_progressive_playback">Il file multimediale non può essere trasmesso</string>
+ <string name="media_err_unknown">Il file multimediale non può essere riprodotto con il lettore integrato</string>
+ <string name="media_err_security_ex">Errore di sicurezza durante il tentativo di riprodurre %1$s</string>
+ <string name="media_err_io_ex">Errore di input durante il tentativo di riprodurre %1$s</string>
+ <string name="media_err_unexpected">Errore inatteso durante il tentativo di riprodurre %1$s</string>
+ <string name="media_rewind_description">Pulsante Riavvolgi</string>
+ <string name="media_play_pause_description">Pulsante Riproduci o pausa</string>
+ <string name="media_forward_description">Pulsante Avanti veloce</string>
<string name="auth_trying_to_login">Tentativo di accesso in corso...</string>
<string name="auth_no_net_conn_title">Nessuna connessione di rete</string>
- <string name="auth_no_net_conn_message">Non sono state rilevate connessioni di rete, controlla la tua connessione a Internet e prova ancora.</string>
- <string name="auth_connect_anyway">Connetti comunque</string>
<string name="auth_nossl_plain_ok_title">Connessione sicura disponibile.</string>
- <string name="auth_nossl_plain_ok_message">L\'applicazione non è in grado di stabilire una connessione sicura al server. È comunque disponibile una connessione non sicura. Puoi continuare o annullare.</string>
<string name="auth_connection_established">Connessione stabilita</string>
- <string name="auth_testing_connection">Test della connessione in corso...</string>
- <string name="auth_not_configured_title">Configurazione non corretta di ownCloud</string>
- <string name="auth_not_configured_message">Sembra che l\'istanza di ownCloud non sia configurata correttamente. Contatta il tuo amministratore per ulteriori dettagli.</string>
+ <string name="auth_testing_connection">Prova di connessione in corso...</string>
+ <string name="auth_not_configured_title">Configurazione non corretta di il server</string>
+ <string name="auth_account_not_new">Esiste già un account su questo dispositivo per lo stesso utente e server</string>
+ <string name="auth_account_not_the_same">L\'utente digitato non corrisponde all\'utente di questo account</string>
<string name="auth_unknown_error_title">Errore sconosciuto</string>
- <string name="auth_unknown_error_message">Si è verificato un errore sconosciuto. Contatta gli autori e includi i log del tuo dispositivo.</string>
<string name="auth_unknown_host_title">Impossibile trovare l\'host</string>
- <string name="auth_unknown_host_message">Impossibile trovare l\'host digitato. Controlla il nome dell\'host e la raggiungibilità del server e prova ancora.</string>
- <string name="auth_incorrect_path_title">Istanza di ownCloud non trovata</string>
- <string name="auth_incorrect_path_message">L\'applicazione non può trovare un\'istanza di ownCloud al percorso specificato. Controlla il percorso e prova ancora.</string>
+ <string name="auth_incorrect_path_title">Istanza di il server non trovata</string>
<string name="auth_timeout_title">Il server ha richiesto troppo tempo per rispondere</string>
<string name="auth_incorrect_address_title">URL non valido</string>
<string name="auth_ssl_general_error_title">Inizializzazione SSL non riuscita</string>
- <string name="auth_ssl_unverified_server_title">Identità SSL del server non verificata</string>
- <string name="auth_bad_oc_version_title">Versione del server ownCloud non riconosciuta</string>
+ <string name="auth_ssl_unverified_server_title">Impossibile verificare l\'identità SSL del server</string>
+ <string name="auth_bad_oc_version_title">Versione del server il server non riconosciuta</string>
<string name="auth_wrong_connection_title">Impossibile stabilire la connessione</string>
<string name="auth_secure_connection">Connessione sicura stabilita</string>
- <string name="auth_login_details">Dettagli di accesso</string>
- <string name="auth_unauthorized">Credenziali di accesso non valide</string>
- <string name="auth_not_found">Il percorso fornito non è valido</string>
- <string name="auth_internal">Errore interno del server, codice %1$d</string>
- <string name="crashlog_message">Applicazione terminata in modo inatteso. Vuoi inviare una segnalazione del problema?</string>
- <string name="crashlog_send_report">Invia segnalazione</string>
- <string name="crashlog_dont_send_report">Non inviare la segnalazione</string>
- <string name="extensions_avail_title">Estensioni disponibili!</string>
- <string name="extensions_avail_message">Sembra che la tua istanza di ownCloud supporti le estensioni avanzate. Vuoi vedere le estensioni disponibili per Android?</string>
+ <string name="auth_unauthorized">Nome utente o password errati</string>
+ <string name="auth_oauth_error">Autorizzazione non riuscita</string>
+ <string name="auth_oauth_error_access_denied">Accesso negato dal server di autorizzazione</string>
+ <string name="auth_wtf_reenter_URL">Stato inatteso; inserisci nuovamente l\'URL del server</string>
+ <string name="auth_expired_oauth_token_toast">Autorizzazione scaduta. Richiedi l\'autorizzazione</string>
+ <string name="auth_expired_basic_auth_toast">Inserisci la password attuale</string>
+ <string name="auth_expired_saml_sso_token_toast">Sessione scaduta. Riconnettiti</string>
+ <string name="auth_connecting_auth_server">Connessione al server di autenticazione in corso...</string>
+ <string name="auth_unsupported_auth_method">Il server non supporta questo metodo di autenticazione</string>
+ <string name="auth_unsupported_multiaccount">%1$s non supporta account multipli</string>
+ <string name="auth_can_not_auth_against_server">Impossibile eseguire l\'autenticazione su questo server</string>
<string name="fd_keep_in_sync">Tieni aggiornato il file</string>
- <string name="common_share">Condividi</string>
<string name="common_rename">Rinomina</string>
<string name="common_remove">Rimuovi</string>
<string name="confirmation_remove_alert">Vuoi davvero rimuovere %1$s?</string>
<string name="rename_server_fail_msg">La rinomina non può essere completata</string>
<string name="sync_file_fail_msg">Il file remoto non può essere controllato</string>
<string name="sync_file_nothing_to_do_msg">Contenuti del file già sincronizzati</string>
- <string name="create_dir_fail_msg">La cartella non può essere creata</string>
+ <string name="create_dir_fail_msg">La cartella non potrebbe essere creata</string>
+ <string name="filename_forbidden_characters">Caratteri proibiti: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Attendi</string>
<string name="filedisplay_unexpected_bad_get_content">Problema inatteso; prova un\'altra applicazione per selezionare il file</string>
<string name="filedisplay_no_file_selected">Non è stato selezionato alcun file</string>
- <string name="ssl_validator_title">Avviso</string>
+ <string name="activity_chooser_title">Invia collegamento a...</string>
+ <string name="oauth_check_onoff">Accesso con oAuth2.</string>
+ <string name="oauth_login_connection">Connessione al server oAuth2 in corso...</string>
<string name="ssl_validator_header">L\'identità del sito non può essere verificata</string>
<string name="ssl_validator_reason_cert_not_trusted">- Il certificato del server non è affidabile</string>
<string name="ssl_validator_reason_cert_expired">- Il certificato del server è scaduto</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- Il certificato del server è troppo recente</string>
<string name="ssl_validator_reason_hostname_not_verified">- L\'URL non corrisponde al nome host nel certificato</string>
- <string name="ssl_validator_certificate_not_available">Impossibile ottenere il certificato del server</string>
<string name="ssl_validator_question">Vuoi fidarti comunque di questo certificato?</string>
<string name="ssl_validator_not_saved">Il certificato non può essere salvato</string>
<string name="ssl_validator_btn_details_see">Dettagli</string>
<string name="ssl_validator_label_validity_to">A:</string>
<string name="ssl_validator_label_signature">Firma:</string>
<string name="ssl_validator_label_signature_algorithm">Algoritmo:</string>
- <string name="text_placeholder">Questo è un segnaposto</string>
+ <string name="ssl_validator_null_cert">Il certificato non può essere mostrato.</string>
+ <string name="ssl_validator_no_info_about_error">- Nessuna informazione sull\'errore</string>
+ <string name="placeholder_sentence">Questo è un segnaposto</string>
+ <string name="placeholder_filename">segnaposto.txt</string>
+ <string name="placeholder_filetype">Immagine PNG</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Carica le immagini solo via WiFi</string>
<string name="instant_upload_path">/InstantUpload</string>
<string name="conflict_title">Conflitto di aggiornamento</string>
<string name="conflict_keep_both">Mantieni entrambi</string>
<string name="conflict_overwrite">Sovrascrivi</string>
<string name="conflict_dont_upload">Non inviare</string>
+ <string name="preview_image_description">Anteprima dell\'immagine</string>
+ <string name="preview_image_error_unknown_format">Questa immagine non può essere mostrata</string>
+ <string name="error__upload__local_file_not_copied">%1$s non può essere copiato nella cartella locale %2$s</string>
+ <string name="actionbar_failed_instant_upload">Caricamento istantaneo non riuscito</string>
+ <string name="failed_upload_headline_text">Caricamenti istantanei non riusciti</string>
+ <string name="failed_upload_headline_hint">Riepilogo dei caricamenti istantanei non riusciti</string>
+ <string name="failed_upload_all_cb">seleziona tutto</string>
+ <string name="failed_upload_headline_retryall_btn">riprova tutti i selezionati</string>
+ <string name="failed_upload_headline_delete_all_btn">elimina tutti i selezionati dalla coda di caricamento</string>
+ <string name="failed_upload_retry_text">riprova a caricare l\'immagine:</string>
+ <string name="failed_upload_load_more_images">Carica altre immagini</string>
+ <string name="failed_upload_retry_do_nothing_text">non fare niente, non sei collegato per i caricamenti istantanei</string>
+ <string name="failed_upload_failure_text">Messaggio d\'errore:</string>
+ <string name="failed_upload_quota_exceeded_text">Controlla la configurazione del server, forse hai superato la tua quota.</string>
+ <string name="share_link_file_no_exist">Impossibile condividere il file o la cartella. Assicurati che esista.</string>
+ <string name="share_link_file_error">Si è verificato un errore durante il tentativo di condivisione del file o della cartella</string>
+ <string name="unshare_link_file_no_exist">Impossibile rimuovere dalla condivisione il file o la cartella. Non esiste.</string>
+ <string name="unshare_link_file_error">Si è verificato un errore durante il tentativo di rimuovere la condivisione del file o della cartella</string>
+ <string name="activity_chooser_send_file_title">Invia</string>
+ <string name="copy_link">Copia collegamento</string>
+ <string name="clipboard_text_copied">Copiato negli appunti</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">パスワード:</string>
- <string name="main_login">ユーザー名:</string>
- <string name="main_button_login">ログイン</string>
- <string name="main_welcome">ownCloudへようこそ</string>
- <string name="main_files">ファイル</string>
- <string name="main_music">ミュージック</string>
- <string name="main_contacts">連絡先</string>
- <string name="main_calendar">カレンダー</string>
- <string name="main_bookmarks">ブックマーク</string>
- <string name="main_settings">設定</string>
- <string name="main_tit_accsetup">アカウントを設定</string>
- <string name="main_wrn_accsetup">このデバイスには、ownCloudのアカウントがありません。このアプリケーションを使用するにはアカウントを作成してください。</string>
- <string name="about_message">ownCloud Android クライアント\n\nバージョン: %1$s</string>
- <string name="actionbar_sync">同期</string>
- <string name="actionbar_upload">ファイルをアップロード</string>
+ <string name="about_android">%1$s アンドロイドアプリ</string>
+ <string name="about_version">バージョン %1$s</string>
+ <string name="actionbar_sync">アカウントを同期</string>
+ <string name="actionbar_upload">アップロード</string>
<string name="actionbar_upload_from_apps">他アプリからのコンテンツ</string>
<string name="actionbar_upload_files">ファイル</string>
- <string name="actionbar_mkdir">ディレクトリを作成</string>
- <string name="actionbar_search">検索</string>
+ <string name="actionbar_open_with">次で開く</string>
+ <string name="actionbar_mkdir">新しいフォルダー</string>
<string name="actionbar_settings">設定</string>
+ <string name="actionbar_see_details">詳細</string>
+ <string name="actionbar_send_file">送信</string>
<string name="prefs_category_general">一般</string>
- <string name="prefs_category_trackmydevice">デバイスの追跡</string>
- <string name="prefs_add_session">新しいセッションを追加</string>
- <string name="prefs_create_img_thumbnails">サムネイル画像を作成</string>
- <string name="prefs_select_oc_account">アカウントを選択</string>
- <string name="prefs_summary_select_oc_account">利用するアカウントを選んでください。</string>
- <string name="prefs_trackmydevice">デバイスの追跡</string>
- <string name="prefs_trackmydevice_summary_off">デバイスの位置情報をownCloudに通知</string>
- <string name="prefs_trackmydevice_summary_on">ownCloudはこのデバイスを追跡します</string>
- <string name="prefs_trackmydevice_interval">更新間隔</string>
- <string name="prefs_trackmydevice_interval_summary">%1$s 分間隔で更新</string>
+ <string name="prefs_category_more">もっと見る</string>
<string name="prefs_accounts">アカウント</string>
<string name="prefs_manage_accounts">アカウント管理</string>
- <string name="prefs_pincode">ownCloudアプリのパスワード</string>
- <string name="prefs_pincode_summary">ownCloudクライアントを保護する</string>
+ <string name="prefs_pincode">アプリのパスワード</string>
+ <string name="prefs_pincode_summary">クライアントを保護する</string>
<string name="prefs_instant_upload">自動アップロードを有効</string>
<string name="prefs_instant_upload_summary">カメラで撮影した画像を自動アップロード</string>
- <string name="auth_host_url">ownCloud URL</string>
+ <string name="prefs_log_title">ログを有効にする</string>
+ <string name="prefs_log_summary">これは問題をログに記録するのに使用します。</string>
+ <string name="prefs_log_title_history">ログ履歴</string>
+ <string name="prefs_log_summary_history">これは記録されたログを表示します</string>
+ <string name="prefs_log_delete_history_button">履歴を削除</string>
+ <string name="prefs_help">ヘルプ</string>
+ <string name="prefs_recommend">友達に推薦</string>
+ <string name="prefs_feedback">フィードバック</string>
+ <string name="prefs_imprint">インプリント</string>
+ <string name="recommend_subject">スマートフォンで %1$s を試してください!</string>
+ <string name="auth_check_server">サーバーを確認する</string>
+ <string name="auth_host_url">サーバーアドレス https://…</string>
<string name="auth_username">ユーザー名</string>
<string name="auth_password">パスワード</string>
- <string name="auth_register">私は、ownCloudの新規ユーザーです。</string>
- <string name="new_session_uri_error">誤ったURLです</string>
- <string name="new_session_session_name_error">誤ったセッション名です</string>
+ <string name="auth_register">%1$sは初めてですか?</string>
<string name="sync_string_files">ファイル</string>
- <string name="uploader_no_file_selected">アップロードのためのファイルが選択されていません</string>
- <string name="setup_hint_username">ユーザー名</string>
- <string name="setup_hint_password">パスワード</string>
- <string name="setup_hint_address">WEBアドレス</string>
- <string name="setup_hint_show_password">パスワードを表示しますか?</string>
- <string name="setup_title">ownCloudに接続</string>
<string name="setup_btn_connect">接続</string>
<string name="uploader_btn_upload_text">アップロード</string>
<string name="uploader_wrn_no_account_title">アカウントが見つかりません</string>
- <string name="uploader_wrn_no_account_text">デバイスにownCloudのアカウントがありません。まず最初にアカウントを登録してください。</string>
+ <string name="uploader_wrn_no_account_text">デバイスに%1$sのアカウントがありません。まず最初にアカウントを登録してください。</string>
<string name="uploader_wrn_no_account_setup_btn_text">設定</string>
<string name="uploader_wrn_no_account_quit_btn_text">終了</string>
<string name="uploader_wrn_no_content_title">アップロードするコンテンツはありません</string>
<string name="uploader_wrn_no_content_text">コンテンツを受信しませんでした。アップロードするものはありません。</string>
- <string name="uploader_error_forbidden_content">ownCloudで共有コンテンツへのアクセスが許可されていません。</string>
+ <string name="uploader_error_forbidden_content">%1$sで共有コンテンツへのアクセスが許可されていません。</string>
<string name="uploader_info_uploading">アップロード中</string>
- <string name="uploader_btn_create_dir_text">アップロード用のディレクトリを作成</string>
- <string name="file_list_empty">このフォルダにはファイルがありません。\n\"アップロード\" メニューで新しいファイルを追加することができます。</string>
+ <string name="file_list_empty">このフォルダーにはファイルがありません。\n\"アップロード\" メニューで新しいファイルを追加することができます。</string>
<string name="filedetails_select_file">ファイルをタップすると追加情報が表示されます。</string>
<string name="filedetails_size">サイズ:</string>
<string name="filedetails_type">タイプ:</string>
<string name="filedetails_created">作成:</string>
<string name="filedetails_modified">更新:</string>
<string name="filedetails_download">ダウンロード</string>
- <string name="filedetails_sync_file">同期</string>
- <string name="filedetails_redownload">再ダウンロード</string>
- <string name="filedetails_open">開く</string>
+ <string name="filedetails_sync_file">ファイルを同期</string>
<string name="filedetails_renamed_in_upload_msg">アップロード中にファイル名を %1$s に変更しました</string>
+ <string name="action_share_file">URLで共有</string>
+ <string name="action_unshare_file">未共有のリンク</string>
<string name="common_yes">はい</string>
<string name="common_no">いいえ</string>
<string name="common_ok">OK</string>
<string name="common_cancel_upload">アップロードをキャンセル</string>
<string name="common_cancel">キャンセル</string>
<string name="common_save_exit">保存して終了</string>
- <string name="common_exit">ownCloudを終了</string>
<string name="common_error">エラー</string>
- <string name="about_title">ownCloudについて</string>
+ <string name="common_loading">読込中...</string>
+ <string name="common_error_unknown">不明なエラー</string>
+ <string name="about_title">について</string>
+ <string name="change_password">パスワードを変更</string>
<string name="delete_account">アカウントを削除</string>
<string name="create_account">アカウントを作成</string>
<string name="upload_chooser_title">アップロード …</string>
- <string name="uploader_info_dirname">ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ª名</string>
+ <string name="uploader_info_dirname">ã\83\95ã\82©ã\83«ã\83\80ã\83¼名</string>
<string name="uploader_upload_in_progress_ticker">アップロード中...</string>
<string name="uploader_upload_in_progress_content">%1$d%% アップロード中 %2$s</string>
<string name="uploader_upload_succeeded_ticker">アップロード完了</string>
<string name="uploader_upload_succeeded_content_single">%1$s は正常にアップロードされました</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d 個のファイルは正常にアップロードされました</string>
<string name="uploader_upload_failed_ticker">アップロードに失敗</string>
<string name="uploader_upload_failed_content_single">%1$s のアップロードが完了しませんでした</string>
- <string name="uploader_upload_failed_content_multiple">アップロードに失敗: %1$d/%2$d ファイルがアップロードされました</string>
<string name="downloader_download_in_progress_ticker">ダウンロード中 ...</string>
<string name="downloader_download_in_progress_content">%1$d%% ダウンロード中 %2$s</string>
<string name="downloader_download_succeeded_ticker">ダウンロードに成功</string>
<string name="downloader_download_succeeded_content">%1$s は正常にダウンロードされました</string>
<string name="downloader_download_failed_ticker">ダウンロードに失敗</string>
<string name="downloader_download_failed_content">%1$s のダウンロードは完了しませんでした</string>
+ <string name="downloader_not_downloaded_yet">未ダウンロード</string>
<string name="common_choose_account">アカウントを選択</string>
- <string name="sync_string_contacts">コンタクト</string>
<string name="sync_fail_ticker">同期失敗</string>
<string name="sync_fail_content">%1$s の同期が完了しませんでした。</string>
+ <string name="sync_fail_content_unauthorized">1$sの無効なパスワード</string>
<string name="sync_conflicts_in_favourites_ticker">競合が見つかりました</string>
<string name="sync_conflicts_in_favourites_content">%1$d 同期ファイルを同期できませんでした</string>
<string name="sync_fail_in_favourites_ticker">ファイルの同期に失敗しました</string>
<string name="sync_fail_in_favourites_content">%1$d ファイルのコンテンツを同期できませんでした(%2$d の競合)</string>
- <string name="use_ssl">暗号通信を利用</string>
- <string name="location_no_provider">ownCloudがあなたのデバイスの位置情報を取得出来ません。位置情報設定を確認してください。</string>
+ <string name="sync_foreign_files_forgotten_ticker">一部のローカルファイルが忘れられています</string>
+ <string name="sync_current_folder_was_removed">フォルダー %1$s はもう存在しません</string>
+ <string name="foreign_files_move">全て移動</string>
+ <string name="foreign_files_success">全てのファイルは移動されました</string>
+ <string name="foreign_files_fail">一部のファイルは移動できませんでした</string>
+ <string name="foreign_files_local_text">ローカル: %1$s</string>
+ <string name="foreign_files_remote_text">リモート: %1$s</string>
+ <string name="upload_query_move_foreign_files">%1$s フォルダーに選択されたファイルをコピーするのに十分な空き領域がありません。コピーする代わりに、それらを移動させますか?</string>
<string name="pincode_enter_pin_code">アプリのパスワードを入力してください</string>
- <string name="pincode_enter_new_pin_code">新しいアプリのパスワードを入力してください</string>
- <string name="pincode_configure_your_pin">ownCloudアプリのパスワードを入力してください</string>
+ <string name="pincode_configure_your_pin">アプリのパスワードを入力してください</string>
<string name="pincode_configure_your_pin_explanation">アプリ開始時に毎回PINが要求されます。</string>
- <string name="pincode_reenter_your_pincode">ownCloudアプリのパスワードを再入力してください</string>
- <string name="pincode_remove_your_pincode">ownCloudアプリのパスワードを削除</string>
- <string name="pincode_mismatch">ownCloudアプリのパスワードが一致しません</string>
- <string name="pincode_wrong">無効なownCloudアプリのパスワードです</string>
- <string name="pincode_removed">ownCloudアプリのパスワードを削除しました</string>
- <string name="pincode_stored">ownCloudアプリのパスワードを保存しました</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15分</item>
- <item>30分</item>
- <item>60分</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_reenter_your_pincode">アプリのパスワードを再入力してください</string>
+ <string name="pincode_remove_your_pincode">アプリのパスワードを削除</string>
+ <string name="pincode_mismatch">アプリのパスワードが一致しません</string>
+ <string name="pincode_wrong">無効なアプリのパスワードです</string>
+ <string name="pincode_removed">アプリのパスワードを削除しました</string>
+ <string name="pincode_stored">アプリのパスワードを保存しました</string>
+ <string name="media_notif_ticker">%1$s ミュージックプレーヤー</string>
+ <string name="media_state_playing">%1$s (プレイ中)</string>
+ <string name="media_state_loading">%1$s (読込中)</string>
+ <string name="media_event_done">%1$s プレイバック終了</string>
+ <string name="media_err_nothing_to_play">メディアファイルが見つかりませんでした</string>
+ <string name="media_err_no_account">アカウントが提供されていません</string>
+ <string name="media_err_not_in_owncloud">ファイルが有効なアカウントにありません</string>
+ <string name="media_err_unsupported">サポートされていないメディアコーデック</string>
+ <string name="media_err_io">メディアファイルを読み込めませんでした</string>
+ <string name="media_err_malformed">メディアファイルが正確にエンコードされていません</string>
+ <string name="media_err_timeout">再生中にタイムアウトが発生しました</string>
+ <string name="media_err_invalid_progressive_playback">メディアファイルをストリーミングできません</string>
+ <string name="media_err_unknown">メディアファイルをStock Media Playerで再生できません</string>
+ <string name="media_err_security_ex">再生時にセキュリティエラー %1$s</string>
+ <string name="media_err_io_ex">再生時に入力エラー %1$s</string>
+ <string name="media_err_unexpected">再生時に予期しないエラー %1$s</string>
+ <string name="media_rewind_description">巻き戻しボタン</string>
+ <string name="media_play_pause_description">再生/一時停止ボタン</string>
+ <string name="media_forward_description">早送りボタン</string>
<string name="auth_trying_to_login">ログイン中...</string>
<string name="auth_no_net_conn_title">ネットワークに接続されていません</string>
- <string name="auth_no_net_conn_message">ネットワーク接続が見つかりません、インターネット接続を確認してからお試しください。</string>
- <string name="auth_connect_anyway">接続する</string>
<string name="auth_nossl_plain_ok_title">暗号化通信が利用できません。</string>
- <string name="auth_nossl_plain_ok_message">サーバーとの暗号化通信を確立できませんでした。しかし、通常の通信が利用できます。続けますか?</string>
<string name="auth_connection_established">接続が確立しました</string>
<string name="auth_testing_connection">接続をテスト中...</string>
- <string name="auth_not_configured_title">ownCloudサーバーの間違った設定</string>
- <string name="auth_not_configured_message">ownCloudサーバー設定が正しくないようです。詳しくは管理者にご相談ください。</string>
+ <string name="auth_not_configured_title">サーバー設定が間違っています</string>
+ <string name="auth_account_not_new">同じユーザーとサーバーのアカウントがデバイス上にすでに存在します</string>
+ <string name="auth_account_not_the_same">入力されたユーザーはこのアカウントのユーザーと一致しません</string>
<string name="auth_unknown_error_title">不明なエラーに発生しました</string>
- <string name="auth_unknown_error_message">不明なエラーが発生しました。制作者に連絡して、あなたのデバイスのログを送付してください。</string>
<string name="auth_unknown_host_title">ホストが見つかりませんでした</string>
- <string name="auth_unknown_host_message">入力されたホストが見つかりません。ホスト名とサーバが利用できるものかどうか確認して、再度試してください。</string>
- <string name="auth_incorrect_path_title">ownCloudのインスタンスが見つかりませんでした</string>
- <string name="auth_incorrect_path_message">指定されたパスでownCloudのサーバが見つかりませんでした。パスを確認してもう一度試してみてください。</string>
- <string name="auth_timeout_title">サーバーからの反応がありません。</string>
+ <string name="auth_incorrect_path_title">サーバーのインスタンスが見つかりません</string>
+ <string name="auth_timeout_title">サーバーからの反応がありません</string>
<string name="auth_incorrect_address_title">不明なURL形式</string>
<string name="auth_ssl_general_error_title">SSLの初期化に失敗しました</string>
- <string name="auth_ssl_unverified_server_title">未認証のSSLサーバID</string>
- <string name="auth_bad_oc_version_title">認識出来ないownCloudサーバのバージョンです</string>
+ <string name="auth_ssl_unverified_server_title">SSLサーバー識別子を確認できませんでした</string>
+ <string name="auth_bad_oc_version_title">認識できないサーバーのバージョンです</string>
<string name="auth_wrong_connection_title">接続を確立できませんでした</string>
<string name="auth_secure_connection">暗号化通信を確立しました</string>
- <string name="auth_login_details">ログインの詳細</string>
- <string name="auth_unauthorized">無効なログイン/パスワード</string>
- <string name="auth_not_found">誤ったパスが指定されました</string>
- <string name="auth_internal">内部サーバエラー、コード %1$d</string>
- <string name="crashlog_message">アプリケーションが予期せず終了しました。クラッシュレポートを送ってもよろしいでしょうか?</string>
- <string name="crashlog_send_report">レポートを送信</string>
- <string name="crashlog_dont_send_report">レポートを送信しない</string>
- <string name="extensions_avail_title">拡張機能が利用可能です!</string>
- <string name="extensions_avail_message">ownCloudサーバーは拡張機能がサポートされているようです。androidで利用できる拡張機能を見ますか?</string>
+ <string name="auth_unauthorized">間違ったユーザー名もしくはパスワード</string>
+ <string name="auth_oauth_error">認証失敗</string>
+ <string name="auth_oauth_error_access_denied">認証サーバーによってアクセスが拒否されました</string>
+ <string name="auth_wtf_reenter_URL">予期しない状態。もう一度サーバーのURLを入力してください</string>
+ <string name="auth_expired_oauth_token_toast">認証情報は有効期限切れです。再度認証を行ってください。</string>
+ <string name="auth_expired_basic_auth_toast">現在のパスワードを入力してください</string>
+ <string name="auth_expired_saml_sso_token_toast">セッションの有効期限切れです。再度接続してください。</string>
+ <string name="auth_connecting_auth_server">認証サーバーに接続中 ...</string>
+ <string name="auth_unsupported_auth_method">サーバーはこの認証方式をサポートしていません</string>
+ <string name="auth_unsupported_multiaccount">%1$s は複数アカウントをサポートしていません</string>
<string name="fd_keep_in_sync">ファイルを最新に保つ</string>
- <string name="common_share">共有</string>
<string name="common_rename">名前を変更</string>
<string name="common_remove">削除</string>
<string name="confirmation_remove_alert">本当に %1$s を削除してもよろしいですか?</string>
<string name="confirmation_remove_folder_alert">本当に %1$s およびそのコンテンツを削除してもよろしいですか?</string>
<string name="confirmation_remove_local">ローカルのみ</string>
<string name="confirmation_remove_folder_local">ローカルコンテンツのみ</string>
- <string name="confirmation_remove_remote">サーバから削除</string>
+ <string name="confirmation_remove_remote">ã\82µã\83¼ã\83\90ã\83¼ã\81\8bã\82\89å\89\8aé\99¤</string>
<string name="confirmation_remove_remote_and_local">リモートとローカルの両方</string>
<string name="remove_success_msg">削除に成功しました</string>
<string name="remove_fail_msg">削除を完了できませんでした</string>
<string name="rename_server_fail_msg">名前の変更ができませんでした</string>
<string name="sync_file_fail_msg">リモートファイルをチェックできませんでした</string>
<string name="sync_file_nothing_to_do_msg">ファイルコンテンツはすでに同期されています</string>
- <string name="create_dir_fail_msg">ディレクトリを作成できませんでした</string>
+ <string name="filename_forbidden_characters">使用できない文字: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">しばらくお待ちください</string>
<string name="filedisplay_unexpected_bad_get_content">予期せぬ問題;他のアプリでファイルを選択してみてください。</string>
<string name="filedisplay_no_file_selected">ファイルは選択されていません</string>
- <string name="ssl_validator_title">警告</string>
+ <string name="activity_chooser_title">リンクを送信…</string>
+ <string name="oauth_check_onoff">oAuth2でログイン</string>
+ <string name="oauth_login_connection">oAuth2サーバーに接続中...</string>
<string name="ssl_validator_header">サイトの識別子を確認できませんでした</string>
- <string name="ssl_validator_reason_cert_not_trusted">- サーバ証明書は信頼されていません</string>
- <string name="ssl_validator_reason_cert_expired">- サーバ証明書は有効期限切れです</string>
- <string name="ssl_validator_reason_cert_not_yet_valid">- サーバ証明書は若すぎます</string>
+ <string name="ssl_validator_reason_cert_not_trusted">- サーバー証明書は信頼されていません</string>
+ <string name="ssl_validator_reason_cert_expired">- サーバー証明書は有効期限切れです</string>
+ <string name="ssl_validator_reason_cert_not_yet_valid">- サーバー証明書の有効期限は未来のものです</string>
<string name="ssl_validator_reason_hostname_not_verified">- URLは証明書内のホスト名と一致しません</string>
- <string name="ssl_validator_certificate_not_available">サーバ証明書を取得できませんでした</string>
<string name="ssl_validator_question">この証明書を信頼してもよろしいですか?</string>
<string name="ssl_validator_not_saved">証明書は保存できませんでした</string>
<string name="ssl_validator_btn_details_see">詳細</string>
<string name="ssl_validator_label_validity_to">先:</string>
<string name="ssl_validator_label_signature">署名:</string>
<string name="ssl_validator_label_signature_algorithm">アルゴリズム:</string>
- <string name="text_placeholder">これはプレースホルダです</string>
+ <string name="placeholder_sentence">これはプレースホルダです</string>
+ <string name="placeholder_filename">placeholder.txt</string>
+ <string name="placeholder_filetype">PNG 画像</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">WiFi経由でのみ写真をアップロード</string>
<string name="instant_upload_path">/InstantUpload</string>
- <string name="conflict_title">æ\9b´æ\96°ã\81®競合</string>
- <string name="conflict_message">リモートファイル %s はローカルファイルと同期していません。続行すると、サーバ上のファイルを置き換えます。</string>
+ <string name="conflict_title">æ\9b´æ\96°ã\81\8c競合</string>
+ <string name="conflict_message">リモートファイル %s はローカルファイルと同期していません。続行すると、サーバー上のファイルを置き換えます。</string>
<string name="conflict_keep_both">両方を保持</string>
<string name="conflict_overwrite">上書き</string>
<string name="conflict_dont_upload">アップロードしない</string>
+ <string name="preview_image_description">イメージプレビュー</string>
+ <string name="preview_image_error_unknown_format">この画像は表示できません</string>
+ <string name="actionbar_failed_instant_upload">インスタントアップロードに失敗</string>
+ <string name="failed_upload_headline_text">インスタントアップロードに失敗</string>
+ <string name="failed_upload_headline_hint">全ての失敗したインスタントアップロードの要約</string>
+ <string name="failed_upload_all_cb">すべて選択</string>
+ <string name="failed_upload_headline_retryall_btn">すべての選択を再試行</string>
+ <string name="failed_upload_headline_delete_all_btn">アップロードキューからすべての選択を削除</string>
+ <string name="failed_upload_retry_text">画像のアップロードを再試行:</string>
+ <string name="failed_upload_load_more_images">更に画像を読み込む</string>
+ <string name="failed_upload_retry_do_nothing_text">オンラインでなく、インスタントアップロードのために何もしません</string>
+ <string name="failed_upload_failure_text">失敗メッセージ:</string>
+ <string name="failed_upload_quota_exceeded_text">サーバー設定を確認してください。クォータサイズを超えている可能性があります。</string>
+ <string name="share_link_file_no_exist">このファイルまたはフォルダーは共有できません。存在しているか確認してください。</string>
+ <string name="share_link_file_error">このファイルまたはフォルダーを共有する際にエラーが発生しました</string>
+ <string name="unshare_link_file_no_exist">このファイルもしくはフォルダは存在しないため、共有を解除できません。</string>
+ <string name="unshare_link_file_error">このファイルまたはフォルダーの共有を解除する際にエラーが発生しました</string>
+ <string name="activity_chooser_send_file_title">送信</string>
+ <string name="copy_link">リンクをコピー</string>
+ <string name="clipboard_text_copied">クリップボードにコピー</string>
</resources>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="filedetails_download">Njipuk</string>
+</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="main_files">ფაილები</string>
- <string name="main_music">მუსიკა</string>
- <string name="main_contacts">კონტაქტები</string>
- <string name="main_bookmarks">ბუქმარკები</string>
- <string name="main_settings">პარამეტრები</string>
<string name="actionbar_upload">ატვირთვა</string>
+ <string name="actionbar_upload_from_apps">კონტენტი სხვა აპლიკაცისებიდან</string>
<string name="actionbar_upload_files">ფაილები</string>
+ <string name="actionbar_mkdir">ახალი ფოლდერი</string>
<string name="actionbar_settings">პარამეტრები</string>
+ <string name="actionbar_send_file">გაგზავნა</string>
<string name="prefs_category_general">ზოგადი</string>
- <string name="auth_host_url">URL</string>
+ <string name="prefs_category_more">უფრო მეტი</string>
+ <string name="prefs_accounts">ანგარიში</string>
+ <string name="prefs_manage_accounts">ანგარიშების მენეჯმენტი</string>
+ <string name="prefs_pincode">აპლიკაციის PIN–ი</string>
+ <string name="prefs_pincode_summary">თქვენი კლიენტის დაცვა</string>
+ <string name="prefs_instant_upload">ჩართე ეგრევე ატვირთვის ფუნქცია</string>
+ <string name="prefs_instant_upload_summary">კამერით გადაღებული ფოტოების ეგრევე ატვირთვა</string>
+ <string name="prefs_help">დახმარება</string>
+ <string name="prefs_feedback">უკუკავშირი</string>
+ <string name="prefs_imprint">ბეჭედი</string>
<string name="auth_username">მომხმარებლის სახელი</string>
<string name="auth_password">პაროლი</string>
<string name="sync_string_files">ფაილები</string>
- <string name="setup_hint_username">მომხმარებლის სახელი</string>
- <string name="setup_hint_password">პაროლი</string>
+ <string name="setup_btn_connect">დაკავშირება</string>
<string name="uploader_btn_upload_text">ატვირთვა</string>
+ <string name="uploader_wrn_no_account_title">ანგარიში ვერ მოიძებნა</string>
+ <string name="uploader_wrn_no_account_text"> %1$s ანგარიში არ არის თქვენს მოწყობილობაში. გთხოვთ ჯერ დააყენოთ ის.</string>
+ <string name="uploader_wrn_no_account_setup_btn_text">დაყენება</string>
<string name="uploader_wrn_no_account_quit_btn_text">გამოსვლა</string>
+ <string name="uploader_wrn_no_content_title">არ არის კონტენტი ასატვირთად</string>
+ <string name="uploader_wrn_no_content_text">კონტენტი არ იქნა მიღებული. არაფერია ასატვირთად.</string>
+ <string name="uploader_error_forbidden_content">%1$s–ი არ დაიშვება გაზიარებული კონტენტის სანახავად</string>
+ <string name="uploader_info_uploading">მიმდინარეობს ატვირთვა</string>
+ <string name="file_list_empty">ამ ფოლდერში ფაილები არ არის.⏎\nახალი ფაილები შეიძლება დაემატოს \"ატვირთვა\" მენიუს ოფციით.</string>
+ <string name="filedetails_select_file">დააჭირეთ ფაილს დამატებითი ინფორმაციის გამოსაჩენად.</string>
+ <string name="filedetails_size">ზომა:</string>
+ <string name="filedetails_type">ტიპი:</string>
+ <string name="filedetails_created">შექმნილია:</string>
+ <string name="filedetails_modified">მოდიფიცირებულია:</string>
<string name="filedetails_download">ჩამოტვირთვა</string>
- <string name="filedetails_open">გახსნა</string>
+ <string name="filedetails_renamed_in_upload_msg">ფაილ %1$s–ზე გადარქმეულ იქნა სახელი ატვირთვის დროს</string>
<string name="common_yes">კი</string>
+ <string name="common_no">არა</string>
+ <string name="common_ok">დიახ</string>
+ <string name="common_cancel_download">ჩამოტვირთვის შეჩერება</string>
<string name="common_cancel_upload">ატვირთვის გაუქმება</string>
<string name="common_cancel">გაუქმება</string>
+ <string name="common_save_exit">შენახვა &გამოსვლა</string>
<string name="common_error">შეცდომა</string>
- <string name="sync_string_contacts">კონტაქტები</string>
- <string name="common_share">გაზიარება</string>
+ <string name="common_error_unknown">უცნობი შეცდომა</string>
+ <string name="about_title">ჩვენს შესახებ</string>
+ <string name="change_password">პაროლის შეცვლა</string>
+ <string name="delete_account">ანგარიშის წაშლა</string>
+ <string name="create_account">ანგარიშის შექმნა</string>
+ <string name="upload_chooser_title">ატვირთე აქედან...</string>
+ <string name="uploader_info_dirname">ფოლდერის სახელი</string>
+ <string name="uploader_upload_in_progress_ticker">მიმდინარეობს ატვირთვა...</string>
+ <string name="uploader_upload_in_progress_content">%1$d%% მიმდინარეობს ატვირთვა %2$s</string>
+ <string name="uploader_upload_succeeded_ticker">ატვირთვა განხორციელდა</string>
+ <string name="uploader_upload_succeeded_content_single">%1$s–ი წარმატებით ატვირთულ იქნა</string>
+ <string name="uploader_upload_failed_ticker">ატვირთვა ვერ განხორციელდა</string>
+ <string name="uploader_upload_failed_content_single">%1$s ატვირთვა ვერ დასრულდა</string>
+ <string name="downloader_download_in_progress_ticker">ჩამოტვირთვა...</string>
+ <string name="downloader_download_in_progress_content">%1$d%% ჩამოტვირთვა %2$s</string>
+ <string name="downloader_download_succeeded_ticker">გადმოწერა დასრულდა</string>
+ <string name="downloader_download_succeeded_content">%1$s წარმატებით ჩამოიქაჩა</string>
+ <string name="downloader_download_failed_ticker">ჩამოტვირთვა ვერ განხორციელდა</string>
+ <string name="downloader_download_failed_content">ჩამოტვირთვა %1$s–ის ვერ დასრულდა</string>
+ <string name="common_choose_account">აირჩიეთ ანგარიში</string>
+ <string name="sync_fail_ticker">შეცდომა სინქრონიზაციისას</string>
+ <string name="sync_fail_content"> %1$s –ის სინქრონიზაცია ვერ დასრულდა</string>
+ <string name="sync_conflicts_in_favourites_ticker">კონფლიქტი წარმოიშვა</string>
+ <string name="sync_conflicts_in_favourites_content">%1$d kept-in-sync ფაილების სინქრონიზაცია არ შეიძლება</string>
+ <string name="sync_fail_in_favourites_ticker">Kept-in-sync ფაილები ვერ მოხერხდა</string>
+ <string name="sync_fail_in_favourites_content">%1$d ფაილების კონტენტის სინქრონიზაცია ვერ მოხერხდა (%2$d კონფლიქტი)</string>
+ <string name="sync_foreign_files_forgotten_ticker">რამოდენიმე ლოკალური ფაილი დაკარგულია</string>
+ <string name="foreign_files_move">გადაიტანე ყველა</string>
+ <string name="foreign_files_success">ყველა ფაილები გადატანილია</string>
+ <string name="foreign_files_fail">რამოდენიმე ფაილის გადატანა ვერ მოხერხდა</string>
+ <string name="foreign_files_local_text">ლოკალური: %1$s</string>
+ <string name="foreign_files_remote_text">დაშორებული: %1$s</string>
+ <string name="upload_query_move_foreign_files">ადგილი არ არის მონიშნული ფაილების დასაკოპირებლად %1$s ფოლდერში. გინდათ თქვენ გადაიტანოთ ისინი ამის მაგივრად?</string>
+ <string name="pincode_enter_pin_code">გთხოვთ, ჩასვათ თქვენი აპლიკაციის PIN–ი</string>
+ <string name="pincode_configure_your_pin">შეიყვანეთ თქვენი აპლიკაციის PIN–ი</string>
+ <string name="pincode_configure_your_pin_explanation">PIN–ი მოთხოვნილი იქნება აპლიკაციის ყოველ ჩართვაზე</string>
+ <string name="pincode_reenter_your_pincode">გთხოვთ შეიყვანოთ თქვენი აპლიკაციის PIN–ი ხელთავიდან</string>
+ <string name="pincode_remove_your_pincode">წაშალეთ თქვენი აპლიკაციის PIN–ი</string>
+ <string name="pincode_mismatch">აპლიკაციის PIN–ი არ არის იგივე</string>
+ <string name="pincode_wrong">არასწორი აპლიკაციის PIN–ი</string>
+ <string name="pincode_removed">აპლიკაციის PIN–ი წაიშალა</string>
+ <string name="pincode_stored">აპლიკაციის PIN–ი დამახსოვრებულ იქნა</string>
+ <string name="auth_no_net_conn_title">ქსელური კავშირი არ არის</string>
+ <string name="auth_nossl_plain_ok_title">დაცული კავშირი არ არსებობს.</string>
+ <string name="auth_connection_established">კავშირი დამყარდა</string>
+ <string name="auth_not_configured_title">არასწორი სერვერის კონფიგურაცია</string>
+ <string name="auth_unknown_error_title">აღმოჩენილია უცნობი შეცდომა!</string>
+ <string name="auth_unknown_host_title">ჰოსტი ვერ მოიძებნა</string>
+ <string name="auth_incorrect_path_title">სერვერის ინსტანცია ვერ მოიძებნა</string>
+ <string name="auth_timeout_title">სერვერმა გვიპასუხა ძალიან გვიან</string>
+ <string name="auth_incorrect_address_title">არასწორი URL </string>
+ <string name="auth_ssl_general_error_title">შეცდომა SSL ინიციალიზაციისას</string>
+ <string name="auth_bad_oc_version_title">ამოუცნობი სერვერის ვერსია</string>
+ <string name="auth_wrong_connection_title">კავშირის დამყარება ვერ მოხერხდა</string>
+ <string name="auth_secure_connection">დაცული კავშირი დამყარდა</string>
+ <string name="fd_keep_in_sync">არ განაახლო ფაილი</string>
<string name="common_rename">გადარქმევა</string>
<string name="common_remove">წაშლა</string>
- <string name="ssl_validator_title">გაფრთხილება</string>
+ <string name="confirmation_remove_alert">ნამდვილად გინდათ წაშალოთ %1$s ?</string>
+ <string name="confirmation_remove_folder_alert">თქვენ აუცილებლად გინდათ %1$s–ის წაშლა თავისი კონტენტით?</string>
+ <string name="confirmation_remove_local">მხოლოდ ლოკალური</string>
+ <string name="confirmation_remove_folder_local">მხოლოდ ლოკალური კონტენტი</string>
+ <string name="confirmation_remove_remote">სერვერიდან წაშლა</string>
+ <string name="confirmation_remove_remote_and_local">დაშორებული და ლოკალური</string>
+ <string name="remove_success_msg">წაშლა შარმატებით დასრულდა</string>
+ <string name="remove_fail_msg">წაშლა წარუმატებლად დამთავრდა</string>
+ <string name="rename_dialog_title">შეიყვანეთ ახალი სახელი</string>
+ <string name="rename_local_fail_msg">ლოკალურ კოპიაზე სახელის გადარქმევა ვერ მოხერხდა: გთხოვთ მიუთითოთ სხვა სახელი</string>
+ <string name="rename_server_fail_msg">გადარქმევა ვერ დასრულდა წარმატებით</string>
+ <string name="sync_file_fail_msg">დაშორებული ფაილის შემოწმება ვერ მოხერხდა</string>
+ <string name="sync_file_nothing_to_do_msg">ფაილების კონტენტის სინქრონიზაცია ვერ მოხერხდა</string>
+ <string name="wait_a_moment">გთხოვთ მოითმინოთ</string>
+ <string name="filedisplay_unexpected_bad_get_content">მოულოდნელი პრობლემა: გთხოვთ აირჩიოთ ფაილი სხვადასხვა აპლიკაციიდან</string>
+ <string name="filedisplay_no_file_selected">ფაილი არ ყოფილა მონიშნული</string>
+ <string name="ssl_validator_header">საიტის იდენტობა ვერ დამოწმდა</string>
+ <string name="ssl_validator_reason_cert_not_trusted">– სერვერის სერთიფიკატები არ არის ცნობიადი</string>
+ <string name="ssl_validator_reason_cert_expired">– სერვერის სერთიფიკატი ვადაგასულია</string>
+ <string name="ssl_validator_reason_cert_not_yet_valid">–სერვერის სერთიფიკატი არის დაშვებადი მომავალში</string>
+ <string name="ssl_validator_reason_hostname_not_verified">– URL არ ემთხვევა სერთიფიკატში არსებულ ჰოსტნეიმს</string>
+ <string name="ssl_validator_question">გინდათ მაინც ენდოთ მოცემულ სერთიფიკატს?</string>
+ <string name="ssl_validator_not_saved">სერთიფიკატის შენახვა ვერ მოხერხდა</string>
+ <string name="ssl_validator_btn_details_see">დეტალური ინფორმაცია</string>
<string name="ssl_validator_btn_details_hide">დამალვა</string>
+ <string name="ssl_validator_label_subject">გაცემულია:</string>
+ <string name="ssl_validator_label_issuer">გაცემულია მიერ:</string>
+ <string name="ssl_validator_label_CN">ზოგადი სახელი:</string>
+ <string name="ssl_validator_label_O">ორგანიზაცია:</string>
+ <string name="ssl_validator_label_OU">ორგანიზაციის განყოფილება:</string>
+ <string name="ssl_validator_label_C">ქვეყანა:</string>
+ <string name="ssl_validator_label_ST">შტატი:</string>
+ <string name="ssl_validator_label_L">ადგილმდებარეობა:</string>
+ <string name="ssl_validator_label_validity">მოქმედების ვადა:</string>
+ <string name="ssl_validator_label_validity_from">დან:</string>
+ <string name="ssl_validator_label_validity_to">ვისზე:</string>
+ <string name="ssl_validator_label_signature">სიგნატურა:</string>
+ <string name="ssl_validator_label_signature_algorithm">ალგორითმი:</string>
+ <string name="instant_upload_on_wifi">ატვირთეთ სურათები მხოლოდ WiFi–ით</string>
+ <string name="instant_upload_path">/ეგრევე ატვირთვა</string>
+ <string name="conflict_title">კონფლიქტი განახლებისას</string>
+ <string name="conflict_message">დაშორებული ფაილი %s არ არის სინქრონიზირებული ლოკალურ ფაილთან. ოპერაციის გაგრძელება გამოიწვევს სერვერზე ფაილის შეცვლას.</string>
+ <string name="conflict_keep_both">დატოვე ორივე</string>
+ <string name="conflict_overwrite">გადააწერე</string>
+ <string name="conflict_dont_upload">არ ატვირთო</string>
+ <string name="activity_chooser_send_file_title">გაგზავნა</string>
+ <string name="clipboard_text_copied">კოპირებულია კლიპბორდში</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="main_files">ფაილები</string>
<string name="actionbar_upload_files">ფაილები</string>
+ <string name="prefs_help">შველა</string>
<string name="auth_password">პაროლი</string>
<string name="sync_string_files">ფაილები</string>
- <string name="setup_hint_password">პაროლი</string>
<string name="filedetails_download">გადმოწერა</string>
</resources>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="actionbar_upload">ផ្ទុកឡើង</string>
+ <string name="actionbar_upload_files">ឯកសារ</string>
+ <string name="actionbar_mkdir">ថតថ្មី</string>
+ <string name="actionbar_settings">ការកំណត់</string>
+ <string name="actionbar_send_file">ផ្ញើ</string>
+ <string name="prefs_category_general">ទូទៅ</string>
+ <string name="prefs_category_more">ច្រើនទៀត</string>
+ <string name="prefs_accounts">គណនី</string>
+ <string name="prefs_help">ជំនួយ</string>
+ <string name="auth_username">ឈ្មោះអ្នកប្រើ</string>
+ <string name="auth_password">ពាក្យសម្ងាត់</string>
+ <string name="sync_string_files">ឯកសារ</string>
+ <string name="setup_btn_connect">ភ្ជាប់</string>
+ <string name="uploader_btn_upload_text">ផ្ទុកឡើង</string>
+ <string name="uploader_wrn_no_account_title">រកមិនឃើញគណនី</string>
+ <string name="uploader_wrn_no_account_text">គ្មាន %1$s គណនីលើម៉ាស៊ីនរបស់អ្នកទេ។ សូមរៀបចំគណនីមួយជាមុនសិន។</string>
+ <string name="uploader_wrn_no_account_setup_btn_text">ដំឡើង</string>
+ <string name="uploader_wrn_no_account_quit_btn_text">ចាក់ចេញ</string>
+ <string name="uploader_info_uploading">កំពុងផ្ទុកឡើង</string>
+ <string name="filedetails_select_file">ចុចមួយលើឯកសារ ដើម្បីបង្ហាញព័ត៌មានបន្ថែម។</string>
+ <string name="filedetails_size">ទំហំ៖</string>
+ <string name="filedetails_type">ប្រភេទ៖</string>
+ <string name="filedetails_created">បានបង្កើត៖</string>
+ <string name="filedetails_modified">បានកែសម្រួល៖</string>
+ <string name="filedetails_download">ទាញយក</string>
+ <string name="common_yes">ព្រម</string>
+ <string name="common_no">ទេ</string>
+ <string name="common_ok">OK</string>
+ <string name="common_cancel">លើកលែង</string>
+ <string name="common_save_exit">រក្សាទុក & ចាកចេញ</string>
+ <string name="common_error">កំហុស</string>
+ <string name="common_error_unknown">មិនស្គាល់កំហុស</string>
+ <string name="change_password">ប្តូរពាក្យសម្ងាត់</string>
+ <string name="uploader_info_dirname">ឈ្មោះថត</string>
+ <string name="common_choose_account">ជ្រើសគណនី</string>
+ <string name="pincode_enter_pin_code">សូម ដាក់បញ្ចូល App PIN របស់អ្នក</string>
+ <string name="pincode_configure_your_pin">បញ្ចូល App PIN របស់អ្នក</string>
+ <string name="pincode_reenter_your_pincode">សូម បញ្ចូល App PIN របស់អ្នកម្តងទៀត</string>
+ <string name="pincode_remove_your_pincode">លុប App PIN របស់អ្នក</string>
+ <string name="pincode_mismatch">App PIN ទាំងនេះមិនដូចគ្នាទេ</string>
+ <string name="pincode_wrong">App PIN មិនត្រឹមត្រូវទេ</string>
+ <string name="pincode_removed">App PIN បានលុបចេញហើយ</string>
+ <string name="pincode_stored">App PIN បានយកមកវិញ</string>
+ <string name="auth_no_net_conn_title">គ្មានបណ្តាញតភ្ជាប់ទេ</string>
+ <string name="common_remove">ដកចេញ</string>
+ <string name="activity_chooser_send_file_title">ផ្ញើ</string>
+</resources>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources/>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">암호:</string>
- <string name="main_login">사용자 이름:</string>
- <string name="main_button_login">로그인</string>
- <string name="main_welcome">환영합니다</string>
- <string name="main_files">파일</string>
- <string name="main_music">음악</string>
- <string name="main_contacts">연락처</string>
- <string name="main_calendar">달력</string>
- <string name="main_bookmarks">책갈피</string>
- <string name="main_settings">설정</string>
- <string name="main_tit_accsetup">계정 설정</string>
- <string name="main_wrn_accsetup">이 장치에 ownCloud 계정이 설정되어 있지 않습니다. 이 앱을 사용하려면 계정을 설정하십시오.</string>
- <string name="about_message">%1$s Android 앱\n\n버전: %2$s</string>
- <string name="actionbar_sync">새로 고침</string>
+ <string name="about_android">%1$s 안드로이드 앱</string>
+ <string name="about_version">버전 %1$s</string>
+ <string name="actionbar_sync">계정 새로고침</string>
<string name="actionbar_upload">업로드</string>
<string name="actionbar_upload_from_apps">다른 앱의 콘텐츠</string>
<string name="actionbar_upload_files">파일</string>
- <string name="actionbar_mkdir">디렉터리 만들기</string>
- <string name="actionbar_search">검색</string>
+ <string name="actionbar_open_with">로 열기</string>
+ <string name="actionbar_mkdir">새 폴더</string>
<string name="actionbar_settings">설정</string>
+ <string name="actionbar_see_details">세부내용</string>
+ <string name="actionbar_send_file">보내기</string>
<string name="prefs_category_general">일반</string>
- <string name="prefs_category_trackmydevice">장치 추적</string>
- <string name="prefs_add_session">새 세션 추가</string>
- <string name="prefs_create_img_thumbnails">미리 보기 그림 만들기</string>
- <string name="prefs_select_oc_account">계정 선택</string>
- <string name="prefs_summary_select_oc_account">이 앱에서 사용할 계정을 선택하십시오.</string>
- <string name="prefs_trackmydevice">장치 추적</string>
- <string name="prefs_trackmydevice_summary_off">ownCloud에서 현재 위치 추적하기</string>
- <string name="prefs_trackmydevice_summary_on">이 앱에서 장치 위치를 추적합니다</string>
- <string name="prefs_trackmydevice_interval">업데이트 주기</string>
- <string name="prefs_trackmydevice_interval_summary">%1$s분마다 업데이트</string>
+ <string name="prefs_category_more">더 중요함</string>
<string name="prefs_accounts">계정</string>
<string name="prefs_manage_accounts">계정 관리</string>
<string name="prefs_pincode">앱 암호</string>
<string name="prefs_pincode_summary">내 클라이언트 보호</string>
<string name="prefs_instant_upload">자동 업로드 사용</string>
<string name="prefs_instant_upload_summary">카메라로 촬영한 사진 자동 업로드</string>
- <string name="auth_host_url">URL</string>
+ <string name="prefs_log_title">로깅 허용</string>
+ <string name="prefs_log_summary">이건 로그 문제에 사용됩니다</string>
+ <string name="prefs_log_title_history">로그 기록</string>
+ <string name="prefs_log_summary_history">여기서 기록된 로그를 보여줍니다</string>
+ <string name="prefs_log_delete_history_button">역사 삭제하기</string>
+ <string name="prefs_help">도움말</string>
+ <string name="prefs_recommend">친구들에게 권하기</string>
+ <string name="prefs_feedback">피드백</string>
+ <string name="prefs_imprint">임프린트</string>
+ <string name="recommend_subject">%1$s 을 스마트폰에서 사용해보세요!</string>
+ <string name="auth_check_server">서버 확인</string>
+ <string name="auth_host_url">서버 주소 https://…</string>
<string name="auth_username">사용자 이름</string>
<string name="auth_password">암호</string>
- <string name="auth_register">%1$s의 새로운 사용자입니다</string>
- <string name="new_session_uri_error">잘못된 주소를 입력하였습니다</string>
- <string name="new_session_session_name_error">세션 이름이 잘못되었습니다</string>
+ <string name="auth_register">%1$s의 새로운 사용자입니까?</string>
<string name="sync_string_files">파일</string>
- <string name="uploader_no_file_selected">업로드할 파일이 선택되지 않았습니다</string>
- <string name="setup_hint_username">사용자 이름</string>
- <string name="setup_hint_password">암호</string>
- <string name="setup_hint_address">웹 주소</string>
- <string name="setup_hint_show_password">암호 보이기</string>
- <string name="setup_title">내 %1$s에 접속</string>
<string name="setup_btn_connect">접속</string>
<string name="uploader_btn_upload_text">업로드</string>
<string name="uploader_wrn_no_account_title">계정 없음</string>
<string name="uploader_wrn_no_content_text">받은 콘텐츠가 없습니다. 업로드할 항목이 없습니다.</string>
<string name="uploader_error_forbidden_content">%1$s에서 공유된 콘텐츠에 접근할 수 없습니다</string>
<string name="uploader_info_uploading">업로드 중</string>
- <string name="uploader_btn_create_dir_text">업로드할 디렉터리 만들기</string>
<string name="file_list_empty">이 폴더에 파일이 없습니다.\n메뉴 옵션의 \"업로드\" 항목을 사용하여 새 파일을 업로드할 수 있습니다.</string>
<string name="filedetails_select_file">파일을 누르면 추가 정보가 표시됩니다.</string>
<string name="filedetails_size">크기:</string>
<string name="filedetails_created">만든 날짜:</string>
<string name="filedetails_modified">수정한 날짜:</string>
<string name="filedetails_download">다운로드</string>
- <string name="filedetails_sync_file">새로 고침</string>
- <string name="filedetails_redownload">다시 다운로드</string>
- <string name="filedetails_open">열기</string>
+ <string name="filedetails_sync_file">파일 새로고침</string>
<string name="filedetails_renamed_in_upload_msg">업로드 중 파일 이름을 %1$s(으)로 변경하였습니다</string>
+ <string name="action_share_file">링크 공유</string>
<string name="common_yes">예</string>
<string name="common_no">아니요</string>
<string name="common_ok">확인</string>
<string name="common_cancel_upload">업로드 취소</string>
<string name="common_cancel">취소</string>
<string name="common_save_exit">저장하고 끝내기</string>
- <string name="common_exit">%1$s 떠나기</string>
<string name="common_error">오류</string>
+ <string name="common_loading">불러오는 중...</string>
+ <string name="common_error_unknown">알수없는 오류</string>
<string name="about_title">정보</string>
+ <string name="change_password">암호 변경</string>
<string name="delete_account">계정 삭제</string>
<string name="create_account">계정 만들기</string>
<string name="upload_chooser_title">다음에서 업로드...</string>
- <string name="uploader_info_dirname">디렉터리 이름</string>
+ <string name="uploader_info_dirname">폴더 이름</string>
<string name="uploader_upload_in_progress_ticker">업로드 중...</string>
<string name="uploader_upload_in_progress_content">%1$d%% %2$s 업로드 중</string>
<string name="uploader_upload_succeeded_ticker">업로드 성공</string>
<string name="uploader_upload_succeeded_content_single">%1$s을(를) 업로드하였습니다</string>
- <string name="uploader_upload_succeeded_content_multiple">파일 %1$d개를 업로드하였습니다</string>
<string name="uploader_upload_failed_ticker">업로드 실패</string>
<string name="uploader_upload_failed_content_single">%1$s을(를) 업로드할 수 없었습니다</string>
- <string name="uploader_upload_failed_content_multiple">업로드 실패: 파일 %2$d개 중 %1$d개를 업로드하였습니다</string>
<string name="downloader_download_in_progress_ticker">다운로드 중...</string>
<string name="downloader_download_in_progress_content">%1$d%% %2$s 다운로드 중</string>
<string name="downloader_download_succeeded_ticker">다운로드 성공</string>
<string name="downloader_download_succeeded_content">%1$s을(를) 다운로드하였습니다</string>
<string name="downloader_download_failed_ticker">다운로드 실패</string>
<string name="downloader_download_failed_content">%1$s을(를) 다운로드할 수 없었습니다</string>
+ <string name="downloader_not_downloaded_yet">아직 다운로드 되지 않았습니다</string>
<string name="common_choose_account">계정 선택</string>
- <string name="sync_string_contacts">연락처</string>
<string name="sync_fail_ticker">동기화 실패</string>
<string name="sync_fail_content">%1$s와(과) 동기화할 수 없었습니다</string>
+ <string name="sync_fail_content_unauthorized">%1$s에 대한 비밀번호가 틀립니다</string>
<string name="sync_conflicts_in_favourites_ticker">충돌하는 항목 발견됨</string>
<string name="sync_conflicts_in_favourites_content">동기화된 파일 중 %1$d개를 동기화할 수 없었습니다</string>
<string name="sync_fail_in_favourites_ticker">파일을 동기화할 수 없었습니다</string>
<string name="sync_fail_in_favourites_content">파일 %1$d개의 내용을 동기화할 수 없었습니다 (충돌 %2$d개)</string>
- <string name="use_ssl">암호화된 연결 사용</string>
- <string name="location_no_provider">%1$s에서 장치 위치를 추적할 수 없습니다. 위치 설정을 확인하십시오.</string>
+ <string name="sync_foreign_files_forgotten_ticker">몇몇 로컬 파일이 사라졌습니다.</string>
+ <string name="sync_current_folder_was_removed">%1$s 폴더가 존재하지 않습니다.</string>
+ <string name="foreign_files_move">모두 옮김</string>
+ <string name="foreign_files_success">모든 파일 옮김</string>
+ <string name="foreign_files_fail">몇몇 파일을 옮기지 못했습니다.</string>
+ <string name="foreign_files_local_text">로컬: %1$s</string>
+ <string name="foreign_files_remote_text">원격: %1$s</string>
+ <string name="upload_query_move_foreign_files">선택한 파일을 %1$s폴더에 넣기에는 공간이 충분하지 않습니다. 다른곳으로 옮기시겠습니까?</string>
<string name="pincode_enter_pin_code">앱 암호를 입력하십시오</string>
- <string name="pincode_enter_new_pin_code">새 앱 암호를 입력하십시오</string>
<string name="pincode_configure_your_pin">앱 암호를 입력하십시오</string>
<string name="pincode_configure_your_pin_explanation">앱을 시작할 때마다 암호를 물어봅니다</string>
<string name="pincode_reenter_your_pincode">앱 암호를 다시 입력하십시오</string>
<string name="pincode_wrong">앱 암호가 잘못되었습니다</string>
<string name="pincode_removed">앱 암호가 삭제되었습니다</string>
<string name="pincode_stored">앱 암호가 저장되었습니다</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15분</item>
- <item>30분</item>
- <item>60분</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="media_notif_ticker">%1$s 음악 재생기</string>
+ <string name="media_state_playing">%1$s (재생중)</string>
+ <string name="media_state_loading">%1$s (불러오는 중)</string>
+ <string name="media_event_done">%1$s 재생 완료됨</string>
+ <string name="media_err_nothing_to_play">미디어 파일을 찾을수 없습니다</string>
+ <string name="media_err_no_account">준비된 계정이 없습니다</string>
+ <string name="media_err_not_in_owncloud">유효한 계정의 파일이 아닙니다</string>
+ <string name="media_err_unsupported">지원하지 않는 미디어 코덱</string>
+ <string name="media_err_io">미디어 파일을 읽을수 </string>
+ <string name="media_err_malformed">미디어 파일이 제대로 인코드 되지 않았습니다</string>
+ <string name="media_err_timeout">재생 시도 중 시간이 초과됨</string>
+ <string name="media_err_invalid_progressive_playback">미디어 파일을 스트리밍 할수 없습니다</string>
+ <string name="media_err_unknown">내장된 미디어 플레이어에서는 이 미디어 파일을 재생할수 없습니다</string>
+ <string name="media_err_security_ex">%1$s 를 재생하는 중에 보안오류가 발생함</string>
+ <string name="media_err_io_ex">%1$s 를 재생하는 중에 입력 에러가 발생함</string>
+ <string name="media_err_unexpected">%1$s 를 재생하던 중에 알수 없는 오류가 발생함</string>
+ <string name="media_rewind_description">되감기 버튼</string>
+ <string name="media_play_pause_description">재생 혹은 일시정지 버튼</string>
+ <string name="media_forward_description">빨리감기 버튼</string>
<string name="auth_trying_to_login">로그인 중...</string>
<string name="auth_no_net_conn_title">네트워크에 연결할 수 없습니다</string>
- <string name="auth_no_net_conn_message">네트워크 연결을 시도할 수 없습니다. 인터넷 연결을 확인하고 다시 시도하십시오.</string>
- <string name="auth_connect_anyway">그래도 접속하기</string>
<string name="auth_nossl_plain_ok_title">암호화된 연결을 사용할 수 없습니다.</string>
- <string name="auth_nossl_plain_ok_message">서버와 암호화된 통신을 시도할 수 없었습니다. 암호화되지 않은 연결을 사용할 수 있습니다. 그래도 접속하거나 취소할 수 있습니다.</string>
<string name="auth_connection_established">연결됨</string>
<string name="auth_testing_connection">연결 테스트 중...</string>
<string name="auth_not_configured_title">서버 설정이 잘못됨</string>
- <string name="auth_not_configured_message">서버 인스턴스가 잘못 설정된 것 같습니다. 서버 관리자에게 문의하십시오.</string>
+ <string name="auth_account_not_new">같은 사용자와 서버에 대한 계정이 이미 존재합니다</string>
+ <string name="auth_account_not_the_same">입력된 사용자가 이 계정의 사용자와 일치하지 않음</string>
<string name="auth_unknown_error_title">알 수 없는 오류가 발생하였습니다!</string>
- <string name="auth_unknown_error_message">알 수 없는 오류가 발생하였습니다. 지원 요청을 할 때 장치에 저장된 로그를 같이 업로드해 주십시오.</string>
<string name="auth_unknown_host_title">호스트를 찾을 수 없음</string>
- <string name="auth_unknown_host_message">입력한 호스트를 찾을 수 없습니다. 호스트 이름과 서버 상태를 확인한 후 다시 시도해 주십시오.</string>
<string name="auth_incorrect_path_title">서버 인스턴스를 찾을 수 없음</string>
- <string name="auth_incorrect_path_message">지정한 경로에서 서버 인스턴스를 찾을 수 없습니다. 경로를 확인하고 다시 시도해 주십시오.</string>
<string name="auth_timeout_title">서버 응답 시간이 초과되었습니다</string>
<string name="auth_incorrect_address_title">잘못된 URL</string>
<string name="auth_ssl_general_error_title">SSL 초기화 오류</string>
- <string name="auth_ssl_unverified_server_title">확인되지 않은 SSL 서버 인증서</string>
+ <string name="auth_ssl_unverified_server_title">SSL 서버의 신원을 확인할수 없습니다</string>
<string name="auth_bad_oc_version_title">확인할 수 없는 서버 버전</string>
<string name="auth_wrong_connection_title">연결을 수립할 수 없음</string>
<string name="auth_secure_connection">암호화된 연결 사용 중</string>
- <string name="auth_login_details">로그인 정보</string>
<string name="auth_unauthorized">잘못된 로그인/암호</string>
- <string name="auth_not_found">경로가 잘못되었습니다</string>
- <string name="auth_internal">내부 서버 오류, 코드 %1$d</string>
- <string name="crashlog_message">프로그램이 예상치 못하게 종료되었습니다. 충돌 보고서를 전송하시겠습니까?</string>
- <string name="crashlog_send_report">보고서 보내기</string>
- <string name="crashlog_dont_send_report">보내지 않기</string>
- <string name="extensions_avail_title">확장 기능을 사용할 수 있습니다!</string>
- <string name="extensions_avail_message">현재 서버 인스턴스에서 확장 기능을 지원하는 것 같습니다. 안드로이드용 확장 기능을 검색해 보시겠습니까?</string>
+ <string name="auth_oauth_error">권한부여가 성공적으로 이뤄지지 않았습니다</string>
+ <string name="auth_oauth_error_access_denied">권한 서버로 부터 접근이 거부되었습니다</string>
+ <string name="auth_wtf_reenter_URL">뜻밖의 상태; 다시 서버 주소를 입력해주십시오</string>
+ <string name="auth_expired_oauth_token_toast">인증이 만료되었습니다. 다시 인증해주세요</string>
+ <string name="auth_expired_basic_auth_toast">현재 암호를 </string>
+ <string name="auth_expired_saml_sso_token_toast">세션이 만료되었습니다. 다시 접속해주세요</string>
+ <string name="auth_connecting_auth_server">인증 서버에 접속하는 중...</string>
+ <string name="auth_unsupported_auth_method">서버에서 이 인증 방법을 지원하지 않습니다.</string>
+ <string name="auth_unsupported_multiaccount">%1$s 에서는 다중 계정을 지원하지 않습니다</string>
<string name="fd_keep_in_sync">파일을 최신 정보로 유지</string>
- <string name="common_share">공유</string>
<string name="common_rename">이름 바꾸기</string>
<string name="common_remove">삭제</string>
<string name="confirmation_remove_alert">%1$s을(를) 삭제하시겠습니까?</string>
<string name="rename_server_fail_msg">이름을 변경할 수 없었습니다</string>
<string name="sync_file_fail_msg">원격 파일을 확인할 수 없었습니다</string>
<string name="sync_file_nothing_to_do_msg">파일 내용이 이미 동기화되었습니다</string>
- <string name="create_dir_fail_msg">디렉터리를 만들 수 없었습니다</string>
+ <string name="filename_forbidden_characters">사용할수 없는 문자들: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">잠시 기다려 주십시오</string>
<string name="filedisplay_unexpected_bad_get_content">예상하지 못한 오류입니다. 다른 앱에서 파일을 선택하십시오</string>
<string name="filedisplay_no_file_selected">선택한 파일 없음</string>
- <string name="ssl_validator_title">경고</string>
+ <string name="oauth_check_onoff">oAuth2로 로그인하기</string>
+ <string name="oauth_login_connection">oAuth2 서버에 연결중...</string>
<string name="ssl_validator_header">사이트 인증서를 확인할 수 없었습니다</string>
<string name="ssl_validator_reason_cert_not_trusted">- 서버 인증서를 신뢰할 수 없습니다</string>
<string name="ssl_validator_reason_cert_expired">- 서버 인증서가 만료되었습니다</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- 서버 인증서의 유효 기간이 시작되지 않았습니다</string>
<string name="ssl_validator_reason_hostname_not_verified">- 인증서의 URL과 입력한 URL이 일치하지 않습니다</string>
- <string name="ssl_validator_certificate_not_available">서버 인증서를 가져올 수 없었습니다</string>
<string name="ssl_validator_question">이 인증서를 신뢰하시겠습니까?</string>
<string name="ssl_validator_not_saved">인증서를 저장할 수 없었습니다</string>
<string name="ssl_validator_btn_details_see">자세히</string>
<string name="ssl_validator_label_validity_to">끝:</string>
<string name="ssl_validator_label_signature">서명:</string>
<string name="ssl_validator_label_signature_algorithm">알고리즘:</string>
- <string name="text_placeholder">자리 비움자</string>
+ <string name="placeholder_sentence">이것은 플레이스홀더입니다</string>
+ <string name="placeholder_filename">placeholder.txt</string>
+ <string name="placeholder_filetype">PNG 그림</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">WiFi 사용 중일때만 사진 업로드</string>
<string name="instant_upload_path">/InstantUpload</string>
<string name="conflict_title">업데이트 충돌</string>
<string name="conflict_keep_both">모두 저장</string>
<string name="conflict_overwrite">덮어쓰기</string>
<string name="conflict_dont_upload">업로드하지 않음</string>
+ <string name="preview_image_description">그림 미리보기</string>
+ <string name="preview_image_error_unknown_format">이 그림을 볼수 없습니다</string>
+ <string name="actionbar_failed_instant_upload">자동 업로드가 실패했습니다</string>
+ <string name="failed_upload_headline_text">자동 업로드 실패함</string>
+ <string name="failed_upload_headline_hint">실패된 자동 업로드 전체 요약</string>
+ <string name="failed_upload_all_cb">전체 선택</string>
+ <string name="failed_upload_headline_retryall_btn">전체 선택 재시도</string>
+ <string name="failed_upload_headline_delete_all_btn">선택된 업로드 큐 전체 삭제</string>
+ <string name="failed_upload_retry_text">이미지 업로드 재시도:</string>
+ <string name="failed_upload_load_more_images">더 많은 사진 불러오기</string>
+ <string name="failed_upload_retry_do_nothing_text">현재 온라인이 아니셔서 자동 업로드를 할수 없습니다</string>
+ <string name="failed_upload_failure_text">실패 메시지:</string>
+ <string name="failed_upload_quota_exceeded_text">서버 설정을 확인해주세요, 아마 업로드 제한을 초과하셨을겁니다.</string>
+ <string name="activity_chooser_send_file_title">보내기</string>
+ <string name="copy_link">링크 복사</string>
+ <string name="clipboard_text_copied">클립보드로 복사됨</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="main_music">مۆسیقا</string>
- <string name="main_bookmarks">دڵخوازهکان</string>
- <string name="main_settings">دهستكاری</string>
<string name="actionbar_upload">بارکردن</string>
+ <string name="actionbar_upload_files">پهڕگەکان</string>
<string name="actionbar_settings">دهستكاری</string>
- <string name="auth_host_url">ناونیشانی بهستهر</string>
+ <string name="prefs_category_general">گشتی</string>
+ <string name="prefs_accounts">هەژمارەکان</string>
+ <string name="prefs_help">یارمەتی</string>
<string name="auth_username">ناوی بهکارهێنهر</string>
<string name="auth_password">وشەی تێپەربو</string>
- <string name="setup_hint_username">ناوی بهکارهێنهر</string>
- <string name="setup_hint_password">وشەی تێپەربو</string>
+ <string name="sync_string_files">پهڕگەکان</string>
+ <string name="setup_btn_connect">بەستنەوە</string>
<string name="uploader_btn_upload_text">بارکردن</string>
+ <string name="uploader_wrn_no_account_title">هیچ هەژمارێک نهدۆزرایهوه</string>
+ <string name="uploader_wrn_no_account_setup_btn_text">جێگیرکردن</string>
+ <string name="uploader_wrn_no_account_quit_btn_text">دەرچوون</string>
+ <string name="uploader_info_uploading">بارکردن</string>
+ <string name="filedetails_size">قەبارە:</string>
+ <string name="filedetails_type">جۆر:</string>
+ <string name="filedetails_created">درووستبووە:</string>
+ <string name="filedetails_modified">گۆردراو:</string>
<string name="filedetails_download">داگرتن</string>
- <string name="filedetails_open">کردنهوه</string>
+ <string name="common_yes">بەڵێ</string>
+ <string name="common_no">نەخێر</string>
+ <string name="common_ok">باشە</string>
+ <string name="common_cancel">لابردن</string>
+ <string name="common_save_exit">پاشکەوتکردن & دەرچوون</string>
<string name="common_error">ههڵه</string>
- <string name="ssl_validator_title">ئاگاداری</string>
+ <string name="uploader_info_dirname">ناوی بوخچه</string>
</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ownCloud Android client application
+
+ Copyright (C) 2012-2013 ownCloud Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2,
+ as published by the Free Software Foundation.
+
+ 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.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+-->
+<!-- Large screen, landscape orientation boolean values -->
+<resources>
+ <bool name="large_land_layout">true</bool>
+</resources>
\ No newline at end of file
+++ /dev/null
-<!-- Large screen boolean values -->
-<resources>
- <bool name="large_layout">true</bool>
-</resources>
\ No newline at end of file
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Passwuert:</string>
- <string name="main_login">Benotzernumm:</string>
- <string name="main_button_login">Login</string>
- <string name="main_files">Dateien</string>
- <string name="main_music">Musek</string>
- <string name="main_contacts">Kontakter</string>
- <string name="main_calendar">Kalenner</string>
- <string name="main_bookmarks">Bookmarks</string>
- <string name="main_settings">Astellungen</string>
- <string name="main_tit_accsetup">Account erstellen</string>
+ <string name="about_version">Versioun %1$s</string>
<string name="actionbar_upload">Eroplueden</string>
<string name="actionbar_upload_files">Dateien</string>
- <string name="actionbar_mkdir">Dossier erstellen</string>
- <string name="actionbar_search">Sichen</string>
+ <string name="actionbar_open_with">Opmaachen mat</string>
<string name="actionbar_settings">Astellungen</string>
+ <string name="actionbar_see_details">Detailer</string>
+ <string name="actionbar_send_file">Schécken</string>
<string name="prefs_category_general">Allgemeng</string>
- <string name="prefs_add_session">Nei Sessioun bäisetzen</string>
- <string name="prefs_select_oc_account">Account auswielen</string>
+ <string name="prefs_category_more">Méi</string>
<string name="prefs_accounts">Accounten</string>
+ <string name="prefs_pincode">App PIN</string>
+ <string name="prefs_help">Hëllef</string>
+ <string name="prefs_feedback">Feedback</string>
<string name="auth_username">Benotzernumm</string>
<string name="auth_password">Passwuert</string>
<string name="sync_string_files">Dateien</string>
- <string name="setup_hint_username">Benotzernumm</string>
- <string name="setup_hint_password">Passwuert</string>
- <string name="setup_hint_show_password">Passwuert uweisen?</string>
<string name="setup_btn_connect">Verbannen</string>
<string name="uploader_btn_upload_text">Eroplueden</string>
<string name="uploader_wrn_no_account_title">Keen Account fonnt</string>
<string name="uploader_wrn_no_account_setup_btn_text">Setup</string>
<string name="uploader_wrn_no_account_quit_btn_text">Erausgoen</string>
+ <string name="uploader_info_uploading">Eroplueden</string>
<string name="filedetails_size">Gréisst:</string>
<string name="filedetails_type">Typ:</string>
<string name="filedetails_created">Erstallt:</string>
<string name="filedetails_modified">Geännert:</string>
<string name="filedetails_download">Download</string>
- <string name="filedetails_open">Opmaachen</string>
+ <string name="action_share_file">Link deelen</string>
<string name="common_yes">Jo</string>
<string name="common_no">Nee</string>
<string name="common_ok">OK</string>
<string name="common_cancel_upload">Upload ofbriechen</string>
<string name="common_cancel">Ofbriechen</string>
+ <string name="common_save_exit">Späicher & géi raus</string>
<string name="common_error">Fehler</string>
- <string name="sync_string_contacts">Kontakter</string>
- <string name="common_share">Deelen</string>
- <string name="ssl_validator_title">Warnung</string>
+ <string name="common_error_unknown">Et ass en onbekannte Fehler opgetrueden</string>
+ <string name="about_title">Iwwer</string>
+ <string name="change_password">Passwuert änneren</string>
+ <string name="delete_account">Account läschen</string>
+ <string name="create_account">Account erstellen</string>
+ <string name="uploader_info_dirname">Dossiers Numm:</string>
+ <string name="uploader_upload_in_progress_ticker">Gett eropgelueden ...</string>
+ <string name="uploader_upload_succeeded_ticker">Eroplueden färdeg</string>
+ <string name="uploader_upload_failed_ticker">Eroplueden huet net geklappt</string>
+ <string name="downloader_download_failed_ticker">Eroflueden huet net geklappt</string>
+ <string name="common_choose_account">Wiel en Account aus</string>
+ <string name="foreign_files_move">Alles bewegen</string>
+ <string name="pincode_enter_pin_code">Gëff w.e.g. däin App PIN an</string>
+ <string name="pincode_configure_your_pin">Gëff däin App PIN an</string>
+ <string name="pincode_reenter_your_pincode">Gëff däin App PIN w.e.g. nei an</string>
+ <string name="pincode_remove_your_pincode">Huel däin App PIN raus</string>
+ <string name="pincode_wrong">Ongültegen App PIN</string>
+ <string name="pincode_removed">App PIN geläscht</string>
+ <string name="pincode_stored">App PIN gespaichert</string>
+ <string name="auth_no_net_conn_title">Keng Netzwierk Verbindung</string>
+ <string name="auth_nossl_plain_ok_title">Keng geséchert Verbindung verfügbar.</string>
+ <string name="auth_connection_established">Verbindung hiergestallt</string>
+ <string name="auth_not_configured_title">Ongülteg Server Konfiguratioun</string>
+ <string name="auth_unknown_error_title">Et ass en onbekannte Fehler opgetrueden!</string>
+ <string name="auth_incorrect_path_title">Server Instanz net fonnt</string>
+ <string name="common_rename">Ëm-benennen</string>
+ <string name="common_remove">Läschen</string>
+ <string name="confirmation_remove_local">Nemmen Lokal</string>
+ <string name="confirmation_remove_remote">Vum Server läschen</string>
+ <string name="ssl_validator_btn_details_see">Detailer</string>
+ <string name="ssl_validator_btn_details_hide">Verstoppen</string>
+ <string name="ssl_validator_label_C">Land:</string>
+ <string name="ssl_validator_label_ST">Staat:</string>
+ <string name="ssl_validator_label_L">Uert:</string>
+ <string name="ssl_validator_label_validity">Gültegkeet:</string>
+ <string name="ssl_validator_label_validity_from">Vun:</string>
+ <string name="ssl_validator_label_validity_to">Fir:</string>
+ <string name="ssl_validator_label_signature">Signatur:</string>
+ <string name="placeholder_filetype">PNG Bild</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23</string>
+ <string name="placeholder_media_time">12:23:45</string>
+ <string name="conflict_keep_both">Béid halen</string>
+ <string name="conflict_overwrite">Iwwerschreiwen</string>
+ <string name="conflict_dont_upload">Net eroplueden</string>
+ <string name="failed_upload_all_cb">all auswielen</string>
+ <string name="failed_upload_failure_text">Fehler Message:</string>
+ <string name="activity_chooser_send_file_title">Schécken</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Slaptažodis:</string>
- <string name="main_login">Prisijungimo vardas:</string>
- <string name="main_button_login">Prisijungti</string>
- <string name="main_welcome">Sveiki prisijungę prie savo OwnCloud</string>
- <string name="main_files">Failai</string>
- <string name="main_music">Muzika</string>
- <string name="main_contacts">Kontaktai</string>
- <string name="main_calendar">Kalendorius</string>
- <string name="main_bookmarks">Žymekliai</string>
- <string name="main_settings">Nustatymai</string>
- <string name="main_tit_accsetup">Nustatyti paskyrą</string>
- <string name="main_wrn_accsetup">Jūsų prietaise nėra nė vienos ownCloud paskyros. Kad galėtumėte naudoti šią programą, turite sukurti paskyrą.</string>
- <string name="actionbar_sync">Atnaujinti</string>
+ <string name="about_android">%1$s Android programėlė</string>
+ <string name="about_version">versija %1$s</string>
+ <string name="actionbar_sync">Atnaujinti paskyrą</string>
<string name="actionbar_upload">Įkelti</string>
<string name="actionbar_upload_from_apps">Turinys iš kitų programų</string>
<string name="actionbar_upload_files">Failai</string>
- <string name="actionbar_mkdir">Kurti aplanką</string>
- <string name="actionbar_search">Paieška</string>
+ <string name="actionbar_open_with">Atverti naudojant</string>
+ <string name="actionbar_mkdir">Naujas aplankas</string>
<string name="actionbar_settings">Nustatymai</string>
- <string name="prefs_add_session">Pridėti naują sesiją</string>
- <string name="prefs_create_img_thumbnails">Sukurti paveikslėlių miniatiūras</string>
- <string name="prefs_select_oc_account">Pasirinkite paskyrą</string>
- <string name="prefs_summary_select_oc_account">Pasirinkite kurias jūsų paskyras programa turėtų naudoti.</string>
- <string name="prefs_trackmydevice_interval">Atnaujinimo intervalas</string>
+ <string name="actionbar_see_details">Informacija</string>
+ <string name="actionbar_send_file">Siųsti</string>
+ <string name="prefs_category_general">Bendras</string>
+ <string name="prefs_category_more">Daugiau</string>
<string name="prefs_accounts">Paskyros</string>
<string name="prefs_manage_accounts">Tvarkyti paskyras</string>
- <string name="prefs_pincode">ownCloud programos PIN kodas</string>
- <string name="prefs_pincode_summary">Apsaugokite savo ownCloud klientą</string>
+ <string name="prefs_pincode">App programos PIN kodas</string>
+ <string name="prefs_pincode_summary">Apsaugokite savo klientą</string>
+ <string name="prefs_instant_upload">Įjungti momentinius įkėlimus</string>
<string name="prefs_instant_upload_summary">Iš karto nusiųsti nufotografuotas nuotraukas</string>
- <string name="auth_host_url">ownCloud URL</string>
+ <string name="prefs_log_title">Įjungti žurnalo rašymą</string>
+ <string name="prefs_log_summary">Tai naudojama problemų žurnalo vedimui</string>
+ <string name="prefs_log_title_history">Žurnalų istorija</string>
+ <string name="prefs_log_summary_history">Čia rodomi įrašyti žurnalai</string>
+ <string name="prefs_log_delete_history_button">Ištrinti Istoriją</string>
+ <string name="prefs_help">Pagalba</string>
+ <string name="prefs_recommend">Rekomenduoti draugui</string>
+ <string name="prefs_feedback">Atsiliepimai</string>
+ <string name="prefs_imprint">Imprint</string>
+ <string name="recommend_subject">Išbandykite %1$s savo išmaniajame telefone!</string>
+ <string name="auth_check_server">Patikrinti Serverį</string>
+ <string name="auth_host_url">Serverio adresas </string>
<string name="auth_username">Prisijungimo vardas</string>
<string name="auth_password">Slaptažodis</string>
- <string name="new_session_uri_error">Neteisingas URL</string>
- <string name="new_session_session_name_error">Neteisingas sesijos pavadinimas</string>
<string name="sync_string_files">Failai</string>
- <string name="uploader_no_file_selected">Nusiuntimui nepasirinktas joks failas</string>
- <string name="setup_hint_username">Prisijungimo vardas</string>
- <string name="setup_hint_password">Slaptažodis</string>
- <string name="setup_hint_address">Web adresas</string>
- <string name="setup_hint_show_password">Rodyti slaptažodį?</string>
- <string name="setup_title">Prisijunkite prie savo ownCloud</string>
<string name="setup_btn_connect">Prisijungti</string>
<string name="uploader_btn_upload_text">Įkelti</string>
<string name="uploader_wrn_no_account_title">Paskyrų nerasta</string>
+ <string name="uploader_wrn_no_account_text">Jūsų įrenginyje nėra nė vienos %1$s paskyros. Prašome pirmiausia susikurti paskyrą.</string>
+ <string name="uploader_wrn_no_account_setup_btn_text">Nustatymai</string>
<string name="uploader_wrn_no_account_quit_btn_text">Išeiti</string>
+ <string name="uploader_wrn_no_content_title">Nėra įkeltino turinio</string>
+ <string name="uploader_wrn_no_content_text">nebuvo gauta turinio. Nėra įkeltino turinio</string>
+ <string name="uploader_error_forbidden_content">%1$s neleidžiama prieiti prie turinio, kuriuo dalijamasi</string>
<string name="uploader_info_uploading">Išsiunčiama</string>
- <string name="uploader_btn_create_dir_text">Kurti aplanką išsiuntimui</string>
+ <string name="file_list_empty">Šiame aplanke failų nėra.\nNauji failai gali būti pridėti naudojant \"Įkelti\" funkciją meniu.</string>
+ <string name="filedetails_select_file">Palieskite failą, kad parodyti papildomą informaciją.</string>
<string name="filedetails_size">Dydis:</string>
<string name="filedetails_type">Tipas:</string>
<string name="filedetails_created">Sukurta:</string>
<string name="filedetails_modified">Modifikuota:</string>
<string name="filedetails_download">Atsisiųsti</string>
- <string name="filedetails_sync_file">Atnaujinti</string>
- <string name="filedetails_redownload">Atnaujinti</string>
- <string name="filedetails_open">Atidaryti</string>
+ <string name="filedetails_sync_file">Atnaujinti failą</string>
+ <string name="filedetails_renamed_in_upload_msg">Įkėlimo metu failas buvo pervadintas į %1$s</string>
+ <string name="action_share_file">Dalintis nuoroda</string>
<string name="common_yes">Taip</string>
<string name="common_no">Ne</string>
<string name="common_ok">Gerai</string>
+ <string name="common_cancel_download">Atšaukti parsiuntimą</string>
<string name="common_cancel_upload">Atšaukti siuntimą</string>
<string name="common_cancel">Atšaukti</string>
+ <string name="common_save_exit">Išsaugoti ir Išeiti</string>
<string name="common_error">Klaida</string>
+ <string name="common_loading">Įkeliama...</string>
+ <string name="common_error_unknown">Neatpažinta klaida</string>
<string name="about_title">Apie</string>
+ <string name="change_password">Pakeisti slaptažodį</string>
<string name="delete_account">Ištrinti paskyrą</string>
<string name="create_account">Sukurti paskyrą</string>
<string name="upload_chooser_title">Įkelti iš ...</string>
- <string name="uploader_info_dirname">Aplanko pavadinimas</string>
+ <string name="uploader_info_dirname">Katalogo pavadinimas</string>
<string name="uploader_upload_in_progress_ticker">Įkeliama ...</string>
+ <string name="uploader_upload_in_progress_content">%1$d%% Siunčiama %2$s</string>
+ <string name="uploader_upload_succeeded_ticker">Nusiuntimas pavyko</string>
+ <string name="uploader_upload_succeeded_content_single">%1$s buvo sėkmingai nusiųstas</string>
<string name="uploader_upload_failed_ticker">Nusiuntimas nepavyko</string>
+ <string name="uploader_upload_failed_content_single">Nepavyko baigti %1$s nusiuntimo</string>
<string name="downloader_download_in_progress_ticker">Atsiunčiama...</string>
+ <string name="downloader_download_in_progress_content">%1$d%% Atsiunčiama %2$s</string>
<string name="downloader_download_succeeded_ticker">Atsiuntimas pavyko</string>
+ <string name="downloader_download_succeeded_content">%1$s buvo sėkmingai atsiųstas</string>
<string name="downloader_download_failed_ticker">Atsiuntimas nepavyko</string>
+ <string name="downloader_download_failed_content">Nepavyko baigti %1$s atsiuntimo</string>
+ <string name="downloader_not_downloaded_yet">Dar neatsiųsta</string>
<string name="common_choose_account">Pasirinkite paskyrą</string>
- <string name="sync_string_contacts">Kontaktai</string>
<string name="sync_fail_ticker">Sinchronizacija nepavyko</string>
- <string name="use_ssl">Naudoti saugų prisijungimą</string>
- <string name="location_no_provider">ownCloud negali sekti jūsų prietaiso. Patinkrinkite vietos nustatymo paslaugas</string>
+ <string name="sync_fail_content">%1$s sinchronizacija nepavyko</string>
+ <string name="sync_fail_content_unauthorized">Netinkamas slaptažodis %1$s</string>
+ <string name="sync_conflicts_in_favourites_ticker">Rastas konfliktas</string>
+ <string name="sync_fail_in_favourites_content">Nepavyko sinchronizuoti %1$d failų turinio (%2$d konfliktų)</string>
+ <string name="sync_foreign_files_forgotten_ticker">Keli vietiniai failai buvo užmiršti</string>
+ <string name="sync_current_folder_was_removed">Aplankas %1$s nebeegzistuoja</string>
+ <string name="foreign_files_move">Perkelti visus</string>
+ <string name="foreign_files_success">Visi failai buvo perkelti</string>
+ <string name="foreign_files_fail">Kai kurių failų negalima perkelti</string>
+ <string name="foreign_files_local_text">Vietinis: %1$s</string>
+ <string name="foreign_files_remote_text">Nuotolinis: %1$s</string>
<string name="pincode_enter_pin_code">Prašome įvesti savo programos PIN kodą</string>
- <string name="pincode_enter_new_pin_code">Prašome įvesti naują programos PIN kodą</string>
- <string name="pincode_configure_your_pin">Įveskite ownCloud programos PIN kodą</string>
+ <string name="pincode_configure_your_pin">Įveskite taikymas programos PIN kodą</string>
<string name="pincode_configure_your_pin_explanation">PIN bus prašomas kiekvieną kartą paleidus programą</string>
- <string name="pincode_reenter_your_pincode">Prašome pakartoti ownCloud PIN kodą</string>
- <string name="pincode_remove_your_pincode">Pašalinti ownCloud programos PIN kodą</string>
- <string name="pincode_mismatch">Abu ownCloud programos PIN kodai nesutampa</string>
- <string name="pincode_wrong">Neteisingas ownCloud programos PIN kodas</string>
- <string name="pincode_removed">ownCloud programos PIN kodas pašalintas</string>
- <string name="pincode_stored">ownCloud programos PIN kodas išsaugotas</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 Minučių</item>
- <item>30 Minučių</item>
- <item>60 Minučių</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_reenter_your_pincode">Prašome pakartoti taikymas PIN kodą</string>
+ <string name="pincode_remove_your_pincode">Pašalinti taikymas programos PIN kodą</string>
+ <string name="pincode_mismatch">Abu taikymas programos PIN kodai nesutampa</string>
+ <string name="pincode_wrong">Neteisingas taikymas programos PIN kodas</string>
+ <string name="pincode_removed">Taikymas programos PIN kodas pašalintas</string>
+ <string name="pincode_stored">Taikymas programos PIN kodas išsaugotas</string>
+ <string name="media_notif_ticker">%1$s muzikos grotuvas</string>
+ <string name="media_state_playing">%1$s (grojama)</string>
+ <string name="media_state_loading">%1$s (įkeliama)</string>
+ <string name="media_event_done">%1$s sąrašas baigtas</string>
+ <string name="media_err_nothing_to_play">Nerasta medija failų</string>
+ <string name="media_err_no_account">Nenurodyta paskyra</string>
+ <string name="media_err_not_in_owncloud">Failas yra netinkamoje sąskaitoje</string>
+ <string name="media_err_unsupported">Nepalaikomas kodekas</string>
+ <string name="media_err_io">Nenuskaitomas medijos failas</string>
+ <string name="media_err_malformed">Netinkamai užkoduotas medijos failas</string>
+ <string name="media_err_timeout">Baigėsi laukimo laikas bandant paleisti</string>
+ <string name="media_err_invalid_progressive_playback">Medijos failas negali būti transliuojamas</string>
+ <string name="media_err_unknown">Medijos failas negali būti atkurtas naudojant gamyklinį grotuvą</string>
+ <string name="media_err_security_ex">Saugumo klaida bandant paleisti %1$s</string>
+ <string name="media_err_io_ex">Įvesties klaida bandant paleisti %1$s</string>
+ <string name="media_err_unexpected">Netikėta klaida bandant paleisti %1$s</string>
+ <string name="media_play_pause_description">Grojimo arba pauzės mygtukas</string>
<string name="auth_trying_to_login">Bandoma prisijungti...</string>
<string name="auth_no_net_conn_title">Nėra tinklo ryšio</string>
- <string name="auth_connect_anyway">Vis tiek prisijungti</string>
<string name="auth_nossl_plain_ok_title">Saugus prisijungimas negalimas.</string>
<string name="auth_connection_established">Ryšys užmegztas</string>
<string name="auth_testing_connection">Išbandomas prisijungimas...</string>
- <string name="auth_not_configured_title">Sugadinta ownCloud konfigūracija</string>
+ <string name="auth_not_configured_title">Sugadinta serverio konfigūracija</string>
+ <string name="auth_account_not_new">To paties vartotojo ir serverio paskyra jau egzistuoja šiame įrenginyje</string>
<string name="auth_unknown_error_title">Įvyko nežinoma klaida!</string>
+ <string name="auth_unknown_host_title">Nepavyko rasti mazgo</string>
+ <string name="auth_incorrect_path_title">Šis serveris netinkamas</string>
<string name="auth_timeout_title">Serveris per ilgai neatsako</string>
<string name="auth_incorrect_address_title">URL adrese yra klaidų</string>
<string name="auth_ssl_general_error_title">Nepavyko aktyvuoti SSL</string>
- <string name="auth_bad_oc_version_title">Nežinoma ownCloud serverio versija</string>
+ <string name="auth_ssl_unverified_server_title">Nepatikrinta SSL serverio tapatybė</string>
+ <string name="auth_bad_oc_version_title">Nežinoma serverio versija</string>
<string name="auth_wrong_connection_title">Nepavyko užmegzti ryšio</string>
<string name="auth_secure_connection">Užmegztas saugus ryšys</string>
- <string name="auth_login_details">Prisijungimo duomenys</string>
- <string name="crashlog_message">Programa netikėtai sustojo. Ar norite nusiųsti šio lūžimo ataskaitą programos kūrėjams?</string>
- <string name="crashlog_send_report">Siųsti ataskaitą </string>
- <string name="crashlog_dont_send_report">Nesiųsti ataskaitos</string>
- <string name="extensions_avail_title">Yra naujų papildinių!</string>
- <string name="common_share">Dalintis</string>
+ <string name="auth_unauthorized">Neteisingas naudotojo vardas arba slaptažodis</string>
+ <string name="auth_oauth_error">Autorizacija nesėkminga</string>
+ <string name="auth_oauth_error_access_denied">Autorizacijos serveris draudžia priėjimą</string>
+ <string name="auth_wtf_reenter_URL">Netikėta būsena, prašome įvesti serverio URL dar kartą</string>
+ <string name="auth_expired_oauth_token_toast">Autorizacijos laikas baigėsi. Prašome autorizuotis iš naujo</string>
+ <string name="auth_expired_basic_auth_toast">Prašome įvesti dabartinį slaptažodį</string>
+ <string name="auth_expired_saml_sso_token_toast">Jūsų sesijos laikas baigėsi. Prašome prisijungti iš naujo</string>
+ <string name="auth_connecting_auth_server">Jungiamasi prie autentikacijos serverio...</string>
+ <string name="auth_unsupported_auth_method">Serveris nepalaiko šio autentikacijos metodo</string>
+ <string name="auth_unsupported_multiaccount">%1$s nepalaiko kelių paskyrų iš karto</string>
+ <string name="fd_keep_in_sync">Laikyti failą naujinamą</string>
<string name="common_rename">Pervadinti</string>
<string name="common_remove">Pašalinti</string>
+ <string name="confirmation_remove_alert">Ar tikrai norite pašalinti %1$s ?</string>
+ <string name="confirmation_remove_folder_alert">Ar tikrai norite pašalinti %1$s ir ten esantį turinį?</string>
+ <string name="confirmation_remove_local">Tik vietiniai</string>
+ <string name="confirmation_remove_folder_local">Tik vietinis turinys</string>
<string name="confirmation_remove_remote">Pašalinti iš serverio</string>
+ <string name="confirmation_remove_remote_and_local">Nutolę ir vietiniai</string>
<string name="remove_success_msg">Pašalinta sėkmingai</string>
<string name="remove_fail_msg">Pašalinti nepavyko</string>
+ <string name="rename_dialog_title">Įveskite naują pavadinimą</string>
<string name="rename_local_fail_msg">Lokalios kopijos pervadinti nepavyko, pabandykite kitą pavadinimą</string>
<string name="rename_server_fail_msg">Pervadinti nepavyko</string>
- <string name="create_dir_fail_msg">Aplanko sukurti nepavyko</string>
+ <string name="sync_file_fail_msg">Nutolę failai negalėjo būti patikrinti</string>
+ <string name="sync_file_nothing_to_do_msg">Failo turinys jau sunchronizuotas</string>
<string name="wait_a_moment">Truputį palaukite</string>
+ <string name="filedisplay_unexpected_bad_get_content">Netikėta problema ; prašome pasirinkti failą iš kitos programėlės</string>
<string name="filedisplay_no_file_selected">Joks failas nebuvo pasirinktas</string>
- <string name="ssl_validator_title">Įspėjimas</string>
+ <string name="activity_chooser_title">Siųsti nuorodą asmeniui ...</string>
+ <string name="oauth_check_onoff">Prisijungti naudojant oAuth2</string>
+ <string name="oauth_login_connection">Jungiamasi prie oAuth2 serverio...</string>
+ <string name="ssl_validator_header">Serverio tapatybė negali būti patikrinta</string>
<string name="ssl_validator_reason_cert_not_trusted">- Nepatikimas serverio sertifikatas</string>
<string name="ssl_validator_reason_cert_expired">- Serverio sertifikatas galiojimo laikas pasibaigęs</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- Serverio sertifikatas yra pernelyg naujas</string>
<string name="ssl_validator_reason_hostname_not_verified">- URL neatitinka adreso, kuris yra nurodytas sertifikate</string>
- <string name="ssl_validator_certificate_not_available">Negalima gauti serverio sertifikato</string>
<string name="ssl_validator_question">Ar vis tiek norite priimti šį sertifikatą?</string>
<string name="ssl_validator_not_saved">Sertifikatas negali būti išsaugotas</string>
+ <string name="ssl_validator_btn_details_see">Informacija</string>
+ <string name="ssl_validator_btn_details_hide">Slėpti</string>
+ <string name="ssl_validator_label_subject">Išduota kam:</string>
+ <string name="ssl_validator_label_issuer">Išdavė:</string>
+ <string name="ssl_validator_label_CN">Bendras pavadinimas:</string>
<string name="ssl_validator_label_O">Organizacija:</string>
<string name="ssl_validator_label_OU">Organizacijos padalinys:</string>
<string name="ssl_validator_label_C">Šalis:</string>
<string name="ssl_validator_label_validity_to">Iki:</string>
<string name="ssl_validator_label_signature">Parašas:</string>
<string name="ssl_validator_label_signature_algorithm">Algoritmas:</string>
+ <string name="placeholder_filetype">PNG paveikslėlis</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Įkelti nuotraukas tik kai prisijungiama per WiFi</string>
+ <string name="conflict_title">Atnaujinimo konfliktas</string>
+ <string name="conflict_message">Nutolęs failas %s nėra sinchronizuotas su vietiniu failu. Jei tęsite, failas serveryje bus pakeistas.</string>
<string name="conflict_keep_both">Palikti abu</string>
<string name="conflict_overwrite">Perrašyti</string>
<string name="conflict_dont_upload">Nebesiųsti</string>
+ <string name="preview_image_description">Paveikslėlio peržiūra</string>
+ <string name="preview_image_error_unknown_format">Neįmanoma parodyti paveikslėlio</string>
+ <string name="failed_upload_headline_text">Nepavykę momentiniai įkėlimai</string>
+ <string name="failed_upload_headline_hint">Suvestinė visų nepavykusių momentinių įkėlimų</string>
+ <string name="failed_upload_all_cb">pažymėti viską</string>
+ <string name="failed_upload_headline_retryall_btn">bandyti dar kartą su visais pažymėtais</string>
+ <string name="failed_upload_retry_text">bandyti iš naujo nusiųsti paveikslėlį:</string>
+ <string name="failed_upload_load_more_images">Įkelti daugiau Nuotraukų</string>
+ <string name="failed_upload_failure_text">Klaidos pranešimas:</string>
+ <string name="failed_upload_quota_exceeded_text">Patikrinkite savo serverio nustatymus, tikėtina jog viršijote savo limitą.</string>
+ <string name="activity_chooser_send_file_title">Siųsti</string>
+ <string name="copy_link">Kopijuoti nuorodą</string>
+ <string name="clipboard_text_copied">Nukopijuota į talpyklę</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Parole:</string>
- <string name="main_login">Lietotājvārds:</string>
- <string name="main_button_login">Ierakstīties</string>
- <string name="main_welcome">Laipni lūgti</string>
- <string name="main_files">Datnes</string>
- <string name="main_music">Mūzika</string>
- <string name="main_contacts">Kontakti</string>
- <string name="main_calendar">Kalendārs</string>
- <string name="main_bookmarks">Grāmatzīmes</string>
- <string name="main_settings">Iestatījumi</string>
- <string name="main_tit_accsetup">Iestatīt kontu</string>
- <string name="main_wrn_accsetup">Uz šīs ierīces nav iestatīta konta. Lai lietotu šo lietotni, tāds ir jāizveido.</string>
- <string name="about_message">%1$s Android lietotne\n\nversija: %2$s</string>
- <string name="actionbar_sync">Atsvaidzināt</string>
<string name="actionbar_upload">Augšupielādēt</string>
<string name="actionbar_upload_from_apps">Saturs no citām lietotnēm</string>
<string name="actionbar_upload_files">Datnes</string>
- <string name="actionbar_mkdir">Izveidot direktoriju</string>
- <string name="actionbar_search">Meklēt</string>
+ <string name="actionbar_mkdir">Jauna mape</string>
<string name="actionbar_settings">Iestatījumi</string>
+ <string name="actionbar_send_file">Sūtīt</string>
<string name="prefs_category_general">Vispārīgi</string>
- <string name="prefs_category_trackmydevice">Ierīces izsekošana</string>
- <string name="prefs_add_session">Pievienot jaunu sesiju</string>
- <string name="prefs_create_img_thumbnails">Izveidot attēlu sīktēlus</string>
- <string name="prefs_select_oc_account">Izvēlieties kontu</string>
- <string name="prefs_summary_select_oc_account">Izvēlieties, kuru no kontiem jūsu lietotnei vajadzētu izmantot</string>
- <string name="prefs_trackmydevice">Ierīču izsekošana</string>
- <string name="prefs_trackmydevice_summary_off">Aktivējiet šo lietotni, lai izsekotu savas ierīces atrašanās vietu</string>
- <string name="prefs_trackmydevice_summary_on">Šī lietotne izseko šo ierīci</string>
- <string name="prefs_trackmydevice_interval">Atjaunināšanas intervāls</string>
- <string name="prefs_trackmydevice_interval_summary">Atjaunināt katras %1$s minūtes</string>
+ <string name="prefs_category_more">Vairāk</string>
<string name="prefs_accounts">Konti</string>
<string name="prefs_manage_accounts">Pārvaldīt kontus</string>
<string name="prefs_pincode">Lietotnes PIN</string>
<string name="prefs_pincode_summary">Aizsargā savu klientu</string>
<string name="prefs_instant_upload">Aktivēt tūlītējo augšupielādēšanu</string>
<string name="prefs_instant_upload_summary">Nekavējoties augšupielādēt kameras uzņemtos attēlus</string>
- <string name="auth_host_url">URL</string>
+ <string name="prefs_help">Palīdzība</string>
<string name="auth_username">Lietotājvārds</string>
<string name="auth_password">Parole</string>
- <string name="auth_register">Esmu %1$s iesācējs</string>
- <string name="new_session_uri_error">Ir dota nepareiza adrese</string>
- <string name="new_session_session_name_error">Nepareizs sesijas nosaukums</string>
<string name="sync_string_files">Datnes</string>
- <string name="uploader_no_file_selected">Neviena datne nav izvēlēta augšupielādei</string>
- <string name="setup_hint_username">Lietotājvārds</string>
- <string name="setup_hint_password">Parole</string>
- <string name="setup_hint_address">Tīmekļa adrese</string>
- <string name="setup_hint_show_password">Rādīt paroli?</string>
- <string name="setup_title">Savienoties ar savu %1$s</string>
<string name="setup_btn_connect">Savienoties</string>
<string name="uploader_btn_upload_text">Augšupielādēt</string>
<string name="uploader_wrn_no_account_title">Nav atrastu kontu</string>
<string name="uploader_wrn_no_content_text">Nav saņemts nekāds saturs. Nav ko augšupielādēt.</string>
<string name="uploader_error_forbidden_content">%1$s nedrīkst piekļūt koplietotajam saturam</string>
<string name="uploader_info_uploading">Augšupielādē</string>
- <string name="uploader_btn_create_dir_text">Izveidot direktoriju augšupielādēšanai</string>
<string name="file_list_empty">Šajā mapē nav datņu.\nJaunas datnes var pievienot ar izvēlnes opciju “Augšupielādēt”</string>
<string name="filedetails_select_file">Uzsitiet uz datnes, lai redzētu papildinformāciju.</string>
<string name="filedetails_size">Izmērs:</string>
<string name="filedetails_created">Izveidota:</string>
<string name="filedetails_modified">Modificēta:</string>
<string name="filedetails_download">Lejupielādēt</string>
- <string name="filedetails_sync_file">Atsvaidzināt</string>
- <string name="filedetails_redownload">Atkārtoti lejupielādēt</string>
- <string name="filedetails_open">Atvērt</string>
<string name="filedetails_renamed_in_upload_msg">Datne tika pārsaukta uz %1$s augšupielādes laikā</string>
<string name="common_yes">Jā</string>
<string name="common_no">Nē</string>
<string name="common_cancel_upload">Atcelt augšupielādi</string>
<string name="common_cancel">Atcelt</string>
<string name="common_save_exit">Saglabāt un iziet</string>
- <string name="common_exit">Pamest %1$s</string>
<string name="common_error">Kļūda</string>
+ <string name="common_loading">Ielādē</string>
<string name="about_title">Par</string>
+ <string name="change_password">Mainīt paroli</string>
<string name="delete_account">Dzēst kontu</string>
<string name="create_account">Izveidot kontu</string>
<string name="upload_chooser_title">Augšupielādēt no...</string>
- <string name="uploader_info_dirname">Direktorijas nosaukums</string>
+ <string name="uploader_info_dirname">Mapes nosaukums</string>
<string name="uploader_upload_in_progress_ticker">Augšupielādē ...</string>
<string name="uploader_upload_in_progress_content">%1$d%% augšupielādē %2$s</string>
<string name="uploader_upload_succeeded_ticker">Augšupielāde ir veiksmīga</string>
<string name="uploader_upload_succeeded_content_single">%1$s tika veiksmīgi augšupielādēts</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d datnes tika veiksmīgi augšupielādētas</string>
<string name="uploader_upload_failed_ticker">Neizdevās augšupielādēt</string>
<string name="uploader_upload_failed_content_single">Nevarēja pabeigt %1$s augšupielādēšanu</string>
- <string name="uploader_upload_failed_content_multiple">Neizdevās augšupielādēt: tika augšupielādētas %1$d/%2$d datnes</string>
<string name="downloader_download_in_progress_ticker">Lejupielādē ...</string>
<string name="downloader_download_in_progress_content">%1$d%% lejupielādē %2$s</string>
<string name="downloader_download_succeeded_ticker">Lejupielāde beidzās veiksmīgi</string>
<string name="downloader_download_failed_ticker">Neizdevās lejupielādēt</string>
<string name="downloader_download_failed_content">Nevarēja pabeigt %1$s lejupielādēšanu</string>
<string name="common_choose_account">Izvēlieties kontu</string>
- <string name="sync_string_contacts">Kontakti</string>
<string name="sync_fail_ticker">Neizdevās sinhronizēties</string>
<string name="sync_fail_content">Nevarēja pabeigt %1$s sinhronizēšanu</string>
<string name="sync_conflicts_in_favourites_ticker">Ir atrasti konflikti</string>
<string name="sync_conflicts_in_favourites_content">Nevarēja sinhronizēt %1$d kept-in-sync datnes</string>
<string name="sync_fail_in_favourites_ticker">Kept-in-sync datnes cieta neveiksmi</string>
<string name="sync_fail_in_favourites_content">Nevarēja sinhronizēt %1$d datņu saturu (%2$d konflikti)</string>
- <string name="use_ssl">Lietot drošo savienojumu</string>
- <string name="location_no_provider">%1$s nevar izsekot šo ierīci. Lūdzu, pārbaudiet savus vietas iestatījumus</string>
<string name="pincode_enter_pin_code">Lūdzu, ierakstiet savu lietotnes PIN</string>
- <string name="pincode_enter_new_pin_code">Lūdzu, ierakstiet savu jauno lietotnes PIN</string>
<string name="pincode_configure_your_pin">Ievadiet savu lietotnes PIN</string>
<string name="pincode_configure_your_pin_explanation">PIN tiks pieprasīts katrā lietotnes palaišanas reizē</string>
<string name="pincode_reenter_your_pincode">Lūdzu, vēlreiz ievadiet savu lietotnes PIN</string>
<string name="pincode_wrong">Nepareizs lietotnes PIN</string>
<string name="pincode_removed">Lietotnes PIN ir izņemts</string>
<string name="pincode_stored">Lietotnes PIN ir noglabāts</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 minūtes</item>
- <item>30 minūtes</item>
- <item>60 minūtes</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
- <string name="auth_trying_to_login">Mēģina ierakstīties...</string>
<string name="auth_no_net_conn_title">Nav tīkla savienojumu</string>
- <string name="auth_no_net_conn_message">Nav atklātu tīkla savienojumu. Pārbaudiet interneta savienojumus un mēģiniet vēlreiz.</string>
- <string name="auth_connect_anyway">Tomēr savienoties</string>
<string name="auth_nossl_plain_ok_title">Nav pieejams drošs savienojums.</string>
- <string name="auth_nossl_plain_ok_message">Lietotne nevar izveidot drošu savienojumu ar serveri. Ir pieejams nedrošs savienojums. Jūs varat turpināt vai atcelt.</string>
<string name="auth_connection_established">Savienojums ir izveidots</string>
- <string name="auth_testing_connection">Testē savienojumu...</string>
<string name="auth_not_configured_title">Slikti formatēta servera konfigurācija</string>
- <string name="auth_not_configured_message">Izskatās, ka jūsu servera instance nav pareizi konfigurēta. Sazinieties ar servera administratoru, lai uzzinātu vairāk.</string>
<string name="auth_unknown_error_title">Gadījās nezināma kļūda!</string>
- <string name="auth_unknown_error_message">Gadījās nezināma kļūda. Lūdzu, sazinieties ar atbalstu un pievienojiet žurnālus no savas ierīces.</string>
<string name="auth_unknown_host_title">Nevarēja atrast datoru</string>
- <string name="auth_unknown_host_message">Nevarēja atrast ievadīto datoru. Lūdzu, pārliecinieties ka datora nosaukums ir ievadīts pareizi un ka serveris ir pieejams.</string>
<string name="auth_incorrect_path_title">Servera instance nav atrasta</string>
- <string name="auth_incorrect_path_message">Lietotne uz dotā ceļa nevarēja atrast servera instanci. Lūdzu, pārbaudiet ceļu un mēģiniet vēlreiz.</string>
<string name="auth_timeout_title">Serveris pārāk ilgi neatbildēja</string>
<string name="auth_incorrect_address_title">Slikti formatēts URL</string>
<string name="auth_ssl_general_error_title">Neizdevās inicializēt SSL</string>
- <string name="auth_ssl_unverified_server_title">Nepārbaudīta SSL servera identitāte</string>
<string name="auth_bad_oc_version_title">Neatpazīta servera versija</string>
<string name="auth_wrong_connection_title">Nevarēja izveidot savienojumu</string>
<string name="auth_secure_connection">Ir izveidots drošs savienojums</string>
- <string name="auth_login_details">Sīkāka informācija par ierakstīšanos</string>
- <string name="auth_unauthorized">Nederīgs lietotājvārds/parole</string>
- <string name="auth_not_found">Dots nepareizs ceļš</string>
- <string name="auth_internal">Iekšējā servera kļūda, kods %1$d</string>
- <string name="crashlog_message">Lietotne negaidīti beidza darbu. Vai vēlaties iesniegt kļūdas ziņojumu?</string>
- <string name="crashlog_send_report">Sūtīt ziņojumu</string>
- <string name="crashlog_dont_send_report">Nesūtīt ziņojumu</string>
- <string name="extensions_avail_title">Ir pieejams paplašinājums!</string>
- <string name="extensions_avail_message">Izskatās, ka jūsu servera instance atbalsta papildu paplašinājumus. Vai vēlaties redzēt paplašinājumus, kas ir pieejami uz android?</string>
<string name="fd_keep_in_sync">Uzturēt datni aktuālu</string>
- <string name="common_share">Dalīties</string>
<string name="common_rename">Pārsaukt</string>
<string name="common_remove">Izņemt</string>
<string name="confirmation_remove_alert">Vai tiešām vēlaties izņemt %1$s?</string>
<string name="rename_server_fail_msg">Nevarēja pabeigt pārsaukšanu</string>
<string name="sync_file_fail_msg">Nevarēja atzīmēt attālinātas datnes</string>
<string name="sync_file_nothing_to_do_msg">Datnes saturs jau ir sinhronizēts</string>
- <string name="create_dir_fail_msg">Nevarēja izveidot direktoriju</string>
<string name="wait_a_moment">Uzgaidīt brīdi</string>
<string name="filedisplay_unexpected_bad_get_content">Negaidīta problēma; lūdzu, izvēlieties datni no citas lietotnes</string>
<string name="filedisplay_no_file_selected">Netika izvēlēta neviena datne</string>
- <string name="ssl_validator_title">Brīdinājums</string>
<string name="ssl_validator_header">Šīs vietnes identitāti nevarēja pārbaudīt</string>
<string name="ssl_validator_reason_cert_not_trusted">- Nav uzticības servera sertifikātam</string>
<string name="ssl_validator_reason_cert_expired">- Servera sertifikātam ir beidzies termiņš</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- Servera sertifikāta datumi ir nākotnē</string>
<string name="ssl_validator_reason_hostname_not_verified">- URL sertifikātā neatbilst datora nosaukumam</string>
- <string name="ssl_validator_certificate_not_available">Nevarēja saņemt sertifikātu</string>
<string name="ssl_validator_question">Vai tomēr uzticēties sertifikātam?</string>
<string name="ssl_validator_not_saved">Nevarēja saglabāt sertifikātu</string>
<string name="ssl_validator_btn_details_see">Sīkāka informācija</string>
<string name="ssl_validator_label_validity_to">Kam:</string>
<string name="ssl_validator_label_signature">Paraksts:</string>
<string name="ssl_validator_label_signature_algorithm">Algoritms:</string>
- <string name="text_placeholder">Šis ir vietturis</string>
<string name="instant_upload_on_wifi">Attēlus augšupielādēt tikai caur WiFi</string>
<string name="instant_upload_path">/TūlītējaAugšupielāde</string>
<string name="conflict_title">Atjaunināšanas konflikts</string>
<string name="conflict_keep_both">Paturēt abas</string>
<string name="conflict_overwrite">Pārrakstīt</string>
<string name="conflict_dont_upload">Neaugšupielādēt</string>
+ <string name="activity_chooser_send_file_title">Sūtīt</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Лозинка:</string>
- <string name="main_login">Корисник:</string>
- <string name="main_button_login">Најава</string>
- <string name="main_welcome">Добредојде</string>
- <string name="main_files">Датотеки</string>
- <string name="main_music">Музика</string>
- <string name="main_contacts">Контакти</string>
- <string name="main_calendar">Календар</string>
- <string name="main_bookmarks">Обележувачи</string>
- <string name="main_settings">Параметри</string>
- <string name="main_tit_accsetup">Постави сметка</string>
- <string name="main_wrn_accsetup">Нема конфигурирано сметка на овој уред, за да можете да ја користите апликацијава треба да направите сметка.</string>
- <string name="actionbar_sync">Освежи</string>
<string name="actionbar_upload">Подигни</string>
<string name="actionbar_upload_files">Датотеки</string>
- <string name="actionbar_mkdir">Создади папка</string>
- <string name="actionbar_search">Барај</string>
+ <string name="actionbar_open_with">Отвори со</string>
<string name="actionbar_settings">Параметри</string>
+ <string name="actionbar_see_details">Детали:</string>
+ <string name="actionbar_send_file">Прати</string>
<string name="prefs_category_general">Општо</string>
- <string name="prefs_category_trackmydevice">Следење на уред</string>
- <string name="prefs_add_session">Додади нова сесија</string>
- <string name="prefs_create_img_thumbnails">Направи мали слики</string>
- <string name="prefs_select_oc_account">Избери сметка</string>
- <string name="prefs_summary_select_oc_account">Избери која од вашите сметки</string>
- <string name="prefs_trackmydevice">Следење на уред</string>
- <string name="prefs_trackmydevice_summary_off">Овозможи ја оваа апликација за да ја следите локацијата на вашиот уред</string>
- <string name="prefs_trackmydevice_summary_on">Оваа апликација го следи вашиот уред</string>
- <string name="prefs_trackmydevice_interval">Интервал на ажурирање</string>
- <string name="prefs_trackmydevice_interval_summary">Ажурирај секои %1$s минути</string>
+ <string name="prefs_category_more">Повеќе</string>
<string name="prefs_accounts">Сметки</string>
- <string name="auth_host_url">Адреса</string>
+ <string name="prefs_manage_accounts">Управување со сметки</string>
+ <string name="prefs_pincode">Апликативен ПИН</string>
+ <string name="prefs_pincode_summary">Заштитете го вашиот клиент</string>
+ <string name="prefs_log_title">Овозможи логирање</string>
+ <string name="prefs_help">Помош</string>
+ <string name="prefs_recommend">Препорачај на пријател</string>
+ <string name="prefs_feedback">Повратен одговор</string>
<string name="auth_username">Корисничко име</string>
<string name="auth_password">Лозинка</string>
- <string name="new_session_uri_error">Дадена неточна адреса</string>
- <string name="new_session_session_name_error">Неточно име на сесија</string>
<string name="sync_string_files">Датотеки</string>
- <string name="setup_hint_username">Корисничко име</string>
- <string name="setup_hint_password">Лозинка</string>
+ <string name="setup_btn_connect">Поврзи се</string>
<string name="uploader_btn_upload_text">Подигни</string>
+ <string name="uploader_wrn_no_account_title">Не е пронајдена сметка</string>
+ <string name="uploader_wrn_no_account_setup_btn_text">Нагодување</string>
<string name="uploader_wrn_no_account_quit_btn_text">Прекини</string>
<string name="filedetails_size">Големина:</string>
<string name="filedetails_type">Тип:</string>
<string name="filedetails_created">Создадено:</string>
<string name="filedetails_modified">Изменето:</string>
<string name="filedetails_download">Преземање</string>
- <string name="filedetails_open">Отвори</string>
+ <string name="action_share_file">Сподели ја врската</string>
<string name="common_yes">Да</string>
<string name="common_no">Не</string>
<string name="common_ok">Во ред</string>
<string name="common_cancel_upload">Откажи прикачување</string>
<string name="common_cancel">Откажи</string>
<string name="common_error">Грешка</string>
- <string name="sync_string_contacts">Контакти</string>
- <string name="common_share">Сподели</string>
+ <string name="common_loading">Вчитувам ...</string>
+ <string name="common_error_unknown">Непозната грешка</string>
+ <string name="about_title">За</string>
+ <string name="change_password">Смени лозинка</string>
+ <string name="delete_account">Избриши ја сметката</string>
+ <string name="create_account">Креирај сметка</string>
+ <string name="uploader_info_dirname">Име на папка</string>
+ <string name="downloader_download_in_progress_ticker">Преземање...</string>
+ <string name="downloader_download_succeeded_ticker">Преземањето е успешно</string>
+ <string name="downloader_download_failed_ticker">Преземањето не беше успешно</string>
+ <string name="common_choose_account">Одбери сметка</string>
+ <string name="sync_fail_ticker">Синхронизацијата беше неуспешна</string>
+ <string name="sync_conflicts_in_favourites_ticker">Пронајден е конфликт</string>
+ <string name="foreign_files_move">Префрли ги сите</string>
+ <string name="pincode_enter_pin_code">Ве молам внесето го вашиот апликативен ПИН</string>
+ <string name="pincode_configure_your_pin">Внесето го вашиот апликативен ПИН</string>
+ <string name="pincode_reenter_your_pincode">Ве молам повторно внесето го вашиот апликативен ПИН</string>
+ <string name="pincode_remove_your_pincode">Одстранете го го вашиот апликативен ПИН</string>
+ <string name="pincode_mismatch">Апликативните ПИН-ови не се исти</string>
+ <string name="pincode_wrong">Грешен апликативен ПИН</string>
+ <string name="pincode_removed">Апликативниот ПИН е одстранет</string>
+ <string name="pincode_stored">Апликативниот ПИН е снимен</string>
+ <string name="auth_trying_to_login">Обиди се да се најавиш...</string>
+ <string name="auth_no_net_conn_title">Нема мрежна конекција</string>
+ <string name="auth_testing_connection">Ја тестирам врската...</string>
+ <string name="auth_incorrect_path_title">Серверската инстанца не е пронајдена</string>
+ <string name="auth_timeout_title">На серверот му треба премногу време за да одговори</string>
+ <string name="auth_ssl_general_error_title">Неуспешна SSL иницијализација</string>
+ <string name="auth_bad_oc_version_title">Верзијата на серверот не е препознаена</string>
+ <string name="auth_unauthorized">Погрешно корисничко име или лозинка</string>
+ <string name="auth_oauth_error">Неуспешна авторизација</string>
+ <string name="auth_expired_basic_auth_toast">Внесете ја вашата тековна лозинка:</string>
<string name="common_rename">Преименувај</string>
<string name="common_remove">Отстрани</string>
- <string name="ssl_validator_title">Предупредување</string>
+ <string name="confirmation_remove_local">Само локално</string>
+ <string name="confirmation_remove_remote">Отстрани од серверот</string>
+ <string name="confirmation_remove_remote_and_local">Далечинско и локално</string>
+ <string name="remove_success_msg">Одстранувањето е успешно</string>
+ <string name="remove_fail_msg">Одстранувањето е неуспешно</string>
+ <string name="rename_dialog_title">Внеси ново име</string>
+ <string name="wait_a_moment">Почекајте малку</string>
+ <string name="filedisplay_unexpected_bad_get_content">Неочекуван проблем ; ве молам одберете датотека од друга апликација</string>
+ <string name="filedisplay_no_file_selected">Нема избрано датотека</string>
+ <string name="oauth_check_onoff">Најави се со oAuth2</string>
+ <string name="ssl_validator_btn_details_see">Детали</string>
+ <string name="ssl_validator_btn_details_hide">Сокриј</string>
+ <string name="ssl_validator_label_subject">Издаден на:</string>
+ <string name="ssl_validator_label_issuer">Издаден од:</string>
+ <string name="ssl_validator_label_O">Организација</string>
+ <string name="ssl_validator_label_C">Земја:</string>
+ <string name="ssl_validator_label_ST">Држава:</string>
+ <string name="ssl_validator_label_L">Локација:</string>
+ <string name="ssl_validator_label_validity">Валидност:</string>
+ <string name="ssl_validator_label_validity_from">Од:</string>
+ <string name="ssl_validator_label_validity_to">До:</string>
+ <string name="ssl_validator_label_signature">Потпис:</string>
+ <string name="ssl_validator_label_signature_algorithm">Алгоритам:</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
+ <string name="conflict_title">Конфликт при надградбата</string>
+ <string name="conflict_keep_both">Задржи ги и двете</string>
+ <string name="conflict_overwrite">Препиши</string>
+ <string name="failed_upload_all_cb">избери се</string>
+ <string name="activity_chooser_send_file_title">Прати</string>
</resources>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources/>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources/>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources/>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Kata laluan:</string>
- <string name="main_login">Nama pengguna:</string>
- <string name="main_button_login">Log masuk</string>
- <string name="main_welcome">Selamat datang ke ownCloud</string>
- <string name="main_files">Fail-fail</string>
- <string name="main_music">Muzik</string>
- <string name="main_contacts">Hubungi </string>
- <string name="main_calendar">Kalendar</string>
- <string name="main_bookmarks">Tanda</string>
- <string name="main_settings">Tetapan-tetapan</string>
- <string name="main_tit_accsetup">Set akaun</string>
- <string name="main_wrn_accsetup">Peranti anda tidak mempunyai akaun ownCloud. Anda perlu membina satu akaun untuk menggunakan aplikasi ini</string>
- <string name="actionbar_sync">Refresh</string>
<string name="actionbar_upload">Muat naik</string>
<string name="actionbar_upload_files">Fail-fail</string>
- <string name="actionbar_mkdir">Bina direktori</string>
- <string name="actionbar_search">Cari</string>
<string name="actionbar_settings">Set</string>
<string name="prefs_category_general">Umum</string>
- <string name="prefs_category_trackmydevice">Jejak peranti</string>
- <string name="prefs_add_session">Tambah sesi baru</string>
- <string name="prefs_create_img_thumbnails">Bina lakaran kecil imej </string>
- <string name="prefs_select_oc_account">Pilih akaun</string>
- <string name="prefs_summary_select_oc_account">Pilih akaun yang mana aplikasi ini akan gunakan</string>
- <string name="prefs_trackmydevice">Peranti sedang dijejaki</string>
- <string name="prefs_trackmydevice_interval_summary">Kemaskini setiap %1$s minit</string>
+ <string name="prefs_category_more">Lanjutan</string>
<string name="prefs_accounts">Akaun</string>
- <string name="auth_host_url">URL ownCloud</string>
+ <string name="prefs_pincode">PIN App</string>
+ <string name="prefs_help">Bantuan</string>
<string name="auth_username">Nama pengguna</string>
<string name="auth_password">Kata laluan</string>
- <string name="new_session_uri_error">URL yang diberikan adalah salah</string>
<string name="sync_string_files">Fail-fail</string>
- <string name="setup_hint_username">Nama pengguna</string>
- <string name="setup_hint_password">Kata laluan</string>
- <string name="setup_hint_address">Alamat sesawang</string>
- <string name="setup_hint_show_password">Tunjuk password?</string>
- <string name="setup_title">Berhubung dengan ownCloud anda</string>
<string name="setup_btn_connect">Berhubung</string>
<string name="uploader_btn_upload_text">Muat naik</string>
<string name="uploader_wrn_no_account_title">Tiada akaun dijumpai</string>
- <string name="uploader_wrn_no_account_text">Device anda tidak mempunyai sebarang akaun ownCloud. Mohon bina akaun dahulu.</string>
+ <string name="uploader_wrn_no_account_text">Device anda tidak mempunyai sebarang akaun %1$s. Mohon bina akaun dahulu.</string>
<string name="uploader_wrn_no_account_quit_btn_text">Berhenti</string>
<string name="uploader_info_uploading">Memuatnaik</string>
- <string name="uploader_btn_create_dir_text">Bina direktori untuk proses upload</string>
<string name="filedetails_size">Saiz</string>
<string name="filedetails_type">Jenis</string>
<string name="filedetails_created">Telah dibina:</string>
<string name="filedetails_modified">Telah diubah:</string>
<string name="filedetails_download">Muatturun</string>
- <string name="filedetails_sync_file">Refresh</string>
- <string name="filedetails_redownload">Refresh</string>
- <string name="filedetails_open">Buka</string>
<string name="common_yes">Ya</string>
<string name="common_no">Tidak</string>
<string name="common_ok">OK</string>
<string name="common_cancel">Batal</string>
<string name="common_save_exit">Simpan & Keluar</string>
<string name="common_error">Ralat</string>
- <string name="uploader_info_dirname">Nama direktori</string>
+ <string name="about_title">Mengenai</string>
+ <string name="change_password">Ubah kata laluan</string>
+ <string name="delete_account">Padam akaun</string>
+ <string name="uploader_upload_succeeded_ticker">Muatnaik berjaya</string>
+ <string name="uploader_upload_failed_ticker">Muatnaik gagal</string>
+ <string name="downloader_download_in_progress_ticker">Muatturun....</string>
<string name="common_choose_account">Pilih akaun</string>
- <string name="sync_string_contacts">Hubungi </string>
- <string name="common_share">Kongsi</string>
- <string name="ssl_validator_title">Amaran</string>
+ <string name="pincode_configure_your_pin">Masukkan PIN App anda</string>
+ <string name="pincode_reenter_your_pincode">Sila, memasukkan semula PIN App anda</string>
+ <string name="pincode_stored">PIN App disimpan</string>
+ <string name="auth_no_net_conn_title">Tiada sambungan rangkaian</string>
+ <string name="common_rename">Namakan</string>
+ <string name="common_remove">Buang</string>
+ <string name="confirmation_remove_local">Lokal sahaja</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="main_files">ဖိုင်များ</string>
- <string name="main_calendar">ပြက္ခဒိန်</string>
<string name="actionbar_upload_files">ဖိုင်များ</string>
+ <string name="prefs_help">အကူအညီ</string>
<string name="auth_username">သုံးစွဲသူအမည်</string>
<string name="auth_password">စကားဝှက်</string>
<string name="sync_string_files">ဖိုင်များ</string>
- <string name="setup_hint_username">သုံးစွဲသူအမည်</string>
- <string name="setup_hint_password">စကားဝှက်</string>
<string name="filedetails_download">ဒေါင်းလုတ်</string>
<string name="common_yes">ဟုတ်</string>
<string name="common_no">မဟုတ်ဘူး</string>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Passord:</string>
- <string name="main_login">Brukernavn:</string>
- <string name="main_button_login">Logg inn</string>
- <string name="main_welcome">Velkommen til din ownClound</string>
- <string name="main_files">Filer</string>
- <string name="main_music">Musikk</string>
- <string name="main_contacts">Kontakter</string>
- <string name="main_calendar">Kalender</string>
- <string name="main_bookmarks">Bokmerker</string>
- <string name="main_settings">Innstillinger</string>
- <string name="main_tit_accsetup">Sett opp konto</string>
- <string name="main_wrn_accsetup">Det finnes ingen ownClound kontoer for din enhent. For å bruker denne appen må du opprette en,</string>
- <string name="actionbar_sync">Oppdater</string>
+ <string name="about_android">%1$s Andriod app</string>
+ <string name="about_version">versjon %1$s</string>
+ <string name="actionbar_sync">Oppdater konto</string>
<string name="actionbar_upload">Last opp</string>
<string name="actionbar_upload_from_apps">Innhold fra andre applikasjoner</string>
<string name="actionbar_upload_files">Filer</string>
- <string name="actionbar_mkdir">Opprett katalog</string>
- <string name="actionbar_search">Søk</string>
+ <string name="actionbar_open_with">Åpne med</string>
+ <string name="actionbar_mkdir">Ny mappe</string>
<string name="actionbar_settings">Innstillinger</string>
+ <string name="actionbar_see_details">Detaljer</string>
+ <string name="actionbar_send_file">Send</string>
<string name="prefs_category_general">Generelt</string>
- <string name="prefs_category_trackmydevice">Enhetssporing</string>
- <string name="prefs_add_session">Legg til ny sesjon</string>
- <string name="prefs_create_img_thumbnails">Opprett miniatyrbilder</string>
- <string name="prefs_select_oc_account">Velg konto</string>
- <string name="prefs_trackmydevice">Enhetssporing</string>
- <string name="prefs_trackmydevice_interval">Oppdateringsfrekvens</string>
- <string name="prefs_trackmydevice_interval_summary">Oppdater hvert %1$s minutt</string>
+ <string name="prefs_category_more">Mer</string>
<string name="prefs_accounts">Kontoer</string>
+ <string name="prefs_manage_accounts">Håndter kontoer</string>
+ <string name="prefs_pincode">PIN kode</string>
+ <string name="prefs_pincode_summary">Beskytt klienten din</string>
+ <string name="prefs_instant_upload">Aktiver direkte opplastinger</string>
<string name="prefs_instant_upload_summary">Last opp bilder tatt med kamera øyeblikkelig</string>
- <string name="auth_host_url">URL</string>
+ <string name="prefs_log_title">Aktiver loggføring</string>
+ <string name="prefs_log_summary">Denne er brukt til å loggføre problemer</string>
+ <string name="prefs_log_title_history">Loggføringshistorikk</string>
+ <string name="prefs_log_summary_history">Denne viser de lagrede loggene</string>
+ <string name="prefs_log_delete_history_button">Slett historikk</string>
+ <string name="prefs_help">Hjelp</string>
+ <string name="prefs_recommend">Anbefal til en venn</string>
+ <string name="prefs_feedback">Tilbakemelding</string>
+ <string name="prefs_imprint">Avtrykk</string>
+ <string name="recommend_subject">Prøv %1$s på smarttelefonen din!</string>
+ <string name="auth_check_server">Sjekk server</string>
+ <string name="auth_host_url">Serveradresse https://...</string>
<string name="auth_username">Brukernavn</string>
<string name="auth_password">Passord</string>
+ <string name="auth_register">Ny med %1$s?</string>
<string name="sync_string_files">Filer</string>
- <string name="uploader_no_file_selected">Ingen fil valgt for opplasting</string>
- <string name="setup_hint_username">Brukernavn</string>
- <string name="setup_hint_password">Passord</string>
- <string name="setup_hint_address">Internettadresse</string>
- <string name="setup_hint_show_password">Vise passord?</string>
<string name="setup_btn_connect">Koble til</string>
<string name="uploader_btn_upload_text">Last opp</string>
<string name="uploader_wrn_no_account_title">Ingen konto funnet</string>
+ <string name="uploader_wrn_no_account_text">Det finnes ingen %1$s kontoer for din enhet. For å bruker denne appen må du først opprette en.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Oppsett</string>
<string name="uploader_wrn_no_account_quit_btn_text">Avslutt</string>
<string name="uploader_wrn_no_content_title">Intet innhold å laste opp</string>
<string name="uploader_wrn_no_content_text">Intet innhold ble mottatt. Intet å laste opp.</string>
+ <string name="uploader_error_forbidden_content">%1$s har ikke tilgang til det delte innholdet</string>
<string name="uploader_info_uploading">Laster opp</string>
- <string name="uploader_btn_create_dir_text">Opprett mappe for opplasting</string>
+ <string name="file_list_empty">Det finnes ikke filer i mappen.\nNye filer kan legges til med \"last opp\" i menyen.</string>
<string name="filedetails_select_file">Trykk på en fil for å vise ekstra informasjon.</string>
<string name="filedetails_size">Størrelse:</string>
<string name="filedetails_type">Type:</string>
<string name="filedetails_created">Opprettet:</string>
<string name="filedetails_modified">Endret:</string>
<string name="filedetails_download">Last ned</string>
- <string name="filedetails_sync_file">Oppdater</string>
- <string name="filedetails_redownload">Last ned igjen</string>
- <string name="filedetails_open">Åpne</string>
+ <string name="filedetails_sync_file">Oppdater fil</string>
+ <string name="filedetails_renamed_in_upload_msg">Filnavnet ble endret til %1$s under opplasting</string>
+ <string name="action_share_file">Del lenke</string>
+ <string name="action_unshare_file">Avslutt deling av lenke</string>
<string name="common_yes">Ja</string>
<string name="common_no">Nei</string>
<string name="common_ok">OK</string>
<string name="common_cancel">Avbryt</string>
<string name="common_save_exit">Lagre og avslutt</string>
<string name="common_error">Feil</string>
+ <string name="common_loading">Laster...</string>
+ <string name="common_error_unknown">Ukjent feil</string>
<string name="about_title">Om</string>
+ <string name="change_password">Endre passord</string>
<string name="delete_account">Slett konto</string>
<string name="create_account">Opprett konto</string>
<string name="upload_chooser_title">Last opp fra...</string>
- <string name="uploader_info_dirname">Katalognavn</string>
+ <string name="uploader_info_dirname">Mappenavn</string>
<string name="uploader_upload_in_progress_ticker">Laster opp...</string>
<string name="uploader_upload_in_progress_content">%1$d%% Laster opp %2$s</string>
<string name="uploader_upload_succeeded_ticker">Opplasting fullført</string>
+ <string name="uploader_upload_succeeded_content_single">%1$s ble lastet opp</string>
<string name="uploader_upload_failed_ticker">Opplasting feilet</string>
<string name="uploader_upload_failed_content_single">Opplasting av %1$s kunne ikke fullføres</string>
- <string name="uploader_upload_failed_content_multiple">Opplasting feilet: %1$d/%2$d filer ble lastet opp</string>
<string name="downloader_download_in_progress_ticker">Laster ned...</string>
<string name="downloader_download_in_progress_content">%1$d%% Laster ned %2$s</string>
<string name="downloader_download_succeeded_ticker">Nedlasting fullført</string>
+ <string name="downloader_download_succeeded_content">%1$s ble lastet ned</string>
<string name="downloader_download_failed_ticker">Nedlasting feilet</string>
<string name="downloader_download_failed_content">Nedlasting av %1$s kunne ikke fullføres</string>
+ <string name="downloader_not_downloaded_yet">Ikke lastet ned enda</string>
<string name="common_choose_account">Velg konto</string>
- <string name="sync_string_contacts">Kontakter</string>
<string name="sync_fail_ticker">Synkronisering feilet</string>
<string name="sync_fail_content">Synkronisering av %1$s kunne ikke fullføres</string>
+ <string name="sync_fail_content_unauthorized">Ugyldig passord for %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Konflikter funnet</string>
- <string name="use_ssl">Bruk sikker tilkobling</string>
+ <string name="sync_conflicts_in_favourites_content">%1$d hold-i-synk filer kunne ikke synkroniseres</string>
+ <string name="sync_fail_in_favourites_ticker">Hold i synk filer mislyktes</string>
+ <string name="sync_fail_in_favourites_content">Innholdet av %1$d filer kunne ikke synkroniseres (%2$d konflikter)</string>
+ <string name="sync_foreign_files_forgotten_ticker">Noen lokale filer ble glemt</string>
+ <string name="sync_current_folder_was_removed">Mappen %1$s finnes ikke lengere</string>
+ <string name="foreign_files_move">Flytt alle</string>
+ <string name="foreign_files_success">Alle filer ble flyttet</string>
+ <string name="foreign_files_fail">Noen filer kunne ikke fjernes</string>
+ <string name="foreign_files_local_text">Lokal: %1$s</string>
+ <string name="foreign_files_remote_text">Ekstern: %1$s</string>
+ <string name="upload_query_move_foreign_files">Det er ikke nok plass til å kopiere de valgte filene til %1$s mappe. Vil du flytte dem i stedet?</string>
<string name="pincode_enter_pin_code">Vennligst tast inn din App-PIN</string>
- <string name="pincode_enter_new_pin_code">Vennligst tast inn ny App-PIN</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 minutter</item>
- <item>30 minutter</item>
- <item>60 minutter</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_configure_your_pin">Skriv inn din PIN kode</string>
+ <string name="pincode_configure_your_pin_explanation">PIN koden vil bli ettersourt hver gang appen starter</string>
+ <string name="pincode_reenter_your_pincode">Vennligst tast inn din PIN kode på nytt</string>
+ <string name="pincode_remove_your_pincode">Fjern din PIN kode</string>
+ <string name="pincode_mismatch">PIN kodene du tastet er ulike</string>
+ <string name="pincode_wrong">Feil PIN kode</string>
+ <string name="pincode_removed">PIN kode fjernet</string>
+ <string name="pincode_stored">PIN kode lagret</string>
+ <string name="media_notif_ticker">%1$s musikkspiller</string>
+ <string name="media_state_playing">%1$s (spiller)</string>
+ <string name="media_state_loading">%1$s (laster)</string>
+ <string name="media_event_done">%1$s avspilling avsluttet</string>
+ <string name="media_err_nothing_to_play">Ingen mediafil funnet</string>
+ <string name="media_err_no_account">Ingen konto angitt</string>
+ <string name="media_err_not_in_owncloud">Filen er ikke i en gyldig konto</string>
+ <string name="media_err_unsupported">Mediakodek er ikke støttet</string>
+ <string name="media_err_io">Mediafilen kunne ikke leses</string>
+ <string name="media_err_malformed">Mediafilen er ikke riktig kodet</string>
+ <string name="media_err_timeout">Tidsavbrudd under avspillingsforsøk</string>
+ <string name="media_err_invalid_progressive_playback">Mediafilen kan ikke strømmes</string>
+ <string name="media_err_unknown">Mediafilen kan ikke spilles med standard mediaspiller</string>
+ <string name="media_err_security_ex">Sikkerhetsfeil under avspilling av %1$s</string>
+ <string name="media_err_io_ex">Inputfeil under avspilling av %1$s</string>
+ <string name="media_err_unexpected">Uforventet feil under avspilling av %1$s</string>
+ <string name="media_rewind_description">Spol tilbake</string>
+ <string name="media_play_pause_description">Spill eller pause</string>
+ <string name="media_forward_description">Spol fremover</string>
<string name="auth_trying_to_login">Prøver å logge inn...</string>
<string name="auth_no_net_conn_title">Ingen nettverkstilkobling</string>
- <string name="auth_connect_anyway">Koble til likevel</string>
<string name="auth_nossl_plain_ok_title">Sikker tilkobling ikke tilgjengelig.</string>
<string name="auth_connection_established">Tilkobling opprettet</string>
- <string name="auth_testing_connection">Tester tilkobling...</string>
+ <string name="auth_testing_connection">Tester tilgang...</string>
+ <string name="auth_not_configured_title">Feil i server konfigurasjon</string>
+ <string name="auth_account_not_new">En konto for samme bruker og server finnes allerede på enheten</string>
+ <string name="auth_account_not_the_same">Den innskrevne brukeren matcher ikke brukeren av denne kontoen</string>
<string name="auth_unknown_error_title">Ukjent feil oppstod!</string>
<string name="auth_unknown_host_title">Fant ikke tjener</string>
- <string name="auth_unknown_host_message">Fant ikke spesifisert tjener. Vennligst sjekk tjenernavnet og server-tilgjengeligheten, og prøv på nytt.</string>
+ <string name="auth_incorrect_path_title">Finner ikke server instans</string>
<string name="auth_timeout_title">Serveren brukte for lang tid på å svare</string>
<string name="auth_incorrect_address_title">Feil formatert URL</string>
<string name="auth_ssl_general_error_title">Oppstart av SSL feilet</string>
- <string name="auth_ssl_unverified_server_title">Uverifisert SSL-servers identitet</string>
+ <string name="auth_ssl_unverified_server_title">Kunne ikke verifisere SSL-serverens identitet</string>
+ <string name="auth_bad_oc_version_title">Ukjent server versjon</string>
<string name="auth_wrong_connection_title">Klarte ikke å opprette tilkobling</string>
<string name="auth_secure_connection">Sikker tilkobling opprettet</string>
- <string name="auth_login_details">Innloggingsdetaljer</string>
- <string name="auth_unauthorized">Ugyldig brukernavn / passord</string>
- <string name="crashlog_send_report">Send rapport</string>
- <string name="crashlog_dont_send_report">Ikke send rapport</string>
- <string name="extensions_avail_title">Utvidelser tilgjengelig!</string>
+ <string name="auth_unauthorized">Feil brukernavn eller passord</string>
+ <string name="auth_oauth_error">Mislykket autorisasjon</string>
+ <string name="auth_oauth_error_access_denied">Tilgang nektet av autorisasjonsserver</string>
+ <string name="auth_wtf_reenter_URL">Uforventet tilstand; vennligst skriv inn serveradressen en gang til</string>
+ <string name="auth_expired_oauth_token_toast">Autorisasjonen din har gått ut. Vennligt autoriser igjen</string>
+ <string name="auth_expired_basic_auth_toast">Vennligst skriv inn gjeldende passord</string>
+ <string name="auth_expired_saml_sso_token_toast">Sesjonen din har gått ut. Vennligst koble til igjen</string>
+ <string name="auth_connecting_auth_server">Kobler til autorisasjonsserver...</string>
+ <string name="auth_unsupported_auth_method">Serveren støtter ikke denne autorisasjonsmetoden</string>
+ <string name="auth_unsupported_multiaccount">%1$s støtter ikke flere kontoer</string>
<string name="fd_keep_in_sync">Hold filen oppdatert</string>
- <string name="common_share">Del</string>
<string name="common_rename">Endre navn</string>
<string name="common_remove">Fjern</string>
<string name="confirmation_remove_alert">Er du sikker på at du vil fjerne %1$s ?</string>
+ <string name="confirmation_remove_folder_alert">Vil du virkelig fjerne %1$s og dens innhold?</string>
<string name="confirmation_remove_local">Kun lokalt</string>
+ <string name="confirmation_remove_folder_local">Kun lokalt innhold</string>
<string name="confirmation_remove_remote">Fjern fra server</string>
+ <string name="confirmation_remove_remote_and_local">Ekstern og lokal</string>
+ <string name="remove_success_msg">Fjerning var vellykket</string>
+ <string name="remove_fail_msg">Fjerning mislyktes</string>
+ <string name="rename_dialog_title">Skriv inn et nytt navn</string>
+ <string name="rename_local_fail_msg">Lokal kopi kunne ikke endre navn; prøv et annet navn</string>
<string name="rename_server_fail_msg">Klarte ikke å endre navn</string>
- <string name="create_dir_fail_msg">Mappe kunne ikke opprettes</string>
+ <string name="sync_file_fail_msg">Eksterne filer kunne ikke sjekkes</string>
+ <string name="sync_file_nothing_to_do_msg">filinnhold er allerede synkronisert</string>
+ <string name="filename_forbidden_characters">Forbudte tegn: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Vent et øyeblikk</string>
+ <string name="filedisplay_unexpected_bad_get_content">Uforventet problem; vennligst velg filen fra en annen applikasjon</string>
<string name="filedisplay_no_file_selected">Ingen fil ble valgt</string>
- <string name="ssl_validator_title">Advarsel</string>
+ <string name="activity_chooser_title">Send lenke til ...</string>
+ <string name="oauth_check_onoff">Logg inn med oAuth2</string>
+ <string name="oauth_login_connection">Kobler til oAuth2 server...</string>
<string name="ssl_validator_header">Identiteten til siden kunne ikke verifiseres</string>
<string name="ssl_validator_reason_cert_not_trusted">- Serverens sertifikat er ikke til å stole på</string>
<string name="ssl_validator_reason_cert_expired">- Serverens sertifikat er utløpt</string>
+ <string name="ssl_validator_reason_cert_not_yet_valid">- Server-sertifikatets gyldige datoer er i fremtiden</string>
+ <string name="ssl_validator_reason_hostname_not_verified">- Nettadressen samsvarer ikke med vertsnavnet i sertifikatet</string>
+ <string name="ssl_validator_question">Vil du stole på dette sertifikatet likevel?</string>
+ <string name="ssl_validator_not_saved">Sertifikatet kunne ikke lagres</string>
<string name="ssl_validator_btn_details_see">Detaljer</string>
<string name="ssl_validator_btn_details_hide">Skjul</string>
+ <string name="ssl_validator_label_subject">Utstedt til:</string>
+ <string name="ssl_validator_label_issuer">Utstedt av:</string>
+ <string name="ssl_validator_label_CN">Vanlig navn:</string>
+ <string name="ssl_validator_label_O">Organisasjon:</string>
+ <string name="ssl_validator_label_OU">Organisasjonsenhet:</string>
<string name="ssl_validator_label_C">Land:</string>
+ <string name="ssl_validator_label_ST">Stat:</string>
+ <string name="ssl_validator_label_L">Sted:</string>
+ <string name="ssl_validator_label_validity">Gyldighet:</string>
<string name="ssl_validator_label_validity_from">Fra:</string>
<string name="ssl_validator_label_validity_to">Til:</string>
<string name="ssl_validator_label_signature">Signatur:</string>
- <string name="text_placeholder">Dette er en plassholder</string>
+ <string name="ssl_validator_label_signature_algorithm">Algoritme:</string>
+ <string name="placeholder_sentence">Dette er en plassholder</string>
+ <string name="placeholder_filename">placeholder.txt</string>
+ <string name="placeholder_filetype">PNG bilde</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">18.05.2012 12:23</string>
+ <string name="placeholder_media_time">12:23:45</string>
+ <string name="instant_upload_on_wifi">Kun last opp bilder via WiFi</string>
+ <string name="instant_upload_path">/Direkteopplasting</string>
+ <string name="conflict_title">Oppdateringskonflikt</string>
+ <string name="conflict_message">Ekstern fil %s er ikke synkronisert med lokal fil. Hvis du fortsetter vil det erstatte innhold på serveren.</string>
<string name="conflict_keep_both">Behold begge</string>
+ <string name="conflict_overwrite">Overskriv</string>
+ <string name="conflict_dont_upload">Ikke last opp</string>
+ <string name="preview_image_description">Bildeforhåndsvisning</string>
+ <string name="preview_image_error_unknown_format">Dette bildet kan ikke vises</string>
+ <string name="actionbar_failed_instant_upload">Misslyktes direkteopplasting</string>
+ <string name="failed_upload_headline_text">Mislykket direkteopplastinger</string>
+ <string name="failed_upload_headline_hint">Oppsumering av alle mislykkede direkteopplastinger</string>
+ <string name="failed_upload_all_cb">velg alle</string>
+ <string name="failed_upload_headline_retryall_btn">forsøk alle valgte på nytt</string>
+ <string name="failed_upload_headline_delete_all_btn">slett alle valgte fra opplastingskø</string>
+ <string name="failed_upload_retry_text">forsøk å laste opp bildet på nytt:</string>
+ <string name="failed_upload_load_more_images">Last flere bilder</string>
+ <string name="failed_upload_retry_do_nothing_text">ikke gjør noe når du ikke er online for direkteopplasting</string>
+ <string name="failed_upload_failure_text">Feilmelding:</string>
+ <string name="failed_upload_quota_exceeded_text">Vennligst sjekk serverkonfigurasjon, kanskje kvoten din er brukt opp.</string>
+ <string name="share_link_file_no_exist">Klarte ikke å dele denne filen eller mappen. Sjekk at den eksisterer.</string>
+ <string name="share_link_file_error">Det skjedde en feil under deling av denne filen eller mappen</string>
+ <string name="unshare_link_file_no_exist">Klarte ikke å avslutte delingen av denne filen eller mappen. Den eksisterer ikke.</string>
+ <string name="unshare_link_file_error">En feil oppstod ved avslutting av delingen av denne filen eller mappen</string>
+ <string name="activity_chooser_send_file_title">Send</string>
+ <string name="copy_link">Kopier lenke</string>
+ <string name="clipboard_text_copied">Kopiert til utklippstavlen</string>
</resources>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources/>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Wachtwoord:</string>
- <string name="main_login">Gebruikersnaam:</string>
- <string name="main_button_login">Inloggen</string>
- <string name="main_welcome">Welkom in je ownCloud</string>
- <string name="main_files">Bestanden</string>
- <string name="main_music">Muziek</string>
- <string name="main_contacts">Contactpersonen</string>
- <string name="main_calendar">Kalender</string>
- <string name="main_bookmarks">Bladwijzers</string>
- <string name="main_settings">Instellingen</string>
- <string name="main_tit_accsetup">Account configureren.</string>
- <string name="main_wrn_accsetup">Er zijn nog geen ownCloud accounts op dit apparaat. Als je deze app wilt gebruiken zul je een account moeten aanmaken.</string>
- <string name="about_message">ownCloud Android client\n\nversie: %1$s</string>
- <string name="actionbar_sync">Verversen</string>
+ <string name="about_android">%1$s Android App</string>
+ <string name="about_version">versie %1$s</string>
+ <string name="actionbar_sync">Account verversen</string>
<string name="actionbar_upload">Uploaden</string>
<string name="actionbar_upload_from_apps">Inhoud van andere apps</string>
<string name="actionbar_upload_files">Bestanden</string>
- <string name="actionbar_mkdir">Creëer map</string>
- <string name="actionbar_search">Zoeken</string>
+ <string name="actionbar_open_with">Open met</string>
+ <string name="actionbar_mkdir">Nieuwe map</string>
<string name="actionbar_settings">Instellingen</string>
+ <string name="actionbar_see_details">Details</string>
+ <string name="actionbar_send_file">Versturen</string>
<string name="prefs_category_general">Algemeen</string>
- <string name="prefs_category_trackmydevice">Apparaat volgen</string>
- <string name="prefs_add_session">Voeg nieuwe sessie toe</string>
- <string name="prefs_create_img_thumbnails">Maak afbeeldingsminiaturen</string>
- <string name="prefs_select_oc_account">Selecteer een account</string>
- <string name="prefs_summary_select_oc_account">Kies welke accounts de app mag gebruiken.</string>
- <string name="prefs_trackmydevice">Apparaat volgen</string>
- <string name="prefs_trackmydevice_summary_off">Sta toe dat ownCloud je apparaat locatie volgt</string>
- <string name="prefs_trackmydevice_summary_on">ownCloud houdt dit apparaat in de gaten</string>
- <string name="prefs_trackmydevice_interval">Update interval</string>
- <string name="prefs_trackmydevice_interval_summary">Ververs elke %1$s minuten</string>
+ <string name="prefs_category_more">Meer</string>
<string name="prefs_accounts">Accounts</string>
<string name="prefs_manage_accounts">Beheer accounts</string>
- <string name="prefs_pincode">ownCloud App PIN</string>
- <string name="prefs_pincode_summary">Beveilig je ownCloud client</string>
+ <string name="prefs_pincode">App PIN</string>
+ <string name="prefs_pincode_summary">Beveilig je client</string>
<string name="prefs_instant_upload">Schakel direct uploaden in</string>
<string name="prefs_instant_upload_summary">Upload afbeeldingen van camera automatisch</string>
- <string name="auth_host_url">ownCloud URL</string>
+ <string name="prefs_log_title">Loggen aanzetten</string>
+ <string name="prefs_log_summary">Dit wordt gebruikt om problemen te loggen.</string>
+ <string name="prefs_log_title_history">Log-geschiedenis</string>
+ <string name="prefs_log_summary_history">Dit toont de bijgehouden logs</string>
+ <string name="prefs_log_delete_history_button">Verwijder Geschiedenis</string>
+ <string name="prefs_help">Help</string>
+ <string name="prefs_recommend">Aanbevelen bij een vriend</string>
+ <string name="prefs_feedback">Feedback</string>
+ <string name="prefs_imprint">afdruk</string>
+ <string name="recommend_subject">Probeer %1$s op uw smartphone!</string>
+ <string name="auth_check_server">Controleer server</string>
+ <string name="auth_host_url">Serveradres https://…</string>
<string name="auth_username">Gebruikersnaam</string>
<string name="auth_password">Wachtwoord</string>
- <string name="auth_register">Ik ben nieuw op ownCloud</string>
- <string name="new_session_uri_error">Onjuiste URL</string>
- <string name="new_session_session_name_error">Onjuiste sessienaam</string>
+ <string name="auth_register">Nieuw bij %1$s?</string>
<string name="sync_string_files">Bestanden</string>
- <string name="uploader_no_file_selected">Geen bestand geselecteerd voor upload</string>
- <string name="setup_hint_username">Gebruikersnaam</string>
- <string name="setup_hint_password">Wachtwoord</string>
- <string name="setup_hint_address">Webadres</string>
- <string name="setup_hint_show_password">Wachtwoord tonen?</string>
- <string name="setup_title">Verbinden met je ownCloud</string>
<string name="setup_btn_connect">Verbinden</string>
<string name="uploader_btn_upload_text">Uploaden</string>
+ <string name="uploader_top_message">Kies upload map:</string>
<string name="uploader_wrn_no_account_title">Geen account gevonden</string>
- <string name="uploader_wrn_no_account_text">Er zijn nog geen ownCloud accounts op je apparaat. Stel eerst een account in.</string>
+ <string name="uploader_wrn_no_account_text">Er zijn nog geen %1$s accounts op je apparaat. Stel eerst een account in.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Configureren</string>
<string name="uploader_wrn_no_account_quit_btn_text">Afsluiten</string>
<string name="uploader_wrn_no_content_title">Geen inhoud om te uploaden</string>
<string name="uploader_wrn_no_content_text">Er werd geen inhoud ontvangen. Niets om te uploaden.</string>
- <string name="uploader_error_forbidden_content">ownCloud is niet toegestaan om toegang te hebben tot de publieke inhoud</string>
+ <string name="uploader_error_forbidden_content">%1$s is niet toegestaan om toegang te hebben tot de publieke inhoud</string>
<string name="uploader_info_uploading">Uploaden</string>
- <string name="uploader_btn_create_dir_text">Maak nieuwe map voor upload</string>
<string name="file_list_empty">Er zitten geen bestanden in deze map.\nNieuwe bestanden kunnen worden toegevoegd via de \"Upload\" menukeuze.</string>
<string name="filedetails_select_file">Druk op een bestand om extra informatie weer te geven</string>
<string name="filedetails_size">Grootte:</string>
<string name="filedetails_created">Aangemaakt:</string>
<string name="filedetails_modified">Aangepast:</string>
<string name="filedetails_download">Download</string>
- <string name="filedetails_sync_file">Verversen</string>
- <string name="filedetails_redownload">Opnieuw downloaden</string>
- <string name="filedetails_open">Open</string>
+ <string name="filedetails_sync_file">Bestand verversen</string>
<string name="filedetails_renamed_in_upload_msg">Bestand was hernoemt naar %1$s tijdens het uploaden</string>
+ <string name="action_share_file">Deel link</string>
+ <string name="action_unshare_file">Link niet meer delen</string>
<string name="common_yes">Ja</string>
<string name="common_no">Nee</string>
<string name="common_ok">OK</string>
<string name="common_cancel_upload">Upload afbreken</string>
<string name="common_cancel">Annuleren</string>
<string name="common_save_exit">Opslaan & Afsluiten</string>
- <string name="common_exit">Verlaat ownCloud</string>
<string name="common_error">Fout</string>
+ <string name="common_loading">Laden...</string>
+ <string name="common_error_unknown">Onbekende fout</string>
<string name="about_title">Over</string>
+ <string name="change_password">Wijzig wachtwoord</string>
<string name="delete_account">Verwijder account</string>
<string name="create_account">Maak account aan</string>
<string name="upload_chooser_title">Upload van ...</string>
- <string name="uploader_info_dirname">Map naam</string>
+ <string name="uploader_info_dirname">Mapnaam</string>
<string name="uploader_upload_in_progress_ticker">Uploaden ...</string>
<string name="uploader_upload_in_progress_content">%1$d%% Uploaden %2$s</string>
<string name="uploader_upload_succeeded_ticker">Upload succesvol</string>
<string name="uploader_upload_succeeded_content_single">%1$s is met succes ge-upload</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d bestanden succesvol ge-upload</string>
<string name="uploader_upload_failed_ticker">Upload mislukt</string>
<string name="uploader_upload_failed_content_single">Upload van %1$s kon niet voltooid worden</string>
- <string name="uploader_upload_failed_content_multiple">Uploaden mislukt: %1$d/%2$d bestanden zijn geüpload</string>
<string name="downloader_download_in_progress_ticker">Downloaden ...</string>
<string name="downloader_download_in_progress_content">%1$d%% Aan het downloaden %2$s</string>
<string name="downloader_download_succeeded_ticker">Downloaden gelukt</string>
<string name="downloader_download_succeeded_content">%1$s werd succesvol gedownload</string>
<string name="downloader_download_failed_ticker">Downloaden mislukt</string>
<string name="downloader_download_failed_content">Download van %1$s kon niet worden voltooid</string>
+ <string name="downloader_not_downloaded_yet">Nog niet gedownload</string>
<string name="common_choose_account">Kies account</string>
- <string name="sync_string_contacts">Contactpersonen</string>
<string name="sync_fail_ticker">Synchronisatie mislukt</string>
<string name="sync_fail_content">Synchronisatie van %1$s kon niet worden voltooid</string>
+ <string name="sync_fail_content_unauthorized">Ongeldig wachtwoord voor %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Conflicten gevonden</string>
<string name="sync_conflicts_in_favourites_content">%1$d in-synch-houden bestanden konden niet worden gesync\'d</string>
<string name="sync_fail_in_favourites_ticker">In-sync-houden bestanden mislukt</string>
<string name="sync_fail_in_favourites_content">Inhoud van %1$d bestanden kon niet worden gesynchroniseerd (%2$d conflicten)</string>
- <string name="use_ssl">Gebruik veilige verbinding</string>
- <string name="location_no_provider">ownCloud kan het apparaat niet volgen. Configureer de locatie instellingen (location settings).</string>
+ <string name="sync_foreign_files_forgotten_ticker">Een paar lokale bestanden werden vergeten</string>
+ <string name="sync_foreign_files_forgotten_content">%1$d bestanden uit de %2$s map konden niet worden gekopieerd naar</string>
+ <string name="sync_foreign_files_forgotten_explanation">Vanaf versie 1.3.16, worden bestanden die vanaf dit apparaat worden ge-uploaded ook gekopieerd naar de lokale %1$s map om gegevensverlies te voorkomen als een enkel bestand wordt gesynchroniseerd met meerdere accounts.\nDoor deze aanpassing werden alle bestanden die met een eerdere versie zijn ge-uploaded gekopieerd naar de %2$s map. Maar een fout voorkwam het succesvol afronden van deze actie tijdens het synchroniseren. U kunt de/het bestand(en) laten staan zoals ze nu zijn en de link naar %3$s verwijderen, of u kunt de bestanden verplaatsen naar de %1$s map en de link naar %4$s laten staan.\nHieronder staan de lokale bestanden en de externe bestanden in %5$s waar ze naar verwezen.</string>
+ <string name="sync_current_folder_was_removed">Map %1$s bestaat niet meer</string>
+ <string name="foreign_files_move">Alle verplaatsen</string>
+ <string name="foreign_files_success">Alle bestanden zijn verplaatst</string>
+ <string name="foreign_files_fail">Een paar bestanden konden niet worden verplaatst</string>
+ <string name="foreign_files_local_text">Lokaal: %1$s</string>
+ <string name="foreign_files_remote_text">Extern: %1$s</string>
+ <string name="upload_query_move_foreign_files">Er is niet genoeg ruimte om de gekopieerde bestanden ook te plaatsen in map %1$s. Wilt u ze erheen verplaatsten? </string>
<string name="pincode_enter_pin_code">Voer App PIN in</string>
- <string name="pincode_enter_new_pin_code">Voer nieuwe App PIN in</string>
<string name="pincode_configure_your_pin">Voer App PIN in</string>
<string name="pincode_configure_your_pin_explanation">De PIN wordt steeds opnieuw gevraagd als de app wordt gestart</string>
<string name="pincode_reenter_your_pincode">Voer App PIN opnieuw in</string>
<string name="pincode_remove_your_pincode">Verwijder App PIN</string>
<string name="pincode_mismatch">App PIN\'s komen niet overeen</string>
- <string name="pincode_wrong">Foutieve ownCloud applicatie PIN</string>
- <string name="pincode_removed">ownCloud App PIN verwijderd</string>
- <string name="pincode_stored">ownCloud App PIN opgeslagen</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 minuten</item>
- <item>30 minuten</item>
- <item>60 mintuen</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_wrong">Foutieve applicatie PIN</string>
+ <string name="pincode_removed">App PIN verwijderd</string>
+ <string name="pincode_stored">App PIN opgeslagen</string>
+ <string name="media_notif_ticker">%1$s muziekspeler</string>
+ <string name="media_state_playing">%1$s (speelt)</string>
+ <string name="media_state_loading">%1$s (laden)</string>
+ <string name="media_event_done">%1$s playback geëindigd</string>
+ <string name="media_err_nothing_to_play">Geen mediabestand gevonden</string>
+ <string name="media_err_no_account">Geen account opgegeven</string>
+ <string name="media_err_not_in_owncloud">Bestand niet in een geldig account</string>
+ <string name="media_err_unsupported">Niet ondersteunde media codec</string>
+ <string name="media_err_io">Mediabestand kon niet worden gelezen</string>
+ <string name="media_err_malformed">Mediabestand niet goed gecodeerd</string>
+ <string name="media_err_timeout">Time-out tijdens het spelen</string>
+ <string name="media_err_invalid_progressive_playback">Mediabestand kan niet worden gestreamd</string>
+ <string name="media_err_unknown">Mediabestand kan niet worden afgespeeld met de standaard mediaplayer</string>
+ <string name="media_err_security_ex">Beveiligingsfout bij afspelen %1$s</string>
+ <string name="media_err_io_ex">Invoerfout bij afspelen %1$1s</string>
+ <string name="media_err_unexpected">Onverwachte fout bij afspelen %1$s</string>
+ <string name="media_rewind_description">terugpoel knop</string>
+ <string name="media_play_pause_description">Speel of pauze knop</string>
+ <string name="media_forward_description">Doorspoel knop</string>
<string name="auth_trying_to_login">Proberen om in te loggen...</string>
<string name="auth_no_net_conn_title">Geen netwerkverbinding</string>
- <string name="auth_no_net_conn_message">Er kon geen netwerkverbinding worden gevonden, controleer je internet verbinding en probeer het opnieuw.</string>
- <string name="auth_connect_anyway">Toch verbinden</string>
<string name="auth_nossl_plain_ok_title">Veilige verbinding niet beschikbaar.</string>
- <string name="auth_nossl_plain_ok_message">De applicatie kon geen beveiligde verbinding met de server maken. Er is echter wel een onbeveiligde verbinding beschikbaar. Je kunt verdergaan of annuleren.</string>
<string name="auth_connection_established">Verbinding tot stand gebracht</string>
<string name="auth_testing_connection">Probeer verbinding...</string>
- <string name="auth_not_configured_title">Foutieve ownCloud configuratie</string>
- <string name="auth_not_configured_message">Het lijkt erop dat je ownCloud instantie niet correct geconfigureerd is. Neem contact op met je beheerder voor meer details.</string>
+ <string name="auth_not_configured_title">Foutieve server configuratie</string>
+ <string name="auth_account_not_new">Er bestaat al een account voor deze gebruiker en server op dit apparaat.</string>
+ <string name="auth_account_not_the_same">De opgegeven gebruiker komt niet overeen met de gebruiker van dit account</string>
<string name="auth_unknown_error_title">Onbekende fout opgetreden!</string>
- <string name="auth_unknown_error_message">Er heeft zich een onbekend fout voorgedaan. Neem alstublieft contact op met de beheerders en voeg de logs toe van uw apparaat.</string>
<string name="auth_unknown_host_title">Kon geen host vinden</string>
- <string name="auth_unknown_host_message">Kon de ingevoerde host niet vinden. Controleer de hostnaam en servertoegankelijkheid en probeer opnieuw.</string>
- <string name="auth_incorrect_path_title">ownCloud instantie niet gevonden</string>
- <string name="auth_incorrect_path_message">De applicatie kon geen instantie van ownCloud vinden op de opgegeven locatie. Controleer het pad en probeer opnieuw.</string>
+ <string name="auth_incorrect_path_title">Server instantie niet gevonden</string>
<string name="auth_timeout_title">De server had te lang nodig om te reageren</string>
<string name="auth_incorrect_address_title">Misvormde URL</string>
<string name="auth_ssl_general_error_title">SSL initialisatie mislukt</string>
- <string name="auth_ssl_unverified_server_title">Niet geverifieerde SSL server identiteit</string>
- <string name="auth_bad_oc_version_title">Onherkende ownCloud server versie</string>
+ <string name="auth_ssl_unverified_server_title">Kon de identiteit van de SSL server niet verifiëren</string>
+ <string name="auth_bad_oc_version_title">Onherkende server versie</string>
<string name="auth_wrong_connection_title">Kon verbinding niet tot stand brengen.</string>
<string name="auth_secure_connection">Veilige verbinding tot stand gebracht</string>
- <string name="auth_login_details">Inloggegevens</string>
- <string name="auth_unauthorized">login / password niet juist</string>
- <string name="auth_not_found">Verkeerde pad opgegeven</string>
- <string name="auth_internal">Interne server fout, code %1$d</string>
- <string name="crashlog_message">De applicatie is onverwacht beëindigd. Wilt je een crash report versturen?</string>
- <string name="crashlog_send_report">Rapport verzenden</string>
- <string name="crashlog_dont_send_report">Rapport niet verzenden</string>
- <string name="extensions_avail_title">Uitbreidingen aanwezig!</string>
- <string name="extensions_avail_message">Zo te zien ondersteunt je ownCloud instantie geavanceerde uitbreidingen. Wilt je deze uitbreidingen in Android zichtbaar maken?</string>
+ <string name="auth_unauthorized">Verkeerde gebruikersnaam of wachtwoord</string>
+ <string name="auth_oauth_error">Authorisatie niet succesvol</string>
+ <string name="auth_oauth_error_access_denied">Toegang geweigerd door authorizatieserver</string>
+ <string name="auth_wtf_reenter_URL">Onverwachte toestand; voer a.u.b de server-URL nogmaals in.</string>
+ <string name="auth_expired_oauth_token_toast">Uw autorisatie is verstreken. Autoriseer opnieuw.</string>
+ <string name="auth_expired_basic_auth_toast">Geef het huidige wachtwoord op</string>
+ <string name="auth_expired_saml_sso_token_toast">Uw sessie is verstreken. Verbind opnieuw</string>
+ <string name="auth_connecting_auth_server">Verbinden met authenticatieserver...</string>
+ <string name="auth_unsupported_auth_method">De server ondersteunt deze authenticatiemethode niet</string>
+ <string name="auth_unsupported_multiaccount">%1$s ondersteunt het gebruik van meerdere accounts niet</string>
+ <string name="auth_can_not_auth_against_server">Kan niet authenticeren tegen deze server</string>
<string name="fd_keep_in_sync">Houd bestand actueel</string>
- <string name="common_share">Delen</string>
<string name="common_rename">Hernoemen</string>
<string name="common_remove">Verwijderen</string>
<string name="confirmation_remove_alert">Wilt je werkelijk %1$s verwijderen?</string>
<string name="sync_file_fail_msg">Extern bestand kon niet worden gecontroleerd</string>
<string name="sync_file_nothing_to_do_msg">Bestandsinhoud is al gesynchroniseerd</string>
<string name="create_dir_fail_msg">Map kon niet worden aangemaakt</string>
+ <string name="filename_forbidden_characters">Verboden tekens: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Even geduld</string>
<string name="filedisplay_unexpected_bad_get_content">Onverwacht probleem; probeer een andere app om het bestand te selecteren</string>
<string name="filedisplay_no_file_selected">Er werd geen bestand geselecteerd</string>
- <string name="ssl_validator_title">Waarschuwing</string>
+ <string name="activity_chooser_title">Verstuur link naar ...</string>
+ <string name="oauth_check_onoff">Inloggen met oAuth2</string>
+ <string name="oauth_login_connection">Verbinden met oAuth2-server.</string>
<string name="ssl_validator_header">De identiteit van de site kan niet worden gecontroleerd</string>
<string name="ssl_validator_reason_cert_not_trusted">- Het server certificaat wordt niet vertrouwd</string>
<string name="ssl_validator_reason_cert_expired">- Het server certificaat is verlopen</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- Het server certificaat is te recent</string>
<string name="ssl_validator_reason_hostname_not_verified">- De URL komt niet overeen met de hostname in het certificaat</string>
- <string name="ssl_validator_certificate_not_available">Het server certificaat kon niet opgevraagd worden</string>
<string name="ssl_validator_question">Wil je dit certificaat alsnog vertrouwen?</string>
<string name="ssl_validator_not_saved">Het certificaat kon niet worden opgeslagen</string>
<string name="ssl_validator_btn_details_see">Details</string>
<string name="ssl_validator_label_validity_to">Aan:</string>
<string name="ssl_validator_label_signature">Handtekening:</string>
<string name="ssl_validator_label_signature_algorithm">Algoritme:</string>
- <string name="text_placeholder">Dit is een gereserveerde ruimte</string>
+ <string name="ssl_validator_null_cert">Het certificaat kon niet worden getoond.</string>
+ <string name="ssl_validator_no_info_about_error">- Geen informatie over de fout</string>
+ <string name="placeholder_sentence">Dit is een plaatshouder</string>
+ <string name="placeholder_filename">plaatshouder.txt</string>
+ <string name="placeholder_filetype">PNG Afbeelding</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Upload afbeeldingen alleen via WiFi</string>
<string name="instant_upload_path">/InstantUpload</string>
<string name="conflict_title">Update conflict</string>
<string name="conflict_keep_both">Beide bewaren</string>
<string name="conflict_overwrite">Overschrijven</string>
<string name="conflict_dont_upload">Niet uploaden</string>
+ <string name="preview_image_description">Afbeelding voorbeeld</string>
+ <string name="preview_image_error_unknown_format">Deze afbeelding kan niet weergegeven worden</string>
+ <string name="error__upload__local_file_not_copied">%1$s kon niet worden gekopieerd naar de %2$s lokale map</string>
+ <string name="actionbar_failed_instant_upload">Mislukt InstantUpload</string>
+ <string name="failed_upload_headline_text">Mislukte directe uploads</string>
+ <string name="failed_upload_headline_hint">Samenvatting van alle mislukte directe uploads</string>
+ <string name="failed_upload_all_cb">alles selecteren</string>
+ <string name="failed_upload_headline_retryall_btn">opnieuw proberen alles te selecteren</string>
+ <string name="failed_upload_headline_delete_all_btn">verwijderen alle geselecteerde van de upload wachtrij</string>
+ <string name="failed_upload_retry_text">probeer de afbeelding opnieuw te uploaden:</string>
+ <string name="failed_upload_load_more_images">Laadt meer Afbeeldingen</string>
+ <string name="failed_upload_retry_do_nothing_text">doe niks, u bent niet online voor directe upload</string>
+ <string name="failed_upload_failure_text">Mislukkings Bericht:</string>
+ <string name="failed_upload_quota_exceeded_text">Controleer uw server instellingen, misschien is uw quota overschreden.</string>
+ <string name="share_link_file_no_exist">Kan dit bestand of deze map niet delen. Controleer of dit object wel bestaat.</string>
+ <string name="share_link_file_error">Er trad een fout op bij uw poging dit bestand of deze map te delen</string>
+ <string name="unshare_link_file_no_exist">Kan delen van dit bestand of deze map niet beëindigen. Het object bestaat niet.</string>
+ <string name="unshare_link_file_error">Er trad een fout op bij uw poging het delen van dit bestand of deze map te beëindigen</string>
+ <string name="activity_chooser_send_file_title">Versturen</string>
+ <string name="copy_link">Link kopiëren</string>
+ <string name="clipboard_text_copied">Gekopieerd naar het klembord</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="main_files">Filer</string>
- <string name="main_music">Musikk</string>
- <string name="main_contacts">Kotaktar</string>
- <string name="main_settings">Innstillingar</string>
+ <string name="actionbar_sync">Oppdater konto</string>
<string name="actionbar_upload">Last opp</string>
+ <string name="actionbar_upload_from_apps">Innhald frå andre program</string>
<string name="actionbar_upload_files">Filer</string>
<string name="actionbar_settings">Innstillingar</string>
+ <string name="actionbar_send_file">Send</string>
+ <string name="prefs_category_general">Generelt</string>
+ <string name="prefs_category_more">Meir</string>
+ <string name="prefs_accounts">Kontoar</string>
+ <string name="prefs_instant_upload_summary">Last opp kamerabilete med ein gong du tek dei</string>
+ <string name="prefs_help">Hjelp</string>
+ <string name="prefs_imprint">Impressum</string>
<string name="auth_username">Brukarnamn</string>
<string name="auth_password">Passord</string>
<string name="sync_string_files">Filer</string>
- <string name="setup_hint_username">Brukarnamn</string>
- <string name="setup_hint_password">Passord</string>
+ <string name="setup_btn_connect">Kopla til</string>
<string name="uploader_btn_upload_text">Last opp</string>
+ <string name="uploader_wrn_no_account_title">Fann ingen konto</string>
+ <string name="uploader_wrn_no_account_setup_btn_text">Oppsett</string>
+ <string name="uploader_wrn_no_account_quit_btn_text">Avslutt</string>
+ <string name="uploader_wrn_no_content_title">Inga innhald å lasta opp</string>
+ <string name="uploader_wrn_no_content_text">Mottok ikkje noko innhald. Ingenting å lasta opp.</string>
+ <string name="uploader_info_uploading">Lastar opp</string>
+ <string name="filedetails_select_file">Trykk på ei fil for å visa meir informasjon.</string>
+ <string name="filedetails_size">Storleik:</string>
+ <string name="filedetails_type">Type:</string>
+ <string name="filedetails_created">Oppretta:</string>
+ <string name="filedetails_modified">Endra:</string>
<string name="filedetails_download">Last ned</string>
- <string name="common_cancel">Kanseller</string>
+ <string name="common_yes">Ja</string>
+ <string name="common_no">Nei</string>
+ <string name="common_ok">Greitt</string>
+ <string name="common_cancel_download">Avbryt nedlasting</string>
+ <string name="common_cancel_upload">Avbryt opplasting</string>
+ <string name="common_cancel">Avbryt</string>
+ <string name="common_save_exit">Lagra & avslutt</string>
<string name="common_error">Feil</string>
- <string name="sync_string_contacts">Kotaktar</string>
+ <string name="about_title">Om</string>
+ <string name="change_password">Endra passord</string>
+ <string name="delete_account">Slett konto</string>
+ <string name="create_account">Opprett konto</string>
+ <string name="upload_chooser_title">Last opp frå …</string>
+ <string name="uploader_upload_in_progress_ticker">Lastar opp …</string>
+ <string name="uploader_upload_in_progress_content">%1$d%% lastar opp %2$s</string>
+ <string name="uploader_upload_succeeded_ticker">Opplasting fullført</string>
+ <string name="uploader_upload_failed_ticker">Feil ved opplasting</string>
+ <string name="uploader_upload_failed_content_single">Klarte ikkje å lasta %1$s ferdig opp</string>
+ <string name="downloader_download_in_progress_ticker">Lastar ned …</string>
+ <string name="downloader_download_in_progress_content">%1$d%% lastar ned %2$s</string>
+ <string name="downloader_download_failed_ticker">Feil ved nedlasting</string>
+ <string name="downloader_download_failed_content">Klarte ikkje å lasta %1$s ferdig ned</string>
+ <string name="common_choose_account">Vel konto</string>
+ <string name="sync_fail_ticker">Feil ved synkronisering</string>
+ <string name="sync_fail_content">Klarte ikkje å synkronisera ferdig %1$s</string>
+ <string name="pincode_enter_pin_code">Ver venleg og skriv inn programpinkoden</string>
+ <string name="auth_no_net_conn_title">Inga nettilkopling</string>
+ <string name="auth_nossl_plain_ok_title">Trygg tilkopling ikkje tilgjengeleg.</string>
+ <string name="auth_connection_established">Tilkopling oppretta</string>
+ <string name="auth_unknown_error_title">Ein ukjend feil oppstod!</string>
+ <string name="auth_unknown_host_title">Klarte ikkje å finna tenaren</string>
+ <string name="auth_timeout_title">Tenaren brukte for lang tid på å svara</string>
+ <string name="auth_incorrect_address_title">Ugyldig URL</string>
+ <string name="auth_ssl_general_error_title">Feil ved SSL-oppstart</string>
+ <string name="auth_wrong_connection_title">Klarte ikkje å oppretta ei tilkopling</string>
+ <string name="auth_secure_connection">Trygg tilkopling oppretta</string>
+ <string name="fd_keep_in_sync">Hald fila oppdatert</string>
+ <string name="common_rename">Endra namn</string>
+ <string name="common_remove">Fjern</string>
+ <string name="confirmation_remove_alert">Vil du verkeleg fjerna %1$s?</string>
+ <string name="confirmation_remove_local">Berre lokalt</string>
+ <string name="confirmation_remove_remote">Fjern frå tenaren</string>
+ <string name="rename_server_fail_msg">Klarte ikkje å fullføra omdøyping</string>
+ <string name="wait_a_moment">Vent litt</string>
+ <string name="filedisplay_no_file_selected">Inga fil valt</string>
+ <string name="ssl_validator_header">Klarte ikkje å stadfesta identiteten til nettstaden</string>
+ <string name="ssl_validator_reason_cert_not_trusted">– Tenarsertifikatet er ikkje klarert</string>
+ <string name="ssl_validator_reason_cert_expired">– Tenarsertifikatet er utløpt</string>
+ <string name="ssl_validator_reason_hostname_not_verified">– URL-en stemmer ikkje med tenarnamnet i sertifikatet</string>
+ <string name="ssl_validator_question">Vil du stola på dette sertifikatet uansett?</string>
+ <string name="ssl_validator_not_saved">Klarte ikkje å lagra sertifikatet</string>
+ <string name="instant_upload_on_wifi">Berre last opp bilete over WiFi</string>
+ <string name="activity_chooser_send_file_title">Send</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Senhal :</string>
- <string name="main_login">Nom o escais :</string>
- <string name="main_button_login">Login</string>
- <string name="main_welcome">Planvengut dins mon ownCloud</string>
- <string name="main_files">Fichièrs</string>
- <string name="main_music">Musica</string>
- <string name="main_contacts">Contactes</string>
- <string name="main_calendar">Calendièr</string>
- <string name="main_bookmarks">Marcapaginas</string>
- <string name="main_settings">Configuracion</string>
- <string name="main_tit_accsetup">Compte de configuracion</string>
- <string name="actionbar_sync">Refresca</string>
<string name="actionbar_upload">Amontcarga</string>
<string name="actionbar_upload_files">Fichièrs</string>
- <string name="actionbar_mkdir">Crea un repertòri</string>
- <string name="actionbar_search">Cèrca</string>
<string name="actionbar_settings">Configuracion</string>
<string name="prefs_category_general">General</string>
- <string name="prefs_category_trackmydevice">Traqua lo daquòs</string>
- <string name="prefs_add_session">Apond una session novèla</string>
- <string name="prefs_create_img_thumbnails">Crea imatgonels</string>
- <string name="prefs_select_oc_account">Selecciona un compte</string>
- <string name="prefs_summary_select_oc_account">Causís, quines comptes las apps poirián utilizar.</string>
- <string name="prefs_trackmydevice">Traqua lo daquòs</string>
+ <string name="prefs_category_more">Mai d\'aquò</string>
<string name="prefs_accounts">Comptes</string>
<string name="prefs_manage_accounts">Maneja comptes</string>
- <string name="auth_host_url">URL del ownCloud</string>
+ <string name="prefs_help">Ajuda</string>
<string name="auth_username">Nom d\'usancièr</string>
<string name="auth_password">Senhal</string>
- <string name="new_session_uri_error">As donat un URL fals</string>
- <string name="new_session_session_name_error">Nom de session pas corrècte</string>
<string name="sync_string_files">Fichièrs</string>
- <string name="setup_hint_username">Non d\'usancièr</string>
- <string name="setup_hint_password">Senhal</string>
- <string name="setup_hint_address">Adreiça web</string>
- <string name="setup_hint_show_password">Mòstra lo senhal ?</string>
- <string name="setup_title">Connecta a ton ownCloud</string>
<string name="setup_btn_connect">Connecta</string>
<string name="uploader_btn_upload_text">Amontcarga</string>
<string name="uploader_wrn_no_account_title">Cap de compte trobat</string>
<string name="filedetails_created">Creat :</string>
<string name="filedetails_modified">Modificat :</string>
<string name="filedetails_download">Avalcarga</string>
- <string name="filedetails_sync_file">Refresca</string>
- <string name="filedetails_redownload">Torna avalcargar</string>
- <string name="filedetails_open">Dubrís</string>
<string name="common_yes">Òc</string>
<string name="common_no">Non</string>
<string name="common_ok">D\'accòrdi</string>
<string name="common_cancel">Annula</string>
<string name="common_error">Error</string>
<string name="about_title">A prepaus</string>
+ <string name="change_password">Cambia lo senhal</string>
<string name="delete_account">Escafa lo compte</string>
<string name="create_account">Crea un compte</string>
<string name="upload_chooser_title">Avalcarga dempuèi ...</string>
- <string name="uploader_info_dirname">Nom de repertòri</string>
<string name="uploader_upload_in_progress_ticker">Al avalcargar ...</string>
<string name="uploader_upload_succeeded_ticker">Capitada d\'avalcargar</string>
<string name="common_choose_account">Causís lo compte</string>
- <string name="sync_string_contacts">Contactes</string>
- <string name="use_ssl">Utiliza una conneccion segura</string>
<string name="pincode_enter_pin_code">Dintras ton PIN d\'App, se te plai</string>
- <string name="auth_login_details">Detalhs de login</string>
- <string name="crashlog_send_report">Rapòrt mandat</string>
- <string name="crashlog_dont_send_report">Mandes pas de rapòrt</string>
- <string name="extensions_avail_title">Extensions disponibles !</string>
- <string name="common_share">Parteja</string>
<string name="common_rename">Torna nomenar</string>
</resources>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="about_android">%1$s ਐਡਰਾਇਡ ਐਪ</string>
+ <string name="about_version">ਵਰਜਨ %1$s</string>
+ <string name="actionbar_sync">ਅਕਾਊਂਟ ਤਾਜ਼ਾ ਕਰੋ</string>
+ <string name="actionbar_upload">ਅੱਪਲੋਡ</string>
+ <string name="actionbar_upload_from_apps">ਹੋਰ ਐਪਸ ਤੋਂ ਸਮੱਗਰੀ</string>
+ <string name="actionbar_upload_files">ਫਾਇਲਾਂ</string>
+ <string name="actionbar_open_with">ਇਸ ਨਾਲ ਖੋਲ੍ਹੋ</string>
+ <string name="actionbar_settings">ਸੈਟਿੰਗ</string>
+ <string name="actionbar_see_details">ਵੇਰਵ</string>
+ <string name="actionbar_send_file">ਭੇਜੋ</string>
+ <string name="prefs_category_general">ਆਮ</string>
+ <string name="prefs_accounts">ਅਕਾਊਂਟ</string>
+ <string name="prefs_log_title">ਲਾਗ ਰੱਖਣਾ ਚਾਲੂ</string>
+ <string name="prefs_log_title_history">ਲਾਗ ਰੱਖਣ ਅਤੀਤ</string>
+ <string name="prefs_log_delete_history_button">ਅਤੀਤ ਹਟਆਓ</string>
+ <string name="auth_username">ਯੂਜ਼ਰ-ਨਾਂ</string>
+ <string name="auth_password">ਪਾਸਵਰ</string>
+ <string name="auth_register">%1$s ਲਈ ਨਵੇਂ ਹੋ?</string>
+ <string name="sync_string_files">ਫਾਇਲਾਂ</string>
+ <string name="setup_btn_connect">ਕੁਨੈਕਟ</string>
+ <string name="uploader_btn_upload_text">ਅੱਪਲੋਡ</string>
+ <string name="uploader_wrn_no_account_title">ਕੋਈ ਅਕਾਊਂਟ ਨਹੀਂ ਲੱਭਾ</string>
+ <string name="uploader_wrn_no_account_setup_btn_text">ਸੈਟਅੱਪ</string>
+ <string name="uploader_wrn_no_account_quit_btn_text">ਬਾਹਰ</string>
+ <string name="uploader_wrn_no_content_title">ਅੱਪਲੋਡ ਕਰਨ ਲਈ ਕੋਈ ਸਮੱਗਰੀ ਨਹੀਂ</string>
+ <string name="uploader_wrn_no_content_text">ਕੋਈ ਸਮੱਗਰੀ ਨਹੀਂ ਮਿਲੀ। ਅੱਪਲੋਡ ਕਰਨ ਲਈ ਕੁਝ ਨਹੀਂ ਹੈ।</string>
+ <string name="uploader_info_uploading">ਅੱਪਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</string>
+ <string name="filedetails_select_file">ਹੋਰ ਜਾਣਕਾਰੀ ਵੇਖਣ ਲਈ ਫਾਇਲ ਉੱਤੇ ਛੂਹੋ</string>
+ <string name="filedetails_size">ਆਕਾਰ:</string>
+ <string name="filedetails_type">ਕਿਸਮ:</string>
+ <string name="filedetails_created">ਬਣਾਈ:</string>
+ <string name="filedetails_modified">ਸੋਧ ਕੀਤੀ:</string>
+ <string name="filedetails_download">ਡਾਊਨਲੋਡ</string>
+ <string name="filedetails_sync_file">ਫਾਇਲ ਤਾਜ਼ਾ ਕਰੋ</string>
+ <string name="common_yes">ਹਾਂ</string>
+ <string name="common_no">ਨਹੀਂ</string>
+ <string name="common_ok">ਠੀਕ ਹੈ</string>
+ <string name="common_cancel_download">ਡਾਊਨਲੋਡ ਕਰਨਾ ਰੱਦ ਕਰੋ</string>
+ <string name="common_cancel_upload">ਅੱਪਲੋਡ ਰੱਦ ਕਰੋ</string>
+ <string name="common_cancel">ਰੱਦ ਕਰੋ</string>
+ <string name="common_save_exit">ਸੰਭਾਲੋ ਅਤੇ ਬੰਦ ਕਰੋ</string>
+ <string name="common_error">ਗਲਤੀ</string>
+ <string name="common_loading">...ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</string>
+ <string name="common_error_unknown">ਅਣਜਾਣ ਗਲਤੀ</string>
+ <string name="about_title">ਇਸ ਬਾਰੇ</string>
+ <string name="change_password">ਪਾਸਵਰਡ ਬਦਲੋ</string>
+ <string name="delete_account">ਅਕਾਊਂਟ ਹਟਾਓ</string>
+ <string name="create_account">ਅਕਾਊਂਟ ਬਣਾਓ</string>
+ <string name="upload_chooser_title">... ਤੋਂ ਅੱਪਲੋਡ</string>
+ <string name="uploader_upload_in_progress_ticker">... ਅੱਪਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</string>
+ <string name="uploader_upload_in_progress_content">%1$d%% ਅੱਪਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ %2$s</string>
+ <string name="uploader_upload_succeeded_ticker">ਅੱਪਲੋਡ ਸਫ਼ਲ ਹੈ</string>
+ <string name="uploader_upload_failed_ticker">ਅੱਪਲੋਡ ਫੇਲ੍ਹ ਹੈ</string>
+ <string name="uploader_upload_failed_content_single">%1$s ਦੇ ਅੱਪਲੋਡ ਨੂੰ ਠੀਕ ਤਰ੍ਹਾਂ ਪੂਰਾ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ</string>
+ <string name="downloader_download_in_progress_ticker">... ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</string>
+ <string name="downloader_not_downloaded_yet">ਹਾਲੇ ਡਾਊਨਲੋਡ ਨਹੀਂ</string>
+ <string name="common_choose_account">ਅਕਾਊਂਟ ਚੁਣੋ</string>
+ <string name="sync_fail_ticker">ਸੈਕਰੋਨਾਈਜ਼ ਕਰਨ ਲਈ ਫੇਲ੍ਹ</string>
+ <string name="sync_fail_content_unauthorized">%1$s ਲਈ ਗਲਤ ਪਾਸਵਰਡ</string>
+ <string name="foreign_files_move">ਸਭ ਭੇਜੋ</string>
+ <string name="foreign_files_success">ਸਭ ਫਾਇਲਾਂ ਨੂੰ ਭੇਜਿਆ ਗਿਆ</string>
+ <string name="foreign_files_fail">ਕੁਝ ਫਾਇਲਾਂ ਨੂੰ ਭੇਜਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ</string>
+ <string name="foreign_files_local_text">ਲੋਕਲ: %1$s</string>
+ <string name="foreign_files_remote_text">ਰਿਮੋਟ: %1$s</string>
+ <string name="pincode_enter_pin_code">ਆਪਣਾ ਐਪ ਪਿੰਨ ਦਿਉ ਜੀ</string>
+ <string name="media_notif_ticker">%1$s ਸੰਗੀਤ ਪਲੇਅਰ</string>
+ <string name="media_state_playing">%1$s (ਚੱਲਦਾ ਹੈ)</string>
+ <string name="media_state_loading">%1$s (ਲੋਡ ਹੁੰਦਾ ਹੈ)</string>
+ <string name="media_event_done">%1$s ਚੱਲਣਾ ਬੰਦ</string>
+ <string name="media_err_nothing_to_play">ਕੋਈ ਮੀਡਿਆ ਫਾਇਲ ਨਹੀਂ ਲੱਭੀ</string>
+ <string name="auth_trying_to_login">...ਲਾਗਇਨ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਜਾਰੀ</string>
+ <string name="auth_no_net_conn_title">ਕੋਈ ਨੈੱਟਵਰਕ ਕੁਨੈਕਸ਼ਨ ਨਹੀਂ ਹੈ</string>
+ <string name="auth_nossl_plain_ok_title">ਸੁਰੱਖਿਅਤ ਕੁਨੈਕਸ਼ਨ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ।</string>
+ <string name="auth_connection_established">ਕੁਨੈਕਸ਼ਨ ਬਣਾਇਆ ਗਿਆ ਹੈ</string>
+ <string name="auth_testing_connection">...ਕੁਨੈਕਸ਼ਨ ਟੈਸਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</string>
+ <string name="auth_unknown_error_title">ਅਣਜਾਣ ਗਲਤੀ ਆਈ ਹੈ!</string>
+ <string name="auth_unknown_host_title">ਹੋਸਟ ਨਹੀਂ ਲੱਭਿਆ ਜਾ ਸਕਿਆ</string>
+ <string name="auth_ssl_general_error_title">SSL ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਫੇਲ੍ਹ ਹੈ</string>
+ <string name="auth_secure_connection">ਸੁਰੱਖਿਅਤ ਕੁਨੈਕਸ਼ਨ ਬਣਾਇਆ ਗਿਆ ਹੈ</string>
+ <string name="auth_unauthorized">ਗਲਤ ਯੂਜ਼ਰ-ਨਾਂ ਜਾਂ ਪਾਸਵਰਡ</string>
+ <string name="auth_expired_basic_auth_toast">ਆਪਣਾ ਮੌਜੂਦਾ ਪਾਸਵਰਡ ਦਿਉ ਜੀ</string>
+ <string name="fd_keep_in_sync">ਫਾਇਲ ਨੂੰ ਅੱਪ ਟੂ ਡੇਟ ਰੱਖੋ</string>
+ <string name="common_rename">ਨਾਂ ਬਦਲੋ</string>
+ <string name="common_remove">ਹਟਾਓ</string>
+ <string name="confirmation_remove_alert">ਕੀ ਤੁਸੀਂ %1$s ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?</string>
+ <string name="confirmation_remove_local">ਕੇਵਲ ਲੋਕਲ</string>
+ <string name="confirmation_remove_remote">ਸਰਵਰ ਤੋਂ ਹਟਾਓ</string>
+ <string name="confirmation_remove_remote_and_local">ਰਿਮੋਟ ਤੇ ਲੋਕਲ</string>
+ <string name="wait_a_moment">ਪਲ਼ ਭਰ ਲਈ ਉਡੀਕੋ</string>
+ <string name="filedisplay_no_file_selected">ਕੋਈ ਫਾਇਲ ਨਹੀਂ ਚੁਣੀ ਗਈ</string>
+ <string name="ssl_validator_header">ਇਹ ਸਾਈਟ ਦੀ ਪਛਾਣ ਦੀ ਜਾਂਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ ਹੈ</string>
+ <string name="ssl_validator_reason_cert_not_trusted">- ਸਰਵਰ ਸਰਟੀਫਿਕੇਟ ਭਰੋਸੇਯੋਗ (ਟਰੱਸਟਡ) ਨਹੀਂ ਹੈ</string>
+ <string name="ssl_validator_reason_cert_expired">- ਸਰਵਰ ਸਰਟੀਫਿਕੇਟ ਦੀ ਮਿਆਦ ਪੁੱਗ ਗਈ ਹੈ</string>
+ <string name="ssl_validator_not_saved">ਸਰਟੀਫਿਕੇਟ ਨੂੰ ਸੰਭਾਲਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ</string>
+ <string name="ssl_validator_btn_details_see">ਵੇਰਵਾ</string>
+ <string name="ssl_validator_btn_details_hide">ਓਹਲੇ</string>
+ <string name="ssl_validator_label_subject">ਜਾਰੀ ਕੀਤਾ:</string>
+ <string name="ssl_validator_label_issuer">ਜਾਰੀ ਕਰਤਾ:</string>
+ <string name="ssl_validator_label_CN">ਆਮ ਨਾਂ:</string>
+ <string name="ssl_validator_label_O">ਸੰਗਠਨ:</string>
+ <string name="ssl_validator_label_C">ਦੇਸ਼:</string>
+ <string name="ssl_validator_label_ST">ਸੂਬਾ:</string>
+ <string name="ssl_validator_label_L">ਟਿਕਾਣਾ:</string>
+ <string name="ssl_validator_label_validity">ਵੈਧਤਾ:</string>
+ <string name="ssl_validator_label_validity_from">ਵਲੋਂ:</string>
+ <string name="ssl_validator_label_validity_to">ਵੱਲ:</string>
+ <string name="ssl_validator_label_signature">ਦਸਤਖਤ:</string>
+ <string name="ssl_validator_label_signature_algorithm">ਐਲਗੋਰਿਥਮ:</string>
+ <string name="placeholder_filetype">PNG ਚਿੱਤ</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
+ <string name="instant_upload_on_wifi">ਤਸਵੀਰਾਂ ਨੂੰ ਵਾਈ-ਫਾਈ ਰਾਹੀਂ ਹੀ ਅੱਪਲੋਡ ਕਰੋ</string>
+ <string name="conflict_keep_both">ਦੋਵੇਂ ਰੱਖੋ</string>
+ <string name="conflict_overwrite">ਉੱਤੇ ਲਿਖੋ</string>
+ <string name="conflict_dont_upload">ਅੱਪਲੋਡ ਨਾ ਕਰੋ</string>
+ <string name="preview_image_description">ਚਿੱਤਰ ਝਲਕ</string>
+ <string name="failed_upload_all_cb">ਸਭ ਚੁਣੋ</string>
+ <string name="activity_chooser_send_file_title">ਭੇਜੋ</string>
+</resources>
+++ /dev/null
-<?xml version='1.0' encoding='UTF-8'?>
-<resources>
- <string name="main_login">Nazwa użytkownika</string>
- <string name="main_music">Muzyka</string>
- <string name="main_settings">Ustawienia</string>
- <string name="actionbar_settings">Ustawienia</string>
- <string name="auth_username">Nazwa użytkownika</string>
- <string name="setup_hint_username">Nazwa użytkownika</string>
- <string name="filedetails_open">Otwórz</string>
-</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Hasło:</string>
- <string name="main_login">Nazwa użytkownika:</string>
- <string name="main_button_login">Zaloguj</string>
- <string name="main_welcome">Witaj</string>
- <string name="main_files">Pliki</string>
- <string name="main_music">Muzyka</string>
- <string name="main_contacts">Kontakty</string>
- <string name="main_calendar">Kalendarz</string>
- <string name="main_bookmarks">Zakładki</string>
- <string name="main_settings">Ustawienia</string>
- <string name="main_tit_accsetup">Załóż konto</string>
- <string name="main_wrn_accsetup">Nie wykryto kont ownCloud. Aby korzystać z tej aplikacji, musisz utworzyć konto.</string>
- <string name="about_message">%1$s Android App⏎ ⏎ wersja: %2$s</string>
- <string name="actionbar_sync">Odśwież</string>
+ <string name="about_android">%1$s Aplikacja Android</string>
+ <string name="about_version">wersja %1$s</string>
+ <string name="actionbar_sync">Odśwież konto</string>
<string name="actionbar_upload">Wyślij plik</string>
<string name="actionbar_upload_from_apps">Zasoby innych aplikacji</string>
<string name="actionbar_upload_files">Pliki</string>
- <string name="actionbar_mkdir">Nowy katalog</string>
- <string name="actionbar_search">Szukaj</string>
+ <string name="actionbar_open_with">Otwórz za pomocą</string>
+ <string name="actionbar_mkdir">Nowy folder</string>
<string name="actionbar_settings">Ustawienia</string>
+ <string name="actionbar_see_details">Szczegóły</string>
+ <string name="actionbar_send_file">Wyślij</string>
<string name="prefs_category_general">Ogólne</string>
- <string name="prefs_category_trackmydevice">Śledzenie urządzenia</string>
- <string name="prefs_add_session">Dodaj nową sesję</string>
- <string name="prefs_create_img_thumbnails">Utwórz miniaturki obrazów</string>
- <string name="prefs_select_oc_account">Wybierz konto</string>
- <string name="prefs_summary_select_oc_account">Wybierz konto, z którego ma korzystać aplikacja.</string>
- <string name="prefs_trackmydevice">Śledzenie urządzeń</string>
- <string name="prefs_trackmydevice_summary_off">Włącz śledzenie lokalizacji urządzenia przez tę aplikację</string>
- <string name="prefs_trackmydevice_summary_on">Ta aplikacja śledzi to urządzenie</string>
- <string name="prefs_trackmydevice_interval">Odstęp aktualizacji</string>
- <string name="prefs_trackmydevice_interval_summary">Aktualizuj co %1$ minut</string>
+ <string name="prefs_category_more">Więcej</string>
<string name="prefs_accounts">Konta</string>
<string name="prefs_manage_accounts">Zarządzaj kontami</string>
<string name="prefs_pincode">PIN aplikacji</string>
<string name="prefs_pincode_summary">Chroń klienta</string>
<string name="prefs_instant_upload">Włącz natychmiastowe wysyłanie</string>
<string name="prefs_instant_upload_summary">Natychmiast wysyłaj zdjęcia zrobione aparatem</string>
- <string name="auth_host_url">URL</string>
+ <string name="prefs_log_title">Włączone Logi</string>
+ <string name="prefs_log_summary">To jest używane do logów problemów</string>
+ <string name="prefs_log_title_history">Zapisuj historię</string>
+ <string name="prefs_log_summary_history">To pokazuje zapisane logi</string>
+ <string name="prefs_log_delete_history_button">Usuń histrorię</string>
+ <string name="prefs_help">Pomoc</string>
+ <string name="prefs_recommend">Poleć znajomemu</string>
+ <string name="prefs_feedback">Wsparcie</string>
+ <string name="prefs_imprint">Stopka</string>
+ <string name="recommend_subject">Wypróbuj %1$s na swoim smartphonie!</string>
+ <string name="auth_check_server">Sprawdź serwer</string>
+ <string name="auth_host_url">Adres serwera https://...</string>
<string name="auth_username">Nazwa użytkownika</string>
<string name="auth_password">Hasło</string>
- <string name="auth_register">Jestem nowym użytkownikiem %1$s</string>
- <string name="new_session_uri_error">Podano niepoprawny adres</string>
- <string name="new_session_session_name_error">Niepoprawna nazwa sesji</string>
+ <string name="auth_register">Nowe %1$s?</string>
<string name="sync_string_files">Pliki</string>
- <string name="uploader_no_file_selected">Nie wybrano plików do wysłania</string>
- <string name="setup_hint_username">Nazwa użytkownika</string>
- <string name="setup_hint_password">Hasło</string>
- <string name="setup_hint_address">Adres internetowy</string>
- <string name="setup_hint_show_password">Wyświetlić hasło?</string>
- <string name="setup_title">Połącz z %1$s</string>
<string name="setup_btn_connect">Połącz</string>
<string name="uploader_btn_upload_text">Wyślij</string>
+ <string name="uploader_top_message">Wybierz folder do wysłania:</string>
<string name="uploader_wrn_no_account_title">Nie znaleziono konta</string>
<string name="uploader_wrn_no_account_text">Nie wykryto kont %1$s na twoim urządzeniu. Załóż konto.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Ustawienia</string>
<string name="uploader_wrn_no_content_text">Nie otrzymano danych. Nie ma nic do wysłania.</string>
<string name="uploader_error_forbidden_content">%1$s nie ma dostępu do udostępnionych treści</string>
<string name="uploader_info_uploading">Wysyłanie</string>
- <string name="uploader_btn_create_dir_text">Stwórz katalog do wysyłania</string>
<string name="file_list_empty">Nie ma plików w tym katalogu.⏎ Nowe pliki można dodać wybierając w menu Wyślij.</string>
<string name="filedetails_select_file">Dotknij plik aby wyświetlić dodatkowe informacje</string>
<string name="filedetails_size">Rozmiar:</string>
<string name="filedetails_created">Utworzono:</string>
<string name="filedetails_modified">Zmodyfikowano:</string>
<string name="filedetails_download">Pobierz</string>
- <string name="filedetails_sync_file">Odśwież</string>
- <string name="filedetails_redownload">Pobierz ponownie</string>
- <string name="filedetails_open">Otwórz</string>
+ <string name="filedetails_sync_file">Odśwież plik</string>
<string name="filedetails_renamed_in_upload_msg">Podczas wysyłania nazwa pliku została zmieniona na %1$s</string>
+ <string name="action_share_file">Udostępnij link</string>
+ <string name="action_unshare_file">Anuluj udostępnianie</string>
<string name="common_yes">Tak</string>
<string name="common_no">Nie</string>
<string name="common_ok">OK</string>
<string name="common_cancel_upload">Anuluj wysyłanie</string>
<string name="common_cancel">Anuluj</string>
<string name="common_save_exit">Zapisz i wyjdź</string>
- <string name="common_exit">Opuść %1$s</string>
<string name="common_error">Błąd</string>
+ <string name="common_loading">Wczytuję ...</string>
+ <string name="common_error_unknown">Nieznany błąd</string>
<string name="about_title">O aplikacji</string>
+ <string name="change_password">Zmień hasło</string>
<string name="delete_account">Usuń konto</string>
<string name="create_account">Utwórz konto</string>
<string name="upload_chooser_title">Wyślij plik z …</string>
- <string name="uploader_info_dirname">Nazwa katalogu</string>
+ <string name="uploader_info_dirname">Nazwa folderu</string>
<string name="uploader_upload_in_progress_ticker">Wysyłam…</string>
<string name="uploader_upload_in_progress_content">%1$d%% Wysyłanie %2$s</string>
<string name="uploader_upload_succeeded_ticker">Wysyłanie zakończone powodzeniem</string>
<string name="uploader_upload_succeeded_content_single">Wysyłanie %1$s zakończone sukcesem</string>
- <string name="uploader_upload_succeeded_content_multiple">Wysłano %1$d plików</string>
<string name="uploader_upload_failed_ticker">Wysyłanie nie powiodło się</string>
<string name="uploader_upload_failed_content_single">Wysyłanie %1$s nie powiodło się</string>
- <string name="uploader_upload_failed_content_multiple">Wysyłanie nieudane: wysłano %1$d/%2$d plików</string>
<string name="downloader_download_in_progress_ticker">Pobieranie …</string>
<string name="downloader_download_in_progress_content">%1$d%% Pobieranie %2$s</string>
<string name="downloader_download_succeeded_ticker">Pobieranie zakończone</string>
<string name="downloader_download_succeeded_content">Pobrano %1$s plików</string>
<string name="downloader_download_failed_ticker">Pobieranie nieudane</string>
<string name="downloader_download_failed_content">Pobieranie %1$s nie powiodło się</string>
+ <string name="downloader_not_downloaded_yet">Nie poprane jeszcze</string>
<string name="common_choose_account">Wybierz konto</string>
- <string name="sync_string_contacts">Kontakty</string>
<string name="sync_fail_ticker">Błąd synchronizacji</string>
<string name="sync_fail_content">Nie można było ukończyć synchronizacji %1$s </string>
+ <string name="sync_fail_content_unauthorized">Niepoprawne hasło dla %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Znaleziono konflikty</string>
<string name="sync_conflicts_in_favourites_content">%1$d synchronizowanych plików nie może zostać zsynchronizowanych</string>
<string name="sync_fail_in_favourites_ticker">Synchronizacja plików nie powiodła się</string>
<string name="sync_fail_in_favourites_content">Zawartość %1$d plików nie może zostać synchronizowana (%2$d konfliktów)</string>
- <string name="use_ssl">Użyj bezpiecznego połączenia</string>
- <string name="location_no_provider">%1$s nie może śledzić urządzenia. Sprawdź ustawienia lokalizacji</string>
+ <string name="sync_foreign_files_forgotten_ticker">Niektóre lokalne pliki zostały zgubione.</string>
+ <string name="sync_foreign_files_forgotten_content">%1$d plików z folderu %2$s nie udało się się przekopiować</string>
+ <string name="sync_foreign_files_forgotten_explanation">Od wersji 1.3.16, pliki kopiowane z tego urządzenia są kopiowane do lokalnego folderu %1$s aby zapobiec utracie danych gdy pojedynczy plik jest synchronizowany z wieloma kontami.\n\nZ powodu tej zmiany, wszystkie pliku przesłane w poprzednich wersjach tej aplikacji zostały skopiowane do folderu %2$s. Jednakże, podczas synchronizacji konta pojawił się się błąd uniemożliwiający dokończenie tej operacji. Możesz albo pozostawić plik(i) tak jak są i usunąć link do %3$s, albo przenieść plik(i) do folderu %1$s i pozostawić link do %4$s.\n\nPoniżej lokalny plik(i) i zdalny plik(i) w %5$s do których były podłączone.</string>
+ <string name="sync_current_folder_was_removed">Folder %1$s nie istnieje.</string>
+ <string name="foreign_files_move">Przenieś wszystko</string>
+ <string name="foreign_files_success">Wszystkie pliki zostały przeniesione</string>
+ <string name="foreign_files_fail">Niektóre pliki nie mogły być przeniesione</string>
+ <string name="foreign_files_local_text">Lokalna ścieżka: %1$s</string>
+ <string name="foreign_files_remote_text">Zdalna ścieżka: %1$s</string>
+ <string name="upload_query_move_foreign_files">Nie ma wystarczająco miejśca, aby skopiować zaznaczone pliki do folderu %1$s. Chciałbyś je przenieść?</string>
<string name="pincode_enter_pin_code">Podaj PIN aplikacji</string>
- <string name="pincode_enter_new_pin_code">Podaj nowy PIN aplikacji</string>
<string name="pincode_configure_your_pin">Wpisz PIN aplikacji</string>
<string name="pincode_configure_your_pin_explanation">Kod PIN będzie wymagany za każdym razem, gdy aplikacja będzie uruchamiana.</string>
<string name="pincode_reenter_your_pincode">Ponownie wpisz PIN aplikacji</string>
<string name="pincode_wrong">Niepoprawny PIN aplikacji</string>
<string name="pincode_removed">Usunięto PIN aplikacji</string>
<string name="pincode_stored">Zapisano PIN aplikacji</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 minut</item>
- <item>30 minut</item>
- <item>60 minut</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="media_notif_ticker">%1$s odtwarzacz muzyki</string>
+ <string name="media_state_playing">%1$s (odtwarzane)</string>
+ <string name="media_state_loading">%1$s (wczytywane)</string>
+ <string name="media_event_done">%1$s odtwarzanie zakończone</string>
+ <string name="media_err_nothing_to_play">Nie znaleziono plików multimedialnych</string>
+ <string name="media_err_no_account">Nie znaleziono konta</string>
+ <string name="media_err_not_in_owncloud">Plik na nieprawidłowym koncie</string>
+ <string name="media_err_unsupported">Nieobsługiwany kodek multimediów</string>
+ <string name="media_err_io">Błąd odczytu pliku multimedialnego</string>
+ <string name="media_err_malformed">Błąd kodowania pliku multimedialnego</string>
+ <string name="media_err_timeout">Upłynął limit czasu podczas próby odtwarzania</string>
+ <string name="media_err_invalid_progressive_playback">Ni udało się przesłać pliku multimedialnego</string>
+ <string name="media_err_unknown">Plik multimediów nie może być odtworzony we wbudowanym odtwarzaczu</string>
+ <string name="media_err_security_ex">Błąd zabezpieczeń podczas próby odtworzenia %1$s</string>
+ <string name="media_err_io_ex">Błąd wprowadzania podczas próby odtworzenia %1$s</string>
+ <string name="media_err_unexpected">Nieoczekiwany błąd podczas próby odtworzenia %1$s</string>
+ <string name="media_rewind_description">Przycisk przewijania</string>
+ <string name="media_play_pause_description">Przycisk odtwarzania / pauzowania</string>
+ <string name="media_forward_description">Przycisk przewijania do przodu</string>
<string name="auth_trying_to_login">Próbuję się zalogować...</string>
<string name="auth_no_net_conn_title">Brak połączenia sieciowego</string>
- <string name="auth_no_net_conn_message">Nie znaleziono połączenia sieciowego. Sprawdź połączenie internetowe i spróbuj ponownie.</string>
- <string name="auth_connect_anyway">Połącz mimo wszystko</string>
<string name="auth_nossl_plain_ok_title">Nie można nawiązać bezpiecznego połączenia.</string>
- <string name="auth_nossl_plain_ok_message">Aplikacja nie można ustanowić bezpiecznego połączenia z serwerem. Niezabezpieczone połączenie jest dostępne. Możesz kontynuować lub anulować.</string>
<string name="auth_connection_established">Połączenie nawiązane</string>
<string name="auth_testing_connection">Testowanie połączenia…</string>
<string name="auth_not_configured_title">Uszkodzona konfiguracja serwera</string>
- <string name="auth_not_configured_message">Wygląda na to, że twoja instancja ownCloud nie jest poprawnie skonfigurowana. Aby uzyskać więcej informacji, skontaktuj się z administratorem.</string>
+ <string name="auth_account_not_new">Konto tego samego użytkownika i serwera już istnieje na tym urządzeniu</string>
+ <string name="auth_account_not_the_same">Podany login nie pasuje do użytkowników </string>
<string name="auth_unknown_error_title">Wystąpił nieznany błąd!</string>
- <string name="auth_unknown_error_message">Wystąpił nieznany błąd. Proszę skontaktować się z autorami i dodać dzienniki z urządzenia.</string>
<string name="auth_unknown_host_title">Nie mogę znaleźć hosta</string>
- <string name="auth_unknown_host_message">Nie można znaleźć podanego hosta. Sprawdź nazwę hosta oraz dostępność serwera i spróbuj ponownie.</string>
- <string name="auth_incorrect_path_title">Nie znaleziono instancji ownCloud</string>
- <string name="auth_incorrect_path_message">Aplikacja nie odnalazła instancji serwera pod podaną ścieżką. Sprawdź ścieżkę i spróbuj ponownie.</string>
+ <string name="auth_incorrect_path_title">Nie znaleziono instancji serwer</string>
<string name="auth_timeout_title">Serwer zbyt długo nie odpowiadał</string>
<string name="auth_incorrect_address_title">Zły format adresu URL</string>
<string name="auth_ssl_general_error_title">Inicjowanie SSL nie powiodło się</string>
- <string name="auth_ssl_unverified_server_title">Tożsamość SSL serwera niezweryfikowana</string>
+ <string name="auth_ssl_unverified_server_title">Nie można zweryfikować tożsamości SSl serwera</string>
<string name="auth_bad_oc_version_title">Nie rozpoznano wersji serwera</string>
<string name="auth_wrong_connection_title">Nie można ustanowić połączenia</string>
<string name="auth_secure_connection">Nawiązano bezpieczne połączenie</string>
- <string name="auth_login_details">Szczegóły logowania</string>
- <string name="auth_unauthorized">Nieprawidłowa nazwa użytkownika / hasło</string>
- <string name="auth_not_found">Wprowadzono nieprawidłową ścieżkę</string>
- <string name="auth_internal">Wewnętrzny błąd serwera, kod %1$d</string>
- <string name="crashlog_message">Aplikacja została nieoczekiwanie zakończona. Czy chcesz przesłać raport awarii?</string>
- <string name="crashlog_send_report">Wyślij raport</string>
- <string name="crashlog_dont_send_report">Nie wysyłaj raportu</string>
- <string name="extensions_avail_title">Rozszerzenie dostępne!</string>
- <string name="extensions_avail_message">Twoja instancja serwera wspiera zaawansowane rozszerzenia. Czy chcesz zobaczyć rozszerzenia dostępne dla systemu Android?</string>
+ <string name="auth_unauthorized">Zła nazwa użytkownika lub hasło</string>
+ <string name="auth_oauth_error">Nieudana autoryzacja</string>
+ <string name="auth_oauth_error_access_denied">Dostęp zabroniony przez serwer autoryzacji</string>
+ <string name="auth_wtf_reenter_URL">Nieoczekiwany stan; Proszę wpisz adres URL serwera ponownie</string>
+ <string name="auth_expired_oauth_token_toast">Twoja sesja wygasła. Proszę zaloguj się ponownie</string>
+ <string name="auth_expired_basic_auth_toast">Proszę podać obecne hasło</string>
+ <string name="auth_expired_saml_sso_token_toast">Twoja sesja wygasła. Proszę zaloguj się ponownie</string>
+ <string name="auth_connecting_auth_server">Łączenie z serwerem autoryzacji...</string>
+ <string name="auth_unsupported_auth_method">Serwer nie obsługuje tej metody autoryzacji</string>
+ <string name="auth_unsupported_multiaccount">%1$s nie wspiera multikont</string>
+ <string name="auth_can_not_auth_against_server">Nie można autoryzować z tym serwerem</string>
<string name="fd_keep_in_sync">Automatyczne aktualizuj plik</string>
- <string name="common_share">Udostępnij</string>
<string name="common_rename">Zmień nazwę</string>
<string name="common_remove">Usuń</string>
<string name="confirmation_remove_alert">Czy na pewno chcesz usunąć %1$s ?</string>
<string name="rename_server_fail_msg">Zmiana nazwy nie powiodła się</string>
<string name="sync_file_fail_msg">Nie można sprawdzić zdalnego pliku</string>
<string name="sync_file_nothing_to_do_msg">Zawartość pliku została już synchronizowana</string>
- <string name="create_dir_fail_msg">Nie można utworzyć katalogu</string>
+ <string name="create_dir_fail_msg">Folder nie może zostać utworzony</string>
+ <string name="filename_forbidden_characters">Znaki zabronione: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Poczekaj chwilę</string>
<string name="filedisplay_unexpected_bad_get_content">Nieoczekiwany problem; spróbuj wybrać plik z innej aplikacji</string>
<string name="filedisplay_no_file_selected">Nie wybrano żadnych plików</string>
- <string name="ssl_validator_title">Uwaga</string>
+ <string name="activity_chooser_title">Wyślij link do ...</string>
+ <string name="oauth_check_onoff">Loguj przez oAuth2</string>
+ <string name="oauth_login_connection">Łączenie z serwerem oAuth2...</string>
<string name="ssl_validator_header">Nie można zweryfikować tożsamości strony</string>
<string name="ssl_validator_reason_cert_not_trusted">- Certyfikat serwera jest niezaufany</string>
<string name="ssl_validator_reason_cert_expired">- Certyfikat serwera wygasł</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- Certyfikat serwera jest wystawiony w przyszłości</string>
<string name="ssl_validator_reason_hostname_not_verified">- URL nie pasuje do nazwy hosta w certyfikacie</string>
- <string name="ssl_validator_certificate_not_available">Nie można uzyskać certyfikatu serwera</string>
<string name="ssl_validator_question">Zaakceptować certyfikat mimo wszystko?</string>
<string name="ssl_validator_not_saved">Nie można zapisać certyfikatu</string>
<string name="ssl_validator_btn_details_see">Szczegóły</string>
<string name="ssl_validator_label_validity_to">Do:</string>
<string name="ssl_validator_label_signature">Sygnatura:</string>
<string name="ssl_validator_label_signature_algorithm">Algorytm:</string>
- <string name="text_placeholder">Tekst zastępczy</string>
+ <string name="ssl_validator_null_cert">Nie można wyświetlić certyfikatu.</string>
+ <string name="ssl_validator_no_info_about_error">- Brak informacji o błędzie</string>
+ <string name="placeholder_sentence">Tekst zastępczy</string>
+ <string name="placeholder_filename">placeholder.txt</string>
+ <string name="placeholder_filetype">Obraz PNG</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Wysyłaj zdjęcia tylko przez WiFi</string>
<string name="instant_upload_path">/InstantUpload</string>
<string name="conflict_title">Konflikt aktualizacji</string>
<string name="conflict_keep_both">Zatrzymaj oba</string>
<string name="conflict_overwrite">Zastąp</string>
<string name="conflict_dont_upload">Nie wysyłaj</string>
+ <string name="preview_image_description">Podgląd</string>
+ <string name="preview_image_error_unknown_format">Obraz nie może zostać wyświetlony</string>
+ <string name="error__upload__local_file_not_copied">%1$s nie może zostać skopiowany do lokalnego folderu %2$s</string>
+ <string name="actionbar_failed_instant_upload">InstantUpload nie powiódł się</string>
+ <string name="failed_upload_headline_text">Błąd automatycznego przesyłania</string>
+ <string name="failed_upload_headline_hint">Podsumowanie wszystkich nieudanych transferów</string>
+ <string name="failed_upload_all_cb">zaznacz wszystkie</string>
+ <string name="failed_upload_headline_retryall_btn">spróbuj zaznaczyć wszystkie</string>
+ <string name="failed_upload_headline_delete_all_btn">usuń wszystko z kolejki wysyłania</string>
+ <string name="failed_upload_retry_text">ponów wysyłanie obrazu:</string>
+ <string name="failed_upload_load_more_images">Wczytaj więcej obrazów</string>
+ <string name="failed_upload_retry_do_nothing_text">nic nie rób, ponieważ nie jesteś online, nie możesz przesyłać plików</string>
+ <string name="failed_upload_failure_text">Komunikat błędu:</string>
+ <string name="failed_upload_quota_exceeded_text">Proszę sprawdź ustawienia serwera, możliwe że przekroczyłes limit wielkości pliku</string>
+ <string name="share_link_file_no_exist">Brak możliwości udostępnienia tego pliku lub folderu. Upewnij się, że istnieje.</string>
+ <string name="share_link_file_error">Wystąpił błąd podczas udostępniania tego pliku lub folderu.</string>
+ <string name="unshare_link_file_no_exist">Nie można anulować udostępniania tego pliku lub folderu. Jeśli nie istnieje.</string>
+ <string name="unshare_link_file_error">Wystąpił błąd podczas anulowania udostępniania tego pliku lub folderu.</string>
+ <string name="activity_chooser_send_file_title">Wyślij</string>
+ <string name="copy_link">Skopiuj link</string>
+ <string name="clipboard_text_copied">Skopiuj do schowka</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Senha:</string>
- <string name="main_login">Nome de usuário:</string>
- <string name="main_button_login">Login</string>
- <string name="main_welcome">Bem-vindo</string>
- <string name="main_files">Arquivos</string>
- <string name="main_music">Música</string>
- <string name="main_contacts">Contatos</string>
- <string name="main_calendar">Calendário</string>
- <string name="main_bookmarks">Favoritos</string>
- <string name="main_settings">Ajustes</string>
- <string name="main_tit_accsetup">Configuração de conta</string>
- <string name="main_wrn_accsetup">Não existem contas ownCloud no seu dispositivo. Para usar este aplicativo, você precisa criar uma.</string>
- <string name="about_message">Cliente ownCloud para Android\n\nversão: %1$s</string>
- <string name="actionbar_sync">Atualizar</string>
+ <string name="about_android">%1$s Android App</string>
+ <string name="about_version">versão %1$s</string>
+ <string name="actionbar_sync">Atualização de conta</string>
<string name="actionbar_upload">Upload</string>
<string name="actionbar_upload_from_apps">Conteúdo de outros apps</string>
<string name="actionbar_upload_files">Arquivos</string>
- <string name="actionbar_mkdir">Criar pasta</string>
- <string name="actionbar_search">Procurar</string>
+ <string name="actionbar_open_with">Abrir com</string>
+ <string name="actionbar_mkdir">Nova pasta</string>
<string name="actionbar_settings">Ajustes</string>
+ <string name="actionbar_see_details">Detalhes</string>
+ <string name="actionbar_send_file">Enviar</string>
<string name="prefs_category_general">Geral</string>
- <string name="prefs_category_trackmydevice">Rastreamento de dispositivo</string>
- <string name="prefs_add_session">Adicionar nova sessão</string>
- <string name="prefs_create_img_thumbnails">Criar miniaturas de imagens</string>
- <string name="prefs_select_oc_account">Selecione uma conta</string>
- <string name="prefs_summary_select_oc_account">Selecione qual das suas contas você deseja utilizar.</string>
- <string name="prefs_trackmydevice">Rastreamento de dispositivo</string>
- <string name="prefs_trackmydevice_summary_off">Habilite ownCloud para rastrear a localização do seu dispositivo</string>
- <string name="prefs_trackmydevice_summary_on">Seu ownCloud mantém registro da localização desse dispositivo</string>
- <string name="prefs_trackmydevice_interval">Intervalo de atualização</string>
- <string name="prefs_trackmydevice_interval_summary">Atualizar a cada %1$s minutos</string>
+ <string name="prefs_category_more">Mais</string>
<string name="prefs_accounts">Contas</string>
<string name="prefs_manage_accounts">Gerenciar contas</string>
- <string name="prefs_pincode">PIN ownCloud App</string>
- <string name="prefs_pincode_summary">Proteja seu cliente ownCloud</string>
+ <string name="prefs_pincode">PIN App</string>
+ <string name="prefs_pincode_summary">Proteja seu cliente</string>
<string name="prefs_instant_upload">Habilitar upload instantâneo</string>
<string name="prefs_instant_upload_summary">Instantaneamente faça upload das fotos tiradas pela câmera</string>
- <string name="auth_host_url">URL ownCloud</string>
+ <string name="prefs_log_title">Habilitar conexão</string>
+ <string name="prefs_log_summary">Isto é usado para registrar os problemas</string>
+ <string name="prefs_log_title_history">História de Registro</string>
+ <string name="prefs_log_summary_history">Isso mostra os registros gravados</string>
+ <string name="prefs_log_delete_history_button">Excluir Histórico</string>
+ <string name="prefs_help">Ajuda</string>
+ <string name="prefs_recommend">Recomendar a um amigo</string>
+ <string name="prefs_feedback">Feedback</string>
+ <string name="prefs_imprint">Imprint</string>
+ <string name="recommend_subject">Tentar %1$s em seu smartfone!</string>
+ <string name="auth_check_server">Verificar Servidor</string>
+ <string name="auth_host_url">Endereço do servidor https://...</string>
<string name="auth_username">Nome de usuário</string>
<string name="auth_password">Senha</string>
- <string name="auth_register">Sou novo no ownCloud</string>
- <string name="new_session_uri_error">URL errada</string>
- <string name="new_session_session_name_error">Nome de sessão errado</string>
+ <string name="auth_register">Novo para %1$s?</string>
<string name="sync_string_files">Arquivos</string>
- <string name="uploader_no_file_selected">Nenhum arquivo selecionado para upload</string>
- <string name="setup_hint_username">Nome de usuário</string>
- <string name="setup_hint_password">Senha</string>
- <string name="setup_hint_address">Endereço Web</string>
- <string name="setup_hint_show_password">Mostrar senha?</string>
- <string name="setup_title">Conecte ao seu ownCloud</string>
<string name="setup_btn_connect">Conectar</string>
<string name="uploader_btn_upload_text">Upload</string>
+ <string name="uploader_top_message">Escolher pasta enviar:</string>
<string name="uploader_wrn_no_account_title">Nenhuma conta encontrada</string>
- <string name="uploader_wrn_no_account_text">Não existem contas ownCloud no seu dispositivo. Por favor, configure uma conta primeiro.</string>
+ <string name="uploader_wrn_no_account_text">Não existem contas %1$s no seu dispositivo. Por favor, configure uma conta primeiro.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Instalação</string>
<string name="uploader_wrn_no_account_quit_btn_text">Sair</string>
<string name="uploader_wrn_no_content_title">Sem conteúdo para enviar</string>
<string name="uploader_wrn_no_content_text">Nenhum foi recebido. Nada para enviar.</string>
- <string name="uploader_error_forbidden_content">ownCloud não é permitido a acessar o conteúdo compartilhado</string>
+ <string name="uploader_error_forbidden_content">%1$s não é permitido a acessar o conteúdo compartilhado</string>
<string name="uploader_info_uploading">Enviando</string>
- <string name="uploader_btn_create_dir_text">Criar um diretório para upload</string>
<string name="file_list_empty">Não existe arquivos nesta pasta\nNovos arquivos podem ser adicionados com a opção do menu \"Enviar\"</string>
<string name="filedetails_select_file">Toque em um arquivo para mostrar informações adicionais.</string>
<string name="filedetails_size">Tamanho:</string>
<string name="filedetails_created">Criado:</string>
<string name="filedetails_modified">Modificado:</string>
<string name="filedetails_download">Download</string>
- <string name="filedetails_sync_file">Atualizar</string>
- <string name="filedetails_redownload">Baixar novamente</string>
- <string name="filedetails_open">Abrir</string>
+ <string name="filedetails_sync_file">Atualizar arquivo</string>
<string name="filedetails_renamed_in_upload_msg">Arquivo foi renomeado para %1$s durante o upload</string>
+ <string name="action_share_file">Compartilher link</string>
+ <string name="action_unshare_file">Descompartilhar o link</string>
<string name="common_yes">Sim</string>
<string name="common_no">Não</string>
<string name="common_ok">OK</string>
<string name="common_cancel_upload">Cancelar upload</string>
<string name="common_cancel">Cancelar</string>
<string name="common_save_exit">Salvar & Sair</string>
- <string name="common_exit">Sair do ownCloud</string>
<string name="common_error">Erro</string>
+ <string name="common_loading">Carregando ...</string>
+ <string name="common_error_unknown">Erro desconhecido</string>
<string name="about_title">Sobre</string>
+ <string name="change_password">Alterar senha</string>
<string name="delete_account">Remover conta</string>
<string name="create_account">Criar conta</string>
<string name="upload_chooser_title">Enviar de …</string>
- <string name="uploader_info_dirname">Nome do diretório</string>
+ <string name="uploader_info_dirname">Nome da pasta</string>
<string name="uploader_upload_in_progress_ticker">Enviando …</string>
<string name="uploader_upload_in_progress_content">%1$d%% Enviando %2$s</string>
<string name="uploader_upload_succeeded_ticker">Envio bem sucedido</string>
<string name="uploader_upload_succeeded_content_single">%1$s foi enviado com sucesso</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d arquivos foram enviados com sucesso</string>
<string name="uploader_upload_failed_ticker">Falha no envio</string>
<string name="uploader_upload_failed_content_single">Envio de %1$s não pôde ser completado</string>
- <string name="uploader_upload_failed_content_multiple">Envio falhou: %1$d/%2$d arquivos foram enviados</string>
<string name="downloader_download_in_progress_ticker">Baixando …</string>
<string name="downloader_download_in_progress_content">%1$d%% Baixando %2$s</string>
<string name="downloader_download_succeeded_ticker">Download bem sucedido</string>
<string name="downloader_download_succeeded_content">%1$s foi baixado com sucesso</string>
<string name="downloader_download_failed_ticker">Download falhou</string>
<string name="downloader_download_failed_content">Download de %1$s não pôde ser concluído</string>
+ <string name="downloader_not_downloaded_yet">Não baixado ainda</string>
<string name="common_choose_account">Escolha a conta</string>
- <string name="sync_string_contacts">Contatos</string>
<string name="sync_fail_ticker">Sincronização falhou</string>
<string name="sync_fail_content">Sincronização de %1$s não pôde ser completada</string>
+ <string name="sync_fail_content_unauthorized">Senha inválida para %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Conflitos encontrados</string>
<string name="sync_conflicts_in_favourites_content">%1$d arquivos \"manter sincronizados\" não puderam ser sincronizados</string>
<string name="sync_fail_in_favourites_ticker">Falha ao manter arquivos sincronizados</string>
<string name="sync_fail_in_favourites_content">O conteúdo de %1$d arquivos não puderam ser sincronizados (%2$d conflitos)</string>
- <string name="use_ssl">Usar Conexão Segura</string>
- <string name="location_no_provider">%1$s não pode rastrear seu dispositivo. Por favor verifique suas configurações de localização</string>
+ <string name="sync_foreign_files_forgotten_ticker">Alguns arquivos locais foram esquecidos</string>
+ <string name="sync_foreign_files_forgotten_content">%1$d arquivos de %2$s não puderam ser copiados para pasta</string>
+ <string name="sync_foreign_files_forgotten_explanation">A partir da versão 1.3.16, os arquivos enviados a partir deste dispositivo são copiados para a pasta local %1$s para evitar a perda de dados quando um único arquivo é sincronizado com várias contas.\nDevido a essa mudança, todos os arquivos carregados em versões anteriores deste aplicativo foram copiados para a pasta %2$s. No entanto, um erro impediu a conclusão desta operação durante a sincronização da conta. Você pode tanto deixar o arquivo(s) como é e remover o link para %3$s, ou mover o arquivo(s) para a pasta %1$s e manter o link para %4$s.\nListados abaixo estão o arquivo(s) locais, e o arquivo(s) remotos %5$s em que estavam vinculados.</string>
+ <string name="sync_current_folder_was_removed">Pasta %1s não existe mais</string>
+ <string name="foreign_files_move">Mover todos</string>
+ <string name="foreign_files_success">Todos os arquivos foram movidos</string>
+ <string name="foreign_files_fail">Alguns arquivos não puderam ser movidos</string>
+ <string name="foreign_files_local_text">Local: %1$s</string>
+ <string name="foreign_files_remote_text">Remoto: %1$s</string>
+ <string name="upload_query_move_foreign_files">Não há espaço suficiente para copiar os arquivos selecionados para a pasta %1$s. Ao invés disso, gostaria de movê-los?</string>
<string name="pincode_enter_pin_code">Por favor, insira o seu PIN de Aplicativo</string>
- <string name="pincode_enter_new_pin_code">Por favor, insira seu novo PIN de Aplicativo</string>
<string name="pincode_configure_your_pin">Insira seu PIN de Aplicativo</string>
<string name="pincode_configure_your_pin_explanation">O PIN (senha) será solicitado toda vez que o aplicativo for iniciado</string>
<string name="pincode_reenter_your_pincode">Por favor, reinsira seu PIN de Aplicativo</string>
<string name="pincode_wrong">PIN de Aplicativo incorreto</string>
<string name="pincode_removed">PIN de Aplicativo removido</string>
<string name="pincode_stored">PIN de Aplicativo armazenado</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 minutos</item>
- <item>30 minutos</item>
- <item>60 minutos</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="media_notif_ticker">%1$s reprodutor de música</string>
+ <string name="media_state_playing">%1$s (reproduzindo)</string>
+ <string name="media_state_loading">%1$s (carregando)</string>
+ <string name="media_event_done">%1$s reprodução finalizada</string>
+ <string name="media_err_nothing_to_play">Nenhum arquivo de mídia encontrado</string>
+ <string name="media_err_no_account">Nenhuma conta fornecida</string>
+ <string name="media_err_not_in_owncloud">Arquivo não está em uma conta válida</string>
+ <string name="media_err_unsupported">Codec de mídia não suportado</string>
+ <string name="media_err_io">Arquivo de mídia não pode ser lido</string>
+ <string name="media_err_malformed">Arquivo de mídia não corretamente codificado</string>
+ <string name="media_err_timeout">Expirou o tempo durante a tentativa</string>
+ <string name="media_err_invalid_progressive_playback">Arquivo de mídia não pode ser transmitido</string>
+ <string name="media_err_unknown">Arquivo de mídia não pode ser reproduzido com o estoque media player</string>
+ <string name="media_err_security_ex">Erro de segurança tentando reproduzir %1$s</string>
+ <string name="media_err_io_ex">Erro de entrada tentando reproduzir %1$s</string>
+ <string name="media_err_unexpected">Erro inesperado tentando reproduzir %1$s</string>
+ <string name="media_rewind_description">Botão rebobinar</string>
+ <string name="media_play_pause_description">Botão reproduzir parar</string>
+ <string name="media_forward_description">Botão de adiantamento rápido</string>
<string name="auth_trying_to_login">Tentando fazer login...</string>
<string name="auth_no_net_conn_title">Sem conexão de rede</string>
- <string name="auth_no_net_conn_message">Nenhuma conexão foi detectada, verifique sua conexão com a Internet e tente novamente.</string>
- <string name="auth_connect_anyway">Conectar mesmo assim</string>
<string name="auth_nossl_plain_ok_title">Conexão segura indisponível.</string>
- <string name="auth_nossl_plain_ok_message">O aplicativo não pôde estabelecer uma conexão segura. Uma conexão não-segura está disponível. Você pode continuar ou cancelar.</string>
<string name="auth_connection_established">Conexão estabelecida</string>
<string name="auth_testing_connection">Testando conexão...</string>
<string name="auth_not_configured_title">Configuração do servidor mal formada</string>
- <string name="auth_not_configured_message">Parece que a instância do seu servidor não está corretamente configurada. Contate seu administrador para mais detalhes.</string>
+ <string name="auth_account_not_new">Uma conta para o mesmo usuário e servidor já existe no dispositivo</string>
+ <string name="auth_account_not_the_same">As informações que o usuário digitou não corresponde ao usuário da conta</string>
<string name="auth_unknown_error_title">Ocorreu um erro desconhecido!</string>
- <string name="auth_unknown_error_message">Ocorreu um erro desconhecido. Por favor contate o suporte e inclua registros do seu dispositivo.</string>
<string name="auth_unknown_host_title">Não pôde encontrar host</string>
- <string name="auth_unknown_host_message">Couldn\'t find the entered host. Por favor verifique o nome de host, disponibilidade do servidor e tente novamente.</string>
<string name="auth_incorrect_path_title">Instância de servidor não encontrada</string>
- <string name="auth_incorrect_path_message">O aplicativo não pôde encontrar uma instância de servidor no caminho indicado. Por favor, verifique-o e tente novamente.</string>
<string name="auth_timeout_title">O servidor demorou demais a responder</string>
<string name="auth_incorrect_address_title">URL mal formada</string>
<string name="auth_ssl_general_error_title">Inicialização SSL falhou</string>
- <string name="auth_ssl_unverified_server_title">Identidade SSL do servidor não verificada</string>
- <string name="auth_bad_oc_version_title">Versão do servidor ownCloud é irreconhecível</string>
+ <string name="auth_ssl_unverified_server_title">Não foi possível verificar a identidade do servidor SSL</string>
+ <string name="auth_bad_oc_version_title">Versão do servidor é irreconhecível</string>
<string name="auth_wrong_connection_title">Não foi possível estabelecer conexão</string>
<string name="auth_secure_connection">Conexão segura estabelecida</string>
- <string name="auth_login_details">Detalhes de login</string>
- <string name="auth_unauthorized">Login / senha inválida</string>
- <string name="auth_not_found">Caminho dado está errado</string>
- <string name="auth_internal">Erro interno do servidor, código %1$d</string>
- <string name="crashlog_message">O aplicativo terminou inesperadamente. Gostaria de enviar um relatório de erros?</string>
- <string name="crashlog_send_report">Enviar relatório</string>
- <string name="crashlog_dont_send_report">Não enviar relatório</string>
- <string name="extensions_avail_title">Extensões disponíveis!</string>
- <string name="extensions_avail_message">Parece que sua instância ownCloud está suportando extensões avançadas. Gostaria de ver extensões disponíveis para Android?</string>
+ <string name="auth_unauthorized">Nome de usuário e/ou senha está errada!</string>
+ <string name="auth_oauth_error">Autorização sem sucesso</string>
+ <string name="auth_oauth_error_access_denied">Acesso negado pelo servidor de autorização</string>
+ <string name="auth_wtf_reenter_URL">Estado inesperado, por favor, digite a URL do servidor novamente</string>
+ <string name="auth_expired_oauth_token_toast">Sua autorização expirou. Por favor, solicite autorizar novamente</string>
+ <string name="auth_expired_basic_auth_toast">Por favor, digite sua senha</string>
+ <string name="auth_expired_saml_sso_token_toast">Sua sessão expirou. Por favor, conecte-se novamente</string>
+ <string name="auth_connecting_auth_server">Conectando ao servidor de autenticação ...</string>
+ <string name="auth_unsupported_auth_method">O servidor não suporta este método de autenticação</string>
+ <string name="auth_unsupported_multiaccount">%1$s não suporta múltiplas contas</string>
+ <string name="auth_can_not_auth_against_server">Não foi possível autenticar neste servidor</string>
<string name="fd_keep_in_sync">Manter arquivo atualizado</string>
- <string name="common_share">Compartilhar</string>
<string name="common_rename">Renomear</string>
<string name="common_remove">Remover</string>
<string name="confirmation_remove_alert">Você realmente quer remover %1$s ?</string>
<string name="rename_server_fail_msg">Renomeação não pôde ser completada</string>
<string name="sync_file_fail_msg">Arquivo remoto não pode ser verificado</string>
<string name="sync_file_nothing_to_do_msg">Conteúdo do arquivo já foi sincronizado</string>
- <string name="create_dir_fail_msg">Diretório não pôde ser criado</string>
+ <string name="create_dir_fail_msg">A pasta não pode ser criada</string>
+ <string name="filename_forbidden_characters">Caracteres proibidos: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Aguarde um momento</string>
<string name="filedisplay_unexpected_bad_get_content">Problema inesperado; por favor, tente selecionar o arquivo com outro app</string>
<string name="filedisplay_no_file_selected">Nenhum arquivo foi selecionado</string>
- <string name="ssl_validator_title">Aviso</string>
+ <string name="activity_chooser_title">Enviar o link para</string>
+ <string name="oauth_check_onoff">Login com oAuth2</string>
+ <string name="oauth_login_connection">Conectando-se a oAuth2 servidor ...</string>
<string name="ssl_validator_header">A identidade do site não pode ser verificada</string>
<string name="ssl_validator_reason_cert_not_trusted">- O certificado do servidor não é confiável</string>
<string name="ssl_validator_reason_cert_expired">- O certificado do servidor expirou</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- O certificado do servidor é muito recente</string>
<string name="ssl_validator_reason_hostname_not_verified">- O URL do host não confere com o host do certificado</string>
- <string name="ssl_validator_certificate_not_available">O certificado do servidor não pode ser obtido</string>
<string name="ssl_validator_question">Você confia nesse certificado mesmo assim?</string>
<string name="ssl_validator_not_saved">O certificado não pode ser salvo</string>
<string name="ssl_validator_btn_details_see">Detalhes</string>
<string name="ssl_validator_label_validity_to">Para:</string>
<string name="ssl_validator_label_signature">Assinatura:</string>
<string name="ssl_validator_label_signature_algorithm">Algoritmo:</string>
- <string name="text_placeholder">Isso é um marcador de espaço</string>
+ <string name="ssl_validator_null_cert">O certificado não pode ser mostrado.</string>
+ <string name="ssl_validator_no_info_about_error">- Nenhuma informação sobre o erro</string>
+ <string name="placeholder_sentence">Este é um espaço reservado</string>
+ <string name="placeholder_filename">espaçoreservado.txt</string>
+ <string name="placeholder_filetype">Imagem PNG</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Fazer upload de fotos somente via WiFi</string>
<string name="instant_upload_path">/Upload instantâneo</string>
<string name="conflict_title">Conflito de atualização</string>
<string name="conflict_keep_both">Manter ambos</string>
<string name="conflict_overwrite">Sobrescrever</string>
<string name="conflict_dont_upload">Não fazer upload</string>
+ <string name="preview_image_description">Pré-visualização da imagem</string>
+ <string name="preview_image_error_unknown_format">Esta imagem não pode ser mostrada</string>
+ <string name="error__upload__local_file_not_copied">%1$s não pôde ser copiado para pasta local %2$s</string>
+ <string name="actionbar_failed_instant_upload">Falha no EnvioInstantaneo</string>
+ <string name="failed_upload_headline_text">Falhas nos envios imediatos</string>
+ <string name="failed_upload_headline_hint">Sumario de todas as falhas nos envios imediatos</string>
+ <string name="failed_upload_all_cb">selecionar tudo</string>
+ <string name="failed_upload_headline_retryall_btn">tentar novamente todos os selecionados</string>
+ <string name="failed_upload_headline_delete_all_btn">excluir todos os selecionados da lista de envio</string>
+ <string name="failed_upload_retry_text">tentar novamente envio da imagem:</string>
+ <string name="failed_upload_load_more_images">Carregar mais Imagens</string>
+ <string name="failed_upload_retry_do_nothing_text">não fazer nada voce não está conectado para envio instantâneo </string>
+ <string name="failed_upload_failure_text">Mensagem de Falha:</string>
+ <string name="failed_upload_quota_exceeded_text">Por favor verifique a configuração do servidor, talvez a sua cota esteja vencida.</string>
+ <string name="share_link_file_no_exist">Incapaz de compartilhar esse arquivo ou pasta. Por favor, certifique-se que existe</string>
+ <string name="share_link_file_error">Ocorreu um erro durante a tentativa de compartilhar esse arquivo ou pasta</string>
+ <string name="unshare_link_file_no_exist">Incapaz de descompartilhar este arquivo ou pasta. Ela não existe.</string>
+ <string name="unshare_link_file_error">Ocorreu um erro ao tentar descompartilhar este arquivo ou pasta</string>
+ <string name="activity_chooser_send_file_title">Enviar</string>
+ <string name="copy_link">Copiar o link</string>
+ <string name="clipboard_text_copied">Copiado para área de transferência</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Palavra-passe:</string>
- <string name="main_login">Nome de Utilizador:</string>
- <string name="main_button_login">Login</string>
- <string name="main_welcome">Bem-vindo à sua ownCloud</string>
- <string name="main_files">Ficheiros</string>
- <string name="main_music">Musica</string>
- <string name="main_contacts">Contactos</string>
- <string name="main_calendar">Calendário</string>
- <string name="main_bookmarks">Marcadores</string>
- <string name="main_settings">Definições</string>
- <string name="main_tit_accsetup">Configurar conta</string>
- <string name="main_wrn_accsetup">Não há contas no seu aparelho. Para usar esta Aplicação, precisa de criar uma.</string>
- <string name="about_message">cliente Android %1$s\n\nversão: %1$s</string>
- <string name="actionbar_sync">Actualizar</string>
+ <string name="about_android">%1$s Aplicação(ões) Android</string>
+ <string name="about_version">versão %1$s</string>
+ <string name="actionbar_sync">Recarregar a conta</string>
<string name="actionbar_upload">Enviar</string>
<string name="actionbar_upload_from_apps">Conteúdo das outras apps</string>
<string name="actionbar_upload_files">Ficheiros</string>
- <string name="actionbar_mkdir">Criar pasta</string>
- <string name="actionbar_search">Procurar</string>
+ <string name="actionbar_open_with">Abrir com</string>
+ <string name="actionbar_mkdir">Nova Pasta</string>
<string name="actionbar_settings">Definições</string>
+ <string name="actionbar_see_details">Detalhes</string>
+ <string name="actionbar_send_file">Enviar</string>
<string name="prefs_category_general">Geral</string>
- <string name="prefs_category_trackmydevice">Rastreamento de dispositivo</string>
- <string name="prefs_add_session">Acrescentar nova sessão</string>
- <string name="prefs_create_img_thumbnails">Criar miniaturas de imagens</string>
- <string name="prefs_select_oc_account">Escolha uma conta</string>
- <string name="prefs_summary_select_oc_account">Escolha qual das suas contas deve ser usada pela app.</string>
- <string name="prefs_trackmydevice">Rastreamento de dispositivo</string>
- <string name="prefs_trackmydevice_summary_off">Permitir que ownCloud siga a localização do seu aparelho.</string>
- <string name="prefs_trackmydevice_summary_on">A sua ownCloud segue a localização deste aparelho.</string>
- <string name="prefs_trackmydevice_interval">Intervalo de actualização</string>
- <string name="prefs_trackmydevice_interval_summary">Actualizar a cada %1$s minutos</string>
+ <string name="prefs_category_more">Mais</string>
<string name="prefs_accounts">Contas</string>
<string name="prefs_manage_accounts">Gerir contas</string>
- <string name="prefs_pincode">ownCloud App PIN</string>
- <string name="prefs_pincode_summary">Proteja o seu cliente ownCloud</string>
+ <string name="prefs_pincode">App PIN</string>
+ <string name="prefs_pincode_summary">Proteja o seu cliente</string>
<string name="prefs_instant_upload">Activar envio instantâneo</string>
<string name="prefs_instant_upload_summary">Enviar automaticamente as fotografias tiradas pela camera</string>
- <string name="auth_host_url">URL ownCloud</string>
+ <string name="prefs_log_title">Ativar Rastreio</string>
+ <string name="prefs_log_summary">Isto é usado para registar problemas</string>
+ <string name="prefs_log_title_history">Historico do rastreio</string>
+ <string name="prefs_log_summary_history">Isto mostra os registos guardados</string>
+ <string name="prefs_log_delete_history_button">Eliminar Histórico</string>
+ <string name="prefs_help">Ajuda</string>
+ <string name="prefs_recommend">Recomendar a um amigo</string>
+ <string name="prefs_feedback">Resposta</string>
+ <string name="prefs_imprint">Imprint</string>
+ <string name="recommend_subject">Experimente %1$s no seu smartphone!</string>
+ <string name="auth_check_server">Verificar Servidor</string>
+ <string name="auth_host_url">Endereço do servidor https://..</string>
<string name="auth_username">Nome de Utilizador</string>
<string name="auth_password">Palavra-passe</string>
- <string name="auth_register">Sou novo na %1$s</string>
- <string name="new_session_uri_error">URL dado errado</string>
- <string name="new_session_session_name_error">Nome de sessão errado</string>
+ <string name="auth_register">Novo em %1$s?</string>
<string name="sync_string_files">Ficheiros</string>
- <string name="uploader_no_file_selected">Nenhum ficheiro seleccionado para envio</string>
- <string name="setup_hint_username">Nome de utilizador</string>
- <string name="setup_hint_password">Palavra-passe</string>
- <string name="setup_hint_address">Endereço web</string>
- <string name="setup_hint_show_password">Mostrar palavra-passe?</string>
- <string name="setup_title">Ligar à sua %1$s</string>
<string name="setup_btn_connect">Ligar</string>
<string name="uploader_btn_upload_text">Enviar</string>
<string name="uploader_wrn_no_account_title">Nenhuma conta encontrada</string>
<string name="uploader_wrn_no_content_text">Não foi recebido nenhum conteúdo. Nada para enviar.</string>
<string name="uploader_error_forbidden_content">O %1$s não está autorizado a aceder aos ficheiro partilhados.</string>
<string name="uploader_info_uploading">A enviar</string>
- <string name="uploader_btn_create_dir_text">Criar directoria para envio</string>
<string name="file_list_empty">Não existem ficheiros nesta pasta.\nPode adicionar ficheiros com a opção \"Enviar\" no menu.</string>
<string name="filedetails_select_file">Clique no ficheiro para visualizar informação adicional.</string>
<string name="filedetails_size">Tamanho:</string>
<string name="filedetails_created">Criado:</string>
<string name="filedetails_modified">Modificado:</string>
<string name="filedetails_download">Descarregar</string>
- <string name="filedetails_sync_file">Actualizar</string>
- <string name="filedetails_redownload">Actualizar</string>
- <string name="filedetails_open">Abrir</string>
+ <string name="filedetails_sync_file">Atualizar ficheiro</string>
<string name="filedetails_renamed_in_upload_msg">O nome do ficheiro foi alterado para %1$s durante o envio.</string>
+ <string name="action_share_file">Partilhar o link</string>
+ <string name="action_unshare_file">Deixar de partilhar a ligação</string>
<string name="common_yes">Sim</string>
<string name="common_no">Não</string>
<string name="common_ok">OK</string>
<string name="common_cancel_upload">Cancelar envio</string>
<string name="common_cancel">Cancelar</string>
<string name="common_save_exit">Guardar & Sair</string>
- <string name="common_exit">Sair de %1$s</string>
<string name="common_error">Erro</string>
+ <string name="common_loading">A carregar...</string>
+ <string name="common_error_unknown">Erro Desconhecido</string>
<string name="about_title">Sobre</string>
+ <string name="change_password">Alterar palavra-chave</string>
<string name="delete_account">Apagar conta</string>
<string name="create_account">Criar conta</string>
<string name="upload_chooser_title">Carregar de...</string>
- <string name="uploader_info_dirname">Nome da directoria</string>
+ <string name="uploader_info_dirname">Nome da pasta</string>
<string name="uploader_upload_in_progress_ticker">A carregar...</string>
<string name="uploader_upload_in_progress_content">A enviar %1$d%% , %2$s completo.</string>
<string name="uploader_upload_succeeded_ticker">Carregado com sucesso</string>
<string name="uploader_upload_succeeded_content_single">%1$s foi carregado com sucesso</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d foram carregados com sucesso</string>
<string name="uploader_upload_failed_ticker">Carregamento falhou</string>
<string name="uploader_upload_failed_content_single">O envio do ficheiro %1$s não foi concluído.</string>
- <string name="uploader_upload_failed_content_multiple">O envio falhou. %1$d/%2$d ficheiro foram enviados com sucesso.</string>
<string name="downloader_download_in_progress_ticker">A descarregar...</string>
<string name="downloader_download_in_progress_content">%1$d%% A decarregar %2$s</string>
<string name="downloader_download_succeeded_ticker">Descarga com sucesso</string>
<string name="downloader_download_succeeded_content">%1$s foi descarregado com sucesso</string>
<string name="downloader_download_failed_ticker">Descarga falhou</string>
<string name="downloader_download_failed_content">O descarregamento %1$s não foi possível descarregar</string>
+ <string name="downloader_not_downloaded_yet">Não transferido</string>
<string name="common_choose_account">Escolha a conta</string>
- <string name="sync_string_contacts">Contactos</string>
<string name="sync_fail_ticker">Falhou a sincronização</string>
<string name="sync_fail_content">Não foi possível sincronizar %1$s</string>
+ <string name="sync_fail_content_unauthorized">Password inválida para %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Foram encontrados conflitos</string>
<string name="sync_conflicts_in_favourites_content">Não foi possível sincronizar o ficheiro %1$d</string>
<string name="sync_fail_in_favourites_ticker">Falhou a operação de manter os ficheiros sincronizados</string>
<string name="sync_fail_in_favourites_content">Não foi possível sincronizar o conteúdo de %1$d ficheiros (%2$d conflictos)</string>
- <string name="use_ssl">Usar Ligação Segura</string>
- <string name="location_no_provider">Nao é possível detectar a sua localização. Por favor verifique se os serviços de localização/GPS estão activados.</string>
+ <string name="sync_foreign_files_forgotten_ticker">Alguns ficheiros locais ficaram esquecidos</string>
+ <string name="sync_current_folder_was_removed">A pasta %1$s já não existe</string>
+ <string name="foreign_files_move">Mover Todos</string>
+ <string name="foreign_files_success">Todos os ficheiros foram movidos</string>
+ <string name="foreign_files_fail">Não foi possível mover alguns ficheiros</string>
+ <string name="foreign_files_local_text">Local: %1$s</string>
+ <string name="foreign_files_remote_text">Remoto: %1$s</string>
+ <string name="upload_query_move_foreign_files">Não existe espaço suficiente para copiar os ficheiros seleccionados para a pasta %1$s . Deseja move-los?</string>
<string name="pincode_enter_pin_code">Por favor escreva o PIN da Aplicação</string>
- <string name="pincode_enter_new_pin_code">Por favor escreva o novo PIN da Aplicação</string>
- <string name="pincode_configure_your_pin">Escreva o PIN da Aplicação ownCloud</string>
+ <string name="pincode_configure_your_pin">Escreva o PIN da Aplicação</string>
<string name="pincode_configure_your_pin_explanation">O PIN vai ser pedido todas as vezes que iniciar a aplicação.</string>
- <string name="pincode_reenter_your_pincode">Volte a inserir o ownCloud App PIN, por favor</string>
- <string name="pincode_remove_your_pincode">Remover o PIN do ownCloud.</string>
+ <string name="pincode_reenter_your_pincode">Volte a inserir o App PIN, por favor</string>
+ <string name="pincode_remove_your_pincode">Remover o PIN do aplicação.</string>
<string name="pincode_mismatch">Os códigos PIN introduzidos não são iguais.</string>
<string name="pincode_wrong">Código PIN Incorrecto.</string>
- <string name="pincode_removed">PIN da aplicação ownCloud removido</string>
- <string name="pincode_stored">PIN da aplicação ownCloud guardado</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 Minutos</item>
- <item>30 Minutos</item>
- <item>60 Minutos</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_removed">PIN da aplicação removido</string>
+ <string name="pincode_stored">PIN da aplicação guardado</string>
+ <string name="media_notif_ticker">%1$s leitor de música</string>
+ <string name="media_state_playing">A tocar: %1$s</string>
+ <string name="media_state_loading">%1$s (A carregar)</string>
+ <string name="media_event_done">%1$s leitura terminada</string>
+ <string name="media_err_nothing_to_play">Não foi encontrado nenhum ficheiro de média</string>
+ <string name="media_err_no_account">Não foi fornecida conta</string>
+ <string name="media_err_not_in_owncloud">O ficheiro não está numa conta válida</string>
+ <string name="media_err_unsupported">Codec de média não suportado</string>
+ <string name="media_err_io">Não foi possível reproduzir o ficheiro</string>
+ <string name="media_err_malformed">Ficheiro erradamente codificado (codec)</string>
+ <string name="media_err_timeout">O tempo de espera para jogar expirou</string>
+ <string name="media_err_invalid_progressive_playback">O ficheiro não pode ser reproduzido (streaming)</string>
+ <string name="media_err_unknown">O ficheiro não pode ser reproduzido com o leitor de média de origem</string>
+ <string name="media_err_security_ex">Erro de segurança a tentar reproduzir o ficheiro %1$s</string>
+ <string name="media_err_io_ex">Erro de input a tentar reproduzir %1$s</string>
+ <string name="media_err_unexpected">Erro inesperado a tentar reproduzir %1$s</string>
+ <string name="media_rewind_description">Botão de rebobinar</string>
+ <string name="media_play_pause_description">Botão Tocar/Pausa</string>
+ <string name="media_forward_description">Botão de avanço rápido</string>
<string name="auth_trying_to_login">A tentar entrar...</string>
<string name="auth_no_net_conn_title">Sem ligação à rede</string>
- <string name="auth_no_net_conn_message">Não foi detectada uma ligação de dados, por favor verifique se está se encontra activada.</string>
- <string name="auth_connect_anyway">Ligar de qualquer maneira</string>
<string name="auth_nossl_plain_ok_title">Ligação segura indisponível</string>
- <string name="auth_nossl_plain_ok_message">Não foi possível estabelecer uma ligação segura ao servidor, no entanto pode continuar ou cancelar.</string>
<string name="auth_connection_established">Ligação estabelecida</string>
<string name="auth_testing_connection">A testar a ligação...</string>
- <string name="auth_not_configured_title">Configuração do ownCloud incorrecta.</string>
- <string name="auth_not_configured_message">Parece haver um ou mais erros na configuração do ownCloud, por favor contacte o administrador para mais detalhes.</string>
+ <string name="auth_not_configured_title">Configuração do servidor incorrecta.</string>
+ <string name="auth_account_not_new">Uma conta para este utilizador e servidor já existe no dispositivo</string>
+ <string name="auth_account_not_the_same">O utilizador que escreveu não coincide com o nome de utilizador desta conta</string>
<string name="auth_unknown_error_title">Ocorreu um erro desconhecido!</string>
- <string name="auth_unknown_error_message">Ocorreu um erro desconhecido, por favor contacte os autores e inclua os logs de erro.</string>
<string name="auth_unknown_host_title">Não é possível encontrar o servidor</string>
- <string name="auth_unknown_host_message">Não foi possível encontrar o host. Por favor verifique se o nome está correcto, e se o servidor está disponível e tente novamente.</string>
- <string name="auth_incorrect_path_title">Instância ownCloud não encontrada</string>
- <string name="auth_incorrect_path_message">Não foi possível encontrar o ownCloud no caminho dado. Por favor verifique novamente.</string>
+ <string name="auth_incorrect_path_title">Instância servidor não encontrada</string>
<string name="auth_timeout_title">O servidor levou demasiado tempo a responder</string>
<string name="auth_incorrect_address_title">URL errado</string>
<string name="auth_ssl_general_error_title">Inicialização de SSL falhou</string>
- <string name="auth_ssl_unverified_server_title">Identidade SSL do servidor não verificada.</string>
- <string name="auth_bad_oc_version_title">Versão do servidor ownCloud não reconhecida</string>
+ <string name="auth_ssl_unverified_server_title">Não foi possível verificar a identidade SSL do servidor</string>
+ <string name="auth_bad_oc_version_title">Versão do servidor não reconhecida</string>
<string name="auth_wrong_connection_title">Não consegue estabelecer ligação</string>
<string name="auth_secure_connection">Ligação segura estabelecida</string>
- <string name="auth_login_details">Detalhes de entrada</string>
- <string name="auth_unauthorized">Palavra-passe ou nome de utilizador inválidos!</string>
- <string name="auth_not_found">Foi dado um caminho inválido</string>
- <string name="auth_internal">Erro interno de servidor, código: %1$d</string>
- <string name="crashlog_message">A aplicação terminou de forma inesperada. Deseja enviar o relatório do erro?</string>
- <string name="crashlog_send_report">Enviar relatório</string>
- <string name="crashlog_dont_send_report">Não enviar relatório</string>
- <string name="extensions_avail_title">Extensões disponíveis!</string>
- <string name="extensions_avail_message">Parece que a sua instalação do ownCloud suporta extensões avançadas. Deseja ver as extensões disponíveis para Android?</string>
+ <string name="auth_unauthorized">Nome de utilizador/password inválida</string>
+ <string name="auth_oauth_error">autorização mal sucedida</string>
+ <string name="auth_oauth_error_access_denied">Acesso negado pelo servidor</string>
+ <string name="auth_wtf_reenter_URL">Estado inesperado, por favor, digite a URL do servidor novamente</string>
+ <string name="auth_expired_oauth_token_toast">O prazo da sua autorização expirou. Por favor renove-a</string>
+ <string name="auth_expired_basic_auth_toast">Por favor, introduza a password actual</string>
+ <string name="auth_expired_saml_sso_token_toast">A sua sessão expirou. Por favor autentique-se de novo</string>
+ <string name="auth_connecting_auth_server">A verificar a sua autenticação no servidor...</string>
+ <string name="auth_unsupported_auth_method">O servidor não suporta este método de autenticação</string>
+ <string name="auth_unsupported_multiaccount">%1$s não suporta contas múltiplas</string>
<string name="fd_keep_in_sync">manter ficheiro actualizado</string>
- <string name="common_share">Partilhar</string>
<string name="common_rename">Renomear</string>
<string name="common_remove">Remover</string>
<string name="confirmation_remove_alert">Tem a certeza que deseja remover %1$s ?</string>
<string name="rename_server_fail_msg">Não foi possível renomear</string>
<string name="sync_file_fail_msg">Não foi possível verificar o ficheiro remoto</string>
<string name="sync_file_nothing_to_do_msg">O conteúdo do ficheiro já foi sincronizado</string>
- <string name="create_dir_fail_msg">Não foi possível criar a pasta</string>
+ <string name="filename_forbidden_characters">Caracteres não permitidos: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Aguarde um momento</string>
<string name="filedisplay_unexpected_bad_get_content">Erro inesperado. Por favor tente outra aplicação para seleccionar o ficheiro.</string>
<string name="filedisplay_no_file_selected">Não selecionou nenhum ficheiro</string>
- <string name="ssl_validator_title">Aviso</string>
+ <string name="activity_chooser_title">Enviar a ligação para ...</string>
+ <string name="oauth_check_onoff">Autenticar-se com oAuth2</string>
+ <string name="oauth_login_connection">A ligar ao servidor oAuth2</string>
<string name="ssl_validator_header">Não foi possível verificar a identidade do site.</string>
<string name="ssl_validator_reason_cert_not_trusted">- O certificado do servidor não é de confiança</string>
<string name="ssl_validator_reason_cert_expired">- O certificado do servidor expirou</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- O certificado do servidor é muito recente</string>
<string name="ssl_validator_reason_hostname_not_verified">O URL não condiz com o nome no certificado.</string>
- <string name="ssl_validator_certificate_not_available">- Não foi possível obter o certificado do servidor</string>
<string name="ssl_validator_question">Quer confiar neste certificado de qualquer maneira?</string>
<string name="ssl_validator_not_saved">O certificado não pôde ser guardado</string>
<string name="ssl_validator_btn_details_see">Detalhes</string>
<string name="ssl_validator_label_validity_to">Para:</string>
<string name="ssl_validator_label_signature">Assinatura:</string>
<string name="ssl_validator_label_signature_algorithm">Algoritmo</string>
- <string name="text_placeholder">Isto é uma variável.</string>
+ <string name="placeholder_sentence">Isto é uma variável.</string>
+ <string name="placeholder_filename">placeholder.txt</string>
+ <string name="placeholder_filetype">Imagem PNG</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Enviar fotografias apenas via WiFi</string>
<string name="instant_upload_path">/Upload-Instantâneo </string>
<string name="conflict_title">Conflito na actualização</string>
<string name="conflict_keep_both">Manter os dois</string>
<string name="conflict_overwrite">Sobrepor</string>
<string name="conflict_dont_upload">Não enviar.</string>
+ <string name="preview_image_description">Pré-Visualização da imagem</string>
+ <string name="preview_image_error_unknown_format">Esta imagem não pode ser mostrada</string>
+ <string name="actionbar_failed_instant_upload">O envio rápido falhou</string>
+ <string name="failed_upload_headline_text">Falharam os Uploads-Instantâneos</string>
+ <string name="failed_upload_headline_hint">Sumário dos Uploads-Instantâneos falhados</string>
+ <string name="failed_upload_all_cb">Seleccionar Todos</string>
+ <string name="failed_upload_headline_retryall_btn">Tentar todos os seleccionados</string>
+ <string name="failed_upload_headline_delete_all_btn">Eliminar todos os seleccionados da lista de envio</string>
+ <string name="failed_upload_retry_text">Tentar envio da imagem:</string>
+ <string name="failed_upload_load_more_images">Carregar mais imagens</string>
+ <string name="failed_upload_retry_do_nothing_text">não fazer nada, nao está online para o Upload-Instantâneo</string>
+ <string name="failed_upload_failure_text">Mensagem de erro:</string>
+ <string name="failed_upload_quota_exceeded_text">Por favor verifique a configuração do servidor, talvez tenha excedido a sua quota</string>
+ <string name="share_link_file_no_exist">Não é possível partilhar este ficheiro ou pasta. Por favor, verifique se existe</string>
+ <string name="share_link_file_error">Ocorreu um erro enquanto tentava partilhar este ficheiro ou pasta</string>
+ <string name="unshare_link_file_no_exist">Não é possível retirar a partilha deste ficheiro ou pasta. Não existe.</string>
+ <string name="unshare_link_file_error">Ocorreu um erro enquanto retirava a partilha deste ficheiro ou pasta</string>
+ <string name="activity_chooser_send_file_title">Enviar</string>
+ <string name="copy_link">Copiar ligação</string>
+ <string name="clipboard_text_copied">Copiado para a área de transferência</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Parolă:</string>
- <string name="main_login">Nume utilizator:</string>
- <string name="main_button_login">Autentificare</string>
- <string name="main_welcome">Bun venit în propriul tău ownCloud</string>
- <string name="main_files">Fișiere</string>
- <string name="main_music">Muzică</string>
- <string name="main_contacts">Contacte</string>
- <string name="main_calendar">Calendar</string>
- <string name="main_bookmarks">Semne de carte</string>
- <string name="main_settings">Setări</string>
- <string name="main_tit_accsetup">Configurează cont</string>
- <string name="main_wrn_accsetup">Nu există conturi ownCloud pe dispozitivul tău. Pentru a folosi această aplicație, trebuie să creezi un cont.</string>
- <string name="actionbar_sync">Împrospătare</string>
<string name="actionbar_upload">Încarcă</string>
<string name="actionbar_upload_from_apps">Conținut de la alte aplicații</string>
<string name="actionbar_upload_files">Fișiere</string>
- <string name="actionbar_mkdir">Creare director</string>
- <string name="actionbar_search">Căutare</string>
<string name="actionbar_settings">Setări</string>
+ <string name="actionbar_send_file">Expediază</string>
<string name="prefs_category_general">General</string>
- <string name="prefs_category_trackmydevice">Urmărire dispozitiv</string>
- <string name="prefs_add_session">Adaugă sesiune nouă</string>
- <string name="prefs_select_oc_account">Selectează un cont</string>
- <string name="prefs_summary_select_oc_account">Alege contul pe care ar trebui să-l folosească aplicația.</string>
- <string name="prefs_trackmydevice">Urmărire dispozitiv</string>
- <string name="prefs_trackmydevice_summary_off">Permite ownCloud să urmărească locația dispozitivului tău</string>
- <string name="prefs_trackmydevice_summary_on">ownCloud urmărește acest dispozitiv</string>
- <string name="prefs_trackmydevice_interval">Interval actualizare</string>
- <string name="prefs_trackmydevice_interval_summary">Actualizare la fiecare %1$s minute</string>
+ <string name="prefs_category_more">Mai mult</string>
<string name="prefs_accounts">Conturi</string>
<string name="prefs_manage_accounts">Administrare conturi</string>
<string name="prefs_instant_upload">Activează încărcarea instant</string>
- <string name="auth_host_url">URL ownCloud</string>
+ <string name="prefs_help">Ajutor</string>
<string name="auth_username">Nume utilizator</string>
<string name="auth_password">Parolă</string>
- <string name="auth_register">Sunt novice în ownCloud</string>
- <string name="new_session_uri_error">URL specificat greșit</string>
- <string name="new_session_session_name_error">Numele sesiunii este greșit</string>
<string name="sync_string_files">Fișiere</string>
- <string name="uploader_no_file_selected">Nici un fișier selectat pentru încărcare</string>
- <string name="setup_hint_username">Nume utilizator</string>
- <string name="setup_hint_password">Parolă</string>
- <string name="setup_hint_address">Adresă web</string>
- <string name="setup_hint_show_password">Afișare parolă?</string>
- <string name="setup_title">Conectare la ownCloud</string>
<string name="setup_btn_connect">Conectare</string>
<string name="uploader_btn_upload_text">Încărcare</string>
<string name="uploader_wrn_no_account_title">Nici un cont găsit</string>
- <string name="uploader_wrn_no_account_text">Nu există conturi ownCloud pe dispozitivul tău. Te rugăm să configurezi un cont mai întâi.</string>
+ <string name="uploader_wrn_no_account_text">Nu există conturi %1$s pe dispozitivul tău. Te rugăm să configurezi un cont mai întâi.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Configurare</string>
<string name="uploader_wrn_no_account_quit_btn_text">Anulare</string>
<string name="uploader_info_uploading">Încărcare</string>
- <string name="uploader_btn_create_dir_text">Creare director pentru încărcare</string>
<string name="filedetails_size">Mărime:</string>
<string name="filedetails_type">Tip:</string>
<string name="filedetails_created">Creat:</string>
<string name="filedetails_modified">Modificat:</string>
<string name="filedetails_download">Descarcă</string>
- <string name="filedetails_sync_file">Împrospătare</string>
- <string name="filedetails_redownload">Descarcă din nou</string>
- <string name="filedetails_open">Deschide</string>
<string name="common_yes">Da</string>
<string name="common_no">Nu</string>
<string name="common_ok">OK</string>
<string name="common_cancel_upload">Anulează încărcarea</string>
<string name="common_cancel">Anulare</string>
<string name="common_save_exit">Salvare & Ieșire</string>
- <string name="common_exit">Părăsire ownCloud</string>
<string name="common_error">Eroare</string>
+ <string name="common_error_unknown">Eroare necunoscută</string>
<string name="about_title">Despre</string>
+ <string name="change_password">Schimbă parola</string>
<string name="delete_account">Șterge cont</string>
<string name="create_account">Crează cont</string>
<string name="upload_chooser_title">Încarcă din...</string>
- <string name="uploader_info_dirname">Nume director</string>
+ <string name="uploader_info_dirname">Denumire director</string>
<string name="uploader_upload_in_progress_ticker">În curs de încărcare...</string>
<string name="uploader_upload_in_progress_content">%1$d%% Se încarcă %2$s</string>
<string name="uploader_upload_succeeded_ticker">Încărcat cu succes</string>
<string name="uploader_upload_succeeded_content_single">%1$s a fost încărcat cu succes</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d fișiere au fost încărcate cu succes</string>
<string name="uploader_upload_failed_ticker">Încărcarea a eșuat</string>
<string name="uploader_upload_failed_content_single">Încărcarea fișierului %1$s nu a putut fi încheiată</string>
- <string name="uploader_upload_failed_content_multiple">Încărcarea a eșuat: %1$d/%2$d fișiere au fost încărcate</string>
<string name="downloader_download_in_progress_ticker">Se descarcă...</string>
<string name="downloader_download_in_progress_content">%1$d%% Se descarcă %2$s</string>
<string name="downloader_download_succeeded_ticker">Descărcarea a reușit</string>
<string name="downloader_download_succeeded_content">%1$s a fost descărcat cu succes</string>
<string name="downloader_download_failed_ticker">Descărcarea a eșuat</string>
<string name="common_choose_account">Alege cont</string>
- <string name="sync_string_contacts">Contacte</string>
<string name="sync_fail_ticker">Sincronizarea a eșuat</string>
- <string name="use_ssl">Folosește conexiune securizată</string>
- <string name="location_no_provider">ownCloud nu poate urmări dispozitivul tău. Te rugăm să verifici setările pentru locație.</string>
<string name="pincode_enter_pin_code">Te rugăm să specifici PIN-ul aplicației</string>
- <string name="pincode_enter_new_pin_code">Te rugăm să specifici noul PIN pentru aplicație</string>
- <string name="pincode_remove_your_pincode">Elimină PIN-ul aplicației ownCloud</string>
- <string name="pincode_mismatch">Cele două PIN-uri ale aplicației ownCloud nu sunt similare</string>
- <string name="pincode_wrong">PIN-ul aplicației ownCloud este incorect</string>
- <string name="pincode_removed">PIN-ul aplicației ownCloud a fost eliminat</string>
- <string name="pincode_stored">PIN-ul aplicației ownCloud a fost memorat</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 minute</item>
- <item>30 minute</item>
- <item>60 minute</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_remove_your_pincode">Elimină PIN-ul aplicației</string>
+ <string name="pincode_mismatch">Cele două PIN-uri ale aplicației nu sunt similare</string>
+ <string name="pincode_wrong">PIN-ul aplicației este incorect</string>
+ <string name="pincode_removed">PIN-ul aplicației a fost eliminat</string>
+ <string name="pincode_stored">PIN-ul aplicației a fost memorat</string>
<string name="auth_trying_to_login">În curs de autentificare...</string>
<string name="auth_nossl_plain_ok_title">Conexiune securizată indisponibilă</string>
<string name="auth_connection_established">Conexiune stabilită</string>
<string name="auth_testing_connection">Se testează conexiunea...</string>
- <string name="auth_not_configured_title">Configurație ownCloud incorectă</string>
- <string name="auth_not_configured_message">Se pare că instanța ta ownCloud nu este configurată corect. Contactează administratorul pentru mai multe detalii.</string>
+ <string name="auth_not_configured_title">Configurație serverului incorectă</string>
<string name="auth_unknown_error_title">A apărut o eroare necunoscută!</string>
- <string name="auth_incorrect_path_title">Instanța ownCloud nu a fost găsită</string>
+ <string name="auth_incorrect_path_title">Instanța serverului nu a fost găsită</string>
<string name="auth_ssl_general_error_title">Inițializarea SSL a eșuat</string>
<string name="auth_wrong_connection_title">Nu s-a putut stabili conexiunea</string>
<string name="auth_secure_connection">Conexiune sigură stabilită</string>
- <string name="auth_login_details">Detalii autentificare</string>
- <string name="crashlog_message">Aplicația s-a terminat într-un mod neașteptat. Dorești să trimiți un raport despre asta?</string>
- <string name="crashlog_send_report">Trimite raport</string>
- <string name="crashlog_dont_send_report">Nu trimite raport</string>
- <string name="extensions_avail_title">Extensii disponibile!</string>
<string name="fd_keep_in_sync">Păstrează fișierul actualizat</string>
- <string name="common_share">Partajează</string>
<string name="common_rename">Redenumește</string>
<string name="common_remove">Elimină</string>
<string name="confirmation_remove_alert">Sigur dorești să elimini %1$s ?</string>
<string name="confirmation_remove_remote">Elimină de pe server</string>
<string name="remove_success_msg">Eliminat cu succes</string>
<string name="remove_fail_msg">Eliminarea nu a reușit</string>
- <string name="create_dir_fail_msg">Directorul nu a putut fi creat</string>
<string name="wait_a_moment">Așteaptă un moment</string>
<string name="filedisplay_no_file_selected">Nu a fost selectat nici un fișier</string>
- <string name="ssl_validator_title">Atenție</string>
+ <string name="activity_chooser_send_file_title">Expediază</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Пароль:</string>
- <string name="main_login">Имя пользователя:</string>
- <string name="main_button_login">Вход</string>
- <string name="main_welcome">Добро пожаловать в Ваш ownCloud</string>
- <string name="main_files">Файлы</string>
- <string name="main_music">Музыка</string>
- <string name="main_contacts">Контакты</string>
- <string name="main_calendar">Каледарь</string>
- <string name="main_bookmarks">Закладки</string>
- <string name="main_settings">Настройки</string>
- <string name="main_tit_accsetup">Настройка аккаунта</string>
- <string name="main_wrn_accsetup">На Вашем устройстве нет ownCloud-аккаунта. Для того, чтобы использовать это приложение, Вам нужно создать его.</string>
- <string name="about_message">ownCloud Android-клиент\n\nверсия: %1$s</string>
<string name="actionbar_sync">Обновить</string>
<string name="actionbar_upload">Загрузка</string>
<string name="actionbar_upload_from_apps">Содержимое из других приложений</string>
<string name="actionbar_upload_files">Файлы</string>
<string name="actionbar_mkdir">Создать директорию</string>
- <string name="actionbar_search">Поиск</string>
<string name="actionbar_settings">Настройки</string>
+ <string name="actionbar_see_details">Сведения</string>
<string name="prefs_category_general">Общие</string>
- <string name="prefs_category_trackmydevice">Отслеживание устройств</string>
- <string name="prefs_add_session">Добавить новую сессию</string>
- <string name="prefs_create_img_thumbnails">Создание миниатюр</string>
- <string name="prefs_select_oc_account">Выбрать аккаунт</string>
- <string name="prefs_summary_select_oc_account">Выберите, какой из Ваших аккаунтов должен использоваться приложением.</string>
- <string name="prefs_trackmydevice">Отслеживание устройств</string>
- <string name="prefs_trackmydevice_summary_off">Включить ownCloud для отслеживания местоположения устройства</string>
- <string name="prefs_trackmydevice_summary_on">Ваш ownCloud отслеживает данное устройство</string>
- <string name="prefs_trackmydevice_interval">Обновить интервал</string>
- <string name="prefs_trackmydevice_interval_summary">Обновлять каждые %1$s минут</string>
+ <string name="prefs_category_more">Подробнее</string>
<string name="prefs_accounts">Учетные записи</string>
<string name="prefs_manage_accounts">Управление учетными записями</string>
- <string name="prefs_pincode">ownCloud App PIN</string>
- <string name="prefs_pincode_summary">Защитить Ваш ownCloud-клиент</string>
+ <string name="prefs_pincode">App PIN</string>
+ <string name="prefs_pincode_summary">Защитить Ваш клиент</string>
<string name="prefs_instant_upload">Включить немедленную загрузку</string>
<string name="prefs_instant_upload_summary">Мгновенно загрузить фотографии, сделанные камерой</string>
- <string name="auth_host_url">ownCloud URL</string>
+ <string name="prefs_help">Помощь</string>
<string name="auth_username">Имя пользователя</string>
<string name="auth_password">Пароль</string>
- <string name="auth_register">Я новичок в ownCloud</string>
- <string name="new_session_uri_error">Дан неверный URL</string>
- <string name="new_session_session_name_error">Неверное имя сессии</string>
+ <string name="auth_register">Я новичок в %1$s</string>
<string name="sync_string_files">Файлы</string>
- <string name="uploader_no_file_selected">Не выбран файл для загрузки</string>
- <string name="setup_hint_username">Имя пользователя</string>
- <string name="setup_hint_password">Пароль</string>
- <string name="setup_hint_address">Веб-адрес</string>
- <string name="setup_hint_show_password">Показать пароль?</string>
- <string name="setup_title">Подключение к Вашему ownCloud</string>
<string name="setup_btn_connect">Подключить</string>
<string name="uploader_btn_upload_text">Загрузка</string>
<string name="uploader_wrn_no_account_title">Не найден аккаунт</string>
- <string name="uploader_wrn_no_account_text">На Вашем устройстве нет ownCloud-аккаунтов. Пожалуйста, настройте учетную запись.</string>
+ <string name="uploader_wrn_no_account_text">На Вашем устройстве нет %1$s-аккаунтов. Пожалуйста, настройте учетную запись.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Установка</string>
<string name="uploader_wrn_no_account_quit_btn_text">Выход</string>
<string name="uploader_wrn_no_content_title">Нет содержимого для загрузки</string>
<string name="uploader_wrn_no_content_text">Содержимое не было получено. Нечего загружать.</string>
- <string name="uploader_error_forbidden_content">ownCloud не разрешен доступ к общему содержимому</string>
+ <string name="uploader_error_forbidden_content">%1$s не разрешен доступ к общему содержимому</string>
<string name="uploader_info_uploading">Загрузка</string>
- <string name="uploader_btn_create_dir_text">Создайте каталог для загрузки</string>
<string name="file_list_empty">В этой папке нет файлов.\nНовые файлы могут быть добавлены с помощью опции \"Загрузка\" в меню.</string>
<string name="filedetails_select_file">Нажмите на файл, чтобы увидеть дополнительную информацию.</string>
<string name="filedetails_size">Размер:</string>
<string name="filedetails_modified">Модифицировано:</string>
<string name="filedetails_download">Загрузка</string>
<string name="filedetails_sync_file">Обновить</string>
- <string name="filedetails_redownload">Загрузить еще раз</string>
- <string name="filedetails_open">Открыть</string>
<string name="filedetails_renamed_in_upload_msg">Файл был переименован в %1$s во время загрузки</string>
<string name="common_yes">Да</string>
<string name="common_no">Нет</string>
<string name="common_cancel_upload">Отмена загрузки</string>
<string name="common_cancel">Отмена</string>
<string name="common_save_exit">Сохранить & Выход</string>
- <string name="common_exit">Покинуть ownCloud</string>
<string name="common_error">Ошибка</string>
<string name="about_title">О программе</string>
<string name="delete_account">Удалить аккаунт</string>
<string name="uploader_upload_in_progress_content">%1$d%% Загрузка %2$s</string>
<string name="uploader_upload_succeeded_ticker">Загрузка выполнена успешно</string>
<string name="uploader_upload_succeeded_content_single">%1$s был успешно загружен</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d файлы были успешно загружены</string>
<string name="uploader_upload_failed_ticker">Загрузка не удалась</string>
<string name="uploader_upload_failed_content_single">Загрузка %1$s не может быть завершена</string>
- <string name="uploader_upload_failed_content_multiple">Загрузка не удалась: %1$d/%2$d файлы были загружены</string>
<string name="downloader_download_in_progress_ticker">Загрузка …</string>
<string name="downloader_download_in_progress_content">%1$d%% Загрузка %2$s</string>
<string name="downloader_download_succeeded_ticker">Загрузка выполнена успешно</string>
<string name="downloader_download_failed_ticker">Загрузка не удалась</string>
<string name="downloader_download_failed_content">Загрузка %1$s не может быть завершена</string>
<string name="common_choose_account">Выбрать аккаунт</string>
- <string name="sync_string_contacts">Контакты</string>
<string name="sync_fail_ticker">Ошибка синхронизации</string>
<string name="sync_fail_content">Синхронизация %1$s не может быть завершена</string>
<string name="sync_conflicts_in_favourites_ticker">Найдены конфликты</string>
<string name="sync_conflicts_in_favourites_content">%1$d файлы, подлежащие синхронизации, не могут быть синхронизированы</string>
<string name="sync_fail_in_favourites_ticker">Синхронизация файлов не удалась</string>
<string name="sync_fail_in_favourites_content">Содержимое %1$d файлов не может быть синхронизировано (%2$d конфликты)</string>
- <string name="use_ssl">Использовать защищенное соединение</string>
- <string name="location_no_provider">ownCloud не может отследить Ваше устройство. Пожалуйста, проверьте настройки местоположения</string>
<string name="pincode_enter_pin_code">Пожалуйста, введите Ваш PIN-код приложения</string>
- <string name="pincode_enter_new_pin_code">Пожалуйста, введите Ваш новый PIN-код приложения</string>
- <string name="pincode_configure_your_pin">Введите PIN-код приложения ownCloud</string>
+ <string name="pincode_configure_your_pin">Введите PIN-код приложения</string>
<string name="pincode_configure_your_pin_explanation">PIN будет запрашиваться каждый раз при запуске приложения</string>
- <string name="pincode_reenter_your_pincode">Повторно введите PIN-код ownCloud-приложения, пожалуйста</string>
- <string name="pincode_remove_your_pincode">Удалите PIN-код ownCloud-приложения</string>
- <string name="pincode_mismatch">PIN-коды ownCloud-приложения не идентичны</string>
- <string name="pincode_wrong">Неверный PIN-код ownCloud-приложения</string>
- <string name="pincode_removed">PIN-код ownCloud-приложения удален</string>
- <string name="pincode_stored">PIN-код ownCloud-приложения сохранен</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 минут</item>
- <item>30 минут</item>
- <item>60 минут</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_reenter_your_pincode">Повторно введите PIN-код приложения, пожалуйста</string>
+ <string name="pincode_remove_your_pincode">Удалите PIN-код приложения</string>
+ <string name="pincode_mismatch">PIN-коды приложения не идентичны</string>
+ <string name="pincode_wrong">Неверный PIN-код приложения</string>
+ <string name="pincode_removed">PIN-код приложения удален</string>
+ <string name="pincode_stored">PIN-код приложения сохранен</string>
<string name="auth_trying_to_login">Попытка входа ...</string>
<string name="auth_no_net_conn_title">Нет подключения к сети</string>
- <string name="auth_no_net_conn_message">Подключения к сети не были обнаружены, проверьте подключение к Интернету и повторите попытку.</string>
- <string name="auth_connect_anyway">Подключить все равно</string>
<string name="auth_nossl_plain_ok_title">Защищенное соединение недоступно.</string>
- <string name="auth_nossl_plain_ok_message">Приложению не удалось установить безопасное подключение к серверу. Но небезопасное соединение доступно. Вы можете продолжить или отменить.</string>
<string name="auth_connection_established">Соединение установлено</string>
<string name="auth_testing_connection">Тестирование соединения…</string>
- <string name="auth_not_configured_title">Некорректная ownCloud-конфигурация</string>
- <string name="auth_not_configured_message">Похоже, что Ваш ownCloud неправильно настроен. Обратитесь к администратору для получения дополнительной информации.</string>
+ <string name="auth_not_configured_title">Некорректная сервер-конфигурация</string>
<string name="auth_unknown_error_title">Произошла неизвестная ошибка!</string>
- <string name="auth_unknown_error_message">Произошла неизвестная ошибка. Пожалуйста, свяжитесь с разработчиками и отправьте журнал с устройства.</string>
<string name="auth_unknown_host_title">Не удалось найти хост</string>
- <string name="auth_unknown_host_message">Не удалось найти введенный хост. Пожалуйста, проверьте имя хоста и доступность сервера и попробуйте снова</string>
- <string name="auth_incorrect_path_title">ownCloud не найден</string>
- <string name="auth_incorrect_path_message">Приложение не может найти экземпляр ownClound по предложенному пути. Пожалуйста, проверьте путь и попробуйте еще раз.</string>
+ <string name="auth_incorrect_path_title">сервер не найден</string>
<string name="auth_timeout_title">Ответ сервера занимает слишком много времени</string>
<string name="auth_incorrect_address_title">Адрес URL неверен</string>
<string name="auth_ssl_general_error_title">SSL-инициализация не удалась</string>
- <string name="auth_ssl_unverified_server_title">Непроверенная SSL идентификация сервера</string>
- <string name="auth_bad_oc_version_title">Неизвестная версия сервера ownCloud </string>
+ <string name="auth_bad_oc_version_title">Неизвестная версия сервера сервер </string>
<string name="auth_wrong_connection_title">Не удалось установить соединение</string>
<string name="auth_secure_connection">Защищенное соединение установлено</string>
- <string name="auth_login_details">Учетные данные</string>
<string name="auth_unauthorized">Неверный логин / пароль</string>
- <string name="auth_not_found">Указан неверный путь</string>
- <string name="auth_internal">Внутренняя ошибка сервера с кодом %1$d</string>
- <string name="crashlog_message">Приложение неожиданно завершило работу. Хотели бы вы отправить отчет о неполадках?</string>
- <string name="crashlog_send_report">Отправить отчет</string>
- <string name="crashlog_dont_send_report">Не отправлять отчет</string>
- <string name="extensions_avail_title">Расширения доступны!</string>
- <string name="extensions_avail_message">Похоже, ваш экземпляр ownCloud поддерживает дополнительные расширения. Хотели бы вы видеть расширения, доступные для Android?</string>
<string name="fd_keep_in_sync">Обновлять файл</string>
- <string name="common_share">Сделать общим</string>
<string name="common_rename">Переименовать</string>
<string name="common_remove">Удалить</string>
<string name="confirmation_remove_alert">Вы действительно хотите удалить %1$s?</string>
<string name="wait_a_moment">Подождите</string>
<string name="filedisplay_unexpected_bad_get_content">Неожиданная проблема; пожалуйста, попробуйте другое приложение для выбора файла</string>
<string name="filedisplay_no_file_selected">Файл не был выбран</string>
- <string name="ssl_validator_title">Предупреждение</string>
<string name="ssl_validator_header">Идентификация сайта не может быть проверена</string>
<string name="ssl_validator_reason_cert_not_trusted">- Сертификат сервера недостоверен</string>
<string name="ssl_validator_reason_cert_expired">- Сертификат сервера истек</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- Сертификат сервера еще не действителен</string>
<string name="ssl_validator_reason_hostname_not_verified">- URL не соответствует имени хоста в сертификате</string>
- <string name="ssl_validator_certificate_not_available">Сертификат сервера не может быть получен</string>
<string name="ssl_validator_question">Хотите объявить этот сертификат надежным в любом случае?</string>
<string name="ssl_validator_not_saved">Этот сертификат не может быть сохранен</string>
<string name="ssl_validator_btn_details_see">Сведения</string>
<string name="ssl_validator_label_validity_to">Для:</string>
<string name="ssl_validator_label_signature">Подпись:</string>
<string name="ssl_validator_label_signature_algorithm">Алгоритм:</string>
- <string name="text_placeholder">Это заполнитель</string>
<string name="instant_upload_on_wifi">Загрузать изображения только посредством WiFi </string>
<string name="instant_upload_path">/НемедленнаяЗагрузка</string>
<string name="conflict_title">Конфликт обновления</string>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Пароль:</string>
- <string name="main_login">Пользователь:</string>
- <string name="main_button_login">Вход</string>
- <string name="main_welcome">Добро пожаловать в ваш ownCloud</string>
- <string name="main_files">Файлы</string>
- <string name="main_music">Музыка</string>
- <string name="main_contacts">Контакты</string>
- <string name="main_calendar">Календарь</string>
- <string name="main_bookmarks">Закладки</string>
- <string name="main_settings">Настройки</string>
- <string name="main_tit_accsetup">Настроить аккаунт</string>
- <string name="main_wrn_accsetup">На вашем устройстве нет ownCloud аккаунтов. Вам нужно создать аккаунт, чтобы пользоваться этим приложеним.</string>
- <string name="about_message">ownCloud клиент для Android\n\nверсия: %1$s</string>
- <string name="actionbar_sync">Обновить</string>
- <string name="actionbar_upload">Загрузка</string>
- <string name="actionbar_upload_from_apps">Содержимое от других приложений</string>
+ <string name="about_android">%1$s Приложение для Андроида</string>
+ <string name="about_version">Версия %1$s</string>
+ <string name="actionbar_sync">Обновить учетную запись</string>
+ <string name="actionbar_upload">Загрузить</string>
+ <string name="actionbar_upload_from_apps">Содержимое из других приложений</string>
<string name="actionbar_upload_files">Файлы</string>
- <string name="actionbar_mkdir">Создать директорию</string>
- <string name="actionbar_search">Найти</string>
+ <string name="actionbar_open_with">Открыть с помощью</string>
+ <string name="actionbar_mkdir">Новый каталог</string>
<string name="actionbar_settings">Настройки</string>
- <string name="prefs_category_general">Главные</string>
- <string name="prefs_category_trackmydevice">Отслеживание устройства</string>
- <string name="prefs_add_session">Добавить новую сессию</string>
- <string name="prefs_create_img_thumbnails">Создать картинки для предпросмотра</string>
- <string name="prefs_select_oc_account">Выбрать аккаунт</string>
- <string name="prefs_summary_select_oc_account">Выберите, какой из ваших аккаунтов использовать приложению</string>
- <string name="prefs_trackmydevice">Отслеживание устройства</string>
- <string name="prefs_trackmydevice_summary_off">Разрешить ownCloud отслеживать местонахождение вашего устройства</string>
- <string name="prefs_trackmydevice_summary_on">Ваш ownCloud продолжает отслеживать это устройство</string>
- <string name="prefs_trackmydevice_interval">Обновить интервал</string>
- <string name="prefs_trackmydevice_interval_summary">Обновлять каждые %1$s минут</string>
- <string name="prefs_accounts">Аккаунты</string>
- <string name="prefs_manage_accounts">Управление аккаунтами</string>
- <string name="prefs_pincode">ownCloud App PIN</string>
- <string name="prefs_pincode_summary">Защитить ваш клиент ownCloud</string>
- <string name="prefs_instant_upload">Включить моментальную загрузку</string>
- <string name="prefs_instant_upload_summary">Моментально загружать фотографии, полученные с камеры</string>
- <string name="auth_host_url">Ссылка на ownCloud</string>
- <string name="auth_username">Пользователь</string>
+ <string name="actionbar_see_details">Подробно</string>
+ <string name="actionbar_send_file">Отправить</string>
+ <string name="prefs_category_general">Основные</string>
+ <string name="prefs_category_more">Больше</string>
+ <string name="prefs_accounts">Учётные записи</string>
+ <string name="prefs_manage_accounts">Управление учётными записями</string>
+ <string name="prefs_pincode">App PIN</string>
+ <string name="prefs_pincode_summary">Защитить ваш клиент</string>
+ <string name="prefs_instant_upload">Включить режим немедленной загрузки</string>
+ <string name="prefs_instant_upload_summary">Немедленно загружать фотографии, полученные с камеры</string>
+ <string name="prefs_log_title">Включить журналирование</string>
+ <string name="prefs_log_summary">Используется для регистрации ошибок</string>
+ <string name="prefs_log_title_history">Журнал</string>
+ <string name="prefs_log_summary_history">Здесь показаны записи в журнал</string>
+ <string name="prefs_log_delete_history_button">Удалить историю записей</string>
+ <string name="prefs_help">Помощь</string>
+ <string name="prefs_recommend">Рекомендовать другу</string>
+ <string name="prefs_feedback">Обратная связь</string>
+ <string name="prefs_imprint">Штамп</string>
+ <string name="recommend_subject">Попробуйте %1$s на вашем смартфоне!</string>
+ <string name="auth_check_server">Проверить сервер</string>
+ <string name="auth_host_url">Адрес сервера https://...</string>
+ <string name="auth_username">Имя пользователя</string>
<string name="auth_password">Пароль</string>
- <string name="auth_register">Я новичёк в ownCloud</string>
- <string name="new_session_uri_error">Дана неверная ссылка</string>
- <string name="new_session_session_name_error">Неверное имя сессии</string>
+ <string name="auth_register">Незнакомы с %1$s?</string>
<string name="sync_string_files">Файлы</string>
- <string name="uploader_no_file_selected">Файлы для загрузки не выбраны</string>
- <string name="setup_hint_username">Пользователь</string>
- <string name="setup_hint_password">Пароль</string>
- <string name="setup_hint_address">Веб адрес</string>
- <string name="setup_hint_show_password">Показать пароль?</string>
- <string name="setup_title">Соединение с вашим ownCloud</string>
<string name="setup_btn_connect">Соединить</string>
- <string name="uploader_btn_upload_text">Ð\97агÑ\80Ñ\83зка</string>
- <string name="uploader_wrn_no_account_title">Ð\90ккаÑ\83нÑ\82Ñ\8b не найденÑ\8b</string>
- <string name="uploader_wrn_no_account_text">На вашем устройстве нет аккаунтов ownCloud. Настройте сначала аккаунт.</string>
+ <string name="uploader_btn_upload_text">Ð\97агÑ\80Ñ\83зиÑ\82Ñ\8c</string>
+ <string name="uploader_wrn_no_account_title">УÑ\87Ñ\91Ñ\82наÑ\8f запиÑ\81Ñ\8c не найдена</string>
+ <string name="uploader_wrn_no_account_text">На вашем устройстве нет учётных записей %1$s. Сначала нужно настроить учётную запись.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Установка</string>
<string name="uploader_wrn_no_account_quit_btn_text">Выход</string>
<string name="uploader_wrn_no_content_title">Нет содержимого для загрузки</string>
- <string name="uploader_wrn_no_content_text">Ð\9aонÑ\82енÑ\82 не полÑ\83Ñ\87ен. Нечего загружать.</string>
- <string name="uploader_error_forbidden_content">ownCloud не имеет доступа к опубликованным данным</string>
+ <string name="uploader_wrn_no_content_text">СодеÑ\80жимое не полÑ\83Ñ\87ено. Нечего загружать.</string>
+ <string name="uploader_error_forbidden_content">%1$s не имеет доступа к опубликованным данным</string>
<string name="uploader_info_uploading">Загрузка</string>
- <string name="uploader_btn_create_dir_text">Создайте директорию для загрузки</string>
- <string name="file_list_empty">В этой папке нет файлов.\nНовые файлы могут быть добавлены с помощью пункта меню \"Загрузить\".</string>
+ <string name="file_list_empty">В этом каталоге нет файлов.\nНовые файлы могут быть добавлены с помощью пункта меню \"Загрузить\".</string>
<string name="filedetails_select_file">Нажмите на файл для отображения дополнительной информации.</string>
<string name="filedetails_size">Размер:</string>
<string name="filedetails_type">Тип:</string>
<string name="filedetails_created">Создан:</string>
<string name="filedetails_modified">Изменён:</string>
<string name="filedetails_download">Скачать</string>
- <string name="filedetails_sync_file">Обновить</string>
- <string name="filedetails_redownload">Скачать заново</string>
- <string name="filedetails_open">Открыть</string>
+ <string name="filedetails_sync_file">Обновить файл</string>
<string name="filedetails_renamed_in_upload_msg">Файл был переименован в %1$s во время загрузки</string>
+ <string name="action_share_file">Поделиться ссылкой</string>
+ <string name="action_unshare_file">Удалить ссылку</string>
<string name="common_yes">Да</string>
<string name="common_no">Нет</string>
<string name="common_ok">ОК</string>
<string name="common_cancel_download">Отменить скачивание</string>
- <string name="common_cancel_upload">Ð\9eÑ\82мена загÑ\80Ñ\83зки</string>
+ <string name="common_cancel_upload">Ð\9eÑ\82мениÑ\82Ñ\8c загÑ\80Ñ\83зкÑ\83</string>
<string name="common_cancel">Отмена</string>
<string name="common_save_exit">Сохранить & Выйти</string>
- <string name="common_exit">Выйти из ownCloud</string>
<string name="common_error">Ошибка</string>
+ <string name="common_loading">Идёт загрузка...</string>
+ <string name="common_error_unknown">Неизвестная ошибка</string>
<string name="about_title">О программе</string>
- <string name="delete_account">Удалить аккаунт</string>
- <string name="create_account">Создать аккаунт</string>
+ <string name="change_password">Сменить пароль</string>
+ <string name="delete_account">Удалить учётную запись</string>
+ <string name="create_account">Создать учётную запись</string>
<string name="upload_chooser_title">Загрузить из...</string>
- <string name="uploader_info_dirname">Ð\98мÑ\8f диÑ\80екÑ\82оÑ\80ии</string>
+ <string name="uploader_info_dirname">Ð\98мÑ\8f папки</string>
<string name="uploader_upload_in_progress_ticker">Загрузка...</string>
<string name="uploader_upload_in_progress_content">%1$d%% загрузки %2$s</string>
- <string name="uploader_upload_succeeded_ticker">Ð\97агÑ\80Ñ\83зка пÑ\80оÑ\88ла Ñ\83Ñ\81пеÑ\88но</string>
+ <string name="uploader_upload_succeeded_ticker">Ð\97агÑ\80Ñ\83зка завеÑ\80Ñ\88ена</string>
<string name="uploader_upload_succeeded_content_single">%1$s был успешно загружен</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d файлов было успешно загружено</string>
<string name="uploader_upload_failed_ticker">Ошибка загрузки</string>
<string name="uploader_upload_failed_content_single">Загрузка %1$s не может быть завершена</string>
- <string name="uploader_upload_failed_content_multiple">Загрузка неудалась: %1$d/%2$d файла было загружено</string>
<string name="downloader_download_in_progress_ticker">Скачивание...</string>
<string name="downloader_download_in_progress_content">%1$d%% скачивания %2$s</string>
- <string name="downloader_download_succeeded_ticker">СкаÑ\87ивание пÑ\80оÑ\88ло Ñ\83Ñ\81пеÑ\88но</string>
+ <string name="downloader_download_succeeded_ticker">СкаÑ\87ивание завеÑ\80Ñ\88ено</string>
<string name="downloader_download_succeeded_content">%1$s успешно скачан</string>
- <string name="downloader_download_failed_ticker">СкаÑ\87ивание не Ñ\83далась</string>
+ <string name="downloader_download_failed_ticker">СкаÑ\87ивание не Ñ\83далось</string>
<string name="downloader_download_failed_content">Скачивание %1$s не может быть завершено</string>
- <string name="common_choose_account">Выберите аккаунт</string>
- <string name="sync_string_contacts">Контакты</string>
+ <string name="downloader_not_downloaded_yet">Ещё не скачано</string>
+ <string name="common_choose_account">Выберите учётную запись</string>
<string name="sync_fail_ticker">Синхронизация прошла неудачно</string>
<string name="sync_fail_content">Синхронизация %1$s не может быть завершена</string>
+ <string name="sync_fail_content_unauthorized">Неверный пароль для %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Обнаружены конфликты</string>
- <string name="sync_conflicts_in_favourites_content">%1$d файлы, которые должны быть синхронизированными не могут синхронизироваться</string>
+ <string name="sync_conflicts_in_favourites_content">%1$d файлы не могут быть синхронизированы</string>
<string name="sync_fail_in_favourites_ticker">Не удалось синхронизировать файлы</string>
- <string name="sync_fail_in_favourites_content">Содержание %1$d файла(ов) не может быть синхронизировано (%2$d конфликта(ов))</string>
- <string name="use_ssl">Использовать защищённое соединение</string>
- <string name="location_no_provider">ownCloud не может отслеживать ваше устройство. Проверьте настройки вашего местоположения</string>
+ <string name="sync_fail_in_favourites_content">Содержимое %1$d файлов не может быть синхронизировано (конфликтов: %2$d)</string>
+ <string name="sync_foreign_files_forgotten_ticker">Несколько локальных файлов были забыты</string>
+ <string name="sync_current_folder_was_removed">Каталог %1$s больше не существует</string>
+ <string name="foreign_files_move">Переместить всё</string>
+ <string name="foreign_files_success">Все файлы были перемещены</string>
+ <string name="foreign_files_fail">Некоторые файлы не могут быть перемещены</string>
+ <string name="foreign_files_local_text">Локально: %1$s</string>
+ <string name="foreign_files_remote_text">Удаленно: %1$s</string>
+ <string name="upload_query_move_foreign_files">Недостаточно места для копирования выделенных файлов в каталог %1$s. Переместить их в другое место?</string>
<string name="pincode_enter_pin_code">Вставьте PIN вашего приложения</string>
- <string name="pincode_enter_new_pin_code">Введите новый ownCloud App PIN</string>
- <string name="pincode_configure_your_pin">Введите ownCloud App PIN</string>
- <string name="pincode_configure_your_pin_explanation">ПИН-код будет запрашиваться каждый раз, когда вы запускаете приложение.</string>
- <string name="pincode_reenter_your_pincode">Повторите ownCloud App PIN</string>
- <string name="pincode_remove_your_pincode">Удалить ownCloud App PIN</string>
- <string name="pincode_mismatch">Два ownCloud App PIN не совпадают</string>
- <string name="pincode_wrong">Неверный ownCloud App PIN</string>
- <string name="pincode_removed">ownCloud App PIN удалён</string>
- <string name="pincode_stored">ownCloud App PIN сохранён</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 Минут</item>
- <item>30 Минут</item>
- <item>60 Минут</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_configure_your_pin">Введите App PIN</string>
+ <string name="pincode_configure_your_pin_explanation">PIN-код будет запрашиваться при каждом запуске приложения.</string>
+ <string name="pincode_reenter_your_pincode">Повторите ввод App PIN</string>
+ <string name="pincode_remove_your_pincode">Удалить App PIN</string>
+ <string name="pincode_mismatch">Введённые App PIN не совпадают</string>
+ <string name="pincode_wrong">Неверный App PIN</string>
+ <string name="pincode_removed">App PIN удалён</string>
+ <string name="pincode_stored">App PIN сохранён</string>
+ <string name="media_notif_ticker">%1$s аудиоплеер</string>
+ <string name="media_state_playing">%1$s (проигрывается)</string>
+ <string name="media_state_loading">%1$s (загружается)</string>
+ <string name="media_event_done">%1$s воспроизведение завершено</string>
+ <string name="media_err_nothing_to_play">Медиафайлов не найдено</string>
+ <string name="media_err_no_account">Учётная запись не настроена</string>
+ <string name="media_err_not_in_owncloud">Файл в неверной учётной записи</string>
+ <string name="media_err_unsupported">Неподдерживаемый кодек</string>
+ <string name="media_err_io">Медиафайл не может быть прочитан</string>
+ <string name="media_err_malformed">Медиафайл некорректно закодирован</string>
+ <string name="media_err_timeout">Время попыток воспроизведения вышло</string>
+ <string name="media_err_invalid_progressive_playback">Невозможно организовать потоковую передачу медиафайла</string>
+ <string name="media_err_unknown">Медиафайл не может быть проигран стандартным плеером</string>
+ <string name="media_err_security_ex">Ошибка безопасности при воспроизведении %1$s</string>
+ <string name="media_err_io_ex">Ошибка ввода при воспроизведении %1$s</string>
+ <string name="media_err_unexpected">Неожиданная ошибка при воспроизведении %1$s</string>
+ <string name="media_rewind_description">Перемотка назад</string>
+ <string name="media_play_pause_description">Воспроизведение или пауза</string>
+ <string name="media_forward_description">Перемотка вперед</string>
<string name="auth_trying_to_login">Попытка входа...</string>
<string name="auth_no_net_conn_title">Нет сетевого соединения</string>
- <string name="auth_no_net_conn_message">Сетевое соединение не обнаружено , проверьте соединение с Интернет и попробуйте ещё раз.</string>
- <string name="auth_connect_anyway">Соединить всё равно</string>
<string name="auth_nossl_plain_ok_title">Защищённое соединение недоступно.</string>
- <string name="auth_nossl_plain_ok_message">Приложение не может установить защищённое соединение с сервером. Однако доступно не защищённое соединение. Вы можете продолжить или прервать.</string>
<string name="auth_connection_established">Соединение установлено</string>
<string name="auth_testing_connection">Тестирование соединения...</string>
- <string name="auth_not_configured_title">Неверная конфигурация ownCloud</string>
- <string name="auth_not_configured_message">Похоже что ваш экземпляр ownCloud не был корректно сконфигурирован. Обратитесь за деталями к вашему администратору.</string>
+ <string name="auth_not_configured_title">Конфигурация сервера задана неверно</string>
+ <string name="auth_account_not_new">Учётная запись такого пользователя и сервера уже существует на устройстве</string>
+ <string name="auth_account_not_the_same">Введённый пользователь не соответствует этой учётной записи</string>
<string name="auth_unknown_error_title">Произошла неизвестная ошибка!</string>
- <string name="auth_unknown_error_message">Произошла неизвестная ошибка. Свяжитесь с авторами и приложите журнал с вашего устройства.</string>
<string name="auth_unknown_host_title">Невозможно найти сервер</string>
- <string name="auth_unknown_host_message">Невозможно найти введённый сервер. Проверьте имя сервера и его доступность, затем попробуйте ещё раз.</string>
- <string name="auth_incorrect_path_title">Экземпляр ownCloud не найден</string>
- <string name="auth_incorrect_path_message">Приложение не может обнаружить ownClound по указанному пути. Проверьте путь и попробуйте ещё раз.</string>
+ <string name="auth_incorrect_path_title">Сервер не найден</string>
<string name="auth_timeout_title">Сервер слишком долго не отвечает</string>
<string name="auth_incorrect_address_title">Неверный URL</string>
<string name="auth_ssl_general_error_title">Ошибка инициализации SSL</string>
- <string name="auth_ssl_unverified_server_title">Ð\9dепÑ\80овеÑ\80еннÑ\8bй иденÑ\82иÑ\84икаÑ\82оÑ\80 SSL сервера</string>
- <string name="auth_bad_oc_version_title">Неизвестная версия сервера ownCloud</string>
+ <string name="auth_ssl_unverified_server_title">Ð\9dевозможно пÑ\80овеÑ\80иÑ\82Ñ\8c SSL-Ñ\81еÑ\80Ñ\82иÑ\84икаÑ\82 сервера</string>
+ <string name="auth_bad_oc_version_title">Неизвестная версия сервера</string>
<string name="auth_wrong_connection_title">Невозможно установить соединение</string>
<string name="auth_secure_connection">Защищённое соединение установлено</string>
- <string name="auth_login_details">Детали входа</string>
- <string name="auth_unauthorized">Неправильный логин / пароль</string>
- <string name="auth_not_found">Указан неверный путь</string>
- <string name="auth_internal">Внутренняя ошибка сервера, код %1$d</string>
- <string name="crashlog_message">Приложение завершилось неожиданно. Хотите отправить аварийный отчёт?</string>
- <string name="crashlog_send_report">Отправить отчёт</string>
- <string name="crashlog_dont_send_report">Не отправлять отчёт</string>
- <string name="extensions_avail_title">Доступны расширения!</string>
- <string name="extensions_avail_message">Похоже, ваш экземпляр ownCloud поддерживает дополнительные расширения. Хотите посмотреть доступные для андроида обновления?</string>
+ <string name="auth_unauthorized">Неверное имя пользователя или пароль</string>
+ <string name="auth_oauth_error">Ошибка авторизации</string>
+ <string name="auth_oauth_error_access_denied">Сервер авторизации отказал в доступе</string>
+ <string name="auth_wtf_reenter_URL">Неожиданный ответ; введите адрес сервера ещё раз</string>
+ <string name="auth_expired_oauth_token_toast">Время авторизации истекло. Пожалуйста, авторизуйтесь снова</string>
+ <string name="auth_expired_basic_auth_toast">Пожалуйста, введите пароль</string>
+ <string name="auth_expired_saml_sso_token_toast">Время сессии истекло. Пожалуйста, подключитесь снова</string>
+ <string name="auth_connecting_auth_server">Подключение к серверу аутентификации...</string>
+ <string name="auth_unsupported_auth_method">Сервер не поддерживает выбранный метод аутентификации</string>
+ <string name="auth_unsupported_multiaccount">%1$s не поддерживает сразу несколько учётных записей</string>
+ <string name="auth_can_not_auth_against_server">Не могу авторизоваться на этом сервере </string>
<string name="fd_keep_in_sync">Обновлять файл</string>
- <string name="common_share">Открыть доступ</string>
<string name="common_rename">Переименовать</string>
<string name="common_remove">Удалить</string>
- <string name="confirmation_remove_alert">Ð\92Ñ\8b в Ñ\81амом деле хотите удалить %1$s ?</string>
- <string name="confirmation_remove_folder_alert">Вы действительно хотите удалить %1$s и его содержимое ?</string>
+ <string name="confirmation_remove_alert">Ð\92Ñ\8b дейÑ\81Ñ\82виÑ\82елÑ\8cно хотите удалить %1$s ?</string>
+ <string name="confirmation_remove_folder_alert">Вы действительно хотите удалить %1$s и его содержимое?</string>
<string name="confirmation_remove_local">Только локально</string>
<string name="confirmation_remove_folder_local">Только локальные данные</string>
<string name="confirmation_remove_remote">Удалить с сервера</string>
- <string name="confirmation_remove_remote_and_local">Ð\98 Ñ\83далённо и локально</string>
- <string name="remove_success_msg">Успешное удаление</string>
- <string name="remove_fail_msg">Удаление не можеÑ\82 бÑ\8bÑ\82Ñ\8c завеÑ\80Ñ\88ено</string>
+ <string name="confirmation_remove_remote_and_local">Удалённо и локально</string>
+ <string name="remove_success_msg">Удаление завершено</string>
+ <string name="remove_fail_msg">Ð\9eÑ\88ибка Ñ\83далениÑ\8f</string>
<string name="rename_dialog_title">Введите новое имя</string>
<string name="rename_local_fail_msg">Локальная копия не может быть переименована; попробуйте другое имя</string>
<string name="rename_server_fail_msg">Переименование не может быть завершено</string>
<string name="sync_file_fail_msg">Удаленный файл не может быть проверен</string>
<string name="sync_file_nothing_to_do_msg">Содержимое файла уже синхронизировано</string>
- <string name="create_dir_fail_msg">Директория не может быть создана</string>
+ <string name="filename_forbidden_characters">Недопустимые символы: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Подождите немного</string>
- <string name="filedisplay_unexpected_bad_get_content">Ð\9dеизвеÑ\81Ñ\82наÑ\8f оÑ\88ибка; попÑ\80обÑ\83йÑ\82е дÑ\80Ñ\83гое пÑ\80иложение длÑ\8f вÑ\8bбоÑ\80а Ñ\84айла</string>
+ <string name="filedisplay_unexpected_bad_get_content">Ð\9dеизвеÑ\81Ñ\82наÑ\8f оÑ\88ибка; вÑ\8bбеÑ\80иÑ\82е Ñ\8dÑ\82оÑ\82 Ñ\84айл из дÑ\80Ñ\83гого пÑ\80иложениÑ\8f</string>
<string name="filedisplay_no_file_selected">Файлы не выбраны</string>
- <string name="ssl_validator_title">Предупреждение</string>
+ <string name="activity_chooser_title">Отправить ссылку...</string>
+ <string name="oauth_check_onoff">Войти через oAuth2</string>
+ <string name="oauth_login_connection">Подключение к серверу oAuth2...</string>
<string name="ssl_validator_header">Подлинность сайта не может быть проверена</string>
<string name="ssl_validator_reason_cert_not_trusted">- Сертификат сервера не является доверенным</string>
<string name="ssl_validator_reason_cert_expired">- Срок действия сертификата сервера истёк</string>
- <string name="ssl_validator_reason_cert_not_yet_valid">- Сертификат сервера слишком новый</string>
- <string name="ssl_validator_reason_hostname_not_verified">- Адрес не совпадает с именем в сертификате</string>
- <string name="ssl_validator_certificate_not_available">Сертификат сервера не доступен</string>
- <string name="ssl_validator_question">Все-равно доверять данному сертификату?</string>
+ <string name="ssl_validator_reason_cert_not_yet_valid">- Срок действия сертификата сервера ещё не начался</string>
+ <string name="ssl_validator_reason_hostname_not_verified">- URL не совпадает с именем сервера в сертификате</string>
+ <string name="ssl_validator_question">Вы хотите доверять данному сертификату в любом случае?</string>
<string name="ssl_validator_not_saved">Сертификат не может быть сохранён</string>
- <string name="ssl_validator_btn_details_see">Ð\94еÑ\82али</string>
- <string name="ssl_validator_btn_details_hide">СпÑ\80Ñ\8fÑ\82ать</string>
- <string name="ssl_validator_label_subject">Ð\92Ñ\8bдано длÑ\8f:</string>
- <string name="ssl_validator_label_issuer">Ð\92Ñ\8bдан:</string>
+ <string name="ssl_validator_btn_details_see">Ð\9fодÑ\80обно</string>
+ <string name="ssl_validator_btn_details_hide">СкÑ\80Ñ\8bть</string>
+ <string name="ssl_validator_label_subject">Ð\9aомÑ\83 вÑ\8bдано:</string>
+ <string name="ssl_validator_label_issuer">Ð\9aем вÑ\8bдано:</string>
<string name="ssl_validator_label_CN">Имя:</string>
<string name="ssl_validator_label_O">Организация:</string>
<string name="ssl_validator_label_OU">Организационное подразделение:</string>
<string name="ssl_validator_label_C">Страна:</string>
- <string name="ssl_validator_label_ST">СÑ\82аÑ\82Ñ\83Ñ\81:</string>
+ <string name="ssl_validator_label_ST">ШÑ\82аÑ\82:</string>
<string name="ssl_validator_label_L">Местонахождение:</string>
<string name="ssl_validator_label_validity">Срок действия:</string>
- <string name="ssl_validator_label_validity_from">Ð\9eÑ\82:</string>
- <string name="ssl_validator_label_validity_to">Ð\94о:</string>
+ <string name="ssl_validator_label_validity_from">Ð\98з:</string>
+ <string name="ssl_validator_label_validity_to">Ð\92:</string>
<string name="ssl_validator_label_signature">Подпись:</string>
<string name="ssl_validator_label_signature_algorithm">Алгоритм:</string>
- <string name="text_placeholder">Это заполнитель</string>
- <string name="instant_upload_on_wifi">Загружать изображения только через WiFi</string>
+ <string name="ssl_validator_null_cert">Сертификат не может быть показан.</string>
+ <string name="ssl_validator_no_info_about_error">Информации об ошибке нет</string>
+ <string name="placeholder_sentence">Это заполнитель</string>
+ <string name="placeholder_filename">placeholder.txt</string>
+ <string name="placeholder_filetype">Изображение PNG</string>
+ <string name="placeholder_filesize">389 КБ</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
+ <string name="instant_upload_on_wifi">Загружать изображения только через Wi-Fi</string>
<string name="instant_upload_path">/InstantUpload</string>
<string name="conflict_title">Конфликт обновления</string>
- <string name="conflict_message">УдаленнÑ\8bй Ñ\84айл %s не Ñ\81инÑ\85Ñ\80онизиÑ\80ован Ñ\81 локалÑ\8cнÑ\8bм. Ð\97авеÑ\80Ñ\88ение пÑ\80иведеÑ\82 к замене Ñ\81одеÑ\80жаниÑ\8f файла на сервере.</string>
- <string name="conflict_keep_both">Ð\9eÑ\81Ñ\82авить оба</string>
+ <string name="conflict_message">УдаленнÑ\8bй Ñ\84айл %s не Ñ\81инÑ\85Ñ\80онизиÑ\80ован Ñ\81 локалÑ\8cнÑ\8bм. Ð\9fÑ\80одолжение пÑ\80иведеÑ\82 к замене Ñ\81одеÑ\80жимого файла на сервере.</string>
+ <string name="conflict_keep_both">СоÑ\85Ñ\80анить оба</string>
<string name="conflict_overwrite">Заменить</string>
<string name="conflict_dont_upload">Не загружать</string>
+ <string name="preview_image_description">Предпросмотр</string>
+ <string name="preview_image_error_unknown_format">Это изображение не может быть показано</string>
+ <string name="actionbar_failed_instant_upload">Сбой немедленной загрузки</string>
+ <string name="failed_upload_headline_text">Сбой немедленной загрузки</string>
+ <string name="failed_upload_headline_hint">Сводка по всем сбойным немедленным загрузкам</string>
+ <string name="failed_upload_all_cb">Выбрать всё</string>
+ <string name="failed_upload_headline_retryall_btn">Ещё раз попробовать всё выделенное</string>
+ <string name="failed_upload_headline_delete_all_btn">Удалить выбранное из очереди загрузки</string>
+ <string name="failed_upload_retry_text">попробовать ещё раз загрузить изображение:</string>
+ <string name="failed_upload_load_more_images">Загрузить больше картинок</string>
+ <string name="failed_upload_retry_do_nothing_text">Ничего не делать, если нет подключения к сети</string>
+ <string name="failed_upload_failure_text">Сообщение об ошибке:</string>
+ <string name="failed_upload_quota_exceeded_text">Проверьте настройки сервера, возможно ваш лимит исчерпан</string>
+ <string name="share_link_file_no_exist">Невозможно предоставить доступ к этому файлу или каталогу. Убедитесь, что он существует</string>
+ <string name="share_link_file_error">Ошибка предоставления общего доступа к этому файлу или каталогу</string>
+ <string name="unshare_link_file_no_exist">Невозможно снять общий доступ с этого файла или каталога. Он не существует.</string>
+ <string name="unshare_link_file_error">Ошибка удаления общего доступа к этому файлу или каталогу</string>
+ <string name="activity_chooser_send_file_title">Отправить</string>
+ <string name="copy_link">Копировать ссылку</string>
+ <string name="clipboard_text_copied">Скопировано в буфер обмена</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">මුරපදය</string>
- <string name="main_login">පරිශීලක නාමය</string>
- <string name="main_button_login">ප්රවිශ්ටය</string>
- <string name="main_welcome">OwnCloud වෙත ඔබව සාදරයෙන් පිළිගනිමු</string>
- <string name="main_files">ගොනු</string>
- <string name="main_music">සංගීතය</string>
- <string name="main_contacts">සබඳතා</string>
- <string name="main_calendar">දිනදසුන</string>
- <string name="main_bookmarks">පිටු සළකුනු</string>
- <string name="main_settings">සිටුවම්</string>
- <string name="main_tit_accsetup">පරිශීලක ගිණුම ස්ථාපිත කරන්න</string>
- <string name="main_wrn_accsetup">owncloud ගිණුම් මෙම යන්ත්රයේ නොමැත. මෙම යෙදුම භාවිතයට ගිණුමක් තිබිය යුතුය</string>
- <string name="actionbar_sync">නැවුම් කරන්න</string>
<string name="actionbar_upload">උඩුගත කිරීම</string>
<string name="actionbar_upload_files">ගොනු</string>
- <string name="actionbar_mkdir">ඩිරෙක්ටරිය සාදන්න</string>
- <string name="actionbar_search">සොයන්න</string>
<string name="actionbar_settings">සිටුවම්</string>
<string name="prefs_category_general">සාමාන්යයෙන්</string>
- <string name="prefs_category_trackmydevice">මෙවලම සෙවීම</string>
- <string name="prefs_add_session">නව සැසියක් එකතු කරන්න</string>
- <string name="prefs_create_img_thumbnails">සිඟිති රූ සාදන්න</string>
- <string name="prefs_select_oc_account">ගිණුමක් තෝරන්න</string>
- <string name="prefs_summary_select_oc_account">යෙදුම ඔබගේ ගිණුම් අතුරින් කිනම් ගිණුම භාවිතා කළ යුතුදැයි තෝරන්න</string>
- <string name="prefs_trackmydevice">මෙවලම සෙවීම</string>
- <string name="prefs_trackmydevice_summary_off">ඔබගේ යන්ත්රය ඇති ස්ථානය සොයාගැනීමට අවසර ownCloudට ලබාදෙන්න</string>
- <string name="prefs_trackmydevice_summary_on">ඔබගේ ownCloud ඔබගේ යන්ත්රය ඇති ස්ථානය හඹායයි</string>
- <string name="prefs_trackmydevice_interval">යාවත්කාලීන කරන කාල ප්රාන්තරය</string>
- <string name="prefs_trackmydevice_interval_summary">සෑම මිනිත්තු %1$s වරක් යාවත්කාලීන කරන්න</string>
+ <string name="prefs_category_more">වැඩි</string>
<string name="prefs_accounts">ගිණුම්</string>
<string name="prefs_manage_accounts">ගිණුම් කළමනාකරනය</string>
- <string name="prefs_pincode_summary">ඔබේ ownCloud සේවාලාභියා සුරකින්න</string>
+ <string name="prefs_pincode_summary">ඔබේ සේවාලාභියා සුරකින්න</string>
<string name="prefs_instant_upload">ක්ෂණික උඩුගත කිරීම් සක්රිය කරන්න</string>
<string name="prefs_instant_upload_summary">කැමරාවෙන් ගත් රූප ක්ෂණිකව උඩුගත කරන්න</string>
- <string name="auth_host_url">ownCloud යොමුව</string>
+ <string name="prefs_help">උදව්</string>
<string name="auth_username">පරිශීලක නම</string>
<string name="auth_password">මුර පදය</string>
- <string name="auth_register">මම ownCloudට නවකයෙක්මි</string>
- <string name="new_session_uri_error">දී ඇති යෙදුම වැරදි</string>
- <string name="new_session_session_name_error">වැරදි සැසිවාර නමක්</string>
<string name="sync_string_files">ගොනු</string>
- <string name="uploader_no_file_selected">උඩුගත කිරීමට ගොනුවක් තෝරා නැත</string>
- <string name="setup_hint_username">පරිශීලක නම</string>
- <string name="setup_hint_password">මුර පදය</string>
- <string name="setup_hint_address">අන්තර්ජාල ලිපිනය</string>
- <string name="setup_hint_show_password">මුරපදය පෙන්වන්නද?</string>
- <string name="setup_title">ඔබගේ ownCloud හා සම්බන්ධ වන්න</string>
<string name="setup_btn_connect">සම්බන්ධ වන්න</string>
<string name="uploader_btn_upload_text">උඩුගත කිරීම</string>
<string name="uploader_wrn_no_account_title">ගිණුමක් හමු නොවුණි</string>
- <string name="uploader_wrn_no_account_text">owncloud ගිණුම් මෙම යන්ත්රයේ නොමැත. කරුණාකර ගිණුමක් සාදන්න</string>
+ <string name="uploader_wrn_no_account_text">%1$s ගිණුම් මෙම යන්ත්රයේ නොමැත. කරුණාකර ගිණුමක් සාදන්න</string>
<string name="uploader_wrn_no_account_setup_btn_text">ස්ථාපනය</string>
<string name="uploader_wrn_no_account_quit_btn_text">නික්මෙන්න</string>
<string name="uploader_info_uploading">උඩුගතවේ</string>
- <string name="uploader_btn_create_dir_text">උඩුගත කිරීම් සඳහා ඩිරෙක්ටරිය තනන්න</string>
<string name="filedetails_select_file">වැඩි විස්තර සඳහා ගොනුවක් ස්පර්ෂ කරන්න</string>
<string name="filedetails_size">විශාලත්වය:</string>
<string name="filedetails_type">ගණය:</string>
<string name="filedetails_created">සෑදු දිනය:</string>
<string name="filedetails_modified">වෙනස් කළ දිනය:</string>
<string name="filedetails_download">භාගත කරන්න</string>
- <string name="filedetails_sync_file">නැවුම් කරන්න</string>
- <string name="filedetails_redownload">නැවුම් කරන්න</string>
- <string name="filedetails_open">විවෘත කරන්න</string>
<string name="common_yes">ඔව්</string>
<string name="common_no">එපා</string>
<string name="common_ok">හරි</string>
<string name="common_cancel_upload">උඩුගත කිරීම අත් හරින්න</string>
<string name="common_cancel">එපා</string>
<string name="common_save_exit">සුරැක & පිටවන්න</string>
- <string name="common_exit">ownCloud අත්හැර යන්න</string>
<string name="common_error">දෝශය</string>
<string name="about_title">පිළිබඳව</string>
+ <string name="change_password">මුරපදය වෙනස් කිරීම</string>
<string name="delete_account">ගිණුම මකන්න</string>
<string name="create_account">ගිණුම සාදන්න</string>
- <string name="uploader_info_dirname">à¶©à·\92à¶»à·\99à¶\9aà·\8aà¶§à¶»à·\92 නම</string>
+ <string name="uploader_info_dirname">à·\86à·\9cà¶½à·\8aඩරයà·\9a නම</string>
<string name="uploader_upload_succeeded_ticker">උඩුගත කිරීම සාර්ථකයි</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d ගොනු සාර්ථකව උඩුගත කෙරුණි</string>
<string name="uploader_upload_failed_ticker">උඩුගත කිරීම අසාර්ථකයි</string>
- <string name="uploader_upload_failed_content_multiple">උඩුගත කිරීම අසාර්ථකයි: %1$d/%2$d ගොනු උඩගත විය</string>
<string name="downloader_download_in_progress_ticker">බාගතවේ...</string>
<string name="downloader_download_succeeded_ticker">බාගත කිරීම සාර්ථකයි</string>
<string name="downloader_download_failed_ticker">බාගත කිරීම අසාර්ථකයි</string>
<string name="common_choose_account">ගිණුම තෝරන්න</string>
- <string name="sync_string_contacts">සබඳතා</string>
- <string name="use_ssl">ආරක්ෂිත සම්බන්ධතාවක් භාවිතා කරන්න</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>විනාඩි 15</item>
- <item>විනාඩි 30</item>
- <item>විනාඩි 60</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
<string name="auth_trying_to_login">පිවිසීමට උත්සහ කරනවා...</string>
<string name="auth_no_net_conn_title">ජාල සම්බන්ධතාවක් නොමැත</string>
- <string name="auth_no_net_conn_message">ජාල සම්බන්ධතාවක් සොයා ගත නොහැක. ඔබගේ අන්තර්ජාල සම්බන්ධතාව පරීක්ෂාකර නැවත උත්සහ කරන්න</string>
- <string name="auth_connect_anyway">කොහොමත් සම්බන්ධවන්න</string>
<string name="auth_nossl_plain_ok_title">ආරක්ෂිත සම්බන්ධතාවක් නොලැබුණි</string>
<string name="auth_connection_established">සම්බන්ධතාවක් සාදන ලදී</string>
<string name="auth_testing_connection">සම්බන්ධතාව පරීක්ෂා කෙරේ</string>
- <string name="auth_not_configured_title">විකෘතිවු OwnCloud හැඩගැසුමක්</string>
+ <string name="auth_not_configured_title">විකෘතිවු හැඩගැසුමක්</string>
<string name="auth_unknown_error_title">නොදන්නා දෝෂයක් ඇතිවිය</string>
<string name="auth_unknown_host_title">සේවාදායකයා සොයාගත නොහැක</string>
<string name="auth_timeout_title">සේවාදායකයා පිළිතුරු දීමට දිගු කාලයක් ගත්තේය</string>
<string name="auth_incorrect_address_title">විකෘතිවු යොමුවක්</string>
<string name="auth_ssl_general_error_title">SSL ආරම්භ කිරීම අසාර්ථකයි</string>
- <string name="auth_bad_oc_version_title">හඳුනාගත නොහැකි ownCloud අනුවාදයක්</string>
+ <string name="auth_bad_oc_version_title">හඳුනාගත නොහැකි අනුවාදයක්</string>
<string name="auth_wrong_connection_title">සම්බන්ධයක් ඇතිකර ගැනීමට නොහැකි විය</string>
<string name="auth_secure_connection">රක්ෂිත සම්බන්ධතාවක් සාදන ලදී</string>
- <string name="auth_login_details">පිවිසුම් සඳහා විස්තර</string>
- <string name="crashlog_send_report">වාර්තාව යවන්න</string>
- <string name="crashlog_dont_send_report">වාර්තාව යවන්න එපා</string>
<string name="fd_keep_in_sync">ගොනුව යාවත්කාලීනව තබාගන්න</string>
- <string name="common_share">බෙදා හදාගන්න</string>
<string name="common_rename">නැවත නම් කරන්න</string>
<string name="common_remove">ඉවත් කරන්න </string>
<string name="confirmation_remove_alert">%1$s සැබැවින්ම ඉවත්කිරීමට අවශ්යද?</string>
<string name="remove_success_msg">සාර්ථක ඉවත්කිරීමක්</string>
<string name="remove_fail_msg">ඉවත් කිරීම සම්පූර්ණ කළ නොහැක</string>
<string name="rename_server_fail_msg">නැවත නම් කිරීම සම්පුර්ණ කළ නොහැකි විය</string>
- <string name="create_dir_fail_msg">ඩිරෙක්ටරිය සෑදීමට නොහැකි විය</string>
<string name="wait_a_moment">ස්වල්ප මොහොතක් සිටින්න</string>
<string name="filedisplay_unexpected_bad_get_content">නොසිතු ප්රශ්ණයක්; කරුණාකර වෙනත් යෙදුමක් භාවිතා කර ගොනුව තෝරන්න</string>
<string name="filedisplay_no_file_selected">ගොනුවක් තෝරා නැත</string>
- <string name="ssl_validator_title">අනතුරු ඇඟවිම</string>
<string name="ssl_validator_btn_details_hide">සඟවන්න</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Heslo:</string>
- <string name="main_login">Meno:</string>
- <string name="main_button_login">Prihlásenie</string>
- <string name="main_welcome">Vitajte vo svojom ownCloud</string>
- <string name="main_files">Súbory</string>
- <string name="main_music">Hudba</string>
- <string name="main_contacts">Kontakty</string>
- <string name="main_calendar">Kalendár</string>
- <string name="main_bookmarks">Záložky</string>
- <string name="main_settings">Nastavenia</string>
- <string name="main_tit_accsetup">Nastavenie účtu</string>
- <string name="main_wrn_accsetup">Vo vašom zariadení nie sú žiadne účty. Vytvorte si účet ak chcete používať túto aplikáciu.</string>
- <string name="about_message">%1$s Android App\n\nverzia: %2$s</string>
- <string name="actionbar_sync">Obnoviť</string>
+ <string name="about_android">%1$s Android App</string>
+ <string name="about_version">verzia %1$s</string>
+ <string name="actionbar_sync">Obnoviť účet</string>
<string name="actionbar_upload">Nahraj súbor</string>
<string name="actionbar_upload_from_apps">Obsah z inej aplikácie</string>
<string name="actionbar_upload_files">Súbory</string>
- <string name="actionbar_mkdir">Vytvor priečinok</string>
- <string name="actionbar_search">Hľadaj</string>
+ <string name="actionbar_open_with">Otvoriť v</string>
+ <string name="actionbar_mkdir">Nový priečinok</string>
<string name="actionbar_settings">Nastavenia</string>
+ <string name="actionbar_see_details">Podrobnosti</string>
+ <string name="actionbar_send_file">Odoslať</string>
<string name="prefs_category_general">Všeobecné</string>
- <string name="prefs_category_trackmydevice">Sledovanie zariadenia</string>
- <string name="prefs_add_session">Vytvoriť nové sedenie</string>
- <string name="prefs_create_img_thumbnails">Vytvor náhľad obrázku</string>
- <string name="prefs_select_oc_account">Vyber účet</string>
- <string name="prefs_summary_select_oc_account">Vyberte účet pre túto aplikáciu.</string>
- <string name="prefs_trackmydevice">Sledovanie zariadenia</string>
- <string name="prefs_trackmydevice_summary_off">Povoliť sledovanie polohy zariadenia</string>
- <string name="prefs_trackmydevice_summary_on">Váš ownCloud sleduje vašu polohu na tomto zariadení</string>
- <string name="prefs_trackmydevice_interval">Interval aktualizácie</string>
- <string name="prefs_trackmydevice_interval_summary">Aktualizácia každých %1$s minút</string>
+ <string name="prefs_category_more">Viac</string>
<string name="prefs_accounts">Účty</string>
<string name="prefs_manage_accounts">Správa účtov</string>
- <string name="prefs_pincode">PIN aplikácie ownCloud</string>
- <string name="prefs_pincode_summary">Chrániť klienta ownCloud</string>
+ <string name="prefs_pincode">PIN aplikácie</string>
+ <string name="prefs_pincode_summary">Chrániť klienta aplikácie</string>
<string name="prefs_instant_upload">Zapnúť okamžité odosielanie</string>
<string name="prefs_instant_upload_summary">Okamžite odosielať fotky z fotoaparátu</string>
- <string name="auth_host_url">ownCloud URL</string>
+ <string name="prefs_log_title">Povoliť logovanie</string>
+ <string name="prefs_log_summary">Toto je použité pre logovanie problémov</string>
+ <string name="prefs_log_title_history">História logovania</string>
+ <string name="prefs_log_summary_history">Toto zobrazuje zaznamenané logy</string>
+ <string name="prefs_log_delete_history_button">Zmazať históriu</string>
+ <string name="prefs_help">Pomoc</string>
+ <string name="prefs_recommend">Doporučiť známemu</string>
+ <string name="prefs_feedback">Spätná väzba</string>
+ <string name="prefs_imprint">Podmienky používania</string>
+ <string name="recommend_subject">Skúste %1$s na vašom telefóne!</string>
+ <string name="auth_check_server">Skontrolovať Server</string>
+ <string name="auth_host_url">Adresa servera https://...</string>
<string name="auth_username">Používateľské meno</string>
<string name="auth_password">Heslo</string>
- <string name="auth_register">Som nový v %1$s</string>
- <string name="new_session_uri_error">Zadaná nesprávna URL</string>
- <string name="new_session_session_name_error">Nesprávny názov sedenia</string>
+ <string name="auth_register">Ste nový v %1$s?</string>
<string name="sync_string_files">Súbory</string>
- <string name="uploader_no_file_selected">Nebol označený žiadny súbor pre odoslanie</string>
- <string name="setup_hint_username">Meno používateľa</string>
- <string name="setup_hint_password">Heslo</string>
- <string name="setup_hint_address">Web adresa</string>
- <string name="setup_hint_show_password">Zobraziť heslo?</string>
- <string name="setup_title">Pripojiť k ownCloud</string>
<string name="setup_btn_connect">Pripoj</string>
<string name="uploader_btn_upload_text">Nahrať</string>
<string name="uploader_wrn_no_account_title">Účet sa nenašiel</string>
- <string name="uploader_wrn_no_account_text">Na tomto zariadení nie je zadaný žiadny ownCloud účet. Zadajte ho prosím.</string>
+ <string name="uploader_wrn_no_account_text">Na tomto zariadení nie je zadaný žiadny %1$s účet. Zadajte ho prosím.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Nastavenie</string>
<string name="uploader_wrn_no_account_quit_btn_text">Koniec</string>
<string name="uploader_wrn_no_content_title">Žiadny obsah pre odoslanie</string>
<string name="uploader_wrn_no_content_text">Nedodaný žiaden obsah. Nič na odoslanie.</string>
<string name="uploader_error_forbidden_content">%1$s nemá práva pre prístup k zdieľanému obsahu</string>
<string name="uploader_info_uploading">Nahrávanie</string>
- <string name="uploader_btn_create_dir_text">Vytvoriť priečinok pre nahrávanie</string>
<string name="file_list_empty">Priečinok neobsahuje súbory.\nNové súbory môžete pridať cez \"Upload\".</string>
<string name="filedetails_select_file">Viac informácií získate kliknutím na súbor.</string>
<string name="filedetails_size">Veľkosť:</string>
<string name="filedetails_created">Vytvorený:</string>
<string name="filedetails_modified">Zmenený:</string>
<string name="filedetails_download">Stiahnuť</string>
- <string name="filedetails_sync_file">Obnoviť</string>
- <string name="filedetails_redownload">Obnoviť</string>
- <string name="filedetails_open">Otvoriť</string>
+ <string name="filedetails_sync_file">Obnoviť súbor</string>
<string name="filedetails_renamed_in_upload_msg">Súbor bol premenovaný na %1$s počas nahrávania</string>
+ <string name="action_share_file">Zdieľať linku</string>
+ <string name="action_unshare_file">Zrušiť zdieľanie odkazu</string>
<string name="common_yes">Áno</string>
<string name="common_no">Nie</string>
<string name="common_ok">OK</string>
<string name="common_cancel_upload">Zrušiť odosielanie</string>
<string name="common_cancel">Zrušiť</string>
<string name="common_save_exit">Uložiť a ukončiť</string>
- <string name="common_exit">Opustiť ownCloud</string>
<string name="common_error">Chyba</string>
+ <string name="common_loading">Načítavam...</string>
+ <string name="common_error_unknown">Neznáma chyba</string>
<string name="about_title">O</string>
+ <string name="change_password">Zmeniť heslo</string>
<string name="delete_account">Zmazať účet</string>
<string name="create_account">Vytvoriť účet</string>
<string name="upload_chooser_title">Odoslať z ...</string>
<string name="uploader_upload_in_progress_content">%1$d%% Odosielam %2$s</string>
<string name="uploader_upload_succeeded_ticker">Odoslanie bolo úspešné</string>
<string name="uploader_upload_succeeded_content_single">%1$s úspešne odoslaný</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d súborov bolo úspešne odoslaných</string>
<string name="uploader_upload_failed_ticker">Odoslanie bolo neúspešné</string>
<string name="uploader_upload_failed_content_single">Odoslanie %1$s nemohlo byť dokončené</string>
- <string name="uploader_upload_failed_content_multiple">Nahrávanie zlyhalo: %1$d/%2$d súborov bolo odoslaných</string>
<string name="downloader_download_in_progress_ticker">Sťahujem ...</string>
<string name="downloader_download_in_progress_content">%1$d%% Sťahovanie %2$s</string>
<string name="downloader_download_succeeded_ticker">Sťahovanie bolo úspešné</string>
<string name="downloader_download_succeeded_content">%1$s bol úspešne stiahnutý</string>
<string name="downloader_download_failed_ticker">Stiahnutie zlyhalo</string>
<string name="downloader_download_failed_content">Sťahovanie %1$s nebolo dokončené</string>
+ <string name="downloader_not_downloaded_yet">Ešte nie je stiahnuté</string>
<string name="common_choose_account">Zvoliť účet</string>
- <string name="sync_string_contacts">Kontakty</string>
<string name="sync_fail_ticker">Synchronizácia zlyhala</string>
<string name="sync_fail_content">Synchronizáciu %1$s nemožno dokončiť</string>
+ <string name="sync_fail_content_unauthorized">Nesprávne heslo pre %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Objavené konflikty</string>
<string name="sync_conflicts_in_favourites_content">%1$d súborov z automatickej synchronizácie nemožno synchronizovať</string>
<string name="sync_fail_in_favourites_ticker">Automatická synchronizácia súborov zlyhala</string>
<string name="sync_fail_in_favourites_content">Obsah %1$d súborov nemohol byť synchronizovaný (%2$d konfliktov)</string>
- <string name="use_ssl">Použiť zabezpečené pripojenie</string>
- <string name="location_no_provider">ownCloud nemôže sledovať polohu vášho zariadenia. Skontrolujte nastavenia umiestnenia.</string>
+ <string name="sync_foreign_files_forgotten_ticker">Niektoré lokálne súbory boli zabudnuté</string>
+ <string name="sync_current_folder_was_removed">Priečinok %1$s už existuje</string>
+ <string name="foreign_files_move">Premiestniť všetko</string>
+ <string name="foreign_files_success">Všetky súbory boli premiestnené</string>
+ <string name="foreign_files_fail">Niektoré súbory nebolo možné premiestniť</string>
+ <string name="foreign_files_local_text">Lokálne: %1$s</string>
+ <string name="foreign_files_remote_text">Vzdialené: %1$s</string>
+ <string name="upload_query_move_foreign_files">Nie je dostatok miesta na kopírovanie vybraných súborov do priečinka %1$s. Želáte si miesto kopírovania zmeniť?</string>
<string name="pincode_enter_pin_code">Zadajte PIN aplikácie</string>
- <string name="pincode_enter_new_pin_code">Zadajte nový PIN aplikácie</string>
<string name="pincode_configure_your_pin">Zadajte PIN aplikácie</string>
<string name="pincode_configure_your_pin_explanation">Pri každom spustení aplikácie bude vyžadovaný PIN</string>
<string name="pincode_reenter_your_pincode">Zadajte znovu PIN aplikácie</string>
<string name="pincode_wrong">Nesprávny PIN aplikácie</string>
<string name="pincode_removed">PIN aplikácie bol odstránený</string>
<string name="pincode_stored">PIN aplikácie bol uložený</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 minút</item>
- <item>30 minút</item>
- <item>60 minút</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="media_notif_ticker">Prehrávač hudby %1$s</string>
+ <string name="media_state_playing">%1$s (prehráva)</string>
+ <string name="media_state_loading">%1$s (načítava)</string>
+ <string name="media_event_done">%1$s prehrávanie dokončené</string>
+ <string name="media_err_nothing_to_play">Nenájdený žiaden multimediálny súbor</string>
+ <string name="media_err_no_account">Účet neposkytnutý</string>
+ <string name="media_err_not_in_owncloud">Súbor nie je v platnom účte</string>
+ <string name="media_err_unsupported">Nepodporovaný kodek</string>
+ <string name="media_err_io">Mediálny súbor nemožno čítať</string>
+ <string name="media_err_malformed">Mediálny súbor nemá správne kódovanie</string>
+ <string name="media_err_timeout">Skončil počas pokusu o prehratie</string>
+ <string name="media_err_invalid_progressive_playback">Mediálny súbor nemožno streamovať</string>
+ <string name="media_err_unknown">Mediálny súbor nemožno prehrať s východzím prehrávačom</string>
+ <string name="media_err_security_ex">Chyba zabezpečenia pri pokuse o prehranie %1$s</string>
+ <string name="media_err_io_ex">Chyba vstupu pri prehrávaní %1$s</string>
+ <string name="media_err_unexpected">Nečakaná chyba pri prehrávaní %1$s</string>
+ <string name="media_rewind_description">Tlačidlo pretáčania</string>
+ <string name="media_play_pause_description">Tlačidlo prehrávania / pauzy</string>
+ <string name="media_forward_description">Tlačidlo \"rýchlo vpred\"</string>
<string name="auth_trying_to_login">Pokus o pripojenie...</string>
<string name="auth_no_net_conn_title">Bez sieťového pripojenia</string>
- <string name="auth_no_net_conn_message">Skontrolujte pripojenie k sieti a opakujte pripojenie znovu.</string>
- <string name="auth_connect_anyway">Aj tak pripojiť</string>
<string name="auth_nossl_plain_ok_title">Nie je k dispozícii bezpečné pripojenie</string>
- <string name="auth_nossl_plain_ok_message">Aplikácia nemôže nadviazať zabezpečené spojenie so serverom. Nezabezpečené pripojenie je k dispozícii. Môžete pokračovať alebo prerušiť spojenie.</string>
<string name="auth_connection_established">Pripojenie vytvorené</string>
<string name="auth_testing_connection">Testovane pripojenia...</string>
- <string name="auth_not_configured_title">Nesprávna konfigurácia ownCloud</string>
- <string name="auth_not_configured_message">Nastavenie ownCloud nie je správne. Kontaktujte administrátora pre získanie viac informácií.</string>
+ <string name="auth_not_configured_title">Nesprávna konfigurácia servera</string>
+ <string name="auth_account_not_new">Účet pre tohoto používateľa a tento server už v tomto zariadení existuje</string>
+ <string name="auth_account_not_the_same">Zadané prihlasovacie údaje používateľa sú nesprávne</string>
<string name="auth_unknown_error_title">Nastala neznáma chyba!</string>
- <string name="auth_unknown_error_message">Nastala neznáma chyba. Kontaktujte podporu a pripojte záznam z Vášho zariadenia.</string>
<string name="auth_unknown_host_title">Nemožno nájsť hosta</string>
- <string name="auth_unknown_host_message">Nemôžm sa pripojiť k serveru. Skontrolujte nastavenia servera, či beží a skúste to znovu.</string>
- <string name="auth_incorrect_path_title">ownCloud inštancia nebola nájdená</string>
- <string name="auth_incorrect_path_message">Aplikácia na zadanej adrese nenašla inštanciu ownCloud. Skontrolujte cestu a skúste to znovu.</string>
+ <string name="auth_incorrect_path_title">Servera inštancia nebola nájdená</string>
<string name="auth_timeout_title">Serveru trvá odpoveď príliš dlho</string>
<string name="auth_incorrect_address_title">Poškodená URL</string>
<string name="auth_ssl_general_error_title">Inicializácia SSL zlyhala</string>
- <string name="auth_ssl_unverified_server_title">Neoverená SSL identita servera</string>
+ <string name="auth_ssl_unverified_server_title">Nepodarilo sa overiť identitu servera SSL</string>
<string name="auth_bad_oc_version_title">Nerozpoznaná verzia servera</string>
<string name="auth_wrong_connection_title">Nie je možne vytvoriť spojenie</string>
<string name="auth_secure_connection">Vytvorené zabezpečené spojenie</string>
- <string name="auth_login_details">Podrobnosti prihlásenia</string>
- <string name="auth_unauthorized">Neplatné prihlasovacie meno / heslo</string>
- <string name="auth_not_found">Je zadaná neplatná cesta</string>
- <string name="auth_internal">Interná chyba servera, kód %1$d</string>
- <string name="crashlog_message">Aplikácia neočakávane ukončila činnosť. Chcete poslať správu o chybe?</string>
- <string name="crashlog_send_report">Poslať výpis</string>
- <string name="crashlog_dont_send_report">Neposlať výpis</string>
- <string name="extensions_avail_title">Sú dostupné rozšírenia.</string>
- <string name="extensions_avail_message">Vaša inštancia ownCloud podporuje rozšírené nastavenia. Chcete zobraziť rozšírené nastavenia dosupné pre android?</string>
+ <string name="auth_unauthorized">Neprávne používateľské meno alebo heslo</string>
+ <string name="auth_oauth_error">Neúspešná autorizácia</string>
+ <string name="auth_oauth_error_access_denied">Prístup odmietnutý autorizačným serverom</string>
+ <string name="auth_wtf_reenter_URL">Nečakaný stav; prosím, opätovne vložte URL adresu servera</string>
+ <string name="auth_expired_oauth_token_toast">Vaša autorizácia expirovala. Prosím autorizujte sa znovu prosím</string>
+ <string name="auth_expired_basic_auth_toast">Prosím, zadajte aktuálne heslo</string>
+ <string name="auth_expired_saml_sso_token_toast">Vaše pripojenie expirovalo. Pripojte sa znovu prosím</string>
+ <string name="auth_connecting_auth_server">Pripájam sa na autentifikačný server...</string>
+ <string name="auth_unsupported_auth_method">Server nepodporuje túto autentifikačnú metódu</string>
+ <string name="auth_unsupported_multiaccount">%1$s nepodporuje viacero účtov</string>
<string name="fd_keep_in_sync">Udržiavať súbor aktuálny.</string>
- <string name="common_share">Zdieľaj</string>
<string name="common_rename">Premenuj</string>
<string name="common_remove">Odober</string>
<string name="confirmation_remove_alert">Naozaj odstrániť %1$s ?</string>
<string name="rename_server_fail_msg">Nie je možné premenovať</string>
<string name="sync_file_fail_msg">Vzdialený súbor nemohol byť prekontrolovaný</string>
<string name="sync_file_nothing_to_do_msg">Obsah súboru je zosynchronizovaný</string>
- <string name="create_dir_fail_msg">Priečinok nie je možné vytvoriť</string>
+ <string name="filename_forbidden_characters">Zakázané znaky: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Počkať chvíľu</string>
<string name="filedisplay_unexpected_bad_get_content">Neočakávaný problém; skúste vybrať súbor inou aplikáciou</string>
<string name="filedisplay_no_file_selected">Nebol vybraný súbor</string>
- <string name="ssl_validator_title">Upozornenie</string>
+ <string name="activity_chooser_title">Odošli link do ...</string>
+ <string name="oauth_check_onoff">Prihlásiť sa z oAuth2</string>
+ <string name="oauth_login_connection">Pripájam sa na oAuth2 server…</string>
<string name="ssl_validator_header">Identitu stránky nemožno overiť</string>
<string name="ssl_validator_reason_cert_not_trusted">- Certifikát servera nie je overený</string>
<string name="ssl_validator_reason_cert_expired">- Platnosť certifikátu servera vypršala</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- Certifikát servera je príliš mladý</string>
<string name="ssl_validator_reason_hostname_not_verified">- URL nezodpovedá hodnote hostname certifikátu</string>
- <string name="ssl_validator_certificate_not_available">Nie je možné získať certifikát servera</string>
<string name="ssl_validator_question">Chcete veriť tomuto certifikátu v každom prípade ?</string>
<string name="ssl_validator_not_saved">Certifikát nemôže byť uložený</string>
<string name="ssl_validator_btn_details_see">Podrobnosti</string>
<string name="ssl_validator_label_validity_to">Do: </string>
<string name="ssl_validator_label_signature">Podpis:</string>
<string name="ssl_validator_label_signature_algorithm">Algoritmus:</string>
- <string name="text_placeholder">To je zástupný znak</string>
+ <string name="placeholder_sentence">Toto je \"placeholder\"</string>
+ <string name="placeholder_filename">placeholder.txt</string>
+ <string name="placeholder_filetype">PNG obrázok</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Odoslať fotografie iba cez WiFi</string>
<string name="instant_upload_path">/InstantUpload</string>
<string name="conflict_title">Konflikt pri aktualizácii</string>
<string name="conflict_keep_both">Ponechať oba</string>
<string name="conflict_overwrite">Prepísať</string>
<string name="conflict_dont_upload">Nenahrávajte</string>
+ <string name="preview_image_description">Ukážka obrazu</string>
+ <string name="preview_image_error_unknown_format">Obraz nemôže byť zobrazený</string>
+ <string name="actionbar_failed_instant_upload">Okamžité odoslanie zlyhalo</string>
+ <string name="failed_upload_headline_text">Zlyhané instantné nahratia</string>
+ <string name="failed_upload_headline_hint">Zhrnutie všetkých zlyhaných nahratí</string>
+ <string name="failed_upload_all_cb">vybrať všetko</string>
+ <string name="failed_upload_headline_retryall_btn">opakovať všetky vybrané</string>
+ <string name="failed_upload_headline_delete_all_btn">zmazať všetky vybrané z radu pre nahratie</string>
+ <string name="failed_upload_retry_text">opakovať nahratie obrazu:</string>
+ <string name="failed_upload_load_more_images">Načítať viac Obrázkov</string>
+ <string name="failed_upload_retry_do_nothing_text">nevykonať nič, nie ste online pre instantné nahratie</string>
+ <string name="failed_upload_failure_text">Chybová správa:</string>
+ <string name="failed_upload_quota_exceeded_text">Prosím skontrolujte nastavenie vášho servera, možno bola prekročená disková kvóta.</string>
+ <string name="share_link_file_no_exist">Nie je možné zdieľať tento súbor alebo adresár. Prosím uistite sa že existuje</string>
+ <string name="share_link_file_error">Pri pokuse o zdieľanie tohto súboru alebo priečinka došlo k chybe</string>
+ <string name="unshare_link_file_no_exist">Nie je možné zrušiť zdieľanie tohoto súboru alebo priečinka. Súbor alebo priečinok neexistuje.</string>
+ <string name="unshare_link_file_error">Pri pokuse zrušiť zdieľanie tohto súboru alebo priečinka došlo k chybe</string>
+ <string name="activity_chooser_send_file_title">Odoslať</string>
+ <string name="copy_link">Kopíruj odkaz</string>
+ <string name="clipboard_text_copied">Skopírované do \"clipboard\"</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
-<resources/>
+<resources>
+ <string name="actionbar_settings">Nastavenia</string>
+ <string name="prefs_category_general">Všeobecné</string>
+ <string name="filedetails_download">Stiahnuť</string>
+ <string name="common_cancel">Zrušiť</string>
+</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Geslo:</string>
- <string name="main_login">Uporabniško ime:</string>
- <string name="main_button_login">Prijava</string>
- <string name="main_welcome">Dobrodošli v oblaku ownCloud</string>
- <string name="main_files">Datoteke</string>
- <string name="main_music">Glasba</string>
- <string name="main_contacts">Stiki</string>
- <string name="main_calendar">Koledar</string>
- <string name="main_bookmarks">Zaznamki</string>
- <string name="main_settings">Nastavitve</string>
- <string name="main_tit_accsetup">Nastavi račun</string>
- <string name="main_wrn_accsetup">Na vaši napravi ni računa ownCloud. Za uporabo tega programa je treba račun ustvariti.</string>
- <string name="about_message">Odjemalec ownCloud za Android\n\nrazličica: %1$s</string>
- <string name="actionbar_sync">Osveži</string>
+ <string name="about_android">Program za Android %1$s</string>
+ <string name="about_version">različica %1$s</string>
+ <string name="actionbar_sync">Osveži račun</string>
<string name="actionbar_upload">Pošlji datoteko</string>
<string name="actionbar_upload_from_apps">Vsebina iz drugih programov</string>
<string name="actionbar_upload_files">Datoteke</string>
- <string name="actionbar_mkdir">Ustvari mapo</string>
- <string name="actionbar_search">Poišči</string>
+ <string name="actionbar_open_with">Odpri z</string>
+ <string name="actionbar_mkdir">Nova mapa</string>
<string name="actionbar_settings">Nastavitve</string>
+ <string name="actionbar_see_details">Podrobnosti</string>
+ <string name="actionbar_send_file">Pošlji</string>
<string name="prefs_category_general">Splošno</string>
- <string name="prefs_category_trackmydevice">Sledenje napravi</string>
- <string name="prefs_add_session">Dodaj novo sejo</string>
- <string name="prefs_create_img_thumbnails">Ustvari sličice slik</string>
- <string name="prefs_select_oc_account">Izberite račun</string>
- <string name="prefs_summary_select_oc_account">Izberite račun, ki ga naj program uporabi.</string>
- <string name="prefs_trackmydevice">Sledenje napravi</string>
- <string name="prefs_trackmydevice_summary_off">Omogoči sledenje mestu naprave preko oblaka ownCloud.</string>
- <string name="prefs_trackmydevice_summary_on">Strežnik ownCloud spremlja mesto napravo</string>
- <string name="prefs_trackmydevice_interval">Časovni razmik posodobitev</string>
- <string name="prefs_trackmydevice_interval_summary">Posodobi vsakih %1$s minut</string>
+ <string name="prefs_category_more">Več</string>
<string name="prefs_accounts">Računi</string>
<string name="prefs_manage_accounts">Upravljanje z računi</string>
- <string name="prefs_pincode">Koda PIN programa ownCloud</string>
- <string name="prefs_pincode_summary">Zaščitite odjemalec ownCloud</string>
+ <string name="prefs_pincode">Koda PIN programa</string>
+ <string name="prefs_pincode_summary">Zaščitite odjemalec</string>
<string name="prefs_instant_upload">Omogoči takojšnje pošiljanje</string>
<string name="prefs_instant_upload_summary">Takojšnje pošiljanje posnetih fotografij</string>
- <string name="auth_host_url">Naslov URL ownCloud</string>
+ <string name="prefs_log_title">Omogoči zapisovanje dnevnika</string>
+ <string name="prefs_log_summary">Uporablja se za beleženje težav in napak</string>
+ <string name="prefs_log_title_history">Zgodovina beleženja dnevnika</string>
+ <string name="prefs_log_summary_history">Pokaže shranjene dnevnike</string>
+ <string name="prefs_log_delete_history_button">Izbriši zgodovino</string>
+ <string name="prefs_help">Pomoč</string>
+ <string name="prefs_recommend">Priporoči prijateljem</string>
+ <string name="prefs_feedback">Odziv</string>
+ <string name="prefs_imprint">Natis</string>
+ <string name="recommend_subject">Preizkusi %1$s na pametnem telefonu!</string>
+ <string name="auth_check_server">Preveri strežnik</string>
+ <string name="auth_host_url">Naslov strežnika https://…</string>
<string name="auth_username">Uporabniško ime</string>
<string name="auth_password">Geslo</string>
- <string name="auth_register">Sem nov v oblaku ownCloud</string>
- <string name="new_session_uri_error">Podan je napačen naslov URL</string>
- <string name="new_session_session_name_error">Napačno ime seje</string>
+ <string name="auth_register">Ali ste novi uporabnik sistema %1$s?</string>
<string name="sync_string_files">Datoteke</string>
- <string name="uploader_no_file_selected">Ni izbrane datoteke za pošiljanje.</string>
- <string name="setup_hint_username">Uporabniško ime</string>
- <string name="setup_hint_password">Geslo</string>
- <string name="setup_hint_address">Spletni naslov</string>
- <string name="setup_hint_show_password">Ali naj bo geslo prikazano?</string>
- <string name="setup_title">Poveži se z oblakom ownCloud</string>
<string name="setup_btn_connect">Poveži</string>
<string name="uploader_btn_upload_text">Pošlji</string>
<string name="uploader_wrn_no_account_title">Uporabniškega računa ni mogoče najti</string>
- <string name="uploader_wrn_no_account_text">Na napravi ni računov ownCloud. Nastaviti je treba vsaj en račun.</string>
+ <string name="uploader_wrn_no_account_text">Na napravi ni računov %1$s. Nastaviti je treba vsaj en račun.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Nastavi</string>
<string name="uploader_wrn_no_account_quit_btn_text">Končaj</string>
<string name="uploader_wrn_no_content_title">Ni vsebine za pošiljanje</string>
<string name="uploader_wrn_no_content_text">Ni prejete vsebine. Ni datotek za pošiljanje.</string>
- <string name="uploader_error_forbidden_content">Oblak ownCloud nima dovoljenj za dostop do vsebine v souporabi</string>
+ <string name="uploader_error_forbidden_content">Oblak %1$s nima nastavljenih dovoljenj za dostop do vsebine v souporabi</string>
<string name="uploader_info_uploading">Pošiljanje</string>
- <string name="uploader_btn_create_dir_text">Ustvari mapo za pošiljanje</string>
<string name="file_list_empty">V tej mapi ni datotek.\nNove datoteke je mogoče dodati preko možnosti menija \"Pošlji\".</string>
- <string name="filedetails_select_file">Pritisnite n datoteko za prikaz dodatnih podrobnosti.</string>
+ <string name="filedetails_select_file">Pritisnite na datoteko za prikaz dodatnih podrobnosti.</string>
<string name="filedetails_size">Velikost:</string>
<string name="filedetails_type">Vrsta:</string>
<string name="filedetails_created">Ustvarjeno:</string>
<string name="filedetails_modified">Spremenjeno:</string>
<string name="filedetails_download">Prejmi</string>
- <string name="filedetails_sync_file">Osveži</string>
- <string name="filedetails_redownload">Osveži</string>
- <string name="filedetails_open">Odpri</string>
+ <string name="filedetails_sync_file">Osveži datoteko</string>
<string name="filedetails_renamed_in_upload_msg">Datoteka je bila med nalaganjem preimenovana v %1$s</string>
+ <string name="action_share_file">Povezava za souporabo</string>
+ <string name="action_unshare_file">Odstrani možnost souporabe</string>
<string name="common_yes">Da</string>
<string name="common_no">Ne</string>
<string name="common_ok">V redu</string>
- <string name="common_cancel_download">Prekliči prenos</string>
+ <string name="common_cancel_download">Prekliči prejem</string>
<string name="common_cancel_upload">Prekliči pošiljanje</string>
<string name="common_cancel">Prekliči</string>
- <string name="common_save_exit">Shrani & končaj</string>
- <string name="common_exit">Zapusti ownCloud</string>
+ <string name="common_save_exit">Shrani in končaj</string>
<string name="common_error">Napaka</string>
- <string name="about_title">O oblaku ownCloud</string>
+ <string name="common_loading">Nalaganje ...</string>
+ <string name="common_error_unknown">Neznana napaka</string>
+ <string name="about_title">O oblaku %1$s</string>
+ <string name="change_password">Spremeni geslo</string>
<string name="delete_account">Izbriši račun</string>
<string name="create_account">Ustvari račun</string>
<string name="upload_chooser_title">Pošlji datoteko iz …</string>
<string name="uploader_upload_in_progress_content">%1$d%% Pošiljanje %2$s</string>
<string name="uploader_upload_succeeded_ticker">Pošiljanje je uspešno končano</string>
<string name="uploader_upload_succeeded_content_single">%1$s je uspešno poslan</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d datotek je uspešno poslanih</string>
<string name="uploader_upload_failed_ticker">Pošiljanje je spodletelo</string>
<string name="uploader_upload_failed_content_single">Pošiljanja %1$s ni mogoče dokončati</string>
- <string name="uploader_upload_failed_content_multiple">Pošiljanje je spodletelo: Poslanih je %1$d/%2$d datotek.</string>
<string name="downloader_download_in_progress_ticker">Prejemanje …</string>
<string name="downloader_download_in_progress_content">%1$d%% Prejemanje %2$s</string>
<string name="downloader_download_succeeded_ticker">Prejemanje je uspešno končano</string>
<string name="downloader_download_succeeded_content">%1$s je uspešno prejet</string>
<string name="downloader_download_failed_ticker">Prejemanje je spodletelo</string>
<string name="downloader_download_failed_content">Prejemanja %1$s ni mogoče dokončati</string>
+ <string name="downloader_not_downloaded_yet">Prejem še ni zaključen</string>
<string name="common_choose_account">Izbor računa</string>
- <string name="sync_string_contacts">Stiki</string>
<string name="sync_fail_ticker">Usklajevanje je spodletelo</string>
<string name="sync_fail_content">Usklajevanja %1$s ni mogoče dokončati</string>
- <string name="sync_conflicts_in_favourites_ticker">Najdeni spori</string>
- <string name="sync_conflicts_in_favourites_content">%1$d vedno-ažurnih datotek ni bilo mogoče uskladiti</string>
- <string name="sync_fail_in_favourites_ticker">Usklajevanje vedno-ažurnih datotek je spodletelo</string>
- <string name="sync_fail_in_favourites_content">Vsebino %1$d datotek ni bilo mogoče uskladiti (%2$d sporov)</string>
- <string name="use_ssl">Uporabi varno povezavo</string>
- <string name="location_no_provider">Z ownCloud ni mogoče slediti napravi. Preverite nastavitve vašega mesta nahajanja.</string>
- <string name="pincode_enter_pin_code">Vnesite PIN programa</string>
- <string name="pincode_enter_new_pin_code">Vnesite nov PIN programa</string>
- <string name="pincode_configure_your_pin">Vnesite kodo PIN programa ownCloud</string>
+ <string name="sync_fail_content_unauthorized">Neveljavno geslo za %1$s</string>
+ <string name="sync_conflicts_in_favourites_ticker">Zaznani spori</string>
+ <string name="sync_conflicts_in_favourites_content">%1$d stalno usklajenih datotek ni bilo mogoče uskladiti</string>
+ <string name="sync_fail_in_favourites_ticker">Posodobitev stalno usklajenih datotek je spodletelo</string>
+ <string name="sync_fail_in_favourites_content">Vsebine %1$d datotek ni bilo mogoče uskladiti (zaznanih je %2$d sporov)</string>
+ <string name="sync_foreign_files_forgotten_ticker">Nekatere krajevne datoteke so spregledane</string>
+ <string name="sync_current_folder_was_removed">Mapa %1$s ne obstaja več</string>
+ <string name="foreign_files_move">Premakni vse</string>
+ <string name="foreign_files_success">Vse datoteke so uspešno premaknjene na novo mesto</string>
+ <string name="foreign_files_fail">Nekaterih datotek ni mogoče premakniti</string>
+ <string name="foreign_files_local_text">Krajevno: %1$s</string>
+ <string name="foreign_files_remote_text">Oddaljeno: %1$s</string>
+ <string name="upload_query_move_foreign_files">Na strežniku ni dovolj prostora za kopiranje izbranih datotek v mapo %1$s. Ali želite datoteke raje premakniti na novo mesto? </string>
+ <string name="pincode_enter_pin_code">Vnesite kodo PIN programa</string>
+ <string name="pincode_configure_your_pin">Vnesite kodo PIN programa</string>
<string name="pincode_configure_your_pin_explanation">Koda PIN bo zahtevana vsakič pred zagonom programa.</string>
- <string name="pincode_reenter_your_pincode">Ponovno vnesite kodo PIN programa ownCloud</string>
- <string name="pincode_remove_your_pincode">Odstrani kodo PIN programa ownCloud</string>
- <string name="pincode_mismatch">Vrednosti kodo PIN programa ownCloud nista enaki</string>
- <string name="pincode_wrong">Nepravilen kodo PIN programa ownCloud</string>
- <string name="pincode_removed">Koda PIN programa ownCloud je odstranjena</string>
- <string name="pincode_stored">Koda PIN programa ownCloud je shranjena</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 minut</item>
- <item>30 minut</item>
- <item>60 minut</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_reenter_your_pincode">Ponovno vnesite kodo PIN programa</string>
+ <string name="pincode_remove_your_pincode">Odstrani kodo PIN programa</string>
+ <string name="pincode_mismatch">Vrednosti kod PIN programa nista enaki</string>
+ <string name="pincode_wrong">Nepravilna koda PIN programa</string>
+ <string name="pincode_removed">Koda PIN programa je odstranjena</string>
+ <string name="pincode_stored">Koda PIN programa je shranjena</string>
+ <string name="media_notif_ticker">Predvajalnik glasbe %1$s</string>
+ <string name="media_state_playing">%1$s (se predvaja)</string>
+ <string name="media_state_loading">%1$s (se nalaga)</string>
+ <string name="media_event_done">Predvajanje %1$s je končano</string>
+ <string name="media_err_nothing_to_play">Predstavnih datotek ni mogoče najti</string>
+ <string name="media_err_no_account">Ni navedenega računa</string>
+ <string name="media_err_not_in_owncloud">Dokument ni shranjen v veljavnem računu.</string>
+ <string name="media_err_unsupported">Nepodprt predstavni kodek</string>
+ <string name="media_err_io">Predstavne datoteke ni mogoče prebrati.</string>
+ <string name="media_err_malformed">Predstavna datoteka ni pravilno kodirana.</string>
+ <string name="media_err_timeout">Poskus predvajanja je časovno potekel</string>
+ <string name="media_err_invalid_progressive_playback">Predstavne datoteke ni mogoče prikazati v pretoku</string>
+ <string name="media_err_unknown">Predstavne datoteke ni mogoče predvajati s sistemsko privzetim predvajalnikom</string>
+ <string name="media_err_security_ex">Prišlo je do varnostne napake med predvajanjem %1$s</string>
+ <string name="media_err_io_ex">Prišlo je do napake vhoda med predvajanjem %1$s</string>
+ <string name="media_err_unexpected">Prišlo je do nepričakovane napake med predvajanjem %1$s</string>
+ <string name="media_rewind_description">Vrni nazaj</string>
+ <string name="media_play_pause_description">Gumb za predvajanje in premor</string>
+ <string name="media_forward_description">Gumb za hitro predvajanje naprej</string>
<string name="auth_trying_to_login">Poskus prijave …</string>
<string name="auth_no_net_conn_title">Ni omrežne povezave</string>
- <string name="auth_no_net_conn_message">Omrežna povezava ni zaznana. Preverite internetno povezavo in poskusite znova.</string>
- <string name="auth_connect_anyway">Vseeno poveži</string>
<string name="auth_nossl_plain_ok_title">Varna povezava ni na voljo.</string>
- <string name="auth_nossl_plain_ok_message">Programu ni uspelo vzpostaviti varne povezave s strežnikom. Nadaljujete lahko z ne-varno povezavo ali pa prekinete.</string>
<string name="auth_connection_established">Povezava je vzpostavljena</string>
<string name="auth_testing_connection">Preizkušanje povezave ...</string>
- <string name="auth_not_configured_title">Nastavitve ownCloud so napačno oblikovane</string>
- <string name="auth_not_configured_message">Zdi se, da vaš ownCloud ni pravilno nastavljen. Za dodatna pojasnila se obrnite na skrbnika.</string>
- <string name="auth_unknown_error_title">Prišlo je do neznane napake</string>
- <string name="auth_unknown_error_message">Prišlo je do neznane napake. Na napako opozorite razvijalce in jim posredujete dnevniške zapise z naprave.</string>
+ <string name="auth_not_configured_title">Napačno oblikovane nastavitve strežnika</string>
+ <string name="auth_account_not_new">Na napravi račun za istega uporabnika in strežnik že obstaja</string>
+ <string name="auth_account_not_the_same">Vpisan uporabnik ni lastnik tega računa</string>
+ <string name="auth_unknown_error_title">Prišlo je do neznane napake!</string>
<string name="auth_unknown_host_title">Gostitelja ni mogoče najti</string>
- <string name="auth_unknown_host_message">Vpisanega gostitelja ni bilo mogoče nati. Preverite ime gostitelja in razpoložljivost strežnika ter poskusite znova.</string>
- <string name="auth_incorrect_path_title">Namestitve ownCloud ni mogoče najti</string>
- <string name="auth_incorrect_path_message">Na podani poti ni bilo mogoče najti namestitve ownCloud. Preverite vpisano pot in poskusite znova.</string>
- <string name="auth_timeout_title">Strežnik je potreboval preveč časa za odgovor</string>
+ <string name="auth_incorrect_path_title">Primerka strežnika ni mogoče najti</string>
+ <string name="auth_timeout_title">Odziv s strežnika je časovno pretekel</string>
<string name="auth_incorrect_address_title">Napačno oblikovan naslov URL</string>
<string name="auth_ssl_general_error_title">Začenjanje SSL je spodletelo</string>
- <string name="auth_ssl_unverified_server_title">Istovetnost strežnika SSL ni preverjena</string>
- <string name="auth_bad_oc_version_title">Neprepoznana različica strežnika ownCloud</string>
- <string name="auth_wrong_connection_title">Povezave ni mogoče vzpostaviti</string>
+ <string name="auth_ssl_unverified_server_title">Ni mogoče overiti istovetnosti strežnika SSL</string>
+ <string name="auth_bad_oc_version_title">Nepoznana različica strežnika</string>
+ <string name="auth_wrong_connection_title">Ni mogoče vzpostaviti povezave</string>
<string name="auth_secure_connection">Varna povezava je vzpostavljena</string>
- <string name="auth_login_details">Podrobnost prijave</string>
- <string name="auth_unauthorized">Neveljavna prijava / geslo</string>
- <string name="auth_not_found">Podana je bila napačna pot</string>
- <string name="auth_internal">Notranja napaka strežnika, koda %1$d</string>
- <string name="crashlog_message">Program se je nepričakovano zaprl. Ali bi želeli poslati poročilo o sesutju?</string>
- <string name="crashlog_send_report">Pošlji poročilo</string>
- <string name="crashlog_dont_send_report">Ne pošlji poročila</string>
- <string name="extensions_avail_title">Na voljo so razširitve!</string>
- <string name="extensions_avail_message">Videti je, da različica oblaka ownCloud podpira napredne razširitve. Ali želite pregledati razširitve za okolje Android?</string>
+ <string name="auth_unauthorized">Napačno uporabniško ime ali geslo</string>
+ <string name="auth_oauth_error">Overitev ni uspešno končana</string>
+ <string name="auth_oauth_error_access_denied">Dostop je zavrnjen s strani overitvenega strežnika</string>
+ <string name="auth_wtf_reenter_URL">Nepričakovano stanje; ponovno je treba vpisati naslov URL strežnika</string>
+ <string name="auth_expired_oauth_token_toast">Overitev računa je potekla. Pred nadaljevanjem je treba prijavo ponovno overiti.</string>
+ <string name="auth_expired_basic_auth_toast">Vnesite trenutno geslo</string>
+ <string name="auth_expired_saml_sso_token_toast">Seja je potekla. Ponovno je treba vzpostaviti povezavo.</string>
+ <string name="auth_connecting_auth_server">Poteka povezovanje z overitvenim strežnikom ...</string>
+ <string name="auth_unsupported_auth_method">Strežnik ne podpira tega načina overitve</string>
+ <string name="auth_unsupported_multiaccount">%1$s ne omogoča podpore več računom</string>
+ <string name="auth_can_not_auth_against_server">S tem strežnikom overitev ni mogoča</string>
<string name="fd_keep_in_sync">Datoteka naj bo posodobljena</string>
- <string name="common_share">Souporaba</string>
<string name="common_rename">Preimenuj</string>
<string name="common_remove">Odstrani</string>
- <string name="confirmation_remove_alert">Ali ste prepričani, da želite odstraniti %1$s ?</string>
+ <string name="confirmation_remove_alert">Ali res želite odstraniti %1$s ?</string>
<string name="confirmation_remove_folder_alert">Ali ste prepričani, da želite odstraniti %1$s in njeno vsebino?</string>
- <string name="confirmation_remove_local">Samo krajevno</string>
- <string name="confirmation_remove_folder_local">Samo lokalne vsebine</string>
+ <string name="confirmation_remove_local">Le krajevno</string>
+ <string name="confirmation_remove_folder_local">Le krajevno vsebino</string>
<string name="confirmation_remove_remote">Odstrani s strežnika</string>
<string name="confirmation_remove_remote_and_local">Oddaljeno in krajevno</string>
<string name="remove_success_msg">Odstranitev je uspešno končana</string>
- <string name="remove_fail_msg">Odstranjevanje ni dokončano</string>
+ <string name="remove_fail_msg">Odstranjevanje je spodletelo</string>
<string name="rename_dialog_title">Vnesite novo ime</string>
<string name="rename_local_fail_msg">Krajevne datoteke ni mogoče preimenovati; poskusite z drugačnim novim imenom</string>
<string name="rename_server_fail_msg">Preimenovanja ni možno dokončati</string>
- <string name="sync_file_fail_msg">Oddaljene datoteke ni bilo mogoče preveriti</string>
- <string name="sync_file_nothing_to_do_msg">Vsebina datoteke je ažurna</string>
- <string name="create_dir_fail_msg">Mape ni mogoče ustvariti</string>
+ <string name="sync_file_fail_msg">Oddaljene datoteke ni mogoče preveriti</string>
+ <string name="sync_file_nothing_to_do_msg">Vsebina datoteke je že usklajena</string>
+ <string name="filename_forbidden_characters">Nedovoljeni znaki: characters: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Počakajte trenutek ...</string>
<string name="filedisplay_unexpected_bad_get_content">Prišlo je do nepričakovane napake. Poskusite datoteko izbrati z drugim programom.</string>
<string name="filedisplay_no_file_selected">Ni izbranih datotek</string>
- <string name="ssl_validator_title">Opozorilo</string>
+ <string name="activity_chooser_title">Pošlji povezavo ...</string>
+ <string name="oauth_check_onoff">Prijava z oAuth2</string>
+ <string name="oauth_login_connection">Poteka povezovanje s strežnikom oAuth2 ...</string>
<string name="ssl_validator_header">Istovetnosti strani ni mogoče preveriti</string>
<string name="ssl_validator_reason_cert_not_trusted">- potrdilo strežnika ni vredno zaupanja</string>
<string name="ssl_validator_reason_cert_expired">- potrdilo strežnika je poteklo</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- potrdilo strežnika je v uporabi</string>
<string name="ssl_validator_reason_hostname_not_verified">- naslov URL ni skladen z imenom gostitelja potrdila</string>
- <string name="ssl_validator_certificate_not_available">Potrdila strežnika ni mogoče pridobiti.</string>
<string name="ssl_validator_question">Ali vseeno želite zaupati potrdilu?</string>
<string name="ssl_validator_not_saved">Potrdila ni mogoče shraniti.</string>
<string name="ssl_validator_btn_details_see">Podrobnosti</string>
<string name="ssl_validator_label_subject">Izdano za:</string>
<string name="ssl_validator_label_issuer">Izdajatelj:</string>
<string name="ssl_validator_label_CN">Splošno ime:</string>
- <string name="ssl_validator_label_O">Organizacija:</string>
+ <string name="ssl_validator_label_O">Ustanova:</string>
<string name="ssl_validator_label_OU">Organizacijska enota:</string>
<string name="ssl_validator_label_C">Država:</string>
- <string name="ssl_validator_label_ST">Zvezna država:</string>
- <string name="ssl_validator_label_L">Lokacija:</string>
+ <string name="ssl_validator_label_ST">Regija:</string>
+ <string name="ssl_validator_label_L">Mesto:</string>
<string name="ssl_validator_label_validity">Veljavnost:</string>
<string name="ssl_validator_label_validity_from">Od:</string>
<string name="ssl_validator_label_validity_to">Do:</string>
<string name="ssl_validator_label_signature">Podpis:</string>
<string name="ssl_validator_label_signature_algorithm">Algoritem:</string>
- <string name="text_placeholder">To je vsebnik predmetov.</string>
- <string name="instant_upload_on_wifi">Pošiljaj slike le preko protokola Wi-Fi</string>
- <string name="instant_upload_path">/NeposrednoNalaganje</string>
- <string name="conflict_title">Posodobi konflikt</string>
- <string name="conflict_message">Oddaljena datoteka %s ni usklajena z lokalno datoteko. Če nadaljujete, bo datoteka na strežniku zamenjana z vašo lokalno.</string>
+ <string name="ssl_validator_null_cert">Potrdila ni mogoče pokazati.</string>
+ <string name="ssl_validator_no_info_about_error">– Ni podatkov o napaki</string>
+ <string name="placeholder_sentence">To je vsebnik predmetov</string>
+ <string name="placeholder_filename">vsebnik.txt</string>
+ <string name="placeholder_filetype">Slika PNG</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
+ <string name="instant_upload_on_wifi">Pošiljaj slike le preko povezav Wi-Fi</string>
+ <string name="instant_upload_path">/TakojšnjePošiljanje</string>
+ <string name="conflict_title">Posodobi podatke spora</string>
+ <string name="conflict_message">Oddaljena datoteka %s ni usklajena s krajevno. Z nadaljevanem bo datoteka na strežniku zamenjana s krajevno.</string>
<string name="conflict_keep_both">Ohrani obe</string>
<string name="conflict_overwrite">Prepiši</string>
- <string name="conflict_dont_upload">Ne naloži</string>
+ <string name="conflict_dont_upload">Ne pošlji</string>
+ <string name="preview_image_description">Predogled slike</string>
+ <string name="preview_image_error_unknown_format">Te slike ni mogoče prikazati</string>
+ <string name="actionbar_failed_instant_upload">Spodletelo takojšnje pošiljanje</string>
+ <string name="failed_upload_headline_text">Spodletela takojšnja pošiljanja</string>
+ <string name="failed_upload_headline_hint">Povzetek vseh spodletelih takojšnjih pošiljanj</string>
+ <string name="failed_upload_all_cb">izberi vse</string>
+ <string name="failed_upload_headline_retryall_btn">vse izbrane poskusi znova</string>
+ <string name="failed_upload_headline_delete_all_btn">izbriši izbrane iz vrste za pošiljanje</string>
+ <string name="failed_upload_retry_text">poskusi poslati sliko:</string>
+ <string name="failed_upload_load_more_images">Naloži več slik</string>
+ <string name="failed_upload_retry_do_nothing_text">ne pošlji takoj, saj je povezava v omrežje ni dejavna</string>
+ <string name="failed_upload_failure_text">Sporočilo o napaki:</string>
+ <string name="failed_upload_quota_exceeded_text">Preverite nastavitve strežnika. Morda je presežena vrednost količinske omejitve.</string>
+ <string name="share_link_file_no_exist">Ni mogoče omogočiti souporabe te datoteke ali mape. Prepričajte se, da obstaja ...</string>
+ <string name="share_link_file_error">Prišlo je do napake med poskusom omogočanja souporabe te datoteke ali mape</string>
+ <string name="unshare_link_file_no_exist">Ni mogoče prekiniti souporabe te datoteke ali mape, ker ne obstaja.</string>
+ <string name="unshare_link_file_error">Prišlo je do napake med poskusom odstranjevanja souporabe te datoteke ali mape</string>
+ <string name="activity_chooser_send_file_title">Pošlji</string>
+ <string name="copy_link">Kopiraj povezavo</string>
+ <string name="clipboard_text_copied">Kopirano v odložišče</string>
</resources>
+++ /dev/null
-<?xml version='1.0' encoding='UTF-8'?>
-<resources/>
<?xml version='1.0' encoding='UTF-8'?>
-<resources/>
+<resources>
+ <string name="actionbar_upload">Ngarko</string>
+ <string name="actionbar_upload_files">Skedarët</string>
+ <string name="actionbar_mkdir">Dosje e\'re</string>
+ <string name="actionbar_settings">Parametrat</string>
+ <string name="actionbar_send_file">Dërgo</string>
+ <string name="prefs_category_general">Përgjithshme</string>
+ <string name="prefs_category_more">Më tepër</string>
+ <string name="prefs_accounts">Llogarit</string>
+ <string name="prefs_help">Ndihmë</string>
+ <string name="prefs_imprint">Stampoj</string>
+ <string name="auth_username">Përdoruesi</string>
+ <string name="auth_password">Kodi</string>
+ <string name="sync_string_files">Skedarët</string>
+ <string name="setup_btn_connect">Lidhu</string>
+ <string name="uploader_btn_upload_text">Ngarko</string>
+ <string name="uploader_wrn_no_account_title">Nuk u gjend asnjë llogari</string>
+ <string name="uploader_wrn_no_account_text">Nuk ka %1$s llogari në pajisjen tuaj. Ju lutemi të krijojnë një llogari të parë.</string>
+ <string name="uploader_wrn_no_account_setup_btn_text">Ndërto</string>
+ <string name="uploader_wrn_no_account_quit_btn_text">Dil</string>
+ <string name="uploader_info_uploading">Ngarko</string>
+ <string name="filedetails_select_file">Trokitje e lehtë në një dokument për të shfaqur informacion shtesë.</string>
+ <string name="filedetails_size">Dimensioni:</string>
+ <string name="filedetails_type">Tipi:</string>
+ <string name="filedetails_created">Krijuar:</string>
+ <string name="filedetails_modified">Modifikuar:</string>
+ <string name="filedetails_download">Shkarko</string>
+ <string name="common_yes">Po</string>
+ <string name="common_no">Jo</string>
+ <string name="common_ok">Ok</string>
+ <string name="common_cancel_upload">Anulo ngarkimin</string>
+ <string name="common_cancel">Anulo</string>
+ <string name="common_error">Veprim i gabuar</string>
+ <string name="common_error_unknown">Gabim panjohur</string>
+ <string name="about_title">Rreth</string>
+ <string name="change_password">Ndrysho fjalëkalimin</string>
+ <string name="delete_account">Fshi llogarin</string>
+ <string name="create_account">Krijo llogari</string>
+ <string name="upload_chooser_title">Ngarko nga...</string>
+ <string name="uploader_upload_in_progress_ticker">Ngarkim...</string>
+ <string name="uploader_upload_in_progress_content">%1$d%% Ngarkim %2$s</string>
+ <string name="uploader_upload_succeeded_ticker">Ngarkimi me sukses.</string>
+ <string name="uploader_upload_succeeded_content_single">%1$s u ngarkua me sukses</string>
+ <string name="uploader_upload_failed_ticker">Ngarkimi dështoi</string>
+ <string name="uploader_upload_failed_content_single">Ngarkimi i %1$s nuk mund te behej</string>
+ <string name="downloader_download_in_progress_ticker">Shkarkimi...</string>
+ <string name="downloader_download_in_progress_content">%1$d%% Shkarkimi %2$s</string>
+ <string name="downloader_download_succeeded_ticker">Shkarkimi me sukses</string>
+ <string name="downloader_download_succeeded_content">%1$s u shkarkua me sukses</string>
+ <string name="downloader_download_failed_ticker">Shkarkimi dështoj</string>
+ <string name="auth_secure_connection">Lidhja e Sigurt vendos</string>
+ <string name="common_rename">Riemërto</string>
+ <string name="common_remove">Hiq</string>
+ <string name="activity_chooser_send_file_title">Dërgo</string>
+</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="main_files">Fajlovi</string>
- <string name="main_music">Muzika</string>
- <string name="main_settings">Podešavanja</string>
<string name="actionbar_upload">Pošalji</string>
<string name="actionbar_upload_files">Fajlovi</string>
<string name="actionbar_settings">Podešavanja</string>
+ <string name="actionbar_see_details">Detaljnije</string>
+ <string name="actionbar_send_file">Pošalji</string>
+ <string name="prefs_category_general">Opšte</string>
+ <string name="prefs_accounts">Nalozi</string>
+ <string name="prefs_manage_accounts">Upravljaj nalozima</string>
+ <string name="prefs_help">Pomoć</string>
<string name="auth_username">Korisničko ime</string>
<string name="auth_password">Lozinka</string>
<string name="sync_string_files">Fajlovi</string>
- <string name="setup_hint_username">Korisničko ime</string>
- <string name="setup_hint_password">Lozinka</string>
<string name="uploader_btn_upload_text">Pošalji</string>
+ <string name="uploader_wrn_no_account_title">Nalog nije nađen</string>
+ <string name="uploader_info_uploading">Šalje se</string>
+ <string name="filedetails_size">Veličina:</string>
+ <string name="filedetails_type">Tip:</string>
<string name="filedetails_download">Preuzmi</string>
+ <string name="common_yes">Da</string>
+ <string name="common_no">Ne</string>
<string name="common_cancel">Otkaži</string>
+ <string name="common_error">Greška</string>
+ <string name="change_password">Izmeni lozinku</string>
+ <string name="delete_account">Ukloni nalog</string>
+ <string name="create_account">Novi nalog</string>
+ <string name="uploader_upload_in_progress_ticker">Otpremanje...</string>
+ <string name="uploader_upload_succeeded_ticker">Uspešno otpremljeno</string>
+ <string name="uploader_upload_failed_ticker">Otpremanje nije uspelo</string>
+ <string name="downloader_download_in_progress_ticker">Preuzimanje...</string>
+ <string name="downloader_download_succeeded_ticker">Uspešno preuzeto</string>
+ <string name="downloader_download_failed_ticker">Preuzimanje nije uspelo</string>
+ <string name="common_choose_account">Odaberite nalog</string>
+ <string name="auth_no_net_conn_title">Nema konekcije</string>
+ <string name="auth_nossl_plain_ok_title">Sigurna konekcija nije dostupna.</string>
+ <string name="auth_connection_established">Konekcija uspostavljena</string>
+ <string name="common_rename">Preimenij</string>
+ <string name="common_remove">Ukloni</string>
+ <string name="confirmation_remove_alert">Da li želite da uklonite %1$s ?</string>
+ <string name="remove_success_msg">Uklanjanje je uspelo</string>
+ <string name="remove_fail_msg">Uklanjanje nije uspelo</string>
+ <string name="wait_a_moment">Molim pričekajte</string>
+ <string name="ssl_validator_btn_details_see">Detaljnije</string>
+ <string name="ssl_validator_btn_details_hide">Sakrij</string>
+ <string name="ssl_validator_label_O">Organizacija:</string>
+ <string name="ssl_validator_label_C">Država:</string>
+ <string name="ssl_validator_label_L">Lokacija:</string>
+ <string name="ssl_validator_label_validity_from">Od:</string>
+ <string name="ssl_validator_label_validity_to">Za:</string>
+ <string name="ssl_validator_label_signature">Potpis:</string>
+ <string name="conflict_keep_both">Zadrži oboje</string>
+ <string name="activity_chooser_send_file_title">Pošalji</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Лозинка:</string>
- <string name="main_login">Корисничко име:</string>
- <string name="main_button_login">Пријави ме</string>
- <string name="main_files">Датотеке</string>
- <string name="main_music">Музика</string>
- <string name="main_contacts">Контакти</string>
- <string name="main_calendar">Календар</string>
- <string name="main_bookmarks">Обележивачи</string>
- <string name="main_settings">Поставке</string>
- <string name="main_tit_accsetup">Подешавање налога</string>
- <string name="actionbar_sync">Освежи</string>
<string name="actionbar_upload">Отпреми</string>
<string name="actionbar_upload_from_apps">Садржај са других апликација</string>
<string name="actionbar_upload_files">Датотеке</string>
- <string name="actionbar_mkdir">Направи фасциклу</string>
- <string name="actionbar_search">Претражи</string>
<string name="actionbar_settings">Поставке</string>
+ <string name="actionbar_send_file">Пошаљи</string>
<string name="prefs_category_general">Опште</string>
- <string name="prefs_category_trackmydevice">Праћење уређаја</string>
- <string name="prefs_add_session">Додај нову сесију</string>
- <string name="prefs_create_img_thumbnails">Направи умањене приказе слика</string>
- <string name="prefs_select_oc_account">Изаберите налог</string>
- <string name="prefs_trackmydevice_interval_summary">Ажурирај на %1$s мин.</string>
+ <string name="prefs_category_more">Више</string>
<string name="prefs_accounts">Налози</string>
<string name="prefs_instant_upload_summary">Тренутно отпремај фотографије сликане камером</string>
+ <string name="prefs_help">Помоћ</string>
<string name="auth_username">Корисничко име</string>
<string name="auth_password">Лозинка</string>
<string name="sync_string_files">Фајлови</string>
- <string name="uploader_no_file_selected">Нисте изабрали датотеку за отпремање</string>
- <string name="setup_hint_username">Корисничко име</string>
- <string name="setup_hint_password">Лозинка</string>
- <string name="setup_hint_address">Веб адреса</string>
- <string name="setup_hint_show_password">Приказати лозинку?</string>
<string name="setup_btn_connect">Повежи ме</string>
<string name="uploader_btn_upload_text">Отпреми</string>
<string name="uploader_wrn_no_account_title">Нема налога</string>
<string name="uploader_wrn_no_content_title">Нема садржаја за отпремање</string>
<string name="uploader_wrn_no_content_text">Садржај није примљен. Нема ништа да се отпреми.</string>
<string name="uploader_info_uploading">Отпремање</string>
- <string name="uploader_btn_create_dir_text">Направи фасциклу за отпремање</string>
<string name="file_list_empty">Нема датотека у овој фасцикли.\nНове датотеке можете да додате путем опције „Отпреми“.</string>
<string name="filedetails_select_file">Додирните датотеку ради приказа додатних информација.</string>
<string name="filedetails_size">Величина:</string>
<string name="filedetails_created">Направљено:</string>
<string name="filedetails_modified">Измењено:</string>
<string name="filedetails_download">Преузми</string>
- <string name="filedetails_sync_file">Освежи</string>
- <string name="filedetails_open">Отвори</string>
+ <string name="filedetails_sync_file">Освежи датотеку</string>
<string name="common_yes">Да</string>
<string name="common_no">Не</string>
<string name="common_ok">У реду</string>
+ <string name="common_cancel_download">Обустави преузимање</string>
<string name="common_cancel_upload">Прекини слање</string>
<string name="common_cancel">Откажи</string>
<string name="common_save_exit">Сачувај и изађи</string>
<string name="common_error">Грешка</string>
<string name="about_title">О програму</string>
+ <string name="change_password">Измени лозинку</string>
<string name="delete_account">Обриши налог</string>
<string name="create_account">Отвори налог</string>
<string name="upload_chooser_title">Отпреми из…</string>
- <string name="uploader_info_dirname">Име фасцикле</string>
<string name="uploader_upload_in_progress_ticker">Отпремам…</string>
<string name="uploader_upload_in_progress_content">%1$d%% Отпремам %2$s</string>
<string name="uploader_upload_succeeded_ticker">Отпремање је успело</string>
<string name="uploader_upload_failed_ticker">Отпремање није успело</string>
<string name="uploader_upload_failed_content_single">Не могу да довршим отпремање датотеке %1$s</string>
- <string name="uploader_upload_failed_content_multiple">Отпремање није успело. Отпремљено датотека: %1$d/%2$d</string>
<string name="downloader_download_in_progress_ticker">Преузимам…</string>
<string name="downloader_download_in_progress_content">%1$d%% Преузимам %2$s</string>
+ <string name="downloader_download_succeeded_ticker">Преузимање успешно</string>
+ <string name="downloader_download_succeeded_content">%1$s је успешно преузет</string>
<string name="downloader_download_failed_ticker">Преузимање није успело</string>
<string name="downloader_download_failed_content">Не могу да довршим преузимање датотеке %1$s</string>
+ <string name="downloader_not_downloaded_yet">Још увек није преузето</string>
<string name="common_choose_account">Изабери налог</string>
- <string name="sync_string_contacts">Контакти</string>
<string name="sync_fail_ticker">Синхронизовање није успело</string>
<string name="sync_fail_content">Не могу да довршим синхронизацију датотеке %1$s</string>
- <string name="use_ssl">Безбедна веза</string>
+ <string name="foreign_files_success">Све датотеке су померене</string>
+ <string name="foreign_files_fail">Неке датотеке нису могле бити померене</string>
<string name="pincode_enter_pin_code">Унесите PIN апликације</string>
- <string name="pincode_enter_new_pin_code">Унесите нови PIN апликације</string>
<string name="pincode_configure_your_pin_explanation">Са сваким покретањем апликације мораћете да унесете PIN</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 минута</item>
- <item>30 минута</item>
- <item>60 минута</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
- <string name="auth_trying_to_login">Покушавам да вас пријавим…</string>
<string name="auth_no_net_conn_title">Нема мрежне везе</string>
- <string name="auth_connect_anyway">Ипак ме повежи</string>
<string name="auth_nossl_plain_ok_title">Безбедна веза није доступна.</string>
<string name="auth_connection_established">Веза је успостављена</string>
- <string name="auth_testing_connection">Тестирам везу…</string>
<string name="auth_unknown_error_title">Дошло је до непознате грешке.</string>
<string name="auth_unknown_host_title">Не могу да пронађем домаћина</string>
- <string name="auth_unknown_host_message">Не могу да пронађем наведеног домаћина. Проверите име домаћина и доступност сервера па покушајте поново.</string>
<string name="auth_incorrect_path_title">Не могу да пронађем примерак сервера</string>
<string name="auth_timeout_title">Серверу је требало предуго да се одазове</string>
<string name="auth_incorrect_address_title">Погрешно уобличена адреса</string>
<string name="auth_ssl_general_error_title">Покретање SSL-а није успело</string>
- <string name="auth_ssl_unverified_server_title">Непроверен идентитет SSL сервера</string>
<string name="auth_wrong_connection_title">Не могу да успоставим везу</string>
<string name="auth_secure_connection">Безбедна веза је успостављена</string>
- <string name="auth_login_details">Подаци за пријаву</string>
- <string name="crashlog_send_report">Пошаљи извештај</string>
- <string name="crashlog_dont_send_report">Не шаљи извештај</string>
- <string name="extensions_avail_title">Доступна су проширења.</string>
<string name="fd_keep_in_sync">Редовно ажурирај датотеку</string>
- <string name="common_share">Дели</string>
<string name="common_rename">Преименуј</string>
<string name="common_remove">Уклони</string>
<string name="confirmation_remove_alert">Желите ли да уклоните %1$s?</string>
<string name="confirmation_remove_local">Само локално</string>
<string name="confirmation_remove_remote">Уклони са сервера</string>
<string name="confirmation_remove_remote_and_local">Удаљено и локално</string>
+ <string name="rename_dialog_title">Унесите ново име</string>
<string name="rename_server_fail_msg">Не могу да довршим преименовање</string>
- <string name="create_dir_fail_msg">Не могу да направим фасциклу</string>
+ <string name="sync_file_fail_msg">Удаљена датотека се не може проверити</string>
<string name="wait_a_moment">Сачекајте тренутак</string>
<string name="filedisplay_no_file_selected">Нисте изабрали датотеку</string>
- <string name="ssl_validator_title">Упозорење</string>
<string name="ssl_validator_header">Не могу да проверим идентитет сајта</string>
<string name="ssl_validator_reason_cert_not_trusted">– Сертификат сервера није поверљив</string>
<string name="ssl_validator_reason_cert_expired">– Сертификат сервера је истекао</string>
<string name="ssl_validator_reason_hostname_not_verified">– Адреса се не поклапа са именом домаћина у сертификату</string>
- <string name="ssl_validator_certificate_not_available">Не могу да прибавим сертификат сервера</string>
<string name="ssl_validator_question">Желите ли ипак да означите сертификат као поверљив?</string>
<string name="ssl_validator_not_saved">Не могу да сачувам сертификат</string>
<string name="ssl_validator_btn_details_see">Подаци</string>
<string name="ssl_validator_label_validity_to">За:</string>
<string name="ssl_validator_label_signature">Потпис:</string>
<string name="ssl_validator_label_signature_algorithm">Алгоритам:</string>
- <string name="text_placeholder">Ово је чувар места</string>
<string name="instant_upload_on_wifi">Отпремај слике само путем бежичне мреже</string>
<string name="conflict_title">Ажурирај сукоб</string>
+ <string name="activity_chooser_send_file_title">Пошаљи</string>
</resources>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources/>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Lösenord:</string>
- <string name="main_login">Användare:</string>
- <string name="main_button_login">Logga in</string>
- <string name="main_welcome">Välkommen till ownCloud</string>
- <string name="main_files">Filer</string>
- <string name="main_music">Musik</string>
- <string name="main_contacts">Kontakter</string>
- <string name="main_calendar">Kalender</string>
- <string name="main_bookmarks">Bokmärken</string>
- <string name="main_settings">Inställningar</string>
- <string name="main_tit_accsetup">Skapa konto</string>
- <string name="main_wrn_accsetup">Det finns inget konto för ownCloud på denna enhet. För att kunna använda ownCloud så måste du skapa ett konto.</string>
- <string name="about_message">%1$s Android klient\n\nversion: %2$s</string>
- <string name="actionbar_sync">Uppdatera</string>
+ <string name="about_android">%1$s Android App</string>
+ <string name="about_version">version %1$s</string>
+ <string name="actionbar_sync">Uppdatera konto</string>
<string name="actionbar_upload">Ladda upp</string>
<string name="actionbar_upload_from_apps">Innehåll från andra program</string>
<string name="actionbar_upload_files">Filer</string>
- <string name="actionbar_mkdir">Skapa mapp</string>
- <string name="actionbar_search">Sök</string>
+ <string name="actionbar_open_with">Öppna med</string>
+ <string name="actionbar_mkdir">Ny mapp</string>
<string name="actionbar_settings">Inställningar</string>
+ <string name="actionbar_see_details">Detaljer</string>
+ <string name="actionbar_send_file">Skicka</string>
<string name="prefs_category_general">Allmänt</string>
- <string name="prefs_category_trackmydevice">Spåra enhet</string>
- <string name="prefs_add_session">Lägg till ny session</string>
- <string name="prefs_create_img_thumbnails">Skapa miniatyrbilder</string>
- <string name="prefs_select_oc_account">Välj ett konto</string>
- <string name="prefs_summary_select_oc_account">Välj det konto som du vill använda.</string>
- <string name="prefs_trackmydevice">Spåra enhet</string>
- <string name="prefs_trackmydevice_summary_off">Aktivera ownCloud att spåra din enhets plats</string>
- <string name="prefs_trackmydevice_summary_on">ownCloud spårar denna enhet</string>
- <string name="prefs_trackmydevice_interval">Uppdateringsintervall</string>
- <string name="prefs_trackmydevice_interval_summary">Uppdatera var %1$s minut</string>
+ <string name="prefs_category_more">Mer</string>
<string name="prefs_accounts">Konton</string>
<string name="prefs_manage_accounts">Hantera konton</string>
- <string name="prefs_pincode">ownCloud PIN</string>
- <string name="prefs_pincode_summary">Skydda ownCloud-klienten</string>
+ <string name="prefs_pincode">applikation PIN</string>
+ <string name="prefs_pincode_summary">Skydda applikation-klienten</string>
<string name="prefs_instant_upload">Aktivera direktuppladdning</string>
<string name="prefs_instant_upload_summary">Direktuppladdning av kamerabilder</string>
- <string name="auth_host_url">ownCloud URL</string>
- <string name="auth_username">Användare</string>
+ <string name="prefs_log_title">Aktivera loggning</string>
+ <string name="prefs_log_summary">Används för att logga problem</string>
+ <string name="prefs_log_title_history">Logghistorik</string>
+ <string name="prefs_log_summary_history">Visar sparade loggar</string>
+ <string name="prefs_log_delete_history_button">Radera historik</string>
+ <string name="prefs_help">Hjälp</string>
+ <string name="prefs_recommend">Rekommendera till en vän</string>
+ <string name="prefs_feedback">Återkoppling</string>
+ <string name="prefs_imprint">Imprint</string>
+ <string name="recommend_subject">Försök %1$s på din smarttelefon!</string>
+ <string name="auth_check_server">Kontrollera Server</string>
+ <string name="auth_host_url">Serveradress https://...</string>
+ <string name="auth_username">Användarnamn</string>
<string name="auth_password">Lösenord</string>
- <string name="auth_register">%1$s är nytt för mig</string>
- <string name="new_session_uri_error">Felaktig URL angavs</string>
- <string name="new_session_session_name_error">Felaktigt sessionsnamn</string>
+ <string name="auth_register">Ny på %1$s?</string>
<string name="sync_string_files">Filer</string>
- <string name="uploader_no_file_selected">Ingen fil vald för uppladdning</string>
- <string name="setup_hint_username">Användare</string>
- <string name="setup_hint_password">Lösenord</string>
- <string name="setup_hint_address">Webbadress</string>
- <string name="setup_hint_show_password">Visa lösenord?</string>
- <string name="setup_title">Anslut till %1$s</string>
<string name="setup_btn_connect">Anslut</string>
<string name="uploader_btn_upload_text">Ladda upp</string>
- <string name="uploader_wrn_no_account_title">Hittar inget konto</string>
+ <string name="uploader_top_message">Välj mapp för uppladdning:</string>
+ <string name="uploader_wrn_no_account_title">Hittade inget konto</string>
<string name="uploader_wrn_no_account_text">Det finns inga konton för %1$s på denna enhet. Var god skapa ett konto först.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Skapa</string>
<string name="uploader_wrn_no_account_quit_btn_text">Avsluta</string>
<string name="uploader_wrn_no_content_text">Inget innehåll mottaget. Inget att ladda upp.</string>
<string name="uploader_error_forbidden_content">%1$s har inte rättighet till det delade innehållet</string>
<string name="uploader_info_uploading">Laddar upp</string>
- <string name="uploader_btn_create_dir_text">Skapa mapp för att ladda upp</string>
<string name="file_list_empty">Det finns inga filer i denna mapp.\nNya filer kan läggas till med \"Ladda upp\" i menyn.</string>
<string name="filedetails_select_file">Peka på en fil för att visa mer information.</string>
<string name="filedetails_size">Storlek:</string>
<string name="filedetails_created">Skapad:</string>
<string name="filedetails_modified">Ändrad:</string>
<string name="filedetails_download">Ladda ner</string>
- <string name="filedetails_sync_file">Uppdatera</string>
- <string name="filedetails_redownload">Ladda ner igen</string>
- <string name="filedetails_open">Öppna</string>
+ <string name="filedetails_sync_file">Ladda om fil</string>
<string name="filedetails_renamed_in_upload_msg">Filen bytte namn till %1$s under uppladdningen</string>
+ <string name="action_share_file">Dela länk</string>
+ <string name="action_unshare_file">Sluta dela länk</string>
<string name="common_yes">Ja</string>
<string name="common_no">Nej</string>
<string name="common_ok">OK</string>
<string name="common_cancel_upload">Avbryt uppladdning</string>
<string name="common_cancel">Avbryt</string>
<string name="common_save_exit">Spara & Avsluta</string>
- <string name="common_exit">Lämna %1$s</string>
<string name="common_error">Fel</string>
+ <string name="common_loading">Laddar...</string>
+ <string name="common_error_unknown">Okänt fel</string>
<string name="about_title">Om</string>
+ <string name="change_password">Ändra lösenord</string>
<string name="delete_account">Radera konto</string>
<string name="create_account">Skapa konto</string>
- <string name="upload_chooser_title">Ladda upp fil från ...</string>
+ <string name="upload_chooser_title">Ladda upp från ...</string>
<string name="uploader_info_dirname">Mappnamn</string>
<string name="uploader_upload_in_progress_ticker">Laddar upp ...</string>
<string name="uploader_upload_in_progress_content">%1$d%% Laddar upp %2$s</string>
<string name="uploader_upload_succeeded_ticker">Uppladdning klar</string>
- <string name="uploader_upload_succeeded_content_single">%1$s var uppladdade</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d filer uppladdade</string>
+ <string name="uploader_upload_succeeded_content_single">%1$s laddades upp</string>
<string name="uploader_upload_failed_ticker">Misslyckad uppladdning</string>
<string name="uploader_upload_failed_content_single">Uppladdning av %1$s kunde inte slutföras</string>
- <string name="uploader_upload_failed_content_multiple">Misslyckad uppladdning: %1$d/%2$d filer uppladdade</string>
<string name="downloader_download_in_progress_ticker">Laddar ner ...</string>
<string name="downloader_download_in_progress_content">%1$d%% Laddar ner %2$s</string>
<string name="downloader_download_succeeded_ticker">Nedladdning klar</string>
<string name="downloader_download_succeeded_content">%1$s laddades ner</string>
<string name="downloader_download_failed_ticker">Misslyckad nedladdning</string>
<string name="downloader_download_failed_content">Nedladdning av %1$s kunde inte slutföras</string>
+ <string name="downloader_not_downloaded_yet">Ännu inte nedladdade</string>
<string name="common_choose_account">Välj konto</string>
- <string name="sync_string_contacts">Kontakter</string>
<string name="sync_fail_ticker">Synkroniseringen misslyckades</string>
<string name="sync_fail_content">Synkronisering av %1$s kunde inte slutföras</string>
+ <string name="sync_fail_content_unauthorized">Felaktigt lösenord för %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Konflikter uppstod</string>
<string name="sync_conflicts_in_favourites_content">%1$d Flaggad som Håll-filen-uppdaterad kan inte synkas</string>
<string name="sync_fail_in_favourites_ticker">Filer flaggade som Håll-filen-uppdaterad misslyckades</string>
<string name="sync_fail_in_favourites_content">Innehållet i %1$d filer kunde inte synkas (%2$d konflikter)</string>
- <string name="use_ssl">Använd säker anslutning</string>
- <string name="location_no_provider">%1$s kan inte spåra denna enhet. Kontrollera dina platsinställningar</string>
+ <string name="sync_foreign_files_forgotten_ticker">Vissa lokala filer glömdes</string>
+ <string name="sync_foreign_files_forgotten_content">%1$d filer från %2$s mappar kunde inte kopieras till</string>
+ <string name="sync_foreign_files_forgotten_explanation">Från och med version 1.3.16, kopieras uppladdade filer från den här enheten till den lokala %1$s mappen för att förhindra förlust av data när en enda fil synkroniseras med flera konton.\n\nPå grund av denna förändring har alla filer som laddats upp i tidigare versioner av denna app kopierats till %2$s mappen. Men ett fel förhindrade slutförande av denna operation under synkronisering. Du kan antingen lämna fil(er) som det är och ta bort länken till %3$s, eller flytta fil(er) till %1$s mappen och behålla länken till %4$s.\n\nNedan listas dom lokala fil(er) och fjärrfil(er) i %5$s dom var länkade till.</string>
+ <string name="sync_current_folder_was_removed">Mappen %1$s existerar inte längre</string>
+ <string name="foreign_files_move">Flytta allt</string>
+ <string name="foreign_files_success">Alla filer flyttades</string>
+ <string name="foreign_files_fail">Vissa filer kunde inte flyttas</string>
+ <string name="foreign_files_local_text">Lokal: %1$s</string>
+ <string name="foreign_files_remote_text">Fjärr: %1$s</string>
+ <string name="upload_query_move_foreign_files">Det finns inte tillräckligt med utrymme för att kopiera valda filer till mappen %1$s. Vill du flytta filerna istället? </string>
<string name="pincode_enter_pin_code">Ange din PIN</string>
- <string name="pincode_enter_new_pin_code">Ange din nya PIN</string>
- <string name="pincode_configure_your_pin">Ange ownCloud PIN</string>
+ <string name="pincode_configure_your_pin">Ange applikation PIN</string>
<string name="pincode_configure_your_pin_explanation">Din PIN måste anges varje gång du startar programmet.</string>
- <string name="pincode_reenter_your_pincode">Ange ownCloud PIN igen</string>
- <string name="pincode_remove_your_pincode">Radera ownCloud PIN</string>
- <string name="pincode_mismatch">Båda ownCloud PIN är inte lika</string>
- <string name="pincode_wrong">Felaktig ownCloud PIN</string>
- <string name="pincode_removed">ownCloud PIN raderad</string>
- <string name="pincode_stored">ownCloud PIN sparad</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 Minuter</item>
- <item>30 Minuter</item>
- <item>60 Minuter</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_reenter_your_pincode">Ange applikation PIN igen</string>
+ <string name="pincode_remove_your_pincode">Radera applikation PIN</string>
+ <string name="pincode_mismatch">Båda applikation PIN är inte lika</string>
+ <string name="pincode_wrong">Felaktig applikationd PIN</string>
+ <string name="pincode_removed">applikation PIN raderad</string>
+ <string name="pincode_stored">applikation PIN sparad</string>
+ <string name="media_notif_ticker">%1$ musikspelare</string>
+ <string name="media_state_playing">%1$s (spelar)</string>
+ <string name="media_state_loading">%1$s (buffrar)</string>
+ <string name="media_event_done">%1$s spelat färdigt</string>
+ <string name="media_err_nothing_to_play">Hittar ingen medie-fil</string>
+ <string name="media_err_no_account">Inget konto är angivet</string>
+ <string name="media_err_not_in_owncloud">Filen finns i ett ogiltigt konto</string>
+ <string name="media_err_unsupported">Saknar stöd för denna mediatyp</string>
+ <string name="media_err_io">Mediafil kunde inte skapas</string>
+ <string name="media_err_malformed">Mediafilen är felaktigt kodad</string>
+ <string name="media_err_timeout">Försökt att spela för länge</string>
+ <string name="media_err_invalid_progressive_playback">Meidiafilen kan inte strömmas</string>
+ <string name="media_err_unknown">Mediefilen kan inte spelas med standardspelaren</string>
+ <string name="media_err_security_ex">Säkerhetsproplem när vi försöker spela %1$s</string>
+ <string name="media_err_io_ex">Inmatningsfel när vi försöker spela %1$s</string>
+ <string name="media_err_unexpected">Oväntat fel när vi försöker spela %1$s</string>
+ <string name="media_rewind_description">Bakåtspolningsknapp</string>
+ <string name="media_play_pause_description">Spela- / Pausknapp</string>
+ <string name="media_forward_description">Snappspolningsknapp</string>
<string name="auth_trying_to_login">Försöker logga in...</string>
- <string name="auth_no_net_conn_title">Ingen anslutning till nätverket</string>
- <string name="auth_no_net_conn_message">Ingen nätverksanslutning har upptäckts, kontrollera din Internet-anslutning och försök igen.</string>
- <string name="auth_connect_anyway">Anslut ändå</string>
+ <string name="auth_no_net_conn_title">Ingen nätverksanslutning</string>
<string name="auth_nossl_plain_ok_title">Säker anslutning inte tillgänglig.</string>
- <string name="auth_nossl_plain_ok_message">Applikationen kunde inte etablera en krypterad anslutning till servern. Okrypterad anslutning kan finnas tillgänglig. Du kan fortsätta eller avbryta.</string>
<string name="auth_connection_established">Anslutning etablerad</string>
<string name="auth_testing_connection">Testar anslutning...</string>
<string name="auth_not_configured_title">Felaktig konfiguration</string>
- <string name="auth_not_configured_message">Det verkar som om din version av ownCloud inte är korrekt konfigurerad. Kontakta din administratör för mer information.</string>
- <string name="auth_unknown_error_title">Okänt fel uppstod</string>
- <string name="auth_unknown_error_message">Ett okänt fel uppstod. Vänligen kontakta behörig och inkludera loggar från enheten.</string>
+ <string name="auth_account_not_new">En användare med samma namn och server finns redan i denna aparat</string>
+ <string name="auth_account_not_the_same">Den angivna användaren matchar inte användaren för detta konto</string>
+ <string name="auth_unknown_error_title">Okänt fel inträffade!</string>
<string name="auth_unknown_host_title">Kunde inte hitta server</string>
- <string name="auth_unknown_host_message">Kunde inte hitta angiven server. Kontrollera serverns tillgänglighet och försök igen.</string>
- <string name="auth_incorrect_path_title">Ingen version av ownCloud kan hittas</string>
- <string name="auth_incorrect_path_message">Applikationen kunde inte hitta någon version av ownCloud i angiven sökväg. Kontrollera sökvägen och försök igen.</string>
+ <string name="auth_incorrect_path_title">Ingen version av server kan hittas</string>
<string name="auth_timeout_title">Servern svarar inte</string>
<string name="auth_incorrect_address_title">Felaktig URL</string>
<string name="auth_ssl_general_error_title">Misslyckad initiering av SSL</string>
- <string name="auth_ssl_unverified_server_title">Obekräftad SSL-identitet</string>
- <string name="auth_bad_oc_version_title">Okänd ownCloud serverversion</string>
+ <string name="auth_ssl_unverified_server_title">Kunde inte identifiera SSL serverns identitet</string>
+ <string name="auth_bad_oc_version_title">Okänd server serverversion</string>
<string name="auth_wrong_connection_title">Kunde inte etablera anslutning</string>
<string name="auth_secure_connection">Säker anslutning etablerad</string>
- <string name="auth_login_details">Inloggningsuppgifter</string>
- <string name="auth_unauthorized">Felaktigt användarnamn / lösenord</string>
- <string name="auth_not_found">Felaktig sökväg angavs</string>
- <string name="auth_internal">Internt serverfel, kod %1$d</string>
- <string name="crashlog_message">Applikationen avslutades oväntat. Vill du skicka en felrapport?</string>
- <string name="crashlog_send_report">Skicka rapport</string>
- <string name="crashlog_dont_send_report">Skicka inte rapport</string>
- <string name="extensions_avail_title">Tillägg finns tillgängliga!</string>
- <string name="extensions_avail_message">Det verkar som att din version av ownCloud stödjer avancerade tillägg. Vill du se tilläggen tillgängliga för Android?</string>
+ <string name="auth_unauthorized">Felaktigt användarnamn eller lösenord</string>
+ <string name="auth_oauth_error">Behörighet saknas</string>
+ <string name="auth_oauth_error_access_denied">Nekad åtkomst av server</string>
+ <string name="auth_wtf_reenter_URL">Oväntat tillstånd; Ange serverns URL igen</string>
+ <string name="auth_expired_oauth_token_toast">Din inloggning har gått ut. Var god logga in igen</string>
+ <string name="auth_expired_basic_auth_toast">Vänligen ange det aktuella lösenordet</string>
+ <string name="auth_expired_saml_sso_token_toast">Din session har upphört att gälla. Vänligen anslut igen</string>
+ <string name="auth_connecting_auth_server">Ansluter till autentiseringsservern...</string>
+ <string name="auth_unsupported_auth_method">Servern har inte stöd för denna autentiseringsmetod</string>
+ <string name="auth_unsupported_multiaccount">%1$s har inte stöd för multipla konton</string>
+ <string name="auth_can_not_auth_against_server">Kan inte autentisera mot denna servern</string>
<string name="fd_keep_in_sync">Håll filen uppdaterad</string>
- <string name="common_share">Dela</string>
<string name="common_rename">Byt namn</string>
<string name="common_remove">Radera</string>
<string name="confirmation_remove_alert">Vill du verkligen radera: %1$s ?</string>
<string name="sync_file_fail_msg">Fjärrfilen kunde inte kontrolleras</string>
<string name="sync_file_nothing_to_do_msg">Filinnehåll redan synkroniserat</string>
<string name="create_dir_fail_msg">Mapp kunde inte skapas</string>
+ <string name="filename_forbidden_characters">Förbjudna tecken är: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Var god vänta</string>
<string name="filedisplay_unexpected_bad_get_content">Oväntat problem; prova annat program för aktuell fil</string>
<string name="filedisplay_no_file_selected">Ingen fil vald</string>
- <string name="ssl_validator_title">Varning</string>
+ <string name="activity_chooser_title">Sänd länk till ...</string>
+ <string name="oauth_check_onoff">Logga in med oAuth2.</string>
+ <string name="oauth_login_connection">Ansluter till oAuth2 servern…</string>
<string name="ssl_validator_header">Webbplatsens identitet kunde inte verifieras</string>
<string name="ssl_validator_reason_cert_not_trusted">- Servercertifikatet är inte tillförlitligt</string>
<string name="ssl_validator_reason_cert_expired">- Servercertifikatet har gått ut</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- Servercertifikatet är för nytt</string>
<string name="ssl_validator_reason_hostname_not_verified">- Webbadressen matchar inte värdnamnet i certifikatet</string>
- <string name="ssl_validator_certificate_not_available">Servercertifikatet kunde inte hämtas</string>
<string name="ssl_validator_question">Vill du lita på detta certifikat ändå?</string>
<string name="ssl_validator_not_saved">Certifikatet kunde inte sparas</string>
<string name="ssl_validator_btn_details_see">Detaljer</string>
<string name="ssl_validator_label_validity_to">Till:</string>
<string name="ssl_validator_label_signature">Signatur:</string>
<string name="ssl_validator_label_signature_algorithm">Algoritm:</string>
- <string name="text_placeholder">Detta är en platshållare</string>
+ <string name="ssl_validator_null_cert">Certifikatet kunde inte visas.</string>
+ <string name="ssl_validator_no_info_about_error">- Ingen information om felet</string>
+ <string name="placeholder_sentence">Detta är en platshållare</string>
+ <string name="placeholder_filename">placeholder.txt</string>
+ <string name="placeholder_filetype">PNG Bild</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Ladda upp bilder endast via WiFi</string>
<string name="instant_upload_path">/DirektUppladdning</string>
- <string name="conflict_title">Uppdatera konflikt</string>
+ <string name="conflict_title">Uppdateringskonflikt</string>
<string name="conflict_message">Serverns fil %s är inte synkroniserad med den lokala filen. Fortsätt för att skriva över filen på servern.</string>
<string name="conflict_keep_both">Behåll båda</string>
<string name="conflict_overwrite">Skriv över</string>
<string name="conflict_dont_upload">Ladda inte upp</string>
+ <string name="preview_image_description">Förhandsvisa bild</string>
+ <string name="preview_image_error_unknown_format">Denna bild kan inte visas</string>
+ <string name="error__upload__local_file_not_copied">%1$s kunde inte kopieras till %2$s lokal mapp</string>
+ <string name="actionbar_failed_instant_upload">Fel vid direktuppladdning\"</string>
+ <string name="failed_upload_headline_text">Misslyckades vid direktuppladdning</string>
+ <string name="failed_upload_headline_hint">Sammanfattning av alla misslyckade uppladdningar</string>
+ <string name="failed_upload_all_cb">välj alla</string>
+ <string name="failed_upload_headline_retryall_btn">försökt igen med alla valda</string>
+ <string name="failed_upload_headline_delete_all_btn">radera alla valda från uppladdningskön</string>
+ <string name="failed_upload_retry_text">försök igen att ladda upp bilden:</string>
+ <string name="failed_upload_load_more_images">Ladda fler bilder</string>
+ <string name="failed_upload_retry_do_nothing_text">Du är inte ansluten, direktuppladdning ej möjligt</string>
+ <string name="failed_upload_failure_text">Felmeddelande:</string>
+ <string name="failed_upload_quota_exceeded_text">Vänligen kontrollera dina serverkonfiguration. Din kvot kan ha överskridits.</string>
+ <string name="share_link_file_no_exist">Kan inte dela denna fil eller mapp. Se till att den existerar</string>
+ <string name="share_link_file_error">Ett fel uppstod vid försök att dela denna fil eller mapp</string>
+ <string name="unshare_link_file_no_exist">Kan inte ta bort delningen för denna fil eller mapp. Den existerar inte.</string>
+ <string name="unshare_link_file_error">Ett fel uppstod vid försök att sluta dela denna fil eller mapp</string>
+ <string name="activity_chooser_send_file_title">Skicka</string>
+ <string name="copy_link">Kopiera länk</string>
+ <string name="clipboard_text_copied">Kopierat till urklipp</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">OwnCloud</string>
- <string name="main_password">கடவுச்சொல்:</string>
- <string name="main_login">பயனாளர் பெயர்</string>
- <string name="main_button_login">புகுபதிகை</string>
- <string name="main_welcome">உங்களுடைய ownCloud இற்கு வரவேற்கின்றோம்</string>
- <string name="main_files">கோப்புகள்</string>
- <string name="main_music">இசை</string>
- <string name="main_contacts">தொடர்புகள்</string>
- <string name="main_calendar">நாட்காட்டி</string>
- <string name="main_bookmarks">பக்க அடையாளங்கள்</string>
- <string name="main_settings">அமைப்புகள்</string>
- <string name="main_tit_accsetup">கணக்கு அமைப்பு</string>
- <string name="main_wrn_accsetup">உங்களுடைய சாதனத்தில் ownCloud கணக்குகள் இல்லை. இந்த செயலிகளை பயன்படுத்துவதற்கு நீங்கள் கணக்கொன்றை உருவாக்க வேண்டும்.</string>
- <string name="about_message">ownCloud Android சேவைப் பயனர்⏎ ⏎ பதிப்பு: %1$s</string>
- <string name="actionbar_sync">மீள் ஏற்றுக</string>
<string name="actionbar_upload">பதிவேற்றுக</string>
<string name="actionbar_upload_from_apps">மற்ற செயலிகளிலிருந்து உள்ளடக்கம்</string>
<string name="actionbar_upload_files">கோப்புகள்</string>
- <string name="actionbar_mkdir">அடைவை உருவாக்குக</string>
- <string name="actionbar_search">தேடுதல்</string>
<string name="actionbar_settings">அமைப்புகள்</string>
+ <string name="actionbar_see_details">விவரங்கள்</string>
<string name="prefs_category_general">பொதுவான</string>
- <string name="prefs_category_trackmydevice">சாதனம் கண்காணிப்பு</string>
- <string name="prefs_add_session">புதிய அமர்வை சேர்க்க</string>
- <string name="prefs_create_img_thumbnails">படத்தின் சிறிய வடிவத்தை உருவாக்கு</string>
- <string name="prefs_select_oc_account">கணக்கொன்றை தெரிவுசெய்க</string>
- <string name="prefs_summary_select_oc_account">உங்களுடைய எந்த கணக்கு செயலியை பயன்படுத்தும் என்பதை தெரிவுசெய்க</string>
- <string name="prefs_trackmydevice">சாதனம் கண்காணிப்பு</string>
- <string name="prefs_trackmydevice_summary_off">உங்களுடைய சாதனத்தின் இருப்பிடத்தை அறிவதற்கு ownCloud ஐ இயலுமைப்படுத்துக</string>
- <string name="prefs_trackmydevice_summary_on">உங்களுடைய ownCloud ஆனது இந்த சாதனத்தின் கண்காணிப்புகளை வைத்துக்கொள்ளும்,</string>
- <string name="prefs_trackmydevice_interval">இடைவேலையை இற்றைப்படுத்துக</string>
- <string name="prefs_trackmydevice_interval_summary">ஒவ்வொரு %1$s நிமிடங்களையும் இற்றைப்படுத்துக</string>
+ <string name="prefs_category_more">மேலதிக</string>
<string name="prefs_accounts">கணக்குகள்</string>
<string name="prefs_manage_accounts">கணக்குகளை நிர்வகிக்க</string>
- <string name="prefs_pincode">ownCloud App PIN</string>
- <string name="prefs_pincode_summary">உங்களுடைய ownCloud சேவைப் பயனரை பாதுகாக்க</string>
+ <string name="prefs_pincode">App PIN</string>
+ <string name="prefs_pincode_summary">உங்களுடைய சேவைப் பயனரை பாதுகாக்க</string>
<string name="prefs_instant_upload">உடனடி பதிவேற்றலை இயலுமைப்படுத்துக</string>
<string name="prefs_instant_upload_summary">கமராவினால் எடுக்கப்பட்ட படங்கள் உடனடியாக பதிவேற்றப்பட்டன</string>
- <string name="auth_host_url">ownCloud URL</string>
+ <string name="prefs_help">உதவி</string>
<string name="auth_username">பயனாளர் பெயர்</string>
<string name="auth_password">கடவுச்சொல்</string>
- <string name="auth_register">ownCloud இற்கு நான் புதிது</string>
- <string name="new_session_uri_error">பிழையான URL தரப்பட்டுள்ளது</string>
- <string name="new_session_session_name_error">பிழையான அமர்வு பெயர்</string>
<string name="sync_string_files">கோப்புகள்</string>
- <string name="uploader_no_file_selected">பதிவேற்றுவதற்கு கோப்புகள் தெரிவுசெய்யப்படவில்லை</string>
- <string name="setup_hint_username">பயனாளர் பெயர்</string>
- <string name="setup_hint_password">கடவுச்சொல்</string>
- <string name="setup_hint_address">வலைய முகவரி</string>
- <string name="setup_hint_show_password">கடவுச்சொல்லை தெரியப்படுத்தவா?</string>
- <string name="setup_title">உங்களுடைய ownCloud இற்கு இணைக்க</string>
<string name="setup_btn_connect">இணைக்க</string>
<string name="uploader_btn_upload_text">பதிவேற்றுக</string>
<string name="uploader_wrn_no_account_title">ஒரு கணக்கும் அறியப்படவில்லை</string>
- <string name="uploader_wrn_no_account_text">உங்களுடைய சாதனத்தில் ownCloud கணக்குகள் இல்லை. தயவுசெய்து முதலில் ஒரு கணக்கை அமைக்கவும்</string>
+ <string name="uploader_wrn_no_account_text">உங்களுடைய சாதனத்தில் %1$s கணக்குகள் இல்லை. தயவுசெய்து முதலில் ஒரு கணக்கை அமைக்கவும்</string>
<string name="uploader_wrn_no_account_setup_btn_text">அமைப்பு</string>
<string name="uploader_wrn_no_account_quit_btn_text">விலகுக</string>
<string name="uploader_wrn_no_content_title">பதிவேற்றுவதற்கு உள்ளடக்கங்கள் இல்லை</string>
<string name="uploader_wrn_no_content_text">ஒரு உள்ளடக்கமும் பெறப்படவில்லை. பதிவேற்றுவதற்கு ஒன்றும் இல்லை</string>
- <string name="uploader_error_forbidden_content">பகிரப்பட்ட உள்ளடக்ககங்களை அணுகுவதற்கு ownCloud அனுமதிக்கமாட்டாது</string>
+ <string name="uploader_error_forbidden_content">பகிரப்பட்ட உள்ளடக்ககங்களை அணுகுவதற்கு %1$s அனுமதிக்கமாட்டாது</string>
<string name="uploader_info_uploading">பதிவேற்றல்</string>
- <string name="uploader_btn_create_dir_text">பதிவேற்றுவதற்கு அடைவை உருவாக்குக</string>
<string name="file_list_empty">இந்த கோப்புறையில் எந்த கோப்பும் இல்லை. \"பதிவேற்றல்\" பட்டி தெரிவு மூலம் புதிய கோப்புகளை பதிவேற்றமுடியும்.</string>
<string name="filedetails_select_file">மேலதிக தகவல்களை காட்சிப்படுத்துவதற்கு கோப்பின் மேல் தட்டுக.</string>
<string name="filedetails_size">அளவு:</string>
<string name="filedetails_created">உருவாக்கப்பட்டது:</string>
<string name="filedetails_modified">மாற்றப்பட்டது:</string>
<string name="filedetails_download">பதிவிறக்குக</string>
- <string name="filedetails_sync_file">மீள் ஏற்றுக</string>
- <string name="filedetails_redownload">மீள் ஏற்றுக</string>
- <string name="filedetails_open">திறக்க</string>
<string name="filedetails_renamed_in_upload_msg">பதிவேற்றும்போது கோப்பின் பெயரானது %1$s ஆக பெயர்மாற்றப்பட்டது</string>
<string name="common_yes">ஆம்</string>
<string name="common_no">இல்லை</string>
<string name="common_cancel_upload">பதிவேற்றலை இரத்து செய்க</string>
<string name="common_cancel">இரத்து செய்க</string>
<string name="common_save_exit">சேமிக்க மற்றும் amp; வெளியேறு</string>
- <string name="common_exit">ownCloud இலிருந்து விலகு</string>
<string name="common_error">வழு</string>
<string name="about_title">பற்றி</string>
+ <string name="change_password">கடவுச்சொல்லை மாற்றுக</string>
<string name="delete_account">கணக்கை நீக்குக</string>
<string name="create_account">கணக்கை உருவாக்குக</string>
<string name="upload_chooser_title">பதிவேற்றல் படிவம்</string>
- <string name="uploader_info_dirname">à®\85à®\9fà¯\88வà¯\81 பெயர்</string>
+ <string name="uploader_info_dirname">à®\95à¯\8bபà¯\8dபà¯\81à®±à¯\88 பெயர்</string>
<string name="uploader_upload_in_progress_ticker">பதிவேற்றல்...</string>
<string name="uploader_upload_in_progress_content">%1$d%% பதிவேற்றல்g %2$s</string>
<string name="uploader_upload_succeeded_ticker">வெற்றிகரமாக பதிவேற்றப்பட்டது</string>
<string name="uploader_upload_succeeded_content_single">%1$s வெற்றிகரமாக பதிவேற்றப்பட்டது</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d கோப்புகள் வெற்றிகரமாக பதிவேற்றப்பட்டது</string>
<string name="uploader_upload_failed_ticker">பதிவேற்றல் தோல்வியுற்றது</string>
<string name="uploader_upload_failed_content_single">பதிவேற்றலின் %1$s தை முடிக்கமுடியவில்லை</string>
- <string name="uploader_upload_failed_content_multiple">பதிவேற்றல் தோல்வியுற்றது : %1$d/%2$d கோப்புகள் பதிவேற்றப்பட்டது</string>
<string name="downloader_download_in_progress_ticker">பதிவிறக்கப்படுகிறது....</string>
<string name="downloader_download_in_progress_content">%1$d%% பதிவிறக்கல் %2$s</string>
<string name="downloader_download_succeeded_ticker">வெற்றிகரமான பதிவிறக்கல் </string>
<string name="downloader_download_failed_ticker">பதிவிறக்கல் தோல்வியுற்றது</string>
<string name="downloader_download_failed_content">பதிவிறக்கலின் %1$s தை முடிக்கவில்லை</string>
<string name="common_choose_account">கணக்கை தெரிவுசெய்க</string>
- <string name="sync_string_contacts">தொடர்புகள்</string>
<string name="sync_fail_ticker">ஒத்திசைவாக்கல் தோல்வியுற்றது</string>
<string name="sync_fail_content">ஒத்திசைவாக்கலின் %1$s ஆனதை முடிக்கமுடியவில்லை</string>
<string name="sync_conflicts_in_favourites_ticker">முரன்பாடுகள் கண்டுப்பிடிக்கப்பட்டன</string>
<string name="sync_fail_in_favourites_content">கோப்புகள் %1$d இலுள்ள உள்ளடக்கங்களை ஒத்திசைவாக்கமுடியாது (%2$d முரன்பாடுகள்) </string>
- <string name="use_ssl">பாதுகாப்பான இணைப்பை பயன்படுத்துக</string>
- <string name="location_no_provider">ownCloud இனால் உங்களுடைய சாதனத்தை கண்காணிக்க முடியவில்லை. தயவுசெய்து உங்களுடைய இருப்பிட அமைப்புக்களை சரிபார்க்கவும்</string>
<string name="pincode_enter_pin_code">தயவுசெய்து உங்களுடைய App PIN ஐ உள்ளிடுக</string>
- <string name="pincode_enter_new_pin_code">தயவுசெய்து உங்களுடைய புதிய App PIN ஐ உள்ளிடுக</string>
- <string name="pincode_configure_your_pin">ownCloud இன் App PIN ஐ உள்ளிடுக</string>
+ <string name="pincode_configure_your_pin">இன் App PIN ஐ உள்ளிடுக</string>
<string name="pincode_configure_your_pin_explanation">செயலி தொடங்கும் ஒவ்வொரு நேரமும் PIN கேட்கப்படுகின்றது.</string>
- <string name="pincode_reenter_your_pincode">தயவுசெய்து மீண்டும் ownCloud App PIN ஐ உள்ளிடுக</string>
- <string name="pincode_remove_your_pincode">உங்களுடைய ownCloud App PIN ஐ அகற்றுக</string>
- <string name="pincode_mismatch">இரண்டு ownCloud App PIN களும் ஒன்றே அல்ல</string>
- <string name="pincode_wrong">தவறான ownCloud App PIN </string>
- <string name="pincode_removed">ownCloud App PIN அகற்றப்பட்டது</string>
- <string name="pincode_stored">ownCloud App PIN சேமிக்கப்பட்டது</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 நிமிடங்கள்</item>
- <item>30நிமிடங்கள்</item>
- <item>60 நிமிடங்கள்</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_reenter_your_pincode">தயவுசெய்து மீண்டும் App PIN ஐ உள்ளிடுக</string>
+ <string name="pincode_remove_your_pincode">உங்களுடைய App PIN ஐ அகற்றுக</string>
+ <string name="pincode_mismatch">இரண்டு App PIN களும் ஒன்றே அல்ல</string>
+ <string name="pincode_wrong">தவறான App PIN </string>
+ <string name="pincode_removed">App PIN அகற்றப்பட்டது</string>
+ <string name="pincode_stored">App PIN சேமிக்கப்பட்டது</string>
<string name="auth_trying_to_login">புகுபதிகைக்கு முயற்சிக்கின்றது...</string>
<string name="auth_no_net_conn_title">வலையமைப்பு இணைப்பு இல்லை</string>
- <string name="auth_no_net_conn_message">எந்தவொரு வலையமைப்பு இணைப்பும் கண்டுப்பிடிக்கப்படவில்லை, இணைய இணைப்பை சரிபார்த்துவிட்டு மீண்டும் முயற்சிக்கவும். </string>
- <string name="auth_connect_anyway">எப்படியாவது இணைக்க</string>
<string name="auth_nossl_plain_ok_title">பாதுகாப்பான இணைப்பு காணப்படவில்லை.</string>
- <string name="auth_nossl_plain_ok_message">செயலியினால் சேவையகத்துடன் பாதுகாப்பான இணைப்பை ஏற்படுத்த முடியவில்லை. பாதுகாப்பற்ற இணைப்புகளும் காணப்படுகின்றன. நீங்கள் தொடரலாம் அல்லது இரத்துசெய்யலாம்.</string>
<string name="auth_connection_established">இணைப்பு நிறுவப்பட்டது</string>
<string name="auth_testing_connection">இணைப்பு சோதிக்கப்படுகிறது.....</string>
- <string name="auth_not_configured_title">பிறழ்வான ownCloud தகவமைப்பு</string>
- <string name="auth_not_configured_message">உங்களுடைய ownCloud சரியாக தகவமைக்கப்படாததாக தெரிகிறது. மேலதிக தகவல்களுக்கு நிர்வாகியை தொடர்புகொள்ளவும்</string>
+ <string name="auth_not_configured_title">பிறழ்வான தகவமைப்பு</string>
<string name="auth_unknown_error_title">அறியப்படாத வழு ஏற்பட்டுள்ளது!</string>
- <string name="auth_unknown_error_message">அறியப்படாத வழு ஏற்பட்டுள்ளது. தயவுசெய்து உங்களுடைய சாதனத்தினூடாக ஆசிரியரையும் சேர்க்கப்பட்டுள்ள பதிகையையும் தொடர்புகொள்க.</string>
<string name="auth_unknown_host_title">ஓம்புனரை கண்டுப்பிடிக்கமுடியவில்லை</string>
- <string name="auth_unknown_host_message">நுழைக்கப்பட்ட ஓம்புனரை கண்டுப்பிடிக்கமுடியவில்லை. தயவுசெய்து ஓம்புனர் பெயரையும் சேவையகத்தின் வழங்குதலையும் சரிப்பார்த்து மீண்டும் முயற்சிக்கவும்.</string>
- <string name="auth_incorrect_path_title">ownCloud காணப்படவில்லை</string>
- <string name="auth_incorrect_path_message">தரப்பட்ட பாதையினூடாக செயலியினால் ownClound ஐ கண்டுப்பிடிக்க முடியவில்லை. தயவுசெய்து உங்களுடைய பாதையை சரிபார்த்து மீண்டும் முயற்சிக்கவும்.</string>
+ <string name="auth_incorrect_path_title"> காணப்படவில்லை</string>
<string name="auth_timeout_title">இந்த சேவையகம் பதில் கொடுப்பதற்கு நீண்ட நேரம் எடுக்கின்றது</string>
<string name="auth_incorrect_address_title">பிறழ்வான URL</string>
<string name="auth_ssl_general_error_title">SSL இன் தொடக்கநிலை தோல்வியுற்றது</string>
- <string name="auth_ssl_unverified_server_title">உறுதிப்படுத்தப்படாத SSL சேவையகத்தின் அடையாளம்</string>
- <string name="auth_bad_oc_version_title">அங்கீகரிக்கப்படாத ownCloud சேவையகம் பதிப்பு</string>
+ <string name="auth_bad_oc_version_title">அங்கீகரிக்கப்படாத சேவையகம் பதிப்பு</string>
<string name="auth_wrong_connection_title">இணைப்பை நிறுவமுடியாது</string>
<string name="auth_secure_connection">பாதுகாப்பான இணைப்பு உருவாக்கப்பட்டது.</string>
- <string name="auth_login_details">புகுபதிகை விவரங்கள்</string>
- <string name="crashlog_message">செயலி எதிர்பாராமல் முடிவுற்றது. உங்களுக்கு முறிவு அறிக்கை ஒன்றை சமர்ப்பிப்பதற்கு விருப்பம்மா?</string>
- <string name="crashlog_send_report">அறிக்கையை அனுப்பவும்</string>
- <string name="crashlog_dont_send_report">அறிக்கையை அனுப்பவேண்டாம்</string>
- <string name="extensions_avail_title">நீட்சிகள் காணப்படுகின்றன!</string>
- <string name="extensions_avail_message">உங்களுடைய ownCloud முன்னேற்றமான நீட்சிக்கு ஆதரவளிப்பதாக தெரிகிறது. android க்கு நீட்சிகள் இருக்கின்றனவா என அறிய ஆவலா?</string>
<string name="fd_keep_in_sync">நவீன கோப்பை வைத்திருக்கவும்</string>
- <string name="common_share">பகிர்வு</string>
<string name="common_rename">பெயர்மாற்றம்</string>
<string name="common_remove">அகற்றுக</string>
<string name="confirmation_remove_alert">உங்களுக்கு உண்மையாக %1$s ஐ அகற்றவேண்டுமா?</string>
<string name="rename_server_fail_msg">பெயர்மாற்றத்தை முற்றாக முடிக்கமுடியவில்லை</string>
<string name="sync_file_fail_msg">தொலை கோப்பை சரிபார்க்கமுடியவில்லை</string>
<string name="sync_file_nothing_to_do_msg">கோப்பு உள்ளடக்கங்கள் ஏற்கவே ஒத்திசைக்கப்படுள்ளன</string>
- <string name="create_dir_fail_msg">அடைவுகளை உருவாக்க முடியவில்லை</string>
<string name="wait_a_moment">சிறிது நேரம் காத்திருங்கள்</string>
<string name="filedisplay_unexpected_bad_get_content">எதிர்பாராத பிரச்சினை ; தயவுசெய்து கோப்பை தெரிவுசெய்ய மற்ற செயலியை பயன்படுத்தவும்</string>
<string name="filedisplay_no_file_selected">ஒரு கோப்பும் தெரிவுசெய்யப்படவில்லை</string>
- <string name="ssl_validator_title">எச்சரிக்கை</string>
<string name="ssl_validator_header">தளத்தின் அடையாளத்தை உறுதிப்படுத்தமுடியவில்லை</string>
<string name="ssl_validator_reason_cert_not_trusted">- சேவையகத்தின் சான்றிதழ் நம்ப தகுந்ததாக இல்லை</string>
<string name="ssl_validator_reason_cert_expired">- சேவையகத்தின் சான்றிதழ் காலாவதியாகிவிட்டது</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- சேவையகத்தின் சான்றிதழ் மிகவும் இளமையானது</string>
<string name="ssl_validator_reason_hostname_not_verified">சான்றிதழில் உள்ள ஓம்புனரின் பெயர் URL உடன் ஒத்திருக்கவில்லை</string>
- <string name="ssl_validator_certificate_not_available">சேவையக சான்றிதழை பெற முடியவில்லை</string>
<string name="ssl_validator_question">இந்த சான்றிதழை நம்புகிறீர்களா?</string>
<string name="ssl_validator_not_saved">சான்றிதழை சேமிக்க முடியவில்லை</string>
<string name="ssl_validator_btn_details_see">விவரங்கள்</string>
<string name="ssl_validator_label_validity_to">இற்கு</string>
<string name="ssl_validator_label_signature">கையொப்பம்:</string>
<string name="ssl_validator_label_signature_algorithm">நெறிமுறை</string>
- <string name="text_placeholder">இது ஒரு placeholder</string>
+ <string name="placeholder_sentence">இது ஒரு placeholder</string>
<string name="instant_upload_on_wifi">WiFi ஊடாக மட்டும் படங்களை பதிவேற்றுக</string>
<string name="conflict_title">இற்றைப்படுத்தலில் முரண்பாடு</string>
<string name="conflict_message">இடத்துரி கோப்புடன் தொலைவு கோப்பு %s ஒத்திசைவாக்கப்படவில்லை. தொடர்ந்து மேற்கொண்டால் சேவையகத்தில் உள்ள கோப்பின் உள்ளடக்கம் மாற்றப்படும்.</string>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="actionbar_mkdir">కొత్త సంచయం</string>
+ <string name="actionbar_settings">అమరికలు</string>
+ <string name="actionbar_send_file">పంపించు</string>
+ <string name="prefs_category_more">మరిన్ని</string>
+ <string name="prefs_help">సహాయం</string>
+ <string name="auth_username">వాడుకరి పేరు</string>
+ <string name="auth_password">సంకేతపదం</string>
+ <string name="common_yes">అవును</string>
+ <string name="common_no">కాదు</string>
+ <string name="common_cancel">రద్దుచేయి</string>
+ <string name="common_error">పొరపాటు</string>
+ <string name="uploader_info_dirname">సంచయం పేరు</string>
+ <string name="activity_chooser_send_file_title">పంపించు</string>
+</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">รหัสผ่าน:</string>
- <string name="main_login">ชื่อผู้ใช้:</string>
- <string name="main_button_login">เข้าสู่ระบบ</string>
- <string name="main_welcome">ยินดีต้อนรับเข้าสู่ ownCloud ของคุณ</string>
- <string name="main_files">ไฟล์</string>
- <string name="main_music">เพลง</string>
- <string name="main_contacts">ข้อมูลผู้ติดต่อ</string>
- <string name="main_calendar">ปฏิทิน</string>
- <string name="main_bookmarks">รายการโปรด</string>
- <string name="main_settings">ตั้งค่า</string>
- <string name="main_tit_accsetup">ตั้งค่าบัญชี</string>
- <string name="main_wrn_accsetup">ไม่มีบัญชี ownCloud ของคุณอยู่บนอุปกรณ์ของคุณ หากต้องการใช้งานแอปตัวนี้ คุณจำเป็นต้องสร้างบัญชีใหม่</string>
- <string name="about_message">โปรแกรมไคลเอนต์ ownCloud สำหรับใช้งานกับแอนดรอยด์\n\nรุ่น: %1$s</string>
- <string name="actionbar_sync">รีเฟรช</string>
<string name="actionbar_upload">อัพโหลดไฟล์</string>
<string name="actionbar_upload_from_apps">เนื้อหาจากแอปฯอื่นๆ</string>
<string name="actionbar_upload_files">ไฟล์</string>
- <string name="actionbar_mkdir">สร้างไดเร็กทอรี่</string>
- <string name="actionbar_search">ค้นหา</string>
+ <string name="actionbar_mkdir">โฟลเดอร์ใหม่</string>
<string name="actionbar_settings">ตั้งค่า</string>
+ <string name="actionbar_see_details">รายละเอียด</string>
+ <string name="actionbar_send_file">ส่ง</string>
<string name="prefs_category_general">ทั่วไป</string>
- <string name="prefs_category_trackmydevice">ตรวจหาอุปกรณ์</string>
- <string name="prefs_add_session">เพิ่มเซสชั่นใหม่</string>
- <string name="prefs_create_img_thumbnails">สร้างรูปภาพขนาดย่อ</string>
- <string name="prefs_select_oc_account">เลือกบัญชี</string>
- <string name="prefs_summary_select_oc_account">เลือกบัญชีที่ต้องการใช้งานกับแอปตัวนี้</string>
- <string name="prefs_trackmydevice">ตรวจหาอุปกรณ์</string>
- <string name="prefs_trackmydevice_summary_off">เปิดให้ ownCloud ตรวจหาตำแหน่งที่อยู่อุปกรณ์ของคุณ</string>
- <string name="prefs_trackmydevice_summary_on">ownCloud กำลังติดตามอุปกรณ์นี้อยู่</string>
- <string name="prefs_trackmydevice_interval">ช่วงเวลาการอัพเดท</string>
- <string name="prefs_trackmydevice_interval_summary">อัพเดททุก %1$s นาที</string>
+ <string name="prefs_category_more">มาก</string>
<string name="prefs_accounts">บัญชี</string>
<string name="prefs_manage_accounts">บริหารจัดการบัญชี</string>
- <string name="prefs_pincode">ownCloud App PIN</string>
- <string name="prefs_pincode_summary">ป้องกันโปรแกรมไคลเอนต์ ownCloud ของคุณ</string>
+ <string name="prefs_pincode">App PIN</string>
+ <string name="prefs_pincode_summary">ป้องกันโปรแกรมไคลเอนต์ ของคุณ</string>
<string name="prefs_instant_upload">เปิดใช้งานระบบอัพโหลดได้ทันที</string>
<string name="prefs_instant_upload_summary">อัพโหลดรูปภาพจากกล้องขึ้นไปทันที</string>
- <string name="auth_host_url">ownCloud URL</string>
+ <string name="prefs_help">ช่วยเหลือ</string>
<string name="auth_username">ชื่อผู้ใช้</string>
<string name="auth_password">รหัสผ่าน</string>
- <string name="auth_register">ข้าพเจ้าเพิ่งใช้งาน ownCloud</string>
- <string name="new_session_uri_error">ที่อยู่ URL ไม่ถูกต้อง</string>
- <string name="new_session_session_name_error">ชื่อเซสชั่นไม่ถูกต้อง</string>
<string name="sync_string_files">ไฟล์</string>
- <string name="uploader_no_file_selected">ยังไม่ได้เลือกไฟล์สำหรับอัพโหลด</string>
- <string name="setup_hint_username">ชื่อผู้ใช้</string>
- <string name="setup_hint_password">รหัสผ่าน</string>
- <string name="setup_hint_address">ที่อยู่เว็บ</string>
- <string name="setup_hint_show_password">แสดงรหัสผ่าน?</string>
- <string name="setup_title">เชื่อมต่อกับ ownCloud ของคุณ</string>
<string name="setup_btn_connect">เชื่อมต่อ</string>
<string name="uploader_btn_upload_text">อัพโหลด</string>
<string name="uploader_wrn_no_account_title">ไม่พบบัญชีที่ต้องการ</string>
- <string name="uploader_wrn_no_account_text">ไม่มีบัญชี ownCloud บนอุปกรณ์ของคุณ กรุณาตั้งค่าบัญชีของคุณก่อน</string>
+ <string name="uploader_wrn_no_account_text">ไม่มีบัญชี %1$s บนอุปกรณ์ของคุณ กรุณาตั้งค่าบัญชีของคุณก่อน</string>
<string name="uploader_wrn_no_account_setup_btn_text">ตั้งค่า</string>
<string name="uploader_wrn_no_account_quit_btn_text">ออก</string>
<string name="uploader_wrn_no_content_title">ยังไม่มีเนื้อหาให้ต้องอัพโหลด</string>
<string name="uploader_wrn_no_content_text">ยังไม่ได้รับเนื้อหา ไม่มีอะไรให้ต้องอัพโหลด</string>
- <string name="uploader_error_forbidden_content">ownCloud ไม่อนุญาตให้เข้าถึงเนื้อหาที่ถูกแชร์ไว้</string>
+ <string name="uploader_error_forbidden_content">%1$s ไม่อนุญาตให้เข้าถึงเนื้อหาที่ถูกแชร์ไว้</string>
<string name="uploader_info_uploading">กำลังอัพโหลด</string>
- <string name="uploader_btn_create_dir_text">สร้างไดเร็กทอรี่สำหรับอัพโหลด</string>
<string name="file_list_empty">ยังไม่มีไฟล์อยู่ในโฟลเดอร์นี้.\nสามารถเพิ่มไฟล์ใหม่ได้จากตัวเลือกในเมนู \"อัพโหลด\".</string>
<string name="filedetails_select_file">แตะที่ไฟล์ เพื่อแสดงข้อมูลเพิ่มเติม</string>
<string name="filedetails_size">ขนาด:</string>
<string name="filedetails_created">สร้างเมื่อ:</string>
<string name="filedetails_modified">แก้ไขเมื่อ:</string>
<string name="filedetails_download">ดาวน์โหลด</string>
- <string name="filedetails_sync_file">รีเฟรช</string>
- <string name="filedetails_redownload">ดาวน์โหลดใหม่อีกครั้ง</string>
- <string name="filedetails_open">เปิด</string>
<string name="filedetails_renamed_in_upload_msg">ไฟล์ได้ถูกเปลี่ยนชื่อเป็น %1$s ในระหว่างการอัพโหลด</string>
<string name="common_yes">ตกลง</string>
<string name="common_no">ไม่ตกลง</string>
<string name="common_cancel_upload">ยกเลิกการอัพโหลด</string>
<string name="common_cancel">ยกเลิก</string>
<string name="common_save_exit">บันทึก & ออก</string>
- <string name="common_exit">ออกจาก ownCloud</string>
<string name="common_error">ข้อผิดพลาด</string>
+ <string name="common_error_unknown">ข้อผิดพลาดที่ไม่ทราบสาเหตุ</string>
<string name="about_title">เกี่ยวกับเรา</string>
+ <string name="change_password">เปลี่ยนรหัสผ่าน</string>
<string name="delete_account">ลบบัญชี</string>
<string name="create_account">สร้างบัญชีใหม่</string>
<string name="upload_chooser_title">อัพโหลดไฟล์จาก...</string>
- <string name="uploader_info_dirname">à¸\8aืà¹\88à¸à¹\84à¸\94à¹\80รà¹\87à¸\81à¸\97à¸à¸£à¸µà¹\88</string>
+ <string name="uploader_info_dirname">à¸\8aืà¹\88à¸à¹\82à¸\9fลà¹\80à¸\94à¸à¸£à¹\8c</string>
<string name="uploader_upload_in_progress_ticker">กำลังอัพโหลด...</string>
<string name="uploader_upload_in_progress_content">%1$d%% กำลังอัพโหลด %2$s</string>
<string name="uploader_upload_succeeded_ticker">อัพโหลดเสร็จสิ้น</string>
<string name="uploader_upload_succeeded_content_single">%1$s ได้ถูกอัพโหลดเรียบร้อยแล้ว</string>
- <string name="uploader_upload_succeeded_content_multiple">ไฟล์ %1$d ได้ถูกอัพโหลดเรียบร้อยแล้ว</string>
<string name="uploader_upload_failed_ticker">อัพโหลดล้มเหลว</string>
<string name="uploader_upload_failed_content_single">การอัพโหลด %1$s ไม่สามารถดำเนินการให้เสร็จสมบูรณ์ได้</string>
- <string name="uploader_upload_failed_content_multiple">การอัพโหลดล้มเหลว: ไฟล์ %1$d/%2$d ถูกอัพโหลดแล้ว</string>
<string name="downloader_download_in_progress_ticker">กำลังดาวน์โหลด ...</string>
<string name="downloader_download_in_progress_content">%1$d%% กำลังดาวน์โหลด %2$s</string>
<string name="downloader_download_succeeded_ticker">ดาวน์โหลดเสร็จสิ้น</string>
<string name="downloader_download_failed_ticker">ดาวน์โหลดล้มเหลว</string>
<string name="downloader_download_failed_content">การดาวน์โหลด %1$s ไม่สามารถดำเนินการให้เสร็จสมบูรณ์ได้</string>
<string name="common_choose_account">เลือกบัญชี</string>
- <string name="sync_string_contacts">ข้อมูลผู้ิติดต่อ</string>
<string name="sync_fail_ticker">การเชื่อมผสานข้อมูลล้มเหลว</string>
<string name="sync_fail_content">การเชื่อมผสานข้อมูลของ %1$s ไม่สามารถดำเนินการให้เสร็จสมบูรณ์ได้</string>
<string name="sync_conflicts_in_favourites_ticker">ตรวจพบความขัดแย้ง</string>
<string name="sync_conflicts_in_favourites_content">%1$d ไฟล์ kept-in-sync ไม่สามารถผสานเชื่อมข้อมูลได้</string>
<string name="sync_fail_in_favourites_ticker">ไฟล์ Kept-in-sync ล้มเหลว</string>
<string name="sync_fail_in_favourites_content">เนื้อหาของไฟล์ %1$d ไม่สามารถผสานเชื่อมข้อมูลได้ (ความขัดแย้ง %2$d รายการ)</string>
- <string name="use_ssl">ใช้การเชื่อมต่อที่มีการรักษาความปลอดภัย</string>
- <string name="location_no_provider">ownCloud ไม่สามารถตรวจหาอุปกรณ์ของคุณได้ กรุณาตรวจสอบการตั้งค่าตำแหน่งที่อยู่ของคุณ</string>
+ <string name="sync_foreign_files_forgotten_ticker">มีบางแฟ้มข้อมูลในเครื่องถูกลืม</string>
+ <string name="foreign_files_move">ย้ายทั้งหมด</string>
+ <string name="foreign_files_success">ทุกแฟ้มข้อมูลถูกย้ายเรียบร้อยแล้ว</string>
+ <string name="foreign_files_fail">มีบางแฟ้มข้อมูลไม่สามารถย้ายได้</string>
+ <string name="foreign_files_local_text">ต้นทาง: %1$s</string>
+ <string name="foreign_files_remote_text">ปลายทาง: %1$s</string>
+ <string name="upload_query_move_foreign_files">ไม่มีพื้นที่เหลือเพียงพอสำหรับคัดลอกแฟ้มข้อมูลที่เลือกไว้ไปที่โฟลเดอร์ %1$s คุณต้องการย้ายมันแทนหรือไม่</string>
<string name="pincode_enter_pin_code">กรุณาใส่ PIN แอปของคุณ</string>
- <string name="pincode_enter_new_pin_code">กรุณาใส่รหัส PIN แอปตัวใหม่ของคุณ</string>
- <string name="pincode_configure_your_pin">กรอกรหัส PIN ของ ownCloud App</string>
+ <string name="pincode_configure_your_pin">กรอกรหัส PIN ของ App</string>
<string name="pincode_configure_your_pin_explanation">หมายเลข PIN ดังกล่าวจะถูกร้องขอทุกครั้งที่เริ่มใช้งานแอปฯ</string>
- <string name="pincode_reenter_your_pincode">กรุณากรอกรหัส PIN ของแอป ownCloud ใหม่อีกครั้ง</string>
- <string name="pincode_remove_your_pincode">ลบรหัส PIN แอป ของ ownCloud ของคุณ</string>
- <string name="pincode_mismatch">รหัส ownCloud App API ไม่ตรงกัน</string>
- <string name="pincode_wrong">รหัส PIN ownCloud App ไม่ถูกต้อง</string>
- <string name="pincode_removed">รหัส PIN แอปสำหรับ ownCloud ถูกลบออกแล้ว</string>
- <string name="pincode_stored">จัดเก็บรหัส PIN แอป ของ ownCloud แล้ว</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 นาที</item>
- <item>30 นาที</item>
- <item>60 นาที</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_reenter_your_pincode">กรุณากรอกรหัส PIN ของแอป App ใหม่อีกครั้ง</string>
+ <string name="pincode_remove_your_pincode">ลบรหัส PIN แอป ของ App ของคุณ</string>
+ <string name="pincode_mismatch">รหัส App API ไม่ตรงกัน</string>
+ <string name="pincode_wrong">รหัส PIN App ไม่ถูกต้อง</string>
+ <string name="pincode_removed">รหัส PIN แอปสำหรับ ถูกลบออกแล้ว</string>
+ <string name="pincode_stored">จัดเก็บรหัส PIN แอป ของ แล้ว</string>
<string name="auth_trying_to_login">กำลังเข้าสู่ระบบ...</string>
<string name="auth_no_net_conn_title">ไม่มีการเชื่อมต่อเครือข่ายใดๆ</string>
- <string name="auth_no_net_conn_message">ไม่พบการเชื่อมต่อเครือข่ายใด กรุณาตรวจสอบสถานะการเชื่อมต่ออินเทอร์เน็ตของคุณ แล้วลองใหม่อีกครั้ง</string>
- <string name="auth_connect_anyway">เชื่อมต่ออยู่แล้ว</string>
<string name="auth_nossl_plain_ok_title">การเชื่อมต่อแบบรักษาความปลอดภัยไม่สามารถใช้งานได้</string>
- <string name="auth_nossl_plain_ok_message">แอพพลิเคชั่นยังไม่ได้ติดตั้งการเชื่อมต่อแบบปลอดภัยกับเซิร์ฟเวอร์ ถึงแม้ว่าจะมีการเชื่อมต่อแบบที่ยังไม่ได้กำหนดให้มีความปลอดภัย คุณสามารถดำเนินการต่อไป หรือยกเลิกได้</string>
<string name="auth_connection_established">ติดตั้งการเชื่อมต่อแล้ว</string>
<string name="auth_testing_connection">กำลังทดสอบการเชื่อมต่อ...</string>
- <string name="auth_not_configured_title">การกำหนดค่า Malformed ownCloud</string>
- <string name="auth_not_configured_message">ดูเหมือนว่าค่าตัวอย่าง ownCloud ของคุณยังไม่ได้ถูกกำหนดค่าอย่างถูกต้อง กรุณาติดต่อผู้ดูแลระบบของคุณ สำหรับรายละเอียดเพิ่มเติม</string>
+ <string name="auth_not_configured_title">การกำหนดค่า Malformed เซิร์ฟเวอร์</string>
<string name="auth_unknown_error_title">เกิดข้อผิดพลาดที่ไม่ทราบสาเหตุ!</string>
- <string name="auth_unknown_error_message">เกิดข้อผิดพลาดโดยไม่ทราบสาเหตุ กรุณาติดต่อเจ้าของและดูบันทึกข้อมูลการใช้งานจากอุปกรณ์ของคุณ</string>
<string name="auth_unknown_host_title">ไม่พบโฮสต์ที่ต้องการ</string>
- <string name="auth_unknown_host_message">ไม่พบโฮสต์ตามข้อมูลที่กรอก กรุณาตรวจสอบชื่อโฮสต์และเซิร์ฟเวอร์ที่สามารถใช้งานได้ แล้วลองใหม่อีกครั้ง</string>
- <string name="auth_incorrect_path_title">ไม่พบค่าตัวอย่าง ownCloud</string>
- <string name="auth_incorrect_path_message">แอพพลิเคชั่นไม่สามารถค้นพบค่าตัวอย่าง ownCloud ตามตำแหน่งพาธที่ระบุไว้ได้ กรุณาตรวจสอบตำแหน่งของคุณ แล้วลองใหม่อีกครั้ง</string>
+ <string name="auth_incorrect_path_title">ไม่พบค่าตัวอย่างเซิร์ฟเวอร์</string>
<string name="auth_timeout_title">เซิร์ฟเวอร์ดังกล่าวใช้เวลาตอบสนองนานเกินไป</string>
<string name="auth_incorrect_address_title">Malformed URL</string>
<string name="auth_ssl_general_error_title">การเตรียมใช้งาน SSL ล้มเหลว</string>
- <string name="auth_ssl_unverified_server_title">ข้อมูลการเข้าใช้งานเซิร์ฟเวอร์ SSL ยังไม่ได้ยืนยันความถูกต้อง</string>
- <string name="auth_bad_oc_version_title">รุ่นของเซิร์ฟเวอร์ ownCloud ไม่เป็นที่รู้จัก</string>
+ <string name="auth_bad_oc_version_title">รุ่นของเซิร์ฟเวอร์เซิร์ฟเวอร์ ไม่เป็นที่รู้จัก</string>
<string name="auth_wrong_connection_title">ไม่สามารถเชื่อมต่อได้</string>
<string name="auth_secure_connection">ดำเนินการติดตั้งการเชื่อมต่อแบบปลอดภัยเรียบร้อย</string>
- <string name="auth_login_details">รายละเอียดการเข้าสู่ระบบ</string>
- <string name="auth_unauthorized">ชื่อล็อคอิน/รหัสผ่าน ไม่ถูกต้อง</string>
- <string name="auth_not_found">กรอกตำแหน่งพาธไม่ถูกต้อง</string>
- <string name="auth_internal">เกิดข้อผิดพลาดภายในเซิร์ฟเวอร์ รหัส %1$d</string>
- <string name="crashlog_message">แอพพลิเคชั่นได้สิ้นสุดการทำงานอย่างไม่คาดคิด คุณต้องการแจ้งข้อมูลความบกพร่องดังกล่าวหรือไม่?</string>
- <string name="crashlog_send_report">ส่งรายงาน</string>
- <string name="crashlog_dont_send_report">ไม่ต้องส่งรายงาน</string>
- <string name="extensions_avail_title">ส่วนเสริมที่สามารถใช้งานได้!</string>
- <string name="extensions_avail_message">ดูเหมือนว่าค่าตัวอย่าง ownClud ของคุณกำลังสนับสนุนการใช้งานกับส่วนเสริมขั้นสูงอยู่ คุณต้องการดูส่วนเสริมอื่นๆที่สามารถใช้งานกับ android เพิ่มหรือไม่?</string>
<string name="fd_keep_in_sync">ปรับปรุงไฟล์ให้ทันสมัยอยู่เสมอ</string>
- <string name="common_share">แชร์</string>
<string name="common_rename">เปลี่ยนชื่อ</string>
<string name="common_remove">ลบออก</string>
<string name="confirmation_remove_alert">คุณแน่ใจแล้วหรือว่าต้องการลบ %1$s?</string>
<string name="rename_server_fail_msg">ไม่สามารถเปลี่ยนชื่อได้</string>
<string name="sync_file_fail_msg">ไม่สามารถตรวจสอบไฟล์ระยะไกลได้</string>
<string name="sync_file_nothing_to_do_msg">เนื้อหาของไฟล์ถูกผสานข้อมูลอยู่แล้ว</string>
- <string name="create_dir_fail_msg">ไม่สามารถสร้างไดเร็กทอรี่ได้</string>
<string name="wait_a_moment">กรุณารอสักครู่</string>
<string name="filedisplay_unexpected_bad_get_content">เกิดปัญหาที่ไม่คาดคิด ; กรุณาลองใช้งานแอปฯอื่นๆ เพื่อเลือกไฟล์</string>
<string name="filedisplay_no_file_selected">ไม่มีไฟล์ที่ถูกเลือก</string>
- <string name="ssl_validator_title">คำเตือน</string>
<string name="ssl_validator_header">ไม่สามารถยืนยันความถูกต้องของตัวตนของเว็บไซต์ได้</string>
<string name="ssl_validator_reason_cert_not_trusted">- ใบรับรองความปลอดภัยของเซิร์ฟเวอร์ไม่น่าเชื่อถือ</string>
<string name="ssl_validator_reason_cert_expired">- ใบรับรองความปลอดภัยของเซิร์ฟเวอร์หมดอายุแล้ว</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- ใบรับรองความปลอดภัยของเซิร์ฟเวอร์ยังมีอายุน้อยอยู่</string>
<string name="ssl_validator_reason_hostname_not_verified">- URL ดังกล่าวไม่ตรงกันกับชื่อโฮสต์ที่อยู่ในใบรับรอง</string>
- <string name="ssl_validator_certificate_not_available">ไม่สามารถขอรับใบรับรองความปลอดภัยของเซิร์ฟเวอร์ได้</string>
<string name="ssl_validator_question">คุณต้องการให้ความไว้วางใจในใบรับรองความปลอดภัยนี้หรือไม่?</string>
<string name="ssl_validator_not_saved">ไม่สามารถบันทึกใบรับรองความปลอดภัยได้</string>
<string name="ssl_validator_btn_details_see">รายละเอียด</string>
<string name="ssl_validator_label_validity_to">ถึง:</string>
<string name="ssl_validator_label_signature">ลายเซ็นต์:</string>
<string name="ssl_validator_label_signature_algorithm">อัลกอริทึ่ม:</string>
- <string name="text_placeholder">นี่เป็นตัวยึด</string>
+ <string name="placeholder_sentence">นี่เป็นตัวยึด</string>
<string name="instant_upload_on_wifi">อัพโหลดรูปภาพผ่านทาง WiFi เท่านั้น</string>
<string name="instant_upload_path">/อัพโหลดทันที</string>
<string name="conflict_title">ปรับปรุงปัญหาความขัดแย้ง</string>
<string name="conflict_keep_both">เก็บไว้ทั้งสองอย่าง</string>
<string name="conflict_overwrite">เขียนทับ</string>
<string name="conflict_dont_upload">ไม่ต้องอัพโหลด</string>
+ <string name="activity_chooser_send_file_title">ส่ง</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Şifre:</string>
- <string name="main_login">Kullanıcı Adı:</string>
- <string name="main_button_login">Giriş</string>
- <string name="main_welcome">ownCloud\'ınıza hoşgeldiniz</string>
- <string name="main_files">Dosyalar</string>
- <string name="main_music">Müzik</string>
- <string name="main_contacts">Kişi Rehberi</string>
- <string name="main_calendar">Takvim</string>
- <string name="main_bookmarks">Yer İmleri</string>
- <string name="main_settings">Ayarlar</string>
- <string name="main_tit_accsetup">Kurulum Hesabi</string>
- <string name="main_wrn_accsetup">Cihazınızda ownCloud hesabı bulunmamaktadır. Bu uygulamayı kullanabilmeniz için ownCloud hesabı oluşturmalısınız.</string>
- <string name="actionbar_sync">Eşitleme hesabi</string>
- <string name="actionbar_upload">Dosya yükle</string>
+ <string name="about_android">%1$s Android Uygulaması</string>
+ <string name="about_version">sürüm %1$s</string>
+ <string name="actionbar_sync">Hesabı yenile</string>
+ <string name="actionbar_upload">Yükle</string>
<string name="actionbar_upload_from_apps">Diğer uygulamalardan içerik</string>
<string name="actionbar_upload_files">Dosyalar</string>
- <string name="actionbar_mkdir">Klasör yarat</string>
- <string name="actionbar_search">Arama</string>
+ <string name="actionbar_open_with">ile aç</string>
+ <string name="actionbar_mkdir">Yeni klasör</string>
<string name="actionbar_settings">Ayarlar</string>
+ <string name="actionbar_see_details">Detaylar</string>
+ <string name="actionbar_send_file">Gönder</string>
<string name="prefs_category_general">Genel</string>
- <string name="prefs_category_trackmydevice">Cihaz tabiki</string>
- <string name="prefs_add_session">Yeni oturum ekle</string>
- <string name="prefs_create_img_thumbnails">Küçük resim oluştur</string>
- <string name="prefs_select_oc_account">Oturum seç</string>
- <string name="prefs_summary_select_oc_account">Uygulamanın hangi hesaplarınızı kullanması gerektiğini seçiniz.</string>
- <string name="prefs_trackmydevice">Cihaz takibi</string>
- <string name="prefs_trackmydevice_summary_off">Cihazınınızın konumunu takip etmesi için ownCloud\'u aktif edin</string>
- <string name="prefs_trackmydevice_summary_on">ownCloud\'unuz bu cihazı takip etmektedir</string>
- <string name="prefs_trackmydevice_interval">Güncelleme aralığı</string>
- <string name="prefs_trackmydevice_interval_summary">Her %1$s dakikada güncelle</string>
+ <string name="prefs_category_more">Daha fazla</string>
<string name="prefs_accounts">Hesaplar</string>
<string name="prefs_manage_accounts">Hesapları yönet</string>
- <string name="prefs_pincode">ownCloud App PIN</string>
+ <string name="prefs_pincode">App PIN</string>
<string name="prefs_pincode_summary">İstemcinizi koruyun</string>
<string name="prefs_instant_upload">Anında yükleme etkinleştir</string>
<string name="prefs_instant_upload_summary">Anında çekilen fotoğrafları yükle</string>
- <string name="auth_host_url">ownCloud URL</string>
+ <string name="prefs_log_title">Günlük tutmayı etkinleştir</string>
+ <string name="prefs_log_summary">Bu, sorunları günlük dosyasına kaydetmek için kullanılır</string>
+ <string name="prefs_log_title_history">Günlük geçmişi</string>
+ <string name="prefs_log_summary_history">Bu, kayıtlı günlük dosyalarını görüntüler</string>
+ <string name="prefs_log_delete_history_button">Geçmişi Sil</string>
+ <string name="prefs_help">Yardım</string>
+ <string name="prefs_recommend">Bir arkadaşa öner</string>
+ <string name="prefs_feedback">Geribildirim</string>
+ <string name="prefs_imprint">İzlenim</string>
+ <string name="recommend_subject">%1$s uygulamasını akıllı telefonunda dene!</string>
+ <string name="auth_check_server">Sunucuyu kontrol et</string>
+ <string name="auth_host_url">Sunucu Adresi https://…</string>
<string name="auth_username">Kullanıcı Adi:</string>
<string name="auth_password">Şifre:</string>
- <string name="auth_register">ownCloud\'da yeniyim.</string>
- <string name="new_session_uri_error">Geçersiz URL girildi</string>
- <string name="new_session_session_name_error">Yanlış oturum ismi</string>
+ <string name="auth_register">%1$s senin için yeni mi?</string>
<string name="sync_string_files">Dosyalar</string>
- <string name="uploader_no_file_selected">Yüklemek için dosya seçilmedi</string>
- <string name="setup_hint_username">Kullanıcı Adi:</string>
- <string name="setup_hint_password">Şifre:</string>
- <string name="setup_hint_address">Web adres</string>
- <string name="setup_hint_show_password">Şifre göster?</string>
- <string name="setup_title">ownCloud\'nıza bağlanin</string>
<string name="setup_btn_connect">Bağlan</string>
<string name="uploader_btn_upload_text">Yükle</string>
- <string name="uploader_wrn_no_account_title">Hesap bulunamadi</string>
- <string name="uploader_wrn_no_account_text">Cihazınızda ownCloud hesabı bulunmamaktadır. Lütfen öncelikle bir hesap ayarı giriniz.</string>
+ <string name="uploader_top_message">Yükleme klasörünü seçin:</string>
+ <string name="uploader_wrn_no_account_title">Hesap bulunamadı</string>
+ <string name="uploader_wrn_no_account_text">Cihazınızda %1$s hesabı bulunmamaktadır. Lütfen öncelikle bir hesap ayarlayın.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Kurulum</string>
<string name="uploader_wrn_no_account_quit_btn_text">Çıkış</string>
<string name="uploader_wrn_no_content_title">Yüklenecek içerik yok</string>
<string name="uploader_wrn_no_content_text">Yüklenecek içerik yok. Yüklenecek dosya yok.</string>
- <string name="uploader_error_forbidden_content">ownCloud, paylaşılan içeriğe erişim izni vermiyor</string>
+ <string name="uploader_error_forbidden_content">%1$s, paylaşılan içeriğe erişim izni vermiyor</string>
<string name="uploader_info_uploading">Yükleniyor</string>
- <string name="uploader_btn_create_dir_text">Yükleme için dizin oluştur</string>
- <string name="file_list_empty">Klasörde dosya yok. Yeni dosyalar yükle\'ye tıklayarak eklenebilir.</string>
- <string name="filedetails_select_file">Ek bilgileri görmek için dosyaya tıklayınız.</string>
+ <string name="file_list_empty">Bu klasörde dosya yok.\nYeni dosyalar \"Yükle\" menü seçeneği ile eklenebilir.</string>
+ <string name="filedetails_select_file">Ek bilgileri görmek için dosyaya dokunun.</string>
<string name="filedetails_size">Boyut:</string>
<string name="filedetails_type">Tür:</string>
- <string name="filedetails_created">Yaratma:</string>
+ <string name="filedetails_created">Oluşturulma:</string>
<string name="filedetails_modified">Değiştirme:</string>
<string name="filedetails_download">İndir</string>
- <string name="filedetails_sync_file">Tazele</string>
- <string name="filedetails_redownload">Tekrar indir</string>
- <string name="filedetails_open">Aç</string>
+ <string name="filedetails_sync_file">Dosyayı yenile</string>
+ <string name="filedetails_renamed_in_upload_msg">Dosya adı, yükleme sırasında %1$s olarak değiştirildi</string>
+ <string name="action_share_file">Paylaşma bağlantısı</string>
+ <string name="action_unshare_file">Bağlantı paylaşımını kaldır</string>
<string name="common_yes">Evet</string>
<string name="common_no">Hayır</string>
<string name="common_ok">OK</string>
<string name="common_cancel_upload">Yüklemeyi iptal et</string>
<string name="common_cancel">İptal</string>
<string name="common_save_exit">Kaydet %amp; Kapat</string>
- <string name="common_exit">Çıkış</string>
<string name="common_error">Hata</string>
+ <string name="common_loading">Yükleniyor...</string>
+ <string name="common_error_unknown">Bilinmeyen hata</string>
<string name="about_title">Hakkında</string>
+ <string name="change_password">Parola değiştir</string>
<string name="delete_account">Hesabı sil</string>
<string name="create_account">Hesap oluştur</string>
<string name="upload_chooser_title">... dan dosya yükle</string>
- <string name="uploader_info_dirname">Dizin ismi</string>
+ <string name="uploader_info_dirname">Klasör ismi</string>
<string name="uploader_upload_in_progress_ticker">Yüklüyor ...</string>
<string name="uploader_upload_in_progress_content">%1$d%% Yükleniyor %2$s</string>
<string name="uploader_upload_succeeded_ticker">Yükleme başarılı</string>
<string name="uploader_upload_succeeded_content_single">%1$s kadarı başarıyla yüklendi.</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d dosya başarılı bir şekilde yüklendi</string>
<string name="uploader_upload_failed_ticker">Yükleme başarısız</string>
<string name="uploader_upload_failed_content_single">%1$s yüklenmedi tamamlanamadı</string>
- <string name="uploader_upload_failed_content_multiple">Yükleme başarısız : %1$d/%2$d dosya yüklendi</string>
<string name="downloader_download_in_progress_ticker">İndiriyor ...</string>
<string name="downloader_download_in_progress_content">%1$d%% İndiriliyor %2$s</string>
<string name="downloader_download_succeeded_ticker">İndirme başarılı</string>
<string name="downloader_download_succeeded_content">%1$s başarıyla indirildi</string>
<string name="downloader_download_failed_ticker">İndirilme başarısız</string>
<string name="downloader_download_failed_content">%1$s indirilmesi tamamlanamadı</string>
+ <string name="downloader_not_downloaded_yet">Henüz indirilemedi</string>
<string name="common_choose_account">Hesap seçiniz</string>
- <string name="sync_string_contacts">Kontaklar</string>
<string name="sync_fail_ticker">Eşitleme başarısız</string>
- <string name="sync_fail_content">%1$s Senkronizasyonu tamamlanamadı</string>
+ <string name="sync_fail_content">%1$s eşitlemesi tamamlanamadı</string>
+ <string name="sync_fail_content_unauthorized">%1$s için geçersiz parola</string>
<string name="sync_conflicts_in_favourites_ticker">Çakışma bulundu</string>
- <string name="use_ssl">Güvenli bağlanti kullan</string>
- <string name="location_no_provider">ownCloud cihazınızı takip edemiyor. Lütfen konum ayarlarınızı kontrol ediniz</string>
+ <string name="sync_conflicts_in_favourites_content">%1$d korumalı eşitleme dosyası, eşitlenemedi</string>
+ <string name="sync_fail_in_favourites_ticker">Korunan dosya eşitlemesi başarısız</string>
+ <string name="sync_fail_in_favourites_content">%1$d dosya eşitlenemedi (%2$d çakışma)</string>
+ <string name="sync_foreign_files_forgotten_ticker">Bazı yerel dosyalar unutuldu</string>
+ <string name="sync_foreign_files_forgotten_content">%2$s klasöründeki %1$d dosya şuraya kopyalanamadı</string>
+ <string name="sync_foreign_files_forgotten_explanation">1.3.16 sürümünden sonra, bu aygıttan yüklenen dosyalar bir dosya birden fazla hesapla eşitlendiğinde veri kaybının önlenebilmesi için %1$s yerel klasörüne kopyalanır.\n\nBu değişiklikten dolayı, bu uygulamanın yüklenmiş tüm önceki sürümündeki dosyalar %2$s klasörüne kopyalandı. Ancak hesap eşitlenmesi sırasında bu işlemin tamamlanmasını engelleyen bir hata oluştu. Dosyayı/dosyaları olduğu gibi bırakabilir ve %3$s bağlantısını kaldırabilirsiniz veya dosyayı/dosyaları %1$s dizinine taşıyıp %4$s bağlantılarını koruyabilirsiniz.\n\nAşağıda listelenenler yerel dosyalar ve bağlı oldukları %5$s içerisindeki uzak dosyalardır.</string>
+ <string name="sync_current_folder_was_removed">%1$s klasörü artık mevcut değil.</string>
+ <string name="foreign_files_move">Tümünü taşı</string>
+ <string name="foreign_files_success">Tüm dosyalar taşındı</string>
+ <string name="foreign_files_fail">Bazı dosyalar taşınamadı</string>
+ <string name="foreign_files_local_text">Yerel: %1$s</string>
+ <string name="foreign_files_remote_text">Uzak: %1$s</string>
+ <string name="upload_query_move_foreign_files">Seçilen dosyaları %1$s dizinine kopyalamak için yeterli alan yok. Bunun yerine dosyayı taşımak ister misiniz?</string>
<string name="pincode_enter_pin_code">Lütfen uygulama PIN\'ınızı giriniz</string>
- <string name="pincode_enter_new_pin_code">Lütfen yeni uygulama PIN\'ınızı giriniz</string>
- <string name="pincode_configure_your_pin">ownCloud App PIN giriniz</string>
+ <string name="pincode_configure_your_pin">App PIN giriniz</string>
<string name="pincode_configure_your_pin_explanation">PIN uygulama yeniden başladığında tekrar sorulacak</string>
- <string name="pincode_reenter_your_pincode">Lütfen, ownCloud App PIN ni tekrar giriniz</string>
- <string name="pincode_remove_your_pincode">ownCloud App PIN\'nizi kaldırınız.</string>
- <string name="pincode_mismatch">Her iki ownCloud App PIN aynı değil.</string>
- <string name="pincode_wrong">Yanlış ownCloud App PIN</string>
- <string name="pincode_removed">ownCloud App PIN kaldırıldı</string>
- <string name="pincode_stored">ownCloud App PIN saklandı</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 Dakika</item>
- <item>30 Dakika</item>
- <item>60 Dakika</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_reenter_your_pincode">Lütfen, App PIN ni tekrar giriniz</string>
+ <string name="pincode_remove_your_pincode">App PIN\'nizi kaldırınız.</string>
+ <string name="pincode_mismatch">Her iki App PIN aynı değil.</string>
+ <string name="pincode_wrong">Yanlış App PIN</string>
+ <string name="pincode_removed">App PIN kaldırıldı</string>
+ <string name="pincode_stored">App PIN saklandı</string>
+ <string name="media_notif_ticker">%1$s müzik çalar</string>
+ <string name="media_state_playing">%1$s (oynatılıyor)</string>
+ <string name="media_state_loading">%1$s (yükleniyor)</string>
+ <string name="media_event_done">%1$s yeniden oynatım sonlandırıldı</string>
+ <string name="media_err_nothing_to_play">Herhangi bir medya öğesi bulunamadı</string>
+ <string name="media_err_no_account">Tanımlı hesap yok</string>
+ <string name="media_err_not_in_owncloud">Dosya doğru bir hesapta değil</string>
+ <string name="media_err_unsupported">Codec desteklenmiyor</string>
+ <string name="media_err_io">Medya öğesi okunamadı</string>
+ <string name="media_err_malformed">Medya öğesi doğru bir şekilde kodlanmadı</string>
+ <string name="media_err_timeout">Oynatmaya çalışırken zaman aşımına uğradı</string>
+ <string name="media_err_invalid_progressive_playback">Medya öğesi aktarılamadı</string>
+ <string name="media_err_unknown">Ortam dosyası mevcut ortam oynatıcı ile çalınamaz</string>
+ <string name="media_err_security_ex">%1$s oynatılmaya çalışılırken güvenlik hatası oluştu</string>
+ <string name="media_err_io_ex">%1$s oynatılmaya çalışılırken girdi hatası oluştu</string>
+ <string name="media_err_unexpected">%1$s oynatılmaya çalışılırken beklenmeyen bir hata oluştu</string>
+ <string name="media_rewind_description">Başa sar düğmesi</string>
+ <string name="media_play_pause_description">Oynat veya duraklat düğmesi</string>
+ <string name="media_forward_description">Hızlı ileri düğmesi</string>
<string name="auth_trying_to_login">Giriş için deneniyor</string>
<string name="auth_no_net_conn_title">Ağ bağlantısı yok</string>
- <string name="auth_no_net_conn_message">Ağ bağlantısı bulunamadı. İnternet bağlantı ayarlarınızı kontrol edin ve tekrar deneyin.</string>
- <string name="auth_connect_anyway">Her halükarda bağlan</string>
<string name="auth_nossl_plain_ok_title">Günvenli bağlantı mevcut değil.</string>
- <string name="auth_nossl_plain_ok_message">Uygulama sunucu ile güvenli bağlantı kuramadı. Buna rağmen güvensiz bağlantı mevcut. Devam edebilirsiniz veya iptal edebilirsiniz.</string>
<string name="auth_connection_established">Bağlantı kuruldu</string>
<string name="auth_testing_connection">Bağlantı kontrol ediliyor ...</string>
- <string name="auth_not_configured_title">Hatalı ownCloud ayarı.</string>
- <string name="auth_not_configured_message">Görünüşe bakılırsa ownCloud servisiniz doğru ayarlanmamış. Detaylı bilgi için sistem yöneticinize başvurunuz.</string>
+ <string name="auth_not_configured_title">Hatalı sunucu ayarı.</string>
+ <string name="auth_account_not_new">Cihazda aynı kullanıcı adı ve sunucu için bir hesap zaten mevcut</string>
+ <string name="auth_account_not_the_same">Girilen kullanıcı bu hesabın kullanıcısı ile eşleşmiyor</string>
<string name="auth_unknown_error_title">Bilinmeyen hata oluştu.</string>
- <string name="auth_unknown_error_message">Bilinmeyen hata oluştu. Lütfen cihazınızdaki hata kayıtlarını ekleyerek programı yazan kişiyle irtibata geçiniz.</string>
<string name="auth_unknown_host_title">Anabilgisayar bulunamadı</string>
- <string name="auth_unknown_host_message">Girilen anabilgisayar bulunamadı. Anabilgisayaradı ve sunucu kullanılabilirliğini kontrol edin ve yeniden deneyin.</string>
- <string name="auth_incorrect_path_title">ownCloud servisi bulunamadı.</string>
- <string name="auth_incorrect_path_message">Uygulama verilen dizin yolunda ownCloud bulamadı. Lütfen dizin yolunu kontrol edin ve tekrar deneyin.</string>
+ <string name="auth_incorrect_path_title">Sunucu örneği bulunamadı.</string>
<string name="auth_timeout_title">Sunucu çok geç cevap veriyor</string>
<string name="auth_incorrect_address_title">Hatalı biçimlendirilmiş URL</string>
<string name="auth_ssl_general_error_title">SSL başlatılmasında hata</string>
- <string name="auth_ssl_unverified_server_title">Doğrulanmamış SSL sunucu kimliğini</string>
- <string name="auth_bad_oc_version_title">Bilinmeyen ownCloud sunucu sürümü</string>
+ <string name="auth_ssl_unverified_server_title">SSL sunucu kimliği doğrulanamadı</string>
+ <string name="auth_bad_oc_version_title">Bilinmeyen sunucu sürümü</string>
<string name="auth_wrong_connection_title">Bağlantı kurulamadı</string>
<string name="auth_secure_connection">Güvenli bağlantı sağlandı.</string>
- <string name="auth_login_details">Giriş detayları</string>
- <string name="auth_unauthorized">Geçersiz kullanıcı adı/parola</string>
- <string name="crashlog_message">Uygulama umulmadık bir şekilde sonlandı. Hata raporunu göndermek ister misiniz ?</string>
- <string name="crashlog_send_report">Rapor gönder</string>
- <string name="crashlog_dont_send_report">Rapor gönderme</string>
- <string name="extensions_avail_title">Eklentiler mevcut!</string>
- <string name="extensions_avail_message">Görünen o ki ownCloud servisiniz gelişmiş eklentileri desteklemektedir. Android için mevcut olan eklentileri görmek ister misiniz ?</string>
+ <string name="auth_unauthorized">Hatalı kullanıcı adı veya parola</string>
+ <string name="auth_oauth_error">Kimlik doğrulama başarısız oldu</string>
+ <string name="auth_oauth_error_access_denied">Erişim, kimlik doğrulama sunucusu tarafından reddedildi</string>
+ <string name="auth_wtf_reenter_URL">Beklenmedik durum. Lütfen, sunucu URL\'sini yeniden girin</string>
+ <string name="auth_expired_oauth_token_toast">Kimlik doğrulamanızın süresi doldu. Lütfen tekrar kimlik doğrulayın</string>
+ <string name="auth_expired_basic_auth_toast">Lütfen mevcut parolanızı girin</string>
+ <string name="auth_expired_saml_sso_token_toast">Oturumuzun süresi doldu. Lütfen tekrar bağlanın</string>
+ <string name="auth_connecting_auth_server">Kimlik doğrulama sunucusuna bağlanılıyor...</string>
+ <string name="auth_unsupported_auth_method">Sunucu bu kimlik doğrulama yöntemini desteklemiyor</string>
+ <string name="auth_unsupported_multiaccount">%1$s çoklu hesapları desteklemiyor</string>
+ <string name="auth_can_not_auth_against_server">Bu sunucuya karşı kimlik doğrulama yapılamaz</string>
<string name="fd_keep_in_sync">Dosyayı güncel tut </string>
- <string name="common_share">Paylaş</string>
<string name="common_rename">İsim değiştir.</string>
<string name="common_remove">Kaldır</string>
<string name="confirmation_remove_alert"> %1$s ları gerçekten kaldırmak istiyor musunuz ?</string>
<string name="rename_dialog_title">Yeni bir isim girin</string>
<string name="rename_local_fail_msg">Yerel kopya adlandırılamaz; farklı bir ad deneyin</string>
<string name="rename_server_fail_msg">Yeniden adlandırılma tamamlanmadı</string>
- <string name="create_dir_fail_msg">Dizin oluşturulamadı</string>
+ <string name="sync_file_fail_msg">Dosya teslim edilemedi</string>
+ <string name="sync_file_nothing_to_do_msg">Dosya içerikleri zaten eşitlenmiş</string>
+ <string name="create_dir_fail_msg">Klasör oluşturulamadı</string>
+ <string name="filename_forbidden_characters">Yasaklı karakterler: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Bir süre bekleyin</string>
<string name="filedisplay_unexpected_bad_get_content">Beklenmeyen problem ; lütfen, dosya seçmek için diğer uygulamayı deneyin</string>
<string name="filedisplay_no_file_selected">Hiçbir dosya seçilmedi</string>
- <string name="ssl_validator_title">Uyarı</string>
+ <string name="activity_chooser_title">Bağlantıyı gönder ...</string>
+ <string name="oauth_check_onoff">oAuth2 ile oturum aç</string>
+ <string name="oauth_login_connection">oAuth2 sunucusuna bağlanılıyor…</string>
<string name="ssl_validator_header">Bu sitenin sertifikası doğrulanamadı</string>
<string name="ssl_validator_reason_cert_not_trusted">- Sunucu sertifikası güvenilmez</string>
<string name="ssl_validator_reason_cert_expired">- Sunucu sertifikasının süresi geçmiş</string>
+ <string name="ssl_validator_reason_cert_not_yet_valid">Sunucu sertifikasının geçerli olacağı tarih</string>
<string name="ssl_validator_reason_hostname_not_verified">- URL adresi sunucu isminin sertifikası ile uyuşmuyor</string>
- <string name="ssl_validator_certificate_not_available">Sunucu sertifikası elde edilemedi</string>
<string name="ssl_validator_question">Sertifikaya yine de güvenmek istiyor musunuz?</string>
<string name="ssl_validator_not_saved">Sertifika kaydedilemedi</string>
<string name="ssl_validator_btn_details_see">Ayrıntılar</string>
<string name="ssl_validator_btn_details_hide">Gizle</string>
- <string name="ssl_validator_label_O">Organizasyon:</string>
- <string name="ssl_validator_label_OU">Organizasyon birimi:</string>
+ <string name="ssl_validator_label_subject">Verilen:</string>
+ <string name="ssl_validator_label_issuer">Veren:</string>
+ <string name="ssl_validator_label_CN">Ortak ad:</string>
+ <string name="ssl_validator_label_O">Kurum:</string>
+ <string name="ssl_validator_label_OU">Kuruluş birimi:</string>
<string name="ssl_validator_label_C">Ülke:</string>
<string name="ssl_validator_label_ST">Eyalet:</string>
<string name="ssl_validator_label_L">Konum:</string>
<string name="ssl_validator_label_validity_to">Kime:</string>
<string name="ssl_validator_label_signature">İmza:</string>
<string name="ssl_validator_label_signature_algorithm">Algoritma:</string>
- <string name="text_placeholder">Bu bir yer tutucudur</string>
+ <string name="ssl_validator_null_cert">Sertifika gösterilemedi.</string>
+ <string name="ssl_validator_no_info_about_error">- Hata hakkında bilgi yok</string>
+ <string name="placeholder_sentence">Bu bir yer tutucudur</string>
+ <string name="placeholder_filename">yertutucu.txt</string>
+ <string name="placeholder_filetype">PNG Resmi</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 ÖS</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Resimleri sadece WiFi bağlantısında yükle</string>
<string name="instant_upload_path">/AnındaYükle</string>
<string name="conflict_title">Çakışmayı güncelle</string>
+ <string name="conflict_message">Uzaktaki %s dosyası, yerel dosya ile eşitlenemedi. İşleme devam etmek sunucudaki dosyanın içeriğini değiştirecektir.</string>
<string name="conflict_keep_both">İkisini de koru</string>
<string name="conflict_overwrite">Üzerine yaz</string>
<string name="conflict_dont_upload">Yükleme</string>
+ <string name="preview_image_description">Görüntü önizleme</string>
+ <string name="preview_image_error_unknown_format">Bu resim gösterilemez</string>
+ <string name="error__upload__local_file_not_copied">%1$s, %2$s yerel dizine klasörüne</string>
+ <string name="actionbar_failed_instant_upload">AnındaYükleme başarısız</string>
+ <string name="failed_upload_headline_text">Anında yüklemeler başarısız</string>
+ <string name="failed_upload_headline_hint">Başarısız olan tüm anında yüklemelerin özeti</string>
+ <string name="failed_upload_all_cb">hepsini seç</string>
+ <string name="failed_upload_headline_retryall_btn">tüm seçili olanları tekrar dene</string>
+ <string name="failed_upload_headline_delete_all_btn">yükleme kuyruğundaki tüm seçili olanları sil</string>
+ <string name="failed_upload_retry_text">Resmi yeniden yüklemeyi dene:</string>
+ <string name="failed_upload_load_more_images">Daha fazla Görsel yükle</string>
+ <string name="failed_upload_retry_do_nothing_text">anında yükleme için çevrimiçi değilsiniz, bir şey yapma</string>
+ <string name="failed_upload_failure_text">Hata Mesajı:</string>
+ <string name="failed_upload_quota_exceeded_text">Sunucu yapılandırmanızı kontrol edin. Kotanızı aşmış olabilirsiniz.</string>
+ <string name="share_link_file_no_exist">Bu dosya veya klasör paylaşılamıyor. Lütfen mevcut olup olmadığını denetleyin</string>
+ <string name="share_link_file_error">Bu dosya veya klasörü paylaşmaya çalışılırken bir hata oluştu</string>
+ <string name="unshare_link_file_no_exist">Bu dosya veya klasörün paylaşımı kaldırılamadı. Mevcut değil.</string>
+ <string name="unshare_link_file_error">Bu dosya veya klasör paylaşımı kaldırılmaya çalışılırken bir hata oluştu</string>
+ <string name="activity_chooser_send_file_title">Gönder</string>
+ <string name="copy_link">Bağlantıyı kopyala</string>
+ <string name="clipboard_text_copied">Panoya kopyalandı</string>
</resources>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="actionbar_upload">يۈكلە</string>
+ <string name="actionbar_upload_files">ھۆججەتلەر</string>
+ <string name="actionbar_mkdir">يېڭى قىسقۇچ</string>
+ <string name="actionbar_settings">تەڭشەكلەر</string>
+ <string name="actionbar_send_file">يوللا</string>
+ <string name="prefs_category_general">ئادەتتىكى</string>
+ <string name="prefs_category_more">تېخىمۇ كۆپ</string>
+ <string name="prefs_accounts">ھېساباتلار</string>
+ <string name="prefs_help">ياردەم</string>
+ <string name="prefs_feedback">قايتۇرما ئىنكاس</string>
+ <string name="auth_username">ئىشلەتكۈچى ئاتى</string>
+ <string name="auth_password">ئىم</string>
+ <string name="sync_string_files">ھۆججەتلەر</string>
+ <string name="setup_btn_connect">باغلان</string>
+ <string name="uploader_btn_upload_text">يۈكلە</string>
+ <string name="uploader_wrn_no_account_title">ھېسابات تېپىلمىدى</string>
+ <string name="uploader_wrn_no_account_setup_btn_text">تەڭشەك</string>
+ <string name="uploader_wrn_no_account_quit_btn_text">چېكىن</string>
+ <string name="uploader_info_uploading">يۈكلەۋاتىدۇ</string>
+ <string name="filedetails_size">چوڭلۇقى:</string>
+ <string name="filedetails_type">تىپى:</string>
+ <string name="filedetails_created">قۇرۇلغان ۋاقتى:</string>
+ <string name="filedetails_modified">ئۆزگەرتكەن ۋاقىت:</string>
+ <string name="filedetails_download">چۈشۈر</string>
+ <string name="common_yes">ھەئە</string>
+ <string name="common_no">ياق</string>
+ <string name="common_ok">جەزملە</string>
+ <string name="common_cancel_upload">يۈكلەشتىن ۋاز كەچ</string>
+ <string name="common_cancel">ۋاز كەچ</string>
+ <string name="common_save_exit">ساقلاپ چېكىن</string>
+ <string name="common_error">خاتالىق</string>
+ <string name="common_error_unknown">يوچۇن خاتالىق</string>
+ <string name="change_password">ئىم ئۆزگەرت</string>
+ <string name="uploader_info_dirname">قىسقۇچ ئاتى</string>
+ <string name="common_choose_account">ھېسابات تاللاڭ</string>
+ <string name="common_rename">ئات ئۆزگەرت</string>
+ <string name="common_remove">چىقىرىۋەت</string>
+ <string name="activity_chooser_send_file_title">يوللا</string>
+</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Пароль:</string>
- <string name="main_login">Ім\'я користувача</string>
- <string name="main_button_login">Логін</string>
- <string name="main_welcome">Вітаємо у Вашому ownCloud</string>
- <string name="main_files">Файли</string>
- <string name="main_music">Музика</string>
- <string name="main_contacts">Контакти</string>
- <string name="main_calendar">Календар</string>
- <string name="main_bookmarks">Закладки</string>
- <string name="main_settings">Налаштування</string>
- <string name="main_tit_accsetup">Налаштування облікового запису</string>
- <string name="main_wrn_accsetup">На Вашому пристрої відсутні облікові запси ownCloud. Для того, щоб користуватися цим ПО, Вам потрібно створити обліковий запис.</string>
- <string name="about_message">%1$s Android клієнт\n\nверсія: %2$s</string>
- <string name="actionbar_sync">Оновити</string>
<string name="actionbar_upload">Відвантажити</string>
<string name="actionbar_upload_from_apps">Вміст із інших програм</string>
<string name="actionbar_upload_files">Файли</string>
- <string name="actionbar_mkdir">Створити теку</string>
- <string name="actionbar_search">Пошук</string>
+ <string name="actionbar_mkdir">Нова тека</string>
<string name="actionbar_settings">Налаштування</string>
+ <string name="actionbar_see_details">Деталі</string>
+ <string name="actionbar_send_file">Надіслати</string>
<string name="prefs_category_general">Основне</string>
- <string name="prefs_category_trackmydevice">Стеження за пристроєм</string>
- <string name="prefs_add_session">Додати нову сесію</string>
- <string name="prefs_create_img_thumbnails">Створити відбитки зображень</string>
- <string name="prefs_select_oc_account">Обрати обліковий запис</string>
- <string name="prefs_summary_select_oc_account">Оберіть, який із облікових записів повинна використовувати програма.</string>
- <string name="prefs_trackmydevice">Стеження за пристроєм</string>
- <string name="prefs_trackmydevice_summary_off">Дозволити ownCloud стежити за місцезнаходженням Вашого пристрою</string>
- <string name="prefs_trackmydevice_summary_on">Ваш ownCloud стежить за цим пристроєм</string>
- <string name="prefs_trackmydevice_interval">Інтервал оновлення</string>
- <string name="prefs_trackmydevice_interval_summary">Оновлювати кожні %1$s хвилин</string>
+ <string name="prefs_category_more">Більше</string>
<string name="prefs_accounts">Облікові записи</string>
<string name="prefs_manage_accounts">Управління обліковими записами</string>
- <string name="prefs_pincode">ownCloud програмний PIN</string>
- <string name="prefs_pincode_summary">Захист Вашог ownCloud клієнта</string>
+ <string name="prefs_pincode">App програмний PIN</string>
+ <string name="prefs_pincode_summary">Захист Вашог App клієнта</string>
<string name="prefs_instant_upload">Включити негайне завантаження</string>
<string name="prefs_instant_upload_summary">Негайно завантажувати фото, зроблені камерою</string>
- <string name="auth_host_url">ownCloud URL</string>
+ <string name="prefs_help">Допомога</string>
+ <string name="prefs_feedback">Зворотній зв\'язок</string>
+ <string name="prefs_imprint">Відбиток</string>
<string name="auth_username">Ім\'я користувача</string>
<string name="auth_password">Пароль</string>
- <string name="auth_register">Я новачок в ownCloud</string>
- <string name="new_session_uri_error">Надано невірний URL</string>
- <string name="new_session_session_name_error">Невірне ім\'я сесії</string>
<string name="sync_string_files">Файли</string>
- <string name="uploader_no_file_selected">Не обрано файл для завантаження</string>
- <string name="setup_hint_username">Ім\'я користувача</string>
- <string name="setup_hint_password">Пароль</string>
- <string name="setup_hint_address">Веб адреса</string>
- <string name="setup_hint_show_password">Показувати пароль?</string>
- <string name="setup_title">Підключитись до Вашого ownCloud</string>
<string name="setup_btn_connect">З\'єднати</string>
<string name="uploader_btn_upload_text">Відвантажити</string>
<string name="uploader_wrn_no_account_title">Не знайдено облікового запису</string>
- <string name="uploader_wrn_no_account_text">На Вашому пристрої відсутні облікові записи ownCloud. Будь ласка, спочатку створіть запис.</string>
+ <string name="uploader_wrn_no_account_text">На Вашому пристрої відсутні облікові записи %1$s. Будь ласка, спочатку створіть запис.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Налаштування</string>
<string name="uploader_wrn_no_account_quit_btn_text">Вийти</string>
<string name="uploader_wrn_no_content_title">Відсутні дані для завантаження</string>
<string name="uploader_wrn_no_content_text">Не отримано даних. Нічого завантажувати.</string>
- <string name="uploader_error_forbidden_content">ownCloud не може отримати доступ до спільного контенту</string>
+ <string name="uploader_error_forbidden_content">%1$s не може отримати доступ до спільного контенту</string>
<string name="uploader_info_uploading">Завантаження</string>
- <string name="uploader_btn_create_dir_text">Створити теку для завантаження</string>
<string name="file_list_empty">В цьому каталозі відсутні файли.\nНові файли можна додати через опцію меню \"Завантаження\".</string>
<string name="filedetails_select_file">Натисніть на файлі для відображення додаткової інформації</string>
<string name="filedetails_size">Розмір:</string>
<string name="filedetails_created">Створено:</string>
<string name="filedetails_modified">Змінено:</string>
<string name="filedetails_download">Завантажити</string>
- <string name="filedetails_sync_file">Оновити</string>
- <string name="filedetails_redownload">Оновити</string>
- <string name="filedetails_open">Відкрити</string>
<string name="filedetails_renamed_in_upload_msg">Файл був переіменований в %1$s протягом вивантаження</string>
+ <string name="action_share_file">Опублікувати посилання</string>
<string name="common_yes">Так</string>
<string name="common_no">Ні</string>
<string name="common_ok">OK</string>
<string name="common_cancel_upload">Перервати завантаження</string>
<string name="common_cancel">Відмінити</string>
<string name="common_save_exit">Зберегти & Вихід</string>
- <string name="common_exit">Вийти з ownCloud</string>
<string name="common_error">Помилка</string>
+ <string name="common_error_unknown">Невідома помилка</string>
<string name="about_title">Про</string>
+ <string name="change_password">Змінити пароль</string>
<string name="delete_account">Видалити запис</string>
<string name="create_account">Створити запис</string>
<string name="upload_chooser_title">Завантажити з …</string>
<string name="uploader_upload_in_progress_content">%1$d%% Завантаження %2$s</string>
<string name="uploader_upload_succeeded_ticker">Успішно завантажено</string>
<string name="uploader_upload_succeeded_content_single">%1$s було успішно завантажено</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d файлів було успішно завантажено</string>
<string name="uploader_upload_failed_ticker">Помилка завантаження</string>
<string name="uploader_upload_failed_content_single">Завантаження %1$s не може завершитись</string>
- <string name="uploader_upload_failed_content_multiple">Помилка завантаження: %1$d/%2$d файли завантажено</string>
<string name="downloader_download_in_progress_ticker">Зкачування …</string>
<string name="downloader_download_in_progress_content">%1$d%% Зкачування %2$s</string>
<string name="downloader_download_succeeded_ticker">Успішно зкачано</string>
<string name="downloader_download_failed_ticker">Завантаження не вдалося</string>
<string name="downloader_download_failed_content">Завантаження %1$s не вдається завершити</string>
<string name="common_choose_account">Оберіть обліковий запис</string>
- <string name="sync_string_contacts">Контакти</string>
<string name="sync_fail_ticker">Помилка синхронізації</string>
<string name="sync_fail_content">Синхронізація %1$s не вдалась</string>
<string name="sync_conflicts_in_favourites_ticker">Конфліктів знайдено</string>
<string name="sync_conflicts_in_favourites_content">%1$d файли, які мають бути синхронізованими не можуть синхронізуватися</string>
<string name="sync_fail_in_favourites_ticker">Синхронізувати файли не вдалося</string>
<string name="sync_fail_in_favourites_content">Зміст %1$d файлів не може бути синхронізований (%2$d конфліктів)</string>
- <string name="use_ssl">Використовувати безпечне з\'єднання</string>
- <string name="location_no_provider">ownCloud не може стежити за Вашим пристроєм. Будь ласка, перевірте свої налаштування місцезнаходження</string>
+ <string name="sync_foreign_files_forgotten_ticker">Деякі локальні файли були забуті</string>
+ <string name="foreign_files_move">Перемістити все</string>
+ <string name="foreign_files_success">Всі файли були переміщені</string>
+ <string name="foreign_files_fail">Деякі файли не можуть бути переміщені</string>
+ <string name="foreign_files_local_text">Локально: %1$s</string>
+ <string name="foreign_files_remote_text">Віддалено: %1$s</string>
+ <string name="upload_query_move_foreign_files">Недостатньо місця для копіювання обраних файлів у теку %1$s. Чи бажаєте ви перемістити їх замість копіювання?</string>
<string name="pincode_enter_pin_code">Будь ласка, введіть свій програмний PIN</string>
- <string name="pincode_enter_new_pin_code">Будь ласка, введіть новий програмний PIN</string>
<string name="pincode_configure_your_pin">Введіть програмний PIN</string>
<string name="pincode_configure_your_pin_explanation">PIN необхідно буде вводити щоразу при запуску цієї програми</string>
- <string name="pincode_reenter_your_pincode">Повторно введіть ownCloud програмний PIN, будь ласка</string>
- <string name="pincode_remove_your_pincode">Видалити свій ownCloud програмний PIN</string>
- <string name="pincode_mismatch">Обидва ownCloud програмних PIN не однакові</string>
- <string name="pincode_wrong">Не вірний ownCloud програмний PIN</string>
- <string name="pincode_removed">ownCloud програмний PIN видалено</string>
- <string name="pincode_stored">ownCloud програмний PIN збережено</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 хвилин</item>
- <item>30 хвилин</item>
- <item>60 хвилин</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_reenter_your_pincode">Повторно введіть App програмний PIN, будь ласка</string>
+ <string name="pincode_remove_your_pincode">Видалити свій App програмний PIN</string>
+ <string name="pincode_mismatch">Обидва App програмних PIN не однакові</string>
+ <string name="pincode_wrong">Не вірний App програмний PIN</string>
+ <string name="pincode_removed">App програмний PIN видалено</string>
+ <string name="pincode_stored">App програмний PIN збережено</string>
<string name="auth_trying_to_login">Спроба входу…</string>
<string name="auth_no_net_conn_title">Відсутнє підключення до мережі</string>
- <string name="auth_no_net_conn_message">Не знайдено підключення до мережі, перевірте своє підключення до Інтернету та спробуйте ще.</string>
- <string name="auth_connect_anyway">Все одно з\'єднатися</string>
<string name="auth_nossl_plain_ok_title">Безпечне з\'єднання не доступне.</string>
- <string name="auth_nossl_plain_ok_message">Програма не може встановити безпечне з\'єднання з сервером. Проте, не захищене з\'єднання можливе. Ви можете продовжити або відмінити.</string>
<string name="auth_connection_established">З\'єднання встановлено</string>
<string name="auth_testing_connection">Перевірка з\'єднання…</string>
- <string name="auth_not_configured_title">Не вірні налаштування ownCloud </string>
- <string name="auth_not_configured_message">Здається, Ваш ownCloud примірник не правильно налаштовано. Зверніться до адміністратора для більш докладної інформації.</string>
+ <string name="auth_not_configured_title">Не вірні налаштування сервер </string>
<string name="auth_unknown_error_title">Виникла невідома помилка!</string>
- <string name="auth_unknown_error_message">Виникла невідома помилка. Будь ласка, зв\'яжіться з авторами та надайте лог-файли з Вашого пристрою.</string>
<string name="auth_unknown_host_title">Не вдалося знайти хост</string>
- <string name="auth_unknown_host_message">Не вдалося знайти визначений хост. Будь ласка, перевірте ім\'я хосту і доступність серверу та спробуйте ще.</string>
- <string name="auth_incorrect_path_title">Не знайдено примірник ownCloud</string>
- <string name="auth_incorrect_path_message">Програмі не вдалося знайти примірник ownClound за вказаною адресою. Будь ласка, перевірте адресу та спробуйте ще.</string>
+ <string name="auth_incorrect_path_title">Не знайдено примірник сервер</string>
<string name="auth_timeout_title">Сервер занадто довго не відповідає</string>
<string name="auth_incorrect_address_title">Пошкоджений URL</string>
<string name="auth_ssl_general_error_title">Помилка SSL ініціалізації</string>
- <string name="auth_ssl_unverified_server_title">Неперевірена SSL ідентифікація серверу</string>
- <string name="auth_bad_oc_version_title">Не вдалося визначити версію ownCloud серверу</string>
+ <string name="auth_bad_oc_version_title">Не вдалося визначити версію сервер серверу</string>
<string name="auth_wrong_connection_title">Не вдалося встановити з\'єднання</string>
<string name="auth_secure_connection">Встановлено захищене з\'єднання</string>
- <string name="auth_login_details">Дані для входу</string>
- <string name="auth_unauthorized">Невірний Логін / Пароль</string>
- <string name="auth_not_found">Вказано невірний шлях</string>
- <string name="auth_internal">Внутрішня помилка серверу, код %1$d</string>
- <string name="crashlog_message">Програма несподівано закрилася. Чи бажаєте Ви надіслати доповідь про аварію?</string>
- <string name="crashlog_send_report">Надіслати доповідь</string>
- <string name="crashlog_dont_send_report">Не відсилати доповідь</string>
- <string name="extensions_avail_title">Розширення доступні!</string>
- <string name="extensions_avail_message">Здається, що Ваш примірник ownCloud підтримує додаткові розширення. Чи бажаєте Ви переглянути розширення, доступні для Андроід?</string>
<string name="fd_keep_in_sync">Оновлювати файл</string>
- <string name="common_share">Поділитися</string>
<string name="common_rename">Перейменувати</string>
<string name="common_remove">Видалити</string>
<string name="confirmation_remove_alert">Ви дійсно бажаєте видалити %1$s ?</string>
<string name="rename_server_fail_msg">Перейменування не вдалося</string>
<string name="sync_file_fail_msg">Неможливо перевірити віддалений файл</string>
<string name="sync_file_nothing_to_do_msg">Зміст файлу вже синхронізовано</string>
- <string name="create_dir_fail_msg">Не вдалося створити теку</string>
<string name="wait_a_moment">Зачекайте хвилинку</string>
<string name="filedisplay_unexpected_bad_get_content">Несподівані проблеми ; будь ласка, спробуйте використати іншу програму для вибору файлу</string>
<string name="filedisplay_no_file_selected">Не обрано файл</string>
- <string name="ssl_validator_title">Попередження</string>
<string name="ssl_validator_header">Не вдалося перевірити ідентифікацію сайта</string>
<string name="ssl_validator_reason_cert_not_trusted">- Не довірений сертифікат серверу</string>
<string name="ssl_validator_reason_cert_expired">- Сертифікат серверу втратив чинність</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- Сертифікат серверу занадто новий</string>
<string name="ssl_validator_reason_hostname_not_verified">- URL не відповідає імені хоста у сертифікаті</string>
- <string name="ssl_validator_certificate_not_available">Не вдалося отримати сертифікат серверу</string>
<string name="ssl_validator_question">Ви все одно бажаєте довіряти цьому сертифікату?</string>
<string name="ssl_validator_not_saved">Не вдалося зберегти сертифікат</string>
<string name="ssl_validator_btn_details_see">Деталі</string>
<string name="ssl_validator_label_validity_to">До:</string>
<string name="ssl_validator_label_signature">Підпис:</string>
<string name="ssl_validator_label_signature_algorithm">Алгоритм:</string>
- <string name="text_placeholder">Це заповнювач</string>
+ <string name="placeholder_sentence">Це заповнювач</string>
<string name="instant_upload_on_wifi">Завантажувати зображення тільки через WiFi</string>
<string name="instant_upload_path">/InstantUpload</string>
<string name="conflict_title">Конфлікт оновлення</string>
<string name="conflict_keep_both">Залишити обидва</string>
<string name="conflict_overwrite">Замінити</string>
<string name="conflict_dont_upload">Не завантажувати</string>
+ <string name="activity_chooser_send_file_title">Надіслати</string>
+ <string name="clipboard_text_copied">Скопійовано в буфер обміну</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="main_settings">سیٹینگز</string>
<string name="actionbar_settings">سیٹینگز</string>
+ <string name="prefs_help">مدد</string>
<string name="auth_username">یوزر نیم</string>
<string name="auth_password">پاسورڈ</string>
- <string name="setup_hint_username">یوزر نیم</string>
- <string name="setup_hint_password">پاسورڈ</string>
+ <string name="common_yes">ہاں</string>
+ <string name="common_no">نہیں</string>
+ <string name="common_cancel">منسوخ کریں</string>
+ <string name="common_error">ایرر</string>
</resources>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources/>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources/>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <style name="Theme.ownCloud.ButtonStyle" parent="@android:style/Widget.Holo.Light.Button">
+ <item name="android:background">@android:drawable/btn_default</item>
+ <item name="android:textColor">@color/button_text_color</item>
+ </style>
+
+ <!-- Notifications -->
+ <!-- Notifications -->
+ <style name="Theme.ownCloud.NotificationText.Title"
+ parent="@android:style/TextAppearance.StatusBar.EventContent.Title" >
+ <item name="android:textSize">18sp</item>
+ <item name="android:textStyle">bold</item>
+ </style>
+
+ <style name="Theme.ownCloud.NotificationText.Content"
+ parent="@android:style/TextAppearance.StatusBar.EventContent" >
+ <item name="android:textSize">16sp</item>
+ </style>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- Notifications -->
+ <style name="Theme.ownCloud.NotificationText.Title"
+ parent="@android:style/TextAppearance.StatusBar.EventContent.Title"
+ />
+ <style name="Theme.ownCloud.NotificationText.Content"
+ parent="@android:style/TextAppearance.StatusBar.EventContent"
+ />
+
+</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Mật khẩu :</string>
- <string name="main_login">Tên người dùng :</string>
- <string name="main_button_login">Đăng nhập</string>
- <string name="main_welcome">Chào mừng bạn đến với OwnCloud</string>
- <string name="main_files">Tập tin</string>
- <string name="main_music">Âm nhạc</string>
- <string name="main_contacts">Danh sách liên lạc</string>
- <string name="main_calendar">Lịch</string>
- <string name="main_bookmarks">Bookmarks</string>
- <string name="main_settings">Cài đặt</string>
- <string name="main_tit_accsetup">Thiết lập tài khoản</string>
- <string name="main_wrn_accsetup">Trên thiết bị của bạn không có tài khoản ownCloud. Để sử dụng ứng dụng này bạn cần phải tạo một tài khoản.</string>
- <string name="about_message">ownCloud Android máy trạm⏎ ⏎ phiên bản: %1$s</string>
- <string name="actionbar_sync">Đồng bộ tài khoản</string>
+ <string name="about_android">%1$s Ứng dụng trên Android</string>
+ <string name="about_version">phiên bản %1$s</string>
+ <string name="actionbar_sync">Cập nhật lại tài khoản</string>
<string name="actionbar_upload">Tải lên</string>
<string name="actionbar_upload_from_apps">Nội dung từ các ứng dụng khác</string>
<string name="actionbar_upload_files">Các tập tin</string>
+ <string name="actionbar_open_with">Mở với</string>
<string name="actionbar_mkdir">Tạo thư mục</string>
- <string name="actionbar_search">Tìm kiếm</string>
<string name="actionbar_settings">Cài đặt</string>
+ <string name="actionbar_see_details">Chi tiết</string>
+ <string name="actionbar_send_file">Gởi</string>
<string name="prefs_category_general">Tổng hợp</string>
- <string name="prefs_category_trackmydevice">Thiết bị theo dõi</string>
- <string name="prefs_add_session">Thêm phiên làm việc mới</string>
- <string name="prefs_create_img_thumbnails">Tạo hình ảnh thu nhỏ</string>
- <string name="prefs_select_oc_account">Chọn một tài khoản</string>
- <string name="prefs_summary_select_oc_account">Chọn, các tài khoản của bạn và các ứng dụng nên sử dụng.</string>
- <string name="prefs_trackmydevice">Thiết bị theo dõi</string>
- <string name="prefs_trackmydevice_summary_off">Bật tính năng ownCloud để theo dõi vị trí thiết bị của bạn</string>
- <string name="prefs_trackmydevice_summary_on">ownCloud tiếp tục theo dõi thiết bị này</string>
- <string name="prefs_trackmydevice_interval">Cập nhật khoảng thời gian</string>
- <string name="prefs_trackmydevice_interval_summary">Đã cập nhập được %1$s</string>
+ <string name="prefs_category_more">hơn</string>
<string name="prefs_accounts">Tài khoản</string>
<string name="prefs_manage_accounts">Quản lý tài khoản</string>
- <string name="prefs_pincode">Mã PIN ứng dụng ownCloud</string>
- <string name="prefs_pincode_summary">Bảo vệ ownCloud client của bạn</string>
+ <string name="prefs_pincode">Mã PIN ứng dụng App</string>
+ <string name="prefs_pincode_summary">Bảo vệ App client của bạn</string>
<string name="prefs_instant_upload">Kích hoạt tính năng tải lên ngay lập tức</string>
<string name="prefs_instant_upload_summary">Ngay lập tức tải lên các hình ảnh được chụp bởi camera</string>
- <string name="auth_host_url">ownCloud URL</string>
+ <string name="prefs_log_title">Bật chế độ nhật trình</string>
+ <string name="prefs_log_summary">Được sử dụng cho các vấn đề liên quan đến nhật trình</string>
+ <string name="prefs_log_title_history">Nhật trình dữ kiện</string>
+ <string name="prefs_log_summary_history">Hiển thị các nhật trình đã được ghi nhận lại</string>
+ <string name="prefs_log_delete_history_button">Xóa lịch sử</string>
+ <string name="prefs_help">Giúp đỡ</string>
+ <string name="prefs_recommend">Giới thiệu đến bạn bè</string>
+ <string name="prefs_feedback">Phản hồi</string>
+ <string name="prefs_imprint">Đánh dấu</string>
+ <string name="recommend_subject">Thử %1$s trên smartphone của bạn!</string>
+ <string name="auth_check_server">Kiểm tra máy chủ</string>
+ <string name="auth_host_url">Địa chỉ máy chủ https://…</string>
<string name="auth_username">Tên người dùng</string>
<string name="auth_password">Mật khẩu</string>
- <string name="auth_register">Tôi mới đến ownCloud</string>
- <string name="new_session_uri_error">Bạn nhập sai URL</string>
- <string name="new_session_session_name_error">Sai tên phiên làm việc</string>
+ <string name="auth_register">Lần đầu mới đến %1$s?</string>
<string name="sync_string_files">Tập tin</string>
- <string name="uploader_no_file_selected">Không có tập tin nào được chọn để tải lên</string>
- <string name="setup_hint_username">Tài khoản</string>
- <string name="setup_hint_password">Mật khẩu</string>
- <string name="setup_hint_address">Địa chỉ Web</string>
- <string name="setup_hint_show_password">Hiện mật khẩu ?</string>
- <string name="setup_title">Kết nối tới ownCloud của bạn </string>
<string name="setup_btn_connect">Kết nối</string>
<string name="uploader_btn_upload_text">Tải lên</string>
<string name="uploader_wrn_no_account_title">Không tìm thấy tài khoản</string>
- <string name="uploader_wrn_no_account_text">Trên thiết bị của bạn không có tài khoản ownCloud .Bước đầu tiên hãy thiết lập một tài khoản.</string>
+ <string name="uploader_wrn_no_account_text">Trên thiết bị của bạn không có tài khoản %1$s. Bước đầu tiên hãy thiết lập một tài khoản.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Cài đặt</string>
<string name="uploader_wrn_no_account_quit_btn_text">Thoát</string>
<string name="uploader_wrn_no_content_title">Không có nội dung tải lên</string>
<string name="uploader_wrn_no_content_text">Không có nội dung được nhận. Không có gì để tải lên.</string>
- <string name="uploader_error_forbidden_content">ownCloud không cho phép truy cập vào các nội dung chia sẻ</string>
+ <string name="uploader_error_forbidden_content">%1$s không cho phép truy cập vào các nội dung chia sẻ</string>
<string name="uploader_info_uploading">Đang tải lên</string>
- <string name="uploader_btn_create_dir_text">Tạo thư mục để tải lên</string>
- <string name="file_list_empty">Không có các tập tin trong thư mục này ⏎ tập tin mới có thể được thêm vào với tùy chọn trình đơn \"Tải lên\".</string>
+ <string name="file_list_empty">Không có tập tin trong thư mục này. tập tin mới có thể được thêm vào với tùy chọn \"Tải lên\".</string>
<string name="filedetails_select_file">Tap vào một tập tin để hiển thị thêm thông tin</string>
<string name="filedetails_size">Kích thước:</string>
<string name="filedetails_type">Loại:</string>
<string name="filedetails_created">Đã tạo:</string>
<string name="filedetails_modified">Đã chỉnh sửa:</string>
<string name="filedetails_download">Tải về</string>
- <string name="filedetails_sync_file">Làm mới</string>
- <string name="filedetails_redownload">Làm mới</string>
- <string name="filedetails_open">Mở</string>
+ <string name="filedetails_sync_file">Cập nhật lại tập tin</string>
<string name="filedetails_renamed_in_upload_msg">Tập tin đã bị đổi tên thành %1$s trong quá trình tải lên</string>
+ <string name="action_share_file">Chia sẻ liên kết</string>
+ <string name="action_unshare_file">Liên kết không chia sẻ</string>
<string name="common_yes">Yes</string>
<string name="common_no">Không</string>
<string name="common_ok">Chấp nhận</string>
<string name="common_cancel_upload">Hủy upload</string>
<string name="common_cancel">Hủy</string>
<string name="common_save_exit">Lưu & Thoát</string>
- <string name="common_exit">Rời khỏi ownCloud</string>
<string name="common_error">Lỗi</string>
+ <string name="common_loading">Đang tải...</string>
+ <string name="common_error_unknown">Lỗi chưa biết</string>
<string name="about_title">Giới thiệu</string>
+ <string name="change_password">Đổi mật khẩu</string>
<string name="delete_account">Xóa tài khoản</string>
<string name="create_account">Tạo tài khoản</string>
<string name="upload_chooser_title">Tải lên từ ...</string>
<string name="uploader_upload_in_progress_content">%1$d%% Đang tải lên %2$s</string>
<string name="uploader_upload_succeeded_ticker">Tải lên thành công</string>
<string name="uploader_upload_succeeded_content_single">%1$s là tải lên thành công</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d tập tin là tải lên thành công</string>
<string name="uploader_upload_failed_ticker">Tải lên thất bại</string>
<string name="uploader_upload_failed_content_single">Tải lên %1$s không thể hoàn thành</string>
- <string name="uploader_upload_failed_content_multiple">Tải lên thất bại: %1$d/%2$d tập tin đã được tải lên</string>
<string name="downloader_download_in_progress_ticker">Đang tải về ...</string>
<string name="downloader_download_in_progress_content">%1$d%% Đang tải về %2$s</string>
<string name="downloader_download_succeeded_ticker">Tải về thành công</string>
<string name="downloader_download_succeeded_content">%1$s là hoàn thành việc tải về</string>
<string name="downloader_download_failed_ticker">Tải về thất bại</string>
<string name="downloader_download_failed_content">Tải về %1$s không thể được hoàn thành</string>
+ <string name="downloader_not_downloaded_yet">Vẫn chưa tải về</string>
<string name="common_choose_account">Chọn tài khoản</string>
- <string name="sync_string_contacts">Danh sách liên lạc</string>
<string name="sync_fail_ticker">Đồng bộ thất bại</string>
<string name="sync_fail_content">Đồng bộ %1$s không thể hoàn thành</string>
+ <string name="sync_fail_content_unauthorized">Mật khẩu không hợp lệ đối với %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Tìm thấy xung đột</string>
<string name="sync_conflicts_in_favourites_content">%1$d file trong hàng đợi đồng bộ không thể được đồng bộ</string>
<string name="sync_fail_in_favourites_ticker">Các file trong hàng đợi đồng bộ không thành công</string>
<string name="sync_fail_in_favourites_content">Nội dung tập tin %1$d không thể đồng bộ (%2$d xung đột)</string>
- <string name="use_ssl">Sử dụng kết nối an toàn</string>
- <string name="location_no_provider">ownCloud không thể theo dõi điện thoại của bạn. Vui lòng kiểm tra cài đặt vị trí của bạn</string>
+ <string name="sync_foreign_files_forgotten_ticker">Một số tập tin cục bộ bị quên</string>
+ <string name="sync_current_folder_was_removed">Thư mục %1$s không còn tồn tại</string>
+ <string name="foreign_files_move">Di chuyển tất cả</string>
+ <string name="foreign_files_success">Tất cả tập tin đã được chuyển đi</string>
+ <string name="foreign_files_fail">Một vài tập tin không thể chuyển đi</string>
+ <string name="foreign_files_local_text">Cục bộ: %1$s</string>
+ <string name="foreign_files_remote_text">Từ xa: %1$s</string>
+ <string name="upload_query_move_foreign_files">Không đủ chỗ trống để chép các tập tin đã chọn vào thư mục %1$s. Bạn có muốn di chuyển chúng thay vì sao chép?</string>
<string name="pincode_enter_pin_code">Vui lòng, nhập mã PIN ứng dụng của bạn</string>
- <string name="pincode_enter_new_pin_code">Vui lòng, nhập mã PIN mới của ứng dụng</string>
- <string name="pincode_configure_your_pin">Nhập mã PIN ứng dụng ownCloud</string>
+ <string name="pincode_configure_your_pin">Nhập mã PIN ứng dụng App</string>
<string name="pincode_configure_your_pin_explanation">Mã PIN sẽ được yêu cầu mỗi khi ứng dụng được bật </string>
- <string name="pincode_reenter_your_pincode">Vui lòng nhập lại mã PIN ứng dụng ownCloud</string>
- <string name="pincode_remove_your_pincode">Hủy mã PIN ứng dụng ownCloud của bạn</string>
- <string name="pincode_mismatch">Mã PIN ứng dụng ownCloud không được trùng</string>
- <string name="pincode_wrong">Mã PIN ứng dụng ownCloud không đúng</string>
- <string name="pincode_removed">Mã PIN ứng dụng ownCloud đã bị xóa</string>
- <string name="pincode_stored">Mã PIN ứng dụng ownCloud đã được lưu trữ</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 Phút</item>
- <item>30 Phút</item>
- <item>60 Phút</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_reenter_your_pincode">Vui lòng nhập lại mã PIN ứng dụng App</string>
+ <string name="pincode_remove_your_pincode">Hủy mã PIN ứng dụng App của bạn</string>
+ <string name="pincode_mismatch">Mã PIN ứng dụng App không được trùng</string>
+ <string name="pincode_wrong">Mã PIN ứng dụng App không đúng</string>
+ <string name="pincode_removed">Mã PIN ứng dụng App đã bị xóa</string>
+ <string name="pincode_stored">Mã PIN ứng dụng App đã được lưu trữ</string>
+ <string name="media_notif_ticker">%1$s trình phát nhạc</string>
+ <string name="media_state_playing">%1$s (đang phát)</string>
+ <string name="media_state_loading">%1$s (đang tải)</string>
+ <string name="media_event_done">%1$s đã hoàn tất chế độ phát lại</string>
+ <string name="media_err_nothing_to_play">Không tìm thấy tập tin media nào</string>
+ <string name="media_err_no_account">Vẫn chưa cung cấp tài khoản nào</string>
+ <string name="media_err_not_in_owncloud">Tập tin không nằm trong tài khoản hợp lệ</string>
+ <string name="media_err_unsupported">Codec của media không được hỗ trợ</string>
+ <string name="media_err_io">Không thể đọc dữ liệu từ tập tin media</string>
+ <string name="media_err_malformed">Tập tin media không được mã hóa đúng quy định</string>
+ <string name="media_err_timeout">Tạm ngừng trong khi đang cố gắng chạy</string>
+ <string name="media_err_invalid_progressive_playback">Không thể phân luồng dữ liệu tập tin media</string>
+ <string name="media_err_unknown">Tập tin media không thể được phát với trình phát media của stock</string>
+ <string name="media_err_security_ex">Lỗi bảo mật khi cố phát %1$s</string>
+ <string name="media_err_io_ex">Lỗi về dữ liệu đầu vào khi cố phát %1$s</string>
+ <string name="media_err_unexpected">Xảy ra lỗi khi phát %1$s</string>
+ <string name="media_rewind_description">Nút chuyển lại</string>
+ <string name="media_play_pause_description">Nút phát hoặc tạm dừng</string>
+ <string name="media_forward_description">Nút đẩy nhanh tốc độ phát</string>
<string name="auth_trying_to_login">Đang cố gắng để đăng nhập…</string>
<string name="auth_no_net_conn_title">Không có kết nối mạng</string>
- <string name="auth_no_net_conn_message">Không tìm thấy kết nối mạng, kiểm tra lại kết nối mạng và thử lại.</string>
- <string name="auth_connect_anyway">Kết nối nào</string>
<string name="auth_nossl_plain_ok_title">Bảo mật kết nối không có giá trị.</string>
- <string name="auth_nossl_plain_ok_message">Ứng dụng không thể thiết lập một kết nối an toàn đến máy chủ. Một kết nối không an toàn đang có giá trị. Bạn có thể tiếp tục hoặc hủy bỏ.</string>
<string name="auth_connection_established">Kết nối đã thiết lập</string>
<string name="auth_testing_connection">Đang kiểm tra kết nối...</string>
- <string name="auth_not_configured_title">Thay đổi cấu hình ownCloud </string>
- <string name="auth_not_configured_message">Có vẻ như phiên bản ownCloud của bạn cấu hình không đúng. Liên hệ với quản trị viên để biết thêm chi tiết.</string>
+ <string name="auth_not_configured_title">Thay đổi cấu hình máy chủ </string>
+ <string name="auth_account_not_new">Một tài khoản với cùng tên người dùng và máy chủ đã tồn tại trong thiết bị</string>
+ <string name="auth_account_not_the_same">Tên người dùng đã nhập không đúng với tên người dùng của tài khoản này</string>
<string name="auth_unknown_error_title">Không xác định được lỗi!</string>
- <string name="auth_unknown_error_message">Lỗi không xác định. Vui lòng liên hệ tác giả và gửi kèm theo logs từ thiết bị của bạn.</string>
<string name="auth_unknown_host_title">Không thể tìm thấy máy chủ</string>
- <string name="auth_unknown_host_message">Không thể tìm thấy máy chủ. Xin vui lòng kiểm tra hostname, máy chủ có giá trị và thử lại.</string>
- <string name="auth_incorrect_path_title">Phiên bản ownCloud không tìm thấy</string>
- <string name="auth_incorrect_path_message">Ứng dụng không thể tìm thấy phiên bản ownClound tại đường dẫn đã cho. Xin vui lòng kiểm tra đường dẫn của bạn và thử lại.</string>
+ <string name="auth_incorrect_path_title">Phiên bản máy chủ không tìm thấy</string>
<string name="auth_timeout_title">Máy chủ đã quá dài để đáp ứng</string>
<string name="auth_incorrect_address_title">Thay đổi URL</string>
<string name="auth_ssl_general_error_title">SSL khởi tạo thất bại</string>
- <string name="auth_ssl_unverified_server_title">Chưa được xác minh danh tính của máy chủ SSL</string>
- <string name="auth_bad_oc_version_title">Không chấp nhận phiên bản máy chủ ownCloud</string>
+ <string name="auth_ssl_unverified_server_title">không thể xác minh danh tính của máy chủ SSL</string>
+ <string name="auth_bad_oc_version_title">Không chấp nhận phiên bản máy chủ</string>
<string name="auth_wrong_connection_title">Không thể thiết lập kết nối</string>
<string name="auth_secure_connection">Kết nối an toàn đã được thiết lập</string>
- <string name="auth_login_details">Chi tiết đăng nhập</string>
- <string name="auth_unauthorized">Sai tên đăng nhập/ mật khẩu</string>
- <string name="auth_not_found">Đường dẫn đã cho không đúng</string>
- <string name="auth_internal">Lỗi máy chủ nội bộ, mã lỗi %1$d</string>
- <string name="crashlog_message">Ứng dụng chấm dứt đột ngột. Bạn có muốn gửi báo cáo sự cố?</string>
- <string name="crashlog_send_report">Gửi báo cáo</string>
- <string name="crashlog_dont_send_report">Không gửi báo cáo</string>
- <string name="extensions_avail_title">Phần mở rộng có giá trị!</string>
- <string name="extensions_avail_message">Hình như phiên bản ownCloud của bạn có hỗ trợ các phần mở rộng nâng cao. Bạn có muốn thấy các phần mở rộng có giá trị trên Android?</string>
+ <string name="auth_unauthorized">Sai tên người dùng hoặc mật khẩu</string>
+ <string name="auth_oauth_error">Xác nhận không thành công</string>
+ <string name="auth_oauth_error_access_denied">Từ chối truy cập vì xác nhận từ phía máy chủ</string>
+ <string name="auth_wtf_reenter_URL">Trạng thái không rõ, vui lòng điền lại đường dẫn liên kết một lần nữa</string>
+ <string name="auth_expired_oauth_token_toast">Hạn xác nhận của bạn đã hết. Vui lòng, xác nhận lại</string>
+ <string name="auth_expired_basic_auth_toast">Vui lòng điền vào mật khẩu hiện tại của bạn</string>
+ <string name="auth_expired_saml_sso_token_toast">Phiên làm việc của bạn đã kết thúc. Vui lòng kết nối lại</string>
+ <string name="auth_connecting_auth_server">Đang kết nối đến máy chủ xác thực...</string>
+ <string name="auth_unsupported_auth_method">Máy chủ không hổ trợ phương thức xác thực này</string>
+ <string name="auth_unsupported_multiaccount">%1$s không hỗ trợ nhiều tài khoản</string>
<string name="fd_keep_in_sync">Giữ tập tin cập nhật</string>
- <string name="common_share">Chia sẻ</string>
<string name="common_rename">Sửa tên</string>
<string name="common_remove">Xóa</string>
<string name="confirmation_remove_alert">Bạn có thực sự muốn xóa %1$s ?</string>
<string name="rename_server_fail_msg">Đổi tên không thể hoàn thành</string>
<string name="sync_file_fail_msg">Tập tin từ xa không được kiểm tra</string>
<string name="sync_file_nothing_to_do_msg">Nội dung tập tin đã đồng bộ</string>
- <string name="create_dir_fail_msg">Thư mục không thể được tạo</string>
+ <string name="filename_forbidden_characters">Những kí tự không được dùng: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">Chờ một lúc</string>
<string name="filedisplay_unexpected_bad_get_content">Vấn đề bất ngờ ; hãy thử ứng dụng khác để chọn tập tin</string>
<string name="filedisplay_no_file_selected">Không có tập tin nào được chọn</string>
- <string name="ssl_validator_title">Cảnh báo</string>
+ <string name="activity_chooser_title">Gửi liên kết đến...</string>
+ <string name="oauth_check_onoff">Đăng nhập bằng oAuth2.</string>
+ <string name="oauth_login_connection">Đang kết nối đến máy chủ oAuth2...</string>
<string name="ssl_validator_header">Không thể xác minh danh tính của site</string>
<string name="ssl_validator_reason_cert_not_trusted">Chứng chỉ này không đáng tin cậy</string>
<string name="ssl_validator_reason_cert_expired">Chứng chỉ đã hết hạn</string>
<string name="ssl_validator_reason_cert_not_yet_valid">Chứng nhận máy chủ quá mới</string>
<string name="ssl_validator_reason_hostname_not_verified">URL không phù hợp với tên máy trong chứng chỉ</string>
- <string name="ssl_validator_certificate_not_available">Không đạt được chứng chỉ </string>
<string name="ssl_validator_question">Bạn có chắc chắn tin tưởng chứng chỉ này?</string>
<string name="ssl_validator_not_saved">Giấy chứng nhận này không có thể được Lưu</string>
<string name="ssl_validator_btn_details_see">Chi tiết</string>
<string name="ssl_validator_label_validity_to">Tới :</string>
<string name="ssl_validator_label_signature">Chữ ký :</string>
<string name="ssl_validator_label_signature_algorithm">Thuật toán :</string>
- <string name="text_placeholder">Vị trí này đã được đặt chỗ trước</string>
+ <string name="placeholder_sentence">Vị trí này đã được đặt chỗ trước</string>
+ <string name="placeholder_filename">placeholder.txt</string>
+ <string name="placeholder_filetype">Hình ảnh dạng PNG</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Tải hình ảnh lên thông qua WiFi</string>
<string name="instant_upload_path">/Upload tức thì</string>
<string name="conflict_title">Cập nhật xung đột</string>
<string name="conflict_keep_both">Giữ cho cả hai</string>
<string name="conflict_overwrite">Ghi đè lên</string>
<string name="conflict_dont_upload">Không tải lên</string>
+ <string name="preview_image_description">Xem trước hình ảnh</string>
+ <string name="preview_image_error_unknown_format">Không thể hiển thị hình ảnh</string>
+ <string name="actionbar_failed_instant_upload">Tải lên nhanh bị lỗi</string>
+ <string name="failed_upload_headline_text">Tải lên nhanh bị lỗi</string>
+ <string name="failed_upload_headline_hint">Tóm tắt tất cả các tải lên nhanh bị lỗi</string>
+ <string name="failed_upload_all_cb">chọn tất cả</string>
+ <string name="failed_upload_headline_retryall_btn">thử lại với tất cả các đối tượng được chọn</string>
+ <string name="failed_upload_headline_delete_all_btn">xóa tất cả khỏi các đối tượng được chọn trong hàng đợi chờ tải lên</string>
+ <string name="failed_upload_retry_text">thử lại việc tải lên hình ảnh:</string>
+ <string name="failed_upload_load_more_images">Tải thêm nhiều hình ảnh</string>
+ <string name="failed_upload_retry_do_nothing_text">không thực hiện thao tác gì nêu bạn không có kết nối mạng dành cho tải lên nhanh</string>
+ <string name="failed_upload_failure_text">Thông điệp lỗi:</string>
+ <string name="failed_upload_quota_exceeded_text">Vui lòng kiểm tra cấu hình máy chủ của bạn, có thể hạn ngạch dữ liệu đã quá hạn.</string>
+ <string name="share_link_file_no_exist">Không thể chia sẻ file hoặc thư mục này. Hãy chắc chắn rằng nó tồn tại</string>
+ <string name="share_link_file_error">Một lỗi đã xảy ra khi thử chia sẻ file hoặc thư mục này</string>
+ <string name="unshare_link_file_no_exist">Không thể gỡ chia sẻ file hoặc thư mục. Nó không tồn tại.</string>
+ <string name="unshare_link_file_error">Một lỗi đã xảy ra khi thử gỡ chia sẻ file hoặc thư mục này</string>
+ <string name="activity_chooser_send_file_title">Gởi</string>
</resources>
+++ /dev/null
-<?xml version='1.0' encoding='UTF-8'?>
-<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">密码</string>
- <string name="main_login">用户名:</string>
- <string name="main_button_login">登录</string>
- <string name="main_welcome">欢迎来到您的 ownCloud</string>
- <string name="main_files">文件</string>
- <string name="main_music">音乐</string>
- <string name="main_contacts">联系人</string>
- <string name="main_calendar">日程表</string>
- <string name="main_bookmarks">书签</string>
- <string name="main_settings">设置</string>
- <string name="main_tit_accsetup">设置帐号</string>
- <string name="main_wrn_accsetup">您的设备上没有 ownCloud 帐号。要使用此应用,您需要创建一个帐号。</string>
- <string name="about_message">ownCloud Android 客户端⏎ ⏎ 版本:%1$s</string>
- <string name="actionbar_sync">刷新</string>
- <string name="actionbar_upload">上传</string>
- <string name="actionbar_upload_from_apps">其他应用的内容</string>
- <string name="actionbar_upload_files">文件</string>
- <string name="actionbar_mkdir">创建文件夹</string>
- <string name="actionbar_search">搜索</string>
- <string name="actionbar_settings">设置</string>
- <string name="prefs_category_general">常规</string>
- <string name="prefs_category_trackmydevice">设备跟踪</string>
- <string name="prefs_add_session">添加新会话</string>
- <string name="prefs_create_img_thumbnails">创建相片缩略图</string>
- <string name="prefs_select_oc_account">选择一个帐号</string>
- <string name="prefs_summary_select_oc_account">选择应用应使用您哪个帐号。</string>
- <string name="prefs_trackmydevice">跟踪设备</string>
- <string name="prefs_trackmydevice_summary_off">让 ownCloud 跟踪您的设备位置</string>
- <string name="prefs_trackmydevice_summary_on">您的 ownCloud 正跟踪着此设备</string>
- <string name="prefs_trackmydevice_interval">更新周期</string>
- <string name="prefs_trackmydevice_interval_summary">每 %1$s 分钟更新</string>
- <string name="prefs_accounts">帐号</string>
- <string name="prefs_manage_accounts">管理帐号</string>
- <string name="prefs_pincode">ownCloud 应用 PIN</string>
- <string name="prefs_pincode_summary">保护您的 ownCloud 客户端</string>
- <string name="prefs_instant_upload">启用即时上传</string>
- <string name="prefs_instant_upload_summary">即时上传相机拍下的相片</string>
- <string name="auth_host_url">ownCloud 网址</string>
- <string name="auth_username">用户名</string>
- <string name="auth_password">密码</string>
- <string name="auth_register">我是 ownCloud 新人</string>
- <string name="new_session_uri_error">错误的网址</string>
- <string name="new_session_session_name_error">错误会话名</string>
- <string name="sync_string_files">文件</string>
- <string name="uploader_no_file_selected">没有选择要上传的文件</string>
- <string name="setup_hint_username">用户名</string>
- <string name="setup_hint_password">密码</string>
- <string name="setup_hint_address">网址</string>
- <string name="setup_hint_show_password">显示密码?</string>
- <string name="setup_title">连接到您的 ownCloud</string>
- <string name="setup_btn_connect">连接</string>
- <string name="uploader_btn_upload_text">上传</string>
- <string name="uploader_wrn_no_account_title">没有找到帐号</string>
- <string name="uploader_wrn_no_account_text">您的设备上没有 ownCloud 帐号。请先设置一个帐号。</string>
- <string name="uploader_wrn_no_account_setup_btn_text">设置</string>
- <string name="uploader_wrn_no_account_quit_btn_text">退出</string>
- <string name="uploader_wrn_no_content_title">没有要上传的内容</string>
- <string name="uploader_wrn_no_content_text">没有接收到内容。没有东西可以上传。</string>
- <string name="uploader_error_forbidden_content">ownCloud 不允许访问共享内容</string>
- <string name="uploader_info_uploading">上传中</string>
- <string name="uploader_btn_create_dir_text">创建上传文件夹</string>
- <string name="file_list_empty">此文件夹中没有文件。⏎ 可以通过 \"上传\" 菜单选项添加新文件。</string>
- <string name="filedetails_select_file">按文件显示额外信息。</string>
- <string name="filedetails_size">大小:</string>
- <string name="filedetails_type">类型:</string>
- <string name="filedetails_created">创建于:</string>
- <string name="filedetails_modified">修改于:</string>
- <string name="filedetails_download">下载</string>
- <string name="filedetails_sync_file">刷新</string>
- <string name="filedetails_redownload">重新下载</string>
- <string name="filedetails_open">打开</string>
- <string name="filedetails_renamed_in_upload_msg">文件在上传过程中被重命名为 %1$s </string>
- <string name="common_yes">是</string>
- <string name="common_no">否</string>
- <string name="common_ok">好</string>
- <string name="common_cancel_download">取消下载</string>
- <string name="common_cancel_upload">取消上传</string>
- <string name="common_cancel">取消</string>
- <string name="common_save_exit">保存 & 退出</string>
- <string name="common_exit">离开 ownCloud</string>
- <string name="common_error">出错</string>
- <string name="about_title">关于</string>
- <string name="delete_account">删除帐号</string>
- <string name="create_account">创建帐号</string>
- <string name="upload_chooser_title">上传自...</string>
- <string name="uploader_info_dirname">文件夹名称</string>
- <string name="uploader_upload_in_progress_ticker">上传中...</string>
- <string name="uploader_upload_in_progress_content">%1$d%% 正在上传 %2$s</string>
- <string name="uploader_upload_succeeded_ticker">上传成功</string>
- <string name="uploader_upload_succeeded_content_single">成功上传 %1$s</string>
- <string name="uploader_upload_succeeded_content_multiple">成功上传 %1$d 文件</string>
- <string name="uploader_upload_failed_ticker">上传失败</string>
- <string name="uploader_upload_failed_content_single">未能上传 %1$s</string>
- <string name="uploader_upload_failed_content_multiple">上传失败:上传了 %1$d/%2$d 个文件</string>
- <string name="downloader_download_in_progress_ticker">正在下载...</string>
- <string name="downloader_download_in_progress_content">%1$d%% 正在下载 %2$s</string>
- <string name="downloader_download_succeeded_ticker">下载成功</string>
- <string name="downloader_download_succeeded_content">%1$s 已成功下载</string>
- <string name="downloader_download_failed_ticker">下载失败</string>
- <string name="downloader_download_failed_content">未能下载 %1$s</string>
- <string name="common_choose_account">选择帐号</string>
- <string name="sync_string_contacts">联系人</string>
- <string name="sync_fail_ticker">同步失败</string>
- <string name="sync_fail_content">不能完成 %1$s 的同步</string>
- <string name="sync_conflicts_in_favourites_ticker">存在冲突</string>
- <string name="sync_conflicts_in_favourites_content">%1$d 计划同步文件无法同步</string>
- <string name="use_ssl">使用安全连接</string>
- <string name="location_no_provider">ownCloud 不能跟踪您的设备。请检查您的位置设置</string>
- <string name="pincode_enter_pin_code">请插入您的应用 PIN</string>
- <string name="pincode_enter_new_pin_code">请插入您的新应用 PIN</string>
- <string name="pincode_configure_your_pin">输入 ownCloud 应用 PIN</string>
- <string name="pincode_configure_your_pin_explanation">将在每次应用程序启动时请求 PIN </string>
- <string name="pincode_reenter_your_pincode">请重新输入 ownCloud 应用 PIN</string>
- <string name="pincode_remove_your_pincode">移除您的 ownCloud 应用 PIN</string>
- <string name="pincode_mismatch">两次 ownCloud 应用 PIN 不相同</string>
- <string name="pincode_wrong">错误的 ownCloud 应用 PIN</string>
- <string name="pincode_removed">ownCloud 应用 PIN 已移除</string>
- <string name="pincode_stored">ownCloud 应用 PIN 已存储</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 分钟</item>
- <item>30 分钟</item>
- <item>60 分钟</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
- <string name="auth_trying_to_login">尝试登录...</string>
- <string name="auth_no_net_conn_title">无网络连接</string>
- <string name="auth_no_net_conn_message">没有检测到网络连接,请检查您的互联网连接并重试。</string>
- <string name="auth_connect_anyway">强制连接</string>
- <string name="auth_nossl_plain_ok_title">安全连接不可用。</string>
- <string name="auth_nossl_plain_ok_message">应用未能建立到服务器的安全连接。但是非安全连接可用。您可以继续或取消。</string>
- <string name="auth_connection_established">连接已建立</string>
- <string name="auth_testing_connection">测试连接...</string>
- <string name="auth_not_configured_title">ownCloud 配置格式不正确</string>
- <string name="auth_not_configured_message">似乎您的 ownCloud 实例未正确配置。详情联系您的管理员。</string>
- <string name="auth_unknown_error_title">发生了未知错误!</string>
- <string name="auth_unknown_error_message">发生了未知错误。请联系作者并发送您的设备日志。</string>
- <string name="auth_unknown_host_title">未能找到主机</string>
- <string name="auth_unknown_host_message">不能找到输入的主机。请检查主机名和服务器是否可访问并重试。</string>
- <string name="auth_incorrect_path_title">ownCloud 实例未找到</string>
- <string name="auth_incorrect_path_message">应用未能找到指定路径的 ownCloud 实例。请检查您的路径并重试。</string>
- <string name="auth_timeout_title">服务器响应时间太长</string>
- <string name="auth_incorrect_address_title">网址格式不正确</string>
- <string name="auth_ssl_general_error_title">SSL 初始化失败</string>
- <string name="auth_ssl_unverified_server_title">未验证的 SSL 服务器身份</string>
- <string name="auth_bad_oc_version_title">未知 ownCloud 服务器版本</string>
- <string name="auth_wrong_connection_title">不能建立连接</string>
- <string name="auth_secure_connection">安全连接已建立</string>
- <string name="auth_login_details">登录细节</string>
- <string name="crashlog_message">应用非预期终止。您愿意提交崩溃报告吗?</string>
- <string name="crashlog_send_report">发送报告</string>
- <string name="crashlog_dont_send_report">不发送报告</string>
- <string name="extensions_avail_title">有扩展可用!</string>
- <string name="extensions_avail_message">看起来您的 ownCloud 实例支持高级扩展。您想要查看 Android 可用的扩展吗?</string>
- <string name="fd_keep_in_sync">保持文件最新</string>
- <string name="common_share">分享</string>
- <string name="common_rename">重命名</string>
- <string name="common_remove">移除</string>
- <string name="confirmation_remove_alert">您确实想要移除 %1$s 吗?</string>
- <string name="confirmation_remove_local">仅本地</string>
- <string name="confirmation_remove_remote">从服务器移除</string>
- <string name="confirmation_remove_remote_and_local">远程和本地</string>
- <string name="remove_success_msg">成功移除</string>
- <string name="remove_fail_msg">未能移除</string>
- <string name="rename_local_fail_msg">本地副本不能重命名;尝试新名称</string>
- <string name="rename_server_fail_msg">不能重命名</string>
- <string name="create_dir_fail_msg">不能创建文件夹</string>
- <string name="wait_a_moment">请稍候</string>
- <string name="filedisplay_unexpected_bad_get_content">非预期问题;请尝试使用其他应用选择文件</string>
- <string name="filedisplay_no_file_selected">未选择文件</string>
- <string name="ssl_validator_title">警告</string>
- <string name="ssl_validator_header">此站点身份不能确认</string>
- <string name="ssl_validator_reason_cert_not_trusted">- 服务器证书不受信任</string>
- <string name="ssl_validator_reason_cert_expired">- 服务器证书过期</string>
- <string name="ssl_validator_reason_cert_not_yet_valid">- 服务器证书太新</string>
- <string name="ssl_validator_reason_hostname_not_verified">- URL 不匹配证书中的主机名</string>
- <string name="ssl_validator_certificate_not_available">无法获取服务器证书</string>
- <string name="ssl_validator_question">您想要强行信任此证书吗?</string>
- <string name="ssl_validator_not_saved">证书不能保存</string>
- <string name="ssl_validator_btn_details_see">细节</string>
- <string name="ssl_validator_btn_details_hide">隐藏</string>
- <string name="ssl_validator_label_subject">签发对象:</string>
- <string name="ssl_validator_label_issuer">签发者:</string>
- <string name="ssl_validator_label_CN">通用名:</string>
- <string name="ssl_validator_label_O">组织:</string>
- <string name="ssl_validator_label_OU">组织单元:</string>
- <string name="ssl_validator_label_C">国家:</string>
- <string name="ssl_validator_label_ST">州省:</string>
- <string name="ssl_validator_label_L">位置:</string>
- <string name="ssl_validator_label_validity">有效性:</string>
- <string name="ssl_validator_label_validity_from">从:</string>
- <string name="ssl_validator_label_validity_to">到:</string>
- <string name="ssl_validator_label_signature">签名:</string>
- <string name="ssl_validator_label_signature_algorithm">算法:</string>
- <string name="text_placeholder">这是一个占位符</string>
- <string name="instant_upload_on_wifi">只通过 WiFi 上传图片</string>
- <string name="conflict_title">上传冲突</string>
- <string name="conflict_message">远程文件 %s 未与本地文件同步。继续将替换服务器上的文件内容。</string>
- <string name="conflict_keep_both">保留两者</string>
- <string name="conflict_overwrite">覆写</string>
- <string name="conflict_dont_upload">不上传</string>
-</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">密码:</string>
- <string name="main_login">用户名:</string>
- <string name="main_button_login">登陆</string>
- <string name="main_welcome">欢迎来到你的 ownCloud</string>
- <string name="main_files">文件</string>
- <string name="main_music">音乐</string>
- <string name="main_contacts">联系人</string>
- <string name="main_calendar">日历</string>
- <string name="main_bookmarks">书签</string>
- <string name="main_settings">设置</string>
- <string name="main_tit_accsetup">设置账号</string>
- <string name="main_wrn_accsetup">设备上无 ownCloud 账号,要使用此 App,需要先创建一个账号。</string>
- <string name="about_message">ownCloud安卓客户端\n\n版本: %1$s</string>
- <string name="actionbar_sync">刷新</string>
+ <string name="about_android">%1$s 安卓应用</string>
+ <string name="about_version">版本:%1$s</string>
+ <string name="actionbar_sync">刷新帐户</string>
<string name="actionbar_upload">上传</string>
<string name="actionbar_upload_from_apps">来自其它app的内容</string>
<string name="actionbar_upload_files">文件</string>
- <string name="actionbar_mkdir">创建目录</string>
- <string name="actionbar_search">搜索</string>
+ <string name="actionbar_open_with">打开</string>
+ <string name="actionbar_mkdir">添加文件夹</string>
<string name="actionbar_settings">设置</string>
+ <string name="actionbar_see_details">详细信息</string>
+ <string name="actionbar_send_file">发送</string>
<string name="prefs_category_general">常规</string>
- <string name="prefs_category_trackmydevice">设备跟踪</string>
- <string name="prefs_add_session">添加新设备</string>
- <string name="prefs_create_img_thumbnails">创建图片缩略图</string>
- <string name="prefs_select_oc_account">选择账号</string>
- <string name="prefs_summary_select_oc_account">选择程序使用的账号</string>
- <string name="prefs_trackmydevice">设备跟踪</string>
- <string name="prefs_trackmydevice_summary_off">用 ownCloud 跟踪您设备的位置</string>
- <string name="prefs_trackmydevice_summary_on">您的 ownCloud 将跟踪设备的位置</string>
- <string name="prefs_trackmydevice_interval">更新间隔</string>
- <string name="prefs_trackmydevice_interval_summary">每%1$s分钟更新一次</string>
+ <string name="prefs_category_more">更多</string>
<string name="prefs_accounts">账号</string>
<string name="prefs_manage_accounts">管理账号</string>
- <string name="prefs_pincode">ownCloud App PIN</string>
- <string name="prefs_pincode_summary">保护您的owncloud客户端</string>
+ <string name="prefs_pincode">App PIN</string>
+ <string name="prefs_pincode_summary">保护您的App客户端</string>
<string name="prefs_instant_upload">开启即时上传</string>
<string name="prefs_instant_upload_summary">即时上传相机拍摄的照片</string>
- <string name="auth_host_url">ownCloud 网址</string>
+ <string name="prefs_log_title">开启日志</string>
+ <string name="prefs_log_summary">这过去是日志问题</string>
+ <string name="prefs_log_title_history">日志历史</string>
+ <string name="prefs_log_summary_history">这显示已经保存的日志</string>
+ <string name="prefs_log_delete_history_button">删除历史</string>
+ <string name="prefs_help">帮助</string>
+ <string name="prefs_feedback">反馈</string>
+ <string name="prefs_imprint">版本说明</string>
+ <string name="auth_check_server">检查服务器</string>
<string name="auth_username">用户名</string>
<string name="auth_password">密码</string>
- <string name="auth_register">我是新手</string>
- <string name="new_session_uri_error">错误的网址</string>
- <string name="new_session_session_name_error">错误的会话名</string>
+ <string name="auth_register">新增到 %1$s?</string>
<string name="sync_string_files">文件</string>
- <string name="uploader_no_file_selected">未选择要上传的文件</string>
- <string name="setup_hint_username">用户名</string>
- <string name="setup_hint_password">密码</string>
- <string name="setup_hint_address">网络地址</string>
- <string name="setup_hint_show_password">显示密码?</string>
- <string name="setup_title">连接到你的 ownCloud</string>
<string name="setup_btn_connect">连接</string>
<string name="uploader_btn_upload_text">上传</string>
<string name="uploader_wrn_no_account_title">未找到账号</string>
<string name="uploader_wrn_no_account_quit_btn_text">退出</string>
<string name="uploader_wrn_no_content_title">没有上传的内容</string>
<string name="uploader_wrn_no_content_text">没有接收到内容,无可上传。</string>
- <string name="uploader_error_forbidden_content">ownCloud未被允许访问共享内容。</string>
+ <string name="uploader_error_forbidden_content">%1$s未被允许访问共享内容。</string>
<string name="uploader_info_uploading">上传</string>
- <string name="uploader_btn_create_dir_text">创建上传文件夹</string>
<string name="file_list_empty">文件夹为空\n可以使用上传按钮来增加文件</string>
<string name="filedetails_select_file">点击一个文件来显示额外的信息。</string>
<string name="filedetails_size">大小:</string>
<string name="filedetails_created">创建于:</string>
<string name="filedetails_modified">已修改:</string>
<string name="filedetails_download">下载</string>
- <string name="filedetails_sync_file">刷新</string>
- <string name="filedetails_redownload">重新下载</string>
- <string name="filedetails_open">打开</string>
+ <string name="filedetails_sync_file">刷新文件</string>
<string name="filedetails_renamed_in_upload_msg">上传过程中文件被更名为了 %1$s</string>
+ <string name="action_share_file">分享链接</string>
+ <string name="action_unshare_file">取消共享链接</string>
<string name="common_yes">是</string>
<string name="common_no">否</string>
<string name="common_ok">OK</string>
<string name="common_cancel_upload">取消上传</string>
<string name="common_cancel">取消</string>
<string name="common_save_exit">保存并退出</string>
- <string name="common_exit">离开ownCloud。</string>
<string name="common_error">错误</string>
+ <string name="common_loading">加载中...</string>
+ <string name="common_error_unknown">未知错误</string>
<string name="about_title">关于</string>
+ <string name="change_password">修改密码</string>
<string name="delete_account">删除账号</string>
<string name="create_account">创建账号</string>
<string name="upload_chooser_title">上传自...</string>
- <string name="uploader_info_dirname">文件夹名称</string>
+ <string name="uploader_info_dirname">目录名称</string>
<string name="uploader_upload_in_progress_ticker">上传...</string>
<string name="uploader_upload_in_progress_content">%1$d%% 上传 %2$s</string>
<string name="uploader_upload_succeeded_ticker">上传成功</string>
<string name="uploader_upload_succeeded_content_single">%1$s 成功上传</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d 文件成功上传。</string>
<string name="uploader_upload_failed_ticker">上传失败</string>
<string name="uploader_upload_failed_content_single">1$上传未能完成</string>
- <string name="uploader_upload_failed_content_multiple">上传失败:%1$d/%2$d文件已上传。</string>
<string name="downloader_download_in_progress_ticker">下载中……</string>
<string name="downloader_download_in_progress_content">%1$d%% 下载中 %2$s</string>
<string name="downloader_download_succeeded_ticker">下载成功</string>
<string name="downloader_download_succeeded_content">%1$s 成功下载</string>
<string name="downloader_download_failed_ticker">下载失败</string>
<string name="downloader_download_failed_content">下载1$s 未能完成</string>
+ <string name="downloader_not_downloaded_yet">未下载完毕</string>
<string name="common_choose_account">选择账户</string>
- <string name="sync_string_contacts">联系人</string>
<string name="sync_fail_ticker">同步失败</string>
<string name="sync_fail_content"> %1$s同步未完成。</string>
+ <string name="sync_fail_content_unauthorized">密码错误%1$s</string>
<string name="sync_conflicts_in_favourites_ticker">发现冲突</string>
<string name="sync_conflicts_in_favourites_content">%1$d 文件无法同步</string>
<string name="sync_fail_in_favourites_ticker">文件同步失败</string>
<string name="sync_fail_in_favourites_content">无法同步 %1$d 文件内容(与 %2$d 冲突)</string>
- <string name="use_ssl">使用安全链接</string>
- <string name="location_no_provider">ownCloud不能跟踪你的设备。请检查你的位置设置。</string>
+ <string name="sync_foreign_files_forgotten_ticker">某些本地文件已被遗忘</string>
+ <string name="foreign_files_move">移动所有</string>
+ <string name="foreign_files_success">所有文件已被移动</string>
+ <string name="foreign_files_fail">某些文件无法被移动</string>
+ <string name="foreign_files_local_text">本地: %1$s</string>
+ <string name="foreign_files_remote_text">远程:%1$s</string>
+ <string name="upload_query_move_foreign_files">没有足够的空间来将选定的文件复制到%1$s文件夹. 是否使用使用移动来代替复制?</string>
<string name="pincode_enter_pin_code">请输入您的App PIN码</string>
- <string name="pincode_enter_new_pin_code">请输入新的App PIN码</string>
- <string name="pincode_configure_your_pin">输入ownCloud App PIN码</string>
+ <string name="pincode_configure_your_pin">输入 App PIN码</string>
<string name="pincode_configure_your_pin_explanation">每次应用启动时都会请求PIN码</string>
- <string name="pincode_reenter_your_pincode">再次输入ownCloud App PIN码</string>
- <string name="pincode_remove_your_pincode">移除ownCloud App PIN码</string>
- <string name="pincode_mismatch">两次ownCloud App PIN码不同</string>
- <string name="pincode_wrong">ownCloud App PIN码不正确</string>
- <string name="pincode_removed">ownCloud App PIN码已移除</string>
- <string name="pincode_stored">ownCloud App PIN码已保存。</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 Minutes</item>
- <item>30 Minutes</item>
- <item>60 Minutes</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
+ <string name="pincode_reenter_your_pincode">再次输入 App PIN码</string>
+ <string name="pincode_remove_your_pincode">移除 App PIN码</string>
+ <string name="pincode_mismatch">两次 App PIN码不同</string>
+ <string name="pincode_wrong">App PIN码不正确</string>
+ <string name="pincode_removed">App PIN码已移除</string>
+ <string name="pincode_stored">App PIN码已保存。</string>
+ <string name="media_notif_ticker">%1$s 音乐播放器</string>
+ <string name="media_state_playing">%1$s (播放中)</string>
+ <string name="media_state_loading">%1$s (载入中)</string>
+ <string name="media_event_done">%1$s 播放完毕</string>
+ <string name="media_err_nothing_to_play">没有发现播放文件</string>
+ <string name="media_err_no_account">未提供账号</string>
+ <string name="media_err_not_in_owncloud">文件不在合法账户</string>
+ <string name="media_err_unsupported">不支持的编码格式</string>
+ <string name="media_err_io">文件不可读</string>
+ <string name="media_err_malformed">文件编码错误</string>
+ <string name="media_err_invalid_progressive_playback">文件不支持流播</string>
+ <string name="media_err_unknown">当前媒体播放器不支持。</string>
+ <string name="media_err_security_ex">尝试播放%1$s时保护错误</string>
+ <string name="media_err_io_ex">尝试播放%1$s时输入错误</string>
+ <string name="media_err_unexpected">尝试播放%1$s时未知错误</string>
+ <string name="media_rewind_description">后退按钮</string>
+ <string name="media_play_pause_description">播放暂停按钮</string>
+ <string name="media_forward_description">快进按钮</string>
<string name="auth_trying_to_login">尝试登录</string>
<string name="auth_no_net_conn_title">没有网络连接</string>
- <string name="auth_no_net_conn_message">未检测到网络连接,检查互联网连接设置后重试。</string>
- <string name="auth_connect_anyway">总是连接</string>
<string name="auth_nossl_plain_ok_title">安全链接无效。</string>
- <string name="auth_nossl_plain_ok_message">应用无法建立安全链接到服务器,但是未加密连接可用,你可以继续或取消。</string>
<string name="auth_connection_established">连接已建立。</string>
<string name="auth_testing_connection">测试连接……</string>
- <string name="auth_not_configured_title">ownCloud配置不正确。</string>
- <string name="auth_not_configured_message">看起来owncloud实例配置不正确,请联系您的管理员获取更多信息。</string>
+ <string name="auth_not_configured_title">服务器配置不正确。</string>
<string name="auth_unknown_error_title">发生未知错误!</string>
- <string name="auth_unknown_error_message">发生未知错误,请联系作者并包括您设备上的日志。</string>
<string name="auth_unknown_host_title">无法找到服务器</string>
- <string name="auth_unknown_host_message">无法找到输入的服务器,请检查主机名以及服务器可用性后重试</string>
- <string name="auth_incorrect_path_title">未发现ownCloud实例</string>
- <string name="auth_incorrect_path_message">应用未在指定路径发现ownCloud实例,请检查路径后重试。</string>
+ <string name="auth_incorrect_path_title">未发现服务器实例</string>
<string name="auth_timeout_title">看起来服务器不太给力</string>
<string name="auth_incorrect_address_title">网址不正确</string>
<string name="auth_ssl_general_error_title">SSL初始化失败</string>
- <string name="auth_ssl_unverified_server_title">未经证实的SSL服务器ID</string>
- <string name="auth_bad_oc_version_title">不可辨识的owncloud服务器版本</string>
+ <string name="auth_bad_oc_version_title">不可辨识的服务器服务器版本</string>
<string name="auth_wrong_connection_title">无法建立连接</string>
<string name="auth_secure_connection">加密连接已建立</string>
- <string name="auth_login_details">登录信息</string>
- <string name="auth_unauthorized">错误的用户名或密码</string>
- <string name="auth_not_found">错误的路径</string>
- <string name="auth_internal">内部服务器错误,代码 %1$d</string>
- <string name="crashlog_message">应用崩溃,是否提交崩溃报告?</string>
- <string name="crashlog_send_report">发送报告</string>
- <string name="crashlog_dont_send_report">不发送报告</string>
- <string name="extensions_avail_title">有效扩展!</string>
- <string name="extensions_avail_message">你的 ownCloud 支持高级扩展,要查看 Android 支持的扩展吗?</string>
+ <string name="auth_unauthorized">用户名或密码错误!</string>
+ <string name="auth_oauth_error">认证不成功</string>
+ <string name="auth_oauth_error_access_denied">访问被认证服务器拒绝</string>
+ <string name="auth_wtf_reenter_URL">意外状态;请再次输入服务器的地址</string>
+ <string name="auth_expired_basic_auth_toast">请输入当前密码:</string>
<string name="fd_keep_in_sync">保证文件更新</string>
- <string name="common_share">共享</string>
<string name="common_rename">重命名</string>
<string name="common_remove">删除</string>
<string name="confirmation_remove_alert">是否要删除%1$s ?</string>
<string name="rename_server_fail_msg">重命名未完成</string>
<string name="sync_file_fail_msg">无法核实远程文件</string>
<string name="sync_file_nothing_to_do_msg">文件内容已同步</string>
- <string name="create_dir_fail_msg">无法创建文件夹</string>
<string name="wait_a_moment">请稍候</string>
<string name="filedisplay_unexpected_bad_get_content">未知问题;请试试用其他程序选择此文件</string>
<string name="filedisplay_no_file_selected">未选择文件。</string>
- <string name="ssl_validator_title">警告</string>
+ <string name="activity_chooser_title">发送链接给 …</string>
+ <string name="oauth_login_connection">连接oAuth2 服务器...</string>
<string name="ssl_validator_header">站点身份无法验证</string>
<string name="ssl_validator_reason_cert_not_trusted">不受信任的服务器证书</string>
<string name="ssl_validator_reason_cert_expired">服务器证书过期</string>
<string name="ssl_validator_reason_cert_not_yet_valid">服务器证书过新</string>
<string name="ssl_validator_reason_hostname_not_verified">主机名与证书中的记录不匹配</string>
- <string name="ssl_validator_certificate_not_available">无法获得服务器证书</string>
<string name="ssl_validator_question">是否信任此证书?</string>
<string name="ssl_validator_not_saved">证书无法保存</string>
<string name="ssl_validator_btn_details_see">详细信息</string>
<string name="ssl_validator_label_validity_to">到:</string>
<string name="ssl_validator_label_signature">签名:</string>
<string name="ssl_validator_label_signature_algorithm">算法:</string>
- <string name="text_placeholder">占位符一枚</string>
+ <string name="placeholder_sentence">占位符</string>
+ <string name="placeholder_filename">点位符.txt</string>
+ <string name="placeholder_filetype">PNG图像格式</string>
+ <string name="placeholder_filesize">389字节</string>
+ <string name="placeholder_timestamp">2012/05/18 下午12:23 </string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">仅通过WIFI上传图片。</string>
<string name="instant_upload_path">/InstantUpload</string>
<string name="conflict_title">上传冲突</string>
<string name="conflict_keep_both">保留两者</string>
<string name="conflict_overwrite">覆盖</string>
<string name="conflict_dont_upload">不上传</string>
+ <string name="preview_image_description">图片预览</string>
+ <string name="preview_image_error_unknown_format">不能显示图片</string>
+ <string name="failed_upload_headline_text">限时上传失败</string>
+ <string name="failed_upload_headline_hint">限时上传失败汇总</string>
+ <string name="failed_upload_all_cb">全选</string>
+ <string name="failed_upload_headline_retryall_btn">重试全选</string>
+ <string name="failed_upload_headline_delete_all_btn">从上传列表删除所有选定项</string>
+ <string name="failed_upload_retry_text">重试上传图片</string>
+ <string name="failed_upload_load_more_images">载入更多图片</string>
+ <string name="failed_upload_retry_do_nothing_text">不在线时不开启即时上传</string>
+ <string name="failed_upload_failure_text">失败消息</string>
+ <string name="failed_upload_quota_exceeded_text">请检查服务器设置。可能走出配额。</string>
+ <string name="share_link_file_no_exist">无法共享该文件或目录,请确定该文件或目录存在</string>
+ <string name="share_link_file_error">共享文件或目录出错</string>
+ <string name="unshare_link_file_error">解除文件或目录共享时出错</string>
+ <string name="activity_chooser_send_file_title">发送</string>
+ <string name="clipboard_text_copied">复制到剪贴板</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
-<resources/>
+<resources>
+ <string name="actionbar_upload">上傳</string>
+ <string name="actionbar_upload_files">文件</string>
+ <string name="actionbar_settings">設定</string>
+ <string name="actionbar_send_file">傳送</string>
+ <string name="prefs_category_general">一般</string>
+ <string name="prefs_accounts">帳號</string>
+ <string name="prefs_help">幫助</string>
+ <string name="auth_username">用戶名稱</string>
+ <string name="auth_password">密碼</string>
+ <string name="sync_string_files">文件</string>
+ <string name="setup_btn_connect">連線</string>
+ <string name="uploader_btn_upload_text">上傳</string>
+ <string name="uploader_wrn_no_account_title">找不到帳戶</string>
+ <string name="uploader_wrn_no_account_setup_btn_text">設定</string>
+ <string name="uploader_wrn_no_account_quit_btn_text">退出</string>
+ <string name="uploader_info_uploading">正在上傳</string>
+ <string name="filedetails_size">大小</string>
+ <string name="filedetails_type">類別</string>
+ <string name="filedetails_created">建立於:</string>
+ <string name="filedetails_modified">修改於:</string>
+ <string name="filedetails_download">下載</string>
+ <string name="common_yes">Yes</string>
+ <string name="common_no">No</string>
+ <string name="common_ok">確定</string>
+ <string name="common_cancel">取消</string>
+ <string name="common_error">錯誤</string>
+ <string name="common_choose_account">選擇帳戶</string>
+ <string name="activity_chooser_send_file_title">傳送</string>
+</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">密碼:</string>
- <string name="main_login">使用者名稱:</string>
- <string name="main_button_login">登入</string>
- <string name="main_welcome">歡迎</string>
- <string name="main_files">檔案</string>
- <string name="main_music">音樂</string>
- <string name="main_contacts">通訊錄</string>
- <string name="main_calendar">日曆</string>
- <string name="main_bookmarks">書籤</string>
- <string name="main_settings">設定</string>
- <string name="main_tit_accsetup">設定帳號</string>
- <string name="main_wrn_accsetup">您尚未在裝置上設定您的 ownCloud 帳號,您必需建立一組帳號才能繼續使用。</string>
- <string name="actionbar_sync">重新整理</string>
+ <string name="about_android">%1$s Android 應用程式</string>
+ <string name="about_version">版本 %1$s</string>
+ <string name="actionbar_sync">更新檔案列表</string>
<string name="actionbar_upload">上傳檔案</string>
+ <string name="actionbar_upload_from_apps">其他應用程序的內容</string>
<string name="actionbar_upload_files">檔案</string>
- <string name="actionbar_mkdir">建立目錄</string>
- <string name="actionbar_search">搜尋</string>
+ <string name="actionbar_open_with">開啟方式</string>
+ <string name="actionbar_mkdir">新資料夾</string>
<string name="actionbar_settings">設定</string>
+ <string name="actionbar_see_details">詳細資料</string>
+ <string name="actionbar_send_file">寄出</string>
<string name="prefs_category_general">一般</string>
- <string name="prefs_category_trackmydevice">裝置追蹤</string>
- <string name="prefs_add_session">增加新連線</string>
- <string name="prefs_create_img_thumbnails">建立圖片縮圖</string>
- <string name="prefs_select_oc_account">選擇一個帳號</string>
- <string name="prefs_summary_select_oc_account">您要使用哪幾個帳號?</string>
- <string name="prefs_trackmydevice">裝置追蹤</string>
- <string name="prefs_trackmydevice_summary_off">啓用此應用程式以追蹤所在位置</string>
- <string name="prefs_trackmydevice_summary_on">此應用程式會追蹤這個裝置</string>
- <string name="prefs_trackmydevice_interval">更新間隔</string>
- <string name="prefs_trackmydevice_interval_summary">每 %1$s 分鐘更新</string>
+ <string name="prefs_category_more">更多</string>
<string name="prefs_accounts">帳號</string>
<string name="prefs_manage_accounts">管理帳號</string>
- <string name="prefs_pincode_summary">保護您的ownCloud用戶端</string>
+ <string name="prefs_pincode">App 密碼</string>
+ <string name="prefs_pincode_summary">保護您的 App 用戶端</string>
<string name="prefs_instant_upload">啟用即時上傳</string>
- <string name="auth_host_url">URL</string>
+ <string name="prefs_instant_upload_summary">即時上傳照相機拍攝的圖片</string>
+ <string name="prefs_log_title">啟用記錄</string>
+ <string name="prefs_log_summary">這個用來記錄執行的動作以找出問題點</string>
+ <string name="prefs_log_title_history">歷史記錄</string>
+ <string name="prefs_log_summary_history">顯示之前的記錄檔</string>
+ <string name="prefs_log_delete_history_button">刪除歷史記錄</string>
+ <string name="prefs_help">說明</string>
+ <string name="prefs_recommend">推薦給朋友</string>
+ <string name="prefs_feedback">反饋</string>
+ <string name="prefs_imprint">法律聲明</string>
+ <string name="recommend_subject">在您的手機中試用%1$s!</string>
+ <string name="auth_check_server">檢查伺服器</string>
+ <string name="auth_host_url">伺服器位址 https://...</string>
<string name="auth_username">使用者名稱</string>
<string name="auth_password">密碼</string>
- <string name="new_session_uri_error">錯誤的位址</string>
- <string name="new_session_session_name_error">錯誤的連線名稱</string>
+ <string name="auth_register">新增到 %1$s?</string>
<string name="sync_string_files">檔案</string>
- <string name="uploader_no_file_selected">未選擇任何要上傳的檔案</string>
- <string name="setup_hint_username">使用者名稱</string>
- <string name="setup_hint_password">密碼</string>
- <string name="setup_hint_address">網頁位址</string>
- <string name="setup_hint_show_password">顯示密碼?</string>
- <string name="setup_title">連線至您的 %1$s</string>
<string name="setup_btn_connect">連線</string>
<string name="uploader_btn_upload_text">上傳</string>
<string name="uploader_wrn_no_account_title">找不到帳號</string>
- <string name="uploader_wrn_no_account_text">在您的裝置上找不到ownCloud的帳號. 請先設定一組帳號.</string>
+ <string name="uploader_wrn_no_account_text">在您的裝置上找不到 %1$s 的帳號. 請先設定一組帳號.</string>
<string name="uploader_wrn_no_account_setup_btn_text">設定</string>
<string name="uploader_wrn_no_account_quit_btn_text">離開</string>
+ <string name="uploader_wrn_no_content_title">沒有上載的內容</string>
+ <string name="uploader_wrn_no_content_text">沒接到任何內容。沒有什麼可上載。</string>
+ <string name="uploader_error_forbidden_content">%1$s 並沒有被允許存取分享的內容</string>
<string name="uploader_info_uploading">上傳中</string>
- <string name="uploader_btn_create_dir_text">建ç«\8bä¸\8aå\82³ç\9b®é\8c\84</string>
+ <string name="file_list_empty">é\80\99å\80\8bç\9b®é\8c\84ç\9b®å\89\8dæ\98¯ç©ºç\9a\84</string>
<string name="filedetails_select_file">在檔案上輕觸來顯示更多資訊。</string>
<string name="filedetails_size">容量:</string>
<string name="filedetails_type">類型:</string>
<string name="filedetails_created">建立:</string>
<string name="filedetails_modified">修改:</string>
<string name="filedetails_download">下載</string>
- <string name="filedetails_sync_file">更新</string>
- <string name="filedetails_redownload">重新下載</string>
- <string name="filedetails_open">開啟</string>
+ <string name="filedetails_sync_file">更新檔案列表</string>
+ <string name="filedetails_renamed_in_upload_msg">檔案名稱在上傳時已被更改為 %1$s</string>
+ <string name="action_share_file">分享連結</string>
+ <string name="action_unshare_file">取消共享連結</string>
<string name="common_yes">是</string>
<string name="common_no">否</string>
<string name="common_ok">好</string>
+ <string name="common_cancel_download">取消下載</string>
<string name="common_cancel_upload">取消上傳</string>
<string name="common_cancel">取消</string>
<string name="common_save_exit">儲存並離開</string>
- <string name="common_exit">離開ownCloud</string>
<string name="common_error">錯誤</string>
+ <string name="common_loading">載入 …</string>
+ <string name="common_error_unknown">未知的錯誤</string>
<string name="about_title">關於</string>
+ <string name="change_password">變更密碼</string>
<string name="delete_account">刪除帳號</string>
<string name="create_account">建立帳號</string>
<string name="upload_chooser_title">更新自 ...</string>
- <string name="uploader_info_dirname">目錄名稱</string>
+ <string name="uploader_info_dirname">資料夾名稱</string>
<string name="uploader_upload_in_progress_ticker">更新中 ...</string>
+ <string name="uploader_upload_in_progress_content">%1$d%% 上傳中 %2$s</string>
<string name="uploader_upload_succeeded_ticker">更新成功</string>
<string name="uploader_upload_succeeded_content_single">%1$s 已成功地上傳</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d 檔案已成功地上傳</string>
<string name="uploader_upload_failed_ticker">上傳失敗</string>
+ <string name="uploader_upload_failed_content_single">上傳 %1$s 未完成</string>
<string name="downloader_download_in_progress_ticker">下載中 ...</string>
+ <string name="downloader_download_in_progress_content">%1$d%% 下載中 %2$s</string>
<string name="downloader_download_succeeded_ticker">下載成功</string>
+ <string name="downloader_download_succeeded_content">%1$s 已成功下載</string>
<string name="downloader_download_failed_ticker">下載失敗</string>
+ <string name="downloader_download_failed_content">下載 %1$s 未完成</string>
+ <string name="downloader_not_downloaded_yet">尚未下載</string>
<string name="common_choose_account">選擇帳號</string>
- <string name="sync_string_contacts">通訊錄</string>
- <string name="use_ssl">使用安全連線</string>
- <string name="location_no_provider">%1$s 無法追蹤您的裝置,請檢查定位服務設定</string>
- <string name="pincode_enter_pin_code">請輸入您的 App PIN</string>
- <string name="pincode_enter_new_pin_code">請輸入您的新 App PIN</string>
- <string name="pincode_configure_your_pin">輸入您的 App PIN</string>
- <string name="pincode_reenter_your_pincode">請重新輸入您的 App PIN</string>
- <string name="pincode_remove_your_pincode">移除您的 App PIN</string>
- <string name="pincode_mismatch">App PIN 不相符</string>
- <string name="pincode_wrong">App PIN 不正確</string>
- <string name="pincode_removed">App PIN 已移除</string>
- <string name="pincode_stored">App PIN 已儲存</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 分鐘</item>
- <item>30 分鐘</item>
- <item>60 分鐘</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
- <string name="auth_trying_to_login">嘗試登入...</string>
+ <string name="sync_fail_ticker">同步失敗</string>
+ <string name="sync_fail_content">同步 %1$s 未完成</string>
+ <string name="sync_fail_content_unauthorized">無效的密碼 %1$s</string>
+ <string name="sync_conflicts_in_favourites_ticker">出現衝突</string>
+ <string name="sync_conflicts_in_favourites_content">%1$d 持續同步未被同步的檔案</string>
+ <string name="sync_fail_in_favourites_ticker">同步檔案失敗</string>
+ <string name="sync_fail_in_favourites_content">%1$d 未被同步 (%2$d 衝突)</string>
+ <string name="sync_foreign_files_forgotten_ticker">有些本地端的檔案已遺失</string>
+ <string name="sync_current_folder_was_removed">資料夾 %1$s 不存在</string>
+ <string name="foreign_files_move">移動全部</string>
+ <string name="foreign_files_success">所有文件已被移動</string>
+ <string name="foreign_files_fail">部份文件無法被移動</string>
+ <string name="foreign_files_local_text">本地: %1$s</string>
+ <string name="foreign_files_remote_text">遠端: %1$s</string>
+ <string name="upload_query_move_foreign_files">無足夠的空間可以複製檔案到 %1$s 目錄. 是否使用移動的方式來處理? </string>
+ <string name="pincode_enter_pin_code">請輸入您的 App 密碼</string>
+ <string name="pincode_configure_your_pin">輸入您的 App 密碼</string>
+ <string name="pincode_configure_your_pin_explanation">這個密碼在你每次啟動這程式時都會被要求輸入</string>
+ <string name="pincode_reenter_your_pincode">請重新輸入您的 App 密碼</string>
+ <string name="pincode_remove_your_pincode">移除您的 App 密碼</string>
+ <string name="pincode_mismatch">App 密碼不相符</string>
+ <string name="pincode_wrong">App 密碼不正確</string>
+ <string name="pincode_removed">App 密碼已移除</string>
+ <string name="pincode_stored">App 密碼已儲存</string>
+ <string name="media_notif_ticker">%1$s 音樂播放器</string>
+ <string name="media_state_playing">%1$s (播放中)</string>
+ <string name="media_state_loading">%1$s (載入中)</string>
+ <string name="media_event_done">%1$s 已播放</string>
+ <string name="media_err_nothing_to_play">沒有發現音樂媒體</string>
+ <string name="media_err_no_account">沒有提供的帳戶</string>
+ <string name="media_err_not_in_owncloud">檔案不存在於有效的帳戶中</string>
+ <string name="media_err_unsupported">未支援的媒體編碼</string>
+ <string name="media_err_io">無法讀取媒體檔案</string>
+ <string name="media_err_malformed">媒體檔案未被正確的編碼</string>
+ <string name="media_err_timeout">嘗試播放時逾時</string>
+ <string name="media_err_invalid_progressive_playback">媒體檔案無法在網路播放</string>
+ <string name="media_err_unknown">媒體檔案無法在正常的播放軟體播放</string>
+ <string name="media_err_security_ex">在播放 %1$s 時發生安全性的錯誤</string>
+ <string name="media_err_io_ex">在播放 %1$s 時發生輸入錯誤</string>
+ <string name="media_err_unexpected">在播放 %1$s 時發生未知的錯誤</string>
+ <string name="media_rewind_description">重新播放按鍵</string>
+ <string name="media_play_pause_description">播放或暫停按鍵</string>
+ <string name="media_forward_description">快轉按鍵</string>
+ <string name="auth_trying_to_login">嘗試登入…</string>
<string name="auth_no_net_conn_title">沒有網際網路連線</string>
- <string name="auth_no_net_conn_message">沒有偵測到網際網路連線,請檢查您的連線然後再試一次。</string>
- <string name="auth_connect_anyway">繼續連線</string>
<string name="auth_nossl_plain_ok_title">安全連線不可用。</string>
- <string name="auth_nossl_plain_ok_message">無法與伺服器建立安全連線,可以使用不安全連線(未加密)以繼續,您可以繼續或取消。</string>
<string name="auth_connection_established">連線已建立</string>
- <string name="auth_testing_connection">測試連線...</string>
+ <string name="auth_testing_connection">測試連線中…</string>
<string name="auth_not_configured_title">伺服器設定有問題</string>
- <string name="auth_not_configured_message">看起來您的伺服器並未被正確設定,請聯絡服務管理者以取得協助。</string>
<string name="auth_unknown_error_title">發生未知的錯誤!</string>
- <string name="auth_unknown_error_message">發生未知的錯誤,請聯絡支援服務並附上您的記錄檔。</string>
+ <string name="auth_unknown_host_title">找不到伺服器</string>
<string name="auth_incorrect_path_title">找不到伺服器</string>
- <string name="auth_incorrect_path_message">å\9c¨æ\8c\87å®\9aç\9a\84è·¯å¾\91æ\89¾ä¸\8då\88°ä¼ºæ\9c\8då\99¨ï¼\8cè«\8b檢æ\9f¥æ\82¨ç\9a\84è·¯å¾\91ç\84¶å¾\8cå\86\8d試ä¸\80次ã\80\82</string>
+ <string name="auth_timeout_title">伺æ\9c\8då\99¨å\9b\9eæ\87\89é\80¾æ\99\82</string>
<string name="auth_incorrect_address_title">URL 不正確</string>
<string name="auth_ssl_general_error_title">SSL 初始化失敗</string>
- <string name="auth_ssl_unverified_server_title">未經驗證的 SSL 伺服器身份</string>
- <string name="auth_bad_oc_version_title">無法辨識的ownCloud伺服器版本</string>
+ <string name="auth_ssl_unverified_server_title">無法驗證 SSL 伺服器身份</string>
+ <string name="auth_bad_oc_version_title">無法辨識的伺服器版本</string>
<string name="auth_wrong_connection_title">無法建立連線</string>
<string name="auth_secure_connection">安全連線已建立</string>
- <string name="auth_login_details">登入細節</string>
+ <string name="auth_unauthorized">錯誤的使用者或密碼</string>
+ <string name="auth_oauth_error">未成功登入</string>
+ <string name="auth_oauth_error_access_denied">被授登伺服器拒絕登入</string>
+ <string name="auth_wtf_reenter_URL">未知的狀態; 請再輸入一次伺服器的名稱</string>
+ <string name="auth_expired_basic_auth_toast">請輸入目錄的密碼</string>
+ <string name="auth_expired_saml_sso_token_toast">您的連接已逾期. 請重新連線.</string>
+ <string name="auth_connecting_auth_server">連線到認證伺服器...</string>
+ <string name="auth_unsupported_auth_method">伺服器不支援這種認證方式</string>
+ <string name="auth_unsupported_multiaccount">%1$s 不支援複數賬戶</string>
<string name="fd_keep_in_sync">讓檔案保持最新的</string>
- <string name="common_share">分享</string>
<string name="common_rename">重新命名</string>
<string name="common_remove">移除</string>
<string name="confirmation_remove_alert">您真的要移除 %1$s ?</string>
+ <string name="confirmation_remove_folder_alert">您真的要移除 %1$s 與裡頭的檔案?</string>
<string name="confirmation_remove_local">只有本地</string>
+ <string name="confirmation_remove_folder_local">只有本地</string>
<string name="confirmation_remove_remote">從伺服器移除</string>
+ <string name="confirmation_remove_remote_and_local">遠端與本地</string>
<string name="remove_success_msg">成功地移除</string>
+ <string name="remove_fail_msg">刪除失敗</string>
+ <string name="rename_dialog_title">輸入新名稱</string>
<string name="rename_local_fail_msg">本地的複本無法被重新命名; 請嘗試一個不同的新名稱</string>
- <string name="create_dir_fail_msg">資料夾無法被建立</string>
+ <string name="rename_server_fail_msg">重新命名失敗</string>
+ <string name="sync_file_fail_msg">無法檢查遠端的檔案</string>
+ <string name="sync_file_nothing_to_do_msg">檔案與同步</string>
+ <string name="filename_forbidden_characters">禁止使用字符: / \\ < > : \" | ? *</string>
<string name="wait_a_moment">請稍後</string>
- <string name="ssl_validator_title">警告</string>
+ <string name="filedisplay_unexpected_bad_get_content">未知的問題; 請選擇其他程式開啟檔案</string>
+ <string name="filedisplay_no_file_selected">沒有挑選檔案</string>
+ <string name="activity_chooser_title">傳送連結至 ...</string>
+ <string name="oauth_check_onoff">以 oAuth2 方式登入</string>
+ <string name="oauth_login_connection">連線到 oAuth2 伺服器…</string>
+ <string name="ssl_validator_header">這個網站的憑證無法被驗證</string>
+ <string name="ssl_validator_reason_cert_not_trusted">- 這個伺服器使用未被信任的憑證</string>
+ <string name="ssl_validator_reason_cert_expired">- 這個伺服器的憑證已過期</string>
+ <string name="ssl_validator_reason_cert_not_yet_valid">- 這個伺服器的憑證有效期限不正確</string>
+ <string name="ssl_validator_reason_hostname_not_verified">- 這個伺服器的憑證與使用的伺服器名稱不一樣</string>
+ <string name="ssl_validator_question">你是否要信任這個伺服器的憑證?</string>
+ <string name="ssl_validator_not_saved">無法儲存憑證</string>
+ <string name="ssl_validator_btn_details_see">細節</string>
+ <string name="ssl_validator_btn_details_hide">隱藏</string>
+ <string name="ssl_validator_label_subject">發行給:</string>
+ <string name="ssl_validator_label_issuer">發行者:</string>
+ <string name="ssl_validator_label_CN">網站:</string>
+ <string name="ssl_validator_label_O">組織:</string>
+ <string name="ssl_validator_label_OU">組織部門:</string>
+ <string name="ssl_validator_label_C">國家:</string>
+ <string name="ssl_validator_label_ST">省:</string>
+ <string name="ssl_validator_label_L">地點:</string>
+ <string name="ssl_validator_label_validity">有效期限:</string>
+ <string name="ssl_validator_label_validity_from">從:</string>
+ <string name="ssl_validator_label_validity_to">至:</string>
+ <string name="ssl_validator_label_signature">簽名:</string>
+ <string name="ssl_validator_label_signature_algorithm">演算法:</string>
+ <string name="placeholder_sentence">這是佔位的資訊</string>
+ <string name="placeholder_filename">placeholder.txt</string>
+ <string name="placeholder_filetype">PNG 圖檔</string>
+ <string name="placeholder_filesize">389 KB</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
+ <string name="instant_upload_on_wifi">只使用 WiFi 上傳</string>
+ <string name="instant_upload_path">/InstantUpload</string>
+ <string name="conflict_title">更新衝突</string>
+ <string name="conflict_message">遠端檔案 %s 未同步到本地. 繼續將取代伺服器上的文件.</string>
+ <string name="conflict_keep_both">都保留</string>
+ <string name="conflict_overwrite">覆寫</string>
+ <string name="conflict_dont_upload">不要上載</string>
+ <string name="preview_image_description">圖片預覽</string>
+ <string name="preview_image_error_unknown_format">無法顯示圖片</string>
+ <string name="actionbar_failed_instant_upload">即時上傳失敗</string>
+ <string name="failed_upload_headline_text">即時上傳失敗</string>
+ <string name="failed_upload_headline_hint">所有即時上傳失敗的記錄</string>
+ <string name="failed_upload_all_cb">全部選取</string>
+ <string name="failed_upload_headline_retryall_btn">重新上傳選取的檔案</string>
+ <string name="failed_upload_headline_delete_all_btn">刪除所有被選取的檔案</string>
+ <string name="failed_upload_retry_text">重新上傳這個檔案: </string>
+ <string name="failed_upload_load_more_images">載入更多的檔案</string>
+ <string name="failed_upload_retry_do_nothing_text">未連線, 所以無法使用上傳功能</string>
+ <string name="failed_upload_failure_text">失敗訊息: </string>
+ <string name="failed_upload_quota_exceeded_text">請檢查你的伺服器設定, 可能你的額度已超過.</string>
+ <string name="activity_chooser_send_file_title">寄出</string>
+ <string name="copy_link">複製連結</string>
+ <string name="clipboard_text_copied">複製至剪貼簿中</string>
</resources>
+++ /dev/null
-<?xml version='1.0' encoding='UTF-8'?>
-<resources/>
-->
<!-- Default boolean values -->
<resources>
- <bool name="large_layout">false</bool>
+ <bool name="large_land_layout">false</bool>
</resources>
\ No newline at end of file
<color name="filelist_icon_backgorund">#DDDDDD</color>
<color name="owncloud_blue_bright">#00ddff</color>
- <color name="owncloud_white">#F7F7F7</color>
</resources>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <!-- constants that must be respected by the authorization server; if changed, the app must be rebuild -->
+ <string name="oauth2_redirect_scheme">owncloud</string>
+ <string name="oauth2_redirect_uri">owncloud://callback</string>
+
+ <!-- values that should be provided by ownCloud server -->
+ <string name="oauth2_url_endpoint_auth">http://oauth2.authorization.server.org/paht/to/endpoint/for/authorization</string>
+ <string name="oauth2_url_endpoint_access">http://oauth2.authorization.server.org/paht/to/endporint/for/access/token</string>
+ <string name="oauth2_scope">owncloud</string>
+ <string name="oauth2_grant_type">authorization_code</string> <!-- the only one supported right now -->
+ <string name="oauth2_response_type">code</string> <!-- depends on oauth2_grant_type -->
+
+ <!-- values that should be pre-agreed between app and authorization server, but can be loaded without rebuilding the app -->
+ <string name="oauth2_client_id">com.owncloud.android</string> <!-- preferable that client decides this -->
+ <string name="oauth2_client_secret"></string> <!-- preferable that client decides this -->
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <!-- App name and other strings-->
+ <string name="app_name">ownCloud</string>
+ <string name="account_type">owncloud</string> <!-- better if was a domain name; but changing it now would require migrate accounts when the app is updated -->
+ <string name="authority">org.owncloud</string> <!-- better if was the app package with ".provider" appended ; it identifies the provider -->
+ <string name ="db_file">owncloud.db</string>
+ <string name ="db_name">ownCloud</string>
+ <string name ="data_folder">owncloud</string>
+ <string name ="log_name">Owncloud_</string>
+ <string name ="default_display_name_for_root_folder">ownCloud</string>
+
+ <!-- URLs and flags related -->
+ <string name="server_url"></string>
+ <bool name="show_server_url_input">true</bool>
+ <bool name="show_welcome_link">true</bool>
+ <string name="welcome_link_url">"https://owncloud.com/mobile/new"</string>
+ <string name="share_api_link"></string>
+
+ <!-- Flags to setup the authentication methods available in the app -->
+ <string name="auth_method_oauth2">off</string>
+ <string name="auth_method_saml_web_sso">off</string>
+
+ <!-- Flags to enable/disable some features -->
+ <string name = "send_files_to_other_apps">on</string>
+
+
+ <!-- Colors -->
+ <color name="login_background_color">#FFFFFF</color>
+ <color name="login_logo_background_color">#FFFFFF</color>
+ <color name="background_color">#F7F7F7</color>
+ <color name="actionbar_start_color">#1D2D44</color>
+ <color name="actionbar_end_color">#1D2D44</color>
+
+ <!-- Button -->
+ <color name="button_text_color">#000000</color>
+
+ <!-- Multiaccount support -->
+ <bool name="multiaccount_support">true</bool>
+
+ <!-- Help, imprint and feedback -->
+ <bool name="help_enabled">true</bool>
+ <bool name="imprint_enabled">false</bool>
+ <bool name="recommend_enabled">true</bool>
+ <bool name="feedback_enabled">true</bool>
+ <string name="url_help">http://owncloud.com/mobile/help</string>
+ <string name="url_imprint"></string>
+ <string name="mail_recommend">"mailto:"</string>
+ <string name="mail_feedback">"mailto:apps@owncloud.com"</string>
+ <string name="url_app_download">"https://play.google.com/store/apps/details?id=com.owncloud.android"</string>
+
+</resources>
+
+
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <string name="app_name">ownCloud</string>
- <string name="main_password">Password:</string>
- <string name="main_login">Username:</string>
- <string name="main_button_login">Login</string>
- <string name="main_welcome">Welcome</string>
- <string name="main_files">Files</string>
- <string name="main_music">Music</string>
- <string name="main_contacts">Contacts</string>
- <string name="main_calendar">Calendar</string>
- <string name="main_bookmarks">Bookmarks</string>
- <string name="main_settings">Settings</string>
- <string name="main_tit_accsetup">Setup Account</string>
- <string name="main_wrn_accsetup">There is no account set up on your device. In order to use this App, you need to create one.</string>
<string name="about_android">%1$s Android App</string>
<string name="about_version">version %1$s</string>
- <string name="actionbar_sync">Refresh</string>
+ <string name="actionbar_sync">Refresh account</string>
<string name="actionbar_upload">Upload</string>
<string name="actionbar_upload_from_apps">Content from other apps</string>
<string name="actionbar_upload_files">Files</string>
- <string name="actionbar_mkdir">Create directory</string>
- <string name="actionbar_search">Search</string>
+ <string name="actionbar_open_with">Open with</string>
+ <string name="actionbar_mkdir">New folder</string>
<string name="actionbar_settings">Settings</string>
<string name="actionbar_see_details">Details</string>
-
+ <string name="actionbar_send_file">Send</string>
<string name="prefs_category_general">General</string>
- <string name="prefs_add_session">Add new session</string>
- <string name="prefs_create_img_thumbnails">Create image thumbnails</string>
- <string name="prefs_select_oc_account">Select an account</string>
- <string name="prefs_summary_select_oc_account">Choose which of your accounts the app should use.</string>
- <string name="prefs_trackmydevice">Device Tracking</string>
- <string name="prefs_trackmydevice_summary_off">Enable this App to track your device location</string>
- <string name="prefs_trackmydevice_summary_on">This App keeps track of this device</string>
- <string name="prefs_trackmydevice_interval">Update Interval</string>
- <string name="prefs_trackmydevice_interval_summary">Update every %1$s minutes</string>
+ <string name="prefs_category_more">More</string>
<string name="prefs_accounts">Accounts</string>
<string name="prefs_manage_accounts">Manage Accounts</string>
<string name="prefs_pincode">App PIN</string>
<string name="prefs_log_title_history">Logging History</string>
<string name="prefs_log_summary_history">This shows the recorded logs</string>
<string name="prefs_log_delete_history_button">Delete History</string>
+ <string name="prefs_help">Help</string>
+ <string name="prefs_recommend">Recommend to a friend</string>
+ <string name="prefs_feedback">Feedback</string>
+ <string name="prefs_imprint">Imprint</string>
- <string name="auth_host_url">URL</string>
+ <string name="recommend_subject">"Try %1$s on your smartphone!"</string>
+ <string name="recommend_text">"I want to invite you to use %1$s on your smartphone!\nDownload here: %2$s"
+ </string>
+
+ <string name="auth_check_server">Check Server</string>
+ <string name="auth_host_url">Server address https://…</string>
<string name="auth_username">Username</string>
<string name="auth_password">Password</string>
- <string name="auth_register">I am new to %1$s</string>
- <string name="new_session_uri_error">Incorrect address given</string>
- <string name="new_session_session_name_error">Incorrect session name</string>
+ <string name="auth_register">New to %1$s?</string>
<string name="sync_string_files">Files</string>
- <string name="uploader_no_file_selected">No file selected for upload</string>
- <string name="setup_hint_username">Username</string>
- <string name="setup_hint_password">Password</string>
- <string name="setup_hint_address">Web address</string>
- <string name="setup_hint_show_password">Show password?</string>
- <string name="setup_title">Connect to your %1$s</string>
<string name="setup_btn_connect">Connect</string>
<string name="uploader_btn_upload_text">Upload</string>
- <string name="uploader_top_message">Choose upload directory:</string>
+ <string name="uploader_top_message">Choose upload folder:</string>
<string name="uploader_wrn_no_account_title">No account found</string>
<string name="uploader_wrn_no_account_text">There are no %1$s accounts on your device. Please setup an account first.</string>
<string name="uploader_wrn_no_account_setup_btn_text">Setup</string>
<string name="uploader_wrn_no_content_text">No content was received. Nothing to upload.</string>
<string name="uploader_error_forbidden_content">%1$s is not allowed to access the shared content</string>
<string name="uploader_info_uploading">Uploading</string>
- <string name="uploader_btn_create_dir_text">Create directory for upload</string>
<string name="file_list_empty">There are no files in this folder.\nNew files can be added with the \"Upload\" menu option.</string>
<string name="filedetails_select_file">Tap on a file to display additional information.</string>
<string name="filedetails_size">Size:</string>
<string name="filedetails_created">Created:</string>
<string name="filedetails_modified">Modified:</string>
<string name="filedetails_download">Download</string>
- <string name="filedetails_sync_file">Refresh</string>
- <string name="filedetails_redownload">Redownload</string>
- <string name="filedetails_open">Open</string>
+ <string name="filedetails_sync_file">Refresh file</string>
<string name="filedetails_renamed_in_upload_msg">File was renamed to %1$s during upload</string>
+ <string name="action_share_file">Share link</string>
+ <string name="action_unshare_file">Unshare link</string>
<string name="common_yes">Yes</string>
<string name="common_no">No</string>
<string name="common_ok">OK</string>
<string name="common_cancel_upload">Cancel upload</string>
<string name="common_cancel">Cancel</string>
<string name="common_save_exit">Save & Exit</string>
- <string name="common_exit">Leave %1$s</string>
<string name="common_error">Error</string>
<string name="common_loading">Loading …</string>
<string name="common_error_unknown">Unknown error</string>
<string name="about_title">About</string>
+ <string name="change_password">Change password</string>
<string name="delete_account">Delete account</string>
<string name="create_account">Create account</string>
<string name="upload_chooser_title">Upload from …</string>
- <string name="uploader_info_dirname">Directory name</string>
+ <string name="uploader_info_dirname">Folder name</string>
<string name="uploader_upload_in_progress_ticker">Uploading …</string>
<string name="uploader_upload_in_progress_content">%1$d%% Uploading %2$s</string>
<string name="uploader_upload_succeeded_ticker">Upload succeeded</string>
<string name="uploader_upload_succeeded_content_single">%1$s was successfully uploaded</string>
- <string name="uploader_upload_succeeded_content_multiple">%1$d files were successfully uploaded</string>
<string name="uploader_upload_failed_ticker">Upload failed</string>
<string name="uploader_upload_failed_content_single">Upload of %1$s could not be completed</string>
- <string name="uploader_upload_failed_content_multiple">Upload failed: %1$d/%2$d files were upload</string>
<string name="downloader_download_in_progress_ticker">Downloading …</string>
<string name="downloader_download_in_progress_content">%1$d%% Downloading %2$s</string>
<string name="downloader_download_succeeded_ticker">Download succeeded</string>
<string name="downloader_download_failed_content">Download of %1$s could not be completed</string>
<string name="downloader_not_downloaded_yet">Not downloaded yet</string>
<string name="common_choose_account">Choose account</string>
- <string name="sync_string_contacts">Contacts</string>
<string name="sync_fail_ticker">Synchronization failed</string>
<string name="sync_fail_content">Synchronization of %1$s could not be completed</string>
- <string name="sync_conflicts_in_favourites_ticker">Conflicts found</string>
- <string name="sync_conflicts_in_favourites_content">%1$d kept-in-sync files could not be sync\'ed</string>
+ <string name="sync_fail_content_unauthorized">Invalid password for %1$s</string>
+ <string name="sync_conflicts_in_favourites_ticker">Conflicts found</string>
+ <string name="sync_conflicts_in_favourites_content">%1$d kept-in-sync files could not be sync\'ed</string>
<string name="sync_fail_in_favourites_ticker">Kept-in-sync files failed</string>
<string name="sync_fail_in_favourites_content">Contents of %1$d files could not be sync\'ed (%2$d conflicts)</string>
<string name="sync_foreign_files_forgotten_ticker">Some local files were forgotten</string>
- <string name="sync_foreign_files_forgotten_content">%1$d files out of the %2$s directory could not be copied into</string>
- <string name="sync_foreign_files_forgotten_explanation">"As of version 1.3.16, files uploaded from this device are copied into the local %1$s folder to prevent data loss when a single file is synced with multiple accounts.\n\nDue to this change, all files uploaded in previous versions of this app were copied into the %2$s folder. However, an error prevented the completion of this operation during account synchronization. You may either leave the file(s) as is and remove the link to %3$s, or move the file(s) into the %1$s directory and retain the link to %4$s.\n\nListed below are the local file(s), and the the remote file(s) in %5$s they were linked to.</string>
+ <string name="sync_foreign_files_forgotten_content">%1$d files out of the %2$s folder could not be copied into</string>
+ <string name="sync_foreign_files_forgotten_explanation">As of version 1.3.16, files uploaded from this device are copied into the local %1$s folder to prevent data loss when a single file is synced with multiple accounts.\n\nDue to this change, all files uploaded in previous versions of this app were copied into the %2$s folder. However, an error prevented the completion of this operation during account synchronization. You may either leave the file(s) as is and remove the link to %3$s, or move the file(s) into the %1$s folder and retain the link to %4$s.\n\nListed below are the local file(s), and the remote file(s) in %5$s they were linked to.</string>
+ <string name="sync_current_folder_was_removed">Folder %1$s does not exist anymore</string>
<string name="foreign_files_move">"Move all"</string>
<string name="foreign_files_success">"All files were moved"</string>
<string name="foreign_files_fail">"Some files could not be moved"</string>
<string name="foreign_files_local_text">"Local: %1$s"</string>
<string name="foreign_files_remote_text">"Remote: %1$s"</string>
<string name="upload_query_move_foreign_files">There is not space enough to copy the selected files into the %1$s folder. Would like to move them into instead? </string>
- <string name="use_ssl">Use Secure Connection</string>
- <string name="location_no_provider">%1$s cannot track your device. Please check your location settings</string>
<string name="pincode_enter_pin_code">Please, insert your App PIN</string>
- <string name="pincode_enter_new_pin_code">Please, insert your new App PIN</string>
+
<string name="pincode_configure_your_pin">Enter your App PIN</string>
<string name="pincode_configure_your_pin_explanation">The PIN will be requested every time the app is started</string>
<string name="pincode_reenter_your_pincode">Please, reenter your App PIN</string>
<string name="media_event_done">"%1$s playback finished"</string>
<string name="media_err_nothing_to_play">No media file found</string>
<string name="media_err_no_account">No account provided</string>
- <string name="media_err_not_in_owncloud">File not in a valid account</string>
- <string name="media_err_unsupported">Unsupported media codec</string>
- <string name="media_err_io">Media file could not be read</string>
- <string name="media_err_malformed">Media file not correctly encoded</string>
- <string name="media_err_timeout">Too much time trying to play</string>
- <string name="media_err_invalid_progressive_playback">Media file cannot be streamed</string>
- <string name="media_err_unknown">Media file cannot be played with the stock media player</string>
- <string name="media_err_security_ex">Security error trying to play %1$s</string>
+ <string name="media_err_not_in_owncloud">File not in a valid account</string>
+ <string name="media_err_unsupported">Unsupported media codec</string>
+ <string name="media_err_io">Media file could not be read</string>
+ <string name="media_err_malformed">Media file not correctly encoded</string>
+ <string name="media_err_timeout">Timed out while trying to play</string>
+ <string name="media_err_invalid_progressive_playback">Media file cannot be streamed</string>
+ <string name="media_err_unknown">Media file cannot be played with the stock media player</string>
+ <string name="media_err_security_ex">Security error trying to play %1$s</string>
<string name="media_err_io_ex">Input error trying to play %1$s</string>
<string name="media_err_unexpected">Unexpected error trying to play %1$s</string>
- <string name="media_previous_description">Previous track button</string>
<string name="media_rewind_description">Rewind button</string>
<string name="media_play_pause_description">Play or pause button</string>
<string name="media_forward_description">Fast forward button</string>
- <string name="media_next_description">Next track button</string>
- <string-array name="prefs_trackmydevice_intervall_keys">
- <item>15 Minutes</item>
- <item>30 Minutes</item>
- <item>60 Minutes</item>
- </string-array>
- <string-array name="prefs_trackmydevice_intervall_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- </string-array>
- <string name="auth_trying_to_login">Trying to login...</string>
- <string name="auth_no_net_conn_title">No network connection</string>
- <string name="auth_no_net_conn_message">No network connection has been detected, check your Internet connection and try again.</string>
- <string name="auth_connect_anyway">Connect anyway</string>
- <string name="auth_nossl_plain_ok_title">Secure connection unavailable.</string>
- <string name="auth_nossl_plain_ok_message">The Application cannot establish a secure connection to the server. A non secure connection is available. You may continue or cancel.</string>
- <string name="auth_connection_established">Connection established</string>
- <string name="auth_testing_connection">Testing connection...</string>
- <string name="auth_not_configured_title">Malformed server configuration</string>
- <string name="auth_not_configured_message">It seems that your server instance is not correctly configured. Contact your administrator for more details.</string>
- <string name="auth_unknown_error_title">Unknown error occurred!</string>
- <string name="auth_unknown_error_message">An unknown error occurred. Please contact support and include logs from your device.</string>
- <string name="auth_unknown_host_title">Couldn\'t find host</string>
- <string name="auth_unknown_host_message">Couldn\'t find the entered host. Please check hostname and server availability and try again.</string>
- <string name="auth_incorrect_path_title">Server instance not found</string>
- <string name="auth_incorrect_path_message">Application couldn\'t find a server instance at the given path. Please check your path and try again.</string>
- <string name="auth_timeout_title">The server took too long to respond</string>
- <string name="auth_incorrect_address_title">Malformed URL</string>
- <string name="auth_ssl_general_error_title">SSL initialization failed</string>
- <string name="auth_ssl_unverified_server_title">Unverified SSL server\'s identity</string>
- <string name="auth_bad_oc_version_title">Unrecognized server version</string>
- <string name="auth_wrong_connection_title">Couldn\'t establish connection</string>
- <string name="auth_secure_connection">Secure connection established</string>
- <string name="auth_login_details">Login details</string>
- <string name="auth_unauthorized">Invalid login / password</string>
- <string name="auth_not_found">Wrong path given</string>
- <string name="auth_internal">Internal server error, code %1$d</string>
- <string name="crashlog_message">Application terminated unexpectedly. Would you like to submit a crash report?</string>
- <string name="crashlog_send_report">Send report</string>
- <string name="crashlog_dont_send_report">Don\'t send report</string>
- <string name="extensions_avail_title">Extensions available!</string>
- <string name="extensions_avail_message">Looks like your server instance is supporting advanced extensions. Would you like to see extensions available for android ?</string>
+ <string name="auth_getting_authorization">Getting authorization…</string>
+ <string name="auth_trying_to_login">Trying to login…</string>
+ <string name="auth_no_net_conn_title">No network connection</string>
+ <string name="auth_nossl_plain_ok_title">Secure connection unavailable.</string>
+ <string name="auth_connection_established">Connection established</string>
+ <string name="auth_testing_connection">Testing connection…</string>
+ <string name="auth_not_configured_title">Malformed server configuration</string>
+ <string name="auth_account_not_new">An account for the same user and server already exists in the device</string>
+ <string name="auth_account_not_the_same">The entered user does not match the user of this account</string>
+ <string name="auth_unknown_error_title">Unknown error occurred!</string>
+ <string name="auth_unknown_host_title">Couldn\'t find host</string>
+ <string name="auth_incorrect_path_title">Server instance not found</string>
+ <string name="auth_timeout_title">The server took too long to respond</string>
+ <string name="auth_incorrect_address_title">Malformed URL</string>
+ <string name="auth_ssl_general_error_title">SSL initialization failed</string>
+ <string name="auth_ssl_unverified_server_title">Couldn\'t verify SSL server\'s identity</string>
+ <string name="auth_bad_oc_version_title">Unrecognized server version</string>
+ <string name="auth_wrong_connection_title">Couldn\'t establish connection</string>
+ <string name="auth_secure_connection">Secure connection established</string>
+ <string name="auth_unauthorized">Wrong username or password</string>
+ <string name="auth_oauth_error">Unsuccessful authorization</string>
+ <string name="auth_oauth_error_access_denied">Access denied by authorization server</string>
+ <string name="auth_wtf_reenter_URL">Unexpected state; please, enter the server URL again</string>
+ <string name="auth_expired_oauth_token_toast">Your authorization expired. Please, authorize again</string>
+ <string name="auth_expired_basic_auth_toast">Please, enter the current password</string>
+ <string name="auth_expired_saml_sso_token_toast">Your session expired. Please connect again</string>
+ <string name="auth_connecting_auth_server">Connecting to authentication server…</string>
+ <string name="auth_unsupported_auth_method">The server does not support this authentication method</string>
+ <string name="auth_unsupported_multiaccount">%1$s does not support multiple accounts</string>
+ <string name="auth_fail_get_user_name">Your server is not returning a correct user id, please contact an administrator
+ </string>
+ <string name="auth_can_not_auth_against_server">Can not authenticate against this server</string>
+
<string name="fd_keep_in_sync">Keep file up to date</string>
- <string name="common_share">Share</string>
<string name="common_rename">Rename</string>
<string name="common_remove">Remove</string>
<string name="confirmation_remove_alert">"Do you really want to remove %1$s ?"</string>
<string name="rename_server_fail_msg">"Rename could not be completed"</string>
<string name="sync_file_fail_msg">Remote file could not be checked</string>
<string name="sync_file_nothing_to_do_msg">File contents already synchronized</string>
- <string name="create_dir_fail_msg">Directory could not be created</string>
+ <string name="create_dir_fail_msg">Folder could not be created</string>
+ <string name="filename_forbidden_characters">Forbidden characters: / \\ < > : " | ? *</string>
<string name="wait_a_moment">Wait a moment</string>
<string name="filedisplay_unexpected_bad_get_content">"Unexpected problem ; please select the file from a different app"</string>
<string name="filedisplay_no_file_selected">No file was selected</string>
- <string name="ssl_validator_title">Warning</string>
+ <string name="activity_chooser_title">Send link to …</string>
+
+ <string name="oauth_check_onoff">Login with oAuth2</string>
+ <string name="oauth_login_connection">Connecting to oAuth2 server…</string>
+
<string name="ssl_validator_header">The identity of the site could not be verified</string>
<string name="ssl_validator_reason_cert_not_trusted">- The server certificate is not trusted</string>
<string name="ssl_validator_reason_cert_expired">- The server certificate expired</string>
<string name="ssl_validator_reason_cert_not_yet_valid">- The server certificate valid dates are in the future</string>
<string name="ssl_validator_reason_hostname_not_verified">- The URL does not match the hostname in the certificate</string>
- <string name="ssl_validator_certificate_not_available">The server certificate could not be obtained</string>
<string name="ssl_validator_question">Do you want to trust this certificate anyway?</string>
<string name="ssl_validator_not_saved">The certificate could not be saved</string>
<string name="ssl_validator_btn_details_see">Details</string>
<string name="ssl_validator_label_validity_to">To:</string>
<string name="ssl_validator_label_signature">Signature:</string>
<string name="ssl_validator_label_signature_algorithm">Algorithm:</string>
+ <string name="ssl_validator_null_cert">The certificate could not be shown.</string>
+ <string name="ssl_validator_no_info_about_error">- No information about the error</string>
<string name="placeholder_sentence">This is a placeholder</string>
<string name="placeholder_filename">placeholder.txt</string>
<string name="preview_image_description">Image preview</string>
<string name="preview_image_error_unknown_format">This image can not be shown</string>
- <string name="preview_image_error_out_of_memory">"Not enough memory to show this image</string>
- <!-- we need to improve the communication of errors to the user -->
- <string name="error__upload__local_file_not_copied">%1$s could not be copied to %2$s local directory</string>
- <string name="actionbar_failed_instant_upload">Failed InstantUpload"</string>
+ <string name="error__upload__local_file_not_copied">%1$s could not be copied to %2$s local folder</string>
+ <string name="actionbar_failed_instant_upload">Failed InstantUpload</string>
<string name="failed_upload_headline_text">Failed instant uploads</string>
<string name="failed_upload_headline_hint">Summary of all failed instant uploads</string>
<string name="failed_upload_all_cb">select all</string>
<string name="failed_upload_retry_do_nothing_text">do nothing you are not online for instant upload</string>
<string name="failed_upload_failure_text">Failure Message: </string>
<string name="failed_upload_quota_exceeded_text">Please check your server configuration,maybe your quota is exceeded.</string>
+
+ <string name="share_link_no_support_share_api">Sorry, sharing is not enabled on your server. Please contact your
+ administrator.</string>
+ <string name="share_link_file_no_exist">Unable to share this file or folder. Please, make sure it exists</string>
+ <string name="share_link_file_error">An error occurred while trying to share this file or folder</string>
+ <string name="unshare_link_file_no_exist">Unable to unshare this file or folder. It does not exist.</string>
+ <string name="unshare_link_file_error">An error occurred while trying to unshare this file or folder</string>
+
+ <string name="activity_chooser_send_file_title">Send</string>
+
+ <string name="copy_link">Copy link</string>
+ <string name="clipboard_text_copied">Copied to clipboard</string>
+
+ <string name="error_cant_bind_to_operations_service">Critical error: can not perform operations</string>
</resources>
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
-<resources>
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="Animations" />
- <!-- Default ownCloud app style -->
+ <!-- General ownCloud app style -->
<style name="Theme.ownCloud" parent="style/Theme.Sherlock.Light.DarkActionBar">
<item name="android:actionBarStyle">@style/Theme.ownCloud.Widget.ActionBar</item>
<item name="actionBarStyle">@style/Theme.ownCloud.Widget.ActionBar</item>
+ <item name="android:buttonStyle">@style/Theme.ownCloud.ButtonStyle</item>
+ <item name="actionDropDownStyle">@style/Theme.ownCloud.DropDownStyle</item>
+ <item name="android:actionDropDownStyle">@style/Theme.ownCloud.DropDownStyle</item>
</style>
<style name="Theme.ownCloud.noActionBar" parent="style/Theme.Sherlock.Light.NoActionBar">
<item name="android:actionBarStyle">@style/Theme.ownCloud.Widget.ActionBar</item>
<item name="actionBarStyle">@style/Theme.ownCloud.Widget.ActionBar</item>
- </style>
+ <item name="android:buttonStyle">@style/Theme.ownCloud.ButtonStyle</item>
+ <item name="actionDropDownStyle">@style/Theme.ownCloud.DropDownStyle</item>
+ <item name="android:actionDropDownStyle">@style/Theme.ownCloud.DropDownStyle</item>
+ </style>
+
+ <style name="Theme.ownCloud.Fullscreen" parent="style/Theme.Sherlock.NoActionBar">
+ <item name="android:actionBarStyle">@style/Theme.ownCloud.Widget.ActionBar</item>
+ <item name="actionBarStyle">@style/Theme.ownCloud.Widget.ActionBar</item>
+ <item name="android:windowFullscreen">true</item>
+ <item name="actionDropDownStyle">@style/Theme.ownCloud.DropDownStyle</item>
+ <item name="android:actionDropDownStyle">@style/Theme.ownCloud.DropDownStyle</item>
+ </style>
+
-
<style name="Theme.ownCloud.Widget.ActionBar" parent="style/Widget.Sherlock.Light.ActionBar.Solid.Inverse">
<item name="android:background">@drawable/main_header_bg</item>
<item name="background">@drawable/main_header_bg</item>
<item name="android:shadowRadius">1</item>
<item name="android:shadowDy">1</item>
<item name="android:backgroundSplit">@drawable/split_action_bg</item>
+ <item name="android:indeterminateProgressStyle">@style/Theme.ownCloud.IndeterminateStyle</item>
+ <item name="indeterminateProgressStyle">@style/Theme.ownCloud.IndeterminateStyle</item>
+ </style>
+
+ <!-- Dialogs -->
+ <style name="Theme.ownCloud.Dialog" parent="@android:style/Theme.Dialog">
</style>
<!-- PopDownMenu -->
<item name="android:singleLine">true</item>
</style>
+
+ <style name="OAuthDialog" parent="@android:style/Theme.Dialog">
+ <item name="android:windowNoTitle">false</item>
+ </style>
<color name="setup_text_hint">#777777</color>
<color name="setup_text_typed">#000000</color>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ownCloud Android client application
-
- Copyright (C) 2012-2013 ownCloud Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License version 2,
- as published by the Free Software Foundation.
-
- 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.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
--->
-<resources>
- <string name="url_account_register">"https://owncloud.com/mobile/new"</string>
-</resources>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- Buttons -->
+ <style name="Theme.ownCloud.ButtonStyle" parent="@android:style/Widget.Button">
+ <item name="android:background">@android:drawable/btn_default</item>
+ <item name="android:textColor">@color/button_text_color</item>
+ </style>
+
+ <!-- DropDown -->
+ <style name="Theme.ownCloud.DropDownStyle" parent="style/Widget.Sherlock.Spinner.DropDown.ActionBar">
+ <item name="android:background">@drawable/abs__spinner_ab_holo_dark</item>
+ </style>
+
+ <style name="Theme.ownCloud.IndeterminateStyle" parent="style/Widget.Sherlock.ProgressBar">
+ <item name="android:indeterminateDrawable">@drawable/abs__progress_medium_holo</item>
+ </style>
+
+ <!-- Notifications -->
+ <style name="Theme.ownCloud.NotificationText.Title"
+ parent="@android:style/TextAppearance">
+ <item name="android:textColor">#ff000000</item>
+ <item name="android:textSize">18sp</item>
+ <item name="android:textStyle">bold</item>
+ </style>
+ <style name="Theme.ownCloud.NotificationText.Content"
+ parent="@android:style/TextAppearance">
+ <item name="android:textColor">#ff000000</item>
+ <item name="android:textSize">14sp</item>
+ </style>
+</resources>
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
- android:accountType="owncloud"
+ android:accountType="@string/account_type"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:smallIcon="@drawable/icon">
android:title="@string/prefs_select_oc_account"
android:summary="@string/prefs_summary_select_oc_account"
/ -->
- <Preference android:title="@string/prefs_manage_accounts" android:key="manage_account" />
- <CheckBoxPreference android:title="@string/prefs_pincode" android:key="set_pincode"
+ <com.owncloud.android.ui.PreferenceMultiline android:title="@string/prefs_manage_accounts" android:key="manage_account" />
+ <com.owncloud.android.ui.CheckBoxPreferenceWithLongTitle android:title="@string/prefs_pincode" android:key="set_pincode"
android:summary="@string/prefs_pincode_summary"/>
- <CheckBoxPreference android:key="instant_uploading"
+ <com.owncloud.android.ui.CheckBoxPreferenceWithLongTitle android:key="instant_uploading"
android:title="@string/prefs_instant_upload"
android:summary="@string/prefs_instant_upload_summary"/>
- <CheckBoxPreference android:dependency="instant_uploading"
+ <com.owncloud.android.ui.CheckBoxPreferenceWithLongTitle android:dependency="instant_uploading"
android:disableDependentsState="true"
android:title="@string/instant_upload_on_wifi"
android:key="instant_upload_on_wifi"/>
- <CheckBoxPreference android:key="log_to_file"
+ <!-- DISABLED FOR RELEASE UNTIL FIXED
+ CheckBoxPreference android:key="log_to_file"
android:title="@string/prefs_log_title"
android:summary="@string/prefs_log_summary"/>
<Preference android:key="log_history"
android:title="@string/prefs_log_title_history"
- android:summary="@string/prefs_log_summary_history"/>
+ android:summary="@string/prefs_log_summary_history"/ -->
+
+ </PreferenceCategory>
+
+ <PreferenceCategory android:title="@string/prefs_category_more" android:key="more">
+ <Preference android:title="@string/prefs_help" android:key="help" />
+ <Preference android:title="@string/prefs_recommend" android:key="recommend" />
+ <Preference android:title="@string/prefs_feedback" android:key="feedback" />
+ <Preference android:title="@string/prefs_imprint" android:key="imprint" />
+
<Preference android:id="@+id/about_app"
android:title="@string/about_title"
android:key="about_app" />
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ownCloud Android client application
-
- Copyright (C) 2012 Bartek Przybylski
- Copyright (C) 2012-2013 ownCloud Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License version 2,
- as published by the Free Software Foundation.
-
- 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.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
--->
-<PreferenceScreen
- xmlns:android="http://schemas.android.com/apk/res/android">
- <EditTextPreference></EditTextPreference>
- <EditTextPreference></EditTextPreference>
-</PreferenceScreen>
<!-- for the SyncAdapter. -->
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
- android:contentAuthority="org.owncloud"
- android:accountType="owncloud"
+ android:contentAuthority="@string/authority"
+ android:accountType="@string/account_type"
android:supportsUploading="true"
+ android:userVisible="true"
+ android:allowParallelSyncs="true"
+ android:isAlwaysSyncable="true"
/>
-git submodule init
-git submodule update
-android.bat update project -p actionbarsherlock\library --target 1
-android.bat update project -p . --target 1
-cp third_party\android-support-library\android-support-v4.jar actionbarsherlock\library\libs\android-support-v4.jar
-cd tests
-android.bat update test-project -m .. -p .
\ No newline at end of file
+call git submodule init
+call git submodule update
+call android.bat update project -p actionbarsherlock\library -n ActionBarSherlock
+call android.bat update lib-project -p owncloud-android-library
+call android.bat update project -p .
+call android.bat update project -p oc_jb_workaround
+copy /Y third_party\android-support-library\android-support-v4.jar actionbarsherlock\library\libs\android-support-v4.jar
+call android.bat update test-project -p tests -m ..
git submodule init
git submodule update
-android update project -p actionbarsherlock/library
+android update project -p actionbarsherlock/library -n ActionBarSherlock
+android update lib-project -p owncloud-android-library
android update project -p .
+android update project -p oc_jb_workaround
cp third_party/android-support-library/android-support-v4.jar actionbarsherlock/library/libs/android-support-v4.jar
-cd tests
-android update test-project -m .. -p .
+android update test-project -p tests -m ..
+++ /dev/null
-/* ownCloud Android client application\r
- * Copyright (C) 2012 Bartek Przybylski\r
- * Copyright (C) 2012-2013 ownCloud Inc.\r
- *\r
- * This program is free software: you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License version 2,\r
- * as published by the Free Software Foundation.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program. If not, see <http://www.gnu.org/licenses/>.\r
- *\r
- */\r
-\r
-package com.owncloud.android;\r
-\r
-import com.owncloud.android.authenticator.AccountAuthenticator;\r
-import com.owncloud.android.utils.OwnCloudVersion;\r
-\r
-import android.accounts.Account;\r
-import android.accounts.AccountManager;\r
-import android.content.Context;\r
-import android.content.SharedPreferences;\r
-import android.preference.PreferenceManager;\r
-\r
-public class AccountUtils {\r
- public static final String WEBDAV_PATH_1_2 = "/webdav/owncloud.php";\r
- public static final String WEBDAV_PATH_2_0 = "/files/webdav.php";\r
- public static final String WEBDAV_PATH_4_0 = "/remote.php/webdav";\r
- public static final String CARDDAV_PATH_2_0 = "/apps/contacts/carddav.php";\r
- public static final String CARDDAV_PATH_4_0 = "/remote/carddav.php";\r
- public static final String STATUS_PATH = "/status.php";\r
-\r
- /**\r
- * Can be used to get the currently selected ownCloud account in the\r
- * preferences\r
- * \r
- * @param context The current appContext\r
- * @return The current account or first available, if none is available,\r
- * then null.\r
- */\r
- public static Account getCurrentOwnCloudAccount(Context context) {\r
- Account[] ocAccounts = AccountManager.get(context).getAccountsByType(\r
- AccountAuthenticator.ACCOUNT_TYPE);\r
- Account defaultAccount = null;\r
-\r
- SharedPreferences appPreferences = PreferenceManager\r
- .getDefaultSharedPreferences(context);\r
- String accountName = appPreferences\r
- .getString("select_oc_account", null);\r
-\r
- if (accountName != null) {\r
- for (Account account : ocAccounts) {\r
- if (account.name.equals(accountName)) {\r
- defaultAccount = account;\r
- break;\r
- }\r
- }\r
- }\r
- \r
- if (defaultAccount == null && ocAccounts.length != 0) {\r
- // we at least need to take first account as fallback\r
- defaultAccount = ocAccounts[0];\r
- }\r
-\r
- return defaultAccount;\r
- }\r
-\r
- \r
-\r
- /**\r
- * Checks, whether or not there are any ownCloud accounts setup.\r
- * \r
- * @return true, if there is at least one account.\r
- */\r
- public static boolean accountsAreSetup(Context context) {\r
- AccountManager accMan = AccountManager.get(context);\r
- Account[] accounts = accMan\r
- .getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE);\r
- return accounts.length > 0;\r
- }\r
- \r
- \r
- public static boolean setCurrentOwnCloudAccount(Context context, String accountName) {\r
- boolean result = false;\r
- if (accountName != null) {\r
- Account[] ocAccounts = AccountManager.get(context).getAccountsByType(\r
- AccountAuthenticator.ACCOUNT_TYPE);\r
- boolean found = false;\r
- for (Account account : ocAccounts) {\r
- found = (account.name.equals(accountName));\r
- if (found) {\r
- SharedPreferences.Editor appPrefs = PreferenceManager\r
- .getDefaultSharedPreferences(context).edit();\r
- appPrefs.putString("select_oc_account", accountName);\r
- \r
- appPrefs.commit();\r
- result = true;\r
- break;\r
- }\r
- }\r
- }\r
- return result;\r
- }\r
-\r
- /**\r
- * \r
- * @param version version of owncloud\r
- * @return webdav path for given OC version, null if OC version unknown\r
- */\r
- public static String getWebdavPath(OwnCloudVersion version) {\r
- if (version != null) {\r
- if (version.compareTo(OwnCloudVersion.owncloud_v4) >= 0)\r
- return WEBDAV_PATH_4_0;\r
- if (version.compareTo(OwnCloudVersion.owncloud_v3) >= 0\r
- || version.compareTo(OwnCloudVersion.owncloud_v2) >= 0)\r
- return WEBDAV_PATH_2_0;\r
- if (version.compareTo(OwnCloudVersion.owncloud_v1) >= 0)\r
- return WEBDAV_PATH_1_2;\r
- }\r
- return null;\r
- }\r
- \r
- /**\r
- * Constructs full url to host and webdav resource basing on host version\r
- * @param context\r
- * @param account\r
- * @return url or null on failure\r
- */\r
- public static String constructFullURLForAccount(Context context, Account account) {\r
- try {\r
- AccountManager ama = AccountManager.get(context);\r
- String baseurl = ama.getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL);\r
- String strver = ama.getUserData(account, AccountAuthenticator.KEY_OC_VERSION);\r
- OwnCloudVersion ver = new OwnCloudVersion(strver);\r
- String webdavpath = getWebdavPath(ver);\r
-\r
- if (webdavpath == null) return null;\r
- return baseurl + webdavpath;\r
- } catch (Exception e) {\r
- e.printStackTrace();\r
- return null;\r
- }\r
- }\r
-\r
-}\r
+++ /dev/null
-/* ownCloud Android client application\r
- * Copyright (C) 2011 Bartek Przybylski\r
- * Copyright (C) 2012-2013 ownCloud Inc.\r
- *\r
- * This program is free software: you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License version 2,\r
- * as published by the Free Software Foundation.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program. If not, see <http://www.gnu.org/licenses/>.\r
- *\r
- */\r
-\r
-package com.owncloud.android;\r
-\r
-import java.util.Arrays;\r
-import java.util.Date;\r
-import java.util.HashMap;\r
-import java.util.HashSet;\r
-import java.util.Set;\r
-\r
-import android.util.Log;\r
-\r
-/**\r
- * A helper class for some string operations.\r
- * \r
- * @author Bartek Przybylski\r
- * @author David A. Velasco\r
- */\r
-public class DisplayUtils {\r
- \r
- private static String TAG = DisplayUtils.class.getSimpleName(); \r
- \r
- private static final String[] sizeSuffixes = { "B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" };\r
-\r
- private static HashMap<String, String> mimeType2HUmanReadable;\r
- static {\r
- mimeType2HUmanReadable = new HashMap<String, String>();\r
- // images\r
- mimeType2HUmanReadable.put("image/jpeg", "JPEG image");\r
- mimeType2HUmanReadable.put("image/jpg", "JPEG image");\r
- mimeType2HUmanReadable.put("image/png", "PNG image");\r
- mimeType2HUmanReadable.put("image/bmp", "Bitmap image");\r
- mimeType2HUmanReadable.put("image/gif", "GIF image");\r
- mimeType2HUmanReadable.put("image/svg+xml", "JPEG image");\r
- mimeType2HUmanReadable.put("image/tiff", "TIFF image");\r
- // music\r
- mimeType2HUmanReadable.put("audio/mpeg", "MP3 music file");\r
- mimeType2HUmanReadable.put("application/ogg", "OGG music file");\r
-\r
- }\r
-\r
- private static final String TYPE_APPLICATION = "application";\r
- private static final String TYPE_AUDIO = "audio";\r
- private static final String TYPE_IMAGE = "image";\r
- private static final String TYPE_TXT = "text";\r
- private static final String TYPE_VIDEO = "video";\r
- \r
- private static final String SUBTYPE_PDF = "pdf";\r
- private static final String[] SUBTYPES_DOCUMENT = { "msword", "mspowerpoint", "msexcel", \r
- "vnd.oasis.opendocument.presentation",\r
- "vnd.oasis.opendocument.spreadsheet",\r
- "vnd.oasis.opendocument.text"\r
- };\r
- private static Set<String> SUBTYPES_DOCUMENT_SET = new HashSet<String>(Arrays.asList(SUBTYPES_DOCUMENT));\r
- private static final String[] SUBTYPES_COMPRESSED = {"x-tar", "x-gzip", "zip"};\r
- private static final Set<String> SUBTYPES_COMPRESSED_SET = new HashSet<String>(Arrays.asList(SUBTYPES_COMPRESSED));\r
- \r
- /**\r
- * Converts the file size in bytes to human readable output.\r
- * \r
- * @param bytes Input file size\r
- * @return Like something readable like "12 MB"\r
- */\r
- public static String bytesToHumanReadable(long bytes) {\r
- double result = bytes;\r
- int attachedsuff = 0;\r
- while (result > 1024 && attachedsuff < sizeSuffixes.length) {\r
- result /= 1024.;\r
- attachedsuff++;\r
- }\r
- result = ((int) (result * 100)) / 100.;\r
- return result + " " + sizeSuffixes[attachedsuff];\r
- }\r
-\r
- /**\r
- * Removes special HTML entities from a string\r
- * \r
- * @param s Input string\r
- * @return A cleaned version of the string\r
- */\r
- public static String HtmlDecode(String s) {\r
- /*\r
- * TODO: Perhaps we should use something more proven like:\r
- * http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/StringEscapeUtils.html#unescapeHtml%28java.lang.String%29\r
- */\r
-\r
- String ret = "";\r
- for (int i = 0; i < s.length(); ++i) {\r
- if (s.charAt(i) == '%') {\r
- ret += (char) Integer.parseInt(s.substring(i + 1, i + 3), 16);\r
- i += 2;\r
- } else {\r
- ret += s.charAt(i);\r
- }\r
- }\r
- return ret;\r
- }\r
-\r
- /**\r
- * Converts MIME types like "image/jpg" to more end user friendly output\r
- * like "JPG image".\r
- * \r
- * @param mimetype MIME type to convert\r
- * @return A human friendly version of the MIME type\r
- */\r
- public static String convertMIMEtoPrettyPrint(String mimetype) {\r
- if (mimeType2HUmanReadable.containsKey(mimetype)) {\r
- return mimeType2HUmanReadable.get(mimetype);\r
- }\r
- if (mimetype.split("/").length >= 2)\r
- return mimetype.split("/")[1].toUpperCase() + " file";\r
- return "Unknown type";\r
- }\r
- \r
- \r
- /**\r
- * Returns the resource identifier of an image resource to use as icon associated to a \r
- * known MIME type.\r
- * \r
- * @param mimetype MIME type string.\r
- * @return Resource identifier of an image resource.\r
- */\r
- public static int getResourceId(String mimetype) {\r
-\r
- if (mimetype == null || "DIR".equals(mimetype)) {\r
- return R.drawable.ic_menu_archive;\r
- \r
- } else {\r
- String [] parts = mimetype.split("/");\r
- String type = parts[0];\r
- String subtype = (parts.length > 1) ? parts[1] : "";\r
- \r
- if(TYPE_TXT.equals(type)) {\r
- return R.drawable.file_doc;\r
- \r
- } else if(TYPE_IMAGE.equals(type)) {\r
- return R.drawable.file_image;\r
- \r
- } else if(TYPE_VIDEO.equals(type)) {\r
- return R.drawable.file_movie;\r
- \r
- } else if(TYPE_AUDIO.equals(type)) { \r
- return R.drawable.file_sound;\r
- \r
- } else if(TYPE_APPLICATION.equals(type)) {\r
- \r
- if (SUBTYPE_PDF.equals(subtype)) {\r
- return R.drawable.file_pdf;\r
- \r
- } else if (SUBTYPES_DOCUMENT_SET.contains(subtype)) {\r
- return R.drawable.file_doc;\r
-\r
- } else if (SUBTYPES_COMPRESSED_SET.contains(subtype)) {\r
- return R.drawable.file_zip;\r
- }\r
- \r
- }\r
- // problems: RAR, RTF, 3GP are send as application/octet-stream from the server ; extension in the filename should be explicitly reviewed\r
- }\r
-\r
- // default icon\r
- return R.drawable.file;\r
- }\r
-\r
- \r
-\r
- /**\r
- * Converts Unix time to human readable format\r
- * @param miliseconds that have passed since 01/01/1970\r
- * @return The human readable time for the users locale\r
- */\r
- public static String unixTimeToHumanReadable(long milliseconds) {\r
- Date date = new Date(milliseconds);\r
- return date.toLocaleString();\r
- }\r
-}\r
+++ /dev/null
-package com.owncloud.android;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Locale;
-
-import android.util.Log;
-
-
-
-public class Log_OC {
-
-
- private static boolean isEnabled = false;
- private static File logFile;
- private static File folder;
- private static BufferedWriter buf;
-
- public static void i(String TAG, String message){
- // Printing the message to LogCat console
- Log.i(TAG, message);
- // Write the log message to the file
- appendLog(TAG+" : "+message);
- }
-
- public static void d(String TAG, String message){
- Log.d(TAG, message);
- appendLog(TAG+" : "+message);
- }
- public static void d(String TAG, String message, Exception e) {
- Log.d(TAG, message, e);
- appendLog(TAG+" : "+ message+" Exception : "+e.getStackTrace());
- }
- public static void e(String TAG, String message){
- Log.e(TAG, message);
- appendLog(TAG+" : "+message);
- }
-
- public static void e(String TAG, String message, Throwable e) {
- Log.e(TAG, message, e);
- appendLog(TAG+" : "+ message+" Exception : "+e.getStackTrace());
- }
-
- public static void v(String TAG, String message){
- Log.v(TAG, message);
- appendLog(TAG+" : "+message);
- }
-
- public static void w(String TAG, String message) {
- Log.w(TAG,message);
- appendLog(TAG+" : "+message);
- }
-
- public static void wtf(String TAG, String message) {
- Log.wtf(TAG,message);
- appendLog(TAG+" : "+message);
- }
-
- public static void startLogging(String logPath) {
- folder = new File(logPath);
- logFile = new File(folder+File.separator+"log.txt");
-
- if (!folder.exists()) {
- folder.mkdirs();
- }
- if (logFile.exists()) {
- logFile.delete();
- }
- try {
- logFile.createNewFile();
- buf = new BufferedWriter(new FileWriter(logFile, true));
- isEnabled = true;
- appendPhoneInfo();
- }catch (IOException e){
- e.printStackTrace();
- }
- }
-
- public static void stopLogging() {
- SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss",Locale.getDefault());
- String currentDateandTime = sdf.format(new Date());
- if (logFile != null) {
- logFile.renameTo(new File(folder+File.separator+"Owncloud_"+currentDateandTime+".log"));
-
- isEnabled = false;
- try {
- buf.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- }
-
- }
-
- private static void appendPhoneInfo() {
- appendLog("Model : " + android.os.Build.MODEL);
- appendLog("Brand : " + android.os.Build.BRAND);
- appendLog("Product : " + android.os.Build.PRODUCT);
- appendLog("Device : " + android.os.Build.DEVICE);
- appendLog("Version-Codename : " + android.os.Build.VERSION.CODENAME);
- appendLog("Version-Release : " + android.os.Build.VERSION.RELEASE);
- }
-
- private static void appendLog(String text) {
- if (isEnabled) {
- try {
- buf.append(text);
- buf.newLine();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-}
-
-
-
-
-
-
-
-
-}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2013 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package com.owncloud.android;
+
+import android.app.Application;
+import android.content.Context;
+/**
+ * Main Application of the project
+ *
+ * Contains methods to build the "static" strings. These strings were before constants in different classes
+ *
+ * @author masensio
+ */
+public class MainApp extends Application {
+
+ private static Context mContext;
+
+ public void onCreate(){
+ super.onCreate();
+ MainApp.mContext = getApplicationContext();
+ }
+
+ public static Context getAppContext() {
+ return MainApp.mContext;
+ }
+
+ // Methods to obtain Strings referring app_name
+ // From AccountAuthenticator
+ // public static final String ACCOUNT_TYPE = "owncloud";
+ public static String getAccountType() {
+ return getAppContext().getResources().getString(R.string.account_type);
+ }
+
+ // From AccountAuthenticator
+ // public static final String AUTHORITY = "org.owncloud";
+ public static String getAuthority() {
+ return getAppContext().getResources().getString(R.string.authority);
+ }
+
+ // From AccountAuthenticator
+ // public static final String AUTH_TOKEN_TYPE = "org.owncloud";
+ public static String getAuthTokenType() {
+ return getAppContext().getResources().getString(R.string.authority);
+ }
+
+ // From ProviderMeta
+ // public static final String DB_FILE = "owncloud.db";
+ public static String getDBFile() {
+ return getAppContext().getResources().getString(R.string.db_file);
+ }
+
+ // From ProviderMeta
+ // private final String mDatabaseName = "ownCloud";
+ public static String getDBName() {
+ return getAppContext().getResources().getString(R.string.db_name);
+ }
+
+ // data_folder
+ public static String getDataFolder() {
+ return getAppContext().getResources().getString(R.string.data_folder);
+ }
+
+ // log_name
+ public static String getLogName() {
+ return getAppContext().getResources().getString(R.string.log_name);
+ }
+}
+++ /dev/null
-/* ownCloud Android client application\r
- * Copyright (C) 2011 Bartek Przybylski\r
- * Copyright (C) 2012-2013 ownCloud Inc.\r
- *\r
- * This program is free software: you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License version 2,\r
- * as published by the Free Software Foundation.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program. If not, see <http://www.gnu.org/licenses/>.\r
- *\r
- */\r
-package com.owncloud.android;\r
-\r
-/**\r
- * Represents a session to an ownCloud instance\r
- * \r
- * @author Bartek Przybylski\r
- * \r
- */\r
-public class OwnCloudSession {\r
- private String mSessionName;\r
- private String mSessionUrl;\r
- private int mEntryId;\r
-\r
- public OwnCloudSession(String name, String url, int entryId) {\r
- mSessionName = name;\r
- mSessionUrl = url;\r
- mEntryId = entryId;\r
- }\r
-\r
- public void setName(String name) {\r
- mSessionName = name;\r
- }\r
-\r
- public String getName() {\r
- return mSessionName;\r
- }\r
-\r
- public void setUrl(String url) {\r
- mSessionUrl = url;\r
- }\r
-\r
- public String getUrl() {\r
- return mSessionUrl;\r
- }\r
-\r
- public int getEntryId() {\r
- return mEntryId;\r
- }\r
-}\r
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-package com.owncloud.android;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Stack;
-import java.util.Vector;
-
-import com.owncloud.android.authenticator.AccountAuthenticator;
-import com.owncloud.android.datamodel.DataStorageManager;
-import com.owncloud.android.datamodel.FileDataStorageManager;
-import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.files.services.FileUploader;
-import com.owncloud.android.network.OwnCloudClientUtils;
-
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.app.AlertDialog;
-import android.app.AlertDialog.Builder;
-import android.app.Dialog;
-import android.app.ListActivity;
-import android.app.ProgressDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnCancelListener;
-import android.content.DialogInterface.OnClickListener;
-import android.content.Intent;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.provider.MediaStore.Images.Media;
-import android.util.Log;
-import android.view.View;
-import android.view.Window;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.SimpleAdapter;
-import android.widget.Toast;
-
-import com.owncloud.android.R;
-import eu.alefzero.webdav.WebdavClient;
-
-/**
- * This can be used to upload things to an ownCloud instance.
- *
- * @author Bartek Przybylski
- *
- */
-public class Uploader extends ListActivity implements OnItemClickListener, android.view.View.OnClickListener {
- private static final String TAG = "ownCloudUploader";
-
- private Account mAccount;
- private AccountManager mAccountManager;
- private Stack<String> mParents;
- private ArrayList<Parcelable> mStreamsToUpload;
- private boolean mCreateDir;
- private String mUploadPath;
- private static final String[] CONTENT_PROJECTION = { Media.DATA, Media.DISPLAY_NAME, Media.MIME_TYPE, Media.SIZE };
- private DataStorageManager mStorageManager;
- private OCFile mFile;
-
- private final static int DIALOG_NO_ACCOUNT = 0;
- private final static int DIALOG_WAITING = 1;
- private final static int DIALOG_NO_STREAM = 2;
- private final static int DIALOG_MULTIPLE_ACCOUNT = 3;
- //private final static int DIALOG_GET_DIRNAME = 4;
-
- private final static int REQUEST_CODE_SETUP_ACCOUNT = 0;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- getWindow().requestFeature(Window.FEATURE_NO_TITLE);
- mParents = new Stack<String>();
- mParents.add("");
- /*if (getIntent().hasExtra(Intent.EXTRA_STREAM)) {
- prepareStreamsToUpload();*/
- if (prepareStreamsToUpload()) {
- mAccountManager = (AccountManager) getSystemService(Context.ACCOUNT_SERVICE);
- Account[] accounts = mAccountManager.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE);
- if (accounts.length == 0) {
- Log_OC.i(TAG, "No ownCloud account is available");
- showDialog(DIALOG_NO_ACCOUNT);
- } else if (accounts.length > 1) {
- Log_OC.i(TAG, "More then one ownCloud is available");
- showDialog(DIALOG_MULTIPLE_ACCOUNT);
- } else {
- mAccount = accounts[0];
- mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());
- populateDirectoryList();
- }
- } else {
- showDialog(DIALOG_NO_STREAM);
- }
- }
-
- @Override
- protected Dialog onCreateDialog(final int id) {
- final AlertDialog.Builder builder = new Builder(this);
- switch (id) {
- case DIALOG_WAITING:
- ProgressDialog pDialog = new ProgressDialog(this);
- pDialog.setIndeterminate(false);
- pDialog.setCancelable(false);
- pDialog.setMessage(getResources().getString(R.string.uploader_info_uploading));
- return pDialog;
- case DIALOG_NO_ACCOUNT:
- builder.setIcon(android.R.drawable.ic_dialog_alert);
- builder.setTitle(R.string.uploader_wrn_no_account_title);
- builder.setMessage(String.format(getString(R.string.uploader_wrn_no_account_text), getString(R.string.app_name)));
- builder.setCancelable(false);
- builder.setPositiveButton(R.string.uploader_wrn_no_account_setup_btn_text, new OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.ECLAIR_MR1) {
- // using string value since in API7 this
- // constatn is not defined
- // in API7 < this constatant is defined in
- // Settings.ADD_ACCOUNT_SETTINGS
- // and Settings.EXTRA_AUTHORITIES
- Intent intent = new Intent("android.settings.ADD_ACCOUNT_SETTINGS");
- intent.putExtra("authorities", new String[] { AccountAuthenticator.AUTH_TOKEN_TYPE });
- startActivityForResult(intent, REQUEST_CODE_SETUP_ACCOUNT);
- } else {
- // since in API7 there is no direct call for
- // account setup, so we need to
- // show our own AccountSetupAcricity, get
- // desired results and setup
- // everything for ourself
- Intent intent = new Intent(getBaseContext(), AccountAuthenticator.class);
- startActivityForResult(intent, REQUEST_CODE_SETUP_ACCOUNT);
- }
- }
- });
- builder.setNegativeButton(R.string.uploader_wrn_no_account_quit_btn_text, new OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- finish();
- }
- });
- return builder.create();
- /*case DIALOG_GET_DIRNAME:
- final EditText dirName = new EditText(getBaseContext());
- builder.setView(dirName);
- builder.setTitle(R.string.uploader_info_dirname);
- String pathToUpload;
- if (mParents.empty()) {
- pathToUpload = "/";
- } else {
- mCursor = managedQuery(Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_FILE, mParents.peek()), null,
- null, null, null);
- mCursor.moveToFirst();
- pathToUpload = mCursor.getString(mCursor.getColumnIndex(ProviderTableMeta.FILE_PATH))
- + mCursor.getString(mCursor.getColumnIndex(ProviderTableMeta.FILE_NAME)).replace(" ", "%20"); // TODO don't make this ; use WebdavUtils.encode in the right moment
- }
- a a = new a(pathToUpload, dirName);
- builder.setPositiveButton(R.string.common_ok, a);
- builder.setNegativeButton(R.string.common_cancel, new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- dialog.cancel();
- }
- });
- return builder.create();*/
- case DIALOG_MULTIPLE_ACCOUNT:
- CharSequence ac[] = new CharSequence[mAccountManager.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE).length];
- for (int i = 0; i < ac.length; ++i) {
- ac[i] = mAccountManager.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE)[i].name;
- }
- builder.setTitle(R.string.common_choose_account);
- builder.setItems(ac, new OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- mAccount = mAccountManager.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE)[which];
- mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());
- populateDirectoryList();
- }
- });
- builder.setCancelable(true);
- builder.setOnCancelListener(new OnCancelListener() {
- @Override
- public void onCancel(DialogInterface dialog) {
- dialog.cancel();
- finish();
- }
- });
- return builder.create();
- case DIALOG_NO_STREAM:
- builder.setIcon(android.R.drawable.ic_dialog_alert);
- builder.setTitle(R.string.uploader_wrn_no_content_title);
- builder.setMessage(R.string.uploader_wrn_no_content_text);
- builder.setCancelable(false);
- builder.setNegativeButton(R.string.common_cancel, new OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- finish();
- }
- });
- return builder.create();
- default:
- throw new IllegalArgumentException("Unknown dialog id: " + id);
- }
- }
-
- class a implements OnClickListener {
- String mPath;
- EditText mDirname;
-
- public a(String path, EditText dirname) {
- mPath = path;
- mDirname = dirname;
- }
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Uploader.this.mUploadPath = mPath + mDirname.getText().toString();
- Uploader.this.mCreateDir = true;
- uploadFiles();
- }
- }
-
- @Override
- public void onBackPressed() {
-
- if (mParents.size() <= 1) {
- super.onBackPressed();
- return;
- } else {
- mParents.pop();
- populateDirectoryList();
- }
- }
-
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- // click on folder in the list
- Log_OC.d(TAG, "on item click");
- Vector<OCFile> tmpfiles = mStorageManager.getDirectoryContent(mFile);
- if (tmpfiles.size() <= 0) return;
- // filter on dirtype
- Vector<OCFile> files = new Vector<OCFile>();
- for (OCFile f : tmpfiles)
- if (f.isDirectory())
- files.add(f);
- if (files.size() < position) {
- throw new IndexOutOfBoundsException("Incorrect item selected");
- }
- mParents.push(files.get(position).getFileName());
- populateDirectoryList();
- }
-
- @Override
- public void onClick(View v) {
- // click on button
- switch (v.getId()) {
- case R.id.uploader_choose_folder:
- mUploadPath = ""; // first element in mParents is root dir, represented by ""; init mUploadPath with "/" results in a "//" prefix
- for (String p : mParents)
- mUploadPath += p + OCFile.PATH_SEPARATOR;
- Log_OC.d(TAG, "Uploading file to dir " + mUploadPath);
-
- uploadFiles();
-
- break;
- /*case android.R.id.button1: // dynamic action for create aditional dir
- showDialog(DIALOG_GET_DIRNAME);
- break;*/
- default:
- throw new IllegalArgumentException("Wrong element clicked");
- }
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- Log_OC.i(TAG, "result received. req: " + requestCode + " res: " + resultCode);
- if (requestCode == REQUEST_CODE_SETUP_ACCOUNT) {
- dismissDialog(DIALOG_NO_ACCOUNT);
- if (resultCode == RESULT_CANCELED) {
- finish();
- }
- Account[] accounts = mAccountManager.getAccountsByType(AccountAuthenticator.AUTH_TOKEN_TYPE);
- if (accounts.length == 0) {
- showDialog(DIALOG_NO_ACCOUNT);
- } else {
- // there is no need for checking for is there more then one
- // account at this point
- // since account setup can set only one account at time
- mAccount = accounts[0];
- populateDirectoryList();
- }
- }
- }
-
- private void populateDirectoryList() {
- setContentView(R.layout.uploader_layout);
-
- String full_path = "";
- for (String a : mParents)
- full_path += a + "/";
-
- Log_OC.d(TAG, "Populating view with content of : " + full_path);
-
- mFile = mStorageManager.getFileByPath(full_path);
- if (mFile != null) {
- Vector<OCFile> files = mStorageManager.getDirectoryContent(mFile);
- List<HashMap<String, Object>> data = new LinkedList<HashMap<String,Object>>();
- for (OCFile f : files) {
- HashMap<String, Object> h = new HashMap<String, Object>();
- if (f.isDirectory()) {
- h.put("dirname", f.getFileName());
- data.add(h);
- }
- }
- SimpleAdapter sa = new SimpleAdapter(this,
- data,
- R.layout.uploader_list_item_layout,
- new String[] {"dirname"},
- new int[] {R.id.textView1});
- setListAdapter(sa);
- Button btn = (Button) findViewById(R.id.uploader_choose_folder);
- btn.setOnClickListener(this);
- getListView().setOnItemClickListener(this);
- }
- }
-
- private boolean prepareStreamsToUpload() {
- if (getIntent().getAction().equals(Intent.ACTION_SEND)) {
- mStreamsToUpload = new ArrayList<Parcelable>();
- mStreamsToUpload.add(getIntent().getParcelableExtra(Intent.EXTRA_STREAM));
- } else if (getIntent().getAction().equals(Intent.ACTION_SEND_MULTIPLE)) {
- mStreamsToUpload = getIntent().getParcelableArrayListExtra(Intent.EXTRA_STREAM);
- }
- return (mStreamsToUpload != null && mStreamsToUpload.get(0) != null);
- }
-
- public void uploadFiles() {
- try {
- WebdavClient wdc = OwnCloudClientUtils.createOwnCloudClient(mAccount, getApplicationContext());
-
- // create last directory in path if necessary
- if (mCreateDir) {
- wdc.createDirectory(mUploadPath);
- }
-
- String[] local = new String[mStreamsToUpload.size()], remote = new String[mStreamsToUpload.size()];
-
- for (int i = 0; i < mStreamsToUpload.size(); ++i) {
- Uri uri = (Uri) mStreamsToUpload.get(i);
- if (uri.getScheme().equals("content")) {
- Cursor c = getContentResolver().query((Uri) mStreamsToUpload.get(i),
- CONTENT_PROJECTION,
- null,
- null,
- null);
-
- if (!c.moveToFirst())
- continue;
-
- final String display_name = c.getString(c.getColumnIndex(Media.DISPLAY_NAME)),
- data = c.getString(c.getColumnIndex(Media.DATA));
- local[i] = data;
- remote[i] = mUploadPath + display_name;
- } else if (uri.getScheme().equals("file")) {
- final File file = new File(Uri.decode(uri.toString()).replace(uri.getScheme() + "://", ""));
- local[i] = file.getAbsolutePath();
- remote[i] = mUploadPath + file.getName();
- }
-
- }
- Intent intent = new Intent(getApplicationContext(), FileUploader.class);
- intent.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_MULTIPLE_FILES);
- intent.putExtra(FileUploader.KEY_LOCAL_FILE, local);
- intent.putExtra(FileUploader.KEY_REMOTE_FILE, remote);
- intent.putExtra(FileUploader.KEY_ACCOUNT, mAccount);
- startService(intent);
- finish();
-
- } catch (SecurityException e) {
- String message = String.format(getString(R.string.uploader_error_forbidden_content), getString(R.string.app_name));
- Toast.makeText(this, message, Toast.LENGTH_LONG).show();
- }
- }
-
-}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012 Bartek Przybylski
+ * Copyright (C) 2012-2013 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.authentication;
+
+import com.owncloud.android.MainApp;
+import com.owncloud.android.R;
+
+import android.accounts.*;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.widget.Toast;
+
+import com.owncloud.android.lib.common.accounts.AccountTypeUtils;
+import com.owncloud.android.utils.Log_OC;
+
+
+/**
+ * Authenticator for ownCloud accounts.
+ *
+ * Controller class accessed from the system AccountManager, providing integration of ownCloud accounts with the Android system.
+ *
+ * TODO - better separation in operations for OAuth-capable and regular ownCloud accounts.
+ * TODO - review completeness
+ *
+ * @author David A. Velasco
+ */
+public class AccountAuthenticator extends AbstractAccountAuthenticator {
+
+ /**
+ * Is used by android system to assign accounts to authenticators. Should be
+ * used by application and all extensions.
+ */
+ public static final String KEY_AUTH_TOKEN_TYPE = "authTokenType";
+ public static final String KEY_REQUIRED_FEATURES = "requiredFeatures";
+ public static final String KEY_LOGIN_OPTIONS = "loginOptions";
+ public static final String KEY_ACCOUNT = "account";
+
+ private static final String TAG = AccountAuthenticator.class.getSimpleName();
+
+ private Context mContext;
+
+ private Handler mHandler;
+
+ public AccountAuthenticator(Context context) {
+ super(context);
+ mContext = context;
+ mHandler = new Handler();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Bundle addAccount(AccountAuthenticatorResponse response,
+ String accountType, String authTokenType,
+ String[] requiredFeatures, Bundle options)
+ throws NetworkErrorException {
+ Log_OC.i(TAG, "Adding account with type " + accountType
+ + " and auth token " + authTokenType);
+
+ final Bundle bundle = new Bundle();
+
+ AccountManager accountManager = AccountManager.get(mContext);
+ Account[] accounts = accountManager.getAccountsByType(MainApp.getAccountType());
+
+ if (mContext.getResources().getBoolean(R.bool.multiaccount_support) || accounts.length < 1) {
+ try {
+ validateAccountType(accountType);
+ } catch (AuthenticatorException e) {
+ Log_OC.e(TAG, "Failed to validate account type " + accountType + ": "
+ + e.getMessage());
+ e.printStackTrace();
+ return e.getFailureBundle();
+ }
+
+ final Intent intent = new Intent(mContext, AuthenticatorActivity.class);
+ intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
+ intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType);
+ intent.putExtra(KEY_REQUIRED_FEATURES, requiredFeatures);
+ intent.putExtra(KEY_LOGIN_OPTIONS, options);
+ intent.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_CREATE);
+
+ setIntentFlags(intent);
+
+ bundle.putParcelable(AccountManager.KEY_INTENT, intent);
+
+ } else {
+
+ // Return an error
+ bundle.putInt(AccountManager.KEY_ERROR_CODE, AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION);
+ final String message = String.format(mContext.getString(R.string.auth_unsupported_multiaccount), mContext.getString(R.string.app_name));
+ bundle.putString(AccountManager.KEY_ERROR_MESSAGE, message);
+
+ mHandler.post(new Runnable() {
+
+ @Override
+ public void run() {
+ Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
+ }
+ });
+
+ }
+
+ return bundle;
+ }
+
+ /**\r
+ * {@inheritDoc}\r
+ */\r
+ @Override\r
+ public Bundle confirmCredentials(AccountAuthenticatorResponse response,\r
+ Account account, Bundle options) throws NetworkErrorException {\r
+ try {\r
+ validateAccountType(account.type);\r
+ } catch (AuthenticatorException e) {\r
+ Log_OC.e(TAG, "Failed to validate account type " + account.type + ": "\r
+ + e.getMessage());\r
+ e.printStackTrace();\r
+ return e.getFailureBundle();\r
+ }\r
+ Intent intent = new Intent(mContext, AuthenticatorActivity.class);\r
+ intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE,\r
+ response);\r
+ intent.putExtra(KEY_ACCOUNT, account);\r
+ intent.putExtra(KEY_LOGIN_OPTIONS, options);\r
+\r
+ setIntentFlags(intent);\r
+\r
+ Bundle resultBundle = new Bundle();\r
+ resultBundle.putParcelable(AccountManager.KEY_INTENT, intent);\r
+ return resultBundle;\r
+ }\r
+\r
+ @Override\r
+ public Bundle editProperties(AccountAuthenticatorResponse response,\r
+ String accountType) {\r
+ return null;\r
+ }\r
+\r
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Bundle getAuthToken(AccountAuthenticatorResponse response,
+ Account account, String authTokenType, Bundle options)
+ throws NetworkErrorException {
+ /// validate parameters
+ try {
+ validateAccountType(account.type);
+ validateAuthTokenType(authTokenType);
+ } catch (AuthenticatorException e) {
+ Log_OC.e(TAG, "Failed to validate account type " + account.type + ": "
+ + e.getMessage());
+ e.printStackTrace();
+ return e.getFailureBundle();
+ }
+
+ /// check if required token is stored
+ final AccountManager am = AccountManager.get(mContext);
+ String accessToken;
+ if (authTokenType.equals(AccountTypeUtils.getAuthTokenTypePass(MainApp.getAccountType()))) {
+ accessToken = am.getPassword(account);
+ } else {
+ accessToken = am.peekAuthToken(account, authTokenType);
+ }
+ if (accessToken != null) {
+ final Bundle result = new Bundle();
+ result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
+ result.putString(AccountManager.KEY_ACCOUNT_TYPE, MainApp.getAccountType());
+ result.putString(AccountManager.KEY_AUTHTOKEN, accessToken);
+ return result;
+ }
+
+ /// if not stored, return Intent to access the AuthenticatorActivity and UPDATE the token for the account
+ final Intent intent = new Intent(mContext, AuthenticatorActivity.class);
+ intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
+ intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType);
+ intent.putExtra(KEY_LOGIN_OPTIONS, options);
+ intent.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, account);
+ intent.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_EXPIRED_TOKEN);
+
+
+ final Bundle bundle = new Bundle();
+ bundle.putParcelable(AccountManager.KEY_INTENT, intent);
+ return bundle;
+ }
+
+ @Override
+ public String getAuthTokenLabel(String authTokenType) {
+ return null;
+ }
+
+ @Override
+ public Bundle hasFeatures(AccountAuthenticatorResponse response,
+ Account account, String[] features) throws NetworkErrorException {
+ final Bundle result = new Bundle();
+ result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, true);
+ return result;
+ }
+
+ @Override
+ public Bundle updateCredentials(AccountAuthenticatorResponse response,
+ Account account, String authTokenType, Bundle options)
+ throws NetworkErrorException {
+ final Intent intent = new Intent(mContext, AuthenticatorActivity.class);
+ intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE,
+ response);
+ intent.putExtra(KEY_ACCOUNT, account);
+ intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType);
+ intent.putExtra(KEY_LOGIN_OPTIONS, options);
+ setIntentFlags(intent);
+
+ final Bundle bundle = new Bundle();
+ bundle.putParcelable(AccountManager.KEY_INTENT, intent);
+ return bundle;
+ }
+
+ @Override
+ public Bundle getAccountRemovalAllowed(
+ AccountAuthenticatorResponse response, Account account)
+ throws NetworkErrorException {
+ return super.getAccountRemovalAllowed(response, account);
+ }
+
+ private void setIntentFlags(Intent intent) {
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+ intent.addFlags(Intent.FLAG_FROM_BACKGROUND);
+ }
+
+ private void validateAccountType(String type)
+ throws UnsupportedAccountTypeException {
+ if (!type.equals(MainApp.getAccountType())) {
+ throw new UnsupportedAccountTypeException();
+ }
+ }
+
+ private void validateAuthTokenType(String authTokenType)\r
+ throws UnsupportedAuthTokenTypeException {\r
+ if (!authTokenType.equals(MainApp.getAuthTokenType()) &&\r
+ !authTokenType.equals(AccountTypeUtils.getAuthTokenTypePass(MainApp.getAccountType())) &&\r
+ !authTokenType.equals(AccountTypeUtils.getAuthTokenTypeAccessToken(MainApp.getAccountType())) &&\r
+ !authTokenType.equals(AccountTypeUtils.getAuthTokenTypeRefreshToken(MainApp.getAccountType())) &&
+ !authTokenType.equals(AccountTypeUtils.getAuthTokenTypeSamlSessionCookie(MainApp.getAccountType()))) {\r
+ throw new UnsupportedAuthTokenTypeException();\r
+ }\r
+ }\r
+\r
+ public static class AuthenticatorException extends Exception {\r
+ private static final long serialVersionUID = 1L;\r
+ private Bundle mFailureBundle;\r
+\r
+ public AuthenticatorException(int code, String errorMsg) {\r
+ mFailureBundle = new Bundle();\r
+ mFailureBundle.putInt(AccountManager.KEY_ERROR_CODE, code);\r
+ mFailureBundle\r
+ .putString(AccountManager.KEY_ERROR_MESSAGE, errorMsg);\r
+ }\r
+\r
+ public Bundle getFailureBundle() {\r
+ return mFailureBundle;\r
+ }\r
+ }\r
+\r
+ public static class UnsupportedAccountTypeException extends\r
+ AuthenticatorException {\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ public UnsupportedAccountTypeException() {\r
+ super(AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION,\r
+ "Unsupported account type");\r
+ }\r
+ }\r
+\r
+ public static class UnsupportedAuthTokenTypeException extends\r
+ AuthenticatorException {\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ public UnsupportedAuthTokenTypeException() {\r
+ super(AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION,\r
+ "Unsupported auth token type");\r
+ }\r
+ }\r
+\r
+ public static class UnsupportedFeaturesException extends\r
+ AuthenticatorException {\r
+ public static final long serialVersionUID = 1L;\r
+\r
+ public UnsupportedFeaturesException() {\r
+ super(AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION,\r
+ "Unsupported features");\r
+ }\r
+ }\r
+\r
+ public static class AccessDeniedException extends AuthenticatorException {\r
+ public AccessDeniedException(int code, String errorMsg) {\r
+ super(AccountManager.ERROR_CODE_INVALID_RESPONSE, "Access Denied");\r
+ }\r
+\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ }\r
+}\r
--- /dev/null
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.owncloud.android.authentication;
+
+import android.accounts.AccountAuthenticatorResponse;
+import android.accounts.AccountManager;
+import android.os.Bundle;
+
+import com.actionbarsherlock.app.SherlockFragmentActivity;
+
+
+/*
+ * Base class for implementing an Activity that is used to help implement an AbstractAccountAuthenticator.
+ * If the AbstractAccountAuthenticator needs to use an activity to handle the request then it can have the activity extend
+ * AccountAuthenticatorActivity. The AbstractAccountAuthenticator passes in the response to the intent using the following:
+ * intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
+ *
+ * The activity then sets the result that is to be handed to the response via setAccountAuthenticatorResult(android.os.Bundle).
+ * This result will be sent as the result of the request when the activity finishes. If this is never set or if it is set to null
+ * then error AccountManager.ERROR_CODE_CANCELED will be called on the response.
+ */
+
+public class AccountAuthenticatorActivity extends SherlockFragmentActivity {
+
+ private AccountAuthenticatorResponse mAccountAuthenticatorResponse = null;
+ private Bundle mResultBundle = null;
+
+
+ /**
+ * Set the result that is to be sent as the result of the request that caused this Activity to be launched.
+ * If result is null or this method is never called then the request will be canceled.
+ *
+ * @param result this is returned as the result of the AbstractAccountAuthenticator request
+ */
+ public final void setAccountAuthenticatorResult(Bundle result) {
+ mResultBundle = result;
+ }
+
+ /**
+ * Retreives the AccountAuthenticatorResponse from either the intent of the icicle, if the
+ * icicle is non-zero.
+ * @param icicle the save instance data of this Activity, may be null
+ */
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ mAccountAuthenticatorResponse =
+ getIntent().getParcelableExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE);
+
+ if (mAccountAuthenticatorResponse != null) {
+ mAccountAuthenticatorResponse.onRequestContinued();
+ }
+ }
+
+ /**
+ * Sends the result or a Constants.ERROR_CODE_CANCELED error if a result isn't present.
+ */
+ public void finish() {
+ if (mAccountAuthenticatorResponse != null) {
+ // send the result bundle back if set, otherwise send an error.
+ if (mResultBundle != null) {
+ mAccountAuthenticatorResponse.onResult(mResultBundle);
+ } else {
+ mAccountAuthenticatorResponse.onError(AccountManager.ERROR_CODE_CANCELED,
+ "canceled");
+ }
+ mAccountAuthenticatorResponse = null;
+ }
+ super.finish();
+ }
+}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2011 Bartek Przybylski
+ * Copyright (C) 2012-2013 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.authentication;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+
+public class AccountAuthenticatorService extends Service {
+
+ private AccountAuthenticator mAuthenticator;
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ mAuthenticator = new AccountAuthenticator(this);
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ return mAuthenticator.getIBinder();
+ }
+
+}
--- /dev/null
+/* ownCloud Android client application\r
+ * Copyright (C) 2012 Bartek Przybylski\r
+ * Copyright (C) 2012-2013 ownCloud Inc.\r
+ *\r
+ * This program is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License version 2,\r
+ * as published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.\r
+ *\r
+ */\r
+\r
+package com.owncloud.android.authentication;\r
+\r
+import com.owncloud.android.MainApp;\r
+import com.owncloud.android.lib.common.accounts.AccountTypeUtils;\r
+import com.owncloud.android.lib.resources.status.OwnCloudVersion;\r
+\r
+import android.accounts.Account;\r
+import android.accounts.AccountManager;\r
+import android.content.Context;\r
+import android.content.SharedPreferences;\r
+import android.preference.PreferenceManager;\r
+\r
+public class AccountUtils {\r
+ public static final String WEBDAV_PATH_1_2 = "/webdav/owncloud.php";\r
+ public static final String WEBDAV_PATH_2_0 = "/files/webdav.php";\r
+ public static final String WEBDAV_PATH_4_0 = "/remote.php/webdav";\r
+ private static final String ODAV_PATH = "/remote.php/odav";\r
+ private static final String SAML_SSO_PATH = "/remote.php/webdav";\r
+ public static final String CARDDAV_PATH_2_0 = "/apps/contacts/carddav.php";\r
+ public static final String CARDDAV_PATH_4_0 = "/remote/carddav.php";\r
+ public static final String STATUS_PATH = "/status.php";\r
+\r
+ /**\r
+ * Can be used to get the currently selected ownCloud {@link Account} in the\r
+ * application preferences.\r
+ * \r
+ * @param context The current application {@link Context}\r
+ * @return The ownCloud {@link Account} currently saved in preferences, or the first \r
+ * {@link Account} available, if valid (still registered in the system as ownCloud \r
+ * account). If none is available and valid, returns null.\r
+ */\r
+ public static Account getCurrentOwnCloudAccount(Context context) {\r
+ Account[] ocAccounts = AccountManager.get(context).getAccountsByType(\r
+ MainApp.getAccountType());\r
+ Account defaultAccount = null;\r
+\r
+ SharedPreferences appPreferences = PreferenceManager\r
+ .getDefaultSharedPreferences(context);\r
+ String accountName = appPreferences\r
+ .getString("select_oc_account", null);\r
+\r
+ // account validation: the saved account MUST be in the list of ownCloud Accounts known by the AccountManager\r
+ if (accountName != null) {\r
+ for (Account account : ocAccounts) {\r
+ if (account.name.equals(accountName)) {\r
+ defaultAccount = account;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ \r
+ if (defaultAccount == null && ocAccounts.length != 0) {\r
+ // take first account as fallback\r
+ defaultAccount = ocAccounts[0];\r
+ }\r
+\r
+ return defaultAccount;\r
+ }\r
+\r
+ \r
+ public static boolean exists(Account account, Context context) {\r
+ Account[] ocAccounts = AccountManager.get(context).getAccountsByType(\r
+ MainApp.getAccountType());\r
+\r
+ if (account != null && account.name != null) {\r
+ for (Account ac : ocAccounts) {\r
+ if (ac.name.equals(account.name)) {\r
+ return true;\r
+ }\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+ \r
+\r
+ /**\r
+ * Checks, whether or not there are any ownCloud accounts setup.\r
+ * \r
+ * @return true, if there is at least one account.\r
+ */\r
+ public static boolean accountsAreSetup(Context context) {\r
+ AccountManager accMan = AccountManager.get(context);\r
+ Account[] accounts = accMan\r
+ .getAccountsByType(MainApp.getAccountType());\r
+ return accounts.length > 0;\r
+ }\r
+ \r
+ \r
+ public static boolean setCurrentOwnCloudAccount(Context context, String accountName) {\r
+ boolean result = false;\r
+ if (accountName != null) {\r
+ Account[] ocAccounts = AccountManager.get(context).getAccountsByType(\r
+ MainApp.getAccountType());\r
+ boolean found = false;\r
+ for (Account account : ocAccounts) {\r
+ found = (account.name.equals(accountName));\r
+ if (found) {\r
+ SharedPreferences.Editor appPrefs = PreferenceManager\r
+ .getDefaultSharedPreferences(context).edit();\r
+ appPrefs.putString("select_oc_account", accountName);\r
+ \r
+ appPrefs.commit();\r
+ result = true;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ return result;\r
+ }\r
+\r
+ /**\r
+ * Returns the proper URL path to access the WebDAV interface of an ownCloud server,\r
+ * according to its version and the authorization method used.\r
+ * \r
+ * @param version Version of ownCloud server.\r
+ * @param authTokenType Authorization token type, matching some of the AUTH_TOKEN_TYPE_* constants in {@link AccountAuthenticator}. \r
+ * @return WebDAV path for given OC version and authorization method, null if OC version is unknown.\r
+ */\r
+ public static String getWebdavPath(OwnCloudVersion version, String authTokenType) {\r
+ if (version != null) {\r
+ if (AccountTypeUtils.getAuthTokenTypeAccessToken(MainApp.getAccountType()).equals(authTokenType)) {\r
+ return ODAV_PATH;\r
+ }\r
+ if (AccountTypeUtils.getAuthTokenTypeSamlSessionCookie(MainApp.getAccountType()).equals(authTokenType)) {\r
+ return SAML_SSO_PATH;\r
+ }\r
+ if (version.compareTo(OwnCloudVersion.owncloud_v4) >= 0)\r
+ return WEBDAV_PATH_4_0;\r
+ if (version.compareTo(OwnCloudVersion.owncloud_v3) >= 0\r
+ || version.compareTo(OwnCloudVersion.owncloud_v2) >= 0)\r
+ return WEBDAV_PATH_2_0;\r
+ if (version.compareTo(OwnCloudVersion.owncloud_v1) >= 0)\r
+ return WEBDAV_PATH_1_2;\r
+ }\r
+ return null;\r
+ }\r
+ \r
+}\r
--- /dev/null
+/* ownCloud Android client application\r
+ * Copyright (C) 2012 Bartek Przybylski\r
+ * Copyright (C) 2012-2014 ownCloud Inc.\r
+ *\r
+ * This program is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License version 2,\r
+ * as published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.\r
+ *\r
+ */\r
+\r
+package com.owncloud.android.authentication;\r
+\r
+import java.security.cert.X509Certificate;\r
+import java.util.Map;\r
+\r
+import android.accounts.Account;\r
+import android.accounts.AccountManager;\r
+import android.app.Dialog;\r
+import android.content.ComponentName;\r
+import android.content.Context;\r
+import android.content.Intent;\r
+import android.content.ServiceConnection;\r
+import android.content.SharedPreferences;\r
+import android.graphics.Rect;\r
+import android.graphics.drawable.Drawable;\r
+import android.net.Uri;\r
+import android.net.http.SslError;\r
+import android.os.Bundle;\r
+import android.os.Handler;\r
+import android.os.IBinder;\r
+import android.preference.PreferenceManager;\r
+import android.support.v4.app.Fragment;\r
+import android.support.v4.app.FragmentManager;\r
+import android.support.v4.app.FragmentTransaction;\r
+import android.text.Editable;\r
+import android.text.InputType;\r
+import android.text.TextWatcher;\r
+import android.view.KeyEvent;\r
+import android.view.MotionEvent;\r
+import android.view.View;\r
+import android.view.View.OnFocusChangeListener;\r
+import android.view.View.OnTouchListener;\r
+import android.view.Window;\r
+import android.view.inputmethod.EditorInfo;\r
+import android.webkit.SslErrorHandler;\r
+import android.widget.Button;\r
+import android.widget.CheckBox;\r
+import android.widget.EditText;\r
+import android.widget.TextView;\r
+import android.widget.TextView.OnEditorActionListener;\r
+import android.widget.Toast;\r
+\r
+import com.actionbarsherlock.app.SherlockDialogFragment;\r
+import com.owncloud.android.MainApp;\r
+import com.owncloud.android.R;\r
+import com.owncloud.android.authentication.SsoWebViewClient.SsoWebViewClientListener;\r
+import com.owncloud.android.lib.common.accounts.AccountTypeUtils;\r
+import com.owncloud.android.lib.common.accounts.AccountUtils.Constants;\r
+import com.owncloud.android.operations.DetectAuthenticationMethodOperation.AuthenticationMethod;\r
+import com.owncloud.android.operations.GetServerInfoOperation;\r
+import com.owncloud.android.operations.OAuth2GetAccessToken;\r
+
+import com.owncloud.android.lib.common.network.CertificateCombinedException;\r
+import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;\r
+import com.owncloud.android.lib.common.operations.RemoteOperation;\r
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;\r
+import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;\r
+import com.owncloud.android.lib.resources.files.ExistenceCheckRemoteOperation;\r
+import com.owncloud.android.lib.resources.users.GetRemoteUserNameOperation;\r
+\r
+import com.owncloud.android.services.OperationsService;\r
+import com.owncloud.android.services.OperationsService.OperationsServiceBinder;\r
+import com.owncloud.android.ui.dialog.IndeterminateProgressDialog;\r
+import com.owncloud.android.ui.dialog.SamlWebViewDialog;\r
+import com.owncloud.android.ui.dialog.SslUntrustedCertDialog;\r
+import com.owncloud.android.ui.dialog.SslUntrustedCertDialog.OnSslUntrustedCertListener;\r
+import com.owncloud.android.utils.Log_OC;\r
+import com.owncloud.android.lib.resources.status.OwnCloudVersion;\r
+\r
+/**\r
+ * This Activity is used to add an ownCloud account to the App\r
+ * \r
+ * @author Bartek Przybylski\r
+ * @author David A. Velasco\r
+ * @author masensio\r
+ */\r
+public class AuthenticatorActivity extends AccountAuthenticatorActivity\r
+implements OnRemoteOperationListener, OnFocusChangeListener, OnEditorActionListener, \r
+SsoWebViewClientListener, OnSslUntrustedCertListener {\r
+\r
+ private static final String TAG = AuthenticatorActivity.class.getSimpleName();\r
+\r
+ public static final String EXTRA_ACTION = "ACTION";\r
+ public static final String EXTRA_ACCOUNT = "ACCOUNT";\r
+\r
+ private static final String KEY_AUTH_TOKEN_TYPE = "AUTH_TOKEN_TYPE";\r
+\r
+ private static final String KEY_HOST_URL_TEXT = "HOST_URL_TEXT";\r
+ private static final String KEY_OC_VERSION = "OC_VERSION";\r
+ private static final String KEY_SERVER_VALID = "SERVER_VALID";\r
+ private static final String KEY_SERVER_CHECKED = "SERVER_CHECKED";\r
+ private static final String KEY_SERVER_STATUS_TEXT = "SERVER_STATUS_TEXT";\r
+ private static final String KEY_SERVER_STATUS_ICON = "SERVER_STATUS_ICON";\r
+ private static final String KEY_IS_SSL_CONN = "IS_SSL_CONN";\r
+ private static final String KEY_PASSWORD_EXPOSED = "PASSWORD_VISIBLE";\r
+ private static final String KEY_AUTH_STATUS_TEXT = "AUTH_STATUS_TEXT";\r
+ private static final String KEY_AUTH_STATUS_ICON = "AUTH_STATUS_ICON";\r
+ private static final String KEY_SERVER_AUTH_METHOD = "SERVER_AUTH_METHOD";\r
+ private static final String KEY_WAITING_FOR_OP_ID = "DETECT_AUTH_OP_ID";\r
+ private static final String KEY_AUTH_TOKEN = "AUTH_TOKEN";\r
+\r
+ private static final String AUTH_ON = "on";\r
+ private static final String AUTH_OPTIONAL = "optional";\r
+\r
+ public static final byte ACTION_CREATE = 0;\r
+ public static final byte ACTION_UPDATE_TOKEN = 1; // requested by the user\r
+ public static final byte ACTION_UPDATE_EXPIRED_TOKEN = 2; // detected by the app\r
+\r
+ private static final String UNTRUSTED_CERT_DIALOG_TAG = "UNTRUSTED_CERT_DIALOG";\r
+ private static final String SAML_DIALOG_TAG = "SAML_DIALOG";\r
+ private static final String WAIT_DIALOG_TAG = "WAIT_DIALOG";\r
+\r
+ \r
+ /// parameters from EXTRAs in starter Intent\r
+ private byte mAction;\r
+ private Account mAccount;\r
+ private String mAuthTokenType;\r
+\r
+\r
+ /// activity-level references / state\r
+ private final Handler mHandler = new Handler();\r
+ private ServiceConnection mOperationsServiceConnection = null;\r
+ private OperationsServiceBinder mOperationsServiceBinder = null;\r
+ private AccountManager mAccountMgr;\r
+ private Uri mNewCapturedUriFromOAuth2Redirection;\r
+\r
+\r
+ /// Server PRE-Fragment elements \r
+ private EditText mHostUrlInput;\r
+ private View mRefreshButton;\r
+ private TextView mServerStatusView;\r
+ \r
+ private TextWatcher mHostUrlInputWatcher;\r
+ private int mServerStatusText = 0, mServerStatusIcon = 0;\r
+ \r
+ private boolean mServerIsChecked = false;\r
+ private boolean mServerIsValid = false;\r
+\r
+ private GetServerInfoOperation.ServerInfo mServerInfo = \r
+ new GetServerInfoOperation.ServerInfo();\r
+ \r
+ \r
+ /// Authentication PRE-Fragment elements \r
+ private CheckBox mOAuth2Check;\r
+ private TextView mOAuthAuthEndpointText;\r
+ private TextView mOAuthTokenEndpointText;\r
+ private EditText mUsernameInput;\r
+ private EditText mPasswordInput;\r
+ private View mOkButton;\r
+ private TextView mAuthStatusView;\r
+\r
+ private int mAuthStatusText = 0, mAuthStatusIcon = 0;\r
+ \r
+ private String mAuthToken = "";\r
+\r
+ \r
+ /// Identifier of operation in progress which result shouldn't be lost \r
+ private long mWaitingForOpId = Long.MAX_VALUE;\r
+ \r
+ \r
+ /**\r
+ * {@inheritDoc}\r
+ * \r
+ * IMPORTANT ENTRY POINT 1: activity is shown to the user\r
+ */\r
+ @Override\r
+ protected void onCreate(Bundle savedInstanceState) {\r
+ //Log_OC.wtf(TAG, "onCreate init");\r
+ super.onCreate(savedInstanceState);\r
+ getWindow().requestFeature(Window.FEATURE_NO_TITLE);\r
+\r
+ // bind to Operations Service\r
+ mOperationsServiceConnection = new OperationsServiceConnection();\r
+ if (!bindService(new Intent(this, OperationsService.class), \r
+ mOperationsServiceConnection, \r
+ Context.BIND_AUTO_CREATE)) {\r
+ Toast.makeText(this, \r
+ R.string.error_cant_bind_to_operations_service, \r
+ Toast.LENGTH_LONG)\r
+ .show();\r
+ finish();\r
+ }\r
+\r
+ /// init activity state\r
+ mAccountMgr = AccountManager.get(this);\r
+ mNewCapturedUriFromOAuth2Redirection = null;\r
+ \r
+ /// get input values\r
+ mAction = getIntent().getByteExtra(EXTRA_ACTION, ACTION_CREATE); \r
+ mAccount = getIntent().getExtras().getParcelable(EXTRA_ACCOUNT);\r
+ if (savedInstanceState == null) {\r
+ initAuthTokenType();\r
+ } else {\r
+ mAuthTokenType = savedInstanceState.getString(KEY_AUTH_TOKEN_TYPE);\r
+ mWaitingForOpId = savedInstanceState.getLong(KEY_WAITING_FOR_OP_ID);\r
+ }\r
+ \r
+ /// load user interface\r
+ setContentView(R.layout.account_setup);\r
+ \r
+ /// initialize general UI elements\r
+ initOverallUi(savedInstanceState);\r
+ \r
+ /// initialize block to be moved to single Fragment to check server and get info about it \r
+ initServerPreFragment(savedInstanceState);\r
+ \r
+ /// initialize block to be moved to single Fragment to retrieve and validate credentials \r
+ initAuthorizationPreFragment(savedInstanceState);\r
+\r
+ //Log_OC.wtf(TAG, "onCreate end");\r
+ }\r
+\r
+ private void initAuthTokenType() {\r
+ mAuthTokenType = \r
+ getIntent().getExtras().getString(AccountAuthenticator.KEY_AUTH_TOKEN_TYPE);\r
+ if (mAuthTokenType == null) {\r
+ if (mAccount != null) {\r
+ boolean oAuthRequired = \r
+ (mAccountMgr.getUserData(mAccount, Constants.KEY_SUPPORTS_OAUTH2) != null);\r
+ boolean samlWebSsoRequired = \r
+ (mAccountMgr.getUserData(mAccount, Constants.KEY_SUPPORTS_SAML_WEB_SSO) != null);\r
+ mAuthTokenType = chooseAuthTokenType(oAuthRequired, samlWebSsoRequired);\r
+ \r
+ } else {\r
+ boolean oAuthSupported = AUTH_ON.equals(getString(R.string.auth_method_oauth2));\r
+ boolean samlWebSsoSupported = AUTH_ON.equals(getString(R.string.auth_method_saml_web_sso));\r
+ mAuthTokenType = chooseAuthTokenType(oAuthSupported, samlWebSsoSupported);\r
+ }\r
+ }\r
+ }\r
+\r
+ private String chooseAuthTokenType(boolean oauth, boolean saml) {\r
+ if (saml) {\r
+ return AccountTypeUtils.getAuthTokenTypeSamlSessionCookie(MainApp.getAccountType());\r
+ } else if (oauth) {\r
+ return AccountTypeUtils.getAuthTokenTypeAccessToken(MainApp.getAccountType());\r
+ } else {\r
+ return AccountTypeUtils.getAuthTokenTypePass(MainApp.getAccountType());\r
+ }\r
+ }\r
+\r
+ \r
+ /**\r
+ * Configures elements in the user interface under direct control of the Activity.\r
+ * \r
+ * @param savedInstanceState Saved activity state, as in {{@link #onCreate(Bundle)}\r
+ */\r
+ private void initOverallUi(Bundle savedInstanceState) {\r
+ \r
+ /// step 1 - load and process relevant inputs (resources, intent, savedInstanceState)\r
+ boolean isWelcomeLinkVisible = getResources().getBoolean(R.bool.show_welcome_link);\r
+ \r
+ String instructionsMessageText = null; \r
+ if (mAction == ACTION_UPDATE_EXPIRED_TOKEN) {\r
+ if (AccountTypeUtils.getAuthTokenTypeAccessToken(MainApp.getAccountType())\r
+ .equals(mAuthTokenType)) {\r
+ instructionsMessageText = getString(R.string.auth_expired_oauth_token_toast);\r
+ \r
+ } else if (AccountTypeUtils.getAuthTokenTypeSamlSessionCookie(MainApp.getAccountType())\r
+ .equals(mAuthTokenType)) {\r
+ instructionsMessageText = getString(R.string.auth_expired_saml_sso_token_toast);\r
+ \r
+ } else {\r
+ instructionsMessageText = getString(R.string.auth_expired_basic_auth_toast);\r
+ }\r
+ }\r
+ \r
+ /// step 2 - set properties of UI elements (text, visibility, enabled...)\r
+ Button welcomeLink = (Button) findViewById(R.id.welcome_link);\r
+ welcomeLink.setVisibility(isWelcomeLinkVisible ? View.VISIBLE : View.GONE);\r
+ welcomeLink.setText(\r
+ String.format(getString(R.string.auth_register), getString(R.string.app_name)));\r
+ \r
+ TextView instructionsView = (TextView) findViewById(R.id.instructions_message);\r
+ if (instructionsMessageText != null) {\r
+ instructionsView.setVisibility(View.VISIBLE);\r
+ instructionsView.setText(instructionsMessageText);\r
+ } else {\r
+ instructionsView.setVisibility(View.GONE);\r
+ }\r
+ }\r
+\r
+\r
+ /**\r
+ * \r
+ * @param savedInstanceState Saved activity state, as in {{@link #onCreate(Bundle)}\r
+ */\r
+ private void initServerPreFragment(Bundle savedInstanceState) {\r
+\r
+ /// step 1 - load and process relevant inputs (resources, intent, savedInstanceState)\r
+ boolean isUrlInputAllowed = getResources().getBoolean(R.bool.show_server_url_input); \r
+ if (savedInstanceState == null) {\r
+ if (mAccount != null) {\r
+ mServerInfo.mBaseUrl = mAccountMgr.getUserData(mAccount, Constants.KEY_OC_BASE_URL);\r
+ mServerInfo.mIsSslConn = mServerInfo.mBaseUrl.startsWith("https://"); // TODO do this in a setter for mBaseUrl\r
+ String ocVersion = mAccountMgr.getUserData(mAccount, Constants.KEY_OC_VERSION);\r
+ if (ocVersion != null) {\r
+ mServerInfo.mVersion = new OwnCloudVersion(ocVersion);\r
+ }\r
+ } else {\r
+ mServerInfo.mBaseUrl = getString(R.string.server_url).trim();\r
+ mServerInfo.mIsSslConn = mServerInfo.mBaseUrl.startsWith("https://");\r
+ }\r
+ } else {\r
+ mServerStatusText = savedInstanceState.getInt(KEY_SERVER_STATUS_TEXT);\r
+ mServerStatusIcon = savedInstanceState.getInt(KEY_SERVER_STATUS_ICON);\r
+ \r
+ mServerIsValid = savedInstanceState.getBoolean(KEY_SERVER_VALID);\r
+ mServerIsChecked = savedInstanceState.getBoolean(KEY_SERVER_CHECKED);\r
+ \r
+ // TODO parcelable\r
+ mServerInfo.mIsSslConn = savedInstanceState.getBoolean(KEY_IS_SSL_CONN);\r
+ mServerInfo.mBaseUrl = savedInstanceState.getString(KEY_HOST_URL_TEXT);\r
+ String ocVersion = savedInstanceState.getString(KEY_OC_VERSION);\r
+ if (ocVersion != null) {\r
+ mServerInfo.mVersion = new OwnCloudVersion(ocVersion);\r
+ }\r
+ mServerInfo.mAuthMethod = AuthenticationMethod.valueOf(\r
+ savedInstanceState.getString(KEY_SERVER_AUTH_METHOD));\r
+ \r
+ }\r
+ \r
+ /// step 2 - set properties of UI elements (text, visibility, enabled...)\r
+ mHostUrlInput = (EditText) findViewById(R.id.hostUrlInput);\r
+ mHostUrlInput.setText(mServerInfo.mBaseUrl);\r
+ if (mAction != ACTION_CREATE) {\r
+ /// lock things that should not change\r
+ mHostUrlInput.setEnabled(false);\r
+ mHostUrlInput.setFocusable(false);\r
+ }\r
+ if (isUrlInputAllowed) {\r
+ mRefreshButton = findViewById(R.id.embeddedRefreshButton);\r
+ } else {\r
+ findViewById(R.id.hostUrlFrame).setVisibility(View.GONE);\r
+ mRefreshButton = findViewById(R.id.centeredRefreshButton);\r
+ }\r
+ showRefreshButton(mServerIsChecked && !mServerIsValid && \r
+ mWaitingForOpId > Integer.MAX_VALUE);\r
+ mServerStatusView = (TextView) findViewById(R.id.server_status_text);\r
+ showServerStatus();\r
+ \r
+ /// step 3 - bind some listeners and options\r
+ mHostUrlInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);\r
+ mHostUrlInput.setOnEditorActionListener(this);\r
+ \r
+ /// step 4 - create listeners that will be bound at onResume\r
+ mHostUrlInputWatcher = new TextWatcher() {\r
+ \r
+ @Override\r
+ public void afterTextChanged(Editable s) {\r
+ if (mOkButton.isEnabled() &&\r
+ !mServerInfo.mBaseUrl.equals(\r
+ normalizeUrl(s.toString(), mServerInfo.mIsSslConn))) {\r
+ mOkButton.setEnabled(false);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {\r
+ }\r
+\r
+ @Override\r
+ public void onTextChanged(CharSequence s, int start, int before, int count) {\r
+ if (mAuthStatusIcon != 0) {\r
+ Log_OC.d(TAG, "onTextChanged: hiding authentication status");\r
+ mAuthStatusIcon = 0;\r
+ mAuthStatusText = 0;\r
+ showAuthStatus();\r
+ }\r
+ }\r
+ };\r
+\r
+\r
+ // TODO find out if this is really necessary, or if it can done in a different way\r
+ findViewById(R.id.scroll).setOnTouchListener(new OnTouchListener() {\r
+ @Override\r
+ public boolean onTouch(View view, MotionEvent event) {\r
+ if (event.getAction() == MotionEvent.ACTION_DOWN) {\r
+ if (AccountTypeUtils.getAuthTokenTypeSamlSessionCookie(MainApp.getAccountType()).equals(mAuthTokenType) &&\r
+ mHostUrlInput.hasFocus()) {\r
+ checkOcServer();\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+ });\r
+ \r
+ \r
+ /// step 4 - automatic actions to start\r
+ if (savedInstanceState == null) {\r
+ if (mAction != ACTION_CREATE || !isUrlInputAllowed) {\r
+ checkOcServer(); \r
+ }\r
+ }\r
+ }\r
+ \r
+ \r
+ /**\r
+ * \r
+ * @param savedInstanceState Saved activity state, as in {{@link #onCreate(Bundle)}\r
+ */\r
+ private void initAuthorizationPreFragment(Bundle savedInstanceState) {\r
+ \r
+ /// step 0 - get UI elements in layout\r
+ mOAuth2Check = (CheckBox) findViewById(R.id.oauth_onOff_check);\r
+ mOAuthAuthEndpointText = (TextView)findViewById(R.id.oAuthEntryPoint_1);\r
+ mOAuthTokenEndpointText = (TextView)findViewById(R.id.oAuthEntryPoint_2);\r
+ mUsernameInput = (EditText) findViewById(R.id.account_username);\r
+ mPasswordInput = (EditText) findViewById(R.id.account_password);\r
+ mAuthStatusView = (TextView) findViewById(R.id.auth_status_text); \r
+ mOkButton = findViewById(R.id.buttonOK);\r
+ \r
+ /// step 1 - load and process relevant inputs (resources, intent, savedInstanceState)\r
+ String presetUserName = null;\r
+ boolean isPasswordExposed = false;\r
+ if (savedInstanceState == null) {\r
+ if (mAccount != null) {\r
+ presetUserName = mAccount.name.substring(0, mAccount.name.lastIndexOf('@'));\r
+ }\r
+ \r
+ } else {\r
+ isPasswordExposed = savedInstanceState.getBoolean(KEY_PASSWORD_EXPOSED, false);\r
+ mAuthStatusText = savedInstanceState.getInt(KEY_AUTH_STATUS_TEXT);\r
+ mAuthStatusIcon = savedInstanceState.getInt(KEY_AUTH_STATUS_ICON);\r
+ mAuthToken = savedInstanceState.getString(KEY_AUTH_TOKEN);\r
+ }\r
+ \r
+ /// step 2 - set properties of UI elements (text, visibility, enabled...)\r
+ mOAuth2Check.setChecked(\r
+ AccountTypeUtils.getAuthTokenTypeAccessToken(MainApp.getAccountType())\r
+ .equals(mAuthTokenType));\r
+ if (presetUserName != null) {\r
+ mUsernameInput.setText(presetUserName);\r
+ }\r
+ if (mAction != ACTION_CREATE) {\r
+ mUsernameInput.setEnabled(false);\r
+ mUsernameInput.setFocusable(false);\r
+ }\r
+ mPasswordInput.setText(""); // clean password to avoid social hacking\r
+ if (isPasswordExposed) {\r
+ showPassword();\r
+ }\r
+ updateAuthenticationPreFragmentVisibility();\r
+ showAuthStatus();\r
+ mOkButton.setEnabled(mServerIsValid);\r
+\r
+ \r
+ /// step 3 - bind listeners\r
+ // bindings for password input field\r
+ mPasswordInput.setOnFocusChangeListener(this);\r
+ mPasswordInput.setImeOptions(EditorInfo.IME_ACTION_DONE);\r
+ mPasswordInput.setOnEditorActionListener(this);\r
+ mPasswordInput.setOnTouchListener(new RightDrawableOnTouchListener() {\r
+ @Override\r
+ public boolean onDrawableTouch(final MotionEvent event) {\r
+ if (event.getAction() == MotionEvent.ACTION_UP) {\r
+ AuthenticatorActivity.this.onViewPasswordClick();\r
+ }\r
+ return true;\r
+ }\r
+ });\r
+ \r
+ }\r
+\r
+\r
+ /**\r
+ * Changes the visibility of input elements depending on\r
+ * the current authorization method.\r
+ */\r
+ private void updateAuthenticationPreFragmentVisibility () {\r
+ if (AccountTypeUtils.getAuthTokenTypeSamlSessionCookie(MainApp.getAccountType()).\r
+ equals(mAuthTokenType)) {\r
+ // SAML-based web Single Sign On\r
+ mOAuth2Check.setVisibility(View.GONE);\r
+ mOAuthAuthEndpointText.setVisibility(View.GONE);\r
+ mOAuthTokenEndpointText.setVisibility(View.GONE);\r
+ mUsernameInput.setVisibility(View.GONE);\r
+ mPasswordInput.setVisibility(View.GONE);\r
+ \r
+ } else {\r
+ if (mAction == ACTION_CREATE && \r
+ AUTH_OPTIONAL.equals(getString(R.string.auth_method_oauth2))) {\r
+ mOAuth2Check.setVisibility(View.VISIBLE);\r
+ } else {\r
+ mOAuth2Check.setVisibility(View.GONE);\r
+ }\r
+ \r
+ if (AccountTypeUtils.getAuthTokenTypeAccessToken(MainApp.getAccountType()).\r
+ equals(mAuthTokenType)) {\r
+ // OAuth 2 authorization\r
+ \r
+ mOAuthAuthEndpointText.setVisibility(View.VISIBLE);\r
+ mOAuthTokenEndpointText.setVisibility(View.VISIBLE);\r
+ mUsernameInput.setVisibility(View.GONE);\r
+ mPasswordInput.setVisibility(View.GONE);\r
+ \r
+ } else {\r
+ // basic HTTP authorization\r
+ mOAuthAuthEndpointText.setVisibility(View.GONE);\r
+ mOAuthTokenEndpointText.setVisibility(View.GONE);\r
+ mUsernameInput.setVisibility(View.VISIBLE);\r
+ mPasswordInput.setVisibility(View.VISIBLE);\r
+ }\r
+ }\r
+ }\r
+\r
+\r
+\r
+ /**\r
+ * Saves relevant state before {@link #onPause()}\r
+ * \r
+ * Do NOT save {@link #mNewCapturedUriFromOAuth2Redirection}; it keeps a temporal flag, intended to defer the \r
+ * processing of the redirection caught in {@link #onNewIntent(Intent)} until {@link #onResume()} \r
+ * \r
+ * See {@link #loadSavedInstanceState(Bundle)}\r
+ */\r
+ @Override\r
+ protected void onSaveInstanceState(Bundle outState) {\r
+ //Log_OC.wtf(TAG, "onSaveInstanceState init" );\r
+ super.onSaveInstanceState(outState);\r
+\r
+ /// global state\r
+ outState.putString(KEY_AUTH_TOKEN_TYPE, mAuthTokenType);\r
+ outState.putLong(KEY_WAITING_FOR_OP_ID, mWaitingForOpId);\r
+\r
+ /// Server PRE-fragment state\r
+ outState.putInt(KEY_SERVER_STATUS_TEXT, mServerStatusText);\r
+ outState.putInt(KEY_SERVER_STATUS_ICON, mServerStatusIcon);\r
+ outState.putBoolean(KEY_SERVER_CHECKED, mServerIsChecked);\r
+ outState.putBoolean(KEY_SERVER_VALID, mServerIsValid);\r
+ outState.putBoolean(KEY_IS_SSL_CONN, mServerInfo.mIsSslConn);\r
+ outState.putString(KEY_HOST_URL_TEXT, mServerInfo.mBaseUrl);\r
+ if (mServerInfo.mVersion != null) {\r
+ outState.putString(KEY_OC_VERSION, mServerInfo.mVersion.getVersion());\r
+ }\r
+ outState.putString(KEY_SERVER_AUTH_METHOD, mServerInfo.mAuthMethod.name());\r
+\r
+ /// Authentication PRE-fragment state\r
+ outState.putBoolean(KEY_PASSWORD_EXPOSED, isPasswordVisible());\r
+ outState.putInt(KEY_AUTH_STATUS_ICON, mAuthStatusIcon);\r
+ outState.putInt(KEY_AUTH_STATUS_TEXT, mAuthStatusText);\r
+ outState.putString(KEY_AUTH_TOKEN, mAuthToken);\r
+\r
+ //Log_OC.wtf(TAG, "onSaveInstanceState end" );\r
+ }\r
+\r
+\r
+ /**\r
+ * The redirection triggered by the OAuth authentication server as response to the GET AUTHORIZATION request\r
+ * is caught here.\r
+ * \r
+ * To make this possible, this activity needs to be qualified with android:launchMode = "singleTask" in the\r
+ * AndroidManifest.xml file.\r
+ */\r
+ @Override\r
+ protected void onNewIntent (Intent intent) {\r
+ Log_OC.d(TAG, "onNewIntent()");\r
+ Uri data = intent.getData();\r
+ if (data != null && data.toString().startsWith(getString(R.string.oauth2_redirect_uri))) {\r
+ mNewCapturedUriFromOAuth2Redirection = data;\r
+ }\r
+ }\r
+\r
+\r
+ /**\r
+ * The redirection triggered by the OAuth authentication server as response to the GET AUTHORIZATION, and \r
+ * deferred in {@link #onNewIntent(Intent)}, is processed here.\r
+ */\r
+ @Override\r
+ protected void onResume() {\r
+ //Log_OC.wtf(TAG, "onResume init" );\r
+ super.onResume();\r
+ \r
+ // bound here to avoid spurious changes triggered by Android on device rotations\r
+ mHostUrlInput.setOnFocusChangeListener(this);\r
+ mHostUrlInput.addTextChangedListener(mHostUrlInputWatcher);\r
+ \r
+ if (mNewCapturedUriFromOAuth2Redirection != null) {\r
+ getOAuth2AccessTokenFromCapturedRedirection(); \r
+ }\r
+ \r
+ if (mOperationsServiceBinder != null) {\r
+ doOnResumeAndBound();\r
+ }\r
+ \r
+ //Log_OC.wtf(TAG, "onResume end" );\r
+ }\r
+\r
+ \r
+ @Override\r
+ protected void onPause() {\r
+ //Log_OC.wtf(TAG, "onPause init" );\r
+ if (mOperationsServiceBinder != null) {\r
+ //Log_OC.wtf(TAG, "unregistering to listen for operation callbacks" );\r
+ mOperationsServiceBinder.removeOperationListener(this);\r
+ }\r
+ \r
+ mHostUrlInput.removeTextChangedListener(mHostUrlInputWatcher);\r
+ mHostUrlInput.setOnFocusChangeListener(null);\r
+ \r
+ super.onPause();\r
+ //Log_OC.wtf(TAG, "onPause end" );\r
+ }\r
+ \r
+ @Override\r
+ protected void onDestroy() {\r
+\r
+ mHostUrlInputWatcher = null;\r
+ \r
+ if (mOperationsServiceConnection != null) {\r
+ unbindService(mOperationsServiceConnection);\r
+ mOperationsServiceBinder = null;\r
+ }\r
+ super.onDestroy();\r
+ }\r
+\r
+\r
+ /**\r
+ * Parses the redirection with the response to the GET AUTHORIZATION request to the \r
+ * oAuth server and requests for the access token (GET ACCESS TOKEN)\r
+ */\r
+ private void getOAuth2AccessTokenFromCapturedRedirection() {\r
+ /// Parse data from OAuth redirection\r
+ String queryParameters = mNewCapturedUriFromOAuth2Redirection.getQuery();\r
+ mNewCapturedUriFromOAuth2Redirection = null;\r
+\r
+ /// Showing the dialog with instructions for the user.\r
+ IndeterminateProgressDialog dialog = \r
+ IndeterminateProgressDialog.newInstance(R.string.auth_getting_authorization, true);\r
+ dialog.show(getSupportFragmentManager(), WAIT_DIALOG_TAG);\r
+\r
+ /// GET ACCESS TOKEN to the oAuth server\r
+ Intent getServerInfoIntent = new Intent();\r
+ getServerInfoIntent.setAction(OperationsService.ACTION_OAUTH2_GET_ACCESS_TOKEN);\r
+ \r
+ getServerInfoIntent.putExtra(\r
+ OperationsService.EXTRA_SERVER_URL, \r
+ mOAuthTokenEndpointText.getText().toString().trim());\r
+ \r
+ getServerInfoIntent.putExtra(\r
+ OperationsService.EXTRA_OAUTH2_QUERY_PARAMETERS, \r
+ queryParameters);\r
+ \r
+ if (mOperationsServiceBinder != null) {\r
+ //Log_OC.wtf(TAG, "getting access token..." );\r
+ mWaitingForOpId = mOperationsServiceBinder.newOperation(getServerInfoIntent);\r
+ }\r
+ }\r
+\r
+\r
+\r
+ /**\r
+ * Handles the change of focus on the text inputs for the server URL and the password\r
+ */\r
+ public void onFocusChange(View view, boolean hasFocus) {\r
+ if (view.getId() == R.id.hostUrlInput) { \r
+ if (!hasFocus) {\r
+ onUrlInputFocusLost((TextView) view);\r
+ }\r
+ else {\r
+ showRefreshButton(false);\r
+ }\r
+\r
+ } else if (view.getId() == R.id.account_password) {\r
+ onPasswordFocusChanged((TextView) view, hasFocus);\r
+ }\r
+ }\r
+\r
+\r
+ /**\r
+ * Handles changes in focus on the text input for the server URL.\r
+ * \r
+ * IMPORTANT ENTRY POINT 2: When (!hasFocus), user wrote the server URL and changed to \r
+ * other field. The operation to check the existence of the server in the entered URL is\r
+ * started. \r
+ * \r
+ * When hasFocus: user 'comes back' to write again the server URL.\r
+ * \r
+ * @param hostInput TextView with the URL input field receiving the change of focus.\r
+ */\r
+ private void onUrlInputFocusLost(TextView hostInput) {\r
+ if (!mServerInfo.mBaseUrl.equals(\r
+ normalizeUrl(mHostUrlInput.getText().toString(), mServerInfo.mIsSslConn))) {\r
+ // check server again only if the user changed something in the field\r
+ checkOcServer();\r
+ } else {\r
+ mOkButton.setEnabled(mServerIsValid);\r
+ showRefreshButton(!mServerIsValid);\r
+ }\r
+ }\r
+\r
+\r
+ private void checkOcServer() {\r
+ String uri = mHostUrlInput.getText().toString().trim();\r
+ mServerIsValid = false;\r
+ mServerIsChecked = false;\r
+ mOkButton.setEnabled(false);\r
+ mServerInfo = new GetServerInfoOperation.ServerInfo();\r
+ showRefreshButton(false);\r
+ \r
+ if (uri.length() != 0) {\r
+ mServerStatusText = R.string.auth_testing_connection;\r
+ mServerStatusIcon = R.drawable.progress_small;\r
+ showServerStatus();\r
+ \r
+ Intent getServerInfoIntent = new Intent();\r
+ getServerInfoIntent.setAction(OperationsService.ACTION_GET_SERVER_INFO);\r
+ getServerInfoIntent.putExtra(OperationsService.EXTRA_SERVER_URL, uri);\r
+ getServerInfoIntent.putExtra(OperationsService.EXTRA_AUTH_TOKEN_TYPE, mAuthTokenType);\r
+ if (mOperationsServiceBinder != null) {\r
+ //Log_OC.wtf(TAG, "checking server..." );\r
+ mWaitingForOpId = mOperationsServiceBinder.newOperation(getServerInfoIntent);\r
+ }\r
+ \r
+ } else {\r
+ mServerStatusText = 0;\r
+ mServerStatusIcon = 0;\r
+ showServerStatus();\r
+ }\r
+ }\r
+\r
+\r
+ /**\r
+ * Handles changes in focus on the text input for the password (basic authorization).\r
+ * \r
+ * When (hasFocus), the button to toggle password visibility is shown.\r
+ * \r
+ * When (!hasFocus), the button is made invisible and the password is hidden.\r
+ * \r
+ * @param passwordInput TextView with the password input field receiving the change of focus.\r
+ * @param hasFocus 'True' if focus is received, 'false' if is lost\r
+ */\r
+ private void onPasswordFocusChanged(TextView passwordInput, boolean hasFocus) {\r
+ if (hasFocus) {\r
+ showViewPasswordButton();\r
+ } else {\r
+ hidePassword();\r
+ hidePasswordButton();\r
+ }\r
+ }\r
+\r
+\r
+ private void showViewPasswordButton() {\r
+ int drawable = R.drawable.ic_view;\r
+ if (isPasswordVisible()) {\r
+ drawable = R.drawable.ic_hide;\r
+ }\r
+ mPasswordInput.setCompoundDrawablesWithIntrinsicBounds(0, 0, drawable, 0);\r
+ }\r
+\r
+ private boolean isPasswordVisible() {\r
+ return ((mPasswordInput.getInputType() & InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);\r
+ }\r
+\r
+ private void hidePasswordButton() {\r
+ mPasswordInput.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);\r
+ }\r
+\r
+ private void showPassword() {\r
+ mPasswordInput.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);\r
+ showViewPasswordButton();\r
+ }\r
+\r
+ private void hidePassword() {\r
+ mPasswordInput.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);\r
+ showViewPasswordButton();\r
+ }\r
+\r
+ /**\r
+ * Checks the credentials of the user in the root of the ownCloud server\r
+ * before creating a new local account.\r
+ * \r
+ * For basic authorization, a check of existence of the root folder is\r
+ * performed.\r
+ * \r
+ * For OAuth, starts the flow to get an access token; the credentials test \r
+ * is postponed until it is available.\r
+ * \r
+ * IMPORTANT ENTRY POINT 4\r
+ * \r
+ * @param view OK button\r
+ */\r
+ public void onOkClick(View view) {\r
+ // this check should be unnecessary\r
+ if (mServerInfo.mVersion == null || \r
+ !mServerInfo.mVersion.isVersionValid() || \r
+ mServerInfo.mBaseUrl == null || \r
+ mServerInfo.mBaseUrl.length() == 0) {\r
+ mServerStatusIcon = R.drawable.common_error;\r
+ mServerStatusText = R.string.auth_wtf_reenter_URL;\r
+ showServerStatus();\r
+ mOkButton.setEnabled(false);\r
+ //Log_OC.wtf(TAG, "The user was allowed to click 'connect' to an unchecked server!!");\r
+ return;\r
+ }\r
+\r
+ if (AccountTypeUtils.getAuthTokenTypeAccessToken(MainApp.getAccountType()).equals(mAuthTokenType)) {\r
+ startOauthorization();\r
+ } else if (AccountTypeUtils.getAuthTokenTypeSamlSessionCookie(MainApp.getAccountType()).equals(mAuthTokenType)) { \r
+ startSamlBasedFederatedSingleSignOnAuthorization();\r
+ } else {\r
+ checkBasicAuthorization();\r
+ }\r
+ }\r
+\r
+\r
+ /**\r
+ * Tests the credentials entered by the user performing a check of existence on \r
+ * the root folder of the ownCloud server.\r
+ */\r
+ private void checkBasicAuthorization() {\r
+ /// get the path to the root folder through WebDAV from the version server\r
+ String webdav_path = AccountUtils.getWebdavPath(mServerInfo.mVersion, mAuthTokenType);\r
+\r
+ /// get basic credentials entered by user\r
+ String username = mUsernameInput.getText().toString();\r
+ String password = mPasswordInput.getText().toString();\r
+\r
+ /// be gentle with the user\r
+ IndeterminateProgressDialog dialog = \r
+ IndeterminateProgressDialog.newInstance(R.string.auth_trying_to_login, true);\r
+ dialog.show(getSupportFragmentManager(), WAIT_DIALOG_TAG);\r
+\r
+ /// test credentials accessing the root folder\r
+ String remotePath ="";\r
+ boolean successIfAbsent = false;\r
+ boolean followRedirects = true;\r
+ startExistenceCheckRemoteOperation(remotePath, this, successIfAbsent, webdav_path, username, password, followRedirects);\r
+ \r
+ }\r
+\r
+ private void startExistenceCheckRemoteOperation(String remotePath, Context context, boolean successIfAbsent, String webdav_path,\r
+ String username, String password, boolean followRedirects) {\r
+ Intent existenceCheckIntent = new Intent();\r
+ existenceCheckIntent.setAction(OperationsService.ACTION_EXISTENCE_CHECK);\r
+ existenceCheckIntent.putExtra(OperationsService.EXTRA_SERVER_URL, mServerInfo.mBaseUrl);\r
+ existenceCheckIntent.putExtra(OperationsService.EXTRA_REMOTE_PATH, remotePath);\r
+ existenceCheckIntent.putExtra(OperationsService.EXTRA_SUCCESS_IF_ABSENT, successIfAbsent);\r
+ existenceCheckIntent.putExtra(OperationsService.EXTRA_WEBDAV_PATH, webdav_path);\r
+ existenceCheckIntent.putExtra(OperationsService.EXTRA_USERNAME, username);\r
+ existenceCheckIntent.putExtra(OperationsService.EXTRA_PASSWORD, password);\r
+ existenceCheckIntent.putExtra(OperationsService.EXTRA_AUTH_TOKEN, mAuthToken);\r
+ existenceCheckIntent.putExtra(OperationsService.EXTRA_FOLLOW_REDIRECTS, followRedirects);\r
+ \r
+ if (mOperationsServiceBinder != null) {\r
+ //Log_OC.wtf(TAG, "starting existenceCheckRemoteOperation..." );\r
+ mWaitingForOpId = mOperationsServiceBinder.newOperation(existenceCheckIntent);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Starts the OAuth 'grant type' flow to get an access token, with \r
+ * a GET AUTHORIZATION request to the BUILT-IN authorization server. \r
+ */\r
+ private void startOauthorization() {\r
+ // be gentle with the user\r
+ mAuthStatusIcon = R.drawable.progress_small;\r
+ mAuthStatusText = R.string.oauth_login_connection;\r
+ showAuthStatus();\r
+\r
+ // GET AUTHORIZATION request\r
+ Uri uri = Uri.parse(mOAuthAuthEndpointText.getText().toString().trim());\r
+ Uri.Builder uriBuilder = uri.buildUpon();\r
+ uriBuilder.appendQueryParameter(OAuth2Constants.KEY_RESPONSE_TYPE, getString(R.string.oauth2_response_type));\r
+ uriBuilder.appendQueryParameter(OAuth2Constants.KEY_REDIRECT_URI, getString(R.string.oauth2_redirect_uri)); \r
+ uriBuilder.appendQueryParameter(OAuth2Constants.KEY_CLIENT_ID, getString(R.string.oauth2_client_id));\r
+ uriBuilder.appendQueryParameter(OAuth2Constants.KEY_SCOPE, getString(R.string.oauth2_scope));\r
+ uri = uriBuilder.build();\r
+ Log_OC.d(TAG, "Starting browser to view " + uri.toString());\r
+ Intent i = new Intent(Intent.ACTION_VIEW, uri);\r
+ startActivity(i);\r
+ }\r
+\r
+\r
+ /**\r
+ * Starts the Web Single Sign On flow to get access to the root folder\r
+ * in the server.\r
+ */\r
+ private void startSamlBasedFederatedSingleSignOnAuthorization() {\r
+ // be gentle with the user\r
+ mAuthStatusIcon = R.drawable.progress_small;\r
+ mAuthStatusText = R.string.auth_connecting_auth_server;\r
+ showAuthStatus();\r
+ IndeterminateProgressDialog dialog = \r
+ IndeterminateProgressDialog.newInstance(R.string.auth_trying_to_login, true);\r
+ dialog.show(getSupportFragmentManager(), WAIT_DIALOG_TAG);\r
+\r
+ /// get the path to the root folder through WebDAV from the version server\r
+ String webdav_path = AccountUtils.getWebdavPath(mServerInfo.mVersion, mAuthTokenType);\r
+\r
+ /// test credentials accessing the root folder\r
+ String remotePath ="";\r
+ boolean successIfAbsent = false;\r
+ boolean followRedirections = false;\r
+ startExistenceCheckRemoteOperation(remotePath, this, successIfAbsent, webdav_path, "", "", followRedirections);\r
+\r
+ }\r
+\r
+ /**\r
+ * Callback method invoked when a RemoteOperation executed by this Activity finishes.\r
+ * \r
+ * Dispatches the operation flow to the right method.\r
+ */\r
+ @Override\r
+ public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) {\r
+\r
+ if (operation instanceof GetServerInfoOperation) {\r
+ if (operation.hashCode() == mWaitingForOpId) {\r
+ onGetServerInfoFinish(result);\r
+ } // else nothing ; only the last check operation is considered; \r
+ // multiple can be started if the user amends a URL quickly\r
+\r
+ } else if (operation instanceof OAuth2GetAccessToken) {\r
+ onGetOAuthAccessTokenFinish(result);\r
+\r
+ } else if (operation instanceof ExistenceCheckRemoteOperation) {\r
+ //Log_OC.wtf(TAG, "received detection response through callback" );\r
+ if (AccountTypeUtils.getAuthTokenTypeSamlSessionCookie(MainApp.getAccountType()).equals(mAuthTokenType)) {\r
+ onSamlBasedFederatedSingleSignOnAuthorizationStart(result);\r
+\r
+ } else {\r
+ onAuthorizationCheckFinish(result);\r
+ }\r
+ } else if (operation instanceof GetRemoteUserNameOperation) {\r
+ onGetUserNameFinish(result);\r
+ }\r
+\r
+ }\r
+\r
+ private void onGetUserNameFinish(RemoteOperationResult result) {\r
+ mWaitingForOpId = Long.MAX_VALUE;\r
+ if (result.isSuccess()) {\r
+ boolean success = false;\r
+ String username = (String) result.getData().get(0);\r
+\r
+ if ( mAction == ACTION_CREATE) {\r
+ mUsernameInput.setText(username);\r
+ success = createAccount();\r
+ } else {\r
+\r
+ if (!mUsernameInput.getText().toString().equals(username)) {\r
+ // fail - not a new account, but an existing one; disallow\r
+ result = new RemoteOperationResult(ResultCode.ACCOUNT_NOT_THE_SAME); \r
+ updateAuthStatusIconAndText(result);\r
+ showAuthStatus();\r
+ Log_OC.d(TAG, result.getLogMessage());\r
+ } else {\r
+ updateToken();\r
+ success = true;\r
+ }\r
+ }\r
+\r
+ if (success)\r
+ finish();\r
+ } else {\r
+ updateStatusIconFailUserName();\r
+ showAuthStatus();\r
+ Log_OC.e(TAG, "Access to user name failed: " + result.getLogMessage());\r
+ }\r
+\r
+ }\r
+\r
+ private void onSamlBasedFederatedSingleSignOnAuthorizationStart(RemoteOperationResult result) {\r
+ mWaitingForOpId = Long.MAX_VALUE;\r
+ dismissDialog(WAIT_DIALOG_TAG);\r
+
+ if (result.isIdPRedirection()) {
+ String url = result.getRedirectedLocation();\r
+ String targetUrl = mServerInfo.mBaseUrl \r
+ + AccountUtils.getWebdavPath(mServerInfo.mVersion, mAuthTokenType);\r
+\r
+ // Show dialog\r
+ SamlWebViewDialog dialog = SamlWebViewDialog.newInstance(url, targetUrl); \r
+ dialog.show(getSupportFragmentManager(), SAML_DIALOG_TAG);\r
+\r
+ mAuthStatusIcon = 0;\r
+ mAuthStatusText = 0;\r
+\r
+ } else {\r
+ mAuthStatusIcon = R.drawable.common_error;\r
+ mAuthStatusText = R.string.auth_unsupported_auth_method;\r
+\r
+ }\r
+ showAuthStatus();\r
+ }\r
+\r
+\r
+ /**\r
+ * Processes the result of the server check performed when the user finishes the enter of the\r
+ * server URL.\r
+ * \r
+ * @param operation Server check performed.\r
+ * @param result Result of the check.\r
+ */\r
+ private void onGetServerInfoFinish(RemoteOperationResult result) {\r
+ /// update activity state\r
+ mServerIsChecked = true;\r
+ mWaitingForOpId = Long.MAX_VALUE;\r
+ \r
+ // update server status, but don't show it yet\r
+ updateServerStatusIconAndText(result);\r
+\r
+ if (result.isSuccess()) {\r
+ /// SUCCESS means:\r
+ // 1. connection succeeded, and we know if it's SSL or not\r
+ // 2. server is installed\r
+ // 3. we got the server version\r
+ // 4. we got the authentication method required by the server \r
+ mServerInfo = (GetServerInfoOperation.ServerInfo) (result.getData().get(0));\r
+ \r
+ if (!authSupported(mServerInfo.mAuthMethod)) {\r
+ \r
+ updateServerStatusIconNoRegularAuth(); // overrides updateServerStatusIconAndText() \r
+ mServerIsValid = false;\r
+\r
+ } else {\r
+ mServerIsValid = true;\r
+ }\r
+ \r
+ } else {\r
+ mServerIsValid = false;\r
+ }\r
+\r
+ // refresh UI\r
+ showRefreshButton(!mServerIsValid);\r
+ showServerStatus();\r
+ mOkButton.setEnabled(mServerIsValid);\r
+ \r
+ /// very special case (TODO: move to a common place for all the remote operations)\r
+ if (result.getCode() == ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED) {\r
+ showUntrustedCertDialog(result);\r
+ }\r
+ }\r
+\r
+\r
+ private boolean authSupported(AuthenticationMethod authMethod) {\r
+ String basic = AccountTypeUtils.getAuthTokenTypePass(MainApp.getAccountType());\r
+ String oAuth = AccountTypeUtils.getAuthTokenTypeAccessToken(MainApp.getAccountType());\r
+ String saml = AccountTypeUtils.getAuthTokenTypeSamlSessionCookie(MainApp.getAccountType());\r
+ \r
+ return (( mAuthTokenType.equals(basic) && \r
+ authMethod.equals(AuthenticationMethod.BASIC_HTTP_AUTH) ) ||\r
+ ( mAuthTokenType.equals(oAuth) && \r
+ authMethod.equals(AuthenticationMethod.BEARER_TOKEN)) ||\r
+ ( mAuthTokenType.equals(saml) && \r
+ authMethod.equals(AuthenticationMethod.SAML_WEB_SSO))\r
+ );\r
+ }\r
+\r
+\r
+ // TODO remove, if possible\r
+ private String normalizeUrl(String url, boolean sslWhenUnprefixed) {\r
+ if (url != null && url.length() > 0) {\r
+ url = url.trim();\r
+ if (!url.toLowerCase().startsWith("http://") &&\r
+ !url.toLowerCase().startsWith("https://")) {\r
+ if (sslWhenUnprefixed) {\r
+ url = "https://" + url;\r
+ } else {\r
+ url = "http://" + url;\r
+ }\r
+ }\r
+ \r
+ url = trimUrlWebdav(url);\r
+\r
+ if (url.endsWith("/")) {\r
+ url = url.substring(0, url.length() - 1);\r
+ }\r
+\r
+ }\r
+ return (url != null ? url : "");\r
+ }\r
+\r
+\r
+ // TODO remove, if possible\r
+ private String trimUrlWebdav(String url){ \r
+ if(url.toLowerCase().endsWith(AccountUtils.WEBDAV_PATH_4_0)){\r
+ url = url.substring(0, url.length() - AccountUtils.WEBDAV_PATH_4_0.length()); \r
+ } else if(url.toLowerCase().endsWith(AccountUtils.WEBDAV_PATH_2_0)){\r
+ url = url.substring(0, url.length() - AccountUtils.WEBDAV_PATH_2_0.length()); \r
+ } else if (url.toLowerCase().endsWith(AccountUtils.WEBDAV_PATH_1_2)){\r
+ url = url.substring(0, url.length() - AccountUtils.WEBDAV_PATH_1_2.length()); \r
+ } \r
+ return (url != null ? url : "");\r
+ }\r
+\r
+\r
+ /**\r
+ * Chooses the right icon and text to show to the user for the received operation result.\r
+ * \r
+ * @param result Result of a remote operation performed in this activity\r
+ */\r
+ private void updateServerStatusIconAndText(RemoteOperationResult result) {\r
+ mServerStatusIcon = R.drawable.common_error; // the most common case in the switch below\r
+\r
+ switch (result.getCode()) {\r
+ case OK_SSL:\r
+ mServerStatusIcon = android.R.drawable.ic_secure;\r
+ mServerStatusText = R.string.auth_secure_connection;\r
+ break;\r
+\r
+ case OK_NO_SSL:\r
+ case OK:\r
+ if (mHostUrlInput.getText().toString().trim().toLowerCase().startsWith("http://") ) {\r
+ mServerStatusText = R.string.auth_connection_established;\r
+ mServerStatusIcon = R.drawable.ic_ok;\r
+ } else {\r
+ mServerStatusText = R.string.auth_nossl_plain_ok_title;\r
+ mServerStatusIcon = android.R.drawable.ic_partial_secure;\r
+ }\r
+ break;\r
+\r
+ case NO_NETWORK_CONNECTION:\r
+ mServerStatusIcon = R.drawable.no_network;\r
+ mServerStatusText = R.string.auth_no_net_conn_title;\r
+ break;\r
+\r
+ case SSL_RECOVERABLE_PEER_UNVERIFIED:\r
+ mServerStatusText = R.string.auth_ssl_unverified_server_title;\r
+ break;\r
+ case BAD_OC_VERSION:\r
+ mServerStatusText = R.string.auth_bad_oc_version_title;\r
+ break;\r
+ case WRONG_CONNECTION:\r
+ mServerStatusText = R.string.auth_wrong_connection_title;\r
+ break;\r
+ case TIMEOUT:\r
+ mServerStatusText = R.string.auth_timeout_title;\r
+ break;\r
+ case INCORRECT_ADDRESS:\r
+ mServerStatusText = R.string.auth_incorrect_address_title;\r
+ break;\r
+ case SSL_ERROR:\r
+ mServerStatusText = R.string.auth_ssl_general_error_title;\r
+ break;\r
+ case UNAUTHORIZED:\r
+ mServerStatusText = R.string.auth_unauthorized;\r
+ break;\r
+ case HOST_NOT_AVAILABLE:\r
+ mServerStatusText = R.string.auth_unknown_host_title;\r
+ break;\r
+ case INSTANCE_NOT_CONFIGURED:\r
+ mServerStatusText = R.string.auth_not_configured_title;\r
+ break;\r
+ case FILE_NOT_FOUND:\r
+ mServerStatusText = R.string.auth_incorrect_path_title;\r
+ break;\r
+ case OAUTH2_ERROR:\r
+ mServerStatusText = R.string.auth_oauth_error;\r
+ break;\r
+ case OAUTH2_ERROR_ACCESS_DENIED:\r
+ mServerStatusText = R.string.auth_oauth_error_access_denied;\r
+ break;\r
+ case UNHANDLED_HTTP_CODE:\r
+ case UNKNOWN_ERROR:\r
+ mServerStatusText = R.string.auth_unknown_error_title;\r
+ break;\r
+ default:\r
+ mServerStatusText = 0;\r
+ mServerStatusIcon = 0;\r
+ }\r
+ }\r
+\r
+\r
+ /**\r
+ * Chooses the right icon and text to show to the user for the received operation result.\r
+ * \r
+ * @param result Result of a remote operation performed in this activity\r
+ */\r
+ private void updateAuthStatusIconAndText(RemoteOperationResult result) {\r
+ mAuthStatusIcon = R.drawable.common_error; // the most common case in the switch below\r
+\r
+ switch (result.getCode()) {\r
+ case OK_SSL:\r
+ mAuthStatusIcon = android.R.drawable.ic_secure;\r
+ mAuthStatusText = R.string.auth_secure_connection;\r
+ break;\r
+\r
+ case OK_NO_SSL:\r
+ case OK:\r
+ if (mHostUrlInput.getText().toString().trim().toLowerCase().startsWith("http://") ) {\r
+ mAuthStatusText = R.string.auth_connection_established;\r
+ mAuthStatusIcon = R.drawable.ic_ok;\r
+ } else {\r
+ mAuthStatusText = R.string.auth_nossl_plain_ok_title;\r
+ mAuthStatusIcon = android.R.drawable.ic_partial_secure;\r
+ }\r
+ break;\r
+\r
+ case NO_NETWORK_CONNECTION:\r
+ mAuthStatusIcon = R.drawable.no_network;\r
+ mAuthStatusText = R.string.auth_no_net_conn_title;\r
+ break;\r
+\r
+ case SSL_RECOVERABLE_PEER_UNVERIFIED:\r
+ mAuthStatusText = R.string.auth_ssl_unverified_server_title;\r
+ break;\r
+ case BAD_OC_VERSION:\r
+ mAuthStatusText = R.string.auth_bad_oc_version_title;\r
+ break;\r
+ case WRONG_CONNECTION:\r
+ mAuthStatusText = R.string.auth_wrong_connection_title;\r
+ break;\r
+ case TIMEOUT:\r
+ mAuthStatusText = R.string.auth_timeout_title;\r
+ break;\r
+ case INCORRECT_ADDRESS:\r
+ mAuthStatusText = R.string.auth_incorrect_address_title;\r
+ break;\r
+ case SSL_ERROR:\r
+ mAuthStatusText = R.string.auth_ssl_general_error_title;\r
+ break;\r
+ case UNAUTHORIZED:\r
+ mAuthStatusText = R.string.auth_unauthorized;\r
+ break;\r
+ case HOST_NOT_AVAILABLE:\r
+ mAuthStatusText = R.string.auth_unknown_host_title;\r
+ break;\r
+ case INSTANCE_NOT_CONFIGURED:\r
+ mAuthStatusText = R.string.auth_not_configured_title;\r
+ break;\r
+ case FILE_NOT_FOUND:\r
+ mAuthStatusText = R.string.auth_incorrect_path_title;\r
+ break;\r
+ case OAUTH2_ERROR:\r
+ mAuthStatusText = R.string.auth_oauth_error;\r
+ break;\r
+ case OAUTH2_ERROR_ACCESS_DENIED:\r
+ mAuthStatusText = R.string.auth_oauth_error_access_denied;\r
+ break;\r
+ case ACCOUNT_NOT_NEW:\r
+ mAuthStatusText = R.string.auth_account_not_new;\r
+ break;\r
+ case ACCOUNT_NOT_THE_SAME:\r
+ mAuthStatusText = R.string.auth_account_not_the_same;\r
+ break;\r
+ case UNHANDLED_HTTP_CODE:\r
+ case UNKNOWN_ERROR:\r
+ mAuthStatusText = R.string.auth_unknown_error_title;\r
+ break;\r
+ default:\r
+ mAuthStatusText = 0;\r
+ mAuthStatusIcon = 0;\r
+ }\r
+ }\r
+\r
+\r
+ private void updateStatusIconFailUserName(){\r
+ mAuthStatusIcon = R.drawable.common_error;\r
+ mAuthStatusText = R.string.auth_fail_get_user_name;\r
+ }\r
+\r
+ private void updateServerStatusIconNoRegularAuth(){\r
+ mServerStatusIcon = R.drawable.common_error;\r
+ mServerStatusText = R.string.auth_can_not_auth_against_server;\r
+ }\r
+\r
+ /**\r
+ * Processes the result of the request for and access token send \r
+ * to an OAuth authorization server.\r
+ * \r
+ * @param result Result of the operation.\r
+ */\r
+ private void onGetOAuthAccessTokenFinish(RemoteOperationResult result) {\r
+ mWaitingForOpId = Long.MAX_VALUE;\r
+ dismissDialog(WAIT_DIALOG_TAG);\r
+\r
+ String webdav_path = AccountUtils.getWebdavPath(mServerInfo.mVersion, mAuthTokenType);\r
+ if (result.isSuccess() && webdav_path != null) {\r
+ /// be gentle with the user\r
+ IndeterminateProgressDialog dialog = \r
+ IndeterminateProgressDialog.newInstance(R.string.auth_trying_to_login, true);\r
+ dialog.show(getSupportFragmentManager(), WAIT_DIALOG_TAG);\r
+\r
+ /// time to test the retrieved access token on the ownCloud server\r
+ @SuppressWarnings("unchecked")\r
+ Map<String, String> tokens = (Map<String, String>)(result.getData().get(0));\r
+ mAuthToken = tokens.get(OAuth2Constants.KEY_ACCESS_TOKEN);\r
+ //mAuthToken = ((OAuth2GetAccessToken)operation).getResultTokenMap().get(OAuth2Constants.KEY_ACCESS_TOKEN);\r
+ Log_OC.d(TAG, "Got ACCESS TOKEN: " + mAuthToken);\r
+ \r
+ String remotePath ="";\r
+ boolean successIfAbsent = false;\r
+ boolean followRedirects = true;\r
+ startExistenceCheckRemoteOperation(remotePath, this, successIfAbsent, webdav_path, "", "", followRedirects);\r
+\r
+ } else {\r
+ updateAuthStatusIconAndText(result);\r
+ showAuthStatus();\r
+ Log_OC.d(TAG, "Access failed: " + result.getLogMessage());\r
+ }\r
+ }\r
+\r
+\r
+ /**\r
+ * Processes the result of the access check performed to try the user credentials.\r
+ * \r
+ * Creates a new account through the AccountManager.\r
+ * \r
+ * @param operation Access check performed.\r
+ * @param result Result of the operation.\r
+ */\r
+ private void onAuthorizationCheckFinish(RemoteOperationResult result) {\r
+ mWaitingForOpId = Long.MAX_VALUE;\r
+ dismissDialog(WAIT_DIALOG_TAG);\r
+\r
+ if (result.isSuccess()) {\r
+ Log_OC.d(TAG, "Successful access - time to save the account");\r
+\r
+ boolean success = false;\r
+ if (mAction == ACTION_CREATE) {\r
+ success = createAccount();\r
+\r
+ } else {\r
+ updateToken();\r
+ success = true;\r
+ }\r
+\r
+ if (success) {\r
+ finish();\r
+ }\r
+ \r
+ } else if (result.isServerFail() || result.isException()) {
+ /// server errors or exceptions in authorization take to requiring a new check of \r
+ /// the server\r
+ mServerIsChecked = true;\r
+ mServerIsValid = false;\r
+ mServerInfo = new GetServerInfoOperation.ServerInfo(); \r
+\r
+ // update status icon and text\r
+ updateServerStatusIconAndText(result);\r
+ showServerStatus();\r
+ mAuthStatusIcon = 0;\r
+ mAuthStatusText = 0;\r
+ showAuthStatus();\r
+\r
+ // update input controls state\r
+ showRefreshButton(true);\r
+ mOkButton.setEnabled(false);\r
+\r
+ // very special case (TODO: move to a common place for all the remote operations) (dangerous here?)\r
+ if (result.getCode() == ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED) {\r
+ showUntrustedCertDialog(result);\r
+ }\r
+\r
+ } else { // authorization fail due to client side - probably wrong credentials\r
+ updateAuthStatusIconAndText(result);\r
+ showAuthStatus();\r
+ Log_OC.d(TAG, "Access failed: " + result.getLogMessage());\r
+ }\r
+ }\r
+\r
+\r
+\r
+\r
+ /**\r
+ * Sets the proper response to get that the Account Authenticator that started this activity saves \r
+ * a new authorization token for mAccount.\r
+ */\r
+ private void updateToken() {\r
+ Bundle response = new Bundle();\r
+ response.putString(AccountManager.KEY_ACCOUNT_NAME, mAccount.name);\r
+ response.putString(AccountManager.KEY_ACCOUNT_TYPE, mAccount.type);\r
+\r
+ if (AccountTypeUtils.getAuthTokenTypeAccessToken(MainApp.getAccountType()).equals(mAuthTokenType)) { \r
+ response.putString(AccountManager.KEY_AUTHTOKEN, mAuthToken);\r
+ // the next line is necessary; by now, notifications are calling directly to the AuthenticatorActivity to update, without AccountManager intervention\r
+ mAccountMgr.setAuthToken(mAccount, mAuthTokenType, mAuthToken);\r
+\r
+ } else if (AccountTypeUtils.getAuthTokenTypeSamlSessionCookie(MainApp.getAccountType()).equals(mAuthTokenType)) {\r
+\r
+ response.putString(AccountManager.KEY_AUTHTOKEN, mAuthToken);\r
+ // the next line is necessary; by now, notifications are calling directly to the AuthenticatorActivity to update, without AccountManager intervention\r
+ mAccountMgr.setAuthToken(mAccount, mAuthTokenType, mAuthToken);\r
+\r
+ } else {\r
+ response.putString(AccountManager.KEY_AUTHTOKEN, mPasswordInput.getText().toString());\r
+ mAccountMgr.setPassword(mAccount, mPasswordInput.getText().toString());\r
+ }\r
+ setAccountAuthenticatorResult(response);\r
+\r
+ }\r
+\r
+\r
+ /**\r
+ * Creates a new account through the Account Authenticator that started this activity. \r
+ * \r
+ * This makes the account permanent.\r
+ * \r
+ * TODO Decide how to name the OAuth accounts\r
+ */\r
+ private boolean createAccount() {\r
+ /// create and save new ownCloud account\r
+ boolean isOAuth = AccountTypeUtils.getAuthTokenTypeAccessToken(MainApp.getAccountType()).equals(mAuthTokenType);\r
+ boolean isSaml = AccountTypeUtils.getAuthTokenTypeSamlSessionCookie(MainApp.getAccountType()).equals(mAuthTokenType);\r
+\r
+ Uri uri = Uri.parse(mServerInfo.mBaseUrl);\r
+ String username = mUsernameInput.getText().toString().trim();\r
+ if (isOAuth) {\r
+ username = "OAuth_user" + (new java.util.Random(System.currentTimeMillis())).nextLong();\r
+ } \r
+ String accountName = username + "@" + uri.getHost();\r
+ if (uri.getPort() >= 0) {\r
+ accountName += ":" + uri.getPort();\r
+ }\r
+ Account newAccount = new Account(accountName, MainApp.getAccountType());\r
+ if (AccountUtils.exists(newAccount, getApplicationContext())) {\r
+ // fail - not a new account, but an existing one; disallow\r
+ RemoteOperationResult result = new RemoteOperationResult(ResultCode.ACCOUNT_NOT_NEW); \r
+ updateAuthStatusIconAndText(result);\r
+ showAuthStatus();\r
+ Log_OC.d(TAG, result.getLogMessage());\r
+ return false;\r
+\r
+ } else {\r
+ mAccount = newAccount;\r
+ \r
+ if (isOAuth || isSaml) {\r
+ mAccountMgr.addAccountExplicitly(mAccount, "", null); // with external authorizations, the password is never input in the app\r
+ } else {\r
+ mAccountMgr.addAccountExplicitly(mAccount, mPasswordInput.getText().toString(), null);\r
+ }\r
+\r
+ /// add the new account as default in preferences, if there is none already\r
+ Account defaultAccount = AccountUtils.getCurrentOwnCloudAccount(this);\r
+ if (defaultAccount == null) {\r
+ SharedPreferences.Editor editor = PreferenceManager\r
+ .getDefaultSharedPreferences(this).edit();\r
+ editor.putString("select_oc_account", accountName);\r
+ editor.commit();\r
+ }\r
+\r
+ /// prepare result to return to the Authenticator\r
+ // TODO check again what the Authenticator makes with it; probably has the same effect as addAccountExplicitly, but it's not well done\r
+ final Intent intent = new Intent(); \r
+ intent.putExtra(AccountManager.KEY_ACCOUNT_TYPE, MainApp.getAccountType());\r
+ intent.putExtra(AccountManager.KEY_ACCOUNT_NAME, mAccount.name);\r
+ /*if (!isOAuth)\r
+ intent.putExtra(AccountManager.KEY_AUTHTOKEN, MainApp.getAccountType()); */\r
+ intent.putExtra(AccountManager.KEY_USERDATA, username);\r
+ if (isOAuth || isSaml) {\r
+ mAccountMgr.setAuthToken(mAccount, mAuthTokenType, mAuthToken);\r
+ }\r
+ /// add user data to the new account; TODO probably can be done in the last parameter addAccountExplicitly, or in KEY_USERDATA
+ mAccountMgr.setUserData(mAccount, Constants.KEY_OC_VERSION, mServerInfo.mVersion.getVersion());\r
+ mAccountMgr.setUserData(mAccount, Constants.KEY_OC_BASE_URL, mServerInfo.mBaseUrl);\r
+
+ if (isSaml) {\r
+ mAccountMgr.setUserData(mAccount, Constants.KEY_SUPPORTS_SAML_WEB_SSO, "TRUE"); \r
+ } else if (isOAuth) {\r
+ mAccountMgr.setUserData(mAccount, Constants.KEY_SUPPORTS_OAUTH2, "TRUE"); \r
+ }\r
+\r
+ setAccountAuthenticatorResult(intent.getExtras());\r
+ setResult(RESULT_OK, intent);\r
+\r
+ return true;\r
+ }\r
+ }\r
+\r
+\r
+ /**\r
+ * Starts and activity to open the 'new account' page in the ownCloud web site\r
+ * \r
+ * @param view 'Account register' button\r
+ */\r
+ public void onRegisterClick(View view) {\r
+ Intent register = new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.welcome_link_url)));\r
+ setResult(RESULT_CANCELED);\r
+ startActivity(register);\r
+ }\r
+\r
+\r
+ /**\r
+ * Updates the content and visibility state of the icon and text associated\r
+ * to the last check on the ownCloud server.\r
+ * \r
+ * @param serverStatusText Resource identifier of the text to show.\r
+ * @param serverStatusIcon Resource identifier of the icon to show.\r
+ */\r
+ private void showServerStatus() {\r
+ if (mServerStatusIcon == 0 && mServerStatusText == 0) {\r
+ mServerStatusView.setVisibility(View.INVISIBLE);\r
+\r
+ } else {\r
+ mServerStatusView.setText(mServerStatusText);\r
+ mServerStatusView.setCompoundDrawablesWithIntrinsicBounds(mServerStatusIcon, 0, 0, 0);\r
+ mServerStatusView.setVisibility(View.VISIBLE);\r
+ }\r
+\r
+ }\r
+\r
+\r
+ /**\r
+ * Updates the content and visibility state of the icon and text associated\r
+ * to the interactions with the OAuth authorization server.\r
+ */\r
+ private void showAuthStatus() {\r
+ if (mAuthStatusIcon == 0 && mAuthStatusText == 0) {\r
+ mAuthStatusView.setVisibility(View.INVISIBLE);\r
+\r
+ } else {\r
+ mAuthStatusView.setText(mAuthStatusText);\r
+ mAuthStatusView.setCompoundDrawablesWithIntrinsicBounds(mAuthStatusIcon, 0, 0, 0);\r
+ mAuthStatusView.setVisibility(View.VISIBLE);\r
+ }\r
+ } \r
+\r
+\r
+ private void showRefreshButton (boolean show) {\r
+ if (show) {\r
+ mRefreshButton.setVisibility(View.VISIBLE);\r
+ } else {\r
+ mRefreshButton.setVisibility(View.GONE);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Called when the refresh button in the input field for ownCloud host is clicked.\r
+ * \r
+ * Performs a new check on the URL in the input field.\r
+ * \r
+ * @param view Refresh 'button'\r
+ */\r
+ public void onRefreshClick(View view) {\r
+ checkOcServer();\r
+ }\r
+\r
+\r
+ /**\r
+ * Called when the eye icon in the password field is clicked.\r
+ * \r
+ * Toggles the visibility of the password in the field. \r
+ */\r
+ public void onViewPasswordClick() {\r
+ int selectionStart = mPasswordInput.getSelectionStart();\r
+ int selectionEnd = mPasswordInput.getSelectionEnd();\r
+ if (isPasswordVisible()) {\r
+ hidePassword();\r
+ } else {\r
+ showPassword();\r
+ }\r
+ mPasswordInput.setSelection(selectionStart, selectionEnd);\r
+ } \r
+\r
+\r
+ /**\r
+ * Called when the checkbox for OAuth authorization is clicked.\r
+ * \r
+ * Hides or shows the input fields for user & password. \r
+ * \r
+ * @param view 'View password' 'button'\r
+ */\r
+ public void onCheckClick(View view) {\r
+ CheckBox oAuth2Check = (CheckBox)view;\r
+ if (oAuth2Check.isChecked()) {\r
+ mAuthTokenType = AccountTypeUtils.getAuthTokenTypeAccessToken(MainApp.getAccountType());\r
+ } else {\r
+ mAuthTokenType = AccountTypeUtils.getAuthTokenTypePass(MainApp.getAccountType());\r
+ }\r
+ updateAuthenticationPreFragmentVisibility();\r
+ }\r
+\r
+\r
+ /**\r
+ * Called when the 'action' button in an IME is pressed ('enter' in software keyboard).\r
+ * \r
+ * Used to trigger the authentication check when the user presses 'enter' after writing the password, \r
+ * or to throw the server test when the only field on screen is the URL input field.\r
+ */\r
+ @Override\r
+ public boolean onEditorAction(TextView inputField, int actionId, KeyEvent event) {\r
+ if (actionId == EditorInfo.IME_ACTION_DONE && inputField != null && inputField.equals(mPasswordInput)) {\r
+ if (mOkButton.isEnabled()) {\r
+ mOkButton.performClick();\r
+ }\r
+\r
+ } else if (actionId == EditorInfo.IME_ACTION_NEXT && inputField != null && inputField.equals(mHostUrlInput)) {\r
+ if (AccountTypeUtils.getAuthTokenTypeSamlSessionCookie(MainApp.getAccountType()).equals(mAuthTokenType)) {\r
+ checkOcServer();\r
+ }\r
+ }\r
+ return false; // always return false to grant that the software keyboard is hidden anyway\r
+ }\r
+\r
+\r
+ private abstract static class RightDrawableOnTouchListener implements OnTouchListener {\r
+\r
+ private int fuzz = 75;\r
+\r
+ /**\r
+ * {@inheritDoc}\r
+ */\r
+ @Override\r
+ public boolean onTouch(View view, MotionEvent event) {\r
+ Drawable rightDrawable = null;\r
+ if (view instanceof TextView) {\r
+ Drawable[] drawables = ((TextView)view).getCompoundDrawables();\r
+ if (drawables.length > 2) {\r
+ rightDrawable = drawables[2];\r
+ }\r
+ }\r
+ if (rightDrawable != null) {\r
+ final int x = (int) event.getX();\r
+ final int y = (int) event.getY();\r
+ final Rect bounds = rightDrawable.getBounds();\r
+ if (x >= (view.getRight() - bounds.width() - fuzz) && x <= (view.getRight() - view.getPaddingRight() + fuzz)\r
+ && y >= (view.getPaddingTop() - fuzz) && y <= (view.getHeight() - view.getPaddingBottom()) + fuzz) {\r
+\r
+ return onDrawableTouch(event);\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+\r
+ public abstract boolean onDrawableTouch(final MotionEvent event);\r
+ }\r
+\r
+\r
+ private void getRemoteUserNameOperation(String sessionCookie, boolean followRedirects) {\r
+ \r
+ Intent getUserNameIntent = new Intent();\r
+ getUserNameIntent.setAction(OperationsService.ACTION_GET_USER_NAME);\r
+ getUserNameIntent.putExtra(OperationsService.EXTRA_SERVER_URL, mServerInfo.mBaseUrl);\r
+ getUserNameIntent.putExtra(OperationsService.EXTRA_COOKIE, sessionCookie);\r
+ getUserNameIntent.putExtra(OperationsService.EXTRA_FOLLOW_REDIRECTS, followRedirects);\r
+ \r
+ if (mOperationsServiceBinder != null) {\r
+ //Log_OC.wtf(TAG, "starting getRemoteUserNameOperation..." );\r
+ mWaitingForOpId = mOperationsServiceBinder.newOperation(getUserNameIntent);\r
+ }\r
+ }\r
+\r
+\r
+ @Override\r
+ public void onSsoFinished(String sessionCookie) {\r
+ if (sessionCookie != null && sessionCookie.length() > 0) {\r
+ Log_OC.d(TAG, "Successful SSO - time to save the account");\r
+ mAuthToken = sessionCookie;\r
+ getRemoteUserNameOperation(sessionCookie, true);\r
+ Fragment fd = getSupportFragmentManager().findFragmentByTag(SAML_DIALOG_TAG);\r
+ if (fd != null && fd instanceof SherlockDialogFragment) {\r
+ Dialog d = ((SherlockDialogFragment)fd).getDialog();\r
+ if (d != null && d.isShowing()) {\r
+ d.dismiss();\r
+ }\r
+ }\r
+\r
+ } else { \r
+ // TODO - show fail\r
+ Log_OC.d(TAG, "SSO failed");\r
+ }\r
+\r
+ }\r
+\r
+ @Override\r
+ public boolean onTouchEvent(MotionEvent event) {\r
+ if (AccountTypeUtils.getAuthTokenTypeSamlSessionCookie(MainApp.getAccountType()).equals(mAuthTokenType) &&\r
+ mHostUrlInput.hasFocus() && event.getAction() == MotionEvent.ACTION_DOWN) {\r
+ checkOcServer();\r
+ }\r
+ return super.onTouchEvent(event);\r
+ }\r
+\r
+\r
+ /**\r
+ * Show untrusted cert dialog \r
+ */\r
+ public void showUntrustedCertDialog(X509Certificate x509Certificate, SslError error, SslErrorHandler handler) {\r
+ // Show a dialog with the certificate info\r
+ SslUntrustedCertDialog dialog = null;\r
+ if (x509Certificate == null) {\r
+ dialog = SslUntrustedCertDialog.newInstanceForEmptySslError(error, handler);\r
+ } else {\r
+ dialog = SslUntrustedCertDialog.newInstanceForFullSslError(x509Certificate, error, handler);\r
+ }\r
+ FragmentManager fm = getSupportFragmentManager();\r
+ FragmentTransaction ft = fm.beginTransaction();\r
+ ft.addToBackStack(null);\r
+ dialog.show(ft, UNTRUSTED_CERT_DIALOG_TAG);\r
+ }\r
+\r
+ /**\r
+ * Show untrusted cert dialog \r
+ */\r
+ private void showUntrustedCertDialog(RemoteOperationResult result) {\r
+ // Show a dialog with the certificate info\r
+ SslUntrustedCertDialog dialog = SslUntrustedCertDialog.newInstanceForFullSslError((CertificateCombinedException)result.getException());\r
+ FragmentManager fm = getSupportFragmentManager();\r
+ FragmentTransaction ft = fm.beginTransaction();\r
+ ft.addToBackStack(null);\r
+ dialog.show(ft, UNTRUSTED_CERT_DIALOG_TAG);\r
+\r
+ }\r
+\r
+ /**\r
+ * Called from SslValidatorDialog when a new server certificate was correctly saved.\r
+ */\r
+ public void onSavedCertificate() {\r
+ Fragment fd = getSupportFragmentManager().findFragmentByTag(SAML_DIALOG_TAG);\r
+ if (fd == null) {\r
+ // if SAML dialog is not shown, the SslDialog was shown due to an SSL error in the server check\r
+ checkOcServer();\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Called from SslValidatorDialog when a new server certificate could not be saved \r
+ * when the user requested it.\r
+ */\r
+ @Override\r
+ public void onFailedSavingCertificate() {\r
+ dismissDialog(SAML_DIALOG_TAG);\r
+ Toast.makeText(this, R.string.ssl_validator_not_saved, Toast.LENGTH_LONG).show();\r
+ }\r
+\r
+ @Override\r
+ public void onCancelCertificate() {\r
+ dismissDialog(SAML_DIALOG_TAG);\r
+ }\r
+\r
+\r
+ private void doOnResumeAndBound() {\r
+ //Log_OC.wtf(TAG, "registering to listen for operation callbacks" );\r
+ mOperationsServiceBinder.addOperationListener(AuthenticatorActivity.this, mHandler);\r
+ if (mWaitingForOpId <= Integer.MAX_VALUE) {\r
+ mOperationsServiceBinder.dispatchResultIfFinished((int)mWaitingForOpId, this);\r
+ }\r
+ }\r
+\r
+ \r
+ private void dismissDialog(String dialogTag){\r
+ Fragment frag = getSupportFragmentManager().findFragmentByTag(dialogTag);\r
+ if (frag != null && frag instanceof SherlockDialogFragment) {\r
+ SherlockDialogFragment dialog = (SherlockDialogFragment) frag;\r
+ dialog.dismiss();\r
+ }\r
+ }\r
+ \r
+ \r
+ /** \r
+ * Implements callback methods for service binding. \r
+ */\r
+ private class OperationsServiceConnection implements ServiceConnection {\r
+\r
+ @Override\r
+ public void onServiceConnected(ComponentName component, IBinder service) {\r
+ if (component.equals(new ComponentName(AuthenticatorActivity.this, OperationsService.class))) {\r
+ //Log_OC.wtf(TAG, "Operations service connected");\r
+ mOperationsServiceBinder = (OperationsServiceBinder) service;\r
+ \r
+ doOnResumeAndBound();\r
+ \r
+ } else {\r
+ return;\r
+ }\r
+ \r
+ }\r
+\r
+ @Override\r
+ public void onServiceDisconnected(ComponentName component) {\r
+ if (component.equals(new ComponentName(AuthenticatorActivity.this, OperationsService.class))) {\r
+ Log_OC.e(TAG, "Operations service crashed");\r
+ mOperationsServiceBinder = null;\r
+ }\r
+ }\r
+ \r
+ }\r
+ \r
+}\r
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2013 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.authentication;
+
+/**
+ * Constant values for OAuth 2 protocol.
+ *
+ * Includes required and optional parameter NAMES used in the 'authorization code' grant type.
+ *
+ * @author David A. Velasco
+ */
+
+public class OAuth2Constants {
+
+ /// Parameters to send to the Authorization Endpoint
+ public static final String KEY_RESPONSE_TYPE = "response_type";
+ public static final String KEY_REDIRECT_URI = "redirect_uri";
+ public static final String KEY_CLIENT_ID = "client_id";
+ public static final String KEY_SCOPE = "scope";
+ public static final String KEY_STATE = "state";
+
+ /// Additional parameters to send to the Token Endpoint
+ public static final String KEY_GRANT_TYPE = "grant_type";
+ public static final String KEY_CODE = "code";
+
+ /// Parameters received in an OK response from the Token Endpoint
+ public static final String KEY_ACCESS_TOKEN = "access_token";
+ public static final String KEY_TOKEN_TYPE = "token_type";
+ public static final String KEY_EXPIRES_IN = "expires_in";
+ public static final String KEY_REFRESH_TOKEN = "refresh_token";
+
+ /// Parameters in an ERROR response
+ public static final String KEY_ERROR = "error";
+ public static final String KEY_ERROR_DESCRIPTION = "error_description";
+ public static final String KEY_ERROR_URI = "error_uri";
+ public static final String VALUE_ERROR_ACCESS_DENIED = "access_denied";
+
+}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2014 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.authentication;
+
+import android.accounts.Account;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Account with extra information specific for ownCloud accounts.
+ *
+ * TODO integrate in the main app
+ *
+ * @author David A. Velasco
+ */
+public class OwnCloudAccount extends Account {
+
+ private String mAuthTokenType;
+
+ public OwnCloudAccount(String name, String type, String authTokenType) {
+ super(name, type);
+ // TODO validate authTokentype as supported
+ mAuthTokenType = authTokenType;
+ }
+
+ /**
+ * Reconstruct from parcel
+ *
+ * @param source The source parcel
+ */
+ public OwnCloudAccount(Parcel source) {
+ super(source);
+ mAuthTokenType = source.readString();
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ super.writeToParcel(dest, flags);
+ dest.writeString(mAuthTokenType);
+ }
+
+
+ public String getAuthTokenType() {
+ return mAuthTokenType;
+ }
+
+
+ public static final Parcelable.Creator<OwnCloudAccount> CREATOR = new Parcelable.Creator<OwnCloudAccount>() {
+ @Override
+ public OwnCloudAccount createFromParcel(Parcel source) {
+ return new OwnCloudAccount(source);
+ }
+
+ @Override
+ public OwnCloudAccount [] newArray(int size) {
+ return new OwnCloudAccount[size];
+ }
+ };
+
+}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2013 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.authentication;
+
+import java.io.ByteArrayInputStream;
+import java.lang.ref.WeakReference;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+
+import com.owncloud.android.lib.common.network.NetworkUtils;
+import com.owncloud.android.utils.Log_OC;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.net.http.SslCertificate;
+import android.net.http.SslError;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.view.KeyEvent;
+import android.view.View;
+import android.webkit.CookieManager;
+import android.webkit.HttpAuthHandler;
+import android.webkit.SslErrorHandler;
+import android.webkit.WebResourceResponse;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+
+
+/**
+ * Custom {@link WebViewClient} client aimed to catch the end of a single-sign-on process
+ * running in the {@link WebView} that is attached to.
+ *
+ * Assumes that the single-sign-on is kept thanks to a cookie set at the end of the
+ * authentication process.
+ *
+ * @author David A. Velasco
+ */
+public class SsoWebViewClient extends WebViewClient {
+
+ private static final String TAG = SsoWebViewClient.class.getSimpleName();
+
+ public interface SsoWebViewClientListener {
+ public void onSsoFinished(String sessionCookie);
+ }
+
+ private Context mContext;
+ private Handler mListenerHandler;
+ private WeakReference<SsoWebViewClientListener> mListenerRef;
+ private String mTargetUrl;
+ private String mLastReloadedUrlAtError;
+
+ public SsoWebViewClient (Context context, Handler listenerHandler, SsoWebViewClientListener listener) {
+ mContext = context;
+ mListenerHandler = listenerHandler;
+ mListenerRef = new WeakReference<SsoWebViewClient.SsoWebViewClientListener>(listener);
+ mTargetUrl = "fake://url.to.be.set";
+ mLastReloadedUrlAtError = null;
+ }
+
+ public String getTargetUrl() {
+ return mTargetUrl;
+ }
+
+ public void setTargetUrl(String targetUrl) {
+ mTargetUrl = targetUrl;
+ }
+
+ @Override
+ public void onPageStarted (WebView view, String url, Bitmap favicon) {
+ Log_OC.d(TAG, "onPageStarted : " + url);
+ super.onPageStarted(view, url, favicon);
+ }
+
+ @Override
+ public void onFormResubmission (WebView view, Message dontResend, Message resend) {
+ Log_OC.d(TAG, "onFormResubMission ");
+
+ // necessary to grant reload of last page when device orientation is changed after sending a form
+ resend.sendToTarget();
+ }
+
+ @Override
+ public boolean shouldOverrideUrlLoading(WebView view, String url) {
+ return false;
+ }
+
+ @Override
+ public void onReceivedError (WebView view, int errorCode, String description, String failingUrl) {
+ Log_OC.e(TAG, "onReceivedError : " + failingUrl + ", code " + errorCode + ", description: " + description);
+ if (!failingUrl.equals(mLastReloadedUrlAtError)) {
+ view.reload();
+ mLastReloadedUrlAtError = failingUrl;
+ } else {
+ mLastReloadedUrlAtError = null;
+ super.onReceivedError(view, errorCode, description, failingUrl);
+ }
+ }
+
+ @Override
+ public void onPageFinished (WebView view, String url) {
+ Log_OC.d(TAG, "onPageFinished : " + url);
+ mLastReloadedUrlAtError = null;
+ if (url.startsWith(mTargetUrl)) {
+ view.setVisibility(View.GONE);
+ CookieManager cookieManager = CookieManager.getInstance();
+ final String cookies = cookieManager.getCookie(url);
+ Log_OC.d(TAG, "Cookies: " + cookies);
+ if (mListenerHandler != null && mListenerRef != null) {
+ // this is good idea because onPageFinished is not running in the UI thread
+ mListenerHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ SsoWebViewClientListener listener = mListenerRef.get();
+ if (listener != null) {
+ // Send Cookies to the listener
+ listener.onSsoFinished(cookies);
+ }
+ }
+ });
+ }
+ }
+ }
+
+
+ @Override
+ public void doUpdateVisitedHistory (WebView view, String url, boolean isReload) {
+ Log_OC.d(TAG, "doUpdateVisitedHistory : " + url);
+ }
+
+ @Override
+ public void onReceivedSslError (final WebView view, final SslErrorHandler handler, SslError error) {
+ Log_OC.d(TAG, "onReceivedSslError : " + error);
+ // Test 1
+ X509Certificate x509Certificate = getX509CertificateFromError(error);
+ boolean isKnownServer = false;
+
+ if (x509Certificate != null) {
+ Log_OC.d(TAG, "------>>>>> x509Certificate " + x509Certificate.toString());
+
+ try {
+ isKnownServer = NetworkUtils.isCertInKnownServersStore((Certificate) x509Certificate, mContext);
+ } catch (Exception e) {
+ Log_OC.e(TAG, "Exception: " + e.getMessage());
+ }
+ }
+
+ if (isKnownServer) {
+ handler.proceed();
+ } else {
+ ((AuthenticatorActivity)mContext).showUntrustedCertDialog(x509Certificate, error, handler);
+ }
+ }
+
+ /**
+ * Obtain the X509Certificate from SslError
+ * @param error SslError
+ * @return X509Certificate from error
+ */
+ public X509Certificate getX509CertificateFromError (SslError error) {
+ Bundle bundle = SslCertificate.saveState(error.getCertificate());
+ X509Certificate x509Certificate;
+ byte[] bytes = bundle.getByteArray("x509-certificate");
+ if (bytes == null) {
+ x509Certificate = null;
+ } else {
+ try {
+ CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
+ Certificate cert = certFactory.generateCertificate(new ByteArrayInputStream(bytes));
+ x509Certificate = (X509Certificate) cert;
+ } catch (CertificateException e) {
+ x509Certificate = null;
+ }
+ }
+ return x509Certificate;
+ }
+
+ @Override
+ public void onReceivedHttpAuthRequest (WebView view, HttpAuthHandler handler, String host, String realm) {
+ Log_OC.d(TAG, "onReceivedHttpAuthRequest : " + host);
+ }
+
+ @Override
+ public WebResourceResponse shouldInterceptRequest (WebView view, String url) {
+ Log_OC.d(TAG, "shouldInterceptRequest : " + url);
+ return null;
+ }
+
+ @Override
+ public void onLoadResource (WebView view, String url) {
+ Log_OC.d(TAG, "onLoadResource : " + url);
+ }
+
+ @Override
+ public void onReceivedLoginRequest (WebView view, String realm, String account, String args) {
+ Log_OC.d(TAG, "onReceivedLoginRequest : " + realm + ", " + account + ", " + args);
+ }
+
+ @Override
+ public void onScaleChanged (WebView view, float oldScale, float newScale) {
+ Log_OC.d(TAG, "onScaleChanged : " + oldScale + " -> " + newScale);
+ super.onScaleChanged(view, oldScale, newScale);
+ }
+
+ @Override
+ public void onUnhandledKeyEvent (WebView view, KeyEvent event) {
+ Log_OC.d(TAG, "onUnhandledKeyEvent : " + event);
+ }
+
+ @Override
+ public boolean shouldOverrideKeyEvent (WebView view, KeyEvent event) {
+ Log_OC.d(TAG, "shouldOverrideKeyEvent : " + event);
+ return false;
+ }
+
+}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.authenticator;
-
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.ui.activity.AuthenticatorActivity;
-
-import android.accounts.*;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.util.Log;
-
-public class AccountAuthenticator extends AbstractAccountAuthenticator {
- /**
- * Is used by android system to assign accounts to authenticators. Should be
- * used by application and all extensions.
- */
- public static final String ACCOUNT_TYPE = "owncloud";
- public static final String AUTH_TOKEN_TYPE = "org.owncloud";
-
- public static final String KEY_AUTH_TOKEN_TYPE = "authTokenType";
- public static final String KEY_REQUIRED_FEATURES = "requiredFeatures";
- public static final String KEY_LOGIN_OPTIONS = "loginOptions";
- public static final String KEY_ACCOUNT = "account";
- /**
- * Value under this key should handle path to webdav php script. Will be
- * removed and usage should be replaced by combining
- * {@link com.owncloud.android.authenticator.AuthenticatorActivity.KEY_OC_BASE_URL} and
- * {@link com.owncloud.android.utils.OwnCloudVersion}
- *
- * @deprecated
- */
- public static final String KEY_OC_URL = "oc_url";
- /**
- * Version should be 3 numbers separated by dot so it can be parsed by
- * {@link com.owncloud.android.utils.OwnCloudVersion}
- */
- public static final String KEY_OC_VERSION = "oc_version";
- /**
- * Base url should point to owncloud installation without trailing / ie:
- * http://server/path or https://owncloud.server
- */
- public static final String KEY_OC_BASE_URL = "oc_base_url";
-
- private static final String TAG = "AccountAuthenticator";
- private Context mContext;
-
- public AccountAuthenticator(Context context) {
- super(context);
- mContext = context;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Bundle addAccount(AccountAuthenticatorResponse response,
- String accountType, String authTokenType,
- String[] requiredFeatures, Bundle options)
- throws NetworkErrorException {
- Log_OC.i(TAG, "Adding account with type " + accountType
- + " and auth token " + authTokenType);
- try {
- validateAccountType(accountType);
- } catch (AuthenticatorException e) {
- Log_OC.e(TAG, "Failed to validate account type " + accountType + ": "
- + e.getMessage());
- e.printStackTrace();
- return e.getFailureBundle();
- }
- final Intent intent = new Intent(mContext, AuthenticatorActivity.class);
- intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE,
- response);
- intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType);
- intent.putExtra(KEY_REQUIRED_FEATURES, requiredFeatures);
- intent.putExtra(KEY_LOGIN_OPTIONS, options);
-
- setIntentFlags(intent);
- final Bundle bundle = new Bundle();
- bundle.putParcelable(AccountManager.KEY_INTENT, intent);
- return bundle;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Bundle confirmCredentials(AccountAuthenticatorResponse response,
- Account account, Bundle options) throws NetworkErrorException {
- try {
- validateAccountType(account.type);
- } catch (AuthenticatorException e) {
- Log_OC.e(TAG, "Failed to validate account type " + account.type + ": "
- + e.getMessage());
- e.printStackTrace();
- return e.getFailureBundle();
- }
- Intent intent = new Intent(mContext, AuthenticatorActivity.class);
- intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE,
- response);
- intent.putExtra(KEY_ACCOUNT, account);
- intent.putExtra(KEY_LOGIN_OPTIONS, options);
-
- setIntentFlags(intent);
-
- Bundle resultBundle = new Bundle();
- resultBundle.putParcelable(AccountManager.KEY_INTENT, intent);
- return resultBundle;
- }
-
- @Override
- public Bundle editProperties(AccountAuthenticatorResponse response,
- String accountType) {
- return null;
- }
-
- @Override
- public Bundle getAuthToken(AccountAuthenticatorResponse response,
- Account account, String authTokenType, Bundle options)
- throws NetworkErrorException {
- try {
- validateAccountType(account.type);
- validateAuthTokenType(authTokenType);
- } catch (AuthenticatorException e) {
- Log_OC.e(TAG, "Failed to validate account type " + account.type + ": "
- + e.getMessage());
- e.printStackTrace();
- return e.getFailureBundle();
- }
- final AccountManager am = AccountManager.get(mContext);
- final String password = am.getPassword(account);
- if (password != null) {
- final Bundle result = new Bundle();
- result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
- result.putString(AccountManager.KEY_ACCOUNT_TYPE, ACCOUNT_TYPE);
- result.putString(AccountManager.KEY_AUTHTOKEN, password);
- return result;
- }
-
- final Intent intent = new Intent(mContext, AuthenticatorActivity.class);
- intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE,
- response);
- intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType);
- intent.putExtra(KEY_LOGIN_OPTIONS, options);
- intent.putExtra(AuthenticatorActivity.PARAM_USERNAME, account.name);
-
- final Bundle bundle = new Bundle();
- bundle.putParcelable(AccountManager.KEY_INTENT, intent);
- return bundle;
- }
-
- @Override
- public String getAuthTokenLabel(String authTokenType) {
- return null;
- }
-
- @Override
- public Bundle hasFeatures(AccountAuthenticatorResponse response,
- Account account, String[] features) throws NetworkErrorException {
- final Bundle result = new Bundle();
- result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, true);
- return result;
- }
-
- @Override
- public Bundle updateCredentials(AccountAuthenticatorResponse response,
- Account account, String authTokenType, Bundle options)
- throws NetworkErrorException {
- final Intent intent = new Intent(mContext, AuthenticatorActivity.class);
- intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE,
- response);
- intent.putExtra(KEY_ACCOUNT, account);
- intent.putExtra(KEY_AUTH_TOKEN_TYPE, authTokenType);
- intent.putExtra(KEY_LOGIN_OPTIONS, options);
- setIntentFlags(intent);
-
- final Bundle bundle = new Bundle();
- bundle.putParcelable(AccountManager.KEY_INTENT, intent);
- return bundle;
- }
-
- @Override
- public Bundle getAccountRemovalAllowed(
- AccountAuthenticatorResponse response, Account account)
- throws NetworkErrorException {
- return super.getAccountRemovalAllowed(response, account);
- }
-
- private void setIntentFlags(Intent intent) {
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
- intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
- intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
- intent.addFlags(Intent.FLAG_FROM_BACKGROUND);
- }
-
- private void validateAccountType(String type)
- throws UnsupportedAccountTypeException {
- if (!type.equals(ACCOUNT_TYPE)) {
- throw new UnsupportedAccountTypeException();
- }
- }
-
- private void validateAuthTokenType(String authTokenType)
- throws UnsupportedAuthTokenTypeException {
- if (!authTokenType.equals(AUTH_TOKEN_TYPE)) {
- throw new UnsupportedAuthTokenTypeException();
- }
- }
-
- public static class AuthenticatorException extends Exception {
- private static final long serialVersionUID = 1L;
- private Bundle mFailureBundle;
-
- public AuthenticatorException(int code, String errorMsg) {
- mFailureBundle = new Bundle();
- mFailureBundle.putInt(AccountManager.KEY_ERROR_CODE, code);
- mFailureBundle
- .putString(AccountManager.KEY_ERROR_MESSAGE, errorMsg);
- }
-
- public Bundle getFailureBundle() {
- return mFailureBundle;
- }
- }
-
- public static class UnsupportedAccountTypeException extends
- AuthenticatorException {
- private static final long serialVersionUID = 1L;
-
- public UnsupportedAccountTypeException() {
- super(AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION,
- "Unsupported account type");
- }
- }
-
- public static class UnsupportedAuthTokenTypeException extends
- AuthenticatorException {
- private static final long serialVersionUID = 1L;
-
- public UnsupportedAuthTokenTypeException() {
- super(AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION,
- "Unsupported auth token type");
- }
- }
-
- public static class UnsupportedFeaturesException extends
- AuthenticatorException {
- public static final long serialVersionUID = 1L;
-
- public UnsupportedFeaturesException() {
- super(AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION,
- "Unsupported features");
- }
- }
-
- public static class AccessDeniedException extends AuthenticatorException {
- public AccessDeniedException(int code, String errorMsg) {
- super(AccountManager.ERROR_CODE_INVALID_RESPONSE, "Access Denied");
- }
-
- private static final long serialVersionUID = 1L;
-
- }
-}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2011 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.authenticator;
-
-import android.app.Service;
-import android.content.Intent;
-import android.os.IBinder;
-
-public class AccountAuthenticatorService extends Service {
-
- private AccountAuthenticator mAuthenticator;
- static final public String ACCOUNT_TYPE = "owncloud";
-
- @Override
- public void onCreate() {
- super.onCreate();
- mAuthenticator = new AccountAuthenticator(this);
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- return mAuthenticator.getIBinder();
- }
-
-}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.authenticator;
-
-import java.net.URL;
-
-import org.apache.commons.httpclient.HttpStatus;
-
-import com.owncloud.android.R;
-import com.owncloud.android.network.OwnCloudClientUtils;
-
-import eu.alefzero.webdav.WebdavClient;
-
-import android.content.Context;
-import android.net.Uri;
-import android.os.Handler;
-
-public class AuthenticationRunnable implements Runnable {
-
- private OnAuthenticationResultListener mListener;
- private Handler mHandler;
- private URL mUrl;
- private String mUsername;
- private String mPassword;
- private Context mContext;
-
- public AuthenticationRunnable(URL url, String username, String password, Context context) {
- mListener = null;
- mUrl = url;
- mUsername = username;
- mPassword = password;
- mContext = context;
- }
-
- public void setOnAuthenticationResultListener(
- OnAuthenticationResultListener listener, Handler handler) {
- mListener = listener;
- mHandler = handler;
- }
-
- @Override
- public void run() {
- Uri uri;
- uri = Uri.parse(mUrl.toString());
- WebdavClient wdc = OwnCloudClientUtils.createOwnCloudClient(uri, mUsername, mPassword, mContext);
- int login_result = wdc.tryToLogin();
- switch (login_result) {
- case HttpStatus.SC_OK:
- postResult(true, uri.toString());
- break;
- case HttpStatus.SC_UNAUTHORIZED:
- postResult(false, mContext.getString(R.string.auth_unauthorized));
- break;
- case HttpStatus.SC_NOT_FOUND:
- postResult(false, mContext.getString(R.string.auth_not_found));
- break;
- default:
- postResult(false, String.format(mContext.getString(R.string.auth_internal), login_result));
- }
- }
-
- private void postResult(final boolean success, final String message) {
- if (mHandler != null && mListener != null) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mListener.onAuthenticationResult(success, message);
- }
- });
- }
- }
-}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.authenticator;
-
-public interface OnAuthenticationResultListener {
-
- public void onAuthenticationResult(boolean success, String message);
-
-}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.authenticator;
-
-public interface OnConnectCheckListener {
-
- enum ResultType {
- OK_SSL, OK_NO_SSL, SSL_INIT_ERROR, HOST_NOT_AVAILABLE, TIMEOUT, NO_NETWORK_CONNECTION, INCORRECT_ADDRESS, INSTANCE_NOT_CONFIGURED, FILE_NOT_FOUND, UNKNOWN_ERROR, WRONG_CONNECTION, SSL_UNVERIFIED_SERVER, BAD_OC_VERSION
- }
-
- public void onConnectionCheckResult(ResultType type);
-
-}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.datamodel;
-
-import java.util.List;
-import java.util.Vector;
-
-public interface DataStorageManager {
-
- public static final int ROOT_PARENT_ID = 0;
-
- public OCFile getFileByPath(String path);
-
- public OCFile getFileById(long id);
-
- public boolean fileExists(String path);
-
- public boolean fileExists(long id);
-
- public boolean saveFile(OCFile file);
-
- public void saveFiles(List<OCFile> files);
-
- public Vector<OCFile> getDirectoryContent(OCFile f);
-
- public void removeFile(OCFile file, boolean removeLocalCopy);
-
- public void removeDirectory(OCFile dir, boolean removeDBData, boolean removeLocalContent);
-
- public void moveDirectory(OCFile dir, String newPath);
-
- public Vector<OCFile> getDirectoryImages(OCFile mParentFolder);
-}
import java.io.File;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
-import java.util.List;
import java.util.Vector;
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.db.ProviderMeta;
+import com.owncloud.android.MainApp;
import com.owncloud.android.db.ProviderMeta.ProviderTableMeta;
+import com.owncloud.android.lib.resources.shares.OCShare;
+import com.owncloud.android.lib.resources.shares.ShareType;
+import com.owncloud.android.lib.resources.files.FileUtils;
import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.Log_OC;
+
import android.accounts.Account;
import android.content.ContentProviderClient;
import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
import android.content.ContentResolver;
+import android.content.ContentUris;
import android.content.ContentValues;
import android.content.OperationApplicationException;
import android.database.Cursor;
import android.net.Uri;
import android.os.RemoteException;
-import android.util.Log;
-public class FileDataStorageManager implements DataStorageManager {
+public class FileDataStorageManager {
+
+ public static final int ROOT_PARENT_ID = 0;
private ContentResolver mContentResolver;
- private ContentProviderClient mContentProvider;
+ private ContentProviderClient mContentProviderClient;
private Account mAccount;
-
- private static String TAG = "FileDataStorageManager";
+
+ private static String TAG = FileDataStorageManager.class.getSimpleName();
+
public FileDataStorageManager(Account account, ContentResolver cr) {
- mContentProvider = null;
+ mContentProviderClient = null;
mContentResolver = cr;
mAccount = account;
}
public FileDataStorageManager(Account account, ContentProviderClient cp) {
- mContentProvider = cp;
+ mContentProviderClient = cp;
mContentResolver = null;
mAccount = account;
}
- @Override
+
+ public void setAccount(Account account) {
+ mAccount = account;
+ }
+
+ public Account getAccount() {
+ return mAccount;
+ }
+
+ public void setContentResolver(ContentResolver cr) {
+ mContentResolver = cr;
+ }
+
+ public ContentResolver getContentResolver() {
+ return mContentResolver;
+ }
+
+ public void setContentProviderClient(ContentProviderClient cp) {
+ mContentProviderClient = cp;
+ }
+
+ public ContentProviderClient getContentProviderClient() {
+ return mContentProviderClient;
+ }
+
+
public OCFile getFileByPath(String path) {
Cursor c = getCursorForValue(ProviderTableMeta.FILE_PATH, path);
OCFile file = null;
file = createFileInstance(c);
}
c.close();
- if (file == null && OCFile.PATH_SEPARATOR.equals(path)) {
+ if (file == null && OCFile.ROOT_PATH.equals(path)) {
return createRootDir(); // root should always exist
}
return file;
}
-
- private OCFile createRootDir() {
- OCFile file = new OCFile(OCFile.PATH_SEPARATOR);
- file.setMimetype("DIR");
- file.setParentId(DataStorageManager.ROOT_PARENT_ID);
- saveFile(file);
- return file;
- }
- @Override
public OCFile getFileById(long id) {
Cursor c = getCursorForValue(ProviderTableMeta._ID, String.valueOf(id));
OCFile file = null;
c.close();
return file;
}
-
+
public OCFile getFileByLocalPath(String path) {
Cursor c = getCursorForValue(ProviderTableMeta.FILE_STORAGE_PATH, path);
OCFile file = null;
return file;
}
- @Override
public boolean fileExists(long id) {
return fileExists(ProviderTableMeta._ID, String.valueOf(id));
}
- @Override
public boolean fileExists(String path) {
return fileExists(ProviderTableMeta.FILE_PATH, path);
}
- @Override
+
+ public Vector<OCFile> getFolderContent(OCFile f) {
+ if (f != null && f.isFolder() && f.getFileId() != -1) {
+ return getFolderContent(f.getFileId());
+
+ } else {
+ return new Vector<OCFile>();
+ }
+ }
+
+
+ public Vector<OCFile> getFolderImages(OCFile folder) {
+ Vector<OCFile> ret = new Vector<OCFile>();
+ if (folder != null) {
+ // TODO better implementation, filtering in the access to database (if possible) instead of here
+ Vector<OCFile> tmp = getFolderContent(folder);
+ OCFile current = null;
+ for (int i=0; i<tmp.size(); i++) {
+ current = tmp.get(i);
+ if (current.isImage()) {
+ ret.add(current);
+ }
+ }
+ }
+ return ret;
+ }
+
+
public boolean saveFile(OCFile file) {
boolean overriden = false;
ContentValues cv = new ContentValues();
cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, file.getFileLength());
cv.put(ProviderTableMeta.FILE_CONTENT_TYPE, file.getMimetype());
cv.put(ProviderTableMeta.FILE_NAME, file.getFileName());
- if (file.getParentId() != 0)
+ //if (file.getParentId() != DataStorageManager.ROOT_PARENT_ID)
cv.put(ProviderTableMeta.FILE_PARENT, file.getParentId());
cv.put(ProviderTableMeta.FILE_PATH, file.getRemotePath());
- if (!file.isDirectory())
+ if (!file.isFolder())
cv.put(ProviderTableMeta.FILE_STORAGE_PATH, file.getStoragePath());
cv.put(ProviderTableMeta.FILE_ACCOUNT_OWNER, mAccount.name);
cv.put(ProviderTableMeta.FILE_LAST_SYNC_DATE, file.getLastSyncDateForProperties());
cv.put(ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA, file.getLastSyncDateForData());
cv.put(ProviderTableMeta.FILE_KEEP_IN_SYNC, file.keepInSync() ? 1 : 0);
-
+ cv.put(ProviderTableMeta.FILE_ETAG, file.getEtag());
+ cv.put(ProviderTableMeta.FILE_SHARE_BY_LINK, file.isShareByLink() ? 1 : 0);
+ cv.put(ProviderTableMeta.FILE_PUBLIC_LINK, file.getPublicLink());
+
boolean sameRemotePath = fileExists(file.getRemotePath());
if (sameRemotePath ||
- fileExists(file.getFileId()) ) { // for renamed files; no more delete and create
-
+ fileExists(file.getFileId()) ) { // for renamed files; no more delete and create
+
+ OCFile oldFile = null;
if (sameRemotePath) {
- OCFile oldFile = getFileByPath(file.getRemotePath());
+ oldFile = getFileByPath(file.getRemotePath());
file.setFileId(oldFile.getFileId());
+ } else {
+ oldFile = getFileById(file.getFileId());
}
overriden = true;
new String[] { String.valueOf(file.getFileId()) });
} else {
try {
- getContentProvider().update(ProviderTableMeta.CONTENT_URI,
+ getContentProviderClient().update(ProviderTableMeta.CONTENT_URI,
cv, ProviderTableMeta._ID + "=?",
new String[] { String.valueOf(file.getFileId()) });
} catch (RemoteException e) {
ProviderTableMeta.CONTENT_URI_FILE, cv);
} else {
try {
- result_uri = getContentProvider().insert(
+ result_uri = getContentProviderClient().insert(
ProviderTableMeta.CONTENT_URI_FILE, cv);
} catch (RemoteException e) {
Log_OC.e(TAG,
long new_id = Long.parseLong(result_uri.getPathSegments()
.get(1));
file.setFileId(new_id);
- }
+ }
}
- if (file.isDirectory() && file.needsUpdatingWhileSaving())
- for (OCFile f : getDirectoryContent(file))
- saveFile(f);
-
+// if (file.isFolder()) {
+// updateFolderSize(file.getFileId());
+// } else {
+// updateFolderSize(file.getParentId());
+// }
+
return overriden;
}
- @Override
- public void saveFiles(List<OCFile> files) {
+ /**
+ * Inserts or updates the list of files contained in a given folder.
+ *
+ * CALLER IS THE RESPONSIBLE FOR GRANTING RIGHT UPDATE OF INFORMATION, NOT THIS METHOD.
+ * HERE ONLY DATA CONSISTENCY SHOULD BE GRANTED
+ *
+ * @param folder
+ * @param files
+ * @param removeNotUpdated
+ */
+ public void saveFolder(OCFile folder, Collection<OCFile> updatedFiles, Collection<OCFile> filesToRemove) {
- Iterator<OCFile> filesIt = files.iterator();
- ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(files.size());
- OCFile file = null;
+ Log_OC.d(TAG, "Saving folder " + folder.getRemotePath() + " with " + updatedFiles.size() + " children and " + filesToRemove.size() + " files to remove");
- // prepare operations to perform
- while (filesIt.hasNext()) {
- file = filesIt.next();
+ ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(updatedFiles.size());
+
+ // prepare operations to insert or update files to save in the given folder
+ for (OCFile file : updatedFiles) {
ContentValues cv = new ContentValues();
cv.put(ProviderTableMeta.FILE_MODIFIED, file.getModificationTimestamp());
cv.put(ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA, file.getModificationTimestampAtLastSyncForData());
cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, file.getFileLength());
cv.put(ProviderTableMeta.FILE_CONTENT_TYPE, file.getMimetype());
cv.put(ProviderTableMeta.FILE_NAME, file.getFileName());
- if (file.getParentId() != 0)
- cv.put(ProviderTableMeta.FILE_PARENT, file.getParentId());
+ //cv.put(ProviderTableMeta.FILE_PARENT, file.getParentId());
+ cv.put(ProviderTableMeta.FILE_PARENT, folder.getFileId());
cv.put(ProviderTableMeta.FILE_PATH, file.getRemotePath());
- if (!file.isDirectory())
+ if (!file.isFolder()) {
cv.put(ProviderTableMeta.FILE_STORAGE_PATH, file.getStoragePath());
+ }
cv.put(ProviderTableMeta.FILE_ACCOUNT_OWNER, mAccount.name);
cv.put(ProviderTableMeta.FILE_LAST_SYNC_DATE, file.getLastSyncDateForProperties());
cv.put(ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA, file.getLastSyncDateForData());
cv.put(ProviderTableMeta.FILE_KEEP_IN_SYNC, file.keepInSync() ? 1 : 0);
+ cv.put(ProviderTableMeta.FILE_ETAG, file.getEtag());
+ cv.put(ProviderTableMeta.FILE_SHARE_BY_LINK, file.isShareByLink() ? 1 : 0);
+ cv.put(ProviderTableMeta.FILE_PUBLIC_LINK, file.getPublicLink());
- if (fileExists(file.getRemotePath())) {
- OCFile oldFile = getFileByPath(file.getRemotePath());
- file.setFileId(oldFile.getFileId());
+ boolean existsByPath = fileExists(file.getRemotePath());
+ if (existsByPath || fileExists(file.getFileId())) {
+ // updating an existing file
operations.add(ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI).
withValues(cv).
withSelection( ProviderTableMeta._ID + "=?",
- new String[] { String.valueOf(file.getFileId()) })
- .build());
-
- } else if (fileExists(file.getFileId())) {
- OCFile oldFile = getFileById(file.getFileId());
- if (file.getStoragePath() == null && oldFile.getStoragePath() != null)
- file.setStoragePath(oldFile.getStoragePath());
- if (!file.isDirectory());
- cv.put(ProviderTableMeta.FILE_STORAGE_PATH, file.getStoragePath());
+ new String[] { String.valueOf(file.getFileId()) })
+ .build());
- operations.add(ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI).
- withValues(cv).
- withSelection( ProviderTableMeta._ID + "=?",
- new String[] { String.valueOf(file.getFileId()) })
- .build());
-
} else {
+ // adding a new file
operations.add(ContentProviderOperation.newInsert(ProviderTableMeta.CONTENT_URI).withValues(cv).build());
}
}
+ // prepare operations to remove files in the given folder
+ String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?" + " AND " + ProviderTableMeta.FILE_PATH + "=?";
+ String [] whereArgs = null;
+ for (OCFile file : filesToRemove) {
+ if (file.getParentId() == folder.getFileId()) {
+ whereArgs = new String[]{mAccount.name, file.getRemotePath()};
+ //Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_FILE, "" + file.getFileId());
+ if (file.isFolder()) {
+ operations.add(ContentProviderOperation
+ .newDelete(ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_DIR, file.getFileId())).withSelection(where, whereArgs)
+ .build());
+ // TODO remove local folder
+ } else {
+ operations.add(ContentProviderOperation
+ .newDelete(ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, file.getFileId())).withSelection(where, whereArgs)
+ .build());
+ if (file.isDown()) {
+ new File(file.getStoragePath()).delete();
+ // TODO move the deletion of local contents after success of deletions
+ }
+ }
+ }
+ }
+
+ // update metadata of folder
+ ContentValues cv = new ContentValues();
+ cv.put(ProviderTableMeta.FILE_MODIFIED, folder.getModificationTimestamp());
+ cv.put(ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA, folder.getModificationTimestampAtLastSyncForData());
+ cv.put(ProviderTableMeta.FILE_CREATION, folder.getCreationTimestamp());
+ cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, 0); // FileContentProvider calculates the right size
+ cv.put(ProviderTableMeta.FILE_CONTENT_TYPE, folder.getMimetype());
+ cv.put(ProviderTableMeta.FILE_NAME, folder.getFileName());
+ cv.put(ProviderTableMeta.FILE_PARENT, folder.getParentId());
+ cv.put(ProviderTableMeta.FILE_PATH, folder.getRemotePath());
+ cv.put(ProviderTableMeta.FILE_ACCOUNT_OWNER, mAccount.name);
+ cv.put(ProviderTableMeta.FILE_LAST_SYNC_DATE, folder.getLastSyncDateForProperties());
+ cv.put(ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA, folder.getLastSyncDateForData());
+ cv.put(ProviderTableMeta.FILE_KEEP_IN_SYNC, folder.keepInSync() ? 1 : 0);
+ cv.put(ProviderTableMeta.FILE_ETAG, folder.getEtag());
+ cv.put(ProviderTableMeta.FILE_SHARE_BY_LINK, folder.isShareByLink() ? 1 : 0);
+ cv.put(ProviderTableMeta.FILE_PUBLIC_LINK, folder.getPublicLink());
+
+ operations.add(ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI).
+ withValues(cv).
+ withSelection( ProviderTableMeta._ID + "=?",
+ new String[] { String.valueOf(folder.getFileId()) })
+ .build());
+
// apply operations in batch
ContentProviderResult[] results = null;
+ Log_OC.d(TAG, "Sending " + operations.size() + " operations to FileContentProvider");
try {
if (getContentResolver() != null) {
- results = getContentResolver().applyBatch(ProviderMeta.AUTHORITY_FILES, operations);
-
+ results = getContentResolver().applyBatch(MainApp.getAuthority(), operations);
+
} else {
- results = getContentProvider().applyBatch(operations);
+ results = getContentProviderClient().applyBatch(operations);
}
-
+
} catch (OperationApplicationException e) {
- Log_OC.e(TAG, "Fail to update/insert list of files to database " + e.getMessage());
-
+ Log_OC.e(TAG, "Exception in batch of operations " + e.getMessage());
+
} catch (RemoteException e) {
- Log_OC.e(TAG, "Fail to update/insert list of files to database " + e.getMessage());
+ Log_OC.e(TAG, "Exception in batch of operations " + e.getMessage());
}
-
+
// update new id in file objects for insertions
if (results != null) {
long newId;
+ Iterator<OCFile> filesIt = updatedFiles.iterator();
+ OCFile file = null;
for (int i=0; i<results.length; i++) {
+ if (filesIt.hasNext()) {
+ file = filesIt.next();
+ } else {
+ file = null;
+ }
if (results[i].uri != null) {
newId = Long.parseLong(results[i].uri.getPathSegments().get(1));
- files.get(i).setFileId(newId);
- //Log_OC.v(TAG, "Found and added id in insertion for " + files.get(i).getRemotePath());
+ //updatedFiles.get(i).setFileId(newId);
+ if (file != null) {
+ file.setFileId(newId);
+ }
}
}
}
+
+ //updateFolderSize(folder.getFileId());
+
+ }
- for (OCFile aFile : files) {
- if (aFile.isDirectory() && aFile.needsUpdatingWhileSaving())
- saveFiles(getDirectoryContent(aFile));
- }
- }
+// /**
+// *
+// * @param id
+// */
+// private void updateFolderSize(long id) {
+// if (id > FileDataStorageManager.ROOT_PARENT_ID) {
+// Log_OC.d(TAG, "Updating size of " + id);
+// if (getContentResolver() != null) {
+// getContentResolver().update(ProviderTableMeta.CONTENT_URI_DIR,
+// new ContentValues(), // won't be used, but cannot be null; crashes in KLP
+// ProviderTableMeta._ID + "=?",
+// new String[] { String.valueOf(id) });
+// } else {
+// try {
+// getContentProviderClient().update(ProviderTableMeta.CONTENT_URI_DIR,
+// new ContentValues(), // won't be used, but cannot be null; crashes in KLP
+// ProviderTableMeta._ID + "=?",
+// new String[] { String.valueOf(id) });
+//
+// } catch (RemoteException e) {
+// Log_OC.e(TAG, "Exception in update of folder size through compatibility patch " + e.getMessage());
+// }
+// }
+// } else {
+// Log_OC.e(TAG, "not updating size for folder " + id);
+// }
+// }
- public void setAccount(Account account) {
- mAccount = account;
- }
- public Account getAccount() {
- return mAccount;
- }
-
- public void setContentResolver(ContentResolver cr) {
- mContentResolver = cr;
+ public void removeFile(OCFile file, boolean removeDBData, boolean removeLocalCopy) {
+ if (file != null) {
+ if (file.isFolder()) {
+ removeFolder(file, removeDBData, removeLocalCopy);
+
+ } else {
+ if (removeDBData) {
+ //Uri file_uri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_FILE, ""+file.getFileId());
+ Uri file_uri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, file.getFileId());
+ String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?" + " AND " + ProviderTableMeta.FILE_PATH + "=?";
+ String [] whereArgs = new String[]{mAccount.name, file.getRemotePath()};
+ if (getContentProviderClient() != null) {
+ try {
+ getContentProviderClient().delete(file_uri, where, whereArgs);
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
+ } else {
+ getContentResolver().delete(file_uri, where, whereArgs);
+ }
+ //updateFolderSize(file.getParentId());
+ }
+ if (removeLocalCopy && file.isDown() && file.getStoragePath() != null) {
+ boolean success = new File(file.getStoragePath()).delete();
+ if (!removeDBData && success) {
+ // maybe unnecessary, but should be checked TODO remove if unnecessary
+ file.setStoragePath(null);
+ saveFile(file);
+ }
+ }
+ }
+ }
}
+
- public ContentResolver getContentResolver() {
- return mContentResolver;
+ public void removeFolder(OCFile folder, boolean removeDBData, boolean removeLocalContent) {
+ if (folder != null && folder.isFolder()) {
+ if (removeDBData && folder.getFileId() != -1) {
+ removeFolderInDb(folder);
+ }
+ if (removeLocalContent) {
+ File localFolder = new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, folder));
+ removeLocalFolder(localFolder);
+ }
+ }
}
- public void setContentProvider(ContentProviderClient cp) {
- mContentProvider = cp;
+ private void removeFolderInDb(OCFile folder) {
+ Uri folder_uri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_DIR, ""+ folder.getFileId()); // URI for recursive deletion
+ String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?" + " AND " + ProviderTableMeta.FILE_PATH + "=?";
+ String [] whereArgs = new String[]{mAccount.name, folder.getRemotePath()};
+ if (getContentProviderClient() != null) {
+ try {
+ getContentProviderClient().delete(folder_uri, where, whereArgs);
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
+ } else {
+ getContentResolver().delete(folder_uri, where, whereArgs);
+ }
+ //updateFolderSize(folder.getParentId());
}
- public ContentProviderClient getContentProvider() {
- return mContentProvider;
+ private void removeLocalFolder(File folder) {
+ if (folder.exists()) {
+ File[] files = folder.listFiles();
+ if (files != null) {
+ for (File file : files) {
+ if (file.isDirectory()) {
+ removeLocalFolder(file);
+ } else {
+ file.delete();
+ }
+ }
+ }
+ folder.delete();
+ }
}
- @Override
- public Vector<OCFile> getDirectoryContent(OCFile f) {
- Vector<OCFile> ret = new Vector<OCFile>();
- if (f != null && f.isDirectory() && f.getFileId() != -1) {
+ /**
+ * Updates database for a folder that was moved to a different location.
+ *
+ * TODO explore better (faster) implementations
+ * TODO throw exceptions up !
+ */
+ public void moveFolder(OCFile folder, String newPath) {
+ // TODO check newPath
- Uri req_uri = Uri.withAppendedPath(
- ProviderTableMeta.CONTENT_URI_DIR,
- String.valueOf(f.getFileId()));
+ if (folder != null && folder.isFolder() && folder.fileExists() && !OCFile.ROOT_PATH.equals(folder.getFileName())) {
+ /// 1. get all the descendants of 'dir' in a single QUERY (including 'dir')
Cursor c = null;
-
- if (getContentProvider() != null) {
+ if (getContentProviderClient() != null) {
try {
- c = getContentProvider().query(req_uri, null,
- ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?",
- new String[] { mAccount.name }, null);
+ c = getContentProviderClient().query(ProviderTableMeta.CONTENT_URI,
+ null,
+ ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + ProviderTableMeta.FILE_PATH + " LIKE ? ",
+ new String[] { mAccount.name, folder.getRemotePath() + "%" }, ProviderTableMeta.FILE_PATH + " ASC ");
} catch (RemoteException e) {
Log_OC.e(TAG, e.getMessage());
- return ret;
}
} else {
- c = getContentResolver().query(req_uri, null,
- ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?",
- new String[] { mAccount.name }, null);
+ c = getContentResolver().query(ProviderTableMeta.CONTENT_URI,
+ null,
+ ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + ProviderTableMeta.FILE_PATH + " LIKE ? ",
+ new String[] { mAccount.name, folder.getRemotePath() + "%" }, ProviderTableMeta.FILE_PATH + " ASC ");
}
+ /// 2. prepare a batch of update operations to change all the descendants
+ ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(c.getCount());
+ int lengthOfOldPath = folder.getRemotePath().length();
+ String defaultSavePath = FileStorageUtils.getSavePath(mAccount.name);
+ int lengthOfOldStoragePath = defaultSavePath.length() + lengthOfOldPath;
if (c.moveToFirst()) {
do {
+ ContentValues cv = new ContentValues(); // don't take the constructor out of the loop and clear the object
OCFile child = createFileInstance(c);
- ret.add(child);
+ cv.put(ProviderTableMeta.FILE_PATH, newPath + child.getRemotePath().substring(lengthOfOldPath));
+ if (child.getStoragePath() != null && child.getStoragePath().startsWith(defaultSavePath)) {
+ cv.put(ProviderTableMeta.FILE_STORAGE_PATH, defaultSavePath + newPath + child.getStoragePath().substring(lengthOfOldStoragePath));
+ }
+ operations.add(ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI).
+ withValues(cv).
+ withSelection( ProviderTableMeta._ID + "=?",
+ new String[] { String.valueOf(child.getFileId()) })
+ .build());
} while (c.moveToNext());
}
-
c.close();
-
- Collections.sort(ret);
-
+
+ /// 3. apply updates in batch
+ try {
+ if (getContentResolver() != null) {
+ getContentResolver().applyBatch(MainApp.getAuthority(), operations);
+
+ } else {
+ getContentProviderClient().applyBatch(operations);
+ }
+
+ } catch (OperationApplicationException e) {
+ Log_OC.e(TAG, "Fail to update descendants of " + folder.getFileId() + " in database", e);
+
+ } catch (RemoteException e) {
+ Log_OC.e(TAG, "Fail to update desendants of " + folder.getFileId() + " in database", e);
+ }
+
}
+ }
+
+
+ private Vector<OCFile> getFolderContent(long parentId) {
+
+ Vector<OCFile> ret = new Vector<OCFile>();
+
+ Uri req_uri = Uri.withAppendedPath(
+ ProviderTableMeta.CONTENT_URI_DIR,
+ String.valueOf(parentId));
+ Cursor c = null;
+
+ if (getContentProviderClient() != null) {
+ try {
+ c = getContentProviderClient().query(req_uri, null,
+ ProviderTableMeta.FILE_PARENT + "=?" ,
+ new String[] { String.valueOf(parentId)}, null);
+ } catch (RemoteException e) {
+ Log_OC.e(TAG, e.getMessage());
+ return ret;
+ }
+ } else {
+ c = getContentResolver().query(req_uri, null,
+ ProviderTableMeta.FILE_PARENT + "=?" ,
+ new String[] { String.valueOf(parentId)}, null);
+ }
+
+ if (c.moveToFirst()) {
+ do {
+ OCFile child = createFileInstance(c);
+ ret.add(child);
+ } while (c.moveToNext());
+ }
+
+ c.close();
+
+ Collections.sort(ret);
+
return ret;
}
+
+
+ private OCFile createRootDir() {
+ OCFile file = new OCFile(OCFile.ROOT_PATH);
+ file.setMimetype("DIR");
+ file.setParentId(FileDataStorageManager.ROOT_PARENT_ID);
+ saveFile(file);
+ return file;
+ }
private boolean fileExists(String cmp_key, String value) {
Cursor c;
cmp_key + "=? AND "
+ ProviderTableMeta.FILE_ACCOUNT_OWNER
+ "=?",
- new String[] { value, mAccount.name }, null);
+ new String[] { value, mAccount.name }, null);
} else {
try {
- c = getContentProvider().query(
+ c = getContentProviderClient().query(
ProviderTableMeta.CONTENT_URI,
null,
cmp_key + "=? AND "
+ ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?",
- new String[] { value, mAccount.name }, null);
+ new String[] { value, mAccount.name }, null);
} catch (RemoteException e) {
Log_OC.e(TAG,
"Couldn't determine file existance, assuming non existance: "
key + "=? AND "
+ ProviderTableMeta.FILE_ACCOUNT_OWNER
+ "=?",
- new String[] { value, mAccount.name }, null);
+ new String[] { value, mAccount.name }, null);
} else {
try {
- c = getContentProvider().query(
+ c = getContentProviderClient().query(
ProviderTableMeta.CONTENT_URI,
null,
key + "=? AND " + ProviderTableMeta.FILE_ACCOUNT_OWNER
- + "=?", new String[] { value, mAccount.name },
+ + "=?", new String[] { value, mAccount.name },
+ null);
+ } catch (RemoteException e) {
+ Log_OC.e(TAG, "Could not get file details: " + e.getMessage());
+ c = null;
+ }
+ }
+ return c;
+ }
+
+ private Cursor getShareCursorForValue(String key, String value) {
+ Cursor c = null;
+ if (getContentResolver() != null) {
+ c = getContentResolver()
+ .query(ProviderTableMeta.CONTENT_URI_SHARE,
+ null,
+ key + "=? AND "
+ + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER
+ + "=?",
+ new String[] { value, mAccount.name }, null);
+ } else {
+ try {
+ c = getContentProviderClient().query(
+ ProviderTableMeta.CONTENT_URI_SHARE,
+ null,
+ key + "=? AND " + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER
+ + "=?", new String[] { value, mAccount.name },
null);
} catch (RemoteException e) {
Log_OC.e(TAG, "Could not get file details: " + e.getMessage());
.getColumnIndex(ProviderTableMeta.FILE_PARENT)));
file.setMimetype(c.getString(c
.getColumnIndex(ProviderTableMeta.FILE_CONTENT_TYPE)));
- if (!file.isDirectory()) {
+ if (!file.isFolder()) {
file.setStoragePath(c.getString(c
.getColumnIndex(ProviderTableMeta.FILE_STORAGE_PATH)));
if (file.getStoragePath() == null) {
file.setLastSyncDateForData(c.getLong(c.
getColumnIndex(ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA)));
file.setKeepInSync(c.getInt(
- c.getColumnIndex(ProviderTableMeta.FILE_KEEP_IN_SYNC)) == 1 ? true : false);
+ c.getColumnIndex(ProviderTableMeta.FILE_KEEP_IN_SYNC)) == 1 ? true : false);
+ file.setEtag(c.getString(c.getColumnIndex(ProviderTableMeta.FILE_ETAG)));
+ file.setShareByLink(c.getInt(
+ c.getColumnIndex(ProviderTableMeta.FILE_SHARE_BY_LINK)) == 1 ? true : false);
+ file.setPublicLink(c.getString(c.getColumnIndex(ProviderTableMeta.FILE_PUBLIC_LINK)));
+
}
return file;
}
- @Override
- public void removeFile(OCFile file, boolean removeLocalCopy) {
- Uri file_uri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_FILE, ""+file.getFileId());
- if (getContentProvider() != null) {
+ /**
+ * Returns if the file/folder is shared by link or not
+ * @param path Path of the file/folder
+ * @return
+ */
+ public boolean isShareByLink(String path) {
+ Cursor c = getCursorForValue(ProviderTableMeta.FILE_STORAGE_PATH, path);
+ OCFile file = null;
+ if (c.moveToFirst()) {
+ file = createFileInstance(c);
+ }
+ c.close();
+ return file.isShareByLink();
+ }
+
+ /**
+ * Returns the public link of the file/folder
+ * @param path Path of the file/folder
+ * @return
+ */
+ public String getPublicLink(String path) {
+ Cursor c = getCursorForValue(ProviderTableMeta.FILE_STORAGE_PATH, path);
+ OCFile file = null;
+ if (c.moveToFirst()) {
+ file = createFileInstance(c);
+ }
+ c.close();
+ return file.getPublicLink();
+ }
+
+
+ // Methods for Shares
+ public boolean saveShare(OCShare share) {
+ boolean overriden = false;
+ ContentValues cv = new ContentValues();
+ cv.put(ProviderTableMeta.OCSHARES_FILE_SOURCE, share.getFileSource());
+ cv.put(ProviderTableMeta.OCSHARES_ITEM_SOURCE, share.getItemSource());
+ cv.put(ProviderTableMeta.OCSHARES_SHARE_TYPE, share.getShareType().getValue());
+ cv.put(ProviderTableMeta.OCSHARES_SHARE_WITH, share.getShareWith());
+ cv.put(ProviderTableMeta.OCSHARES_PATH, share.getPath());
+ cv.put(ProviderTableMeta.OCSHARES_PERMISSIONS, share.getPermissions());
+ cv.put(ProviderTableMeta.OCSHARES_SHARED_DATE, share.getSharedDate());
+ cv.put(ProviderTableMeta.OCSHARES_EXPIRATION_DATE, share.getExpirationDate());
+ cv.put(ProviderTableMeta.OCSHARES_TOKEN, share.getToken());
+ cv.put(ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME, share.getSharedWithDisplayName());
+ cv.put(ProviderTableMeta.OCSHARES_IS_DIRECTORY, share.isFolder() ? 1 : 0);
+ cv.put(ProviderTableMeta.OCSHARES_USER_ID, share.getUserId());
+ cv.put(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED, share.getIdRemoteShared());
+ cv.put(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER, mAccount.name);
+
+ if (shareExists(share.getIdRemoteShared())) { // for renamed files; no more delete and create
+
+ overriden = true;
+ if (getContentResolver() != null) {
+ getContentResolver().update(ProviderTableMeta.CONTENT_URI_SHARE, cv,
+ ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + "=?",
+ new String[] { String.valueOf(share.getIdRemoteShared()) });
+ } else {
+ try {
+ getContentProviderClient().update(ProviderTableMeta.CONTENT_URI_SHARE,
+ cv, ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + "=?",
+ new String[] { String.valueOf(share.getIdRemoteShared()) });
+ } catch (RemoteException e) {
+ Log_OC.e(TAG,
+ "Fail to insert insert file to database "
+ + e.getMessage());
+ }
+ }
+ } else {
+ Uri result_uri = null;
+ if (getContentResolver() != null) {
+ result_uri = getContentResolver().insert(
+ ProviderTableMeta.CONTENT_URI_SHARE, cv);
+ } else {
+ try {
+ result_uri = getContentProviderClient().insert(
+ ProviderTableMeta.CONTENT_URI_SHARE, cv);
+ } catch (RemoteException e) {
+ Log_OC.e(TAG,
+ "Fail to insert insert file to database "
+ + e.getMessage());
+ }
+ }
+ if (result_uri != null) {
+ long new_id = Long.parseLong(result_uri.getPathSegments()
+ .get(1));
+ share.setId(new_id);
+ }
+ }
+
+ return overriden;
+ }
+
+ private OCShare getShareById(long id) {
+ Cursor c = getShareCursorForValue(ProviderTableMeta._ID, String.valueOf(id));
+ OCShare share = null;
+ if (c.moveToFirst()) {
+ share = createShareInstance(c);
+ }
+ c.close();
+ return share;
+ }
+
+ private OCShare getShareByRemoteId(long remoteId) {
+ Cursor c = getShareCursorForValue(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED, String.valueOf(remoteId));
+ OCShare share = null;
+ if (c.moveToFirst()) {
+ share = createShareInstance(c);
+ }
+ c.close();
+ return share;
+ }
+
+ public OCShare getFirstShareByPathAndType(String path, ShareType type) {
+ Cursor c = null;
+ if (getContentResolver() != null) {
+ c = getContentResolver().query(
+ ProviderTableMeta.CONTENT_URI_SHARE,
+ null,
+ ProviderTableMeta.OCSHARES_PATH + "=? AND "
+ + ProviderTableMeta.OCSHARES_SHARE_TYPE + "=? AND "
+ + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?",
+ new String[] { path, Integer.toString(type.getValue()), mAccount.name },
+ null);
+ } else {
try {
- getContentProvider().delete(file_uri,
- ProviderTableMeta.FILE_ACCOUNT_OWNER+"=?",
- new String[]{mAccount.name});
+ c = getContentProviderClient().query(
+ ProviderTableMeta.CONTENT_URI_SHARE,
+ null,
+ ProviderTableMeta.OCSHARES_PATH + "=? AND "
+ + ProviderTableMeta.OCSHARES_SHARE_TYPE + "=? AND "
+ + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?",
+ new String[] { path, Integer.toString(type.getValue()), mAccount.name },
+ null);
+
} catch (RemoteException e) {
- e.printStackTrace();
+ Log_OC.e(TAG, "Could not get file details: " + e.getMessage());
+ c = null;
+ }
+ }
+ OCShare share = null;
+ if (c.moveToFirst()) {
+ share = createShareInstance(c);
+ }
+ c.close();
+ return share;
+ }
+
+ private OCShare createShareInstance(Cursor c) {
+ OCShare share = null;
+ if (c != null) {
+ share = new OCShare(c.getString(c
+ .getColumnIndex(ProviderTableMeta.OCSHARES_PATH)));
+ share.setId(c.getLong(c.getColumnIndex(ProviderTableMeta._ID)));
+ share.setFileSource(c.getLong(c
+ .getColumnIndex(ProviderTableMeta.OCSHARES_ITEM_SOURCE)));
+ share.setShareType(ShareType.fromValue(c.getInt(c
+ .getColumnIndex(ProviderTableMeta.OCSHARES_SHARE_TYPE))));
+ share.setPermissions(c.getInt(c
+ .getColumnIndex(ProviderTableMeta.OCSHARES_PERMISSIONS)));
+ share.setSharedDate(c.getLong(c
+ .getColumnIndex(ProviderTableMeta.OCSHARES_SHARED_DATE)));
+ share.setExpirationDate(c.getLong(c
+ .getColumnIndex(ProviderTableMeta.OCSHARES_EXPIRATION_DATE)));
+ share.setToken(c.getString(c
+ .getColumnIndex(ProviderTableMeta.OCSHARES_TOKEN)));
+ share.setSharedWithDisplayName(c.getString(c
+ .getColumnIndex(ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME)));
+ share.setIsFolder(c.getInt(
+ c.getColumnIndex(ProviderTableMeta.OCSHARES_IS_DIRECTORY)) == 1 ? true : false);
+ share.setUserId(c.getLong(c.getColumnIndex(ProviderTableMeta.OCSHARES_USER_ID)));
+ share.setIdRemoteShared(c.getLong(c.getColumnIndex(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED)));
+
+ }
+ return share;
+ }
+
+ private boolean shareExists(String cmp_key, String value) {
+ Cursor c;
+ if (getContentResolver() != null) {
+ c = getContentResolver()
+ .query(ProviderTableMeta.CONTENT_URI_SHARE,
+ null,
+ cmp_key + "=? AND "
+ + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER
+ + "=?",
+ new String[] { value, mAccount.name }, null);
+ } else {
+ try {
+ c = getContentProviderClient().query(
+ ProviderTableMeta.CONTENT_URI_SHARE,
+ null,
+ cmp_key + "=? AND "
+ + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?",
+ new String[] { value, mAccount.name }, null);
+ } catch (RemoteException e) {
+ Log_OC.e(TAG,
+ "Couldn't determine file existance, assuming non existance: "
+ + e.getMessage());
+ return false;
}
+ }
+ boolean retval = c.moveToFirst();
+ c.close();
+ return retval;
+ }
+
+ private boolean shareExists(long remoteId) {
+ return shareExists(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED, String.valueOf(remoteId));
+ }
+
+ private void cleanSharedFiles() {
+ ContentValues cv = new ContentValues();
+ cv.put(ProviderTableMeta.FILE_SHARE_BY_LINK, false);
+ cv.put(ProviderTableMeta.FILE_PUBLIC_LINK, "");
+ String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?";
+ String [] whereArgs = new String[]{mAccount.name};
+
+ if (getContentResolver() != null) {
+ getContentResolver().update(ProviderTableMeta.CONTENT_URI, cv, where, whereArgs);
+
} else {
- getContentResolver().delete(file_uri,
- ProviderTableMeta.FILE_ACCOUNT_OWNER+"=?",
- new String[]{mAccount.name});
+ try {
+ getContentProviderClient().update(ProviderTableMeta.CONTENT_URI, cv, where, whereArgs);
+
+ } catch (RemoteException e) {
+ Log_OC.e(TAG, "Exception in cleanSharedFiles" + e.getMessage());
+ }
}
- if (file.isDown() && removeLocalCopy) {
- new File(file.getStoragePath()).delete();
+ }
+
+ private void cleanSharedFilesInFolder(OCFile folder) {
+ ContentValues cv = new ContentValues();
+ cv.put(ProviderTableMeta.FILE_SHARE_BY_LINK, false);
+ cv.put(ProviderTableMeta.FILE_PUBLIC_LINK, "");
+ String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + ProviderTableMeta.FILE_PARENT + "=?";
+ String [] whereArgs = new String[] { mAccount.name , String.valueOf(folder.getFileId()) };
+
+ if (getContentResolver() != null) {
+ getContentResolver().update(ProviderTableMeta.CONTENT_URI, cv, where, whereArgs);
+
+ } else {
+ try {
+ getContentProviderClient().update(ProviderTableMeta.CONTENT_URI, cv, where, whereArgs);
+
+ } catch (RemoteException e) {
+ Log_OC.e(TAG, "Exception in cleanSharedFilesInFolder " + e.getMessage());
+ }
}
- if (file.isDirectory() && removeLocalCopy) {
- File f = new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, file));
- if (f.exists() && f.isDirectory() && (f.list() == null || f.list().length == 0)) {
- f.delete();
+ }
+
+ private void cleanShares() {
+ String where = ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?";
+ String [] whereArgs = new String[]{mAccount.name};
+
+ if (getContentResolver() != null) {
+ getContentResolver().delete(ProviderTableMeta.CONTENT_URI_SHARE, where, whereArgs);
+
+ } else {
+ try {
+ getContentProviderClient().delete(ProviderTableMeta.CONTENT_URI_SHARE, where, whereArgs);
+
+ } catch (RemoteException e) {
+ Log_OC.e(TAG, "Exception in cleanShares" + e.getMessage());
}
}
}
+
+ public void saveShares(Collection<OCShare> shares) {
+ cleanShares();
+ if (shares != null) {
+ ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(shares.size());
- @Override
- public void removeDirectory(OCFile dir, boolean removeDBData, boolean removeLocalContent) {
- // TODO consider possible failures
- if (dir != null && dir.isDirectory() && dir.getFileId() != -1) {
- Vector<OCFile> children = getDirectoryContent(dir);
- if (children.size() > 0) {
- OCFile child = null;
- for (int i=0; i<children.size(); i++) {
- child = children.get(i);
- if (child.isDirectory()) {
- removeDirectory(child, removeDBData, removeLocalContent);
+ // prepare operations to insert or update files to save in the given folder
+ for (OCShare share : shares) {
+ ContentValues cv = new ContentValues();
+ cv.put(ProviderTableMeta.OCSHARES_FILE_SOURCE, share.getFileSource());
+ cv.put(ProviderTableMeta.OCSHARES_ITEM_SOURCE, share.getItemSource());
+ cv.put(ProviderTableMeta.OCSHARES_SHARE_TYPE, share.getShareType().getValue());
+ cv.put(ProviderTableMeta.OCSHARES_SHARE_WITH, share.getShareWith());
+ cv.put(ProviderTableMeta.OCSHARES_PATH, share.getPath());
+ cv.put(ProviderTableMeta.OCSHARES_PERMISSIONS, share.getPermissions());
+ cv.put(ProviderTableMeta.OCSHARES_SHARED_DATE, share.getSharedDate());
+ cv.put(ProviderTableMeta.OCSHARES_EXPIRATION_DATE, share.getExpirationDate());
+ cv.put(ProviderTableMeta.OCSHARES_TOKEN, share.getToken());
+ cv.put(ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME, share.getSharedWithDisplayName());
+ cv.put(ProviderTableMeta.OCSHARES_IS_DIRECTORY, share.isFolder() ? 1 : 0);
+ cv.put(ProviderTableMeta.OCSHARES_USER_ID, share.getUserId());
+ cv.put(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED, share.getIdRemoteShared());
+ cv.put(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER, mAccount.name);
+
+ if (shareExists(share.getIdRemoteShared())) {
+ // updating an existing file
+ operations.add(ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI_SHARE).
+ withValues(cv).
+ withSelection( ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + "=?",
+ new String[] { String.valueOf(share.getIdRemoteShared()) })
+ .build());
+
+ } else {
+ // adding a new file
+ operations.add(ContentProviderOperation.newInsert(ProviderTableMeta.CONTENT_URI_SHARE).withValues(cv).build());
+ }
+ }
+
+ // apply operations in batch
+ if (operations.size() > 0) {
+ @SuppressWarnings("unused")
+ ContentProviderResult[] results = null;
+ Log_OC.d(TAG, "Sending " + operations.size() + " operations to FileContentProvider");
+ try {
+ if (getContentResolver() != null) {
+ results = getContentResolver().applyBatch(MainApp.getAuthority(), operations);
+
} else {
- if (removeDBData) {
- removeFile(child, removeLocalContent);
- } else if (removeLocalContent) {
- if (child.isDown()) {
- new File(child.getStoragePath()).delete();
- }
- }
+ results = getContentProviderClient().applyBatch(operations);
}
+
+ } catch (OperationApplicationException e) {
+ Log_OC.e(TAG, "Exception in batch of operations " + e.getMessage());
+
+ } catch (RemoteException e) {
+ Log_OC.e(TAG, "Exception in batch of operations " + e.getMessage());
}
}
- if (removeDBData) {
- removeFile(dir, true);
- }
}
+
}
-
- /**
- * Updates database for a folder that was moved to a different location.
- *
- * TODO explore better (faster) implementations
- * TODO throw exceptions up !
- */
- @Override
- public void moveDirectory(OCFile dir, String newPath) {
- // TODO check newPath
+ public void updateSharedFiles(Collection<OCFile> sharedFiles) {
+ cleanSharedFiles();
- if (dir != null && dir.isDirectory() && dir.fileExists() && !dir.getFileName().equals(OCFile.PATH_SEPARATOR)) {
- /// 1. get all the descendants of 'dir' in a single QUERY (including 'dir')
- Cursor c = null;
- if (getContentProvider() != null) {
+ if (sharedFiles != null) {
+ ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(sharedFiles.size());
+
+ // prepare operations to insert or update files to save in the given folder
+ for (OCFile file : sharedFiles) {
+ ContentValues cv = new ContentValues();
+ cv.put(ProviderTableMeta.FILE_MODIFIED, file.getModificationTimestamp());
+ cv.put(ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA, file.getModificationTimestampAtLastSyncForData());
+ cv.put(ProviderTableMeta.FILE_CREATION, file.getCreationTimestamp());
+ cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, file.getFileLength());
+ cv.put(ProviderTableMeta.FILE_CONTENT_TYPE, file.getMimetype());
+ cv.put(ProviderTableMeta.FILE_NAME, file.getFileName());
+ cv.put(ProviderTableMeta.FILE_PARENT, file.getParentId());
+ cv.put(ProviderTableMeta.FILE_PATH, file.getRemotePath());
+ if (!file.isFolder()) {
+ cv.put(ProviderTableMeta.FILE_STORAGE_PATH, file.getStoragePath());
+ }
+ cv.put(ProviderTableMeta.FILE_ACCOUNT_OWNER, mAccount.name);
+ cv.put(ProviderTableMeta.FILE_LAST_SYNC_DATE, file.getLastSyncDateForProperties());
+ cv.put(ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA, file.getLastSyncDateForData());
+ cv.put(ProviderTableMeta.FILE_KEEP_IN_SYNC, file.keepInSync() ? 1 : 0);
+ cv.put(ProviderTableMeta.FILE_ETAG, file.getEtag());
+ cv.put(ProviderTableMeta.FILE_SHARE_BY_LINK, file.isShareByLink() ? 1 : 0);
+ cv.put(ProviderTableMeta.FILE_PUBLIC_LINK, file.getPublicLink());
+
+ boolean existsByPath = fileExists(file.getRemotePath());
+ if (existsByPath || fileExists(file.getFileId())) {
+ // updating an existing file
+ operations.add(ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI).
+ withValues(cv).
+ withSelection( ProviderTableMeta._ID + "=?",
+ new String[] { String.valueOf(file.getFileId()) })
+ .build());
+
+ } else {
+ // adding a new file
+ operations.add(ContentProviderOperation.newInsert(ProviderTableMeta.CONTENT_URI).withValues(cv).build());
+ }
+ }
+
+ // apply operations in batch
+ if (operations.size() > 0) {
+ @SuppressWarnings("unused")
+ ContentProviderResult[] results = null;
+ Log_OC.d(TAG, "Sending " + operations.size() + " operations to FileContentProvider");
try {
- c = getContentProvider().query(ProviderTableMeta.CONTENT_URI,
- null,
- ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + ProviderTableMeta.FILE_PATH + " LIKE ?",
- new String[] { mAccount.name, dir.getRemotePath() + "%" }, null);
+ if (getContentResolver() != null) {
+ results = getContentResolver().applyBatch(MainApp.getAuthority(), operations);
+
+ } else {
+ results = getContentProviderClient().applyBatch(operations);
+ }
+
+ } catch (OperationApplicationException e) {
+ Log_OC.e(TAG, "Exception in batch of operations " + e.getMessage());
+
} catch (RemoteException e) {
- Log_OC.e(TAG, e.getMessage());
+ Log_OC.e(TAG, "Exception in batch of operations " + e.getMessage());
}
- } else {
- c = getContentResolver().query(ProviderTableMeta.CONTENT_URI,
- null,
- ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + ProviderTableMeta.FILE_PATH + " LIKE ?",
- new String[] { mAccount.name, dir.getRemotePath() + "%" }, null);
}
+ }
+
+ }
+
+ public void removeShare(OCShare share){
+ Uri share_uri = ProviderTableMeta.CONTENT_URI_SHARE;
+ String where = ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?" + " AND " + ProviderTableMeta.FILE_PATH + "=?";
+ String [] whereArgs = new String[]{mAccount.name, share.getPath()};
+ if (getContentProviderClient() != null) {
+ try {
+ getContentProviderClient().delete(share_uri, where, whereArgs);
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
+ } else {
+ getContentResolver().delete(share_uri, where, whereArgs);
+ }
+ }
+
+ public void saveSharesDB(ArrayList<OCShare> shares) {
+ saveShares(shares);
- /// 2. prepare a batch of update operations to change all the descendants
- ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(c.getCount());
- int lengthOfOldPath = dir.getRemotePath().length();
- String defaultSavePath = FileStorageUtils.getSavePath(mAccount.name);
- int lengthOfOldStoragePath = defaultSavePath.length() + lengthOfOldPath;
- if (c.moveToFirst()) {
- do {
- ContentValues cv = new ContentValues(); // don't take the constructor out of the loop and clear the object
- OCFile child = createFileInstance(c);
- cv.put(ProviderTableMeta.FILE_PATH, newPath + child.getRemotePath().substring(lengthOfOldPath));
- if (child.getStoragePath() != null && child.getStoragePath().startsWith(defaultSavePath)) {
- cv.put(ProviderTableMeta.FILE_STORAGE_PATH, defaultSavePath + newPath + child.getStoragePath().substring(lengthOfOldStoragePath));
- }
- operations.add(ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI).
- withValues(cv).
- withSelection( ProviderTableMeta._ID + "=?",
- new String[] { String.valueOf(child.getFileId()) })
- .build());
- } while (c.moveToNext());
+ ArrayList<OCFile> sharedFiles = new ArrayList<OCFile>();
+
+ for (OCShare share : shares) {
+ // Get the path
+ String path = share.getPath();
+ if (share.isFolder()) {
+ path = path + FileUtils.PATH_SEPARATOR;
+ }
+
+ // Update OCFile with data from share: ShareByLink ¿and publicLink?
+ OCFile file = getFileByPath(path);
+ if (file != null) {
+ if (share.getShareType().equals(ShareType.PUBLIC_LINK)) {
+ file.setShareByLink(true);
+ sharedFiles.add(file);
+ }
+ }
+ }
+
+ updateSharedFiles(sharedFiles);
+ }
+
+
+ public void saveSharesInFolder(ArrayList<OCShare> shares, OCFile folder) {
+ cleanSharedFilesInFolder(folder);
+ ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
+ operations = prepareRemoveSharesInFolder(folder, operations);
+
+ if (shares != null) {
+ // prepare operations to insert or update files to save in the given folder
+ for (OCShare share : shares) {
+ ContentValues cv = new ContentValues();
+ cv.put(ProviderTableMeta.OCSHARES_FILE_SOURCE, share.getFileSource());
+ cv.put(ProviderTableMeta.OCSHARES_ITEM_SOURCE, share.getItemSource());
+ cv.put(ProviderTableMeta.OCSHARES_SHARE_TYPE, share.getShareType().getValue());
+ cv.put(ProviderTableMeta.OCSHARES_SHARE_WITH, share.getShareWith());
+ cv.put(ProviderTableMeta.OCSHARES_PATH, share.getPath());
+ cv.put(ProviderTableMeta.OCSHARES_PERMISSIONS, share.getPermissions());
+ cv.put(ProviderTableMeta.OCSHARES_SHARED_DATE, share.getSharedDate());
+ cv.put(ProviderTableMeta.OCSHARES_EXPIRATION_DATE, share.getExpirationDate());
+ cv.put(ProviderTableMeta.OCSHARES_TOKEN, share.getToken());
+ cv.put(ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME, share.getSharedWithDisplayName());
+ cv.put(ProviderTableMeta.OCSHARES_IS_DIRECTORY, share.isFolder() ? 1 : 0);
+ cv.put(ProviderTableMeta.OCSHARES_USER_ID, share.getUserId());
+ cv.put(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED, share.getIdRemoteShared());
+ cv.put(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER, mAccount.name);
+
+ /*
+ if (shareExists(share.getIdRemoteShared())) {
+ // updating an existing share resource
+ operations.add(ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI_SHARE).
+ withValues(cv).
+ withSelection( ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + "=?",
+ new String[] { String.valueOf(share.getIdRemoteShared()) })
+ .build());
+
+ } else {
+ */
+ // adding a new share resource
+ operations.add(ContentProviderOperation.newInsert(ProviderTableMeta.CONTENT_URI_SHARE).withValues(cv).build());
+ //}
}
- c.close();
+ }
- /// 3. apply updates in batch
+ // apply operations in batch
+ if (operations.size() > 0) {
+ @SuppressWarnings("unused")
+ ContentProviderResult[] results = null;
+ Log_OC.d(TAG, "Sending " + operations.size() + " operations to FileContentProvider");
try {
if (getContentResolver() != null) {
- getContentResolver().applyBatch(ProviderMeta.AUTHORITY_FILES, operations);
-
+ results = getContentResolver().applyBatch(MainApp.getAuthority(), operations);
+
} else {
- getContentProvider().applyBatch(operations);
+ results = getContentProviderClient().applyBatch(operations);
}
-
+
} catch (OperationApplicationException e) {
- Log_OC.e(TAG, "Fail to update descendants of " + dir.getFileId() + " in database", e);
-
+ Log_OC.e(TAG, "Exception in batch of operations " + e.getMessage());
+
} catch (RemoteException e) {
- Log_OC.e(TAG, "Fail to update desendants of " + dir.getFileId() + " in database", e);
+ Log_OC.e(TAG, "Exception in batch of operations " + e.getMessage());
}
-
}
+ //}
+
}
- @Override
- public Vector<OCFile> getDirectoryImages(OCFile directory) {
- Vector<OCFile> ret = new Vector<OCFile>();
- if (directory != null) {
- // TODO better implementation, filtering in the access to database (if possible) instead of here
- Vector<OCFile> tmp = getDirectoryContent(directory);
- OCFile current = null;
- for (int i=0; i<tmp.size(); i++) {
- current = tmp.get(i);
- if (current.isImage()) {
- ret.add(current);
- }
+ private ArrayList<ContentProviderOperation> prepareRemoveSharesInFolder(OCFile folder, ArrayList<ContentProviderOperation> preparedOperations) {
+ if (folder != null) {
+ String where = ProviderTableMeta.OCSHARES_PATH + "=?" + " AND " + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?";
+ String [] whereArgs = new String[]{ "", mAccount.name };
+
+ Vector<OCFile> files = getFolderContent(folder);
+
+ for (OCFile file : files) {
+ whereArgs[0] = file.getRemotePath();
+ preparedOperations.add(ContentProviderOperation.newDelete(ProviderTableMeta.CONTENT_URI_SHARE)
+ .withSelection(where, whereArgs)
+ .build());
}
}
- return ret;
- }
+ return preparedOperations;
+
+ /*
+ if (operations.size() > 0) {
+ try {
+ if (getContentResolver() != null) {
+ getContentResolver().applyBatch(MainApp.getAuthority(), operations);
+
+ } else {
+ getContentProviderClient().applyBatch(operations);
+ }
+
+ } catch (OperationApplicationException e) {
+ Log_OC.e(TAG, "Exception in batch of operations " + e.getMessage());
+ } catch (RemoteException e) {
+ Log_OC.e(TAG, "Exception in batch of operations " + e.getMessage());
+ }
+ }
+ */
+
+ /*
+ if (getContentResolver() != null) {
+
+ getContentResolver().delete(ProviderTableMeta.CONTENT_URI_SHARE,
+ where,
+ whereArgs);
+ } else {
+ try {
+ getContentProviderClient().delete( ProviderTableMeta.CONTENT_URI_SHARE,
+ where,
+ whereArgs);
+
+ } catch (RemoteException e) {
+ Log_OC.e(TAG, "Exception deleting shares in a folder " + e.getMessage());
+ }
+ }
+ */
+ //}
+ }
}
import java.io.File;
-import com.owncloud.android.Log_OC;
+import com.owncloud.android.utils.Log_OC;
+
import android.os.Parcel;
import android.os.Parcelable;
};
public static final String PATH_SEPARATOR = "/";
+ public static final String ROOT_PATH = PATH_SEPARATOR;
private static final String TAG = OCFile.class.getSimpleName();
private boolean mKeepInSync;
private String mEtag;
+
+ private boolean mShareByLink;
+ private String mPublicLink;
+
/**
* Create new {@link OCFile} with given path.
mKeepInSync = source.readInt() == 1;
mLastSyncDateForProperties = source.readLong();
mLastSyncDateForData = source.readLong();
+ mEtag = source.readString();
+ mShareByLink = source.readInt() == 1;
+ mPublicLink = source.readString();
}
@Override
dest.writeInt(mKeepInSync ? 1 : 0);
dest.writeLong(mLastSyncDateForProperties);
dest.writeLong(mLastSyncDateForData);
+ dest.writeString(mEtag);
+ dest.writeInt(mShareByLink ? 1 : 0);
+ dest.writeString(mPublicLink);
}
/**
}
/**
- * Use this to find out if this file is a Directory
+ * Use this to find out if this file is a folder.
*
- * @return true if it is a directory
+ * @return true if it is a folder
*/
- public boolean isDirectory() {
+ public boolean isFolder() {
return mMimeType != null && mMimeType.equals("DIR");
}
*/
public String getFileName() {
File f = new File(getRemotePath());
- return f.getName().length() == 0 ? PATH_SEPARATOR : f.getName();
+ return f.getName().length() == 0 ? ROOT_PATH : f.getName();
}
/**
*/
public void setFileName(String name) {
Log_OC.d(TAG, "OCFile name changin from " + mRemotePath);
- if (name != null && name.length() > 0 && !name.contains(PATH_SEPARATOR) && !mRemotePath.equals(PATH_SEPARATOR)) {
+ if (name != null && name.length() > 0 && !name.contains(PATH_SEPARATOR) && !mRemotePath.equals(ROOT_PATH)) {
String parent = (new File(getRemotePath())).getParent();
parent = (parent.endsWith(PATH_SEPARATOR)) ? parent : parent + PATH_SEPARATOR;
mRemotePath = parent + name;
- if (isDirectory()) {
+ if (isFolder()) {
mRemotePath += PATH_SEPARATOR;
}
Log_OC.d(TAG, "OCFile name changed to " + mRemotePath);
* not a directory
*/
public void addFile(OCFile file) throws IllegalStateException {
- if (isDirectory()) {
+ if (isFolder()) {
file.mParentId = mId;
mNeedsUpdating = true;
return;
mLastSyncDateForData = 0;
mKeepInSync = false;
mNeedsUpdating = false;
+ mEtag = null;
+ mShareByLink = false;
+ mPublicLink = null;
}
/**
@Override
public int compareTo(OCFile another) {
- if (isDirectory() && another.isDirectory()) {
+ if (isFolder() && another.isFolder()) {
return getRemotePath().toLowerCase().compareTo(another.getRemotePath().toLowerCase());
- } else if (isDirectory()) {
+ } else if (isFolder()) {
return -1;
- } else if (another.isDirectory()) {
+ } else if (another.isFolder()) {
return 1;
}
return getRemotePath().toLowerCase().compareTo(another.getRemotePath().toLowerCase());
@Override
public String toString() {
- String asString = "[id=%s, name=%s, mime=%s, downloaded=%s, local=%s, remote=%s, parentId=%s, keepInSinc=%s]";
- asString = String.format(asString, Long.valueOf(mId), getFileName(), mMimeType, isDown(), mLocalPath, mRemotePath, Long.valueOf(mParentId), Boolean.valueOf(mKeepInSync));
+ String asString = "[id=%s, name=%s, mime=%s, downloaded=%s, local=%s, remote=%s, parentId=%s, keepInSync=%s etag=%s]";
+ asString = String.format(asString, Long.valueOf(mId), getFileName(), mMimeType, isDown(), mLocalPath, mRemotePath, Long.valueOf(mParentId), Boolean.valueOf(mKeepInSync), mEtag);
return asString;
}
return mEtag;
}
+ public void setEtag(String etag) {
+ this.mEtag = etag;
+ }
+
+
+ public boolean isShareByLink() {
+ return mShareByLink;
+ }
+
+ public void setShareByLink(boolean shareByLink) {
+ this.mShareByLink = shareByLink;
+ }
+
+ public String getPublicLink() {
+ return mPublicLink;
+ }
+
+ public void setPublicLink(String publicLink) {
+ this.mPublicLink = publicLink;
+ }
+
public long getLocalModificationTimestamp() {
if (mLocalPath != null && mLocalPath.length() > 0) {
File f = new File(mLocalPath);
*/
package com.owncloud.android.db;
-import com.owncloud.android.Log_OC;
+import com.owncloud.android.MainApp;
+import com.owncloud.android.utils.Log_OC;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
-import android.util.Log;
/**
* Custom database helper for ownCloud
public class DbHandler {
private SQLiteDatabase mDB;
private OpenerHelper mHelper;
- private final String mDatabaseName = "ownCloud";
+ private final String mDatabaseName;
private final int mDatabaseVersion = 3;
private final String TABLE_INSTANT_UPLOAD = "instant_upload";
public static final int UPLOAD_STATUS_UPLOAD_FAILED = 1;
public DbHandler(Context context) {
+ mDatabaseName = MainApp.getDBName();
mHelper = new OpenerHelper(context);
mDB = mHelper.getWritableDatabase();
}
*/\r
package com.owncloud.android.db;\r
\r
+import com.owncloud.android.MainApp;\r
+\r
import android.net.Uri;\r
import android.provider.BaseColumns;\r
\r
*/\r
public class ProviderMeta {\r
\r
- public static final String AUTHORITY_FILES = "org.owncloud";\r
- public static final String DB_FILE = "owncloud.db";\r
public static final String DB_NAME = "filelist";\r
- public static final int DB_VERSION = 4;\r
+ public static final int DB_VERSION = 6;\r
\r
private ProviderMeta() {\r
}\r
\r
static public class ProviderTableMeta implements BaseColumns {\r
- public static final String DB_NAME = "filelist";\r
+ public static final String FILE_TABLE_NAME = "filelist";\r
+ public static final String OCSHARES_TABLE_NAME = "ocshares";\r
public static final Uri CONTENT_URI = Uri.parse("content://"\r
- + AUTHORITY_FILES + "/");\r
+ + MainApp.getAuthority() + "/");\r
public static final Uri CONTENT_URI_FILE = Uri.parse("content://"\r
- + AUTHORITY_FILES + "/file");\r
+ + MainApp.getAuthority() + "/file");\r
public static final Uri CONTENT_URI_DIR = Uri.parse("content://"\r
- + AUTHORITY_FILES + "/dir");\r
+ + MainApp.getAuthority() + "/dir");\r
+ public static final Uri CONTENT_URI_SHARE = Uri.parse("content://"\r
+ + MainApp.getAuthority() + "/shares");\r
\r
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.owncloud.file";\r
public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.owncloud.file";\r
\r
+ // Columns of filelist table\r
public static final String FILE_PARENT = "parent";\r
public static final String FILE_NAME = "filename";\r
public static final String FILE_CREATION = "created";\r
public static final String FILE_LAST_SYNC_DATE = "last_sync_date"; // _for_properties, but let's keep it as it is\r
public static final String FILE_LAST_SYNC_DATE_FOR_DATA = "last_sync_date_for_data";\r
public static final String FILE_KEEP_IN_SYNC = "keep_in_sync";\r
+ public static final String FILE_ETAG = "etag";\r
+ public static final String FILE_SHARE_BY_LINK = "share_by_link";\r
+ public static final String FILE_PUBLIC_LINK = "public_link";\r
\r
- public static final String DEFAULT_SORT_ORDER = FILE_NAME\r
+ public static final String FILE_DEFAULT_SORT_ORDER = FILE_NAME\r
+ + " collate nocase asc";\r
+ \r
+ // Columns of ocshares table\r
+ public static final String OCSHARES_FILE_SOURCE = "file_source";\r
+ public static final String OCSHARES_ITEM_SOURCE = "item_source";\r
+ public static final String OCSHARES_SHARE_TYPE = "share_type";\r
+ public static final String OCSHARES_SHARE_WITH = "shate_with";\r
+ public static final String OCSHARES_PATH = "path";\r
+ public static final String OCSHARES_PERMISSIONS = "permissions";\r
+ public static final String OCSHARES_SHARED_DATE = "shared_date";\r
+ public static final String OCSHARES_EXPIRATION_DATE = "expiration_date";\r
+ public static final String OCSHARES_TOKEN = "token";\r
+ public static final String OCSHARES_SHARE_WITH_DISPLAY_NAME = "shared_with_display_name";\r
+ public static final String OCSHARES_IS_DIRECTORY = "is_directory";\r
+ public static final String OCSHARES_USER_ID = "user_id";\r
+ public static final String OCSHARES_ID_REMOTE_SHARED = "id_remote_shared";\r
+ public static final String OCSHARES_ACCOUNT_OWNER = "owner_share";\r
+ \r
+ public static final String OCSHARES_DEFAULT_SORT_ORDER = OCSHARES_FILE_SOURCE \r
+ " collate nocase asc";\r
+ \r
\r
}\r
}\r
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.extensions;
-
-import android.os.Bundle;
-import android.support.v4.app.FragmentManager;
-
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-
-public class ExtensionsAvailableActivity extends SherlockFragmentActivity {
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- FragmentManager fm = getSupportFragmentManager();
- ExtensionsAvailableDialog ead = new ExtensionsAvailableDialog();
- ead.show(fm, "extensions_available_dialog");
- }
-}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.extensions;
-
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.R;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.v4.app.DialogFragment;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-
-public class ExtensionsAvailableDialog extends DialogFragment implements
- OnClickListener {
-
- public ExtensionsAvailableDialog() {
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.extensions_available_dialog,
- container);
- Button btnYes = (Button) view.findViewById(R.id.buttonYes);
- Button btnNo = (Button) view.findViewById(R.id.buttonNo);
- btnYes.setOnClickListener(this);
- btnNo.setOnClickListener(this);
- getDialog().setTitle(R.string.extensions_avail_title);
- return view;
- }
-
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.buttonYes: {
- Intent i = new Intent(getActivity(), ExtensionsListActivity.class);
- startActivity(i);
- getActivity().finish();
- }
- break;
- case R.id.buttonNo:
- getActivity().finish();
- break;
- default:
- Log_OC.e("EAD", "Button with unknown id clicked " + v.getId());
- }
- }
-
-}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.extensions;
-
-import java.util.HashMap;
-import java.util.LinkedList;
-
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.utils.OwnCloudVersion;
-
-
-import android.R;
-import android.app.ListActivity;
-import android.os.Bundle;
-import android.os.Handler;
-import android.util.Log;
-import android.widget.SimpleAdapter;
-
-public class ExtensionsListActivity extends ListActivity {
-
- private static final String packages_url = "http://alefzero.eu/a/packages.php";
-
- private Thread mGetterThread;
- private final Handler mHandler = new Handler();
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- mGetterThread = new Thread(new JsonGetter());
- mGetterThread.start();
- }
-
- public void done(JSONArray a) {
- LinkedList<HashMap<String, String>> ll = new LinkedList<HashMap<String, String>>();
- for (int i = 0; i < a.length(); ++i) {
- try {
- ExtensionApplicationEntry ela = new ExtensionApplicationEntry(
- ((JSONObject) a.get(i)));
- HashMap<String, String> ss = new HashMap<String, String>();
- ss.put("NAME", ela.getName());
- ss.put("DESC", ela.getDescription());
- ll.add(ss);
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
- setListAdapter(new SimpleAdapter(this, ll, R.layout.simple_list_item_2,
- new String[] { "NAME", "DESC" }, new int[] {
- android.R.id.text1, android.R.id.text2 }));
-
- }
-
- private class JsonGetter implements Runnable {
-
- @Override
- public void run() {
- HttpClient hc = new HttpClient();
- GetMethod gm = new GetMethod(packages_url);
- final JSONArray ar;
- try {
- hc.executeMethod(gm);
- Log_OC.e("ASD", gm.getResponseBodyAsString() + "");
- ar = new JSONObject(gm.getResponseBodyAsString())
- .getJSONArray("apps");
- } catch (Exception e) {
- e.printStackTrace();
- return;
- }
-
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- done(ar);
- }
- });
-
- }
-
- }
-
- private class ExtensionApplicationEntry {
- private static final String APP_NAME = "name";
- private static final String APP_VERSION = "version";
- private static final String APP_DESC = "description";
- private static final String APP_ICON = "icon";
- private static final String APP_URL = "download";
- private static final String APP_PLAYID = "play_id";
-
- private String mName, mDescription, mIcon, mDownload, mPlayId;
- private OwnCloudVersion mVersion;
-
- public ExtensionApplicationEntry(JSONObject appentry) {
- try {
- mName = appentry.getString(APP_NAME);
- mDescription = appentry.getString(APP_DESC);
- mIcon = appentry.getString(APP_ICON);
- mDownload = appentry.getString(APP_URL);
- mPlayId = appentry.getString(APP_PLAYID);
- mVersion = new OwnCloudVersion(appentry.getString(APP_VERSION));
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
-
- public String getName() {
- return mName;
- }
-
- public String getDescription() {
- return mDescription;
- }
-
- @SuppressWarnings("unused")
- public String getIcon() {
- return mIcon;
- }
-
- @SuppressWarnings("unused")
- public String getDownload() {
- return mDownload;
- }
-
- @SuppressWarnings("unused")
- public String getPlayId() {
- return mPlayId;
- }
-
- @SuppressWarnings("unused")
- public OwnCloudVersion getVersion() {
- return mVersion;
- }
- }
-
-}
package com.owncloud.android.files;
-import com.owncloud.android.Log_OC;
import com.owncloud.android.files.services.FileObserverService;
+import com.owncloud.android.utils.Log_OC;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
-import android.util.Log;
public class BootupBroadcastReceiver extends BroadcastReceiver {
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2014 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.files;
+
+import org.apache.http.protocol.HTTP;
+
+import android.accounts.AccountManager;
+import android.content.Intent;
+import android.net.Uri;
+import android.support.v4.app.DialogFragment;
+import android.webkit.MimeTypeMap;
+import android.widget.Toast;
+
+import com.owncloud.android.R;
+import com.owncloud.android.datamodel.OCFile;
+
+import com.owncloud.android.lib.common.accounts.AccountUtils.Constants;
+import com.owncloud.android.lib.common.network.WebdavUtils;
+import com.owncloud.android.lib.resources.status.OwnCloudVersion;
+import com.owncloud.android.services.OperationsService;
+import com.owncloud.android.ui.activity.FileActivity;
+import com.owncloud.android.ui.dialog.ShareLinkToDialog;
+import com.owncloud.android.utils.Log_OC;
+
+/**
+ *
+ * @author masensio
+ * @author David A. Velasco
+ */
+public class FileOperationsHelper {
+
+ private static final String TAG = FileOperationsHelper.class.getName();
+
+ private static final String FTAG_CHOOSER_DIALOG = "CHOOSER_DIALOG";
+
+
+ public void openFile(OCFile file, FileActivity callerActivity) {
+ if (file != null) {
+ String storagePath = file.getStoragePath();
+ String encodedStoragePath = WebdavUtils.encodePath(storagePath);
+
+ Intent intentForSavedMimeType = new Intent(Intent.ACTION_VIEW);
+ intentForSavedMimeType.setDataAndType(Uri.parse("file://"+ encodedStoragePath), file.getMimetype());
+ intentForSavedMimeType.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+
+ Intent intentForGuessedMimeType = null;
+ if (storagePath.lastIndexOf('.') >= 0) {
+ String guessedMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(storagePath.substring(storagePath.lastIndexOf('.') + 1));
+ if (guessedMimeType != null && !guessedMimeType.equals(file.getMimetype())) {
+ intentForGuessedMimeType = new Intent(Intent.ACTION_VIEW);
+ intentForGuessedMimeType.setDataAndType(Uri.parse("file://"+ encodedStoragePath), guessedMimeType);
+ intentForGuessedMimeType.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+ }
+ }
+
+ Intent chooserIntent = null;
+ if (intentForGuessedMimeType != null) {
+ chooserIntent = Intent.createChooser(intentForGuessedMimeType, callerActivity.getString(R.string.actionbar_open_with));
+ } else {
+ chooserIntent = Intent.createChooser(intentForSavedMimeType, callerActivity.getString(R.string.actionbar_open_with));
+ }
+
+ callerActivity.startActivity(chooserIntent);
+
+ } else {
+ Log_OC.wtf(TAG, "Trying to open a NULL OCFile");
+ }
+ }
+
+
+ public void shareFileWithLink(OCFile file, FileActivity callerActivity) {
+
+ if (isSharedSupported(callerActivity)) {
+ if (file != null) {
+ String link = "https://fake.url";
+ Intent intent = createShareWithLinkIntent(link);
+ String[] packagesToExclude = new String[] { callerActivity.getPackageName() };
+ DialogFragment chooserDialog = ShareLinkToDialog.newInstance(intent, packagesToExclude, file);
+ chooserDialog.show(callerActivity.getSupportFragmentManager(), FTAG_CHOOSER_DIALOG);
+
+ } else {
+ Log_OC.wtf(TAG, "Trying to share a NULL OCFile");
+ }
+
+ } else {
+ // Show a Message
+ Toast t = Toast.makeText(callerActivity, callerActivity.getString(R.string.share_link_no_support_share_api), Toast.LENGTH_LONG);
+ t.show();
+ }
+ }
+
+
+ public void shareFileWithLinkToApp(OCFile file, Intent sendIntent, FileActivity callerActivity) {
+
+ if (file != null) {
+ callerActivity.showLoadingDialog();
+
+ Intent service = new Intent(callerActivity, OperationsService.class);
+ service.setAction(OperationsService.ACTION_CREATE_SHARE);
+ service.putExtra(OperationsService.EXTRA_ACCOUNT, callerActivity.getAccount());
+ service.putExtra(OperationsService.EXTRA_REMOTE_PATH, file.getRemotePath());
+ service.putExtra(OperationsService.EXTRA_SEND_INTENT, sendIntent);
+ callerActivity.getOperationsServiceBinder().newOperation(service);
+
+ } else {
+ Log_OC.wtf(TAG, "Trying to open a NULL OCFile");
+ }
+ }
+
+
+ private Intent createShareWithLinkIntent(String link) {
+ Intent intentToShareLink = new Intent(Intent.ACTION_SEND);
+ intentToShareLink.putExtra(Intent.EXTRA_TEXT, link);
+ intentToShareLink.setType(HTTP.PLAIN_TEXT_TYPE);
+ return intentToShareLink;
+ }
+
+
+ /**
+ * @return 'True' if the server supports the Share API
+ */
+ public boolean isSharedSupported(FileActivity callerActivity) {
+ if (callerActivity.getAccount() != null) {
+ AccountManager accountManager = AccountManager.get(callerActivity);
+
+ String version = accountManager.getUserData(callerActivity.getAccount(), Constants.KEY_OC_VERSION);
+ return (new OwnCloudVersion(version)).isSharedSupported();
+ //return Boolean.parseBoolean(accountManager.getUserData(callerActivity.getAccount(), OwnCloudAccount.Constants.KEY_SUPPORTS_SHARE_API));
+ }
+ return false;
+ }
+
+
+ public void unshareFileWithLink(OCFile file, FileActivity callerActivity) {
+
+ if (isSharedSupported(callerActivity)) {
+ // Unshare the file
+ Intent service = new Intent(callerActivity, OperationsService.class);
+ service.setAction(OperationsService.ACTION_UNSHARE);
+ service.putExtra(OperationsService.EXTRA_ACCOUNT, callerActivity.getAccount());
+ service.putExtra(OperationsService.EXTRA_REMOTE_PATH, file.getRemotePath());
+ callerActivity.getOperationsServiceBinder().newOperation(service);
+
+ callerActivity.showLoadingDialog();
+
+ } else {
+ // Show a Message
+ Toast t = Toast.makeText(callerActivity, callerActivity.getString(R.string.share_link_no_support_share_api), Toast.LENGTH_LONG);
+ t.show();
+
+ }
+ }
+
+ public void sendDownloadedFile(OCFile file, FileActivity callerActivity) {
+ if (file != null) {
+ Intent sendIntent = new Intent(android.content.Intent.ACTION_SEND);
+ // set MimeType
+ sendIntent.setType(file.getMimetype());
+ sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + file.getStoragePath()));
+ sendIntent.putExtra(Intent.ACTION_SEND, true); // Send Action
+
+ // Show dialog, without the own app
+ String[] packagesToExclude = new String[] { callerActivity.getPackageName() };
+ DialogFragment chooserDialog = ShareLinkToDialog.newInstance(sendIntent, packagesToExclude, file);
+ chooserDialog.show(callerActivity.getSupportFragmentManager(), FTAG_CHOOSER_DIALOG);
+
+ } else {
+ Log_OC.wtf(TAG, "Trying to send a NULL OCFile");
+ }
+ }
+
+}
/* ownCloud Android client application
* Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
+ * Copyright (C) 2012-2014 ownCloud Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2,
import java.io.File;
+import com.owncloud.android.MainApp;
+import com.owncloud.android.authentication.AccountUtils;
+import com.owncloud.android.db.DbHandler;
+import com.owncloud.android.files.services.FileUploader;
+import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.Log_OC;
+
+
import android.accounts.Account;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
-import android.content.IntentFilter;
+//import android.content.IntentFilter;
import android.database.Cursor;
import android.net.ConnectivityManager;
import android.net.NetworkInfo.State;
import android.provider.MediaStore.*;
import android.webkit.MimeTypeMap;
-import com.owncloud.android.AccountUtils;
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.authenticator.AccountAuthenticator;
-import com.owncloud.android.db.DbHandler;
-import com.owncloud.android.files.services.FileUploader;
-import com.owncloud.android.utils.FileStorageUtils;
public class InstantUploadBroadcastReceiver extends BroadcastReceiver {
private static String TAG = "InstantUploadBroadcastReceiver";
+ // private static final String[] CONTENT_PROJECTION = { Media.DATA, Media.DISPLAY_NAME, Media.MIME_TYPE, Media.SIZE };
+ //Unofficial action, works for most devices but not HTC. See: https://github.com/owncloud/android/issues/6
+ private static String NEW_PHOTO_ACTION_UNOFFICIAL = "com.android.camera.NEW_PICTURE";
+ //Officially supported action since SDK 14: http://developer.android.com/reference/android/hardware/Camera.html#ACTION_NEW_PICTURE
private static String NEW_PHOTO_ACTION = "android.hardware.action.NEW_PICTURE";
+ // Video action
private static String NEW_VIDEO_ACTION = "android.hardware.action.NEW_VIDEO";
@Override
Log_OC.d(TAG, "Received: " + intent.getAction());
if (intent.getAction().equals(android.net.ConnectivityManager.CONNECTIVITY_ACTION)) {
handleConnectivityAction(context, intent);
+ }else if (intent.getAction().equals(NEW_PHOTO_ACTION_UNOFFICIAL)) {
+ handleNewMediaAction(context, intent); //handleNewPhotoAction(context, intent);
+ Log_OC.d(TAG, "UNOFFICIAL processed: com.android.camera.NEW_PICTURE");
+ } else if (intent.getAction().equals(NEW_PHOTO_ACTION)) {
+ handleNewMediaAction(context, intent); //handleNewPhotoAction(context, intent);
+ Log_OC.d(TAG, "OFFICIAL processed: android.hardware.action.NEW_PICTURE");
} else if (intent.getAction().equals(NEW_PHOTO_ACTION) || intent.getAction().equals(NEW_VIDEO_ACTION)) {
handleNewMediaAction(context, intent);
- } else if (intent.getAction().equals(FileUploader.UPLOAD_FINISH_MESSAGE)) {
+ } else if (intent.getAction().equals(FileUploader.getUploadFinishMessage())) {
handleUploadFinished(context, intent);
} else {
Log_OC.e(TAG, "Incorrect intent sent: " + intent.getAction());
private void handleUploadFinished(Context context, Intent intent) {
// remove successfull uploading, ignore rest for reupload on reconnect
+ /*
if (intent.getBooleanExtra(FileUploader.EXTRA_UPLOAD_RESULT, false)) {
DbHandler db = new DbHandler(context);
String localPath = intent.getStringExtra(FileUploader.EXTRA_OLD_FILE_PATH);
}
db.close();
}
+ */
}
private void handleNewMediaAction(Context context, Intent intent) {
String mime_type = null;
if (!instantUploadEnabled(context)) {
- Log_OC.d(TAG, "Instant upload disabled, abording uploading");
+ Log_OC.d(TAG, "Instant upload disabled, aborting uploading");
return;
}
// we can unregister from entire listenings but thats suck a bit.
// On the other hand this might be only for dynamicly registered
// broadcast receivers, needs investigation.
- IntentFilter filter = new IntentFilter(FileUploader.UPLOAD_FINISH_MESSAGE);
- context.getApplicationContext().registerReceiver(this, filter);
+ /*IntentFilter filter = new IntentFilter(FileUploader.UPLOAD_FINISH_MESSAGE);
+ context.getApplicationContext().registerReceiver(this, filter);*/
Intent i = new Intent(context, FileUploader.class);
i.putExtra(FileUploader.KEY_ACCOUNT, account);
DbHandler db = new DbHandler(context);
Cursor c = db.getAwaitingFiles();
if (c.moveToFirst()) {
- IntentFilter filter = new IntentFilter(FileUploader.UPLOAD_FINISH_MESSAGE);
- context.getApplicationContext().registerReceiver(this, filter);
+ //IntentFilter filter = new IntentFilter(FileUploader.UPLOAD_FINISH_MESSAGE);
+ //context.getApplicationContext().registerReceiver(this, filter);
do {
String account_name = c.getString(c.getColumnIndex("account"));
String file_path = c.getString(c.getColumnIndex("path"));
File f = new File(file_path);
if (f.exists()) {
- Account account = new Account(account_name, AccountAuthenticator.ACCOUNT_TYPE);
+ Account account = new Account(account_name, MainApp.getAccountType());
String mimeType = null;
try {
import java.io.File;
-import com.owncloud.android.Log_OC;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.network.OwnCloudClientUtils;
-import com.owncloud.android.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.operations.SynchronizeFileOperation;
-import com.owncloud.android.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
import com.owncloud.android.ui.activity.ConflictsResolveActivity;
-
-import eu.alefzero.webdav.WebdavClient;
+import com.owncloud.android.utils.Log_OC;
import android.accounts.Account;
import android.content.Context;
import android.content.Intent;
import android.os.FileObserver;
-import android.util.Log;
public class OwnCloudFileObserver extends FileObserver {
- public static int CHANGES_ONLY = CLOSE_WRITE;
+ private static int MASK = (FileObserver.MODIFY | FileObserver.CLOSE_WRITE);
private static String TAG = OwnCloudFileObserver.class.getSimpleName();
private String mPath;
private int mMask;
private Account mOCAccount;
- //private OCFile mFile;
private Context mContext;
+ private boolean mModified;
- public OwnCloudFileObserver(String path, Account account, Context context, int mask) {
- super(path, mask);
+ public OwnCloudFileObserver(String path, Account account, Context context) {
+ super(path, MASK);
if (path == null)
throw new IllegalArgumentException("NULL path argument received");
- /*if (file == null)
- throw new IllegalArgumentException("NULL file argument received");*/
if (account == null)
throw new IllegalArgumentException("NULL account argument received");
if (context == null)
throw new IllegalArgumentException("NULL context argument received");
- /*if (!path.equals(file.getStoragePath()) && !path.equals(FileStorageUtils.getDefaultSavePathFor(account.name, file)))
- throw new IllegalArgumentException("File argument is not linked to the local file set in path argument"); */
mPath = path;
- //mFile = file;
mOCAccount = account;
mContext = context;
- mMask = mask;
+ mModified = false;
}
+
@Override
public void onEvent(int event, String path) {
Log_OC.d(TAG, "Got file modified with event " + event + " and path " + mPath + ((path != null) ? File.separator + path : ""));
- if ((event & mMask) == 0) {
+ if ((event & MASK) == 0) {
Log_OC.wtf(TAG, "Incorrect event " + event + " sent for file " + mPath + ((path != null) ? File.separator + path : "") +
" with registered for " + mMask + " and original path " +
mPath);
- return;
- }
- WebdavClient wc = OwnCloudClientUtils.createOwnCloudClient(mOCAccount, mContext);
+ } else {
+ if ((event & FileObserver.MODIFY) != 0) {
+ // file changed
+ mModified = true;
+ }
+ // not sure if it's possible, but let's assume that both kind of events can be received at the same time
+ if ((event & FileObserver.CLOSE_WRITE) != 0) {
+ // file closed
+ if (mModified) {
+ mModified = false;
+ startSyncOperation();
+ }
+ }
+ }
+ }
+
+
+ private void startSyncOperation() {
FileDataStorageManager storageManager = new FileDataStorageManager(mOCAccount, mContext.getContentResolver());
OCFile file = storageManager.getFileByLocalPath(mPath); // a fresh object is needed; many things could have occurred to the file since it was registered to observe
// again, assuming that local files are linked to a remote file AT MOST, SOMETHING TO BE DONE;
storageManager,
mOCAccount,
true,
- true,
mContext);
- RemoteOperationResult result = sfo.execute(wc);
+ RemoteOperationResult result = sfo.execute(mOCAccount, mContext);
if (result.getCode() == ResultCode.SYNC_CONFLICT) {
// ISSUE 5: if the user is not running the app (this is a service!), this can be very intrusive; a notification should be preferred
Intent i = new Intent(mContext, ConflictsResolveActivity.class);
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.files.managers;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.content.Context;
-import android.widget.RemoteViews;
-
-import com.owncloud.android.R;
-
-public class OCNotificationManager {
-
- enum NotificationType {
- NOTIFICATION_SIMPLE,
- NOTIFICATION_PROGRESS
- }
-
- static public class NotificationData {
- private String mText, mSubtitle;
- private int mPercent;
- private boolean mOngoing;
-
- public NotificationData(String text, String subtitle, boolean ongoing) {
- this(text, subtitle, -1, ongoing);
- }
-
- public NotificationData(int percent, boolean ongoing) {
- this(null, null, percent, ongoing);
- }
-
- public NotificationData(String text, int percent, boolean ongoing) {
- this(text, null, percent, ongoing);
- }
-
- public NotificationData(String text, String subtitle, int percent, boolean ongoing) {
- mText = text;
- mPercent = percent;
- mSubtitle = subtitle;
- mOngoing = ongoing;
- }
-
- public String getText() { return mText; }
- public int getPercent() { return mPercent; }
- public String getSubtitle() { return mSubtitle; }
- public boolean getOngoing() { return mOngoing; }
- }
-
- static private OCNotificationManager mInstance = null;
-
- private class NotificationTypePair {
- public Notification mNotificaiton;
- public NotificationType mType;
- public NotificationTypePair(Notification n, NotificationType type) {
- mNotificaiton = n;
- mType = type;
- }
- }
-
- private Context mContext;
- private Map<Integer, NotificationTypePair> mNotificationMap;
- private int mNotificationCounter;
- NotificationManager mNM;
-
- static OCNotificationManager getInstance(Context context) {
- if (mInstance == null)
- mInstance = new OCNotificationManager(context);
- return mInstance;
- }
-
- OCNotificationManager(Context context) {
- mContext = context;
- mNotificationMap = new HashMap<Integer, NotificationTypePair>();
- mNM = (NotificationManager)mContext.getSystemService(Context.NOTIFICATION_SERVICE);
- mNotificationCounter = 0;
- }
-
- public int postNotification(NotificationType type, NotificationData data) {
- mNotificationCounter++;
- Notification notification = null;
-
- switch (type) {
- case NOTIFICATION_SIMPLE:
- notification = new Notification(R.drawable.icon, data.getText(), System.currentTimeMillis());
- break;
- case NOTIFICATION_PROGRESS:
- notification = new Notification();
- notification.contentView = new RemoteViews(mContext.getPackageName(), R.layout.progressbar_layout);
- notification.contentView.setTextViewText(R.id.status_text,
- data.getText());
- notification.contentView.setImageViewResource(R.id.status_icon,
- R.id.icon);
- notification.contentView.setProgressBar(R.id.status_progress,
- 100,
- data.getPercent(),
- false);
- break;
- default:
- return -1;
- }
- if (data.getOngoing()) {
- notification.flags |= notification.flags | Notification.FLAG_ONGOING_EVENT;
- }
-
- mNotificationMap.put(mNotificationCounter, new NotificationTypePair(notification, type));
- return mNotificationCounter;
- }
-
- public boolean updateNotification(int notification_id, NotificationData data) {
- if (!mNotificationMap.containsKey(notification_id)) {
- return false;
- }
- NotificationTypePair pair = mNotificationMap.get(notification_id);
- switch (pair.mType) {
- case NOTIFICATION_PROGRESS:
- pair.mNotificaiton.contentView.setProgressBar(R.id.status_text,
- 100,
- data.getPercent(),
- false);
- return true;
- case NOTIFICATION_SIMPLE:
- pair.mNotificaiton = new Notification(R.drawable.icon,
- data.getText(), System.currentTimeMillis());
- mNM.notify(notification_id, pair.mNotificaiton);
- return true;
- default:
- return false;
- }
- }
-
- public void discardNotification(int notification_id) {
- mNM.cancel(notification_id);
- mNotificationMap.remove(notification_id);
- }
-}
package com.owncloud.android.files.services;
import java.io.File;
+import java.io.IOException;
import java.util.AbstractList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
+import com.owncloud.android.R;
+import com.owncloud.android.authentication.AuthenticatorActivity;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
-import eu.alefzero.webdav.OnDatatransferProgressListener;
-import com.owncloud.android.network.OwnCloudClientUtils;
+import com.owncloud.android.lib.common.network.OnDatatransferProgressListener;
+import com.owncloud.android.lib.common.OwnCloudClientFactory;
+import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.operations.DownloadFileOperation;
-import com.owncloud.android.operations.RemoteOperationResult;
-import com.owncloud.android.ui.activity.FileDetailActivity;
-import com.owncloud.android.ui.fragment.FileDetailFragment;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.lib.resources.files.FileUtils;
+import com.owncloud.android.ui.activity.FileActivity;
+import com.owncloud.android.ui.activity.FileDisplayActivity;
import com.owncloud.android.ui.preview.PreviewImageActivity;
import com.owncloud.android.ui.preview.PreviewImageFragment;
+import com.owncloud.android.utils.Log_OC;
+import com.owncloud.android.utils.NotificationBuilderWithProgressBar;
import android.accounts.Account;
-import android.app.Notification;
+import android.accounts.AccountsException;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.os.Looper;
import android.os.Message;
import android.os.Process;
-import android.widget.RemoteViews;
-
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.R;
-import eu.alefzero.webdav.WebdavClient;
+import android.support.v4.app.NotificationCompat;
public class FileDownloader extends Service implements OnDatatransferProgressListener {
public static final String EXTRA_ACCOUNT = "ACCOUNT";
public static final String EXTRA_FILE = "FILE";
- public static final String DOWNLOAD_ADDED_MESSAGE = "DOWNLOAD_ADDED";
- public static final String DOWNLOAD_FINISH_MESSAGE = "DOWNLOAD_FINISH";
+ private static final String DOWNLOAD_ADDED_MESSAGE = "DOWNLOAD_ADDED";
+ private static final String DOWNLOAD_FINISH_MESSAGE = "DOWNLOAD_FINISH";
public static final String EXTRA_DOWNLOAD_RESULT = "RESULT";
public static final String EXTRA_FILE_PATH = "FILE_PATH";
public static final String EXTRA_REMOTE_PATH = "REMOTE_PATH";
private Looper mServiceLooper;
private ServiceHandler mServiceHandler;
private IBinder mBinder;
- private WebdavClient mDownloadClient = null;
+ private OwnCloudClient mDownloadClient = null;
private Account mLastAccount = null;
private FileDataStorageManager mStorageManager;
private DownloadFileOperation mCurrentDownload = null;
private NotificationManager mNotificationManager;
- private Notification mNotification;
+ private NotificationCompat.Builder mNotificationBuilder;
private int mLastPercent;
+ public static String getDownloadAddedMessage() {
+ return FileDownloader.class.getName().toString() + DOWNLOAD_ADDED_MESSAGE;
+ }
+
+ public static String getDownloadFinishMessage() {
+ return FileDownloader.class.getName().toString() + DOWNLOAD_FINISH_MESSAGE;
+ }
+
/**
* Builds a key for mPendingDownloads from the account and file to download
*
mBinder = new FileDownloaderBinder();
}
-
/**
* Entry point to add one or several files to the queue of downloads.
*
if (account == null || file == null) return false;
String targetKey = buildRemoteName(account, file);
synchronized (mPendingDownloads) {
- if (file.isDirectory()) {
+ if (file.isFolder()) {
// this can be slow if there are many downloads :(
Iterator<String> it = mPendingDownloads.keySet().iterator();
boolean found = false;
}
-
/**
* Removes a listener interested in the progress of the download for a concrete file.
*
}
}
-
- @Override
- public void onTransferProgress(long progressRate) {
- // old way, should not be in use any more
- }
-
-
@Override
public void onTransferProgress(long progressRate, long totalTransferredSoFar, long totalToTransfer,
String fileName) {
}
}
-
/**
* Core download method: requests a file to download and stores it.
notifyDownloadStart(mCurrentDownload);
- /// prepare client object to send the request to the ownCloud server
- if (mDownloadClient == null || !mLastAccount.equals(mCurrentDownload.getAccount())) {
- mLastAccount = mCurrentDownload.getAccount();
- mStorageManager = new FileDataStorageManager(mLastAccount, getContentResolver());
- mDownloadClient = OwnCloudClientUtils.createOwnCloudClient(mLastAccount, getApplicationContext());
- }
-
- /// perform the download
RemoteOperationResult downloadResult = null;
try {
+ /// prepare client object to send the request to the ownCloud server
+ if (mDownloadClient == null || !mLastAccount.equals(mCurrentDownload.getAccount())) {
+ mLastAccount = mCurrentDownload.getAccount();
+ mStorageManager = new FileDataStorageManager(mLastAccount, getContentResolver());
+ mDownloadClient = OwnCloudClientFactory.createOwnCloudClient(mLastAccount, getApplicationContext());
+ }
+
+ /// perform the download
downloadResult = mCurrentDownload.execute(mDownloadClient);
if (downloadResult.isSuccess()) {
saveDownloadedFile();
}
+ } catch (AccountsException e) {
+ Log_OC.e(TAG, "Error while trying to get autorization for " + mLastAccount.name, e);
+ downloadResult = new RemoteOperationResult(e);
+ } catch (IOException e) {
+ Log_OC.e(TAG, "Error while trying to get autorization for " + mLastAccount.name, e);
+ downloadResult = new RemoteOperationResult(e);
+
} finally {
synchronized(mPendingDownloads) {
mPendingDownloads.remove(downloadKey);
* Updates the OC File after a successful download.
*/
private void saveDownloadedFile() {
- OCFile file = mCurrentDownload.getFile();
+ OCFile file = mStorageManager.getFileById(mCurrentDownload.getFile().getFileId());
long syncDate = System.currentTimeMillis();
file.setLastSyncDateForProperties(syncDate);
file.setLastSyncDateForData(syncDate);
private void notifyDownloadStart(DownloadFileOperation download) {
/// create status notification with a progress bar
mLastPercent = 0;
- mNotification = new Notification(R.drawable.icon, getString(R.string.downloader_download_in_progress_ticker), System.currentTimeMillis());
- mNotification.flags |= Notification.FLAG_ONGOING_EVENT;
- mNotification.contentView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.progressbar_layout);
- mNotification.contentView.setProgressBar(R.id.status_progress, 100, 0, download.getSize() < 0);
- mNotification.contentView.setTextViewText(R.id.status_text, String.format(getString(R.string.downloader_download_in_progress_content), 0, new File(download.getSavePath()).getName()));
- mNotification.contentView.setImageViewResource(R.id.status_icon, R.drawable.icon);
-
+ mNotificationBuilder =
+ NotificationBuilderWithProgressBar.newNotificationBuilderWithProgressBar(this);
+ mNotificationBuilder
+ .setSmallIcon(R.drawable.notification_icon)
+ .setTicker(getString(R.string.downloader_download_in_progress_ticker))
+ .setContentTitle(getString(R.string.downloader_download_in_progress_ticker))
+ .setOngoing(true)
+ .setProgress(100, 0, download.getSize() < 0)
+ .setContentText(
+ String.format(getString(R.string.downloader_download_in_progress_content), 0,
+ new File(download.getSavePath()).getName())
+ );
+
/// includes a pending intent in the notification showing the details view of the file
Intent showDetailsIntent = null;
if (PreviewImageFragment.canBePreviewed(download.getFile())) {
showDetailsIntent = new Intent(this, PreviewImageActivity.class);
} else {
- showDetailsIntent = new Intent(this, FileDetailActivity.class);
+ showDetailsIntent = new Intent(this, FileDisplayActivity.class);
}
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_FILE, download.getFile());
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_ACCOUNT, download.getAccount());
+ showDetailsIntent.putExtra(FileActivity.EXTRA_FILE, download.getFile());
+ showDetailsIntent.putExtra(FileActivity.EXTRA_ACCOUNT, download.getAccount());
showDetailsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- mNotification.contentIntent = PendingIntent.getActivity(getApplicationContext(), (int)System.currentTimeMillis(), showDetailsIntent, 0);
- mNotificationManager.notify(R.string.downloader_download_in_progress_ticker, mNotification);
+ mNotificationBuilder.setContentIntent(PendingIntent.getActivity(
+ this, (int) System.currentTimeMillis(), showDetailsIntent, 0
+ ));
+
+ mNotificationManager.notify(R.string.downloader_download_in_progress_ticker, mNotificationBuilder.build());
}
* Callback method to update the progress bar in the status notification.
*/
@Override
- public void onTransferProgress(long progressRate, long totalTransferredSoFar, long totalToTransfer, String fileName) {
+ public void onTransferProgress(long progressRate, long totalTransferredSoFar, long totalToTransfer, String filePath) {
int percent = (int)(100.0*((double)totalTransferredSoFar)/((double)totalToTransfer));
if (percent != mLastPercent) {
- mNotification.contentView.setProgressBar(R.id.status_progress, 100, percent, totalToTransfer < 0);
- String text = String.format(getString(R.string.downloader_download_in_progress_content), percent, fileName);
- mNotification.contentView.setTextViewText(R.id.status_text, text);
- mNotificationManager.notify(R.string.downloader_download_in_progress_ticker, mNotification);
+ mNotificationBuilder.setProgress(100, percent, totalToTransfer < 0);
+ String fileName = filePath.substring(filePath.lastIndexOf(FileUtils.PATH_SEPARATOR) + 1);
+ String text = String.format(getString(R.string.downloader_download_in_progress_content), percent, fileName);
+ mNotificationBuilder.setContentText(text);
+ mNotificationManager.notify(R.string.downloader_download_in_progress_ticker, mNotificationBuilder.build());
}
mLastPercent = percent;
}
/**
- * Callback method to update the progress bar in the status notification (old version)
- */
- @Override
- public void onTransferProgress(long progressRate) {
- // NOTHING TO DO HERE ANYMORE
- }
-
-
- /**
* Updates the status notification with the result of a download operation.
*
* @param downloadResult Result of the download operation.
if (!downloadResult.isCancelled()) {
int tickerId = (downloadResult.isSuccess()) ? R.string.downloader_download_succeeded_ticker : R.string.downloader_download_failed_ticker;
int contentId = (downloadResult.isSuccess()) ? R.string.downloader_download_succeeded_content : R.string.downloader_download_failed_content;
- Notification finalNotification = new Notification(R.drawable.icon, getString(tickerId), System.currentTimeMillis());
- finalNotification.flags |= Notification.FLAG_AUTO_CANCEL;
- Intent showDetailsIntent = null;
- if (downloadResult.isSuccess()) {
- if (PreviewImageFragment.canBePreviewed(download.getFile())) {
- showDetailsIntent = new Intent(this, PreviewImageActivity.class);
- } else {
- showDetailsIntent = new Intent(this, FileDetailActivity.class);
- }
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_FILE, download.getFile());
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_ACCOUNT, download.getAccount());
- showDetailsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ mNotificationBuilder
+ .setTicker(getString(tickerId))
+ .setContentTitle(getString(tickerId))
+ .setAutoCancel(true)
+ .setOngoing(false)
+ .setProgress(0, 0, false);
+ boolean needsToUpdateCredentials = (downloadResult.getCode() == ResultCode.UNAUTHORIZED ||
+ // (downloadResult.isTemporalRedirection() && downloadResult.isIdPRedirection()
+ (downloadResult.isIdPRedirection()
+ && mDownloadClient.getCredentials() == null));
+ //&& MainApp.getAuthTokenTypeSamlSessionCookie().equals(mDownloadClient.getAuthTokenType())));
+ if (needsToUpdateCredentials) {
+ // let the user update credentials with one click
+ Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class);
+ updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, download.getAccount());
+ updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_EXPIRED_TOKEN);
+ updateAccountCredentials.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ updateAccountCredentials.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+ updateAccountCredentials.addFlags(Intent.FLAG_FROM_BACKGROUND);
+ mNotificationBuilder
+ .setContentIntent(PendingIntent.getActivity(
+ this, (int) System.currentTimeMillis(), updateAccountCredentials, PendingIntent.FLAG_ONE_SHOT
+ ))
+ .setContentText(String.format(getString(contentId), new File(download.getSavePath()).getName()));
+ mDownloadClient = null; // grant that future retries on the same account will get the fresh credentials
} else {
- // TODO put something smart in showDetailsIntent
- showDetailsIntent = new Intent();
+ Intent showDetailsIntent = null;
+ if (downloadResult.isSuccess()) {
+ if (PreviewImageFragment.canBePreviewed(download.getFile())) {
+ showDetailsIntent = new Intent(this, PreviewImageActivity.class);
+ } else {
+ showDetailsIntent = new Intent(this, FileDisplayActivity.class);
+ }
+ showDetailsIntent.putExtra(FileActivity.EXTRA_FILE, download.getFile());
+ showDetailsIntent.putExtra(FileActivity.EXTRA_ACCOUNT, download.getAccount());
+ showDetailsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+
+ } else {
+ // TODO put something smart in showDetailsIntent
+ showDetailsIntent = new Intent();
+ }
+ mNotificationBuilder
+ .setContentIntent(PendingIntent.getActivity(
+ this, (int) System.currentTimeMillis(), showDetailsIntent, 0
+ ))
+ .setContentText(String.format(getString(contentId), new File(download.getSavePath()).getName()));
}
- finalNotification.contentIntent = PendingIntent.getActivity(getApplicationContext(), (int)System.currentTimeMillis(), showDetailsIntent, 0);
- finalNotification.setLatestEventInfo(getApplicationContext(), getString(tickerId), String.format(getString(contentId), new File(download.getSavePath()).getName()), finalNotification.contentIntent);
- mNotificationManager.notify(tickerId, finalNotification);
+ mNotificationManager.notify(tickerId, mNotificationBuilder.build());
}
}
* @param downloadResult Result of the download operation
*/
private void sendBroadcastDownloadFinished(DownloadFileOperation download, RemoteOperationResult downloadResult) {
- Intent end = new Intent(DOWNLOAD_FINISH_MESSAGE);
+ Intent end = new Intent(getDownloadFinishMessage());
end.putExtra(EXTRA_DOWNLOAD_RESULT, downloadResult.isSuccess());
end.putExtra(ACCOUNT_NAME, download.getAccount().name);
end.putExtra(EXTRA_REMOTE_PATH, download.getRemotePath());
* @param download Added download operation
*/
private void sendBroadcastNewDownload(DownloadFileOperation download) {
- Intent added = new Intent(DOWNLOAD_ADDED_MESSAGE);
+ Intent added = new Intent(getDownloadAddedMessage());
added.putExtra(ACCOUNT_NAME, download.getAccount().name);
added.putExtra(EXTRA_REMOTE_PATH, download.getRemotePath());
added.putExtra(EXTRA_FILE_PATH, download.getSavePath());
import java.util.HashMap;
import java.util.Map;
-import com.owncloud.android.Log_OC;
+import com.owncloud.android.MainApp;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.db.ProviderMeta.ProviderTableMeta;
import com.owncloud.android.files.OwnCloudFileObserver;
import com.owncloud.android.operations.SynchronizeFileOperation;
import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.Log_OC;
+
import android.accounts.Account;
import android.accounts.AccountManager;
import android.database.Cursor;
import android.os.Binder;
import android.os.IBinder;
-import android.util.Log;
public class FileObserverService extends Service {
private static Map<String, OwnCloudFileObserver> mObserversMap;
private static DownloadCompletedReceiverBis mDownloadReceiver;
private IBinder mBinder = new LocalBinder();
-
+
public class LocalBinder extends Binder {
FileObserverService getService() {
return FileObserverService.this;
public void onCreate() {
super.onCreate();
mDownloadReceiver = new DownloadCompletedReceiverBis();
+
IntentFilter filter = new IntentFilter();
- filter.addAction(FileDownloader.DOWNLOAD_ADDED_MESSAGE);
- filter.addAction(FileDownloader.DOWNLOAD_FINISH_MESSAGE);
+ filter.addAction(FileDownloader.getDownloadAddedMessage());
+ filter.addAction(FileDownloader.getDownloadFinishMessage());
registerReceiver(mDownloadReceiver, filter);
mObserversMap = new HashMap<String, OwnCloudFileObserver>();
null);
if (c == null || !c.moveToFirst()) return;
AccountManager acm = AccountManager.get(this);
- Account[] accounts = acm.getAccounts();
+ Account[] accounts = acm.getAccountsByType(MainApp.getAccountType());
do {
Account account = null;
for (Account a : accounts)
OwnCloudFileObserver observer =
new OwnCloudFileObserver( path,
account,
- getApplicationContext(),
- OwnCloudFileObserver.CHANGES_ONLY);
+ getApplicationContext());
mObserversMap.put(path, observer);
if (new File(path).exists()) {
observer.startWatching();
/// the local file was never registered to observe before
observer = new OwnCloudFileObserver( localPath,
account,
- getApplicationContext(),
- OwnCloudFileObserver.CHANGES_ONLY);
+ getApplicationContext());
mObserversMap.put(localPath, observer);
Log_OC.d(TAG, "Observer added for path " + localPath);
String downloadPath = intent.getStringExtra(FileDownloader.EXTRA_FILE_PATH);
OwnCloudFileObserver observer = mObserversMap.get(downloadPath);
if (observer != null) {
- if (intent.getAction().equals(FileDownloader.DOWNLOAD_FINISH_MESSAGE) &&
+ if (intent.getAction().equals(FileDownloader.getDownloadFinishMessage()) &&
new File(downloadPath).exists()) { // the download could be successful. not; in both cases, the file could be down, due to a former download or upload
observer.startWatching();
Log_OC.d(TAG, "Watching again " + downloadPath);
- } else if (intent.getAction().equals(FileDownloader.DOWNLOAD_ADDED_MESSAGE)) {
+ } else if (intent.getAction().equals(FileDownloader.getDownloadAddedMessage())) {
observer.stopWatching();
Log_OC.d(TAG, "Disabling observance of " + downloadPath);
}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-package com.owncloud.android.files.services;
-
-import java.io.File;
-
-import com.owncloud.android.AccountUtils;
-import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.network.OwnCloudClientUtils;
-
-import android.accounts.Account;
-import android.content.Context;
-import eu.alefzero.webdav.WebdavClient;
-
-public class FileOperation {
-
- Context mContext;
-
- public FileOperation(Context contex){
- this.mContext = contex;
- }
-
- /**
- * Deletes a file from ownCloud - locally and remote.
- * @param file The file to delete
- * @return True on success, otherwise false
- */
- public boolean delete(OCFile file){
-
- Account account = AccountUtils.getCurrentOwnCloudAccount(mContext);
- WebdavClient client = OwnCloudClientUtils.createOwnCloudClient(account, mContext);
- if(client.deleteFile(file.getRemotePath())){
- File localFile = new File(file.getStoragePath());
- return localFile.delete();
- }
-
- return false;
- }
-
-}
package com.owncloud.android.files.services;
import java.io.File;
+import java.io.IOException;
import java.util.AbstractList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
-import org.apache.http.HttpStatus;
-import org.apache.jackrabbit.webdav.MultiStatus;
-import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;
+import com.owncloud.android.R;
+import com.owncloud.android.authentication.AuthenticatorActivity;
+import com.owncloud.android.datamodel.FileDataStorageManager;
+import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.db.DbHandler;
+import com.owncloud.android.operations.CreateFolderOperation;
+import com.owncloud.android.lib.resources.files.RemoteFile;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.operations.UploadFileOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.lib.resources.files.ExistenceCheckRemoteOperation;
+import com.owncloud.android.lib.resources.files.ReadRemoteFileOperation;
+import com.owncloud.android.lib.resources.files.FileUtils;
+import com.owncloud.android.lib.resources.status.OwnCloudVersion;
+import com.owncloud.android.lib.common.accounts.AccountUtils.Constants;
+import com.owncloud.android.lib.common.network.OnDatatransferProgressListener;
+import com.owncloud.android.lib.common.OwnCloudClientFactory;
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.ui.activity.FailedUploadActivity;
+import com.owncloud.android.ui.activity.FileActivity;
+import com.owncloud.android.ui.activity.FileDisplayActivity;
+import com.owncloud.android.ui.activity.InstantUploadActivity;
+import com.owncloud.android.ui.preview.PreviewImageActivity;
+import com.owncloud.android.ui.preview.PreviewImageFragment;
+import com.owncloud.android.utils.Log_OC;
+import com.owncloud.android.utils.NotificationBuilderWithProgressBar;
import android.accounts.Account;
import android.accounts.AccountManager;
-import android.app.Notification;
+import android.accounts.AccountsException;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.os.Looper;
import android.os.Message;
import android.os.Process;
+import android.support.v4.app.NotificationCompat;
import android.webkit.MimeTypeMap;
-import android.widget.RemoteViews;
-import android.widget.Toast;
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.R;
-import com.owncloud.android.authenticator.AccountAuthenticator;
-import com.owncloud.android.datamodel.FileDataStorageManager;
-import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.db.DbHandler;
-import com.owncloud.android.network.OwnCloudClientUtils;
-import com.owncloud.android.operations.ChunkedUploadFileOperation;
-import com.owncloud.android.operations.RemoteOperationResult;
-import com.owncloud.android.operations.RemoteOperationResult.ResultCode;
-import com.owncloud.android.operations.UploadFileOperation;
-import com.owncloud.android.ui.activity.FailedUploadActivity;
-import com.owncloud.android.ui.activity.FileDetailActivity;
-import com.owncloud.android.ui.activity.InstantUploadActivity;
-import com.owncloud.android.ui.fragment.FileDetailFragment;
-import com.owncloud.android.ui.preview.PreviewImageActivity;
-import com.owncloud.android.ui.preview.PreviewImageFragment;
-import com.owncloud.android.utils.FileStorageUtils;
-import com.owncloud.android.utils.OwnCloudVersion;
-import eu.alefzero.webdav.OnDatatransferProgressListener;
-import eu.alefzero.webdav.WebdavClient;
-import eu.alefzero.webdav.WebdavEntry;
-import eu.alefzero.webdav.WebdavUtils;
public class FileUploader extends Service implements OnDatatransferProgressListener {
- public static final String UPLOAD_FINISH_MESSAGE = "UPLOAD_FINISH";
+ private static final String UPLOAD_FINISH_MESSAGE = "UPLOAD_FINISH";
public static final String EXTRA_UPLOAD_RESULT = "RESULT";
public static final String EXTRA_REMOTE_PATH = "REMOTE_PATH";
public static final String EXTRA_OLD_REMOTE_PATH = "OLD_REMOTE_PATH";
private Looper mServiceLooper;
private ServiceHandler mServiceHandler;
private IBinder mBinder;
- private WebdavClient mUploadClient = null;
+ private OwnCloudClient mUploadClient = null;
private Account mLastAccount = null;
private FileDataStorageManager mStorageManager;
private UploadFileOperation mCurrentUpload = null;
private NotificationManager mNotificationManager;
- private Notification mNotification;
+ private NotificationCompat.Builder mNotificationBuilder;
private int mLastPercent;
- private RemoteViews mDefaultNotificationContentView;
+
+ public static String getUploadFinishMessage() {
+ return FileUploader.class.getName().toString() + UPLOAD_FINISH_MESSAGE;
+ }
+
/**
* Builds a key for mPendingUploads from the account and file to upload
*
boolean forceOverwrite = intent.getBooleanExtra(KEY_FORCE_OVERWRITE, false);
boolean isInstant = intent.getBooleanExtra(KEY_INSTANT_UPLOAD, false);
int localAction = intent.getIntExtra(KEY_LOCAL_BEHAVIOUR, LOCAL_BEHAVIOUR_COPY);
- boolean fixed = false;
- if (isInstant) {
- fixed = checkAndFixInstantUploadDirectory(storageManager); // MUST
- // be
- // done
- // BEFORE
- // calling
- // obtainNewOCFileToUpload
- }
-
+
if (intent.hasExtra(KEY_FILE) && files == null) {
Log_OC.e(TAG, "Incorrect array for OCFiles provided in upload intent");
return Service.START_NOT_STICKY;
files[i] = obtainNewOCFileToUpload(remotePaths[i], localPaths[i], ((mimeTypes != null) ? mimeTypes[i]
: (String) null), storageManager);
if (files[i] == null) {
- // TODO @andomaex add failure Notiification
+ // TODO @andomaex add failure Notification
return Service.START_NOT_STICKY;
}
}
}
- OwnCloudVersion ocv = new OwnCloudVersion(AccountManager.get(this).getUserData(account,
- AccountAuthenticator.KEY_OC_VERSION));
+ AccountManager aMgr = AccountManager.get(this);
+ String version = aMgr.getUserData(account, Constants.KEY_OC_VERSION);
+ OwnCloudVersion ocv = new OwnCloudVersion(version);
+
boolean chunked = FileUploader.chunkedUploadIsSupported(ocv);
AbstractList<String> requestedUploads = new Vector<String>();
String uploadKey = null;
try {
for (int i = 0; i < files.length; i++) {
uploadKey = buildRemoteName(account, files[i].getRemotePath());
- if (chunked) {
- newUpload = new ChunkedUploadFileOperation(account, files[i], isInstant, forceOverwrite,
- localAction);
- } else {
- newUpload = new UploadFileOperation(account, files[i], isInstant, forceOverwrite, localAction);
- }
- if (fixed && i == 0) {
+ newUpload = new UploadFileOperation(account, files[i], chunked, isInstant, forceOverwrite, localAction,
+ getApplicationContext());
+ if (isInstant) {
newUpload.setRemoteFolderToBeCreated();
}
- mPendingUploads.putIfAbsent(uploadKey, newUpload);
+ mPendingUploads.putIfAbsent(uploadKey, newUpload); // Grants that the file only upload once time
+
newUpload.addDatatransferProgressListener(this);
newUpload.addDatatransferProgressListener((FileUploaderBinder)mBinder);
requestedUploads.add(uploadKey);
return false;
String targetKey = buildRemoteName(account, file);
synchronized (mPendingUploads) {
- if (file.isDirectory()) {
+ if (file.isFolder()) {
// this can be slow if there are many uploads :(
Iterator<String> it = mPendingUploads.keySet().iterator();
boolean found = false;
@Override
- public void onTransferProgress(long progressRate) {
- // old way, should not be in use any more
- }
-
-
- @Override
public void onTransferProgress(long progressRate, long totalTransferredSoFar, long totalToTransfer,
String fileName) {
String key = buildRemoteName(mCurrentUpload.getAccount(), mCurrentUpload.getFile());
notifyUploadStart(mCurrentUpload);
- // / prepare client object to send requests to the ownCloud server
- if (mUploadClient == null || !mLastAccount.equals(mCurrentUpload.getAccount())) {
- mLastAccount = mCurrentUpload.getAccount();
- mStorageManager = new FileDataStorageManager(mLastAccount, getContentResolver());
- mUploadClient = OwnCloudClientUtils.createOwnCloudClient(mLastAccount, getApplicationContext());
- }
-
- // / create remote folder for instant uploads
- if (mCurrentUpload.isRemoteFolderToBeCreated()) {
- mUploadClient.createDirectory(FileStorageUtils.getInstantUploadFilePath(this, ""));
- // ignoring result fail could just mean that it already exists,
- // but local database is not synchronized the upload will be
- // tried anyway
- }
-
- // / perform the upload
- RemoteOperationResult uploadResult = null;
+ RemoteOperationResult uploadResult = null, grantResult = null;
+
try {
- uploadResult = mCurrentUpload.execute(mUploadClient);
- if (uploadResult.isSuccess()) {
- saveUploadedFile();
+ /// prepare client object to send requests to the ownCloud server
+ if (mUploadClient == null || !mLastAccount.equals(mCurrentUpload.getAccount())) {
+ mLastAccount = mCurrentUpload.getAccount();
+ mStorageManager = new FileDataStorageManager(mLastAccount, getContentResolver());
+ mUploadClient = OwnCloudClientFactory.createOwnCloudClient(mLastAccount, getApplicationContext());
}
-
+
+ /// check the existence of the parent folder for the file to upload
+ String remoteParentPath = new File(mCurrentUpload.getRemotePath()).getParent();
+ remoteParentPath = remoteParentPath.endsWith(OCFile.PATH_SEPARATOR) ? remoteParentPath : remoteParentPath + OCFile.PATH_SEPARATOR;
+ grantResult = grantFolderExistence(remoteParentPath);
+
+ /// perform the upload
+ if (grantResult.isSuccess()) {
+ OCFile parent = mStorageManager.getFileByPath(remoteParentPath);
+ mCurrentUpload.getFile().setParentId(parent.getFileId());
+ uploadResult = mCurrentUpload.execute(mUploadClient);
+ if (uploadResult.isSuccess()) {
+ saveUploadedFile();
+ }
+ } else {
+ uploadResult = grantResult;
+ }
+
+ } catch (AccountsException e) {
+ Log_OC.e(TAG, "Error while trying to get autorization for " + mLastAccount.name, e);
+ uploadResult = new RemoteOperationResult(e);
+
+ } catch (IOException e) {
+ Log_OC.e(TAG, "Error while trying to get autorization for " + mLastAccount.name, e);
+ uploadResult = new RemoteOperationResult(e);
+
} finally {
synchronized (mPendingUploads) {
mPendingUploads.remove(uploadKey);
Log_OC.i(TAG, "Remove CurrentUploadItem from pending upload Item Map.");
}
+ if (uploadResult.isException()) {
+ // enforce the creation of a new client object for next uploads; this grant that a new socket will
+ // be created in the future if the current exception is due to an abrupt lose of network connection
+ mUploadClient = null;
+ }
}
-
- // notify result
+
+ /// notify result
+
notifyUploadResult(uploadResult, mCurrentUpload);
sendFinalBroadcast(mCurrentUpload, uploadResult);
}
/**
+ * Checks the existence of the folder where the current file will be uploaded both in the remote server
+ * and in the local database.
+ *
+ * If the upload is set to enforce the creation of the folder, the method tries to create it both remote
+ * and locally.
+ *
+ * @param pathToGrant Full remote path whose existence will be granted.
+ * @return An {@link OCFile} instance corresponding to the folder where the file will be uploaded.
+ */
+ private RemoteOperationResult grantFolderExistence(String pathToGrant) {
+ RemoteOperation operation = new ExistenceCheckRemoteOperation(pathToGrant, this, false);
+ RemoteOperationResult result = operation.execute(mUploadClient);
+ if (!result.isSuccess() && result.getCode() == ResultCode.FILE_NOT_FOUND && mCurrentUpload.isRemoteFolderToBeCreated()) {
+ operation = new CreateFolderOperation( pathToGrant,
+ true,
+ mStorageManager );
+ result = operation.execute(mUploadClient);
+ }
+ if (result.isSuccess()) {
+ OCFile parentDir = mStorageManager.getFileByPath(pathToGrant);
+ if (parentDir == null) {
+ parentDir = createLocalFolder(pathToGrant);
+ }
+ if (parentDir != null) {
+ result = new RemoteOperationResult(ResultCode.OK);
+ } else {
+ result = new RemoteOperationResult(ResultCode.UNKNOWN_ERROR);
+ }
+ }
+ return result;
+ }
+
+
+ private OCFile createLocalFolder(String remotePath) {
+ String parentPath = new File(remotePath).getParent();
+ parentPath = parentPath.endsWith(OCFile.PATH_SEPARATOR) ? parentPath : parentPath + OCFile.PATH_SEPARATOR;
+ OCFile parent = mStorageManager.getFileByPath(parentPath);
+ if (parent == null) {
+ parent = createLocalFolder(parentPath);
+ }
+ if (parent != null) {
+ OCFile createdFolder = new OCFile(remotePath);
+ createdFolder.setMimetype("DIR");
+ createdFolder.setParentId(parent.getFileId());
+ mStorageManager.saveFile(createdFolder);
+ return createdFolder;
+ }
+ return null;
+ }
+
+
+ /**
* Saves a OC File after a successful upload.
*
* A PROPFIND is necessary to keep the props in the local database
*/
private void saveUploadedFile() {
OCFile file = mCurrentUpload.getFile();
+ if (file.fileExists()) {
+ file = mStorageManager.getFileById(file.getFileId());
+ }
long syncDate = System.currentTimeMillis();
file.setLastSyncDateForData(syncDate);
- // / new PROPFIND to keep data consistent with server in theory, should
- // return the same we already have
- PropFindMethod propfind = null;
- RemoteOperationResult result = null;
- try {
- propfind = new PropFindMethod(mUploadClient.getBaseUri()
- + WebdavUtils.encodePath(mCurrentUpload.getRemotePath()));
- int status = mUploadClient.executeMethod(propfind);
- boolean isMultiStatus = (status == HttpStatus.SC_MULTI_STATUS);
- if (isMultiStatus) {
- MultiStatus resp = propfind.getResponseBodyAsMultiStatus();
- WebdavEntry we = new WebdavEntry(resp.getResponses()[0], mUploadClient.getBaseUri().getPath());
- updateOCFile(file, we);
- file.setLastSyncDateForProperties(syncDate);
-
- } else {
- mUploadClient.exhaustResponse(propfind.getResponseBodyAsStream());
- }
-
- result = new RemoteOperationResult(isMultiStatus, status);
- Log_OC.i(TAG, "Update: synchronizing properties for uploaded " + mCurrentUpload.getRemotePath() + ": "
- + result.getLogMessage());
-
- } catch (Exception e) {
- result = new RemoteOperationResult(e);
- Log_OC.e(TAG, "Update: synchronizing properties for uploaded " + mCurrentUpload.getRemotePath() + ": "
- + result.getLogMessage(), e);
-
- } finally {
- if (propfind != null)
- propfind.releaseConnection();
+ // new PROPFIND to keep data consistent with server
+ // in theory, should return the same we already have
+ ReadRemoteFileOperation operation = new ReadRemoteFileOperation(mCurrentUpload.getRemotePath());
+ RemoteOperationResult result = operation.execute(mUploadClient);
+ if (result.isSuccess()) {
+ updateOCFile(file, (RemoteFile) result.getData().get(0));
+ file.setLastSyncDateForProperties(syncDate);
}
-
+
// / maybe this would be better as part of UploadFileOperation... or
// maybe all this method
if (mCurrentUpload.wasRenamed()) {
mStorageManager.saveFile(file);
}
- private void updateOCFile(OCFile file, WebdavEntry we) {
- file.setCreationTimestamp(we.createTimestamp());
- file.setFileLength(we.contentLength());
- file.setMimetype(we.contentType());
- file.setModificationTimestamp(we.modifiedTimestamp());
- file.setModificationTimestampAtLastSyncForData(we.modifiedTimestamp());
- // file.setEtag(mCurrentUpload.getEtag()); // TODO Etag, where available
- }
-
- private boolean checkAndFixInstantUploadDirectory(FileDataStorageManager storageManager) {
- String instantUploadDirPath = FileStorageUtils.getInstantUploadFilePath(this, "");
- OCFile instantUploadDir = storageManager.getFileByPath(instantUploadDirPath);
- if (instantUploadDir == null) {
- // first instant upload in the account. never account not
- // synchronized after the remote InstantUpload folder was created
- OCFile newDir = new OCFile(instantUploadDirPath);
- newDir.setMimetype("DIR");
- OCFile path = storageManager.getFileByPath(OCFile.PATH_SEPARATOR);
-
- if (path != null) {
- newDir.setParentId(path.getFileId());
- storageManager.saveFile(newDir);
- return true;
- } else { // this should not happen anymore
- return false;
- }
-
- }
- return false;
+ private void updateOCFile(OCFile file, RemoteFile remoteFile) {
+ file.setCreationTimestamp(remoteFile.getCreationTimestamp());
+ file.setFileLength(remoteFile.getLength());
+ file.setMimetype(remoteFile.getMimeType());
+ file.setModificationTimestamp(remoteFile.getModifiedTimestamp());
+ file.setModificationTimestampAtLastSyncForData(remoteFile.getModifiedTimestamp());
+ // file.setEtag(remoteFile.getEtag()); // TODO Etag, where available
}
private OCFile obtainNewOCFileToUpload(String remotePath, String localPath, String mimeType,
}
newFile.setMimetype(mimeType);
- // parent dir
- String parentPath = new File(remotePath).getParent();
- parentPath = parentPath.endsWith(OCFile.PATH_SEPARATOR) ? parentPath : parentPath + OCFile.PATH_SEPARATOR;
- OCFile parentDir = storageManager.getFileByPath(parentPath);
- long parentDirId = parentDir.getFileId();
- newFile.setParentId(parentDirId);
return newFile;
}
*
* @param upload Upload operation starting.
*/
- @SuppressWarnings("deprecation")
private void notifyUploadStart(UploadFileOperation upload) {
// / create status notification with a progress bar
mLastPercent = 0;
- mNotification = new Notification(R.drawable.icon, getString(R.string.uploader_upload_in_progress_ticker),
- System.currentTimeMillis());
- mNotification.flags |= Notification.FLAG_ONGOING_EVENT;
- mDefaultNotificationContentView = mNotification.contentView;
- mNotification.contentView = new RemoteViews(getApplicationContext().getPackageName(),
- R.layout.progressbar_layout);
- mNotification.contentView.setProgressBar(R.id.status_progress, 100, 0, false);
- mNotification.contentView.setTextViewText(R.id.status_text,
- String.format(getString(R.string.uploader_upload_in_progress_content), 0, upload.getFileName()));
- mNotification.contentView.setImageViewResource(R.id.status_icon, R.drawable.icon);
-
+ mNotificationBuilder =
+ NotificationBuilderWithProgressBar.newNotificationBuilderWithProgressBar(this);
+ mNotificationBuilder
+ .setOngoing(true)
+ .setSmallIcon(R.drawable.notification_icon)
+ .setTicker(getString(R.string.uploader_upload_in_progress_ticker))
+ .setContentTitle(getString(R.string.uploader_upload_in_progress_ticker))
+ .setProgress(100, 0, false)
+ .setContentText(
+ String.format(getString(R.string.uploader_upload_in_progress_content), 0, upload.getFileName()));
+
/// includes a pending intent in the notification showing the details view of the file
- Intent showDetailsIntent = null;
- if (PreviewImageFragment.canBePreviewed(upload.getFile())) {
- showDetailsIntent = new Intent(this, PreviewImageActivity.class);
- } else {
- showDetailsIntent = new Intent(this, FileDetailActivity.class);
- showDetailsIntent.putExtra(FileDetailActivity.EXTRA_MODE, FileDetailActivity.MODE_DETAILS);
- }
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_FILE, upload.getFile());
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_ACCOUNT, upload.getAccount());
+ Intent showDetailsIntent = new Intent(this, FileDisplayActivity.class);
+ showDetailsIntent.putExtra(FileActivity.EXTRA_FILE, upload.getFile());
+ showDetailsIntent.putExtra(FileActivity.EXTRA_ACCOUNT, upload.getAccount());
showDetailsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- mNotification.contentIntent = PendingIntent.getActivity(getApplicationContext(),
- (int) System.currentTimeMillis(), showDetailsIntent, 0);
+ mNotificationBuilder.setContentIntent(PendingIntent.getActivity(
+ this, (int) System.currentTimeMillis(), showDetailsIntent, 0
+ ));
- mNotificationManager.notify(R.string.uploader_upload_in_progress_ticker, mNotification);
+ mNotificationManager.notify(R.string.uploader_upload_in_progress_ticker, mNotificationBuilder.build());
}
/**
* Callback method to update the progress bar in the status notification
*/
@Override
- public void onTransferProgress(long progressRate, long totalTransferredSoFar, long totalToTransfer, String fileName) {
+ public void onTransferProgress(long progressRate, long totalTransferredSoFar, long totalToTransfer, String filePath) {
int percent = (int) (100.0 * ((double) totalTransferredSoFar) / ((double) totalToTransfer));
if (percent != mLastPercent) {
- mNotification.contentView.setProgressBar(R.id.status_progress, 100, percent, false);
+ mNotificationBuilder.setProgress(100, percent, false);
+ String fileName = filePath.substring(filePath.lastIndexOf(FileUtils.PATH_SEPARATOR) + 1);
String text = String.format(getString(R.string.uploader_upload_in_progress_content), percent, fileName);
- mNotification.contentView.setTextViewText(R.id.status_text, text);
- mNotificationManager.notify(R.string.uploader_upload_in_progress_ticker, mNotification);
+ mNotificationBuilder.setContentText(text);
+ mNotificationManager.notify(R.string.uploader_upload_in_progress_ticker, mNotificationBuilder.build());
}
mLastPercent = percent;
}
/**
- * Callback method to update the progress bar in the status notification
- * (old version)
- */
- @Override
- public void onTransferProgress(long progressRate) {
- // NOTHING TO DO HERE ANYMORE
- }
-
- /**
* Updates the status notification with the result of an upload operation.
*
* @param uploadResult Result of the upload operation.
} else if (uploadResult.isSuccess()) {
// / success -> silent update of progress notification to success
// message
- mNotification.flags ^= Notification.FLAG_ONGOING_EVENT; // remove
- // the
- // ongoing
- // flag
- mNotification.flags |= Notification.FLAG_AUTO_CANCEL;
- mNotification.contentView = mDefaultNotificationContentView;
+ mNotificationBuilder
+ .setOngoing(false)
+ .setAutoCancel(true)
+ .setProgress(0, 0, false);
/// includes a pending intent in the notification showing the details view of the file
Intent showDetailsIntent = null;
if (PreviewImageFragment.canBePreviewed(upload.getFile())) {
showDetailsIntent = new Intent(this, PreviewImageActivity.class);
} else {
- showDetailsIntent = new Intent(this, FileDetailActivity.class);
- showDetailsIntent.putExtra(FileDetailActivity.EXTRA_MODE, FileDetailActivity.MODE_DETAILS);
+ showDetailsIntent = new Intent(this, FileDisplayActivity.class);
}
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_FILE, upload.getFile());
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_ACCOUNT, upload.getAccount());
- showDetailsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- mNotification.contentIntent = PendingIntent.getActivity(getApplicationContext(),
- (int) System.currentTimeMillis(), showDetailsIntent, 0);
-
- mNotification.setLatestEventInfo(getApplicationContext(),
- getString(R.string.uploader_upload_succeeded_ticker),
- String.format(getString(R.string.uploader_upload_succeeded_content_single), upload.getFileName()),
- mNotification.contentIntent);
-
- mNotificationManager.notify(R.string.uploader_upload_in_progress_ticker, mNotification); // NOT
- // AN
+ showDetailsIntent.putExtra(FileActivity.EXTRA_FILE, upload.getFile());
+ showDetailsIntent.putExtra(FileActivity.EXTRA_ACCOUNT, upload.getAccount());
+ showDetailsIntent.putExtra(FileActivity.EXTRA_FROM_NOTIFICATION, true);;
+ mNotificationBuilder
+ .setContentIntent(PendingIntent.getActivity(
+ this, (int) System.currentTimeMillis(), showDetailsIntent, 0
+ ))
+ .setTicker(getString(R.string.uploader_upload_succeeded_ticker))
+ .setContentTitle(getString(R.string.uploader_upload_succeeded_ticker))
+ .setContentText(
+ String.format(getString(R.string.uploader_upload_succeeded_content_single),
+ upload.getFileName())
+ );
+
+ mNotificationManager.notify(R.string.uploader_upload_in_progress_ticker, mNotificationBuilder.build()); // NOT
+ // AN
DbHandler db = new DbHandler(this.getBaseContext());
- db.removeIUPendingFile(mCurrentUpload.getFile().getStoragePath());
+ db.removeIUPendingFile(mCurrentUpload.getOriginalStoragePath());
db.close();
} else {
// / fail -> explicit failure notification
mNotificationManager.cancel(R.string.uploader_upload_in_progress_ticker);
- Notification finalNotification = new Notification(R.drawable.icon,
- getString(R.string.uploader_upload_failed_ticker), System.currentTimeMillis());
- finalNotification.flags |= Notification.FLAG_AUTO_CANCEL;
-
+ NotificationCompat.Builder errorBuilder = new NotificationCompat.Builder(this);
+ errorBuilder
+ .setSmallIcon(R.drawable.notification_icon)
+ .setTicker(getString(R.string.uploader_upload_failed_ticker))
+ .setContentTitle(getString(R.string.uploader_upload_failed_ticker))
+ .setAutoCancel(true);
String content = null;
- if (uploadResult.getCode() == ResultCode.LOCAL_STORAGE_FULL
- || uploadResult.getCode() == ResultCode.LOCAL_STORAGE_NOT_COPIED) {
- // TODO we need a class to provide error messages for the users
- // from a RemoteOperationResult and a RemoteOperation
- content = String.format(getString(R.string.error__upload__local_file_not_copied), upload.getFileName(),
- getString(R.string.app_name));
- } else if (uploadResult.getCode() == ResultCode.QUOTA_EXCEEDED) {
- content = getString(R.string.failed_upload_quota_exceeded_text);
+
+ boolean needsToUpdateCredentials = (uploadResult.getCode() == ResultCode.UNAUTHORIZED ||
+ //(uploadResult.isTemporalRedirection() && uploadResult.isIdPRedirection() &&
+ (uploadResult.isIdPRedirection() &&
+ mUploadClient.getCredentials() == null));
+ //MainApp.getAuthTokenTypeSamlSessionCookie().equals(mUploadClient.getAuthTokenType())));
+ if (needsToUpdateCredentials) {
+ // let the user update credentials with one click
+ Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class);
+ updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, upload.getAccount());
+ updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_EXPIRED_TOKEN);
+ updateAccountCredentials.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ updateAccountCredentials.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+ updateAccountCredentials.addFlags(Intent.FLAG_FROM_BACKGROUND);
+ errorBuilder.setContentIntent(PendingIntent.getActivity(
+ this, (int) System.currentTimeMillis(), updateAccountCredentials, PendingIntent.FLAG_ONE_SHOT
+ ));
+ content = String.format(getString(R.string.uploader_upload_failed_content_single), upload.getFileName());
+ mUploadClient = null; // grant that future retries on the same account will get the fresh credentials
} else {
- content = String
- .format(getString(R.string.uploader_upload_failed_content_single), upload.getFileName());
- }
+ // TODO put something smart in the contentIntent below
+
+ if (uploadResult.getCode() == ResultCode.LOCAL_STORAGE_FULL
+ || uploadResult.getCode() == ResultCode.LOCAL_STORAGE_NOT_COPIED) {
+ // TODO we need a class to provide error messages for the users
+ // from a RemoteOperationResult and a RemoteOperation
+ content = String.format(getString(R.string.error__upload__local_file_not_copied), upload.getFileName(),
+ getString(R.string.app_name));
+ } else if (uploadResult.getCode() == ResultCode.QUOTA_EXCEEDED) {
+ content = getString(R.string.failed_upload_quota_exceeded_text);
+ } else {
+ content = String
+ .format(getString(R.string.uploader_upload_failed_content_single), upload.getFileName());
+ }
- // we add only for instant-uploads the InstantUploadActivity and the
- // db entry
- Intent detailUploadIntent = null;
- if (upload.isInstant() && InstantUploadActivity.IS_ENABLED) {
- detailUploadIntent = new Intent(this, InstantUploadActivity.class);
- detailUploadIntent.putExtra(FileUploader.KEY_ACCOUNT, upload.getAccount());
- } else {
- detailUploadIntent = new Intent(this, FailedUploadActivity.class);
- detailUploadIntent.putExtra(FailedUploadActivity.MESSAGE, content);
- }
- finalNotification.contentIntent = PendingIntent.getActivity(getApplicationContext(),
- (int) System.currentTimeMillis(), detailUploadIntent, PendingIntent.FLAG_UPDATE_CURRENT
- | PendingIntent.FLAG_ONE_SHOT);
-
- if (upload.isInstant()) {
- DbHandler db = null;
- try {
- db = new DbHandler(this.getBaseContext());
- String message = uploadResult.getLogMessage() + " errorCode: " + uploadResult.getCode();
- Log_OC.e(TAG, message + " Http-Code: " + uploadResult.getHttpCode());
- if (uploadResult.getCode() == ResultCode.QUOTA_EXCEEDED) {
- message = getString(R.string.failed_upload_quota_exceeded_text);
- }
- if (db.updateFileState(upload.getOriginalStoragePath(), DbHandler.UPLOAD_STATUS_UPLOAD_FAILED,
- message) == 0) {
- db.putFileForLater(upload.getOriginalStoragePath(), upload.getAccount().name, message);
- }
- } finally {
- if (db != null) {
- db.close();
+ // we add only for instant-uploads the InstantUploadActivity and the
+ // db entry
+ Intent detailUploadIntent = null;
+ if (upload.isInstant() && InstantUploadActivity.IS_ENABLED) {
+ detailUploadIntent = new Intent(this, InstantUploadActivity.class);
+ detailUploadIntent.putExtra(FileUploader.KEY_ACCOUNT, upload.getAccount());
+ } else {
+ detailUploadIntent = new Intent(this, FailedUploadActivity.class);
+ detailUploadIntent.putExtra(FailedUploadActivity.MESSAGE, content);
+ }
+ errorBuilder
+ .setContentIntent(PendingIntent.getActivity(
+ this, (int) System.currentTimeMillis(), detailUploadIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT
+ ))
+ .setContentText(content);
+
+ if (upload.isInstant()) {
+ DbHandler db = null;
+ try {
+ db = new DbHandler(this.getBaseContext());
+ String message = uploadResult.getLogMessage() + " errorCode: " + uploadResult.getCode();
+ Log_OC.e(TAG, message + " Http-Code: " + uploadResult.getHttpCode());
+ if (uploadResult.getCode() == ResultCode.QUOTA_EXCEEDED) {
+ message = getString(R.string.failed_upload_quota_exceeded_text);
+ if (db.updateFileState(upload.getOriginalStoragePath(), DbHandler.UPLOAD_STATUS_UPLOAD_FAILED,
+ message) == 0) {
+ db.putFileForLater(upload.getOriginalStoragePath(), upload.getAccount().name, message);
+ }
+ }
+ } finally {
+ if (db != null) {
+ db.close();
+ }
}
}
}
- finalNotification.setLatestEventInfo(getApplicationContext(),
- getString(R.string.uploader_upload_failed_ticker), content, finalNotification.contentIntent);
-
- mNotificationManager.notify(R.string.uploader_upload_failed_ticker, finalNotification);
+
+ errorBuilder.setContentText(content);
+ mNotificationManager.notify(R.string.uploader_upload_failed_ticker, errorBuilder.build());
}
}
* @param uploadResult Result of the upload operation
*/
private void sendFinalBroadcast(UploadFileOperation upload, RemoteOperationResult uploadResult) {
- Intent end = new Intent(UPLOAD_FINISH_MESSAGE);
+ Intent end = new Intent(getUploadFinishMessage());
end.putExtra(EXTRA_REMOTE_PATH, upload.getRemotePath()); // real remote
// path, after
// possible
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2011 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-package com.owncloud.android.location;
-
-import com.owncloud.android.Log_OC;
-
-import android.app.ActivityManager;
-import android.app.ActivityManager.RunningServiceInfo;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.preference.PreferenceManager;
-import android.util.Log;
-
-public class LocationServiceLauncherReciever extends BroadcastReceiver {
-
- private final String TAG = getClass().getSimpleName();
-
- @Override
- public void onReceive(Context context, Intent intent) {
- Intent deviceTrackingIntent = new Intent();
- deviceTrackingIntent
- .setAction("com.owncloud.android.location.LocationUpdateService");
- SharedPreferences preferences = PreferenceManager
- .getDefaultSharedPreferences(context);
- boolean trackDevice = preferences.getBoolean("enable_devicetracking",
- true);
-
- // Used in Preferences activity so that tracking is disabled or
- // reenabled
- if (intent.hasExtra("TRACKING_SETTING")) {
- trackDevice = intent.getBooleanExtra("TRACKING_SETTING", true);
- }
-
- startOrStopDeviceTracking(context, trackDevice);
- }
-
- /**
- * Used internally. Starts or stops the device tracking service
- *
- * @param trackDevice true to start the service, false to stop it
- */
- private void startOrStopDeviceTracking(Context context, boolean trackDevice) {
- Intent deviceTrackingIntent = new Intent();
- deviceTrackingIntent
- .setAction("com.owncloud.android.location.LocationUpdateService");
- if (!isDeviceTrackingServiceRunning(context) && trackDevice) {
- Log_OC.d(TAG, "Starting device tracker service");
- context.startService(deviceTrackingIntent);
- } else if (isDeviceTrackingServiceRunning(context) && !trackDevice) {
- Log_OC.d(TAG, "Stopping device tracker service");
- context.stopService(deviceTrackingIntent);
- }
- }
-
- /**
- * Checks to see whether or not the LocationUpdateService is running
- *
- * @return true, if it is. Otherwise false
- */
- private boolean isDeviceTrackingServiceRunning(Context context) {
- ActivityManager manager = (ActivityManager) context
- .getSystemService(Context.ACTIVITY_SERVICE);
- for (RunningServiceInfo service : manager
- .getRunningServices(Integer.MAX_VALUE)) {
- if (getClass().getName().equals(service.service.getClassName())) {
- return true;
- }
- }
- return false;
- }
-
-}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2011 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-package com.owncloud.android.location;
-
-import android.app.IntentService;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.location.Criteria;
-import android.location.Location;
-import android.location.LocationListener;
-import android.location.LocationManager;
-import android.location.LocationProvider;
-import android.os.Bundle;
-import android.preference.PreferenceManager;
-import android.util.Log;
-import android.widget.Toast;
-
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.R;
-
-public class LocationUpdateService extends IntentService implements
- LocationListener {
-
- public static final String TAG = "LocationUpdateService";
-
- private LocationManager mLocationManager;
- private LocationProvider mLocationProvider;
- private SharedPreferences mPreferences;
-
- public LocationUpdateService() {
- super(TAG);
- }
-
- @Override
- protected void onHandleIntent(Intent intent) {
- mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
- // Determine, how we can track the device
- Criteria criteria = new Criteria();
- criteria.setAccuracy(Criteria.ACCURACY_FINE);
- criteria.setPowerRequirement(Criteria.POWER_LOW);
- mLocationProvider = mLocationManager.getProvider(mLocationManager
- .getBestProvider(criteria, true));
-
- // Notify user if there is no way to track the device
- if (mLocationProvider == null) {
- String message = String.format(getString(R.string.location_no_provider), getString(R.string.app_name));
- Toast.makeText(this,
- message,
- Toast.LENGTH_LONG).show();
- stopSelf();
- return;
- }
-
- // Get preferences for device tracking
- mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
- boolean trackDevice = mPreferences.getBoolean("enable_devicetracking",
- true);
- int updateIntervall = Integer.parseInt(mPreferences.getString(
- "devicetracking_update_intervall", "30")) * 60 * 1000;
- int distanceBetweenLocationChecks = 50;
-
- // If we do shall track the device -> Stop
- if (!trackDevice) {
- Log_OC.d(TAG, "Devicetracking is disabled");
- stopSelf();
- return;
- }
-
- mLocationManager.requestLocationUpdates(mLocationProvider.getName(),
- updateIntervall, distanceBetweenLocationChecks, this);
- }
-
- @Override
- public void onLocationChanged(Location location) {
- Log_OC.d(TAG, "Location changed: " + location);
-
- }
-
- @Override
- public void onProviderDisabled(String arg0) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void onProviderEnabled(String arg0) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
- // TODO Auto-generated method stub
-
- }
-
-}
import com.owncloud.android.R;
+
/**
* View containing controls for a {@link MediaPlayer}.
*
import java.io.IOException;
-import com.owncloud.android.Log_OC;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.ui.activity.FileDetailActivity;
-import com.owncloud.android.ui.fragment.FileDetailFragment;
+import com.owncloud.android.ui.activity.FileActivity;
+import com.owncloud.android.ui.activity.FileDisplayActivity;
+import com.owncloud.android.utils.Log_OC;
+
/**
* Service that handles media playback, both audio and video.
@SuppressWarnings("deprecation")
private void updateNotification(String content) {
// TODO check if updating the Intent is really necessary
- Intent showDetailsIntent = new Intent(this, FileDetailActivity.class);
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_FILE, mFile);
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_ACCOUNT, mAccount);
+ Intent showDetailsIntent = new Intent(this, FileDisplayActivity.class);
+ showDetailsIntent.putExtra(FileActivity.EXTRA_FILE, mFile);
+ showDetailsIntent.putExtra(FileActivity.EXTRA_ACCOUNT, mAccount);
showDetailsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
mNotification.contentIntent = PendingIntent.getActivity(getApplicationContext(),
(int)System.currentTimeMillis(),
/// includes a pending intent in the notification showing the details view of the file
- Intent showDetailsIntent = new Intent(this, FileDetailActivity.class);
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_FILE, mFile);
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_ACCOUNT, mAccount);
+ Intent showDetailsIntent = new Intent(this, FileDisplayActivity.class);
+ showDetailsIntent.putExtra(FileActivity.EXTRA_FILE, mFile);
+ showDetailsIntent.putExtra(FileActivity.EXTRA_ACCOUNT, mAccount);
showDetailsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
mNotification.contentIntent = PendingIntent.getActivity(getApplicationContext(),
(int)System.currentTimeMillis(),
package com.owncloud.android.media;
-import com.owncloud.android.Log_OC;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.media.MediaService.State;
+import com.owncloud.android.utils.Log_OC;
import android.accounts.Account;
import android.content.Intent;
return (currentState == MediaService.State.PLAYING || currentState == MediaService.State.PAUSED);
}
+
+ @Override
+ public int getAudioSessionId() {
+ return 1; // not really used
+ }
+
}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.network;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import java.net.SocketAddress;
-import java.net.UnknownHostException;
-import java.security.cert.X509Certificate;
-
-import javax.net.SocketFactory;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLException;
-import javax.net.ssl.SSLHandshakeException;
-import javax.net.ssl.SSLPeerUnverifiedException;
-import javax.net.ssl.SSLSession;
-import javax.net.ssl.SSLSocket;
-
-import org.apache.commons.httpclient.ConnectTimeoutException;
-import org.apache.commons.httpclient.params.HttpConnectionParams;
-import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
-import org.apache.http.conn.ssl.X509HostnameVerifier;
-
-import com.owncloud.android.Log_OC;
-
-import android.util.Log;
-
-/**
- * AdvancedSSLProtocolSocketFactory allows to create SSL {@link Socket}s with
- * a custom SSLContext and an optional Hostname Verifier.
- *
- * @author David A. Velasco
- */
-
-public class AdvancedSslSocketFactory implements ProtocolSocketFactory {
-
- private static final String TAG = AdvancedSslSocketFactory.class.getSimpleName();
-
- private SSLContext mSslContext = null;
- private AdvancedX509TrustManager mTrustManager = null;
- private X509HostnameVerifier mHostnameVerifier = null;
-
- public SSLContext getSslContext() {
- return mSslContext;
- }
-
- /**
- * Constructor for AdvancedSSLProtocolSocketFactory.
- */
- public AdvancedSslSocketFactory(SSLContext sslContext, AdvancedX509TrustManager trustManager, X509HostnameVerifier hostnameVerifier) {
- if (sslContext == null)
- throw new IllegalArgumentException("AdvancedSslSocketFactory can not be created with a null SSLContext");
- if (trustManager == null)
- throw new IllegalArgumentException("AdvancedSslSocketFactory can not be created with a null Trust Manager");
- mSslContext = sslContext;
- mTrustManager = trustManager;
- mHostnameVerifier = hostnameVerifier;
- }
-
- /**
- * @see ProtocolSocketFactory#createSocket(java.lang.String,int,java.net.InetAddress,int)
- */
- public Socket createSocket(String host, int port, InetAddress clientHost, int clientPort) throws IOException, UnknownHostException {
- Socket socket = mSslContext.getSocketFactory().createSocket(host, port, clientHost, clientPort);
- verifyPeerIdentity(host, port, socket);
- return socket;
- }
-
-
- /**
- * Attempts to get a new socket connection to the given host within the
- * given time limit.
- *
- * @param host the host name/IP
- * @param port the port on the host
- * @param clientHost the local host name/IP to bind the socket to
- * @param clientPort the port on the local machine
- * @param params {@link HttpConnectionParams Http connection parameters}
- *
- * @return Socket a new socket
- *
- * @throws IOException if an I/O error occurs while creating the socket
- * @throws UnknownHostException if the IP address of the host cannot be
- * determined
- */
- public Socket createSocket(final String host, final int port,
- final InetAddress localAddress, final int localPort,
- final HttpConnectionParams params) throws IOException,
- UnknownHostException, ConnectTimeoutException {
- Log_OC.d(TAG, "Creating SSL Socket with remote " + host + ":" + port + ", local " + localAddress + ":" + localPort + ", params: " + params);
- if (params == null) {
- throw new IllegalArgumentException("Parameters may not be null");
- }
- int timeout = params.getConnectionTimeout();
- SocketFactory socketfactory = mSslContext.getSocketFactory();
- Log_OC.d(TAG, " ... with connection timeout " + timeout + " and socket timeout " + params.getSoTimeout());
- Socket socket = socketfactory.createSocket();
- SocketAddress localaddr = new InetSocketAddress(localAddress, localPort);
- SocketAddress remoteaddr = new InetSocketAddress(host, port);
- socket.setSoTimeout(params.getSoTimeout());
- socket.bind(localaddr);
- socket.connect(remoteaddr, timeout);
- verifyPeerIdentity(host, port, socket);
- return socket;
- }
-
- /**
- * @see ProtocolSocketFactory#createSocket(java.lang.String,int)
- */
- public Socket createSocket(String host, int port) throws IOException,
- UnknownHostException {
- Log_OC.d(TAG, "Creating SSL Socket with remote " + host + ":" + port);
- Socket socket = mSslContext.getSocketFactory().createSocket(host, port);
- verifyPeerIdentity(host, port, socket);
- return socket;
- }
-
- public boolean equals(Object obj) {
- return ((obj != null) && obj.getClass().equals(
- AdvancedSslSocketFactory.class));
- }
-
- public int hashCode() {
- return AdvancedSslSocketFactory.class.hashCode();
- }
-
-
- public X509HostnameVerifier getHostNameVerifier() {
- return mHostnameVerifier;
- }
-
-
- public void setHostNameVerifier(X509HostnameVerifier hostnameVerifier) {
- mHostnameVerifier = hostnameVerifier;
- }
-
- /**
- * Verifies the identity of the server.
- *
- * The server certificate is verified first.
- *
- * Then, the host name is compared with the content of the server certificate using the current host name verifier, if any.
- * @param socket
- */
- private void verifyPeerIdentity(String host, int port, Socket socket) throws IOException {
- try {
- CertificateCombinedException failInHandshake = null;
- /// 1. VERIFY THE SERVER CERTIFICATE through the registered TrustManager (that should be an instance of AdvancedX509TrustManager)
- try {
- SSLSocket sock = (SSLSocket) socket; // a new SSLSession instance is created as a "side effect"
- sock.startHandshake();
-
- } catch (RuntimeException e) {
-
- if (e instanceof CertificateCombinedException) {
- failInHandshake = (CertificateCombinedException) e;
- } else {
- Throwable cause = e.getCause();
- Throwable previousCause = null;
- while (cause != null && cause != previousCause && !(cause instanceof CertificateCombinedException)) {
- previousCause = cause;
- cause = cause.getCause();
- }
- if (cause != null && cause instanceof CertificateCombinedException) {
- failInHandshake = (CertificateCombinedException)cause;
- }
- }
- if (failInHandshake == null) {
- throw e;
- }
- failInHandshake.setHostInUrl(host);
-
- }
-
- /// 2. VERIFY HOSTNAME
- SSLSession newSession = null;
- boolean verifiedHostname = true;
- if (mHostnameVerifier != null) {
- if (failInHandshake != null) {
- /// 2.1 : a new SSLSession instance was NOT created in the handshake
- X509Certificate serverCert = failInHandshake.getServerCertificate();
- try {
- mHostnameVerifier.verify(host, serverCert);
- } catch (SSLException e) {
- verifiedHostname = false;
- }
-
- } else {
- /// 2.2 : a new SSLSession instance was created in the handshake
- newSession = ((SSLSocket)socket).getSession();
- if (!mTrustManager.isKnownServer((X509Certificate)(newSession.getPeerCertificates()[0]))) {
- verifiedHostname = mHostnameVerifier.verify(host, newSession);
- }
- }
- }
-
- /// 3. Combine the exceptions to throw, if any
- if (!verifiedHostname) {
- SSLPeerUnverifiedException pue = new SSLPeerUnverifiedException("Names in the server certificate do not match to " + host + " in the URL");
- if (failInHandshake == null) {
- failInHandshake = new CertificateCombinedException((X509Certificate) newSession.getPeerCertificates()[0]);
- failInHandshake.setHostInUrl(host);
- }
- failInHandshake.setSslPeerUnverifiedException(pue);
- pue.initCause(failInHandshake);
- throw pue;
-
- } else if (failInHandshake != null) {
- SSLHandshakeException hse = new SSLHandshakeException("Server certificate could not be verified");
- hse.initCause(failInHandshake);
- throw hse;
- }
-
- } catch (IOException io) {
- try {
- socket.close();
- } catch (Exception x) {
- // NOTHING - irrelevant exception for the caller
- }
- throw io;
- }
- }
-
-}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.network;
-
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.cert.CertPathValidatorException;
-import java.security.cert.CertStoreException;
-import java.security.cert.CertificateException;
-import java.security.cert.CertificateExpiredException;
-import java.security.cert.CertificateNotYetValidException;
-import java.security.cert.X509Certificate;
-
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.TrustManagerFactory;
-import javax.net.ssl.X509TrustManager;
-
-import com.owncloud.android.Log_OC;
-
-import android.util.Log;
-
-/**
- * @author David A. Velasco
- */
-public class AdvancedX509TrustManager implements X509TrustManager {
-
- private static final String TAG = AdvancedX509TrustManager.class.getSimpleName();
-
- private X509TrustManager mStandardTrustManager = null;
- private KeyStore mKnownServersKeyStore;
-
- /**
- * Constructor for AdvancedX509TrustManager
- *
- * @param knownServersCertStore Local certificates store with server certificates explicitly trusted by the user.
- * @throws CertStoreException When no default X509TrustManager instance was found in the system.
- */
- public AdvancedX509TrustManager(KeyStore knownServersKeyStore)
- throws NoSuchAlgorithmException, KeyStoreException, CertStoreException {
- super();
- TrustManagerFactory factory = TrustManagerFactory
- .getInstance(TrustManagerFactory.getDefaultAlgorithm());
- factory.init((KeyStore)null);
- mStandardTrustManager = findX509TrustManager(factory);
-
- mKnownServersKeyStore = knownServersKeyStore;
- }
-
-
- /**
- * Locates the first X509TrustManager provided by a given TrustManagerFactory
- * @param factory TrustManagerFactory to inspect in the search for a X509TrustManager
- * @return The first X509TrustManager found in factory.
- * @throws CertStoreException When no X509TrustManager instance was found in factory
- */
- private X509TrustManager findX509TrustManager(TrustManagerFactory factory) throws CertStoreException {
- TrustManager tms[] = factory.getTrustManagers();
- for (int i = 0; i < tms.length; i++) {
- if (tms[i] instanceof X509TrustManager) {
- return (X509TrustManager) tms[i];
- }
- }
- return null;
- }
-
-
- /**
- * @see javax.net.ssl.X509TrustManager#checkClientTrusted(X509Certificate[],
- * String authType)
- */
- public void checkClientTrusted(X509Certificate[] certificates, String authType) throws CertificateException {
- mStandardTrustManager.checkClientTrusted(certificates, authType);
- }
-
-
- /**
- * @see javax.net.ssl.X509TrustManager#checkServerTrusted(X509Certificate[],
- * String authType)
- */
- public void checkServerTrusted(X509Certificate[] certificates, String authType) throws CertificateException {
- if (!isKnownServer(certificates[0])) {
- CertificateCombinedException result = new CertificateCombinedException(certificates[0]);
- try {
- certificates[0].checkValidity();
- } catch (CertificateExpiredException c) {
- result.setCertificateExpiredException(c);
-
- } catch (CertificateNotYetValidException c) {
- result.setCertificateNotYetException(c);
- }
-
- try {
- mStandardTrustManager.checkServerTrusted(certificates, authType);
- } catch (CertificateException c) {
- Throwable cause = c.getCause();
- Throwable previousCause = null;
- while (cause != null && cause != previousCause && !(cause instanceof CertPathValidatorException)) { // getCause() is not funny
- previousCause = cause;
- cause = cause.getCause();
- }
- if (cause != null && cause instanceof CertPathValidatorException) {
- result.setCertPathValidatorException((CertPathValidatorException)cause);
- } else {
- result.setOtherCertificateException(c);
- }
- }
-
- if (result.isException())
- throw result;
-
- }
- }
-
-
- /**
- * @see javax.net.ssl.X509TrustManager#getAcceptedIssuers()
- */
- public X509Certificate[] getAcceptedIssuers() {
- return mStandardTrustManager.getAcceptedIssuers();
- }
-
-
- public boolean isKnownServer(X509Certificate cert) {
- try {
- return (mKnownServersKeyStore.getCertificateAlias(cert) != null);
- } catch (KeyStoreException e) {
- Log_OC.d(TAG, "Fail while checking certificate in the known-servers store");
- return false;
- }
- }
-
-}
\ No newline at end of file
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.network;
-
-import java.security.cert.CertPathValidatorException;
-import java.security.cert.CertificateException;
-import java.security.cert.CertificateExpiredException;
-import java.security.cert.CertificateNotYetValidException;
-import java.security.cert.X509Certificate;
-
-import javax.net.ssl.SSLPeerUnverifiedException;
-
-/**
- * Exception joining all the problems that {@link AdvancedX509TrustManager} can find in
- * a certificate chain for a server.
- *
- * This was initially created as an extension of CertificateException, but some
- * implementations of the SSL socket layer in existing devices are REPLACING the CertificateException
- * instances thrown by {@link javax.net.ssl.X509TrustManager#checkServerTrusted(X509Certificate[], String)}
- * with SSLPeerUnverifiedException FORGETTING THE CAUSING EXCEPTION instead of wrapping it.
- *
- * Due to this, extending RuntimeException is necessary to get that the CertificateCombinedException
- * instance reaches {@link AdvancedSslSocketFactory#verifyPeerIdentity}.
- *
- * BE CAREFUL. As a RuntimeException extensions, Java compilers do not require to handle it
- * in client methods. Be sure to use it only when you know exactly where it will go.
- *
- * @author David A. Velasco
- */
-public class CertificateCombinedException extends RuntimeException {
-
- /** Generated - to refresh every time the class changes */
- private static final long serialVersionUID = -8875782030758554999L;
-
- private X509Certificate mServerCert = null;
- private String mHostInUrl;
-
- private CertificateExpiredException mCertificateExpiredException = null;
- private CertificateNotYetValidException mCertificateNotYetValidException = null;
- private CertPathValidatorException mCertPathValidatorException = null;
- private CertificateException mOtherCertificateException = null;
- private SSLPeerUnverifiedException mSslPeerUnverifiedException = null;
-
- public CertificateCombinedException(X509Certificate x509Certificate) {
- mServerCert = x509Certificate;
- }
-
- public X509Certificate getServerCertificate() {
- return mServerCert;
- }
-
- public String getHostInUrl() {
- return mHostInUrl;
- }
-
- public void setHostInUrl(String host) {
- mHostInUrl = host;
- }
-
- public CertificateExpiredException getCertificateExpiredException() {
- return mCertificateExpiredException;
- }
-
- public void setCertificateExpiredException(CertificateExpiredException c) {
- mCertificateExpiredException = c;
- }
-
- public CertificateNotYetValidException getCertificateNotYetValidException() {
- return mCertificateNotYetValidException;
- }
-
- public void setCertificateNotYetException(CertificateNotYetValidException c) {
- mCertificateNotYetValidException = c;
- }
-
- public CertPathValidatorException getCertPathValidatorException() {
- return mCertPathValidatorException;
- }
-
- public void setCertPathValidatorException(CertPathValidatorException c) {
- mCertPathValidatorException = c;
- }
-
- public CertificateException getOtherCertificateException() {
- return mOtherCertificateException;
- }
-
- public void setOtherCertificateException(CertificateException c) {
- mOtherCertificateException = c;
- }
-
- public SSLPeerUnverifiedException getSslPeerUnverifiedException() {
- return mSslPeerUnverifiedException ;
- }
-
- public void setSslPeerUnverifiedException(SSLPeerUnverifiedException s) {
- mSslPeerUnverifiedException = s;
- }
-
- public boolean isException() {
- return (mCertificateExpiredException != null ||
- mCertificateNotYetValidException != null ||
- mCertPathValidatorException != null ||
- mOtherCertificateException != null ||
- mSslPeerUnverifiedException != null);
- }
-
- public boolean isRecoverable() {
- return (mCertificateExpiredException != null ||
- mCertificateNotYetValidException != null ||
- mCertPathValidatorException != null ||
- mSslPeerUnverifiedException != null);
- }
-
-}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-package com.owncloud.android.network;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.security.GeneralSecurityException;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.cert.Certificate;
-import java.security.cert.CertificateException;
-
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.TrustManager;
-
-import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
-import org.apache.commons.httpclient.protocol.Protocol;
-import org.apache.http.conn.ssl.BrowserCompatHostnameVerifier;
-import org.apache.http.conn.ssl.X509HostnameVerifier;
-
-import com.owncloud.android.AccountUtils;
-import com.owncloud.android.Log_OC;
-
-import eu.alefzero.webdav.WebdavClient;
-
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.content.Context;
-import android.net.Uri;
-import android.util.Log;
-
-public class OwnCloudClientUtils {
-
- final private static String TAG = "OwnCloudClientFactory";
-
- /** Default timeout for waiting data from the server */
- public static final int DEFAULT_DATA_TIMEOUT = 60000;
-
- /** Default timeout for establishing a connection */
- public static final int DEFAULT_CONNECTION_TIMEOUT = 60000;
-
- /** Connection manager for all the WebdavClients */
- private static MultiThreadedHttpConnectionManager mConnManager = null;
-
- private static Protocol mDefaultHttpsProtocol = null;
-
- private static AdvancedSslSocketFactory mAdvancedSslSocketFactory = null;
-
- private static X509HostnameVerifier mHostnameVerifier = null;
-
-
- /**
- * Creates a WebdavClient setup for an ownCloud account
- *
- * @param account The ownCloud account
- * @param context The application context
- * @return A WebdavClient object ready to be used
- */
- public static WebdavClient createOwnCloudClient (Account account, Context context) {
- Log_OC.d(TAG, "Creating WebdavClient associated to " + account.name);
-
- Uri uri = Uri.parse(AccountUtils.constructFullURLForAccount(context, account));
- WebdavClient client = createOwnCloudClient(uri, context);
-
- String username = account.name.substring(0, account.name.lastIndexOf('@'));
- String password = AccountManager.get(context).getPassword(account);
- //String password = am.blockingGetAuthToken(mAccount, AccountAuthenticator.AUTH_TOKEN_TYPE, true);
-
- client.setCredentials(username, password);
-
- return client;
- }
-
-
- /**
- * Creates a WebdavClient to try a new account before saving it
- *
- * @param uri URL to the ownCloud server
- * @param username User name
- * @param password User password
- * @param context Android context where the WebdavClient is being created.
- * @return A WebdavClient object ready to be used
- */
- public static WebdavClient createOwnCloudClient(Uri uri, String username, String password, Context context) {
- Log_OC.d(TAG, "Creating WebdavClient for " + username + "@" + uri);
-
- WebdavClient client = createOwnCloudClient(uri, context);
-
- client.setCredentials(username, password);
-
- return client;
- }
-
-
- /**
- * Creates a WebdavClient to access a URL and sets the desired parameters for ownCloud client connections.
- *
- * @param uri URL to the ownCloud server
- * @param context Android context where the WebdavClient is being created.
- * @return A WebdavClient object ready to be used
- */
- public static WebdavClient createOwnCloudClient(Uri uri, Context context) {
- Log_OC.d(TAG, "Creating WebdavClient for " + uri);
-
- //allowSelfsignedCertificates(true);
- try {
- registerAdvancedSslContext(true, context);
- } catch (GeneralSecurityException e) {
- Log_OC.e(TAG, "Advanced SSL Context could not be loaded. Default SSL management in the system will be used for HTTPS connections", e);
-
- } catch (IOException e) {
- Log_OC.e(TAG, "The local server truststore could not be read. Default SSL management in the system will be used for HTTPS connections", e);
- }
-
- WebdavClient client = new WebdavClient(getMultiThreadedConnManager());
-
- client.setDefaultTimeouts(DEFAULT_DATA_TIMEOUT, DEFAULT_CONNECTION_TIMEOUT);
- client.setBaseUri(uri);
-
- return client;
- }
-
-
- /**
- * Registers or unregisters the proper components for advanced SSL handling.
- * @throws IOException
- */
- private static void registerAdvancedSslContext(boolean register, Context context) throws GeneralSecurityException, IOException {
- Protocol pr = null;
- try {
- pr = Protocol.getProtocol("https");
- if (pr != null && mDefaultHttpsProtocol == null) {
- mDefaultHttpsProtocol = pr;
- }
- } catch (IllegalStateException e) {
- // nothing to do here; really
- }
- boolean isRegistered = (pr != null && pr.getSocketFactory() instanceof AdvancedSslSocketFactory);
- if (register && !isRegistered) {
- Protocol.registerProtocol("https", new Protocol("https", getAdvancedSslSocketFactory(context), 443));
-
- } else if (!register && isRegistered) {
- if (mDefaultHttpsProtocol != null) {
- Protocol.registerProtocol("https", mDefaultHttpsProtocol);
- }
- }
- }
-
- public static AdvancedSslSocketFactory getAdvancedSslSocketFactory(Context context) throws GeneralSecurityException, IOException {
- if (mAdvancedSslSocketFactory == null) {
- KeyStore trustStore = getKnownServersStore(context);
- AdvancedX509TrustManager trustMgr = new AdvancedX509TrustManager(trustStore);
- TrustManager[] tms = new TrustManager[] { trustMgr };
-
- SSLContext sslContext = SSLContext.getInstance("TLS");
- sslContext.init(null, tms, null);
-
- mHostnameVerifier = new BrowserCompatHostnameVerifier();
- mAdvancedSslSocketFactory = new AdvancedSslSocketFactory(sslContext, trustMgr, mHostnameVerifier);
- }
- return mAdvancedSslSocketFactory;
- }
-
-
- private static String LOCAL_TRUSTSTORE_FILENAME = "knownServers.bks";
-
- private static String LOCAL_TRUSTSTORE_PASSWORD = "password";
-
- private static KeyStore mKnownServersStore = null;
-
- /**
- * Returns the local store of reliable server certificates, explicitly accepted by the user.
- *
- * Returns a KeyStore instance with empty content if the local store was never created.
- *
- * Loads the store from the storage environment if needed.
- *
- * @param context Android context where the operation is being performed.
- * @return KeyStore instance with explicitly-accepted server certificates.
- * @throws KeyStoreException When the KeyStore instance could not be created.
- * @throws IOException When an existing local trust store could not be loaded.
- * @throws NoSuchAlgorithmException When the existing local trust store was saved with an unsupported algorithm.
- * @throws CertificateException When an exception occurred while loading the certificates from the local trust store.
- */
- private static KeyStore getKnownServersStore(Context context) throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException {
- if (mKnownServersStore == null) {
- //mKnownServersStore = KeyStore.getInstance("BKS");
- mKnownServersStore = KeyStore.getInstance(KeyStore.getDefaultType());
- File localTrustStoreFile = new File(context.getFilesDir(), LOCAL_TRUSTSTORE_FILENAME);
- Log_OC.d(TAG, "Searching known-servers store at " + localTrustStoreFile.getAbsolutePath());
- if (localTrustStoreFile.exists()) {
- InputStream in = new FileInputStream(localTrustStoreFile);
- try {
- mKnownServersStore.load(in, LOCAL_TRUSTSTORE_PASSWORD.toCharArray());
- } finally {
- in.close();
- }
- } else {
- mKnownServersStore.load(null, LOCAL_TRUSTSTORE_PASSWORD.toCharArray()); // necessary to initialize an empty KeyStore instance
- }
- }
- return mKnownServersStore;
- }
-
-
- public static void addCertToKnownServersStore(Certificate cert, Context context) throws KeyStoreException, NoSuchAlgorithmException,
- CertificateException, IOException {
- KeyStore knownServers = getKnownServersStore(context);
- knownServers.setCertificateEntry(Integer.toString(cert.hashCode()), cert);
- FileOutputStream fos = null;
- try {
- fos = context.openFileOutput(LOCAL_TRUSTSTORE_FILENAME, Context.MODE_PRIVATE);
- knownServers.store(fos, LOCAL_TRUSTSTORE_PASSWORD.toCharArray());
- } finally {
- fos.close();
- }
- }
-
-
- static private MultiThreadedHttpConnectionManager getMultiThreadedConnManager() {
- if (mConnManager == null) {
- mConnManager = new MultiThreadedHttpConnectionManager();
- mConnManager.getParams().setDefaultMaxConnectionsPerHost(5);
- mConnManager.getParams().setMaxTotalConnections(5);
- }
- return mConnManager;
- }
-
-}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.network;
-
-import java.util.Collection;
-
-import eu.alefzero.webdav.OnDatatransferProgressListener;
-
-public interface ProgressiveDataTransferer {
-
- public void addDatatransferProgressListener (OnDatatransferProgressListener listener);
-
- public void addDatatransferProgressListeners(Collection<OnDatatransferProgressListener> listeners);
-
- public void removeDatatransferProgressListener(OnDatatransferProgressListener listener);
-
-}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.operations;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.nio.channels.FileChannel;
-import java.util.Random;
-
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.methods.PutMethod;
-
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.network.ProgressiveDataTransferer;
-
-import android.accounts.Account;
-import android.util.Log;
-
-import eu.alefzero.webdav.ChunkFromFileChannelRequestEntity;
-import eu.alefzero.webdav.WebdavClient;
-import eu.alefzero.webdav.WebdavUtils;
-
-public class ChunkedUploadFileOperation extends UploadFileOperation {
-
- private static final long CHUNK_SIZE = 1024000;
- private static final String OC_CHUNKED_HEADER = "OC-Chunked";
- private static final String TAG = ChunkedUploadFileOperation.class.getSimpleName();
-
- public ChunkedUploadFileOperation( Account account,
- OCFile file,
- boolean isInstant,
- boolean forceOverwrite,
- int localBehaviour) {
-
- super(account, file, isInstant, forceOverwrite, localBehaviour);
- }
-
- @Override
- protected int uploadFile(WebdavClient client) throws HttpException, IOException {
- int status = -1;
-
- FileChannel channel = null;
- RandomAccessFile raf = null;
- try {
- File file = new File(getStoragePath());
- raf = new RandomAccessFile(file, "r");
- channel = raf.getChannel();
- mEntity = new ChunkFromFileChannelRequestEntity(channel, getMimeType(), CHUNK_SIZE, file);
- ((ProgressiveDataTransferer)mEntity).addDatatransferProgressListeners(getDataTransferListeners());
- long offset = 0;
- String uriPrefix = client.getBaseUri() + WebdavUtils.encodePath(getRemotePath()) + "-chunking-" + Math.abs((new Random()).nextInt(9000)+1000) + "-" ;
- long chunkCount = (long) Math.ceil((double)file.length() / CHUNK_SIZE);
- for (int chunkIndex = 0; chunkIndex < chunkCount ; chunkIndex++, offset += CHUNK_SIZE) {
- mPutMethod = new PutMethod(uriPrefix + chunkCount + "-" + chunkIndex);
- mPutMethod.addRequestHeader(OC_CHUNKED_HEADER, OC_CHUNKED_HEADER);
- ((ChunkFromFileChannelRequestEntity)mEntity).setOffset(offset);
- mPutMethod.setRequestEntity(mEntity);
- status = client.executeMethod(mPutMethod);
- client.exhaustResponse(mPutMethod.getResponseBodyAsStream());
- Log_OC.d(TAG, "Upload of " + getStoragePath() + " to " + getRemotePath() + ", chunk index " + chunkIndex + ", count " + chunkCount + ", HTTP result status " + status);
- if (!isSuccess(status))
- break;
- }
-
- } finally {
- if (channel != null)
- channel.close();
- if (raf != null)
- raf.close();
- if (mPutMethod != null)
- mPutMethod.releaseConnection(); // let the connection available for other methods
- }
- return status;
- }
-
-}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.operations;
-
-import org.apache.commons.httpclient.HttpStatus;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import com.owncloud.android.AccountUtils;
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.utils.OwnCloudVersion;
-
-import eu.alefzero.webdav.WebdavClient;
-import android.content.Context;
-import android.net.ConnectivityManager;
-import android.net.Uri;
-import android.util.Log;
-
-public class ConnectionCheckOperation extends RemoteOperation {
-
- /** Maximum time to wait for a response from the server when the connection is being tested, in MILLISECONDs. */
- public static final int TRY_CONNECTION_TIMEOUT = 5000;
-
- private static final String TAG = ConnectionCheckOperation.class.getSimpleName();
-
- private String mUrl;
- private RemoteOperationResult mLatestResult;
- private Context mContext;
- private OwnCloudVersion mOCVersion;
-
- public ConnectionCheckOperation(String url, Context context) {
- mUrl = url;
- mContext = context;
- mOCVersion = null;
- }
-
- public OwnCloudVersion getDiscoveredVersion() {
- return mOCVersion;
- }
-
- private boolean tryConnection(WebdavClient wc, String urlSt) {
- boolean retval = false;
- GetMethod get = null;
- try {
- get = new GetMethod(urlSt);
- int status = wc.executeMethod(get, TRY_CONNECTION_TIMEOUT, TRY_CONNECTION_TIMEOUT);
- String response = get.getResponseBodyAsString();
- if (status == HttpStatus.SC_OK) {
- JSONObject json = new JSONObject(response);
- if (!json.getBoolean("installed")) {
- mLatestResult = new RemoteOperationResult(RemoteOperationResult.ResultCode.INSTANCE_NOT_CONFIGURED);
- } else {
- mOCVersion = new OwnCloudVersion(json.getString("version"));
- if (!mOCVersion.isVersionValid()) {
- mLatestResult = new RemoteOperationResult(RemoteOperationResult.ResultCode.BAD_OC_VERSION);
-
- } else {
- mLatestResult = new RemoteOperationResult(urlSt.startsWith("https://") ?
- RemoteOperationResult.ResultCode.OK_SSL :
- RemoteOperationResult.ResultCode.OK_NO_SSL
- );
-
- retval = true;
- }
- }
-
- } else {
- mLatestResult = new RemoteOperationResult(false, status);
- }
-
- } catch (JSONException e) {
- mLatestResult = new RemoteOperationResult(RemoteOperationResult.ResultCode.INSTANCE_NOT_CONFIGURED);
-
- } catch (Exception e) {
- mLatestResult = new RemoteOperationResult(e);
-
- } finally {
- if (get != null)
- get.releaseConnection();
- }
-
- if (mLatestResult.isSuccess()) {
- Log_OC.i(TAG, "Connection check at " + urlSt + ": " + mLatestResult.getLogMessage());
-
- } else if (mLatestResult.getException() != null) {
- Log_OC.e(TAG, "Connection check at " + urlSt + ": " + mLatestResult.getLogMessage(), mLatestResult.getException());
-
- } else {
- Log_OC.e(TAG, "Connection check at " + urlSt + ": " + mLatestResult.getLogMessage());
- }
-
- return retval;
- }
-
- private boolean isOnline() {
- ConnectivityManager cm = (ConnectivityManager) mContext
- .getSystemService(Context.CONNECTIVITY_SERVICE);
- return cm != null && cm.getActiveNetworkInfo() != null
- && cm.getActiveNetworkInfo().isConnectedOrConnecting();
- }
-
- @Override
- protected RemoteOperationResult run(WebdavClient client) {
- if (!isOnline()) {
- return new RemoteOperationResult(RemoteOperationResult.ResultCode.NO_NETWORK_CONNECTION);
- }
- if (mUrl.startsWith("http://") || mUrl.startsWith("https://")) {
- tryConnection(client, mUrl + AccountUtils.STATUS_PATH);
-
- } else {
- client.setBaseUri(Uri.parse("https://" + mUrl + AccountUtils.STATUS_PATH));
- boolean httpsSuccess = tryConnection(client, "https://" + mUrl + AccountUtils.STATUS_PATH);
- if (!httpsSuccess && !mLatestResult.isSslRecoverableException()) {
- Log_OC.d(TAG, "establishing secure connection failed, trying non secure connection");
- client.setBaseUri(Uri.parse("http://" + mUrl + AccountUtils.STATUS_PATH));
- tryConnection(client, "http://" + mUrl + AccountUtils.STATUS_PATH);
- }
- }
- return mLatestResult;
- }
-
-}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.operations;
+
+import com.owncloud.android.datamodel.FileDataStorageManager;
+import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.lib.resources.files.CreateRemoteFolderOperation;
+import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.Log_OC;
+
+
+/**
+ * Access to remote operation performing the creation of a new folder in the ownCloud server.
+ * Save the new folder in Database
+ *
+ * @author David A. Velasco
+ * @author masensio
+ */
+public class CreateFolderOperation extends RemoteOperation implements OnRemoteOperationListener{
+
+ private static final String TAG = CreateFolderOperation.class.getSimpleName();
+
+ protected String mRemotePath;
+ protected boolean mCreateFullPath;
+ protected FileDataStorageManager mStorageManager;
+
+ /**
+ * Constructor
+ *
+ * @param createFullPath 'True' means that all the ancestor folders should be created if don't exist yet.
+ * @param storageManager Reference to the local database corresponding to the account where the file is contained.
+ */
+ public CreateFolderOperation(String remotePath, boolean createFullPath, FileDataStorageManager storageManager) {
+ mRemotePath = remotePath;
+ mCreateFullPath = createFullPath;
+ mStorageManager = storageManager;
+
+ }
+
+
+ @Override
+ protected RemoteOperationResult run(OwnCloudClient client) {
+ CreateRemoteFolderOperation operation = new CreateRemoteFolderOperation(mRemotePath, mCreateFullPath);
+ RemoteOperationResult result = operation.execute(client);
+
+ if (result.isSuccess()) {
+ saveFolderInDB();
+ } else {
+ Log_OC.e(TAG, mRemotePath + "hasn't been created");
+ }
+
+ return result;
+ }
+
+ @Override
+ public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) {
+ if (operation instanceof CreateRemoteFolderOperation) {
+ onCreateRemoteFolderOperationFinish((CreateRemoteFolderOperation)operation, result);
+ }
+ }
+
+
+ private void onCreateRemoteFolderOperationFinish(CreateRemoteFolderOperation operation, RemoteOperationResult result) {
+ if (result.isSuccess()) {
+ saveFolderInDB();
+ } else {
+ Log_OC.e(TAG, mRemotePath + "hasn't been created");
+ }
+ }
+
+
+ /**
+ * Save new directory in local database
+ */
+ public void saveFolderInDB() {
+ OCFile newDir = new OCFile(mRemotePath);
+ newDir.setMimetype("DIR");
+ long parentId = mStorageManager.getFileByPath(FileStorageUtils.getParentPath(mRemotePath)).getFileId();
+ newDir.setParentId(parentId);
+ newDir.setModificationTimestamp(System.currentTimeMillis());
+ mStorageManager.saveFile(newDir);
+
+ Log_OC.d(TAG, "Create directory " + mRemotePath + " in Database");
+
+ }
+
+
+}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2014 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.operations;
+
+/**
+ * Creates a new share from a given file
+ *
+ * @author masensio
+ *
+ */
+
+import android.content.Intent;
+
+import com.owncloud.android.datamodel.FileDataStorageManager;
+import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.lib.resources.shares.OCShare;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.resources.shares.GetRemoteSharesForFileOperation;
+import com.owncloud.android.lib.resources.shares.ShareType;
+import com.owncloud.android.lib.resources.shares.CreateRemoteShareOperation;
+import com.owncloud.android.lib.resources.files.FileUtils;
+import com.owncloud.android.operations.common.SyncOperation;
+import com.owncloud.android.utils.Log_OC;
+
+public class CreateShareOperation extends SyncOperation {
+
+ private static final String TAG = CreateShareOperation.class.getSimpleName();
+
+
+ protected FileDataStorageManager mStorageManager;
+
+ private String mPath;
+ private ShareType mShareType;
+ private String mShareWith;
+ private boolean mPublicUpload;
+ private String mPassword;
+ private int mPermissions;
+ private Intent mSendIntent;
+
+ /**
+ * Constructor
+ * @param path Full path of the file/folder being shared. Mandatory argument
+ * @param shareType \910\92 = user, \911\92 = group, \913\92 = Public link. Mandatory argument
+ * @param shareWith User/group ID with who the file should be shared. This is mandatory for shareType of 0 or 1
+ * @param publicUpload If \91false\92 (default) public cannot upload to a public shared folder.
+ * If \91true\92 public can upload to a shared folder. Only available for public link shares
+ * @param password Password to protect a public link share. Only available for public link shares
+ * @param permissions 1 - Read only \96 Default for \93public\94 shares
+ * 2 - Update
+ * 4 - Create
+ * 8 - Delete
+ * 16- Re-share
+ * 31- All above \96 Default for \93private\94 shares
+ * For user or group shares.
+ * To obtain combinations, add the desired values together.
+ * For instance, for \93Re-Share\94, \93delete\94, \93read\94, \93update\94, add 16+8+2+1 = 27.
+ */
+ public CreateShareOperation(String path, ShareType shareType, String shareWith, boolean publicUpload,
+ String password, int permissions, Intent sendIntent) {
+
+ mPath = path;
+ mShareType = shareType;
+ mShareWith = shareWith;
+ mPublicUpload = publicUpload;
+ mPassword = password;
+ mPermissions = permissions;
+ mSendIntent = sendIntent;
+ }
+
+ @Override
+ protected RemoteOperationResult run(OwnCloudClient client) {
+ RemoteOperation operation = null;
+
+ // Check if the share link already exists
+ operation = new GetRemoteSharesForFileOperation(mPath, false, false);
+ RemoteOperationResult result = ((GetRemoteSharesForFileOperation)operation).execute(client);
+
+ if (!result.isSuccess() || result.getData().size() <= 0) {
+ operation = new CreateRemoteShareOperation(mPath, mShareType, mShareWith, mPublicUpload, mPassword, mPermissions);
+ result = ((CreateRemoteShareOperation)operation).execute(client);
+ }
+
+ if (result.isSuccess()) {
+ if (result.getData().size() > 0) {
+ OCShare share = (OCShare) result.getData().get(0);
+ updateData(share);
+ }
+ }
+
+ return result;
+ }
+
+
+ public Intent getSendIntent() {
+ return mSendIntent;
+ }
+
+ private void updateData(OCShare share) {
+ // Update DB with the response
+ share.setPath(mPath);
+ if (mPath.endsWith(FileUtils.PATH_SEPARATOR)) {
+ share.setIsFolder(true);
+ } else {
+ share.setIsFolder(false);
+ }
+ share.setPermissions(mPermissions);
+
+ getStorageManager().saveShare(share);
+
+ // Update OCFile with data from share: ShareByLink and publicLink
+ OCFile file = getStorageManager().getFileByPath(mPath);
+ if (file!=null) {
+ mSendIntent.putExtra(Intent.EXTRA_TEXT, share.getShareLink());
+ file.setPublicLink(share.getShareLink());
+ file.setShareByLink(true);
+ getStorageManager().saveFile(file);
+ Log_OC.d(TAG, "Public Link = " + file.getPublicLink());
+
+ }
+ }
+
+}
--- /dev/null
+/* ownCloud Android Library is available under MIT license
+ * Copyright (C) 2014 ownCloud Inc.
+ *
+ * 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 above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * 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 com.owncloud.android.operations;
+
+import java.util.ArrayList;
+
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.lib.resources.files.ExistenceCheckRemoteOperation;
+
+import android.content.Context;
+import android.net.Uri;
+import android.util.Log;
+
+/**
+ * Operation to find out what authentication method requires
+ * the server to access files.
+ *
+ * Basically, tries to access to the root folder without authorization
+ * and analyzes the response.
+ *
+ * When successful, the instance of {@link RemoteOperationResult} passed
+ * through {@link OnRemoteOperationListener#onRemoteOperationFinish(RemoteOperation,
+ * RemoteOperationResult)} returns in {@link RemoteOperationResult#getData()}
+ * a value of {@link AuthenticationMethod}.
+ *
+ * @author David A. Velasco
+ */
+public class DetectAuthenticationMethodOperation extends RemoteOperation {
+
+ private static final String TAG = DetectAuthenticationMethodOperation.class.getSimpleName();
+
+ public enum AuthenticationMethod {
+ UNKNOWN,
+ NONE,
+ BASIC_HTTP_AUTH,
+ SAML_WEB_SSO,
+ BEARER_TOKEN
+ }
+
+ private Context mContext;
+ private String mWebDavUrl;
+
+ /**
+ * Constructor
+ *
+ * @param context Android context of the caller.
+ * @param webdavUrl
+ */
+ public DetectAuthenticationMethodOperation(Context context, String webdavUrl) {
+ mContext = context;
+ mWebDavUrl = webdavUrl;
+ }
+
+
+ /**
+ * Performs the operation.
+ *
+ * Triggers a check of existence on the root folder of the server, granting
+ * that the request is not authenticated.
+ *
+ * Analyzes the result of check to find out what authentication method, if
+ * any, is requested by the server.
+ */
+ @Override
+ protected RemoteOperationResult run(OwnCloudClient client) {
+ RemoteOperationResult result = null;
+ AuthenticationMethod authMethod = AuthenticationMethod.UNKNOWN;
+
+ RemoteOperation operation = new ExistenceCheckRemoteOperation("", mContext, false);
+ client.setWebdavUri(Uri.parse(mWebDavUrl));
+ client.setBasicCredentials("", "");
+ client.setFollowRedirects(false);
+
+ // try to access the root folder, following redirections but not SAML SSO redirections
+ result = operation.execute(client);
+ String redirectedLocation = result.getRedirectedLocation();
+ while (redirectedLocation != null && redirectedLocation.length() > 0 && !result.isIdPRedirection()) {
+ client.setWebdavUri(Uri.parse(result.getRedirectedLocation()));
+ result = operation.execute(client);
+ redirectedLocation = result.getRedirectedLocation();
+ }
+
+ // analyze response
+ if (result.getCode() == ResultCode.UNAUTHORIZED) {
+ String authRequest = ((result.getAuthenticateHeader()).trim()).toLowerCase();
+ if (authRequest.startsWith("basic")) {
+ authMethod = AuthenticationMethod.BASIC_HTTP_AUTH;
+
+ } else if (authRequest.startsWith("bearer")) {
+ authMethod = AuthenticationMethod.BEARER_TOKEN;
+ }
+ // else - fall back to UNKNOWN
+
+ } else if (result.isSuccess()) {
+ authMethod = AuthenticationMethod.NONE;
+
+ } else if (result.isIdPRedirection()) {
+ authMethod = AuthenticationMethod.SAML_WEB_SSO;
+ }
+ // else - fall back to UNKNOWN
+ Log.d(TAG, "Authentication method found: " + authenticationMethodToString(authMethod));
+
+ if (!authMethod.equals(AuthenticationMethod.UNKNOWN)) {
+ result = new RemoteOperationResult(true, result.getHttpCode(), null);
+ }
+ ArrayList<Object> data = new ArrayList<Object>();
+ data.add(authMethod);
+ result.setData(data);
+ return result; // same result instance, so that other errors can be handled by the caller transparently
+ }
+
+
+ private String authenticationMethodToString(AuthenticationMethod value) {
+ switch (value){
+ case NONE:
+ return "NONE";
+ case BASIC_HTTP_AUTH:
+ return "BASIC_HTTP_AUTH";
+ case BEARER_TOKEN:
+ return "BEARER_TOKEN";
+ case SAML_WEB_SSO:
+ return "SAML_WEB_SSO";
+ default:
+ return "UNKNOWN";
+ }
+ }
+
+}
package com.owncloud.android.operations;
-import java.io.BufferedInputStream;
import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
-import org.apache.commons.httpclient.Header;
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.http.HttpStatus;
-
-import com.owncloud.android.Log_OC;
import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.operations.RemoteOperation;
-import com.owncloud.android.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.network.OnDatatransferProgressListener;
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.resources.files.DownloadRemoteFileOperation;
import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.Log_OC;
-import eu.alefzero.webdav.OnDatatransferProgressListener;
-import eu.alefzero.webdav.WebdavClient;
-import eu.alefzero.webdav.WebdavUtils;
import android.accounts.Account;
-import android.util.Log;
import android.webkit.MimeTypeMap;
/**
- * Remote operation performing the download of a file to an ownCloud server
+ * Remote mDownloadOperation performing the download of a file to an ownCloud server
*
* @author David A. Velasco
+ * @author masensio
*/
public class DownloadFileOperation extends RemoteOperation {
private Account mAccount;
private OCFile mFile;
private Set<OnDatatransferProgressListener> mDataTransferListeners = new HashSet<OnDatatransferProgressListener>();
- private final AtomicBoolean mCancellationRequested = new AtomicBoolean(false);
private long mModificationTimestamp = 0;
+
+ private DownloadRemoteFileOperation mDownloadOperation;
public DownloadFileOperation(Account account, OCFile file) {
mAccount = account;
mFile = file;
+
}
return FileStorageUtils.getTemporalPath(mAccount.name) + mFile.getRemotePath();
}
+ public String getTmpFolder() {
+ return FileStorageUtils.getTemporalPath(mAccount.name);
+ }
+
public String getRemotePath() {
return mFile.getRemotePath();
}
public long getModificationTimestamp() {
return (mModificationTimestamp > 0) ? mModificationTimestamp : mFile.getModificationTimestamp();
}
-
-
- public void addDatatransferProgressListener (OnDatatransferProgressListener listener) {
- synchronized (mDataTransferListeners) {
- mDataTransferListeners.add(listener);
- }
- }
-
- public void removeDatatransferProgressListener(OnDatatransferProgressListener listener) {
- synchronized (mDataTransferListeners) {
- mDataTransferListeners.remove(listener);
- }
- }
@Override
- protected RemoteOperationResult run(WebdavClient client) {
+ protected RemoteOperationResult run(OwnCloudClient client) {
RemoteOperationResult result = null;
File newFile = null;
boolean moved = true;
/// download will be performed to a temporal file, then moved to the final location
File tmpFile = new File(getTmpPath());
+ String tmpFolder = getTmpFolder();
+
/// perform the download
- try {
- tmpFile.getParentFile().mkdirs();
- int status = downloadFile(client, tmpFile);
- if (isSuccess(status)) {
- newFile = new File(getSavePath());
- newFile.getParentFile().mkdirs();
- moved = tmpFile.renameTo(newFile);
- }
+ mDownloadOperation = new DownloadRemoteFileOperation(mFile.getRemotePath(), tmpFolder);
+ Iterator<OnDatatransferProgressListener> listener = mDataTransferListeners.iterator();
+ while (listener.hasNext()) {
+ mDownloadOperation.addDatatransferProgressListener(listener.next());
+ }
+ result = mDownloadOperation.execute(client);
+
+ if (result.isSuccess()) {
+ mModificationTimestamp = mDownloadOperation.getModificationTimestamp();
+ newFile = new File(getSavePath());
+ newFile.getParentFile().mkdirs();
+ moved = tmpFile.renameTo(newFile);
+
if (!moved)
result = new RemoteOperationResult(RemoteOperationResult.ResultCode.LOCAL_STORAGE_NOT_MOVED);
- else
- result = new RemoteOperationResult(isSuccess(status), status);
- Log_OC.i(TAG, "Download of " + mFile.getRemotePath() + " to " + getSavePath() + ": " + result.getLogMessage());
-
- } catch (Exception e) {
- result = new RemoteOperationResult(e);
- Log_OC.e(TAG, "Download of " + mFile.getRemotePath() + " to " + getSavePath() + ": " + result.getLogMessage(), e);
}
+ Log_OC.i(TAG, "Download of " + mFile.getRemotePath() + " to " + getSavePath() + ": " + result.getLogMessage());
+
return result;
}
-
- public boolean isSuccess(int status) {
- return (status == HttpStatus.SC_OK);
+ public void cancel() {
+ mDownloadOperation.cancel();
}
-
-
- protected int downloadFile(WebdavClient client, File targetFile) throws HttpException, IOException, OperationCancelledException {
- int status = -1;
- boolean savedFile = false;
- GetMethod get = new GetMethod(client.getBaseUri() + WebdavUtils.encodePath(mFile.getRemotePath()));
- Iterator<OnDatatransferProgressListener> it = null;
-
- FileOutputStream fos = null;
- try {
- status = client.executeMethod(get);
- if (isSuccess(status)) {
- targetFile.createNewFile();
- BufferedInputStream bis = new BufferedInputStream(get.getResponseBodyAsStream());
- fos = new FileOutputStream(targetFile);
- long transferred = 0;
- byte[] bytes = new byte[4096];
- int readResult = 0;
- while ((readResult = bis.read(bytes)) != -1) {
- synchronized(mCancellationRequested) {
- if (mCancellationRequested.get()) {
- get.abort();
- throw new OperationCancelledException();
- }
- }
- fos.write(bytes, 0, readResult);
- transferred += readResult;
- synchronized (mDataTransferListeners) {
- it = mDataTransferListeners.iterator();
- while (it.hasNext()) {
- it.next().onTransferProgress(readResult, transferred, mFile.getFileLength(), targetFile.getName());
- }
- }
- }
- savedFile = true;
- Header modificationTime = get.getResponseHeader("Last-Modified");
- if (modificationTime != null) {
- Date d = WebdavUtils.parseResponseDate((String) modificationTime.getValue());
- mModificationTimestamp = (d != null) ? d.getTime() : 0;
- }
-
- } else {
- client.exhaustResponse(get.getResponseBodyAsStream());
- }
-
- } finally {
- if (fos != null) fos.close();
- if (!savedFile && targetFile.exists()) {
- targetFile.delete();
- }
- get.releaseConnection(); // let the connection available for other methods
+
+ public void addDatatransferProgressListener (OnDatatransferProgressListener listener) {
+ synchronized (mDataTransferListeners) {
+ mDataTransferListeners.add(listener);
}
- return status;
}
-
- public void cancel() {
- mCancellationRequested.set(true); // atomic set; there is no need of synchronizing it
+ public void removeDatatransferProgressListener(OnDatatransferProgressListener listener) {
+ synchronized (mDataTransferListeners) {
+ mDataTransferListeners.remove(listener);
+ }
}
-
-
+
}
--- /dev/null
+/* ownCloud Android Library is available under MIT license
+ * Copyright (C) 2014 ownCloud Inc.
+ *
+ * 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 above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * 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 com.owncloud.android.operations;
+
+import java.util.ArrayList;
+
+import com.owncloud.android.authentication.AccountUtils;
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.lib.resources.status.GetRemoteStatusOperation;
+import com.owncloud.android.lib.resources.status.OwnCloudVersion;
+import com.owncloud.android.operations.DetectAuthenticationMethodOperation.AuthenticationMethod;
+import com.owncloud.android.utils.Log_OC;
+
+import android.content.Context;
+
+/**
+ * Get basic information from an ownCloud server given its URL.
+ *
+ * Checks the existence of a configured ownCloud server in the URL, gets its version
+ * and finds out what authentication method is needed to access files in it.
+ *
+ * @author David A. Velasco
+ * @author masensio
+ */
+
+public class GetServerInfoOperation extends RemoteOperation {
+
+ private static final String TAG = GetServerInfoOperation.class.getSimpleName();
+
+ private String mUrl;
+ private String mAuthTokenType;
+ private Context mContext;
+
+ private ServerInfo mResultData;
+
+ /**
+ * Constructor.
+ *
+ * @param url URL to an ownCloud server.
+ * @param authTokenType Identifies the authorization token supported by the caller;
+ * TODO ugly dependency, get rid of it.
+ * @param context Android context; needed to check network state
+ * TODO ugly dependency, get rid of it.
+ */
+ public GetServerInfoOperation(String url, String authTokenType, Context context) {
+ mUrl = trimWebdavSuffix(url);
+ mAuthTokenType = authTokenType;
+ mContext = context;
+
+ mResultData = new ServerInfo();
+ }
+
+
+ /**
+ * Performs the operation
+ *
+ * @return Result of the operation. If successful, includes an instance of
+ * {@link ServerInfo} with the information retrieved from the server.
+ * Call {@link RemoteOperationResult#getData()}.get(0) to get it.
+ */
+ @Override
+ protected RemoteOperationResult run(OwnCloudClient client) {
+
+ // first: check the status of the server (including its version)
+ GetRemoteStatusOperation getStatus = new GetRemoteStatusOperation(mUrl, mContext);
+ RemoteOperationResult result = getStatus.execute(client);
+
+ if (result.isSuccess()) {
+ // second: get authentication method required by the server
+ mResultData.mVersion = (OwnCloudVersion)(result.getData().get(0));
+ mResultData.mIsSslConn = (result.getCode() == ResultCode.OK_SSL);
+ mResultData.mBaseUrl = normalizeProtocolPrefix(mUrl, mResultData.mIsSslConn);
+ RemoteOperationResult detectAuthResult = detectAuthorizationMethod(client);
+
+ // third: merge results
+ if (detectAuthResult.isSuccess()) {
+ mResultData.mAuthMethod =
+ (AuthenticationMethod)detectAuthResult.getData().get(0);
+ ArrayList<Object> data = new ArrayList<Object>();
+ data.add(mResultData);
+ result.setData(data);
+ } else {
+ result = detectAuthResult;
+ }
+ }
+ return result;
+ }
+
+
+ private RemoteOperationResult detectAuthorizationMethod(OwnCloudClient client) {
+ Log_OC.d(TAG, "Trying empty authorization to detect authentication method");
+ String webdav_path = AccountUtils.getWebdavPath(mResultData.mVersion, mAuthTokenType);
+ String webdav_url = mResultData.mBaseUrl + webdav_path;
+ DetectAuthenticationMethodOperation operation =
+ new DetectAuthenticationMethodOperation(mContext, webdav_url);
+ return operation.execute(client);
+ }
+
+
+ private String trimWebdavSuffix(String url) {
+ if (url == null) {
+ url = "";
+ } else {
+ if (url.endsWith("/")) {
+ url = url.substring(0, url.length() - 1);
+ }
+ if(url.toLowerCase().endsWith(AccountUtils.WEBDAV_PATH_4_0)){
+ url = url.substring(0, url.length() - AccountUtils.WEBDAV_PATH_4_0.length());
+ } else if(url.toLowerCase().endsWith(AccountUtils.WEBDAV_PATH_2_0)){
+ url = url.substring(0, url.length() - AccountUtils.WEBDAV_PATH_2_0.length());
+ } else if (url.toLowerCase().endsWith(AccountUtils.WEBDAV_PATH_1_2)){
+ url = url.substring(0, url.length() - AccountUtils.WEBDAV_PATH_1_2.length());
+ }
+ }
+ return url;
+ }
+
+
+ private String normalizeProtocolPrefix(String url, boolean isSslConn) {
+ if (!url.toLowerCase().startsWith("http://") &&
+ !url.toLowerCase().startsWith("https://")) {
+ if (isSslConn) {
+ return "https://" + url;
+ } else {
+ return "http://" + url;
+ }
+ }
+ return url;
+ }
+
+
+ public static class ServerInfo {
+ public OwnCloudVersion mVersion = null;
+ public String mBaseUrl = "";
+ public AuthenticationMethod mAuthMethod = AuthenticationMethod.UNKNOWN;
+ public boolean mIsSslConn = false;
+ }
+
+}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2013 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+package com.owncloud.android.operations;
+
+import java.util.ArrayList;
+
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.lib.resources.shares.OCShare;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.resources.shares.GetRemoteSharesForFileOperation;
+import com.owncloud.android.operations.common.SyncOperation;
+import com.owncloud.android.utils.Log_OC;
+
+/**
+ * Provide a list shares for a specific file.
+ *
+ * @author masensio
+ *
+ */
+public class GetSharesForFileOperation extends SyncOperation {
+
+ private static final String TAG = GetSharesForFileOperation.class.getSimpleName();
+
+ private String mPath;
+ private boolean mReshares;
+ private boolean mSubfiles;
+
+ /**
+ * Constructor
+ *
+ * @param path Path to file or folder
+ * @param reshares If set to \91false\92 (default), only shares from the current user are returned
+ * If set to \91true\92, all shares from the given file are returned
+ * @param subfiles If set to \91false\92 (default), lists only the folder being shared
+ * If set to \91true\92, all shared files within the folder are returned.
+ */
+ public GetSharesForFileOperation(String path, boolean reshares, boolean subfiles) {
+ mPath = path;
+ mReshares = reshares;
+ mSubfiles = subfiles;
+ }
+
+ @Override
+ protected RemoteOperationResult run(OwnCloudClient client) {
+ GetRemoteSharesForFileOperation operation = new GetRemoteSharesForFileOperation(mPath, mReshares, mSubfiles);
+ RemoteOperationResult result = operation.execute(client);
+
+ if (result.isSuccess()) {
+
+ // Update DB with the response
+ Log_OC.d(TAG, "File = " + mPath + " Share list size " + result.getData().size());
+ ArrayList<OCShare> shares = new ArrayList<OCShare>();
+ for(Object obj: result.getData()) {
+ shares.add((OCShare) obj);
+ }
+
+ getStorageManager().saveSharesDB(shares);
+ }
+
+ return result;
+ }
+
+}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2014 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.operations;
+
+import java.util.ArrayList;
+
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.resources.shares.OCShare;
+import com.owncloud.android.lib.resources.shares.GetRemoteSharesOperation;
+import com.owncloud.android.operations.common.SyncOperation;
+import com.owncloud.android.utils.Log_OC;
+
+/**
+ * Access to remote operation to get the share files/folders
+ * Save the data in Database
+ *
+ * @author masensio
+ * @author David A. Velasco
+ */
+
+public class GetSharesOperation extends SyncOperation {
+
+ private static final String TAG = GetSharesOperation.class.getSimpleName();
+
+ @Override
+ protected RemoteOperationResult run(OwnCloudClient client) {
+ GetRemoteSharesOperation operation = new GetRemoteSharesOperation();
+ RemoteOperationResult result = operation.execute(client);
+
+ if (result.isSuccess()) {
+
+ // Update DB with the response
+ Log_OC.d(TAG, "Share list size = " + result.getData().size());
+ ArrayList<OCShare> shares = new ArrayList<OCShare>();
+ for(Object obj: result.getData()) {
+ shares.add((OCShare) obj);
+ }
+
+ getStorageManager().saveSharesDB(shares);
+ }
+
+ return result;
+ }
+
+}
--- /dev/null
+package com.owncloud.android.operations;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.NameValuePair;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import com.owncloud.android.authentication.OAuth2Constants;
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.utils.Log_OC;
+
+
+public class OAuth2GetAccessToken extends RemoteOperation {
+
+ private static final String TAG = OAuth2GetAccessToken.class.getSimpleName();
+
+ private String mClientId;
+ private String mRedirectUri;
+ private String mGrantType;
+
+ private String mOAuth2AuthorizationResponse;
+ private Map<String, String> mOAuth2ParsedAuthorizationResponse;
+ private Map<String, String> mResultTokenMap;
+
+
+ public OAuth2GetAccessToken(String clientId, String redirectUri, String grantType, String oAuth2AuthorizationResponse) {
+ mClientId = clientId;
+ mRedirectUri = redirectUri;
+ mGrantType = grantType;
+ mOAuth2AuthorizationResponse = oAuth2AuthorizationResponse;
+ mOAuth2ParsedAuthorizationResponse = new HashMap<String, String>();
+ mResultTokenMap = null;
+ }
+
+ /*
+ public Map<String, String> getResultTokenMap() {
+ return mResultTokenMap;
+ }
+ */
+
+ @Override
+ protected RemoteOperationResult run(OwnCloudClient client) {
+ RemoteOperationResult result = null;
+ PostMethod postMethod = null;
+
+ try {
+ parseAuthorizationResponse();
+ if (mOAuth2ParsedAuthorizationResponse.keySet().contains(OAuth2Constants.KEY_ERROR)) {
+ if (OAuth2Constants.VALUE_ERROR_ACCESS_DENIED.equals(mOAuth2ParsedAuthorizationResponse.get(OAuth2Constants.KEY_ERROR))) {
+ result = new RemoteOperationResult(ResultCode.OAUTH2_ERROR_ACCESS_DENIED);
+ } else {
+ result = new RemoteOperationResult(ResultCode.OAUTH2_ERROR);
+ }
+ }
+
+ if (result == null) {
+ NameValuePair[] nameValuePairs = new NameValuePair[4];
+ nameValuePairs[0] = new NameValuePair(OAuth2Constants.KEY_GRANT_TYPE, mGrantType);
+ nameValuePairs[1] = new NameValuePair(OAuth2Constants.KEY_CODE, mOAuth2ParsedAuthorizationResponse.get(OAuth2Constants.KEY_CODE));
+ nameValuePairs[2] = new NameValuePair(OAuth2Constants.KEY_REDIRECT_URI, mRedirectUri);
+ nameValuePairs[3] = new NameValuePair(OAuth2Constants.KEY_CLIENT_ID, mClientId);
+ //nameValuePairs[4] = new NameValuePair(OAuth2Constants.KEY_SCOPE, mOAuth2ParsedAuthorizationResponse.get(OAuth2Constants.KEY_SCOPE));
+
+ postMethod = new PostMethod(client.getWebdavUri().toString());
+ postMethod.setRequestBody(nameValuePairs);
+ int status = client.executeMethod(postMethod);
+
+ String response = postMethod.getResponseBodyAsString();
+ if (response != null && response.length() > 0) {
+ JSONObject tokenJson = new JSONObject(response);
+ parseAccessTokenResult(tokenJson);
+ if (mResultTokenMap.get(OAuth2Constants.KEY_ERROR) != null || mResultTokenMap.get(OAuth2Constants.KEY_ACCESS_TOKEN) == null) {
+ result = new RemoteOperationResult(ResultCode.OAUTH2_ERROR);
+
+ } else {
+ result = new RemoteOperationResult(true, status, postMethod.getResponseHeaders());
+ ArrayList<Object> data = new ArrayList<Object>();
+ data.add(mResultTokenMap);
+ result.setData(data);
+ }
+
+ } else {
+ client.exhaustResponse(postMethod.getResponseBodyAsStream());
+ result = new RemoteOperationResult(false, status, postMethod.getResponseHeaders());
+ }
+ }
+
+ } catch (Exception e) {
+ result = new RemoteOperationResult(e);
+
+ } finally {
+ if (postMethod != null)
+ postMethod.releaseConnection(); // let the connection available for other methods
+
+ if (result.isSuccess()) {
+ Log_OC.i(TAG, "OAuth2 TOKEN REQUEST with auth code " + mOAuth2ParsedAuthorizationResponse.get("code") + " to " + client.getWebdavUri() + ": " + result.getLogMessage());
+
+ } else if (result.getException() != null) {
+ Log_OC.e(TAG, "OAuth2 TOKEN REQUEST with auth code " + mOAuth2ParsedAuthorizationResponse.get("code") + " to " + client.getWebdavUri() + ": " + result.getLogMessage(), result.getException());
+
+ } else if (result.getCode() == ResultCode.OAUTH2_ERROR) {
+ Log_OC.e(TAG, "OAuth2 TOKEN REQUEST with auth code " + mOAuth2ParsedAuthorizationResponse.get("code") + " to " + client.getWebdavUri() + ": " + ((mResultTokenMap != null) ? mResultTokenMap.get(OAuth2Constants.KEY_ERROR) : "NULL"));
+
+ } else {
+ Log_OC.e(TAG, "OAuth2 TOKEN REQUEST with auth code " + mOAuth2ParsedAuthorizationResponse.get("code") + " to " + client.getWebdavUri() + ": " + result.getLogMessage());
+ }
+ }
+
+ return result;
+ }
+
+
+ private void parseAuthorizationResponse() {
+ String[] pairs = mOAuth2AuthorizationResponse.split("&");
+ int i = 0;
+ String key = "";
+ String value = "";
+ StringBuilder sb = new StringBuilder();
+ while (pairs.length > i) {
+ int j = 0;
+ String[] part = pairs[i].split("=");
+ while (part.length > j) {
+ String p = part[j];
+ if (j == 0) {
+ key = p;
+ sb.append(key + " = ");
+ } else if (j == 1) {
+ value = p;
+ mOAuth2ParsedAuthorizationResponse.put(key, value);
+ sb.append(value + "\n");
+ }
+
+ Log_OC.v(TAG, "[" + i + "," + j + "] = " + p);
+ j++;
+ }
+ i++;
+ }
+ }
+
+
+ private void parseAccessTokenResult (JSONObject tokenJson) throws JSONException {
+ mResultTokenMap = new HashMap<String, String>();
+
+ if (tokenJson.has(OAuth2Constants.KEY_ACCESS_TOKEN)) {
+ mResultTokenMap.put(OAuth2Constants.KEY_ACCESS_TOKEN, tokenJson.getString(OAuth2Constants.KEY_ACCESS_TOKEN));
+ }
+ if (tokenJson.has(OAuth2Constants.KEY_TOKEN_TYPE)) {
+ mResultTokenMap.put(OAuth2Constants.KEY_TOKEN_TYPE, tokenJson.getString(OAuth2Constants.KEY_TOKEN_TYPE));
+ }
+ if (tokenJson.has(OAuth2Constants.KEY_EXPIRES_IN)) {
+ mResultTokenMap.put(OAuth2Constants.KEY_EXPIRES_IN, tokenJson.getString(OAuth2Constants.KEY_EXPIRES_IN));
+ }
+ if (tokenJson.has(OAuth2Constants.KEY_REFRESH_TOKEN)) {
+ mResultTokenMap.put(OAuth2Constants.KEY_REFRESH_TOKEN, tokenJson.getString(OAuth2Constants.KEY_REFRESH_TOKEN));
+ }
+ if (tokenJson.has(OAuth2Constants.KEY_SCOPE)) {
+ mResultTokenMap.put(OAuth2Constants.KEY_SCOPE, tokenJson.getString(OAuth2Constants.KEY_SCOPE));
+ }
+ if (tokenJson.has(OAuth2Constants.KEY_ERROR)) {
+ mResultTokenMap.put(OAuth2Constants.KEY_ERROR, tokenJson.getString(OAuth2Constants.KEY_ERROR));
+ }
+ if (tokenJson.has(OAuth2Constants.KEY_ERROR_DESCRIPTION)) {
+ mResultTokenMap.put(OAuth2Constants.KEY_ERROR_DESCRIPTION, tokenJson.getString(OAuth2Constants.KEY_ERROR_DESCRIPTION));
+ }
+ if (tokenJson.has(OAuth2Constants.KEY_ERROR_URI)) {
+ mResultTokenMap.put(OAuth2Constants.KEY_ERROR_URI, tokenJson.getString(OAuth2Constants.KEY_ERROR_URI));
+ }
+ }
+
+}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.operations;
-
-public interface OnRemoteOperationListener {
-
- void onRemoteOperationFinish(RemoteOperation caller, RemoteOperationResult result);
-
-}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.operations;
-
-public class OperationCancelledException extends Exception {
-
- /**
- * Generated serial version - to avoid Java warning
- */
- private static final long serialVersionUID = -6350981497740424983L;
-
-}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-package com.owncloud.android.operations;
-
-import android.os.Handler;
-
-import eu.alefzero.webdav.WebdavClient;
-
-/**
- * Operation which execution involves one or several interactions with an ownCloud server.
- *
- * Provides methods to execute the operation both synchronously or asynchronously.
- *
- * @author David A. Velasco
- */
-public abstract class RemoteOperation implements Runnable {
-
- /** Object to interact with the ownCloud server */
- private WebdavClient mClient = null;
-
- /** Callback object to notify about the execution of the remote operation */
- private OnRemoteOperationListener mListener = null;
-
- /** Handler to the thread where mListener methods will be called */
- private Handler mListenerHandler = null;
-
-
- /**
- * Abstract method to implement the operation in derived classes.
- */
- protected abstract RemoteOperationResult run(WebdavClient client);
-
-
- /**
- * Synchronously executes the remote operation
- *
- * @param client Client object to reach an ownCloud server during the execution of the operation.
- * @return Result of the operation.
- */
- public final RemoteOperationResult execute(WebdavClient client) {
- if (client == null)
- throw new IllegalArgumentException("Trying to execute a remote operation with a NULL WebdavClient");
- mClient = client;
- return run(client);
- }
-
-
- /**
- * Asynchronously executes the remote operation
- *
- * @param client Client object to reach an ownCloud server during the execution of the operation.
- * @param listener Listener to be notified about the execution of the operation.
- * @param listenerHandler Handler associated to the thread where the methods of the listener objects must be called.
- * @return Thread were the remote operation is executed.
- */
- public final Thread execute(WebdavClient client, OnRemoteOperationListener listener, Handler listenerHandler) {
- if (client == null) {
- throw new IllegalArgumentException("Trying to execute a remote operation with a NULL WebdavClient");
- }
- mClient = client;
-
- if (listener == null) {
- throw new IllegalArgumentException("Trying to execute a remote operation asynchronously without a listener to notiy the result");
- }
- mListener = listener;
-
- if (listenerHandler == null) {
- throw new IllegalArgumentException("Trying to execute a remote operation asynchronously without a handler to the listener's thread");
- }
- mListenerHandler = listenerHandler;
-
- Thread runnerThread = new Thread(this);
- runnerThread.start();
- return runnerThread;
- }
-
- /**
- * Synchronously retries the remote operation using the same WebdavClient in the last call to {@link RemoteOperation#execute(WebdavClient)}
- *
- * @param listener Listener to be notified about the execution of the operation.
- * @param listenerHandler Handler associated to the thread where the methods of the listener objects must be called.
- * @return Thread were the remote operation is executed.
- */
- public final RemoteOperationResult retry() {
- return execute(mClient);
- }
-
- /**
- * Asynchronously retries the remote operation using the same WebdavClient in the last call to {@link RemoteOperation#execute(WebdavClient, OnRemoteOperationListener, Handler)}
- *
- * @param listener Listener to be notified about the execution of the operation.
- * @param listenerHandler Handler associated to the thread where the methods of the listener objects must be called.
- * @return Thread were the remote operation is executed.
- */
- public final Thread retry(OnRemoteOperationListener listener, Handler listenerHandler) {
- return execute(mClient, listener, listenerHandler);
- }
-
-
- /**
- * Asynchronous execution of the operation
- * started by {@link RemoteOperation#execute(WebdavClient, OnRemoteOperationListener, Handler)},
- * and result posting.
- */
- @Override
- public final void run() {
- final RemoteOperationResult result = execute(mClient);
-
- if (mListenerHandler != null && mListener != null) {
- mListenerHandler.post(new Runnable() {
- @Override
- public void run() {
- mListener.onRemoteOperationFinish(RemoteOperation.this, result);
- }
- });
- }
- }
-
-
-}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.operations;
-
-import java.io.IOException;
-import java.io.Serializable;
-import java.net.MalformedURLException;
-import java.net.SocketException;
-import java.net.SocketTimeoutException;
-import java.net.UnknownHostException;
-
-import javax.net.ssl.SSLException;
-
-import org.apache.commons.httpclient.ConnectTimeoutException;
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.HttpStatus;
-import org.apache.jackrabbit.webdav.DavException;
-
-import android.util.Log;
-
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.network.CertificateCombinedException;
-
-/**
- * The result of a remote operation required to an ownCloud server.
- *
- * Provides a common classification of remote operation results for all the
- * application.
- *
- * @author David A. Velasco
- */
-public class RemoteOperationResult implements Serializable {
-
- /** Generated - should be refreshed every time the class changes!! */
- private static final long serialVersionUID = -7805531062432602444L;
- private static final String TAG = "RemoteOperationResult";
-
- public enum ResultCode {
- OK, OK_SSL, OK_NO_SSL, UNHANDLED_HTTP_CODE, UNAUTHORIZED, FILE_NOT_FOUND, INSTANCE_NOT_CONFIGURED, UNKNOWN_ERROR, WRONG_CONNECTION, TIMEOUT, INCORRECT_ADDRESS, HOST_NOT_AVAILABLE, NO_NETWORK_CONNECTION, SSL_ERROR, SSL_RECOVERABLE_PEER_UNVERIFIED, BAD_OC_VERSION, CANCELLED, INVALID_LOCAL_FILE_NAME, INVALID_OVERWRITE, CONFLICT, SYNC_CONFLICT, LOCAL_STORAGE_FULL, LOCAL_STORAGE_NOT_MOVED, LOCAL_STORAGE_NOT_COPIED, QUOTA_EXCEEDED
- }
-
- private boolean mSuccess = false;
- private int mHttpCode = -1;
- private Exception mException = null;
- private ResultCode mCode = ResultCode.UNKNOWN_ERROR;
-
- public RemoteOperationResult(ResultCode code) {
- mCode = code;
- mSuccess = (code == ResultCode.OK || code == ResultCode.OK_SSL || code == ResultCode.OK_NO_SSL);
- }
-
- public RemoteOperationResult(boolean success, int httpCode) {
- mSuccess = success;
- mHttpCode = httpCode;
-
- if (success) {
- mCode = ResultCode.OK;
-
- } else if (httpCode > 0) {
- switch (httpCode) {
- case HttpStatus.SC_UNAUTHORIZED:
- mCode = ResultCode.UNAUTHORIZED;
- break;
- case HttpStatus.SC_NOT_FOUND:
- mCode = ResultCode.FILE_NOT_FOUND;
- break;
- case HttpStatus.SC_INTERNAL_SERVER_ERROR:
- mCode = ResultCode.INSTANCE_NOT_CONFIGURED;
- break;
- case HttpStatus.SC_CONFLICT:
- mCode = ResultCode.CONFLICT;
- break;
- case HttpStatus.SC_INSUFFICIENT_STORAGE:
- mCode = ResultCode.QUOTA_EXCEEDED;
- break;
- default:
- mCode = ResultCode.UNHANDLED_HTTP_CODE;
- Log_OC.d(TAG, "RemoteOperationResult has prcessed UNHANDLED_HTTP_CODE: " + httpCode);
- }
- }
- }
-
- public RemoteOperationResult(Exception e) {
- mException = e;
-
- if (e instanceof OperationCancelledException) {
- mCode = ResultCode.CANCELLED;
-
- } else if (e instanceof SocketException) {
- mCode = ResultCode.WRONG_CONNECTION;
-
- } else if (e instanceof SocketTimeoutException) {
- mCode = ResultCode.TIMEOUT;
-
- } else if (e instanceof ConnectTimeoutException) {
- mCode = ResultCode.TIMEOUT;
-
- } else if (e instanceof MalformedURLException) {
- mCode = ResultCode.INCORRECT_ADDRESS;
-
- } else if (e instanceof UnknownHostException) {
- mCode = ResultCode.HOST_NOT_AVAILABLE;
-
- } else if (e instanceof SSLException || e instanceof RuntimeException) {
- CertificateCombinedException se = getCertificateCombinedException(e);
- if (se != null) {
- mException = se;
- if (se.isRecoverable()) {
- mCode = ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED;
- }
- } else if (e instanceof RuntimeException) {
- mCode = ResultCode.HOST_NOT_AVAILABLE;
-
- } else {
- mCode = ResultCode.SSL_ERROR;
- }
-
- } else {
- mCode = ResultCode.UNKNOWN_ERROR;
- }
-
- }
-
- public boolean isSuccess() {
- return mSuccess;
- }
-
- public boolean isCancelled() {
- return mCode == ResultCode.CANCELLED;
- }
-
- public int getHttpCode() {
- return mHttpCode;
- }
-
- public ResultCode getCode() {
- return mCode;
- }
-
- public Exception getException() {
- return mException;
- }
-
- public boolean isSslRecoverableException() {
- return mCode == ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED;
- }
-
- private CertificateCombinedException getCertificateCombinedException(Exception e) {
- CertificateCombinedException result = null;
- if (e instanceof CertificateCombinedException) {
- return (CertificateCombinedException) e;
- }
- Throwable cause = mException.getCause();
- Throwable previousCause = null;
- while (cause != null && cause != previousCause && !(cause instanceof CertificateCombinedException)) {
- previousCause = cause;
- cause = cause.getCause();
- }
- if (cause != null && cause instanceof CertificateCombinedException) {
- result = (CertificateCombinedException) cause;
- }
- return result;
- }
-
- public String getLogMessage() {
-
- if (mException != null) {
- if (mException instanceof OperationCancelledException) {
- return "Operation cancelled by the caller";
-
- } else if (mException instanceof SocketException) {
- return "Socket exception";
-
- } else if (mException instanceof SocketTimeoutException) {
- return "Socket timeout exception";
-
- } else if (mException instanceof ConnectTimeoutException) {
- return "Connect timeout exception";
-
- } else if (mException instanceof MalformedURLException) {
- return "Malformed URL exception";
-
- } else if (mException instanceof UnknownHostException) {
- return "Unknown host exception";
-
- } else if (mException instanceof CertificateCombinedException) {
- if (((CertificateCombinedException) mException).isRecoverable())
- return "SSL recoverable exception";
- else
- return "SSL exception";
-
- } else if (mException instanceof SSLException) {
- return "SSL exception";
-
- } else if (mException instanceof DavException) {
- return "Unexpected WebDAV exception";
-
- } else if (mException instanceof HttpException) {
- return "HTTP violation";
-
- } else if (mException instanceof IOException) {
- return "Unrecovered transport exception";
-
- } else {
- return "Unexpected exception";
- }
- }
-
- if (mCode == ResultCode.INSTANCE_NOT_CONFIGURED) {
- return "The ownCloud server is not configured!";
-
- } else if (mCode == ResultCode.NO_NETWORK_CONNECTION) {
- return "No network connection";
-
- } else if (mCode == ResultCode.BAD_OC_VERSION) {
- return "No valid ownCloud version was found at the server";
-
- } else if (mCode == ResultCode.LOCAL_STORAGE_FULL) {
- return "Local storage full";
-
- } else if (mCode == ResultCode.LOCAL_STORAGE_NOT_MOVED) {
- return "Error while moving file to final directory";
- }
-
- return "Operation finished with HTTP status code " + mHttpCode + " (" + (isSuccess() ? "success" : "fail") + ")";
-
- }
-
-}
package com.owncloud.android.operations;
-import org.apache.commons.httpclient.HttpStatus;
-import org.apache.jackrabbit.webdav.client.methods.DeleteMethod;
-
-import android.util.Log;
-
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.datamodel.DataStorageManager;
+import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.lib.resources.files.RemoveRemoteFileOperation;
-import eu.alefzero.webdav.WebdavClient;
-import eu.alefzero.webdav.WebdavUtils;
/**
* Remote operation performing the removal of a remote file or folder in the ownCloud server.
*/
public class RemoveFileOperation extends RemoteOperation {
- private static final String TAG = RemoveFileOperation.class.getSimpleName();
-
- private static final int REMOVE_READ_TIMEOUT = 10000;
- private static final int REMOVE_CONNECTION_TIMEOUT = 5000;
+ // private static final String TAG = RemoveFileOperation.class.getSimpleName();
OCFile mFileToRemove;
boolean mDeleteLocalCopy;
- DataStorageManager mDataStorageManager;
+ FileDataStorageManager mDataStorageManager;
/**
* @param deleteLocalCopy When 'true', and a local copy of the file exists, it is also removed.
* @param storageManager Reference to the local database corresponding to the account where the file is contained.
*/
- public RemoveFileOperation(OCFile fileToRemove, boolean deleteLocalCopy, DataStorageManager storageManager) {
+ public RemoveFileOperation(OCFile fileToRemove, boolean deleteLocalCopy, FileDataStorageManager storageManager) {
mFileToRemove = fileToRemove;
mDeleteLocalCopy = deleteLocalCopy;
mDataStorageManager = storageManager;
return mFileToRemove;
}
-
/**
* Performs the remove operation
*
* @param client Client object to communicate with the remote ownCloud server.
*/
@Override
- protected RemoteOperationResult run(WebdavClient client) {
+ protected RemoteOperationResult run(OwnCloudClient client) {
RemoteOperationResult result = null;
- DeleteMethod delete = null;
- try {
- delete = new DeleteMethod(client.getBaseUri() + WebdavUtils.encodePath(mFileToRemove.getRemotePath()));
- int status = client.executeMethod(delete, REMOVE_READ_TIMEOUT, REMOVE_CONNECTION_TIMEOUT);
- if (delete.succeeded() || status == HttpStatus.SC_NOT_FOUND) {
- if (mFileToRemove.isDirectory()) {
- mDataStorageManager.removeDirectory(mFileToRemove, true, mDeleteLocalCopy);
- } else {
- mDataStorageManager.removeFile(mFileToRemove, mDeleteLocalCopy);
- }
- }
- delete.getResponseBodyAsString(); // exhaust the response, although not interesting
- result = new RemoteOperationResult((delete.succeeded() || status == HttpStatus.SC_NOT_FOUND), status);
- Log_OC.i(TAG, "Remove " + mFileToRemove.getRemotePath() + ": " + result.getLogMessage());
-
- } catch (Exception e) {
- result = new RemoteOperationResult(e);
- Log_OC.e(TAG, "Remove " + mFileToRemove.getRemotePath() + ": " + result.getLogMessage(), e);
-
- } finally {
- if (delete != null)
- delete.releaseConnection();
+
+ RemoveRemoteFileOperation operation = new RemoveRemoteFileOperation(mFileToRemove.getRemotePath());
+ result = operation.execute(client);
+
+ if (result.isSuccess() || result.getCode() == ResultCode.FILE_NOT_FOUND) {
+ mDataStorageManager.removeFile(mFileToRemove, true, mDeleteLocalCopy);
}
+
return result;
}
import java.io.File;
import java.io.IOException;
-import org.apache.jackrabbit.webdav.client.methods.DavMethodBase;
-//import org.apache.jackrabbit.webdav.client.methods.MoveMethod;
-
-import android.accounts.Account;
-import android.util.Log;
-
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.datamodel.DataStorageManager;
+import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.lib.resources.files.RenameRemoteFileOperation;
import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.Log_OC;
+
+import android.accounts.Account;
-import eu.alefzero.webdav.WebdavClient;
-import eu.alefzero.webdav.WebdavUtils;
/**
* Remote operation performing the rename of a remote file (or folder?) in the ownCloud server.
*/
public class RenameFileOperation extends RemoteOperation {
- private static final String TAG = RemoveFileOperation.class.getSimpleName();
-
- private static final int RENAME_READ_TIMEOUT = 10000;
- private static final int RENAME_CONNECTION_TIMEOUT = 5000;
+ private static final String TAG = RenameFileOperation.class.getSimpleName();
private OCFile mFile;
private Account mAccount;
private String mNewName;
private String mNewRemotePath;
- private DataStorageManager mStorageManager;
+ private FileDataStorageManager mStorageManager;
/**
* @param newName New name to set as the name of file.
* @param storageManager Reference to the local database corresponding to the account where the file is contained.
*/
- public RenameFileOperation(OCFile file, Account account, String newName, DataStorageManager storageManager) {
+ public RenameFileOperation(OCFile file, Account account, String newName, FileDataStorageManager storageManager) {
mFile = file;
mAccount = account;
mNewName = newName;
* @param client Client object to communicate with the remote ownCloud server.
*/
@Override
- protected RemoteOperationResult run(WebdavClient client) {
+ protected RemoteOperationResult run(OwnCloudClient client) {
RemoteOperationResult result = null;
- LocalMoveMethod move = null;
- mNewRemotePath = null;
+ // check if the new name is valid in the local file system
try {
- if (mNewName.equals(mFile.getFileName())) {
- return new RemoteOperationResult(ResultCode.OK);
+ if (!isValidNewName()) {
+ return new RemoteOperationResult(ResultCode.INVALID_LOCAL_FILE_NAME);
}
-
String parent = (new File(mFile.getRemotePath())).getParent();
parent = (parent.endsWith(OCFile.PATH_SEPARATOR)) ? parent : parent + OCFile.PATH_SEPARATOR;
mNewRemotePath = parent + mNewName;
- if (mFile.isDirectory()) {
+ if (mFile.isFolder()) {
mNewRemotePath += OCFile.PATH_SEPARATOR;
}
-
- // check if the new name is valid in the local file system
- if (!isValidNewName()) {
- return new RemoteOperationResult(ResultCode.INVALID_LOCAL_FILE_NAME);
- }
-
- // check if a file with the new name already exists
- if (client.existsFile(mNewRemotePath) || // remote check could fail by network failure. by indeterminate behavior of HEAD for folders ...
- mStorageManager.getFileByPath(mNewRemotePath) != null) { // ... so local check is convenient
+
+ // ckeck local overwrite
+ if (mStorageManager.getFileByPath(mNewRemotePath) != null) {
return new RemoteOperationResult(ResultCode.INVALID_OVERWRITE);
}
- move = new LocalMoveMethod( client.getBaseUri() + WebdavUtils.encodePath(mFile.getRemotePath()),
- client.getBaseUri() + WebdavUtils.encodePath(mNewRemotePath));
- int status = client.executeMethod(move, RENAME_READ_TIMEOUT, RENAME_CONNECTION_TIMEOUT);
- if (move.succeeded()) {
+
+ RenameRemoteFileOperation operation = new RenameRemoteFileOperation(mFile.getFileName(), mFile.getRemotePath(),
+ mNewName, mFile.isFolder());
+ result = operation.execute(client);
- if (mFile.isDirectory()) {
+ if (result.isSuccess()) {
+ if (mFile.isFolder()) {
saveLocalDirectory();
-
+
} else {
saveLocalFile();
-
}
-
- /*
- *} else if (mFile.isDirectory() && (status == 207 || status >= 500)) {
- * // TODO
- * // if server fails in the rename of a folder, some children files could have been moved to a folder with the new name while some others
- * // stayed in the old folder;
- * //
- * // easiest and heaviest solution is synchronizing the parent folder (or the full account);
- * //
- * // a better solution is synchronizing the folders with the old and new names;
- *}
- */
-
}
- move.getResponseBodyAsString(); // exhaust response, although not interesting
- result = new RemoteOperationResult(move.succeeded(), status);
- Log_OC.i(TAG, "Rename " + mFile.getRemotePath() + " to " + mNewRemotePath + ": " + result.getLogMessage());
-
- } catch (Exception e) {
- result = new RemoteOperationResult(e);
- Log_OC.e(TAG, "Rename " + mFile.getRemotePath() + " to " + ((mNewRemotePath==null) ? mNewName : mNewRemotePath) + ": " + result.getLogMessage(), e);
-
- } finally {
- if (move != null)
- move.releaseConnection();
+ } catch (IOException e) {
+ Log_OC.e(TAG, "Rename " + mFile.getRemotePath() + " to " + ((mNewRemotePath==null) ? mNewName : mNewRemotePath) + ": " +
+ ((result!= null) ? result.getLogMessage() : ""), e);
}
+
return result;
}
private void saveLocalDirectory() {
- mStorageManager.moveDirectory(mFile, mNewRemotePath);
+ mStorageManager.moveFolder(mFile, mNewRemotePath);
String localPath = FileStorageUtils.getDefaultSavePathFor(mAccount.name, mFile);
File localDir = new File(localPath);
if (localDir.exists()) {
*
* TODO move this method, and maybe FileDownload.get***Path(), to a class with utilities specific for the interactions with the file system
*
- * @return 'True' if a temporal file named with the name to set could be created in the file system where
- * local files are stored.
+ * @return 'True' if a temporal file named with the name to set could be created in the file system where
+ * local files are stored.
+ * @throws IOException When the temporal folder can not be created.
*/
- private boolean isValidNewName() {
+ private boolean isValidNewName() throws IOException {
// check tricky names
if (mNewName == null || mNewName.length() <= 0 || mNewName.contains(File.separator) || mNewName.contains("%")) {
return false;
}
// create a test file
- String tmpFolder = FileStorageUtils.getTemporalPath("");
- File testFile = new File(tmpFolder + mNewName);
+ String tmpFolderName = FileStorageUtils.getTemporalPath("");
+ File testFile = new File(tmpFolderName + mNewName);
+ File tmpFolder = testFile.getParentFile();
+ tmpFolder.mkdirs();
+ if (!tmpFolder.isDirectory()) {
+ throw new IOException("Unexpected error: temporal directory could not be created");
+ }
try {
testFile.createNewFile(); // return value is ignored; it could be 'false' because the file already existed, that doesn't invalidate the name
} catch (IOException e) {
return result;
}
-
- // move operation
- private class LocalMoveMethod extends DavMethodBase {
-
- public LocalMoveMethod(String uri, String dest) {
- super(uri);
- addRequestHeader(new org.apache.commons.httpclient.Header("Destination", dest));
- }
-
- @Override
- public String getName() {
- return "MOVE";
- }
-
- @Override
- protected boolean isSuccess(int status) {
- return status == 201 || status == 204;
- }
-
- }
-
-
}
package com.owncloud.android.operations;
-import org.apache.http.HttpStatus;
-import org.apache.jackrabbit.webdav.MultiStatus;
-import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;
+import com.owncloud.android.datamodel.FileDataStorageManager;
+import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.files.services.FileDownloader;
+import com.owncloud.android.files.services.FileUploader;
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.lib.resources.files.RemoteFile;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.lib.resources.files.ReadRemoteFileOperation;
+import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.Log_OC;
import android.accounts.Account;
import android.content.Context;
import android.content.Intent;
-import android.util.Log;
-
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.datamodel.DataStorageManager;
-import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.files.services.FileDownloader;
-import com.owncloud.android.files.services.FileUploader;
-import com.owncloud.android.operations.RemoteOperationResult.ResultCode;
-import eu.alefzero.webdav.WebdavClient;
-import eu.alefzero.webdav.WebdavEntry;
-import eu.alefzero.webdav.WebdavUtils;
+/**
+ * Remote operation performing the read of remote file in the ownCloud server.
+ *
+ * @author David A. Velasco
+ * @author masensio
+ */
public class SynchronizeFileOperation extends RemoteOperation {
private String TAG = SynchronizeFileOperation.class.getSimpleName();
- private static final int SYNC_READ_TIMEOUT = 10000;
- private static final int SYNC_CONNECTION_TIMEOUT = 5000;
private OCFile mLocalFile;
private OCFile mServerFile;
- private DataStorageManager mStorageManager;
+ private FileDataStorageManager mStorageManager;
private Account mAccount;
private boolean mSyncFileContents;
- private boolean mLocalChangeAlreadyKnown;
private Context mContext;
private boolean mTransferWasRequested = false;
public SynchronizeFileOperation(
OCFile localFile,
OCFile serverFile, // make this null to let the operation checks the server; added to reuse info from SynchronizeFolderOperation
- DataStorageManager storageManager,
+ FileDataStorageManager storageManager,
Account account,
boolean syncFileContents,
- boolean localChangeAlreadyKnown,
Context context) {
mLocalFile = localFile;
mStorageManager = storageManager;
mAccount = account;
mSyncFileContents = syncFileContents;
- mLocalChangeAlreadyKnown = localChangeAlreadyKnown;
mContext = context;
}
@Override
- protected RemoteOperationResult run(WebdavClient client) {
-
- PropFindMethod propfind = null;
+ protected RemoteOperationResult run(OwnCloudClient client) {
+
RemoteOperationResult result = null;
mTransferWasRequested = false;
- try {
- if (!mLocalFile.isDown()) {
- /// easy decision
- requestForDownload(mLocalFile);
- result = new RemoteOperationResult(ResultCode.OK);
-
- } else {
- /// local copy in the device -> need to think a bit more before do anything
-
- if (mServerFile == null) {
- /// take the duty of check the server for the current state of the file there
- propfind = new PropFindMethod(client.getBaseUri() + WebdavUtils.encodePath(mLocalFile.getRemotePath()));
- int status = client.executeMethod(propfind, SYNC_READ_TIMEOUT, SYNC_CONNECTION_TIMEOUT);
- boolean isMultiStatus = status == HttpStatus.SC_MULTI_STATUS;
- if (isMultiStatus) {
- MultiStatus resp = propfind.getResponseBodyAsMultiStatus();
- WebdavEntry we = new WebdavEntry(resp.getResponses()[0],
- client.getBaseUri().getPath());
- mServerFile = fillOCFile(we);
- mServerFile.setLastSyncDateForProperties(System.currentTimeMillis());
-
- } else {
- client.exhaustResponse(propfind.getResponseBodyAsStream());
- result = new RemoteOperationResult(false, status);
- }
+ if (!mLocalFile.isDown()) {
+ /// easy decision
+ requestForDownload(mLocalFile);
+ result = new RemoteOperationResult(ResultCode.OK);
+
+ } else {
+ /// local copy in the device -> need to think a bit more before do anything
+
+ if (mServerFile == null) {
+ String remotePath = mLocalFile.getRemotePath();
+ ReadRemoteFileOperation operation = new ReadRemoteFileOperation(remotePath);
+ result = operation.execute(client);
+ if (result.isSuccess()){
+ mServerFile = FileStorageUtils.fillOCFile((RemoteFile) result.getData().get(0));
+ mServerFile.setLastSyncDateForProperties(System.currentTimeMillis());
}
-
- if (result == null) { // true if the server was not checked. nothing was wrong with the remote request
-
- /// check changes in server and local file
- boolean serverChanged = false;
+ }
+
+ if (mServerFile != null) {
+
+ /// check changes in server and local file
+ boolean serverChanged = false;
+ /* time for eTag is coming, but not yet
if (mServerFile.getEtag() != null) {
serverChanged = (!mServerFile.getEtag().equals(mLocalFile.getEtag())); // TODO could this be dangerous when the user upgrades the server from non-tagged to tagged?
+ } else { */
+ // server without etags
+ serverChanged = (mServerFile.getModificationTimestamp() != mLocalFile.getModificationTimestampAtLastSyncForData());
+ //}
+ boolean localChanged = (mLocalFile.getLocalModificationTimestamp() > mLocalFile.getLastSyncDateForData());
+ // TODO this will be always true after the app is upgraded to database version 2; will result in unnecessary uploads
+
+ /// decide action to perform depending upon changes
+ //if (!mLocalFile.getEtag().isEmpty() && localChanged && serverChanged) {
+ if (localChanged && serverChanged) {
+ result = new RemoteOperationResult(ResultCode.SYNC_CONFLICT);
+
+ } else if (localChanged) {
+ if (mSyncFileContents) {
+ requestForUpload(mLocalFile);
+ // the local update of file properties will be done by the FileUploader service when the upload finishes
} else {
- // server without etags
- serverChanged = (mServerFile.getModificationTimestamp() > mLocalFile.getModificationTimestampAtLastSyncForData());
+ // NOTHING TO DO HERE: updating the properties of the file in the server without uploading the contents would be stupid;
+ // So, an instance of SynchronizeFileOperation created with syncFileContents == false is completely useless when we suspect
+ // that an upload is necessary (for instance, in FileObserverService).
}
- boolean localChanged = (mLocalChangeAlreadyKnown || mLocalFile.getLocalModificationTimestamp() > mLocalFile.getLastSyncDateForData());
- // TODO this will be always true after the app is upgraded to database version 2; will result in unnecessary uploads
-
- /// decide action to perform depending upon changes
- if (localChanged && serverChanged) {
- result = new RemoteOperationResult(ResultCode.SYNC_CONFLICT);
-
- } else if (localChanged) {
- if (mSyncFileContents) {
- requestForUpload(mLocalFile);
- // the local update of file properties will be done by the FileUploader service when the upload finishes
- } else {
- // NOTHING TO DO HERE: updating the properties of the file in the server without uploading the contents would be stupid;
- // So, an instance of SynchronizeFileOperation created with syncFileContents == false is completely useless when we suspect
- // that an upload is necessary (for instance, in FileObserverService).
- }
- result = new RemoteOperationResult(ResultCode.OK);
-
- } else if (serverChanged) {
- if (mSyncFileContents) {
- requestForDownload(mLocalFile); // local, not server; we won't to keep the value of keepInSync!
- // the update of local data will be done later by the FileUploader service when the upload finishes
- } else {
- // TODO CHECK: is this really useful in some point in the code?
- mServerFile.setKeepInSync(mLocalFile.keepInSync());
- mServerFile.setLastSyncDateForData(mLocalFile.getLastSyncDateForData());
- mServerFile.setStoragePath(mLocalFile.getStoragePath());
- mServerFile.setParentId(mLocalFile.getParentId());
- mStorageManager.saveFile(mServerFile);
-
- }
- result = new RemoteOperationResult(ResultCode.OK);
-
+ result = new RemoteOperationResult(ResultCode.OK);
+
+ } else if (serverChanged) {
+ if (mSyncFileContents) {
+ requestForDownload(mLocalFile); // local, not server; we won't to keep the value of keepInSync!
+ // the update of local data will be done later by the FileUploader service when the upload finishes
} else {
- // nothing changed, nothing to do
- result = new RemoteOperationResult(ResultCode.OK);
+ // TODO CHECK: is this really useful in some point in the code?
+ mServerFile.setKeepInSync(mLocalFile.keepInSync());
+ mServerFile.setLastSyncDateForData(mLocalFile.getLastSyncDateForData());
+ mServerFile.setStoragePath(mLocalFile.getStoragePath());
+ mServerFile.setParentId(mLocalFile.getParentId());
+ mStorageManager.saveFile(mServerFile);
+
}
-
- }
-
- }
-
- Log_OC.i(TAG, "Synchronizing " + mAccount.name + ", file " + mLocalFile.getRemotePath() + ": " + result.getLogMessage());
-
- } catch (Exception e) {
- result = new RemoteOperationResult(e);
- Log_OC.e(TAG, "Synchronizing " + mAccount.name + ", file " + (mLocalFile != null ? mLocalFile.getRemotePath() : "NULL") + ": " + result.getLogMessage(), result.getException());
-
- } finally {
- if (propfind != null)
- propfind.releaseConnection();
+ result = new RemoteOperationResult(ResultCode.OK);
+
+ } else {
+ // nothing changed, nothing to do
+ result = new RemoteOperationResult(ResultCode.OK);
+ }
+
+ }
+
}
+
+ Log_OC.i(TAG, "Synchronizing " + mAccount.name + ", file " + mLocalFile.getRemotePath() + ": " + result.getLogMessage());
+
return result;
}
}
- /**
- * Creates and populates a new {@link OCFile} object with the data read from the server.
- *
- * @param we WebDAV entry read from the server for a WebDAV resource (remote file or folder).
- * @return New OCFile instance representing the remote resource described by we.
- */
- private OCFile fillOCFile(WebdavEntry we) {
- OCFile file = new OCFile(we.decodedPath());
- file.setCreationTimestamp(we.createTimestamp());
- file.setFileLength(we.contentLength());
- file.setMimetype(we.contentType());
- file.setModificationTimestamp(we.modifiedTimestamp());
- return file;
- }
-
-
public boolean transferWasRequested() {
return mTransferWasRequested;
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.apache.http.HttpStatus;
-import org.apache.jackrabbit.webdav.MultiStatus;
-import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;
-
import android.accounts.Account;
import android.content.Context;
-import android.util.Log;
+import android.content.Intent;
+//import android.support.v4.content.LocalBroadcastManager;
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.datamodel.DataStorageManager;
+import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.operations.RemoteOperationResult.ResultCode;
+
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.lib.resources.shares.OCShare;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.lib.resources.shares.GetRemoteSharesForFileOperation;
+import com.owncloud.android.lib.resources.files.FileUtils;
+import com.owncloud.android.lib.resources.files.ReadRemoteFileOperation;
+import com.owncloud.android.lib.resources.files.ReadRemoteFolderOperation;
+import com.owncloud.android.lib.resources.files.RemoteFile;
+
+import com.owncloud.android.syncadapter.FileSyncAdapter;
import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.Log_OC;
-import eu.alefzero.webdav.WebdavClient;
-import eu.alefzero.webdav.WebdavEntry;
-import eu.alefzero.webdav.WebdavUtils;
/**
- * Remote operation performing the synchronization a the contents of a remote folder with the local database
+ * Remote operation performing the synchronization of the list of files contained
+ * in a folder identified with its remote path.
+ *
+ * Fetches the list and properties of the files contained in the given folder, including their
+ * properties, and updates the local database with them.
+ *
+ * Does NOT enter in the child folders to synchronize their contents also.
*
- * @author David A. Velasco
+ * @author David A. Velasco
*/
public class SynchronizeFolderOperation extends RemoteOperation {
private static final String TAG = SynchronizeFolderOperation.class.getSimpleName();
- /** Remote folder to synchronize */
- private String mRemotePath;
+ public static final String EVENT_SINGLE_FOLDER_CONTENTS_SYNCED = SynchronizeFolderOperation.class.getName() + ".EVENT_SINGLE_FOLDER_CONTENTS_SYNCED";
+ public static final String EVENT_SINGLE_FOLDER_SHARES_SYNCED = SynchronizeFolderOperation.class.getName() + ".EVENT_SINGLE_FOLDER_SHARES_SYNCED";
- /** Timestamp for the synchronization in progress */
+ /** Time stamp for the synchronization process in progress */
private long mCurrentSyncTime;
- /** Id of the folder to synchronize in the local database */
- private long mParentId;
+ /** Remote folder to synchronize */
+ private OCFile mLocalFolder;
/** Access to the local database */
- private DataStorageManager mStorageManager;
+ private FileDataStorageManager mStorageManager;
/** Account where the file to synchronize belongs */
private Account mAccount;
- /** Android context; necessary to send requests to the download service; maybe something to refactor */
+ /** Android context; necessary to send requests to the download service */
private Context mContext;
- /** Files and folders contained in the synchronized folder */
+ /** Files and folders contained in the synchronized folder after a successful operation */
private List<OCFile> mChildren;
+ /** Counter of conflicts found between local and remote files */
private int mConflictsFound;
+ /** Counter of failed operations in synchronization of kept-in-sync files */
private int mFailsInFavouritesFound;
+ /** Map of remote and local paths to files that where locally stored in a location out of the ownCloud folder and couldn't be copied automatically into it */
private Map<String, String> mForgottenLocalFiles;
+
+ /** 'True' means that this operation is part of a full account synchronization */
+ private boolean mSyncFullAccount;
+
+ /** 'True' means that Share resources bound to the files into the folder should be refreshed also */
+ private boolean mIsShareSupported;
+ /** 'True' means that the remote folder changed from last synchronization and should be fetched */
+ private boolean mRemoteFolderChanged;
+
- public SynchronizeFolderOperation( String remotePath,
+ /**
+ * Creates a new instance of {@link SynchronizeFolderOperation}.
+ *
+ * @param remoteFolderPath Remote folder to synchronize.
+ * @param currentSyncTime Time stamp for the synchronization process in progress.
+ * @param localFolderId Identifier in the local database of the folder to synchronize.
+ * @param updateFolderProperties 'True' means that the properties of the folder should be updated also, not just its content.
+ * @param syncFullAccount 'True' means that this operation is part of a full account synchronization.
+ * @param dataStorageManager Interface with the local database.
+ * @param account ownCloud account where the folder is located.
+ * @param context Application context.
+ */
+ public SynchronizeFolderOperation( OCFile folder,
long currentSyncTime,
- long parentId,
- DataStorageManager dataStorageManager,
+ boolean syncFullAccount,
+ boolean isShareSupported,
+ FileDataStorageManager dataStorageManager,
Account account,
Context context ) {
- mRemotePath = remotePath;
+ mLocalFolder = folder;
mCurrentSyncTime = currentSyncTime;
- mParentId = parentId;
+ mSyncFullAccount = syncFullAccount;
+ mIsShareSupported = isShareSupported;
mStorageManager = dataStorageManager;
mAccount = account;
mContext = context;
mForgottenLocalFiles = new HashMap<String, String>();
+ mRemoteFolderChanged = false;
}
/**
* Returns the list of files and folders contained in the synchronized folder, if called after synchronization is complete.
*
- * @return List of files and folders contained in the synchronized folder.
+ * @return List of files and folders contained in the synchronized folder.
*/
public List<OCFile> getChildren() {
return mChildren;
}
-
+ /**
+ * Performs the synchronization.
+ *
+ * {@inheritDoc}
+ */
@Override
- protected RemoteOperationResult run(WebdavClient client) {
+ protected RemoteOperationResult run(OwnCloudClient client) {
RemoteOperationResult result = null;
mFailsInFavouritesFound = 0;
mConflictsFound = 0;
mForgottenLocalFiles.clear();
- // code before in FileSyncAdapter.fetchData
- PropFindMethod query = null;
- try {
- Log_OC.d(TAG, "Synchronizing " + mAccount.name + ", fetching files in " + mRemotePath);
-
- // remote request
- query = new PropFindMethod(client.getBaseUri() + WebdavUtils.encodePath(mRemotePath));
- int status = client.executeMethod(query);
+ if (FileUtils.PATH_SEPARATOR.equals(mLocalFolder.getRemotePath()) && !mSyncFullAccount) {
+ updateOCVersion(client);
+ }
+
+ result = checkForChanges(client);
+
+ if (result.isSuccess()) {
+ if (mRemoteFolderChanged) {
+ result = fetchAndSyncRemoteFolder(client);
+ } else {
+ mChildren = mStorageManager.getFolderContent(mLocalFolder);
+ }
+ }
+
+ if (!mSyncFullAccount) {
+ sendLocalBroadcast(EVENT_SINGLE_FOLDER_CONTENTS_SYNCED, mLocalFolder.getRemotePath(), result);
+ }
+
+ if (result.isSuccess() && mIsShareSupported && !mSyncFullAccount) {
+ refreshSharesForFolder(client); // share result is ignored
+ }
+
+ if (!mSyncFullAccount) {
+ sendLocalBroadcast(EVENT_SINGLE_FOLDER_SHARES_SYNCED, mLocalFolder.getRemotePath(), result);
+ }
+
+ return result;
+
+ }
+
+
+ private void updateOCVersion(OwnCloudClient client) {
+ UpdateOCVersionOperation update = new UpdateOCVersionOperation(mAccount, mContext);
+ RemoteOperationResult result = update.execute(client);
+ if (result.isSuccess()) {
+ mIsShareSupported = update.getOCVersion().isSharedSupported();
+ }
+ }
+
+
+ private RemoteOperationResult checkForChanges(OwnCloudClient client) {
+ mRemoteFolderChanged = false;
+ RemoteOperationResult result = null;
+ String remotePath = null;
+
+ remotePath = mLocalFolder.getRemotePath();
+ Log_OC.d(TAG, "Checking changes in " + mAccount.name + remotePath);
+
+ // remote request
+ ReadRemoteFileOperation operation = new ReadRemoteFileOperation(remotePath);
+ result = operation.execute(client);
+ if (result.isSuccess()){
+ OCFile remoteFolder = FileStorageUtils.fillOCFile((RemoteFile) result.getData().get(0));
- // check and process response - /// TODO take into account all the possible status per child-resource
- if (isMultiStatus(status)) {
- MultiStatus resp = query.getResponseBodyAsMultiStatus();
+ // check if remote and local folder are different
+ mRemoteFolderChanged = !(remoteFolder.getEtag().equalsIgnoreCase(mLocalFolder.getEtag()));
+
+ result = new RemoteOperationResult(ResultCode.OK);
+
+ Log_OC.i(TAG, "Checked " + mAccount.name + remotePath + " : " + (mRemoteFolderChanged ? "changed" : "not changed"));
- // synchronize properties of the parent folder, if necessary
- if (mParentId == DataStorageManager.ROOT_PARENT_ID) {
- WebdavEntry we = new WebdavEntry(resp.getResponses()[0], client.getBaseUri().getPath());
- OCFile parent = fillOCFile(we);
- mStorageManager.saveFile(parent);
- mParentId = parent.getFileId();
- }
-
- // read contents in folder
- List<OCFile> updatedFiles = new Vector<OCFile>(resp.getResponses().length - 1);
- List<SynchronizeFileOperation> filesToSyncContents = new Vector<SynchronizeFileOperation>();
- for (int i = 1; i < resp.getResponses().length; ++i) {
- /// new OCFile instance with the data from the server
- WebdavEntry we = new WebdavEntry(resp.getResponses()[i], client.getBaseUri().getPath());
- OCFile file = fillOCFile(we);
-
- /// set data about local state, keeping unchanged former data if existing
- file.setLastSyncDateForProperties(mCurrentSyncTime);
- OCFile oldFile = mStorageManager.getFileByPath(file.getRemotePath());
- if (oldFile != null) {
- file.setKeepInSync(oldFile.keepInSync());
- file.setLastSyncDateForData(oldFile.getLastSyncDateForData());
- file.setModificationTimestampAtLastSyncForData(oldFile.getModificationTimestampAtLastSyncForData()); // must be kept unchanged when the file contents are not updated
- checkAndFixForeignStoragePath(oldFile);
- file.setStoragePath(oldFile.getStoragePath());
- }
+ } else {
+ // check failed
+ if (result.getCode() == ResultCode.FILE_NOT_FOUND) {
+ removeLocalFolder();
+ }
+ if (result.isException()) {
+ Log_OC.e(TAG, "Checked " + mAccount.name + remotePath + " : " + result.getLogMessage(), result.getException());
+ } else {
+ Log_OC.e(TAG, "Checked " + mAccount.name + remotePath + " : " + result.getLogMessage());
+ }
+ }
+
+ return result;
+ }
- /// scan default location if local copy of file is not linked in OCFile instance
- if (file.getStoragePath() == null && !file.isDirectory()) {
- File f = new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, file));
- if (f.exists()) {
- file.setStoragePath(f.getAbsolutePath());
- file.setLastSyncDateForData(f.lastModified());
- }
- }
-
- /// prepare content synchronization for kept-in-sync files
- if (file.keepInSync()) {
- SynchronizeFileOperation operation = new SynchronizeFileOperation( oldFile,
- file,
- mStorageManager,
- mAccount,
- true,
- false,
- mContext
- );
- filesToSyncContents.add(operation);
- }
-
- updatedFiles.add(file);
- }
-
- // save updated contents in local database; all at once, trying to get a best performance in database update (not a big deal, indeed)
- mStorageManager.saveFiles(updatedFiles);
-
- // request for the synchronization of files AFTER saving last properties
- SynchronizeFileOperation op = null;
- RemoteOperationResult contentsResult = null;
- for (int i=0; i < filesToSyncContents.size(); i++) {
- op = filesToSyncContents.get(i);
- contentsResult = op.execute(client); // returns without waiting for upload or download finishes
- if (!contentsResult.isSuccess()) {
- if (contentsResult.getCode() == ResultCode.SYNC_CONFLICT) {
- mConflictsFound++;
- } else {
- mFailsInFavouritesFound++;
- if (contentsResult.getException() != null) {
- Log_OC.d(TAG, "Error while synchronizing favourites : " + contentsResult.getLogMessage(), contentsResult.getException());
- } else {
- Log_OC.d(TAG, "Error while synchronizing favourites : " + contentsResult.getLogMessage());
- }
- }
- } // won't let these fails break the synchronization process
- }
-
- // removal of obsolete files
- mChildren = mStorageManager.getDirectoryContent(mStorageManager.getFileById(mParentId));
- OCFile file;
- String currentSavePath = FileStorageUtils.getSavePath(mAccount.name);
- for (int i=0; i < mChildren.size(); ) {
- file = mChildren.get(i);
- if (file.getLastSyncDateForProperties() != mCurrentSyncTime) {
- Log_OC.d(TAG, "removing file: " + file);
- mStorageManager.removeFile(file, (file.isDown() && file.getStoragePath().startsWith(currentSavePath)));
- mChildren.remove(i);
- } else {
- i++;
- }
- }
-
- } else {
- client.exhaustResponse(query.getResponseBodyAsStream());
+ private RemoteOperationResult fetchAndSyncRemoteFolder(OwnCloudClient client) {
+ String remotePath = mLocalFolder.getRemotePath();
+ ReadRemoteFolderOperation operation = new ReadRemoteFolderOperation(remotePath);
+ RemoteOperationResult result = operation.execute(client);
+ Log_OC.d(TAG, "Synchronizing " + mAccount.name + remotePath);
+
+ if (result.isSuccess()) {
+ synchronizeData(result.getData(), client);
+ if (mConflictsFound > 0 || mFailsInFavouritesFound > 0) {
+ result = new RemoteOperationResult(ResultCode.SYNC_CONFLICT); // should be different result, but will do the job
}
+ } else {
+ if (result.getCode() == ResultCode.FILE_NOT_FOUND)
+ removeLocalFolder();
+ }
+
+ return result;
+ }
+
+
+ private void removeLocalFolder() {
+ if (mStorageManager.fileExists(mLocalFolder.getFileId())) {
+ String currentSavePath = FileStorageUtils.getSavePath(mAccount.name);
+ mStorageManager.removeFolder(mLocalFolder, true, (mLocalFolder.isDown() && mLocalFolder.getStoragePath().startsWith(currentSavePath)));
+ }
+ }
+
+
+ /**
+ * Synchronizes the data retrieved from the server about the contents of the target folder
+ * with the current data in the local database.
+ *
+ * Grants that mChildren is updated with fresh data after execution.
+ *
+ * @param folderAndFiles Remote folder and children files in Folder
+ *
+ * @param client Client instance to the remote server where the data were
+ * retrieved.
+ * @return 'True' when any change was made in the local data, 'false' otherwise.
+ */
+ private void synchronizeData(ArrayList<Object> folderAndFiles, OwnCloudClient client) {
+ // get 'fresh data' from the database
+ mLocalFolder = mStorageManager.getFileByPath(mLocalFolder.getRemotePath());
+
+ // parse data from remote folder
+ OCFile remoteFolder = fillOCFile((RemoteFile)folderAndFiles.get(0));
+ remoteFolder.setParentId(mLocalFolder.getParentId());
+ remoteFolder.setFileId(mLocalFolder.getFileId());
+
+ Log_OC.d(TAG, "Remote folder " + mLocalFolder.getRemotePath() + " changed - starting update of local data ");
+
+ List<OCFile> updatedFiles = new Vector<OCFile>(folderAndFiles.size() - 1);
+ List<SynchronizeFileOperation> filesToSyncContents = new Vector<SynchronizeFileOperation>();
+
+ // get current data about local contents of the folder to synchronize
+ List<OCFile> localFiles = mStorageManager.getFolderContent(mLocalFolder);
+ Map<String, OCFile> localFilesMap = new HashMap<String, OCFile>(localFiles.size());
+ for (OCFile file : localFiles) {
+ localFilesMap.put(file.getRemotePath(), file);
+ }
+
+ // loop to update every child
+ OCFile remoteFile = null, localFile = null;
+ for (int i=1; i<folderAndFiles.size(); i++) {
+ /// new OCFile instance with the data from the server
+ remoteFile = fillOCFile((RemoteFile)folderAndFiles.get(i));
+ remoteFile.setParentId(mLocalFolder.getFileId());
+
+ /// retrieve local data for the read file
+ //localFile = mStorageManager.getFileByPath(remoteFile.getRemotePath());
+ localFile = localFilesMap.remove(remoteFile.getRemotePath());
- // prepare result object
- if (isMultiStatus(status)) {
- if (mConflictsFound > 0 || mFailsInFavouritesFound > 0) {
- result = new RemoteOperationResult(ResultCode.SYNC_CONFLICT); // should be different result, but will do the job
-
- } else {
- result = new RemoteOperationResult(true, status);
+ /// add to the remoteFile (the new one) data about LOCAL STATE (not existing in the server side)
+ remoteFile.setLastSyncDateForProperties(mCurrentSyncTime);
+ if (localFile != null) {
+ // some properties of local state are kept unmodified
+ remoteFile.setFileId(localFile.getFileId());
+ remoteFile.setKeepInSync(localFile.keepInSync());
+ remoteFile.setLastSyncDateForData(localFile.getLastSyncDateForData());
+ remoteFile.setModificationTimestampAtLastSyncForData(localFile.getModificationTimestampAtLastSyncForData());
+ remoteFile.setStoragePath(localFile.getStoragePath());
+ remoteFile.setEtag(localFile.getEtag()); // eTag will not be updated unless contents are synchronized (Synchronize[File|Folder]Operation with remoteFile as parameter)
+ if (remoteFile.isFolder()) {
+ remoteFile.setFileLength(localFile.getFileLength()); // TODO move operations about size of folders to FileContentProvider
}
+ remoteFile.setPublicLink(localFile.getPublicLink());
+ remoteFile.setShareByLink(localFile.isShareByLink());
} else {
- result = new RemoteOperationResult(false, status);
+ remoteFile.setEtag(""); // remote eTag will not be updated unless contents are synchronized (Synchronize[File|Folder]Operation with remoteFile as parameter)
+ }
+
+ /// check and fix, if needed, local storage path
+ checkAndFixForeignStoragePath(remoteFile); // fixing old policy - now local files must be copied into the ownCloud local folder
+ searchForLocalFileInDefaultPath(remoteFile); // legacy
+
+ /// prepare content synchronization for kept-in-sync files
+ if (remoteFile.keepInSync()) {
+ SynchronizeFileOperation operation = new SynchronizeFileOperation( localFile,
+ remoteFile,
+ mStorageManager,
+ mAccount,
+ true,
+ mContext
+ );
+ filesToSyncContents.add(operation);
}
- Log_OC.i(TAG, "Synchronizing " + mAccount.name + ", folder " + mRemotePath + ": " + result.getLogMessage());
-
- } catch (Exception e) {
- result = new RemoteOperationResult(e);
- Log_OC.e(TAG, "Synchronizing " + mAccount.name + ", folder " + mRemotePath + ": " + result.getLogMessage(), result.getException());
+ updatedFiles.add(remoteFile);
+ }
+
+ // save updated contents in local database; all at once, trying to get a best performance in database update (not a big deal, indeed)
+ mStorageManager.saveFolder(remoteFolder, updatedFiles, localFilesMap.values());
+
+ // request for the synchronization of file contents AFTER saving current remote properties
+ startContentSynchronizations(filesToSyncContents, client);
+
+ mChildren = updatedFiles;
+ }
- } finally {
- if (query != null)
- query.releaseConnection(); // let the connection available for other methods
+ /**
+ * Performs a list of synchronization operations, determining if a download or upload is needed or
+ * if exists conflict due to changes both in local and remote contents of the each file.
+ *
+ * If download or upload is needed, request the operation to the corresponding service and goes on.
+ *
+ * @param filesToSyncContents Synchronization operations to execute.
+ * @param client Interface to the remote ownCloud server.
+ */
+ private void startContentSynchronizations(List<SynchronizeFileOperation> filesToSyncContents, OwnCloudClient client) {
+ RemoteOperationResult contentsResult = null;
+ for (SynchronizeFileOperation op: filesToSyncContents) {
+ contentsResult = op.execute(client); // returns without waiting for upload or download finishes
+ if (!contentsResult.isSuccess()) {
+ if (contentsResult.getCode() == ResultCode.SYNC_CONFLICT) {
+ mConflictsFound++;
+ } else {
+ mFailsInFavouritesFound++;
+ if (contentsResult.getException() != null) {
+ Log_OC.e(TAG, "Error while synchronizing favourites : " + contentsResult.getLogMessage(), contentsResult.getException());
+ } else {
+ Log_OC.e(TAG, "Error while synchronizing favourites : " + contentsResult.getLogMessage());
+ }
+ }
+ } // won't let these fails break the synchronization process
}
-
- return result;
}
-
+
public boolean isMultiStatus(int status) {
return (status == HttpStatus.SC_MULTI_STATUS);
}
-
/**
* Creates and populates a new {@link OCFile} object with the data read from the server.
*
- * @param we WebDAV entry read from the server for a WebDAV resource (remote file or folder).
+ * @param remote remote file read from the server (remote file or folder).
* @return New OCFile instance representing the remote resource described by we.
*/
- private OCFile fillOCFile(WebdavEntry we) {
- OCFile file = new OCFile(we.decodedPath());
- file.setCreationTimestamp(we.createTimestamp());
- file.setFileLength(we.contentLength());
- file.setMimetype(we.contentType());
- file.setModificationTimestamp(we.modifiedTimestamp());
- file.setParentId(mParentId);
+ private OCFile fillOCFile(RemoteFile remote) {
+ OCFile file = new OCFile(remote.getRemotePath());
+ file.setCreationTimestamp(remote.getCreationTimestamp());
+ file.setFileLength(remote.getLength());
+ file.setMimetype(remote.getMimeType());
+ file.setModificationTimestamp(remote.getModifiedTimestamp());
+ file.setEtag(remote.getEtag());
return file;
}
*
* If the copy fails, the link to the local file is nullified. The account of forgotten files is kept in
* {@link #mForgottenLocalFiles}
- *
+ *)
* @param file File to check and fix.
*/
private void checkAndFixForeignStoragePath(OCFile file) {
}
}
}
+
+
+ private RemoteOperationResult refreshSharesForFolder(OwnCloudClient client) {
+ RemoteOperationResult result = null;
+
+ // remote request
+ GetRemoteSharesForFileOperation operation = new GetRemoteSharesForFileOperation(mLocalFolder.getRemotePath(), false, true);
+ result = operation.execute(client);
+
+ if (result.isSuccess()) {
+ // update local database
+ ArrayList<OCShare> shares = new ArrayList<OCShare>();
+ for(Object obj: result.getData()) {
+ shares.add((OCShare) obj);
+ }
+ mStorageManager.saveSharesInFolder(shares, mLocalFolder);
+ }
+ return result;
+ }
+
+
+ /**
+ * Scans the default location for saving local copies of files searching for
+ * a 'lost' file with the same full name as the {@link OCFile} received as
+ * parameter.
+ *
+ * @param file File to associate a possible 'lost' local file.
+ */
+ private void searchForLocalFileInDefaultPath(OCFile file) {
+ if (file.getStoragePath() == null && !file.isFolder()) {
+ File f = new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, file));
+ if (f.exists()) {
+ file.setStoragePath(f.getAbsolutePath());
+ file.setLastSyncDateForData(f.lastModified());
+ }
+ }
+ }
+
+
+ /**
+ * Sends a message to any application component interested in the progress of the synchronization.
+ *
+ * @param event
+ * @param dirRemotePath Remote path of a folder that was just synchronized (with or without success)
+ * @param result
+ */
+ private void sendLocalBroadcast(String event, String dirRemotePath, RemoteOperationResult result) {
+ Log_OC.d(TAG, "Send broadcast " + event);
+ Intent intent = new Intent(event);
+ intent.putExtra(FileSyncAdapter.EXTRA_ACCOUNT_NAME, mAccount.name);
+ if (dirRemotePath != null) {
+ intent.putExtra(FileSyncAdapter.EXTRA_FOLDER_PATH, dirRemotePath);
+ }
+ intent.putExtra(FileSyncAdapter.EXTRA_RESULT, result);
+ mContext.sendStickyBroadcast(intent);
+ //LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
+ }
+
+
+ public boolean getRemoteFolderChanged() {
+ return mRemoteFolderChanged;
+ }
}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2014 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.operations;
+
+import android.content.Context;
+
+import com.owncloud.android.datamodel.OCFile;
+
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.lib.resources.files.ExistenceCheckRemoteOperation;
+import com.owncloud.android.lib.resources.shares.OCShare;
+import com.owncloud.android.lib.resources.shares.RemoveRemoteShareOperation;
+import com.owncloud.android.lib.resources.shares.ShareType;
+
+import com.owncloud.android.operations.common.SyncOperation;
+import com.owncloud.android.utils.Log_OC;
+
+/**
+ * Unshare file/folder
+ * Save the data in Database
+ *
+ * @author masensio
+ */
+public class UnshareLinkOperation extends SyncOperation {
+
+ private static final String TAG = UnshareLinkOperation.class.getSimpleName();
+
+ private String mRemotePath;
+ private Context mContext;
+
+
+ public UnshareLinkOperation(String remotePath, Context context) {
+ mRemotePath = remotePath;
+ mContext = context;
+ }
+
+ @Override
+ protected RemoteOperationResult run(OwnCloudClient client) {
+ RemoteOperationResult result = null;
+
+ // Get Share for a file
+ OCShare share = getStorageManager().getFirstShareByPathAndType(mRemotePath, ShareType.PUBLIC_LINK);
+
+ if (share != null) {
+ RemoveRemoteShareOperation operation = new RemoveRemoteShareOperation((int) share.getIdRemoteShared());
+ result = operation.execute(client);
+
+ if (result.isSuccess() || result.getCode() == ResultCode.SHARE_NOT_FOUND) {
+ Log_OC.d(TAG, "Share id = " + share.getIdRemoteShared() + " deleted");
+
+ OCFile file = getStorageManager().getFileByPath(mRemotePath);
+ file.setShareByLink(false);
+ file.setPublicLink("");
+ getStorageManager().saveFile(file);
+ getStorageManager().removeShare(share);
+
+ if (result.getCode() == ResultCode.SHARE_NOT_FOUND) {
+ if (existsFile(client, file.getRemotePath())) {
+ result = new RemoteOperationResult(ResultCode.OK);
+ } else {
+ getStorageManager().removeFile(file, true, true);
+ }
+ }
+ }
+
+ } else {
+ result = new RemoteOperationResult(ResultCode.SHARE_NOT_FOUND);
+ }
+
+ return result;
+ }
+
+ private boolean existsFile(OwnCloudClient client, String remotePath){
+ ExistenceCheckRemoteOperation existsOperation = new ExistenceCheckRemoteOperation(remotePath, mContext, false);
+ RemoteOperationResult result = existsOperation.execute(client);
+ return result.isSuccess();
+ }
+
+}
import org.json.JSONException;
import org.json.JSONObject;
+import com.owncloud.android.authentication.AccountUtils;
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.lib.common.accounts.AccountUtils.Constants;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.lib.resources.status.OwnCloudVersion;
+import com.owncloud.android.utils.Log_OC;
+
import android.accounts.Account;
import android.accounts.AccountManager;
import android.content.Context;
-import android.util.Log;
-
-import com.owncloud.android.AccountUtils;
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.authenticator.AccountAuthenticator;
-import com.owncloud.android.operations.RemoteOperationResult.ResultCode;
-import com.owncloud.android.utils.OwnCloudVersion;
-import eu.alefzero.webdav.WebdavClient;
/**
* Remote operation that checks the version of an ownCloud server and stores it locally
private Account mAccount;
private Context mContext;
+ private OwnCloudVersion mOwnCloudVersion;
public UpdateOCVersionOperation(Account account, Context context) {
mAccount = account;
mContext = context;
+ mOwnCloudVersion = null;
}
@Override
- protected RemoteOperationResult run(WebdavClient client) {
+ protected RemoteOperationResult run(OwnCloudClient client) {
AccountManager accountMngr = AccountManager.get(mContext);
- String statUrl = accountMngr.getUserData(mAccount, AccountAuthenticator.KEY_OC_BASE_URL);
+ String statUrl = accountMngr.getUserData(mAccount, Constants.KEY_OC_BASE_URL);
statUrl += AccountUtils.STATUS_PATH;
RemoteOperationResult result = null;
GetMethod get = null;
int status = client.executeMethod(get);
if (status != HttpStatus.SC_OK) {
client.exhaustResponse(get.getResponseBodyAsStream());
- result = new RemoteOperationResult(false, status);
+ result = new RemoteOperationResult(false, status, get.getResponseHeaders());
} else {
String response = get.getResponseBodyAsString();
if (response != null) {
JSONObject json = new JSONObject(response);
if (json != null && json.getString("version") != null) {
- OwnCloudVersion ocver = new OwnCloudVersion(json.getString("version"));
- if (ocver.isVersionValid()) {
- accountMngr.setUserData(mAccount, AccountAuthenticator.KEY_OC_VERSION, ocver.toString());
- Log_OC.d(TAG, "Got new OC version " + ocver.toString());
+
+ String version = json.getString("version");
+ mOwnCloudVersion = new OwnCloudVersion(version);
+ if (mOwnCloudVersion.isVersionValid()) {
+ accountMngr.setUserData(mAccount, Constants.KEY_OC_VERSION, mOwnCloudVersion.getVersion());
+ Log_OC.d(TAG, "Got new OC version " + mOwnCloudVersion.toString());
+
result = new RemoteOperationResult(ResultCode.OK);
} else {
result = new RemoteOperationResult(RemoteOperationResult.ResultCode.INSTANCE_NOT_CONFIGURED);
}
}
- Log_OC.i(TAG, "Check for update of ownCloud server version at " + client.getBaseUri() + ": " + result.getLogMessage());
+ Log_OC.i(TAG, "Check for update of ownCloud server version at " + client.getWebdavUri() + ": " + result.getLogMessage());
} catch (JSONException e) {
result = new RemoteOperationResult(RemoteOperationResult.ResultCode.INSTANCE_NOT_CONFIGURED);
- Log_OC.e(TAG, "Check for update of ownCloud server version at " + client.getBaseUri() + ": " + result.getLogMessage(), e);
+ Log_OC.e(TAG, "Check for update of ownCloud server version at " + client.getWebdavUri() + ": " + result.getLogMessage(), e);
} catch (Exception e) {
result = new RemoteOperationResult(e);
- Log_OC.e(TAG, "Check for update of ownCloud server version at " + client.getBaseUri() + ": " + result.getLogMessage(), e);
+ Log_OC.e(TAG, "Check for update of ownCloud server version at " + client.getWebdavUri() + ": " + result.getLogMessage(), e);
} finally {
if (get != null)
return result;
}
+
+ public OwnCloudVersion getOCVersion() {
+ return mOwnCloudVersion;
+ }
+
}
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
-import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.PutMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
-import org.apache.http.HttpStatus;
-
-import com.owncloud.android.Log_OC;
-import android.accounts.Account;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.files.services.FileUploader;
-import com.owncloud.android.network.ProgressiveDataTransferer;
-import com.owncloud.android.operations.RemoteOperation;
-import com.owncloud.android.operations.RemoteOperationResult;
-import com.owncloud.android.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.lib.common.network.ProgressiveDataTransferer;
+import com.owncloud.android.lib.common.network.OnDatatransferProgressListener;
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.lib.common.operations.OperationCancelledException;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.lib.resources.files.ChunkedUploadRemoteFileOperation;
+import com.owncloud.android.lib.resources.files.ExistenceCheckRemoteOperation;
+import com.owncloud.android.lib.resources.files.UploadRemoteFileOperation;
import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.Log_OC;
+
+import android.accounts.Account;
+import android.content.Context;
-import eu.alefzero.webdav.FileRequestEntity;
-import eu.alefzero.webdav.OnDatatransferProgressListener;
-import eu.alefzero.webdav.WebdavClient;
-import eu.alefzero.webdav.WebdavUtils;
/**
* Remote operation performing the upload of a file to an ownCloud server
private OCFile mFile;
private OCFile mOldFile;
private String mRemotePath = null;
+ private boolean mChunked = false;
private boolean mIsInstant = false;
private boolean mRemoteFolderToBeCreated = false;
private boolean mForceOverwrite = false;
PutMethod mPutMethod = null;
private Set<OnDatatransferProgressListener> mDataTransferListeners = new HashSet<OnDatatransferProgressListener>();
private final AtomicBoolean mCancellationRequested = new AtomicBoolean(false);
+ private Context mContext;
+
+ private UploadRemoteFileOperation mUploadOperation;
protected RequestEntity mEntity = null;
public UploadFileOperation( Account account,
OCFile file,
+ boolean chunked,
boolean isInstant,
boolean forceOverwrite,
- int localBehaviour) {
+ int localBehaviour,
+ Context context) {
if (account == null)
throw new IllegalArgumentException("Illegal NULL account in UploadFileOperation creation");
if (file == null)
mAccount = account;
mFile = file;
mRemotePath = file.getRemotePath();
+ mChunked = chunked;
mIsInstant = isInstant;
mForceOverwrite = forceOverwrite;
mLocalBehaviour = localBehaviour;
mOriginalStoragePath = mFile.getStoragePath();
mOriginalFileName = mFile.getFileName();
+ mContext = context;
}
public Account getAccount() {
}
@Override
- protected RemoteOperationResult run(WebdavClient client) {
+ protected RemoteOperationResult run(OwnCloudClient client) {
RemoteOperationResult result = null;
boolean localCopyPassed = false, nameCheckPassed = false;
File temporalFile = null, originalFile = new File(mOriginalStoragePath), expectedFile = null;
// !!!
expectedFile = new File(expectedPath);
- // / check location of local file; if not the expected, copy to a
+ // check location of local file; if not the expected, copy to a
// temporal file before upload (if COPY is the expected behaviour)
if (!mOriginalStoragePath.equals(expectedPath) && mLocalBehaviour == FileUploader.LOCAL_BEHAVIOUR_COPY) {
}
localCopyPassed = true;
- // / perform the upload
- synchronized (mCancellationRequested) {
- if (mCancellationRequested.get()) {
- throw new OperationCancelledException();
- } else {
- mPutMethod = new PutMethod(client.getBaseUri() + WebdavUtils.encodePath(mFile.getRemotePath()));
- }
+ /// perform the upload
+ if ( mChunked && (new File(mFile.getStoragePath())).length() > ChunkedUploadRemoteFileOperation.CHUNK_SIZE ) {
+ mUploadOperation = new ChunkedUploadRemoteFileOperation(mFile.getStoragePath(), mFile.getRemotePath(),
+ mFile.getMimetype());
+ } else {
+ mUploadOperation = new UploadRemoteFileOperation(mFile.getStoragePath(), mFile.getRemotePath(),
+ mFile.getMimetype());
+ }
+ Iterator <OnDatatransferProgressListener> listener = mDataTransferListeners.iterator();
+ while (listener.hasNext()) {
+ mUploadOperation.addDatatransferProgressListener(listener.next());
}
- int status = uploadFile(client);
+ result = mUploadOperation.execute(client);
- // / move local temporal file or original file to its corresponding
+ /// move local temporal file or original file to its corresponding
// location in the ownCloud local folder
- if (isSuccess(status)) {
+ if (result.isSuccess()) {
if (mLocalBehaviour == FileUploader.LOCAL_BEHAVIOUR_FORGET) {
mFile.setStoragePath(null);
}
}
- result = new RemoteOperationResult(isSuccess(status), status);
-
} catch (Exception e) {
// TODO something cleaner with cancellations
if (mCancellationRequested.get()) {
mFile = newFile;
}
- public boolean isSuccess(int status) {
- return ((status == HttpStatus.SC_OK || status == HttpStatus.SC_CREATED || status == HttpStatus.SC_NO_CONTENT));
- }
-
- protected int uploadFile(WebdavClient client) throws HttpException, IOException, OperationCancelledException {
- int status = -1;
- try {
- File f = new File(mFile.getStoragePath());
- mEntity = new FileRequestEntity(f, getMimeType());
- synchronized (mDataTransferListeners) {
- ((ProgressiveDataTransferer)mEntity).addDatatransferProgressListeners(mDataTransferListeners);
- }
- mPutMethod.setRequestEntity(mEntity);
- status = client.executeMethod(mPutMethod);
- client.exhaustResponse(mPutMethod.getResponseBodyAsStream());
-
- } finally {
- mPutMethod.releaseConnection(); // let the connection available for
- // other methods
- }
- return status;
- }
-
/**
* Checks if remotePath does not exist in the server and returns it, or adds
* a suffix to it in order to avoid the server file is overwritten.
* @param string
* @return
*/
- private String getAvailableRemotePath(WebdavClient wc, String remotePath) throws Exception {
- boolean check = wc.existsFile(remotePath);
+ private String getAvailableRemotePath(OwnCloudClient wc, String remotePath) throws Exception {
+ boolean check = existsFile(wc, remotePath);
if (!check) {
return remotePath;
}
int count = 2;
do {
suffix = " (" + count + ")";
- if (pos >= 0)
- check = wc.existsFile(remotePath + suffix + "." + extension);
- else
- check = wc.existsFile(remotePath + suffix);
+ if (pos >= 0) {
+ check = existsFile(wc, remotePath + suffix + "." + extension);
+ }
+ else {
+ check = existsFile(wc, remotePath + suffix);
+ }
count++;
} while (check);
}
}
+ private boolean existsFile(OwnCloudClient client, String remotePath){
+ ExistenceCheckRemoteOperation existsOperation = new ExistenceCheckRemoteOperation(remotePath, mContext, false);
+ RemoteOperationResult result = existsOperation.execute(client);
+ return result.isSuccess();
+ }
+
public void cancel() {
- synchronized (mCancellationRequested) {
- mCancellationRequested.set(true);
- if (mPutMethod != null)
- mPutMethod.abort();
- }
+ mUploadOperation.cancel();
}
}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2014 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.operations.common;
+
+import com.owncloud.android.datamodel.FileDataStorageManager;
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Handler;
+
+
+/**
+ * Operation which execution involves both interactions with an ownCloud server and
+ * with local data in the device.
+ *
+ * Provides methods to execute the operation both synchronously or asynchronously.
+ *
+ * @author David A. Velasco
+ */
+public abstract class SyncOperation extends RemoteOperation {
+
+ //private static final String TAG = SyncOperation.class.getSimpleName();
+
+ private FileDataStorageManager mStorageManager;
+
+ public FileDataStorageManager getStorageManager() {
+ return mStorageManager;
+ }
+
+
+ /**
+ * Synchronously executes the operation on the received ownCloud account.
+ *
+ * Do not call this method from the main thread.
+ *
+ * This method should be used whenever an ownCloud account is available, instead of {@link #execute(OwnCloudClient)}.
+ *
+ * @param account ownCloud account in remote ownCloud server to reach during the execution of the operation.
+ * @param context Android context for the component calling the method.
+ * @return Result of the operation.
+ */
+ public RemoteOperationResult execute(FileDataStorageManager storageManager, Context context) {
+ if (storageManager == null) {
+ throw new IllegalArgumentException("Trying to execute a sync operation with a NULL storage manager");
+ }
+ if (storageManager.getAccount() == null) {
+ throw new IllegalArgumentException("Trying to execute a sync operation with a storage manager for a NULL account");
+ }
+ mStorageManager = storageManager;
+ return super.execute(mStorageManager.getAccount(), context);
+ }
+
+
+ /**
+ * Synchronously executes the remote operation
+ *
+ * Do not call this method from the main thread.
+ *
+ * @param client Client object to reach an ownCloud server during the execution of the operation.
+ * @return Result of the operation.
+ */
+ public RemoteOperationResult execute(OwnCloudClient client, FileDataStorageManager storageManager) {
+ if (storageManager == null)
+ throw new IllegalArgumentException("Trying to execute a sync operation with a NULL storage manager");
+ mStorageManager = storageManager;
+ return super.execute(client);
+ }
+
+
+ /**
+ * Asynchronously executes the remote operation
+ *
+ * This method should be used whenever an ownCloud account is available, instead of {@link #execute(OwnCloudClient)}.
+ *
+ * @param account ownCloud account in remote ownCloud server to reach during the execution of the operation.
+ * @param context Android context for the component calling the method.
+ * @param listener Listener to be notified about the execution of the operation.
+ * @param listenerHandler Handler associated to the thread where the methods of the listener objects must be called.
+ * @return Thread were the remote operation is executed.
+ */
+ public Thread execute(FileDataStorageManager storageManager, Context context, OnRemoteOperationListener listener, Handler listenerHandler, Activity callerActivity) {
+ if (storageManager == null) {
+ throw new IllegalArgumentException("Trying to execute a sync operation with a NULL storage manager");
+ }
+ if (storageManager.getAccount() == null) {
+ throw new IllegalArgumentException("Trying to execute a sync operation with a storage manager for a NULL account");
+ }
+ mStorageManager = storageManager;
+ return super.execute(storageManager.getAccount(), context, listener, listenerHandler, callerActivity);
+ }
+
+
+ /**
+ * Asynchronously executes the remote operation
+ *
+ * @param client Client object to reach an ownCloud server during the execution of the operation.
+ * @param listener Listener to be notified about the execution of the operation.
+ * @param listenerHandler Handler associated to the thread where the methods of the listener objects must be called.
+ * @return Thread were the remote operation is executed.
+ */
+ public Thread execute(OwnCloudClient client, FileDataStorageManager storageManager, OnRemoteOperationListener listener, Handler listenerHandler) {
+ if (storageManager == null) {
+ throw new IllegalArgumentException("Trying to execute a sync operation with a NULL storage manager");
+ }
+ mStorageManager = storageManager;
+ return super.execute(client, listener, listenerHandler);
+ }
+
+
+}
package com.owncloud.android.providers;
+import java.util.ArrayList;
import java.util.HashMap;
-import com.owncloud.android.Log_OC;
+import com.owncloud.android.R;
import com.owncloud.android.db.ProviderMeta;
import com.owncloud.android.db.ProviderMeta.ProviderTableMeta;
+import com.owncloud.android.lib.resources.shares.ShareType;
+import com.owncloud.android.utils.Log_OC;
+
import android.content.ContentProvider;
+import android.content.ContentProviderOperation;
+import android.content.ContentProviderResult;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
+import android.content.OperationApplicationException;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
-import android.util.Log;
/**
* The ContentProvider for the ownCloud App.
*
* @author Bartek Przybylski
+ * @author David A. Velasco
*
*/
public class FileContentProvider extends ContentProvider {
private DataBaseHelper mDbHelper;
- private static HashMap<String, String> mProjectionMap;
+ // Projection for filelist table
+ private static HashMap<String, String> mFileProjectionMap;
static {
- mProjectionMap = new HashMap<String, String>();
- mProjectionMap.put(ProviderTableMeta._ID, ProviderTableMeta._ID);
- mProjectionMap.put(ProviderTableMeta.FILE_PARENT,
+ mFileProjectionMap = new HashMap<String, String>();
+ mFileProjectionMap.put(ProviderTableMeta._ID, ProviderTableMeta._ID);
+ mFileProjectionMap.put(ProviderTableMeta.FILE_PARENT,
ProviderTableMeta.FILE_PARENT);
- mProjectionMap.put(ProviderTableMeta.FILE_PATH,
+ mFileProjectionMap.put(ProviderTableMeta.FILE_PATH,
ProviderTableMeta.FILE_PATH);
- mProjectionMap.put(ProviderTableMeta.FILE_NAME,
+ mFileProjectionMap.put(ProviderTableMeta.FILE_NAME,
ProviderTableMeta.FILE_NAME);
- mProjectionMap.put(ProviderTableMeta.FILE_CREATION,
+ mFileProjectionMap.put(ProviderTableMeta.FILE_CREATION,
ProviderTableMeta.FILE_CREATION);
- mProjectionMap.put(ProviderTableMeta.FILE_MODIFIED,
+ mFileProjectionMap.put(ProviderTableMeta.FILE_MODIFIED,
ProviderTableMeta.FILE_MODIFIED);
- mProjectionMap.put(ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA,
+ mFileProjectionMap.put(ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA,
ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA);
- mProjectionMap.put(ProviderTableMeta.FILE_CONTENT_LENGTH,
+ mFileProjectionMap.put(ProviderTableMeta.FILE_CONTENT_LENGTH,
ProviderTableMeta.FILE_CONTENT_LENGTH);
- mProjectionMap.put(ProviderTableMeta.FILE_CONTENT_TYPE,
+ mFileProjectionMap.put(ProviderTableMeta.FILE_CONTENT_TYPE,
ProviderTableMeta.FILE_CONTENT_TYPE);
- mProjectionMap.put(ProviderTableMeta.FILE_STORAGE_PATH,
+ mFileProjectionMap.put(ProviderTableMeta.FILE_STORAGE_PATH,
ProviderTableMeta.FILE_STORAGE_PATH);
- mProjectionMap.put(ProviderTableMeta.FILE_LAST_SYNC_DATE,
+ mFileProjectionMap.put(ProviderTableMeta.FILE_LAST_SYNC_DATE,
ProviderTableMeta.FILE_LAST_SYNC_DATE);
- mProjectionMap.put(ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA,
+ mFileProjectionMap.put(ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA,
ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA);
- mProjectionMap.put(ProviderTableMeta.FILE_KEEP_IN_SYNC,
+ mFileProjectionMap.put(ProviderTableMeta.FILE_KEEP_IN_SYNC,
ProviderTableMeta.FILE_KEEP_IN_SYNC);
- mProjectionMap.put(ProviderTableMeta.FILE_ACCOUNT_OWNER,
+ mFileProjectionMap.put(ProviderTableMeta.FILE_ACCOUNT_OWNER,
ProviderTableMeta.FILE_ACCOUNT_OWNER);
+ mFileProjectionMap.put(ProviderTableMeta.FILE_ETAG,
+ ProviderTableMeta.FILE_ETAG);
+ mFileProjectionMap.put(ProviderTableMeta.FILE_SHARE_BY_LINK,
+ ProviderTableMeta.FILE_SHARE_BY_LINK);
+ mFileProjectionMap.put(ProviderTableMeta.FILE_PUBLIC_LINK,
+ ProviderTableMeta.FILE_PUBLIC_LINK);
}
private static final int SINGLE_FILE = 1;
private static final int DIRECTORY = 2;
private static final int ROOT_DIRECTORY = 3;
- private static final UriMatcher mUriMatcher;
+ private static final int SHARES = 4;
+
+ // Projection for ocshares table
+ private static HashMap<String, String> mOCSharesProjectionMap;
static {
- mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
- mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "/", ROOT_DIRECTORY);
- mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "file/", SINGLE_FILE);
- mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "file/#", SINGLE_FILE);
- mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "dir/#", DIRECTORY);
+ mOCSharesProjectionMap = new HashMap<String, String>();
+ mOCSharesProjectionMap.put(ProviderTableMeta._ID, ProviderTableMeta._ID);
+ mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_FILE_SOURCE,
+ ProviderTableMeta.OCSHARES_FILE_SOURCE);
+ mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_ITEM_SOURCE,
+ ProviderTableMeta.OCSHARES_ITEM_SOURCE);
+ mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_SHARE_TYPE,
+ ProviderTableMeta.OCSHARES_SHARE_TYPE);
+ mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_SHARE_WITH,
+ ProviderTableMeta.OCSHARES_SHARE_WITH);
+ mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_PATH,
+ ProviderTableMeta.OCSHARES_PATH);
+ mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_PERMISSIONS,
+ ProviderTableMeta.OCSHARES_PERMISSIONS);
+ mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_SHARED_DATE,
+ ProviderTableMeta.OCSHARES_SHARED_DATE);
+ mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_EXPIRATION_DATE,
+ ProviderTableMeta.OCSHARES_EXPIRATION_DATE);
+ mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_TOKEN,
+ ProviderTableMeta.OCSHARES_TOKEN);
+ mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME,
+ ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME);
+ mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_IS_DIRECTORY,
+ ProviderTableMeta.OCSHARES_IS_DIRECTORY);
+ mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_USER_ID,
+ ProviderTableMeta.OCSHARES_USER_ID);
+ mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED,
+ ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED);
+ mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER,
+ ProviderTableMeta.OCSHARES_ACCOUNT_OWNER);
}
-
+
+ private UriMatcher mUriMatcher;
+
@Override
public int delete(Uri uri, String where, String[] whereArgs) {
+ //Log_OC.d(TAG, "Deleting " + uri + " at provider " + this);
+ int count = 0;
SQLiteDatabase db = mDbHelper.getWritableDatabase();
+ db.beginTransaction();
+ try {
+ count = delete(db, uri, where, whereArgs);
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ }
+ getContext().getContentResolver().notifyChange(uri, null);
+ return count;
+ }
+
+ private int delete(SQLiteDatabase db, Uri uri, String where, String[] whereArgs) {
int count = 0;
switch (mUriMatcher.match(uri)) {
case SINGLE_FILE:
- count = db.delete(ProviderTableMeta.DB_NAME,
+ /*Cursor c = query(db, uri, null, where, whereArgs, null);
+ String remotePath = "(unexisting)";
+ if (c != null && c.moveToFirst()) {
+ remotePath = c.getString(c.getColumnIndex(ProviderTableMeta.FILE_PATH));
+ }
+ Log_OC.d(TAG, "Removing FILE " + remotePath);
+ */
+ count = db.delete(ProviderTableMeta.FILE_TABLE_NAME,
ProviderTableMeta._ID
+ "="
+ uri.getPathSegments().get(1)
+ (!TextUtils.isEmpty(where) ? " AND (" + where
+ ")" : ""), whereArgs);
+ /* just for log
+ if (c!=null) {
+ c.close();
+ }
+ */
+ break;
+ case DIRECTORY:
+ // deletion of folder is recursive
+ /*
+ Uri folderUri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, Long.parseLong(uri.getPathSegments().get(1)));
+ Cursor folder = query(db, folderUri, null, null, null, null);
+ String folderName = "(unknown)";
+ if (folder != null && folder.moveToFirst()) {
+ folderName = folder.getString(folder.getColumnIndex(ProviderTableMeta.FILE_PATH));
+ }
+ */
+ Cursor children = query(uri, null, null, null, null);
+ if (children != null && children.moveToFirst()) {
+ long childId;
+ boolean isDir;
+ //String remotePath;
+ while (!children.isAfterLast()) {
+ childId = children.getLong(children.getColumnIndex(ProviderTableMeta._ID));
+ isDir = "DIR".equals(children.getString(children.getColumnIndex(ProviderTableMeta.FILE_CONTENT_TYPE)));
+ //remotePath = children.getString(children.getColumnIndex(ProviderTableMeta.FILE_PATH));
+ if (isDir) {
+ count += delete(db, ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_DIR, childId), null, null);
+ } else {
+ count += delete(db, ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, childId), null, null);
+ }
+ children.moveToNext();
+ }
+ children.close();
+ } /*else {
+ Log_OC.d(TAG, "No child to remove in DIRECTORY " + folderName);
+ }
+ Log_OC.d(TAG, "Removing DIRECTORY " + folderName + " (or maybe not) ");
+ */
+ count += db.delete(ProviderTableMeta.FILE_TABLE_NAME,
+ ProviderTableMeta._ID
+ + "="
+ + uri.getPathSegments().get(1)
+ + (!TextUtils.isEmpty(where) ? " AND (" + where
+ + ")" : ""), whereArgs);
+ /* Just for log
+ if (folder != null) {
+ folder.close();
+ }*/
break;
case ROOT_DIRECTORY:
- count = db.delete(ProviderTableMeta.DB_NAME, where, whereArgs);
+ //Log_OC.d(TAG, "Removing ROOT!");
+ count = db.delete(ProviderTableMeta.FILE_TABLE_NAME, where, whereArgs);
+ break;
+ case SHARES:
+ count = db.delete(ProviderTableMeta.OCSHARES_TABLE_NAME, where, whereArgs);
break;
default:
+ //Log_OC.e(TAG, "Unknown uri " + uri);
throw new IllegalArgumentException("Unknown uri: " + uri.toString());
}
- getContext().getContentResolver().notifyChange(uri, null);
return count;
}
+
@Override
public String getType(Uri uri) {
@Override
public Uri insert(Uri uri, ContentValues values) {
- if (mUriMatcher.match(uri) != SINGLE_FILE &&
- mUriMatcher.match(uri) != ROOT_DIRECTORY) {
-
- throw new IllegalArgumentException("Unknown uri id: " + uri);
+ //Log_OC.d(TAG, "Inserting " + values.getAsString(ProviderTableMeta.FILE_PATH) + " at provider " + this);
+ Uri newUri = null;
+ SQLiteDatabase db = mDbHelper.getWritableDatabase();
+ db.beginTransaction();
+ try {
+ newUri = insert(db, uri, values);
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
}
+ getContext().getContentResolver().notifyChange(newUri, null);
+ return newUri;
+ }
+
+ private Uri insert(SQLiteDatabase db, Uri uri, ContentValues values) {
+ switch (mUriMatcher.match(uri)){
+ case ROOT_DIRECTORY:
+ case SINGLE_FILE:
+ String remotePath = values.getAsString(ProviderTableMeta.FILE_PATH);
+ String accountName = values.getAsString(ProviderTableMeta.FILE_ACCOUNT_OWNER);
+ String[] projection = new String[] {ProviderTableMeta._ID, ProviderTableMeta.FILE_PATH, ProviderTableMeta.FILE_ACCOUNT_OWNER };
+ String where = ProviderTableMeta.FILE_PATH + "=? AND " + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?";
+ String[] whereArgs = new String[] {remotePath, accountName};
+ Cursor doubleCheck = query(db, uri, projection, where, whereArgs, null);
+ if (doubleCheck == null || !doubleCheck.moveToFirst()) { // ugly patch; serious refactorization is needed to reduce work in FileDataStorageManager and bring it to FileContentProvider
+ long rowId = db.insert(ProviderTableMeta.FILE_TABLE_NAME, null, values);
+ if (rowId > 0) {
+ Uri insertedFileUri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, rowId);
+ //Log_OC.d(TAG, "Inserted " + values.getAsString(ProviderTableMeta.FILE_PATH) + " at provider " + this);
+ return insertedFileUri;
+ } else {
+ //Log_OC.d(TAG, "Error while inserting " + values.getAsString(ProviderTableMeta.FILE_PATH) + " at provider " + this);
+ throw new SQLException("ERROR " + uri);
+ }
+ } else {
+ // file is already inserted; race condition, let's avoid a duplicated entry
+ Uri insertedFileUri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, doubleCheck.getLong(doubleCheck.getColumnIndex(ProviderTableMeta._ID)));
+ doubleCheck.close();
- SQLiteDatabase db = mDbHelper.getWritableDatabase();
- long rowId = db.insert(ProviderTableMeta.DB_NAME, null, values);
- if (rowId > 0) {
- Uri insertedFileUri = ContentUris.withAppendedId(
- ProviderTableMeta.CONTENT_URI_FILE, rowId);
- getContext().getContentResolver().notifyChange(insertedFileUri,
- null);
- return insertedFileUri;
+ return insertedFileUri;
+ }
+
+ case SHARES:
+ String path = values.getAsString(ProviderTableMeta.OCSHARES_PATH);
+ String accountNameShare= values.getAsString(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER);
+ String[] projectionShare = new String[] {ProviderTableMeta._ID, ProviderTableMeta.OCSHARES_PATH, ProviderTableMeta.OCSHARES_ACCOUNT_OWNER };
+ String whereShare = ProviderTableMeta.OCSHARES_PATH + "=? AND " + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?";
+ String[] whereArgsShare = new String[] {path, accountNameShare};
+ Uri insertedShareUri = null;
+ Cursor doubleCheckShare = query(db, uri, projectionShare, whereShare, whereArgsShare, null);
+ if (doubleCheckShare == null || !doubleCheckShare.moveToFirst()) { // ugly patch; serious refactorization is needed to reduce work in FileDataStorageManager and bring it to FileContentProvider
+ long rowId = db.insert(ProviderTableMeta.OCSHARES_TABLE_NAME, null, values);
+ if (rowId >0) {
+ insertedShareUri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_SHARE, rowId);
+ } else {
+ throw new SQLException("ERROR " + uri);
+
+ }
+ } else {
+ // file is already inserted; race condition, let's avoid a duplicated entry
+ insertedShareUri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_SHARE, doubleCheckShare.getLong(doubleCheckShare.getColumnIndex(ProviderTableMeta._ID)));
+ doubleCheckShare.close();
+ }
+ updateFilesTableAccordingToShareInsertion(db, uri, values);
+ return insertedShareUri;
+
+
+ default:
+ throw new IllegalArgumentException("Unknown uri id: " + uri);
}
- throw new SQLException("ERROR " + uri);
+
+ }
+
+ private void updateFilesTableAccordingToShareInsertion(SQLiteDatabase db, Uri uri, ContentValues shareValues) {
+ ContentValues fileValues = new ContentValues();
+ fileValues.put(ProviderTableMeta.FILE_SHARE_BY_LINK,
+ ShareType.PUBLIC_LINK.getValue() == shareValues.getAsInteger(ProviderTableMeta.OCSHARES_SHARE_TYPE)? 1 : 0);
+ String whereShare = ProviderTableMeta.FILE_PATH + "=? AND " + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?";
+ String[] whereArgsShare = new String[] {
+ shareValues.getAsString(ProviderTableMeta.OCSHARES_PATH),
+ shareValues.getAsString(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER)
+ };
+ db.update(ProviderTableMeta.FILE_TABLE_NAME, fileValues, whereShare, whereArgsShare);
}
+
@Override
public boolean onCreate() {
mDbHelper = new DataBaseHelper(getContext());
+
+ String authority = getContext().getResources().getString(R.string.authority);
+ mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
+ mUriMatcher.addURI(authority, null, ROOT_DIRECTORY);
+ mUriMatcher.addURI(authority, "file/", SINGLE_FILE);
+ mUriMatcher.addURI(authority, "file/#", SINGLE_FILE);
+ mUriMatcher.addURI(authority, "dir/", DIRECTORY);
+ mUriMatcher.addURI(authority, "dir/#", DIRECTORY);
+ mUriMatcher.addURI(authority, "shares/", SHARES);
+ mUriMatcher.addURI(authority, "shares/#", SHARES);
+
return true;
}
+
@Override
- public Cursor query(Uri uri, String[] projection, String selection,
- String[] selectionArgs, String sortOrder) {
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
+ Cursor result = null;
+ SQLiteDatabase db = mDbHelper.getReadableDatabase();
+ db.beginTransaction();
+ try {
+ result = query(db, uri, projection, selection, selectionArgs, sortOrder);
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ }
+ return result;
+ }
+
+ private Cursor query(SQLiteDatabase db, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder sqlQuery = new SQLiteQueryBuilder();
- sqlQuery.setTables(ProviderTableMeta.DB_NAME);
- sqlQuery.setProjectionMap(mProjectionMap);
+ sqlQuery.setTables(ProviderTableMeta.FILE_TABLE_NAME);
+ sqlQuery.setProjectionMap(mFileProjectionMap);
switch (mUriMatcher.match(uri)) {
case ROOT_DIRECTORY:
break;
case DIRECTORY:
+ String folderId = uri.getPathSegments().get(1);
sqlQuery.appendWhere(ProviderTableMeta.FILE_PARENT + "="
- + uri.getPathSegments().get(1));
+ + folderId);
break;
case SINGLE_FILE:
if (uri.getPathSegments().size() > 1) {
+ uri.getPathSegments().get(1));
}
break;
+ case SHARES:
+ sqlQuery.setTables(ProviderTableMeta.OCSHARES_TABLE_NAME);
+ sqlQuery.setProjectionMap(mOCSharesProjectionMap);
+ if (uri.getPathSegments().size() > 1) {
+ sqlQuery.appendWhere(ProviderTableMeta._ID + "="
+ + uri.getPathSegments().get(1));
+ }
+ break;
default:
throw new IllegalArgumentException("Unknown uri id: " + uri);
}
String order;
if (TextUtils.isEmpty(sortOrder)) {
- order = ProviderTableMeta.DEFAULT_SORT_ORDER;
+ if (mUriMatcher.match(uri) == SHARES) {
+ order = ProviderTableMeta.OCSHARES_DEFAULT_SORT_ORDER;
+ } else {
+
+ order = ProviderTableMeta.FILE_DEFAULT_SORT_ORDER;
+ }
} else {
order = sortOrder;
}
- SQLiteDatabase db = mDbHelper.getReadableDatabase();
- Cursor c = sqlQuery.query(db, projection, selection, selectionArgs,
- null, null, order);
-
+ // DB case_sensitive
+ db.execSQL("PRAGMA case_sensitive_like = true");
+ Cursor c = sqlQuery.query(db, projection, selection, selectionArgs, null, null, order);
c.setNotificationUri(getContext().getContentResolver(), uri);
-
return c;
}
@Override
- public int update(Uri uri, ContentValues values, String selection,
- String[] selectionArgs) {
- return mDbHelper.getWritableDatabase().update(
- ProviderTableMeta.DB_NAME, values, selection, selectionArgs);
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+
+ //Log_OC.d(TAG, "Updating " + values.getAsString(ProviderTableMeta.FILE_PATH) + " at provider " + this);
+ int count = 0;
+ SQLiteDatabase db = mDbHelper.getWritableDatabase();
+ db.beginTransaction();
+ try {
+ count = update(db, uri, values, selection, selectionArgs);
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ }
+ getContext().getContentResolver().notifyChange(uri, null);
+ return count;
+ }
+
+
+
+ private int update(SQLiteDatabase db, Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ switch (mUriMatcher.match(uri)) {
+ case DIRECTORY:
+ return 0; //updateFolderSize(db, selectionArgs[0]);
+ case SHARES:
+ return db.update(ProviderTableMeta.OCSHARES_TABLE_NAME, values, selection, selectionArgs);
+ default:
+ return db.update(ProviderTableMeta.FILE_TABLE_NAME, values, selection, selectionArgs);
+ }
+ }
+
+ /*
+ private int updateFolderSize(SQLiteDatabase db, String folderId) {
+ int count = 0;
+ String [] whereArgs = new String[] { folderId };
+
+ // read current size saved for the folder
+ long folderSize = 0;
+ long folderParentId = -1;
+ Uri selectFolderUri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_FILE, folderId);
+ String[] folderProjection = new String[] { ProviderTableMeta.FILE_CONTENT_LENGTH, ProviderTableMeta.FILE_PARENT};
+ String folderWhere = ProviderTableMeta._ID + "=?";
+ Cursor folderCursor = query(db, selectFolderUri, folderProjection, folderWhere, whereArgs, null);
+ if (folderCursor != null && folderCursor.moveToFirst()) {
+ folderSize = folderCursor.getLong(folderCursor.getColumnIndex(ProviderTableMeta.FILE_CONTENT_LENGTH));;
+ folderParentId = folderCursor.getLong(folderCursor.getColumnIndex(ProviderTableMeta.FILE_PARENT));;
+ }
+ folderCursor.close();
+
+ // read and sum sizes of children
+ long childrenSize = 0;
+ Uri selectChildrenUri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_DIR, folderId);
+ String[] childrenProjection = new String[] { ProviderTableMeta.FILE_CONTENT_LENGTH, ProviderTableMeta.FILE_PARENT};
+ String childrenWhere = ProviderTableMeta.FILE_PARENT + "=?";
+ Cursor childrenCursor = query(db, selectChildrenUri, childrenProjection, childrenWhere, whereArgs, null);
+ if (childrenCursor != null && childrenCursor.moveToFirst()) {
+ while (!childrenCursor.isAfterLast()) {
+ childrenSize += childrenCursor.getLong(childrenCursor.getColumnIndex(ProviderTableMeta.FILE_CONTENT_LENGTH));
+ childrenCursor.moveToNext();
+ }
+ }
+ childrenCursor.close();
+
+ // update if needed
+ if (folderSize != childrenSize) {
+ Log_OC.d("FileContentProvider", "Updating " + folderSize + " to " + childrenSize);
+ ContentValues cv = new ContentValues();
+ cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, childrenSize);
+ count = db.update(ProviderTableMeta.FILE_TABLE_NAME, cv, folderWhere, whereArgs);
+
+ // propagate update until root
+ if (folderParentId > FileDataStorageManager.ROOT_PARENT_ID) {
+ Log_OC.d("FileContentProvider", "Propagating update to " + folderParentId);
+ updateFolderSize(db, String.valueOf(folderParentId));
+ } else {
+ Log_OC.d("FileContentProvider", "NOT propagating to " + folderParentId);
+ }
+ } else {
+ Log_OC.d("FileContentProvider", "NOT updating, sizes are " + folderSize + " and " + childrenSize);
+ }
+ return count;
}
+*/
+
+ @Override
+ public ContentProviderResult[] applyBatch (ArrayList<ContentProviderOperation> operations) throws OperationApplicationException {
+ Log_OC.d("FileContentProvider", "applying batch in provider " + this + " (temporary: " + isTemporary() + ")" );
+ ContentProviderResult[] results = new ContentProviderResult[operations.size()];
+ int i=0;
+
+ SQLiteDatabase db = mDbHelper.getWritableDatabase();
+ db.beginTransaction(); // it's supposed that transactions can be nested
+ try {
+ for (ContentProviderOperation operation : operations) {
+ results[i] = operation.apply(this, results, i);
+ i++;
+ }
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ }
+ Log_OC.d("FileContentProvider", "applied batch in provider " + this);
+ return results;
+ }
+
class DataBaseHelper extends SQLiteOpenHelper {
public void onCreate(SQLiteDatabase db) {
// files table
Log_OC.i("SQL", "Entering in onCreate");
- db.execSQL("CREATE TABLE " + ProviderTableMeta.DB_NAME + "("
+ db.execSQL("CREATE TABLE " + ProviderTableMeta.FILE_TABLE_NAME + "("
+ ProviderTableMeta._ID + " INTEGER PRIMARY KEY, "
+ ProviderTableMeta.FILE_NAME + " TEXT, "
+ ProviderTableMeta.FILE_PATH + " TEXT, "
+ ProviderTableMeta.FILE_LAST_SYNC_DATE + " INTEGER, "
+ ProviderTableMeta.FILE_KEEP_IN_SYNC + " INTEGER, "
+ ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA + " INTEGER, "
- + ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA + " INTEGER );"
+ + ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA + " INTEGER, "
+ + ProviderTableMeta.FILE_ETAG + " TEXT, "
+ + ProviderTableMeta.FILE_SHARE_BY_LINK + " INTEGER, "
+ + ProviderTableMeta.FILE_PUBLIC_LINK + " TEXT );"
);
+
+ // Create table ocshares
+ db.execSQL("CREATE TABLE " + ProviderTableMeta.OCSHARES_TABLE_NAME + "("
+ + ProviderTableMeta._ID + " INTEGER PRIMARY KEY, "
+ + ProviderTableMeta.OCSHARES_FILE_SOURCE + " INTEGER, "
+ + ProviderTableMeta.OCSHARES_ITEM_SOURCE + " INTEGER, "
+ + ProviderTableMeta.OCSHARES_SHARE_TYPE + " INTEGER, "
+ + ProviderTableMeta.OCSHARES_SHARE_WITH + " TEXT, "
+ + ProviderTableMeta.OCSHARES_PATH + " TEXT, "
+ + ProviderTableMeta.OCSHARES_PERMISSIONS+ " INTEGER, "
+ + ProviderTableMeta.OCSHARES_SHARED_DATE + " INTEGER, "
+ + ProviderTableMeta.OCSHARES_EXPIRATION_DATE + " INTEGER, "
+ + ProviderTableMeta.OCSHARES_TOKEN + " TEXT, "
+ + ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME + " TEXT, "
+ + ProviderTableMeta.OCSHARES_IS_DIRECTORY + " INTEGER, " // boolean
+ + ProviderTableMeta.OCSHARES_USER_ID + " INTEGER, "
+ + ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + " INTEGER,"
+ + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + " TEXT );" );
}
@Override
boolean upgraded = false;
if (oldVersion == 1 && newVersion >= 2) {
Log_OC.i("SQL", "Entering in the #1 ADD in onUpgrade");
- db.execSQL("ALTER TABLE " + ProviderTableMeta.DB_NAME +
+ db.execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
" ADD COLUMN " + ProviderTableMeta.FILE_KEEP_IN_SYNC + " INTEGER " +
" DEFAULT 0");
upgraded = true;
Log_OC.i("SQL", "Entering in the #2 ADD in onUpgrade");
db.beginTransaction();
try {
- db.execSQL("ALTER TABLE " + ProviderTableMeta.DB_NAME +
+ db.execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
" ADD COLUMN " + ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA + " INTEGER " +
" DEFAULT 0");
// assume there are not local changes pending to upload
- db.execSQL("UPDATE " + ProviderTableMeta.DB_NAME +
+ db.execSQL("UPDATE " + ProviderTableMeta.FILE_TABLE_NAME +
" SET " + ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA + " = " + System.currentTimeMillis() +
" WHERE " + ProviderTableMeta.FILE_STORAGE_PATH + " IS NOT NULL");
Log_OC.i("SQL", "Entering in the #3 ADD in onUpgrade");
db.beginTransaction();
try {
- db .execSQL("ALTER TABLE " + ProviderTableMeta.DB_NAME +
+ db .execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
" ADD COLUMN " + ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA + " INTEGER " +
" DEFAULT 0");
- db.execSQL("UPDATE " + ProviderTableMeta.DB_NAME +
+ db.execSQL("UPDATE " + ProviderTableMeta.FILE_TABLE_NAME +
" SET " + ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA + " = " + ProviderTableMeta.FILE_MODIFIED +
" WHERE " + ProviderTableMeta.FILE_STORAGE_PATH + " IS NOT NULL");
}
if (!upgraded)
Log_OC.i("SQL", "OUT of the ADD in onUpgrade; oldVersion == " + oldVersion + ", newVersion == " + newVersion);
+
+ if (oldVersion < 5 && newVersion >= 5) {
+ Log_OC.i("SQL", "Entering in the #4 ADD in onUpgrade");
+ db.beginTransaction();
+ try {
+ db .execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
+ " ADD COLUMN " + ProviderTableMeta.FILE_ETAG + " TEXT " +
+ " DEFAULT NULL");
+
+ upgraded = true;
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ }
+ }
+ if (!upgraded)
+ Log_OC.i("SQL", "OUT of the ADD in onUpgrade; oldVersion == " + oldVersion + ", newVersion == " + newVersion);
+
+ if (oldVersion < 6 && newVersion >= 6) {
+ Log_OC.i("SQL", "Entering in the #5 ADD in onUpgrade");
+ db.beginTransaction();
+ try {
+ db .execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
+ " ADD COLUMN " + ProviderTableMeta.FILE_SHARE_BY_LINK + " INTEGER " +
+ " DEFAULT 0");
+
+ db .execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
+ " ADD COLUMN " + ProviderTableMeta.FILE_PUBLIC_LINK + " TEXT " +
+ " DEFAULT NULL");
+
+ // Create table ocshares
+ db.execSQL("CREATE TABLE " + ProviderTableMeta.OCSHARES_TABLE_NAME + "("
+ + ProviderTableMeta._ID + " INTEGER PRIMARY KEY, "
+ + ProviderTableMeta.OCSHARES_FILE_SOURCE + " INTEGER, "
+ + ProviderTableMeta.OCSHARES_ITEM_SOURCE + " INTEGER, "
+ + ProviderTableMeta.OCSHARES_SHARE_TYPE + " INTEGER, "
+ + ProviderTableMeta.OCSHARES_SHARE_WITH + " TEXT, "
+ + ProviderTableMeta.OCSHARES_PATH + " TEXT, "
+ + ProviderTableMeta.OCSHARES_PERMISSIONS+ " INTEGER, "
+ + ProviderTableMeta.OCSHARES_SHARED_DATE + " INTEGER, "
+ + ProviderTableMeta.OCSHARES_EXPIRATION_DATE + " INTEGER, "
+ + ProviderTableMeta.OCSHARES_TOKEN + " TEXT, "
+ + ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME + " TEXT, "
+ + ProviderTableMeta.OCSHARES_IS_DIRECTORY + " INTEGER, " // boolean
+ + ProviderTableMeta.OCSHARES_USER_ID + " INTEGER, "
+ + ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + " INTEGER,"
+ + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + " TEXT );" );
+
+ upgraded = true;
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ }
+ }
+ if (!upgraded)
+ Log_OC.i("SQL", "OUT of the ADD in onUpgrade; oldVersion == " + oldVersion + ", newVersion == " + newVersion);
}
-
}
}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2014 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.services;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.ConcurrentMap;
+
+import com.owncloud.android.R;
+import com.owncloud.android.datamodel.FileDataStorageManager;
+import com.owncloud.android.lib.common.OwnCloudClientFactory;
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.resources.files.ExistenceCheckRemoteOperation;
+import com.owncloud.android.lib.resources.shares.ShareType;
+import com.owncloud.android.lib.resources.users.GetRemoteUserNameOperation;
+import com.owncloud.android.operations.common.SyncOperation;
+import com.owncloud.android.operations.CreateShareOperation;
+import com.owncloud.android.operations.GetServerInfoOperation;
+import com.owncloud.android.operations.OAuth2GetAccessToken;
+import com.owncloud.android.operations.UnshareLinkOperation;
+import com.owncloud.android.utils.Log_OC;
+
+import android.accounts.Account;
+import android.accounts.AccountsException;
+import android.app.Service;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Binder;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Process;
+import android.util.Pair;
+
+public class OperationsService extends Service {
+
+ private static final String TAG = OperationsService.class.getSimpleName();
+
+ public static final String EXTRA_ACCOUNT = "ACCOUNT";
+ public static final String EXTRA_SERVER_URL = "SERVER_URL";
+ public static final String EXTRA_AUTH_TOKEN_TYPE = "AUTH_TOKEN_TYPE";
+ public static final String EXTRA_OAUTH2_QUERY_PARAMETERS = "OAUTH2_QUERY_PARAMETERS";
+ public static final String EXTRA_REMOTE_PATH = "REMOTE_PATH";
+ public static final String EXTRA_SEND_INTENT = "SEND_INTENT";
+ public static final String EXTRA_RESULT = "RESULT";
+
+ // TODO review if ALL OF THEM are necessary
+ public static final String EXTRA_WEBDAV_PATH = "WEBDAV_PATH";
+ public static final String EXTRA_SUCCESS_IF_ABSENT = "SUCCESS_IF_ABSENT";
+ public static final String EXTRA_USERNAME = "USERNAME";
+ public static final String EXTRA_PASSWORD = "PASSWORD";
+ public static final String EXTRA_AUTH_TOKEN = "AUTH_TOKEN";
+ public static final String EXTRA_FOLLOW_REDIRECTS = "FOLLOW_REDIRECTS";
+ public static final String EXTRA_COOKIE = "COOKIE";
+
+ public static final String ACTION_CREATE_SHARE = "CREATE_SHARE";
+ public static final String ACTION_UNSHARE = "UNSHARE";
+ public static final String ACTION_GET_SERVER_INFO = "GET_SERVER_INFO";
+ public static final String ACTION_OAUTH2_GET_ACCESS_TOKEN = "OAUTH2_GET_ACCESS_TOKEN";
+ public static final String ACTION_EXISTENCE_CHECK = "EXISTENCE_CHECK";
+ public static final String ACTION_GET_USER_NAME = "GET_USER_NAME";
+
+ public static final String ACTION_OPERATION_ADDED = OperationsService.class.getName() + ".OPERATION_ADDED";
+ public static final String ACTION_OPERATION_FINISHED = OperationsService.class.getName() + ".OPERATION_FINISHED";
+
+ private ConcurrentLinkedQueue<Pair<Target, RemoteOperation>> mPendingOperations =
+ new ConcurrentLinkedQueue<Pair<Target, RemoteOperation>>();
+
+ /*
+ private ConcurrentMap<Integer, RemoteOperationResult> mOperationResults =
+ new ConcurrentHashMap<Integer, RemoteOperationResult>();
+ */
+
+ private ConcurrentMap<Integer, Pair<RemoteOperation, RemoteOperationResult>>
+ mUndispatchedFinishedOperations =
+ new ConcurrentHashMap<Integer, Pair<RemoteOperation, RemoteOperationResult>>();
+
+ private static class Target {
+ public Uri mServerUrl = null;
+ public Account mAccount = null;
+ public String mWebDavUrl = null;
+ public String mUsername = null;
+ public String mPassword = null;
+ public String mAuthToken = null;
+ public boolean mFollowRedirects = true;
+ public String mCookie = null;
+
+ public Target(Account account, Uri serverUrl, String webdavUrl, String username, String password, String authToken,
+ boolean followRedirects, String cookie) {
+ mAccount = account;
+ mServerUrl = serverUrl;
+ mWebDavUrl = webdavUrl;
+ mUsername = username;
+ mPassword = password;
+ mAuthToken = authToken;
+ mFollowRedirects = followRedirects;
+ mCookie = cookie;
+ }
+ }
+
+ private Looper mServiceLooper;
+ private ServiceHandler mServiceHandler;
+ private OperationsServiceBinder mBinder;
+ private OwnCloudClient mOwnCloudClient = null;
+ private Target mLastTarget = null;
+ private FileDataStorageManager mStorageManager;
+ private RemoteOperation mCurrentOperation = null;
+
+
+ /**
+ * Service initialization
+ */
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ HandlerThread thread = new HandlerThread("Operations service thread", Process.THREAD_PRIORITY_BACKGROUND);
+ thread.start();
+ mServiceLooper = thread.getLooper();
+ mServiceHandler = new ServiceHandler(mServiceLooper, this);
+ mBinder = new OperationsServiceBinder();
+ }
+
+
+ /**
+ * Entry point to add a new operation to the queue of operations.
+ *
+ * New operations are added calling to startService(), resulting in a call to this method.
+ * This ensures the service will keep on working although the caller activity goes away.
+ *
+ * IMPORTANT: the only operations performed here right now is {@link GetSharedFilesOperation}. The class
+ * is taking advantage of it due to time constraints.
+ */
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ //Log_OC.wtf(TAG, "onStartCommand init" );
+ Message msg = mServiceHandler.obtainMessage();
+ msg.arg1 = startId;
+ mServiceHandler.sendMessage(msg);
+ //Log_OC.wtf(TAG, "onStartCommand end" );
+ return START_NOT_STICKY;
+ }
+
+ @Override
+ public void onDestroy() {
+ //Log_OC.wtf(TAG, "onDestroy init" );
+ super.onDestroy();
+ //Log_OC.wtf(TAG, "Clear mUndispatchedFinisiedOperations" );
+ mUndispatchedFinishedOperations.clear();
+ //Log_OC.wtf(TAG, "onDestroy end" );
+ }
+
+
+ /**
+ * Provides a binder object that clients can use to perform actions on the queue of operations,
+ * except the addition of new operations.
+ */
+ @Override
+ public IBinder onBind(Intent intent) {
+ //Log_OC.wtf(TAG, "onBind" );
+ return mBinder;
+ }
+
+
+ /**
+ * Called when ALL the bound clients were unbound.
+ */
+ @Override
+ public boolean onUnbind(Intent intent) {
+ ((OperationsServiceBinder)mBinder).clearListeners();
+ return false; // not accepting rebinding (default behaviour)
+ }
+
+
+ /**
+ * Binder to let client components to perform actions on the queue of operations.
+ *
+ * It provides by itself the available operations.
+ */
+ public class OperationsServiceBinder extends Binder /* implements OnRemoteOperationListener */ {
+
+ /**
+ * Map of listeners that will be reported about the end of operations from a {@link OperationsServiceBinder} instance
+ */
+ private ConcurrentMap<OnRemoteOperationListener, Handler> mBoundListeners =
+ new ConcurrentHashMap<OnRemoteOperationListener, Handler>();
+
+ /**
+ * Cancels an operation
+ *
+ * TODO
+ */
+ public void cancel() {
+ // TODO
+ }
+
+
+ public void clearListeners() {
+
+ mBoundListeners.clear();
+ }
+
+
+ /**
+ * Adds a listener interested in being reported about the end of operations.
+ *
+ * @param listener Object to notify about the end of operations.
+ * @param callbackHandler {@link Handler} to access the listener without breaking Android threading protection.
+ */
+ public void addOperationListener (OnRemoteOperationListener listener, Handler callbackHandler) {
+ synchronized (mBoundListeners) {
+ mBoundListeners.put(listener, callbackHandler);
+ }
+ }
+
+
+ /**
+ * Removes a listener from the list of objects interested in the being reported about the end of operations.
+ *
+ * @param listener Object to notify about progress of transfer.
+ */
+ public void removeOperationListener (OnRemoteOperationListener listener) {
+ synchronized (mBoundListeners) {
+ mBoundListeners.remove(listener);
+ }
+ }
+
+
+ /**
+ * TODO - IMPORTANT: update implementation when more operations are moved into the service
+ *
+ * @return 'True' when an operation that enforces the user to wait for completion is in process.
+ */
+ public boolean isPerformingBlockingOperation() {
+ return (!mPendingOperations.isEmpty());
+ }
+
+
+ /**
+ * Creates and adds to the queue a new operation, as described by operationIntent
+ *
+ * @param operationIntent Intent describing a new operation to queue and execute.
+ * @return Identifier of the operation created, or null if failed.
+ */
+ public long newOperation(Intent operationIntent) {
+ RemoteOperation operation = null;
+ Target target = null;
+ try {
+ if (!operationIntent.hasExtra(EXTRA_ACCOUNT) &&
+ !operationIntent.hasExtra(EXTRA_SERVER_URL)) {
+ Log_OC.e(TAG, "Not enough information provided in intent");
+
+ } else {
+ Account account = operationIntent.getParcelableExtra(EXTRA_ACCOUNT);
+ String serverUrl = operationIntent.getStringExtra(EXTRA_SERVER_URL);
+ String webDavPath = operationIntent.getStringExtra(EXTRA_WEBDAV_PATH);
+ String webDavUrl = serverUrl + webDavPath;
+ String username = operationIntent.getStringExtra(EXTRA_USERNAME);
+ String password = operationIntent.getStringExtra(EXTRA_PASSWORD);
+ String authToken = operationIntent.getStringExtra(EXTRA_AUTH_TOKEN);
+ boolean followRedirects = operationIntent.getBooleanExtra(EXTRA_FOLLOW_REDIRECTS, true);
+ String cookie = operationIntent.getStringExtra(EXTRA_COOKIE);
+ target = new Target(
+ account,
+ (serverUrl == null) ? null : Uri.parse(serverUrl),
+ ((webDavPath == null) || (serverUrl == null)) ? null : webDavUrl,
+ username,
+ password,
+ authToken,
+ followRedirects,
+ cookie
+ );
+
+ String action = operationIntent.getAction();
+ if (action.equals(ACTION_CREATE_SHARE)) { // Create Share
+ String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
+ Intent sendIntent = operationIntent.getParcelableExtra(EXTRA_SEND_INTENT);
+ if (remotePath.length() > 0) {
+ operation = new CreateShareOperation(remotePath, ShareType.PUBLIC_LINK,
+ "", false, "", 1, sendIntent);
+ }
+
+ } else if (action.equals(ACTION_UNSHARE)) { // Unshare file
+ String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
+ if (remotePath.length() > 0) {
+ operation = new UnshareLinkOperation(
+ remotePath,
+ OperationsService.this);
+ }
+
+ } else if (action.equals(ACTION_GET_SERVER_INFO)) {
+ // check OC server and get basic information from it
+ String authTokenType =
+ operationIntent.getStringExtra(EXTRA_AUTH_TOKEN_TYPE);
+ operation = new GetServerInfoOperation(
+ serverUrl, authTokenType, OperationsService.this);
+
+ } else if (action.equals(ACTION_OAUTH2_GET_ACCESS_TOKEN)) {
+ /// GET ACCESS TOKEN to the OAuth server
+ String oauth2QueryParameters =
+ operationIntent.getStringExtra(EXTRA_OAUTH2_QUERY_PARAMETERS);
+ operation = new OAuth2GetAccessToken(
+ getString(R.string.oauth2_client_id),
+ getString(R.string.oauth2_redirect_uri),
+ getString(R.string.oauth2_grant_type),
+ oauth2QueryParameters);
+
+ } else if (action.equals(ACTION_EXISTENCE_CHECK)) {
+ // Existence Check
+ String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
+ boolean successIfAbsent = operationIntent.getBooleanExtra(EXTRA_SUCCESS_IF_ABSENT, true);
+ operation = new ExistenceCheckRemoteOperation(remotePath, OperationsService.this, successIfAbsent);
+
+ } else if (action.equals(ACTION_GET_USER_NAME)) {
+ // Get User Name
+ operation = new GetRemoteUserNameOperation();
+ }
+ }
+
+ } catch (IllegalArgumentException e) {
+ Log_OC.e(TAG, "Bad information provided in intent: " + e.getMessage());
+ operation = null;
+ }
+
+ if (operation != null) {
+ mPendingOperations.add(new Pair<Target , RemoteOperation>(target, operation));
+ startService(new Intent(OperationsService.this, OperationsService.class));
+ //Log_OC.wtf(TAG, "New operation added, opId: " + operation.hashCode());
+ // better id than hash? ; should be good enough by the time being
+ return operation.hashCode();
+
+ } else {
+ //Log_OC.wtf(TAG, "New operation failed, returned Long.MAX_VALUE");
+ return Long.MAX_VALUE;
+ }
+ }
+
+ public void dispatchResultIfFinished(int operationId, OnRemoteOperationListener listener) {
+ Pair<RemoteOperation, RemoteOperationResult> undispatched =
+ mUndispatchedFinishedOperations.remove(operationId);
+ if (undispatched != null) {
+ listener.onRemoteOperationFinish(undispatched.first, undispatched.second);
+ //Log_OC.wtf(TAG, "Sending callback later");
+ } else {
+ //Log_OC.wtf(TAG, "Not finished yet");
+ }
+ }
+
+ }
+
+
+ /**
+ * Operations worker. Performs the pending operations in the order they were requested.
+ *
+ * Created with the Looper of a new thread, started in {@link OperationsService#onCreate()}.
+ */
+ private static class ServiceHandler extends Handler {
+ // don't make it a final class, and don't remove the static ; lint will warn about a possible memory leak
+ OperationsService mService;
+ public ServiceHandler(Looper looper, OperationsService service) {
+ super(looper);
+ if (service == null) {
+ throw new IllegalArgumentException("Received invalid NULL in parameter 'service'");
+ }
+ mService = service;
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ mService.nextOperation();
+ mService.stopSelf(msg.arg1);
+ }
+ }
+
+
+ /**
+ * Performs the next operation in the queue
+ */
+ private void nextOperation() {
+
+ //Log_OC.wtf(TAG, "nextOperation init" );
+
+ Pair<Target, RemoteOperation> next = null;
+ synchronized(mPendingOperations) {
+ next = mPendingOperations.peek();
+ }
+
+ if (next != null) {
+
+ mCurrentOperation = next.second;
+ RemoteOperationResult result = null;
+ try {
+ /// prepare client object to send the request to the ownCloud server
+ if (mLastTarget == null || !mLastTarget.equals(next.first)) {
+ mLastTarget = next.first;
+ if (mLastTarget.mAccount != null) {
+ mOwnCloudClient = OwnCloudClientFactory.createOwnCloudClient(mLastTarget.mAccount, getApplicationContext());
+ mStorageManager = new FileDataStorageManager(mLastTarget.mAccount, getContentResolver());
+ } else {
+ mOwnCloudClient = OwnCloudClientFactory.createOwnCloudClient(mLastTarget.mServerUrl, getApplicationContext(),
+ mLastTarget.mFollowRedirects); // this is not good enough
+ if (mLastTarget.mWebDavUrl != null) {
+ mOwnCloudClient.setWebdavUri(Uri.parse(mLastTarget.mWebDavUrl));
+ }
+ if (mLastTarget.mUsername != null && mLastTarget.mPassword != null) {
+ mOwnCloudClient.setBasicCredentials(mLastTarget.mUsername, mLastTarget.mPassword);
+ } else if (mLastTarget.mAuthToken != null) {
+ mOwnCloudClient.setBearerCredentials(mLastTarget.mAuthToken);
+ } else if (mLastTarget.mCookie != null) {
+ mOwnCloudClient.setSsoSessionCookie(mLastTarget.mCookie);
+ }
+ mStorageManager = null;
+ }
+ }
+
+ /// perform the operation
+ if (mCurrentOperation instanceof SyncOperation) {
+ result = ((SyncOperation)mCurrentOperation).execute(mOwnCloudClient, mStorageManager);
+ } else {
+ result = mCurrentOperation.execute(mOwnCloudClient);
+ }
+
+ } catch (AccountsException e) {
+ if (mLastTarget.mAccount == null) {
+ Log_OC.e(TAG, "Error while trying to get autorization for a NULL account", e);
+ } else {
+ Log_OC.e(TAG, "Error while trying to get autorization for " + mLastTarget.mAccount.name, e);
+ }
+ result = new RemoteOperationResult(e);
+
+ } catch (IOException e) {
+ if (mLastTarget.mAccount == null) {
+ Log_OC.e(TAG, "Error while trying to get autorization for a NULL account", e);
+ } else {
+ Log_OC.e(TAG, "Error while trying to get autorization for " + mLastTarget.mAccount.name, e);
+ }
+ result = new RemoteOperationResult(e);
+ } catch (Exception e) {
+ if (mLastTarget.mAccount == null) {
+ Log_OC.e(TAG, "Unexpected error for a NULL account", e);
+ } else {
+ Log_OC.e(TAG, "Unexpected error for " + mLastTarget.mAccount.name, e);
+ }
+ result = new RemoteOperationResult(e);
+
+ } finally {
+ synchronized(mPendingOperations) {
+ mPendingOperations.poll();
+ }
+ }
+
+ //sendBroadcastOperationFinished(mLastTarget, mCurrentOperation, result);
+ dispatchResultToOperationListeners(mLastTarget, mCurrentOperation, result);
+ }
+ }
+
+
+ /**
+ * Sends a broadcast when a new operation is added to the queue.
+ *
+ * Local broadcasts are only delivered to activities in the same process, but can't be done sticky :\
+ *
+ * @param target Account or URL pointing to an OC server.
+ * @param operation Added operation.
+ */
+ private void sendBroadcastNewOperation(Target target, RemoteOperation operation) {
+ Intent intent = new Intent(ACTION_OPERATION_ADDED);
+ if (target.mAccount != null) {
+ intent.putExtra(EXTRA_ACCOUNT, target.mAccount);
+ } else {
+ intent.putExtra(EXTRA_SERVER_URL, target.mServerUrl);
+ }
+ //LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
+ //lbm.sendBroadcast(intent);
+ sendStickyBroadcast(intent);
+ }
+
+
+ // TODO - maybe add a notification for real start of operations
+
+ /**
+ * Sends a LOCAL broadcast when an operations finishes in order to the interested activities can update their view
+ *
+ * Local broadcasts are only delivered to activities in the same process.
+ *
+ * @param target Account or URL pointing to an OC server.
+ * @param operation Finished operation.
+ * @param result Result of the operation.
+ */
+ private void sendBroadcastOperationFinished(Target target, RemoteOperation operation, RemoteOperationResult result) {
+ Intent intent = new Intent(ACTION_OPERATION_FINISHED);
+ intent.putExtra(EXTRA_RESULT, result);
+ if (target.mAccount != null) {
+ intent.putExtra(EXTRA_ACCOUNT, target.mAccount);
+ } else {
+ intent.putExtra(EXTRA_SERVER_URL, target.mServerUrl);
+ }
+ //LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
+ //lbm.sendBroadcast(intent);
+ sendStickyBroadcast(intent);
+ }
+
+
+ /**
+ * Notifies the currently subscribed listeners about the end of an operation.
+ *
+ * @param target Account or URL pointing to an OC server.
+ * @param operation Finished operation.
+ * @param result Result of the operation.
+ */
+ private void dispatchResultToOperationListeners(
+ Target target, final RemoteOperation operation, final RemoteOperationResult result) {
+ int count = 0;
+ Iterator<OnRemoteOperationListener> listeners = mBinder.mBoundListeners.keySet().iterator();
+ while (listeners.hasNext()) {
+ final OnRemoteOperationListener listener = listeners.next();
+ final Handler handler = mBinder.mBoundListeners.get(listener);
+ if (handler != null) {
+ handler.post(new Runnable() {
+ @Override
+ public void run() {
+ listener.onRemoteOperationFinish(operation, result);
+ }
+ });
+ count += 1;
+ }
+ }
+ if (count == 0) {
+ //mOperationResults.put(operation.hashCode(), result);
+ Pair<RemoteOperation, RemoteOperationResult> undispatched =
+ new Pair<RemoteOperation, RemoteOperationResult>(operation, result);
+ mUndispatchedFinishedOperations.put(operation.hashCode(), undispatched);
+ }
+ Log_OC.d(TAG, "Called " + count + " listeners");
+ }
+
+
+}
package com.owncloud.android.syncadapter;\r
\r
import java.io.IOException;\r
-import java.net.UnknownHostException;\r
-import java.util.Date;\r
\r
import org.apache.http.HttpRequest;\r
import org.apache.http.HttpResponse;\r
import org.apache.http.client.ClientProtocolException;\r
-import org.apache.http.conn.ConnectionKeepAliveStrategy;\r
-import org.apache.http.protocol.HttpContext;\r
\r
-import com.owncloud.android.AccountUtils;\r
-import com.owncloud.android.datamodel.DataStorageManager;\r
-import com.owncloud.android.network.OwnCloudClientUtils;\r
+import com.owncloud.android.datamodel.FileDataStorageManager;\r
+import com.owncloud.android.lib.common.accounts.AccountUtils;\r
+import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException;\r
+import com.owncloud.android.lib.common.OwnCloudClientFactory;\r
+import com.owncloud.android.lib.common.OwnCloudClient;\r
+\r
\r
import android.accounts.Account;\r
import android.accounts.AccountManager;\r
import android.content.AbstractThreadedSyncAdapter;\r
import android.content.ContentProviderClient;\r
import android.content.Context;\r
-import eu.alefzero.webdav.WebdavClient;\r
\r
/**\r
- * Base SyncAdapter for OwnCloud Designed to be subclassed for the concrete\r
- * SyncAdapter, like ConcatsSync, CalendarSync, FileSync etc..\r
+ * Base synchronization adapter for ownCloud designed to be subclassed for different\r
+ * resource types, like FileSync, ConcatsSync, CalendarSync, etc..\r
* \r
- * @author sassman\r
+ * Implements the standard {@link AbstractThreadedSyncAdapter}.\r
* \r
+ * @author sassman\r
+ * @author David A. Velasco\r
*/\r
public abstract class AbstractOwnCloudSyncAdapter extends\r
AbstractThreadedSyncAdapter {\r
\r
private AccountManager accountManager;\r
private Account account;\r
- private ContentProviderClient contentProvider;\r
- private Date lastUpdated;\r
- private DataStorageManager mStoreManager;\r
+ private ContentProviderClient mContentProviderClient;\r
+ private FileDataStorageManager mStoreManager;\r
\r
- private WebdavClient mClient = null;\r
+ private OwnCloudClient mClient = null;\r
\r
public AbstractOwnCloudSyncAdapter(Context context, boolean autoInitialize) {\r
super(context, autoInitialize);\r
this.setAccountManager(AccountManager.get(context));\r
}\r
\r
+ public AbstractOwnCloudSyncAdapter(Context context, boolean autoInitialize, boolean allowParallelSyncs) {\r
+ super(context, autoInitialize, allowParallelSyncs);\r
+ this.setAccountManager(AccountManager.get(context));\r
+ }\r
+\r
public AccountManager getAccountManager() {\r
return accountManager;\r
}\r
this.account = account;\r
}\r
\r
- public ContentProviderClient getContentProvider() {\r
- return contentProvider;\r
- }\r
-\r
- public void setContentProvider(ContentProviderClient contentProvider) {\r
- this.contentProvider = contentProvider;\r
- }\r
-\r
- public Date getLastUpdated() {\r
- return lastUpdated;\r
+ public ContentProviderClient getContentProviderClient() {\r
+ return mContentProviderClient;\r
}\r
\r
- public void setLastUpdated(Date lastUpdated) {\r
- this.lastUpdated = lastUpdated;\r
+ public void setContentProviderClient(ContentProviderClient contentProvider) {\r
+ this.mContentProviderClient = contentProvider;\r
}\r
\r
- public void setStorageManager(DataStorageManager storage_manager) {\r
+ public void setStorageManager(FileDataStorageManager storage_manager) {\r
mStoreManager = storage_manager;\r
}\r
\r
- public DataStorageManager getStorageManager() {\r
+ public FileDataStorageManager getStorageManager() {\r
return mStoreManager;\r
}\r
\r
- protected ConnectionKeepAliveStrategy getKeepAliveStrategy() {\r
- return new ConnectionKeepAliveStrategy() {\r
- public long getKeepAliveDuration(HttpResponse response,\r
- HttpContext context) {\r
- // Change keep alive straategy basing on response: ie\r
- // forbidden/not found/etc\r
- // should have keep alive 0\r
- // default return: 5s\r
- int statusCode = response.getStatusLine().getStatusCode();\r
-\r
- // HTTP 400, 500 Errors as well as HTTP 118 - Connection timed\r
- // out\r
- if ((statusCode >= 400 && statusCode <= 418)\r
- || (statusCode >= 421 && statusCode <= 426)\r
- || (statusCode >= 500 && statusCode <= 510)\r
- || statusCode == 118) {\r
- return 0;\r
- }\r
-\r
- return 5 * 1000;\r
- }\r
- };\r
+ protected void initClientForCurrentAccount() throws OperationCanceledException, AuthenticatorException, IOException, AccountNotFoundException {\r
+ AccountUtils.constructFullURLForAccount(getContext(), account);\r
+ mClient = OwnCloudClientFactory.createOwnCloudClient(account, getContext());\r
}\r
-\r
+ \r
+ protected OwnCloudClient getClient() {\r
+ return mClient;\r
+ }\r
+ \r
+ \r
+ /* method called by ContactSyncAdapter, that is never used */\r
protected HttpResponse fireRawRequest(HttpRequest query)\r
throws ClientProtocolException, OperationCanceledException,\r
AuthenticatorException, IOException {\r
- /*\r
- * BasicHttpContext httpContext = new BasicHttpContext(); BasicScheme\r
- * basicAuth = new BasicScheme();\r
- * httpContext.setAttribute("preemptive-auth", basicAuth);\r
- * \r
- * HttpResponse response = getClient().execute(mHost, query,\r
- * httpContext);\r
- */\r
return null;\r
}\r
\r
- protected void initClientForCurrentAccount() throws UnknownHostException {\r
- if (AccountUtils.constructFullURLForAccount(getContext(), account) == null) {\r
- throw new UnknownHostException();\r
- }\r
- mClient = OwnCloudClientUtils.createOwnCloudClient(account, getContext());\r
- }\r
- \r
- protected WebdavClient getClient() {\r
- return mClient;\r
- }\r
}
\ No newline at end of file
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.ByteArrayEntity;
-import com.owncloud.android.AccountUtils;
-import com.owncloud.android.authenticator.AccountAuthenticator;
+import com.owncloud.android.authentication.AccountUtils;
+import com.owncloud.android.lib.common.accounts.AccountUtils.Constants;
+
import android.accounts.Account;
import android.accounts.AccountManager;
public void onPerformSync(Account account, Bundle extras, String authority,
ContentProviderClient provider, SyncResult syncResult) {
setAccount(account);
- setContentProvider(provider);
+ setContentProviderClient(provider);
Cursor c = getLocalContacts(false);
if (c.moveToFirst()) {
do {
AccountManager am = getAccountManager();
@SuppressWarnings("deprecation")
String uri = am.getUserData(getAccount(),
- AccountAuthenticator.KEY_OC_URL).replace(
+ Constants.KEY_OC_URL).replace(
AccountUtils.WEBDAV_PATH_2_0, AccountUtils.CARDDAV_PATH_2_0);
uri += "/addressbooks/"
+ getAccount().name.substring(0,
package com.owncloud.android.syncadapter;
import java.io.IOException;
-import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.apache.jackrabbit.webdav.DavException;
-import com.owncloud.android.Log_OC;
import com.owncloud.android.R;
-import com.owncloud.android.datamodel.DataStorageManager;
+import com.owncloud.android.authentication.AuthenticatorActivity;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.operations.SynchronizeFolderOperation;
import com.owncloud.android.operations.UpdateOCVersionOperation;
-import com.owncloud.android.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
import com.owncloud.android.ui.activity.ErrorsWhileCopyingHandlerActivity;
+import com.owncloud.android.utils.Log_OC;
+
import android.accounts.Account;
-import android.app.Notification;
+import android.accounts.AccountsException;
import android.app.NotificationManager;
import android.app.PendingIntent;
+import android.content.AbstractThreadedSyncAdapter;
import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.SyncResult;
import android.os.Bundle;
-import android.util.Log;
+import android.support.v4.app.NotificationCompat;
/**
- * SyncAdapter implementation for syncing sample SyncAdapter contacts to the
- * platform ContactOperations provider.
+ * Implementation of {@link AbstractThreadedSyncAdapter} responsible for synchronizing
+ * ownCloud files.
+ *
+ * Performs a full synchronization of the account recieved in {@link #onPerformSync(Account, Bundle, String, ContentProviderClient, SyncResult)}.
*
* @author Bartek Przybylski
+ * @author David A. Velasco
*/
public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
- private final static String TAG = "FileSyncAdapter";
+ private final static String TAG = FileSyncAdapter.class.getSimpleName();
- /**
- * Maximum number of failed folder synchronizations that are supported before finishing the synchronization operation
- */
+ /** Maximum number of failed folder synchronizations that are supported before finishing the synchronization operation */
private static final int MAX_FAILED_RESULTS = 3;
+
+ public static final String EVENT_FULL_SYNC_START = FileSyncAdapter.class.getName() + ".EVENT_FULL_SYNC_START";
+ public static final String EVENT_FULL_SYNC_END = FileSyncAdapter.class.getName() + ".EVENT_FULL_SYNC_END";
+ public static final String EVENT_FULL_SYNC_FOLDER_CONTENTS_SYNCED = FileSyncAdapter.class.getName() + ".EVENT_FULL_SYNC_FOLDER_CONTENTS_SYNCED";
+ //public static final String EVENT_FULL_SYNC_FOLDER_SIZE_SYNCED = FileSyncAdapter.class.getName() + ".EVENT_FULL_SYNC_FOLDER_SIZE_SYNCED";
+
+ public static final String EXTRA_ACCOUNT_NAME = FileSyncAdapter.class.getName() + ".EXTRA_ACCOUNT_NAME";
+ public static final String EXTRA_FOLDER_PATH = FileSyncAdapter.class.getName() + ".EXTRA_FOLDER_PATH";
+ public static final String EXTRA_RESULT = FileSyncAdapter.class.getName() + ".EXTRA_RESULT";
+
+
+ /** Time stamp for the current synchronization process, used to distinguish fresh data */
private long mCurrentSyncTime;
+
+ /** Flag made 'true' when a request to cancel the synchronization is received */
private boolean mCancellation;
+
+ /** When 'true' the process was requested by the user through the user interface; when 'false', it was requested automatically by the system */
private boolean mIsManualSync;
- private int mFailedResultsCounter;
+
+ /** Counter for failed operations in the synchronization process */
+ private int mFailedResultsCounter;
+
+ /** Result of the last failed operation */
private RemoteOperationResult mLastFailedResult;
- private SyncResult mSyncResult;
+
+ /** Counter of conflicts found between local and remote files */
private int mConflictsFound;
+
+ /** Counter of failed operations in synchronization of kept-in-sync files */
private int mFailsInFavouritesFound;
+
+ /** Map of remote and local paths to files that where locally stored in a location out of the ownCloud folder and couldn't be copied automatically into it */
private Map<String, String> mForgottenLocalFiles;
+ /** {@link SyncResult} instance to return to the system when the synchronization finish */
+ private SyncResult mSyncResult;
+
+ /** 'True' means that the server supports the share API */
+ private boolean mIsShareSupported;
+
+ /**
+ * Creates a {@link FileSyncAdapter}
+ *
+ * {@inheritDoc}
+ */
public FileSyncAdapter(Context context, boolean autoInitialize) {
super(context, autoInitialize);
}
+
+ /**
+ * Creates a {@link FileSyncAdapter}
+ *
+ * {@inheritDoc}
+ */
+ public FileSyncAdapter(Context context, boolean autoInitialize, boolean allowParallelSyncs) {
+ super(context, autoInitialize, allowParallelSyncs);
+ }
+
+
/**
* {@inheritDoc}
*/
@Override
public synchronized void onPerformSync(Account account, Bundle extras,
- String authority, ContentProviderClient provider,
+ String authority, ContentProviderClient providerClient,
SyncResult syncResult) {
mCancellation = false;
mForgottenLocalFiles = new HashMap<String, String>();
mSyncResult = syncResult;
mSyncResult.fullSyncRequested = false;
- mSyncResult.delayUntil = 60*60*24; // sync after 24h
+ mSyncResult.delayUntil = 60*60*24; // avoid too many automatic synchronizations
this.setAccount(account);
- this.setContentProvider(provider);
- this.setStorageManager(new FileDataStorageManager(account, getContentProvider()));
+ this.setContentProviderClient(providerClient);
+ this.setStorageManager(new FileDataStorageManager(account, providerClient));
+
try {
this.initClientForCurrentAccount();
- } catch (UnknownHostException e) {
- /// the account is unknown for the Synchronization Manager. unreachable for this context; don't try this again
+ } catch (IOException e) {
+ /// the account is unknown for the Synchronization Manager, unreachable this context, or can not be authenticated; don't try this again
+ mSyncResult.tooManyRetries = true;
+ notifyFailedSynchronization();
+ return;
+ } catch (AccountsException e) {
+ /// the account is unknown for the Synchronization Manager, unreachable this context, or can not be authenticated; don't try this again
mSyncResult.tooManyRetries = true;
notifyFailedSynchronization();
return;
}
Log_OC.d(TAG, "Synchronization of ownCloud account " + account.name + " starting");
- sendStickyBroadcast(true, null, null); // message to signal the start of the synchronization to the UI
+ sendLocalBroadcast(EVENT_FULL_SYNC_START, null, null); // message to signal the start of the synchronization to the UI
try {
updateOCVersion();
mCurrentSyncTime = System.currentTimeMillis();
if (!mCancellation) {
- fetchData(OCFile.PATH_SEPARATOR, DataStorageManager.ROOT_PARENT_ID);
+ synchronizeFolder(getStorageManager().getFileByPath(OCFile.ROOT_PATH));
} else {
- Log_OC.d(TAG, "Leaving synchronization before any remote request due to cancellation was requested");
+ Log_OC.d(TAG, "Leaving synchronization before synchronizing the root folder because cancelation request");
}
/// notify the user about the failure of MANUAL synchronization
notifyFailedSynchronization();
-
}
if (mConflictsFound > 0 || mFailsInFavouritesFound > 0) {
notifyFailsInFavourites();
}
if (mForgottenLocalFiles.size() > 0) {
notifyForgottenLocalFiles();
-
}
- sendStickyBroadcast(false, null, mLastFailedResult); // message to signal the end to the UI
+ sendLocalBroadcast(EVENT_FULL_SYNC_END, null, mLastFailedResult); // message to signal the end to the UI
}
}
-
/**
* Called by system SyncManager when a synchronization is required to be cancelled.
*
- * Sets the mCancellation flag to 'true'. THe synchronization will be stopped when before a new folder is fetched. Data of the last folder
- * fetched will be still saved in the database. See onPerformSync implementation.
+ * Sets the mCancellation flag to 'true'. THe synchronization will be stopped later,
+ * before a new folder is fetched. Data of the last folder synchronized will be still
+ * locally saved.
+ *
+ * See {@link #onPerformSync(Account, Bundle, String, ContentProviderClient, SyncResult)}
+ * and {@link #synchronizeFolder(String, long)}.
*/
@Override
public void onSyncCanceled() {
RemoteOperationResult result = update.execute(getClient());
if (!result.isSuccess()) {
mLastFailedResult = result;
+ } else {
+ mIsShareSupported = update.getOCVersion().isSharedSupported();
}
}
-
/**
- * Synchronize the properties of files and folders contained in a remote folder given by remotePath.
+ * Synchronizes the list of files contained in a folder identified with its remote path.
+ *
+ * Fetches the list and properties of the files contained in the given folder, including their
+ * properties, and updates the local database with them.
+ *
+ * Enters in the child folders to synchronize their contents also, following a recursive
+ * depth first strategy.
*
- * @param remotePath Remote path to the folder to synchronize.
- * @param parentId Database Id of the folder to synchronize.
+ * @param folder Folder to synchronize.
*/
- private void fetchData(String remotePath, long parentId) {
+ private void synchronizeFolder(OCFile folder) {
if (mFailedResultsCounter > MAX_FAILED_RESULTS || isFinisher(mLastFailedResult))
return;
- // perform folder synchronization
- SynchronizeFolderOperation synchFolderOp = new SynchronizeFolderOperation( remotePath,
+ /*
+ OCFile folder,
+ long currentSyncTime,
+ boolean updateFolderProperties,
+ boolean syncFullAccount,
+ DataStorageManager dataStorageManager,
+ Account account,
+ Context context ) {
+ }
+ */
+ // folder synchronization
+ SynchronizeFolderOperation synchFolderOp = new SynchronizeFolderOperation( folder,
mCurrentSyncTime,
- parentId,
+ true,
+ mIsShareSupported,
getStorageManager(),
getAccount(),
getContext()
// synchronized folder -> notice to UI - ALWAYS, although !result.isSuccess
- sendStickyBroadcast(true, remotePath, null);
+ sendLocalBroadcast(EVENT_FULL_SYNC_FOLDER_CONTENTS_SYNCED, folder.getRemotePath(), result);
+ // check the result of synchronizing the folder
if (result.isSuccess() || result.getCode() == ResultCode.SYNC_CONFLICT) {
if (result.getCode() == ResultCode.SYNC_CONFLICT) {
if (synchFolderOp.getForgottenLocalFiles().size() > 0) {
mForgottenLocalFiles.putAll(synchFolderOp.getForgottenLocalFiles());
}
- // synchronize children folders
- List<OCFile> children = synchFolderOp.getChildren();
- fetchChildren(children); // beware of the 'hidden' recursion here!
+ if (result.isSuccess()) {
+ // synchronize children folders
+ List<OCFile> children = synchFolderOp.getChildren();
+ fetchChildren(folder, children, synchFolderOp.getRemoteFolderChanged()); // beware of the 'hidden' recursion here!
+ }
} else {
- if (result.getCode() == RemoteOperationResult.ResultCode.UNAUTHORIZED) {
+ // in failures, the statistics for the global result are updated
+ if (result.getCode() == RemoteOperationResult.ResultCode.UNAUTHORIZED ||
+ ( result.isIdPRedirection() &&
+ getClient().getCredentials() == null )) {
+ //MainApp.getAuthTokenTypeSamlSessionCookie().equals(getClient().getAuthTokenType()))) {
mSyncResult.stats.numAuthExceptions++;
} else if (result.getException() instanceof DavException) {
}
/**
- * Synchronize data of folders in the list of received files
+ * Triggers the synchronization of any folder contained in the list of received files.
*
- * @param files Files to recursively fetch
+ * @param files Files to recursively synchronize.
*/
- private void fetchChildren(List<OCFile> files) {
+ private void fetchChildren(OCFile parent, List<OCFile> files, boolean parentEtagChanged) {
int i;
+ OCFile newFile = null;
+ //String etag = null;
+ //boolean syncDown = false;
for (i=0; i < files.size() && !mCancellation; i++) {
- OCFile newFile = files.get(i);
- if (newFile.isDirectory()) {
- fetchData(newFile.getRemotePath(), newFile.getFileId());
+ newFile = files.get(i);
+ if (newFile.isFolder()) {
+ /*
+ etag = newFile.getEtag();
+ syncDown = (parentEtagChanged || etag == null || etag.length() == 0);
+ if(syncDown) { */
+ synchronizeFolder(newFile);
+ //sendLocalBroadcast(EVENT_FULL_SYNC_FOLDER_SIZE_SYNCED, parent.getRemotePath(), null);
+ //}
}
}
- if (mCancellation && i <files.size()) Log_OC.d(TAG, "Leaving synchronization before synchronizing " + files.get(i).getRemotePath() + " because cancelation request");
+
+ if (mCancellation && i <files.size()) Log_OC.d(TAG, "Leaving synchronization before synchronizing " + files.get(i).getRemotePath() + " due to cancelation request");
}
/**
* Sends a message to any application component interested in the progress of the synchronization.
*
- * @param inProgress 'True' when the synchronization progress is not finished.
- * @param dirRemotePath Remote path of a folder that was just synchronized (with or without success)
+ * @param event Event in the process of synchronization to be notified.
+ * @param dirRemotePath Remote path of the folder target of the event occurred.
+ * @param result Result of an individual {@ SynchronizeFolderOperation}, if completed; may be null.
*/
- private void sendStickyBroadcast(boolean inProgress, String dirRemotePath, RemoteOperationResult result) {
- Intent i = new Intent(FileSyncService.SYNC_MESSAGE);
- i.putExtra(FileSyncService.IN_PROGRESS, inProgress);
- i.putExtra(FileSyncService.ACCOUNT_NAME, getAccount().name);
+ private void sendLocalBroadcast(String event, String dirRemotePath, RemoteOperationResult result) {
+ Log_OC.d(TAG, "Send broadcast " + event);
+ Intent intent = new Intent(event);
+ intent.putExtra(FileSyncAdapter.EXTRA_ACCOUNT_NAME, getAccount().name);
if (dirRemotePath != null) {
- i.putExtra(FileSyncService.SYNC_FOLDER_REMOTE_PATH, dirRemotePath);
+ intent.putExtra(FileSyncAdapter.EXTRA_FOLDER_PATH, dirRemotePath);
}
if (result != null) {
- i.putExtra(FileSyncService.SYNC_RESULT, result);
+ intent.putExtra(FileSyncAdapter.EXTRA_RESULT, result);
}
- getContext().sendStickyBroadcast(i);
+ getContext().sendStickyBroadcast(intent);
+ //LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent);
}
* Notifies the user about a failed synchronization through the status notification bar
*/
private void notifyFailedSynchronization() {
- Notification notification = new Notification(R.drawable.icon, getContext().getString(R.string.sync_fail_ticker), System.currentTimeMillis());
- notification.flags |= Notification.FLAG_AUTO_CANCEL;
- // TODO put something smart in the contentIntent below
- notification.contentIntent = PendingIntent.getActivity(getContext().getApplicationContext(), (int)System.currentTimeMillis(), new Intent(), 0);
- notification.setLatestEventInfo(getContext().getApplicationContext(),
- getContext().getString(R.string.sync_fail_ticker),
- String.format(getContext().getString(R.string.sync_fail_content), getAccount().name),
- notification.contentIntent);
- ((NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE)).notify(R.string.sync_fail_ticker, notification);
+ NotificationCompat.Builder notificationBuilder = createNotificationBuilder();
+ notificationBuilder.setTicker(i18n(R.string.sync_fail_ticker));
+ boolean needsToUpdateCredentials = (mLastFailedResult != null &&
+ ( mLastFailedResult.getCode() == ResultCode.UNAUTHORIZED ||
+ ( mLastFailedResult.isIdPRedirection() &&
+ getClient().getCredentials() == null )
+ //MainApp.getAuthTokenTypeSamlSessionCookie().equals(getClient().getAuthTokenType()))
+ )
+ );
+ // TODO put something smart in the contentIntent below for all the possible errors
+ notificationBuilder.setContentTitle(i18n(R.string.sync_fail_ticker));
+ if (needsToUpdateCredentials) {
+ // let the user update credentials with one click
+ Intent updateAccountCredentials = new Intent(getContext(), AuthenticatorActivity.class);
+ updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, getAccount());
+ updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_EXPIRED_TOKEN);
+ updateAccountCredentials.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ updateAccountCredentials.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+ updateAccountCredentials.addFlags(Intent.FLAG_FROM_BACKGROUND);
+ notificationBuilder
+ .setContentIntent(PendingIntent.getActivity(
+ getContext(), (int)System.currentTimeMillis(), updateAccountCredentials, PendingIntent.FLAG_ONE_SHOT
+ ))
+ .setContentText(i18n(R.string.sync_fail_content_unauthorized, getAccount().name));
+ } else {
+ notificationBuilder
+ .setContentText(i18n(R.string.sync_fail_content, getAccount().name));
+ }
+
+ showNotification(R.string.sync_fail_ticker, notificationBuilder);
}
*/
private void notifyFailsInFavourites() {
if (mFailedResultsCounter > 0) {
- Notification notification = new Notification(R.drawable.icon, getContext().getString(R.string.sync_fail_in_favourites_ticker), System.currentTimeMillis());
- notification.flags |= Notification.FLAG_AUTO_CANCEL;
+ NotificationCompat.Builder notificationBuilder = createNotificationBuilder();
+ notificationBuilder.setTicker(i18n(R.string.sync_fail_in_favourites_ticker));
+
// TODO put something smart in the contentIntent below
- notification.contentIntent = PendingIntent.getActivity(getContext().getApplicationContext(), (int)System.currentTimeMillis(), new Intent(), 0);
- notification.setLatestEventInfo(getContext().getApplicationContext(),
- getContext().getString(R.string.sync_fail_in_favourites_ticker),
- String.format(getContext().getString(R.string.sync_fail_in_favourites_content), mFailedResultsCounter + mConflictsFound, mConflictsFound),
- notification.contentIntent);
- ((NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE)).notify(R.string.sync_fail_in_favourites_ticker, notification);
+ notificationBuilder
+ .setContentIntent(PendingIntent.getActivity(
+ getContext(), (int) System.currentTimeMillis(), new Intent(), 0
+ ))
+ .setContentTitle(i18n(R.string.sync_fail_in_favourites_ticker))
+ .setContentText(i18n(R.string.sync_fail_in_favourites_content, mFailedResultsCounter + mConflictsFound, mConflictsFound));
+ showNotification(R.string.sync_fail_in_favourites_ticker, notificationBuilder);
} else {
- Notification notification = new Notification(R.drawable.icon, getContext().getString(R.string.sync_conflicts_in_favourites_ticker), System.currentTimeMillis());
- notification.flags |= Notification.FLAG_AUTO_CANCEL;
+ NotificationCompat.Builder notificationBuilder = createNotificationBuilder();
+ notificationBuilder.setTicker(i18n(R.string.sync_conflicts_in_favourites_ticker));
+
// TODO put something smart in the contentIntent below
- notification.contentIntent = PendingIntent.getActivity(getContext().getApplicationContext(), (int)System.currentTimeMillis(), new Intent(), 0);
- notification.setLatestEventInfo(getContext().getApplicationContext(),
- getContext().getString(R.string.sync_conflicts_in_favourites_ticker),
- String.format(getContext().getString(R.string.sync_conflicts_in_favourites_content), mConflictsFound),
- notification.contentIntent);
- ((NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE)).notify(R.string.sync_conflicts_in_favourites_ticker, notification);
+ notificationBuilder
+ .setContentIntent(PendingIntent.getActivity(
+ getContext(), (int) System.currentTimeMillis(), new Intent(), 0
+ ))
+ .setContentTitle(i18n(R.string.sync_conflicts_in_favourites_ticker))
+ .setContentText(i18n(R.string.sync_conflicts_in_favourites_ticker, mConflictsFound));
+
+ showNotification(R.string.sync_conflicts_in_favourites_ticker, notificationBuilder);
}
}
-
/**
* Notifies the user about local copies of files out of the ownCloud local directory that were 'forgotten' because
* We won't consider a synchronization as failed when foreign files can not be copied to the ownCloud local directory.
*/
private void notifyForgottenLocalFiles() {
- Notification notification = new Notification(R.drawable.icon, getContext().getString(R.string.sync_foreign_files_forgotten_ticker), System.currentTimeMillis());
- notification.flags |= Notification.FLAG_AUTO_CANCEL;
-
+ NotificationCompat.Builder notificationBuilder = createNotificationBuilder();
+ notificationBuilder.setTicker(i18n(R.string.sync_foreign_files_forgotten_ticker));
+
/// includes a pending intent in the notification showing a more detailed explanation
Intent explanationIntent = new Intent(getContext(), ErrorsWhileCopyingHandlerActivity.class);
explanationIntent.putExtra(ErrorsWhileCopyingHandlerActivity.EXTRA_ACCOUNT, getAccount());
explanationIntent.putExtra(ErrorsWhileCopyingHandlerActivity.EXTRA_REMOTE_PATHS, remotePaths);
explanationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- notification.contentIntent = PendingIntent.getActivity(getContext().getApplicationContext(), (int)System.currentTimeMillis(), explanationIntent, 0);
- notification.setLatestEventInfo(getContext().getApplicationContext(),
- getContext().getString(R.string.sync_foreign_files_forgotten_ticker),
- String.format(getContext().getString(R.string.sync_foreign_files_forgotten_content), mForgottenLocalFiles.size(), getContext().getString(R.string.app_name)),
- notification.contentIntent);
- ((NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE)).notify(R.string.sync_foreign_files_forgotten_ticker, notification);
+ notificationBuilder
+ .setContentIntent(PendingIntent.getActivity(
+ getContext(), (int) System.currentTimeMillis(), explanationIntent, 0
+ ))
+ .setContentTitle(i18n(R.string.sync_foreign_files_forgotten_ticker))
+ .setContentText(i18n(R.string.sync_foreign_files_forgotten_content, mForgottenLocalFiles.size(), i18n(R.string.app_name)));
+ showNotification(R.string.sync_foreign_files_forgotten_ticker, notificationBuilder);
}
+ /**
+ * Creates a notification builder with some commonly used settings
+ *
+ * @return
+ */
+ private NotificationCompat.Builder createNotificationBuilder() {
+ NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getContext());
+ notificationBuilder.setSmallIcon(R.drawable.notification_icon).setAutoCancel(true);
+ return notificationBuilder;
+ }
+ /**
+ * Builds and shows the notification
+ *
+ * @param id
+ * @param builder
+ */
+ private void showNotification(int id, NotificationCompat.Builder builder) {
+ ((NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE))
+ .notify(id, builder.build());
+ }
+ /**
+ * Shorthand translation
+ *
+ * @param key
+ * @param args
+ * @return
+ */
+ private String i18n(int key, Object... args) {
+ return getContext().getString(key, args);
+ }
}
import android.os.IBinder;\r
\r
/**\r
- * Background service for syncing files to our local Database\r
+ * Background service for synchronizing remote files with their local state.\r
* \r
- * @author Bartek Przybylski\r
+ * Serves as a connector to an instance of {@link FileSyncAdapter}, as required by standard Android APIs. \r
* \r
+ * @author Bartek Przybylski\r
+ * @author David A. Velasco\r
*/\r
public class FileSyncService extends Service {\r
- public static final String SYNC_MESSAGE = "ACCOUNT_SYNC";\r
- public static final String SYNC_FOLDER_REMOTE_PATH = "SYNC_FOLDER_REMOTE_PATH";\r
- public static final String IN_PROGRESS = "SYNC_IN_PROGRESS";\r
- public static final String ACCOUNT_NAME = "ACCOUNT_NAME";\r
- public static final String SYNC_RESULT = "SYNC_RESULT";\r
-\r
+ \r
+ // Storage for an instance of the sync adapter\r
+ private static FileSyncAdapter sSyncAdapter = null;\r
+ // Object to use as a thread-safe lock\r
+ private static final Object sSyncAdapterLock = new Object();\r
+ \r
/*\r
* {@inheritDoc}\r
*/\r
@Override\r
public void onCreate() {\r
+ synchronized (sSyncAdapterLock) {\r
+ if (sSyncAdapter == null) {\r
+ sSyncAdapter = new FileSyncAdapter(getApplicationContext(), true);\r
+ }\r
+ }\r
}\r
\r
/*\r
*/\r
@Override\r
public IBinder onBind(Intent intent) {\r
- return new FileSyncAdapter(getApplicationContext(), true).getSyncAdapterBinder();\r
+ return sSyncAdapter.getSyncAdapterBinder();\r
}\r
+ \r
}\r
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2014 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.ui;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.TextView;
+import android.preference.CheckBoxPreference;
+
+public class CheckBoxPreferenceWithLongTitle extends CheckBoxPreference{
+
+ public CheckBoxPreferenceWithLongTitle(Context context) {
+ super(context);
+ }
+
+ public CheckBoxPreferenceWithLongTitle(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+ public CheckBoxPreferenceWithLongTitle(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ @Override
+ protected void onBindView(View view) {
+ super.onBindView(view);
+ TextView titleView = (TextView) view.findViewById(android.R.id.title);
+ titleView.setSingleLine(false);
+ titleView.setMaxLines(3);
+ titleView.setEllipsize(null);
+ }
+}
\ No newline at end of file
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.ui;
-
-import com.actionbarsherlock.app.SherlockFragment;
-import com.owncloud.android.R;
-import com.owncloud.android.ui.fragment.LocalFileListFragment;
-
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemLongClickListener;
-import android.widget.ListAdapter;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.ListView;
-
-public class FragmentListView extends SherlockFragment implements
- OnItemClickListener, OnItemLongClickListener {
- protected ExtendedListView mList;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- }
-
- public void setListAdapter(ListAdapter listAdapter) {
- mList.setAdapter(listAdapter);
- mList.invalidate();
- }
-
- public ListView getListView() {
- return mList;
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- //mList = new ExtendedListView(getActivity());
- View v = inflater.inflate(R.layout.list_fragment, null);
- mList = (ExtendedListView)(v.findViewById(R.id.list_root));
- mList.setOnItemClickListener(this);
- mList.setOnItemLongClickListener(this);
- //mList.setEmptyView(v.findViewById(R.id.empty_list_view)); // looks like it's not a cool idea
- mList.setDivider(getResources().getDrawable(R.drawable.uploader_list_separator));
- mList.setDividerHeight(1);
- return v;
- }
-
- public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
- }
-
- @Override
- public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2,
- long arg3) {
- return false;
- }
-
-
- /**
- * Calculates the position of the item that will be used as a reference to reposition the visible items in the list when
- * the device is turned to other position.
- *
- * THe current policy is take as a reference the visible item in the center of the screen.
- *
- * @return The position in the list of the visible item in the center of the screen.
- */
- protected int getReferencePosition() {
- return (mList.getFirstVisiblePosition() + mList.getLastVisiblePosition()) / 2;
- }
-
-
- /**
- * Sets the visible part of the list from the reference position.
- *
- * @param position Reference position previously returned by {@link LocalFileListFragment#getReferencePosition()}
- */
- protected void setReferencePosition(int position) {
- mList.setAndCenterSelection(position);
- }
-
-
-}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2014 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.ui;
+
+import android.content.Context;
+import android.preference.Preference;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.TextView;
+
+/**
+ * Allow multiline titles in preferences
+ *
+ * @author masensio
+ *
+ */
+public class PreferenceMultiline extends Preference {
+
+ public PreferenceMultiline(Context context) {
+ super(context);
+ }
+
+ public PreferenceMultiline(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public PreferenceMultiline(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ @Override
+ protected void onBindView(View view) {
+ super.onBindView(view);
+ TextView titleView = (TextView) view.findViewById(android.R.id.title);
+ titleView.setSingleLine(false);
+ titleView.setMaxLines(3);
+ }
+}
\r
import com.owncloud.android.R;\r
\r
+\r
/**\r
* Popup window, shows action list as icon and text like the one in Gallery3D\r
* app.\r
import android.accounts.AccountManager;
import android.accounts.AccountManagerCallback;
import android.accounts.AccountManagerFuture;
-import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
-import android.util.Log;
import android.view.ContextMenu;
import android.view.View;
import android.view.ViewGroup;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
-import com.owncloud.android.AccountUtils;
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.authenticator.AccountAuthenticator;
-
+import com.owncloud.android.authentication.AuthenticatorActivity;
+import com.owncloud.android.authentication.AccountUtils;
+import com.owncloud.android.lib.common.accounts.AccountUtils.Constants;
+import com.owncloud.android.utils.DisplayUtils;
+import com.owncloud.android.utils.Log_OC;
+import com.owncloud.android.MainApp;
import com.owncloud.android.R;
+
public class AccountSelectActivity extends SherlockListActivity implements
AccountManagerCallback<Boolean> {
mPreviousAccount = AccountUtils.getCurrentOwnCloudAccount(this);
}
- ActionBar action_bar = getSupportActionBar();
- action_bar.setDisplayShowTitleEnabled(true);
- action_bar.setDisplayHomeAsUpEnabled(false);
+ ActionBar actionBar = getSupportActionBar();
+ actionBar.setIcon(DisplayUtils.getSeasonalIconId());
+ actionBar.setDisplayShowTitleEnabled(true);
+ actionBar.setDisplayHomeAsUpEnabled(false);
}
@Override
(mPreviousAccount != null && !mPreviousAccount.equals(current))) {
/// the account set as default changed since this activity was created
- // trigger synchronization
- ContentResolver.cancelSync(null, AccountAuthenticator.AUTH_TOKEN_TYPE);
- Bundle bundle = new Bundle();
- bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
- ContentResolver.requestSync(AccountUtils.getCurrentOwnCloudAccount(this), AccountAuthenticator.AUTH_TOKEN_TYPE, bundle);
-
// restart the main activity
Intent i = new Intent(this, FileDisplayActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
- MenuInflater inflater = getSherlock().getMenuInflater();
- inflater.inflate(R.menu.account_picker, menu);
+ // Show Create Account if Multiaccount is enabled
+ if (getResources().getBoolean(R.bool.multiaccount_support)) {
+ MenuInflater inflater = getSherlock().getMenuInflater();
+ inflater.inflate(R.menu.account_picker, menu);
+ }
return true;
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
if (item.getItemId() == R.id.createAccount) {
- Intent intent = new Intent(
+ /*Intent intent = new Intent(
android.provider.Settings.ACTION_ADD_ACCOUNT);
intent.putExtra("authorities",
- new String[] { AccountAuthenticator.AUTH_TOKEN_TYPE });
- startActivity(intent);
+ new String[] { MainApp.getAuthTokenType() });
+ startActivity(intent);*/
+ AccountManager am = AccountManager.get(getApplicationContext());
+ am.addAccount(MainApp.getAccountType(),
+ null,
+ null,
+ null,
+ this,
+ null,
+ null);
return true;
}
return false;
}
+ /**
+ * Called when the user clicked on an item into the context menu created at
+ * {@link #onCreateContextMenu(ContextMenu, View, ContextMenuInfo)} for every
+ * ownCloud {@link Account} , containing 'secondary actions' for them.
+ *
+ * {@inheritDoc}}
+ */
@SuppressWarnings("unchecked")
@Override
public boolean onContextItemSelected(android.view.MenuItem item) {
- AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
- .getMenuInfo();
+ AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
int index = info.position;
HashMap<String, String> map = null;
try {
String accountName = map.get("NAME");
AccountManager am = (AccountManager) getSystemService(ACCOUNT_SERVICE);
- Account accounts[] = am
- .getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE);
+ Account accounts[] = am.getAccountsByType(MainApp.getAccountType());
for (Account a : accounts) {
if (a.name.equals(accountName)) {
- am.removeAccount(a, this, mHandler);
+ if (item.getItemId() == R.id.change_password) {
+ Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class);
+ updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, a);
+ updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_TOKEN);
+ startActivity(updateAccountCredentials);
+
+ } else if (item.getItemId() == R.id.delete_account) {
+ am.removeAccount(a, this, mHandler);
+ }
}
}
private void populateAccountList() {
AccountManager am = (AccountManager) getSystemService(ACCOUNT_SERVICE);
Account accounts[] = am
- .getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE);
- LinkedList<HashMap<String, String>> ll = new LinkedList<HashMap<String, String>>();
- for (Account a : accounts) {
- HashMap<String, String> h = new HashMap<String, String>();
- h.put("NAME", a.name);
- h.put("VER",
- "ownCloud version: "
- + am.getUserData(a,
- AccountAuthenticator.KEY_OC_VERSION));
- ll.add(h);
+ .getAccountsByType(MainApp.getAccountType());
+ if (am.getAccountsByType(MainApp.getAccountType()).length == 0) {
+ // Show create account screen if there isn't any account
+ am.addAccount(MainApp.getAccountType(),
+ null,
+ null,
+ null,
+ this,
+ null,
+ null);
}
+ else {
+ LinkedList<HashMap<String, String>> ll = new LinkedList<HashMap<String, String>>();
+ for (Account a : accounts) {
+ HashMap<String, String> h = new HashMap<String, String>();
+ h.put("NAME", a.name);
+ h.put("VER",
+ "ownCloud version: "
+ + am.getUserData(a,
+ Constants.KEY_OC_VERSION));
+ ll.add(h);
+ }
- setListAdapter(new AccountCheckedSimpleAdepter(this, ll,
- android.R.layout.simple_list_item_single_choice,
- new String[] { "NAME" }, new int[] { android.R.id.text1 }));
- registerForContextMenu(getListView());
+ setListAdapter(new AccountCheckedSimpleAdepter(this, ll,
+ android.R.layout.simple_list_item_single_choice,
+ new String[] { "NAME" }, new int[] { android.R.id.text1 }));
+ registerForContextMenu(getListView());
+ }
}
@Override
String accountName = "";
if (a == null) {
Account[] accounts = AccountManager.get(this)
- .getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE);
+ .getAccountsByType(MainApp.getAccountType());
if (accounts.length != 0)
accountName = accounts[0].name;
AccountUtils.setCurrentOwnCloudAccount(this, accountName);
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.ui.activity;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import com.owncloud.android.AccountUtils;
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.authenticator.AccountAuthenticator;
-import com.owncloud.android.authenticator.AuthenticationRunnable;
-import com.owncloud.android.authenticator.OnAuthenticationResultListener;
-import com.owncloud.android.authenticator.OnConnectCheckListener;
-import com.owncloud.android.ui.dialog.SslValidatorDialog;
-import com.owncloud.android.ui.dialog.SslValidatorDialog.OnSslValidatorListener;
-import com.owncloud.android.network.OwnCloudClientUtils;
-import com.owncloud.android.operations.ConnectionCheckOperation;
-import com.owncloud.android.operations.OnRemoteOperationListener;
-import com.owncloud.android.operations.RemoteOperation;
-import com.owncloud.android.operations.RemoteOperationResult;
-
-import android.accounts.Account;
-import android.accounts.AccountAuthenticatorActivity;
-import android.accounts.AccountManager;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.ProgressDialog;
-import android.content.ContentResolver;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.preference.PreferenceManager;
-import android.text.InputType;
-import android.util.Log;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnFocusChangeListener;
-import android.view.Window;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.ImageView;
-import android.widget.TextView;
-import com.owncloud.android.R;
-
-import eu.alefzero.webdav.WebdavClient;
-
-/**
- * This Activity is used to add an ownCloud account to the App
- *
- * @author Bartek Przybylski
- *
- */
-public class AuthenticatorActivity extends AccountAuthenticatorActivity
- implements OnAuthenticationResultListener, OnConnectCheckListener, OnRemoteOperationListener, OnSslValidatorListener,
- OnFocusChangeListener, OnClickListener {
-
- private static final int DIALOG_LOGIN_PROGRESS = 0;
- private static final int DIALOG_SSL_VALIDATOR = 1;
- private static final int DIALOG_CERT_NOT_SAVED = 2;
-
- private static final String TAG = "AuthActivity";
-
- private Thread mAuthThread;
- private AuthenticationRunnable mAuthRunnable;
- //private ConnectionCheckerRunnable mConnChkRunnable = null;
- private ConnectionCheckOperation mConnChkRunnable;
- private final Handler mHandler = new Handler();
- private String mBaseUrl;
-
- private static final String STATUS_TEXT = "STATUS_TEXT";
- private static final String STATUS_ICON = "STATUS_ICON";
- private static final String STATUS_CORRECT = "STATUS_CORRECT";
- private static final String IS_SSL_CONN = "IS_SSL_CONN";
- private int mStatusText, mStatusIcon;
- private boolean mStatusCorrect, mIsSslConn;
- private RemoteOperationResult mLastSslUntrustedServerResult;
-
- public static final String PARAM_USERNAME = "param_Username";
- public static final String PARAM_HOSTNAME = "param_Hostname";
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- getWindow().requestFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.account_setup);
- ImageView iv = (ImageView) findViewById(R.id.refreshButton);
- ImageView iv2 = (ImageView) findViewById(R.id.viewPassword);
- TextView tv = (TextView) findViewById(R.id.host_URL);
- TextView tv2 = (TextView) findViewById(R.id.account_password);
-
- if (savedInstanceState != null) {
- mStatusIcon = savedInstanceState.getInt(STATUS_ICON);
- mStatusText = savedInstanceState.getInt(STATUS_TEXT);
- mStatusCorrect = savedInstanceState.getBoolean(STATUS_CORRECT);
- mIsSslConn = savedInstanceState.getBoolean(IS_SSL_CONN);
- setResultIconAndText(mStatusIcon, mStatusText);
- findViewById(R.id.buttonOK).setEnabled(mStatusCorrect);
- if (!mStatusCorrect)
- iv.setVisibility(View.VISIBLE);
- else
- iv.setVisibility(View.INVISIBLE);
-
- } else {
- mStatusText = mStatusIcon = 0;
- mStatusCorrect = false;
- mIsSslConn = false;
- }
- iv.setOnClickListener(this);
- iv2.setOnClickListener(this);
- tv.setOnFocusChangeListener(this);
- tv2.setOnFocusChangeListener(this);
-
- Button b = (Button) findViewById(R.id.account_register);
- if (b != null) {
- b.setText(String.format(getString(R.string.auth_register), getString(R.string.app_name)));
- }
- }
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- outState.putInt(STATUS_ICON, mStatusIcon);
- outState.putInt(STATUS_TEXT, mStatusText);
- outState.putBoolean(STATUS_CORRECT, mStatusCorrect);
- super.onSaveInstanceState(outState);
- }
-
- @Override
- protected Dialog onCreateDialog(int id) {
- Dialog dialog = null;
- switch (id) {
- case DIALOG_LOGIN_PROGRESS: {
- ProgressDialog working_dialog = new ProgressDialog(this);
- working_dialog.setMessage(getResources().getString(
- R.string.auth_trying_to_login));
- working_dialog.setIndeterminate(true);
- working_dialog.setCancelable(true);
- working_dialog
- .setOnCancelListener(new DialogInterface.OnCancelListener() {
- @Override
- public void onCancel(DialogInterface dialog) {
- Log_OC.i(TAG, "Login canceled");
- if (mAuthThread != null) {
- mAuthThread.interrupt();
- finish();
- }
- }
- });
- dialog = working_dialog;
- break;
- }
- case DIALOG_SSL_VALIDATOR: {
- dialog = SslValidatorDialog.newInstance(this, mLastSslUntrustedServerResult, this);
- break;
- }
- case DIALOG_CERT_NOT_SAVED: {
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setMessage(getResources().getString(R.string.ssl_validator_not_saved));
- builder.setCancelable(false);
- builder.setPositiveButton(R.string.common_ok, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- };
- });
- dialog = builder.create();
- break;
- }
- default:
- Log_OC.e(TAG, "Incorrect dialog called with id = " + id);
- }
- return dialog;
- }
-
- @Override
- protected void onPrepareDialog(int id, Dialog dialog, Bundle args) {
- switch (id) {
- case DIALOG_LOGIN_PROGRESS:
- case DIALOG_CERT_NOT_SAVED:
- break;
- case DIALOG_SSL_VALIDATOR: {
- ((SslValidatorDialog)dialog).updateResult(mLastSslUntrustedServerResult);
- break;
- }
- default:
- Log_OC.e(TAG, "Incorrect dialog called with id = " + id);
- }
- }
-
- public void onAuthenticationResult(boolean success, String message) {
- if (success) {
- TextView username_text = (TextView) findViewById(R.id.account_username), password_text = (TextView) findViewById(R.id.account_password);
-
- URL url;
- try {
- url = new URL(message);
- } catch (MalformedURLException e) {
- // should never happen
- Log_OC.e(getClass().getName(), "Malformed URL: " + message);
- return;
- }
-
- String username = username_text.getText().toString().trim();
- String accountName = username + "@" + url.getHost();
- if (url.getPort() >= 0) {
- accountName += ":" + url.getPort();
- }
- Account account = new Account(accountName,
- AccountAuthenticator.ACCOUNT_TYPE);
- AccountManager accManager = AccountManager.get(this);
- accManager.addAccountExplicitly(account, password_text.getText()
- .toString(), null);
-
- // Add this account as default in the preferences, if there is none
- // already
- Account defaultAccount = AccountUtils
- .getCurrentOwnCloudAccount(this);
- if (defaultAccount == null) {
- SharedPreferences.Editor editor = PreferenceManager
- .getDefaultSharedPreferences(this).edit();
- editor.putString("select_oc_account", accountName);
- editor.commit();
- }
-
- final Intent intent = new Intent();
- intent.putExtra(AccountManager.KEY_ACCOUNT_TYPE,
- AccountAuthenticator.ACCOUNT_TYPE);
- intent.putExtra(AccountManager.KEY_ACCOUNT_NAME, account.name);
- intent.putExtra(AccountManager.KEY_AUTHTOKEN,
- AccountAuthenticator.ACCOUNT_TYPE);
- intent.putExtra(AccountManager.KEY_USERDATA, username);
-
- accManager.setUserData(account,
- AccountAuthenticator.KEY_OC_VERSION, mConnChkRunnable
- .getDiscoveredVersion().toString());
-
- accManager.setUserData(account,
- AccountAuthenticator.KEY_OC_BASE_URL, mBaseUrl);
-
- setAccountAuthenticatorResult(intent.getExtras());
- setResult(RESULT_OK, intent);
- Bundle bundle = new Bundle();
- bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
- //getContentResolver().startSync(ProviderTableMeta.CONTENT_URI,
- // bundle);
- ContentResolver.requestSync(account, "org.owncloud", bundle);
-
- /*
- * if
- * (mConnChkRunnable.getDiscoveredVersion().compareTo(OwnCloudVersion
- * .owncloud_v2) >= 0) { Intent i = new Intent(this,
- * ExtensionsAvailableActivity.class); startActivity(i); }
- */
-
- finish();
- } else {
- try {
- dismissDialog(DIALOG_LOGIN_PROGRESS);
- } catch (IllegalArgumentException e) {
- // NOTHING TO DO ; can't find out what situation that leads to the exception in this code, but user logs signal that it happens
- }
- TextView tv = (TextView) findViewById(R.id.account_username);
- tv.setError(message + " "); // the extra spaces are a workaround for an ugly bug:
- // 1. insert wrong credentials and connect
- // 2. put the focus on the user name field with using hardware controls (don't touch the screen); the error is shown UNDER the field
- // 3. touch the user name field; the software keyboard appears; the error popup is moved OVER the field and SHRINKED in width, losing the last word
- // Seen, at least, in Android 2.x devices
- }
- }
- public void onCancelClick(View view) {
- setResult(RESULT_CANCELED);
- finish();
- }
-
- public void onOkClick(View view) {
- String prefix = "";
- String url = ((TextView) findViewById(R.id.host_URL)).getText()
- .toString().trim();
- if (mIsSslConn) {
- prefix = "https://";
- } else {
- prefix = "http://";
- }
- if (url.toLowerCase().startsWith("http://")
- || url.toLowerCase().startsWith("https://")) {
- prefix = "";
- }
- continueConnection(prefix);
- }
-
- public void onRegisterClick(View view) {
- Intent register = new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.url_account_register)));
- setResult(RESULT_CANCELED);
- startActivity(register);
- }
-
- private void continueConnection(String prefix) {
- String url = ((TextView) findViewById(R.id.host_URL)).getText()
- .toString().trim();
- String username = ((TextView) findViewById(R.id.account_username))
- .getText().toString();
- String password = ((TextView) findViewById(R.id.account_password))
- .getText().toString();
- if (url.endsWith("/"))
- url = url.substring(0, url.length() - 1);
-
- URL uri = null;
- String webdav_path = AccountUtils.getWebdavPath(mConnChkRunnable
- .getDiscoveredVersion());
-
- if (webdav_path == null) {
- onAuthenticationResult(false, getString(R.string.auth_bad_oc_version_title));
- return;
- }
-
- try {
- mBaseUrl = prefix + url;
- String url_str = prefix + url + webdav_path;
- uri = new URL(url_str);
- } catch (MalformedURLException e) {
- // should never happen
- onAuthenticationResult(false, getString(R.string.auth_incorrect_address_title));
- return;
- }
-
- showDialog(DIALOG_LOGIN_PROGRESS);
- mAuthRunnable = new AuthenticationRunnable(uri, username, password, this);
- mAuthRunnable.setOnAuthenticationResultListener(this, mHandler);
- mAuthThread = new Thread(mAuthRunnable);
- mAuthThread.start();
- }
-
- @Override
- public void onConnectionCheckResult(ResultType type) {
- mStatusText = mStatusIcon = 0;
- mStatusCorrect = false;
- String t_url = ((TextView) findViewById(R.id.host_URL)).getText()
- .toString().trim().toLowerCase();
-
- switch (type) {
- case OK_SSL:
- mIsSslConn = true;
- mStatusIcon = android.R.drawable.ic_secure;
- mStatusText = R.string.auth_secure_connection;
- mStatusCorrect = true;
- break;
- case OK_NO_SSL:
- mIsSslConn = false;
- mStatusCorrect = true;
- if (t_url.startsWith("http://") ) {
- mStatusText = R.string.auth_connection_established;
- mStatusIcon = R.drawable.ic_ok;
- } else {
- mStatusText = R.string.auth_nossl_plain_ok_title;
- mStatusIcon = android.R.drawable.ic_partial_secure;
- }
- break;
- case BAD_OC_VERSION:
- mStatusIcon = R.drawable.common_error;
- mStatusText = R.string.auth_bad_oc_version_title;
- break;
- case WRONG_CONNECTION:
- mStatusIcon = R.drawable.common_error;
- mStatusText = R.string.auth_wrong_connection_title;
- break;
- case TIMEOUT:
- mStatusIcon = R.drawable.common_error;
- mStatusText = R.string.auth_timeout_title;
- break;
- case INCORRECT_ADDRESS:
- mStatusIcon = R.drawable.common_error;
- mStatusText = R.string.auth_incorrect_address_title;
- break;
- case SSL_UNVERIFIED_SERVER:
- mStatusIcon = R.drawable.common_error;
- mStatusText = R.string.auth_ssl_unverified_server_title;
- break;
- case SSL_INIT_ERROR:
- mStatusIcon = R.drawable.common_error;
- mStatusText = R.string.auth_ssl_general_error_title;
- break;
- case HOST_NOT_AVAILABLE:
- mStatusIcon = R.drawable.common_error;
- mStatusText = R.string.auth_unknown_host_title;
- break;
- case NO_NETWORK_CONNECTION:
- mStatusIcon = R.drawable.no_network;
- mStatusText = R.string.auth_no_net_conn_title;
- break;
- case INSTANCE_NOT_CONFIGURED:
- mStatusIcon = R.drawable.common_error;
- mStatusText = R.string.auth_not_configured_title;
- break;
- case UNKNOWN_ERROR:
- mStatusIcon = R.drawable.common_error;
- mStatusText = R.string.auth_unknown_error_title;
- break;
- case FILE_NOT_FOUND:
- mStatusIcon = R.drawable.common_error;
- mStatusText = R.string.auth_incorrect_path_title;
- break;
- default:
- Log_OC.e(TAG, "Incorrect connection checker result type: " + type);
- }
- setResultIconAndText(mStatusIcon, mStatusText);
- if (!mStatusCorrect)
- findViewById(R.id.refreshButton).setVisibility(View.VISIBLE);
- else
- findViewById(R.id.refreshButton).setVisibility(View.INVISIBLE);
- findViewById(R.id.buttonOK).setEnabled(mStatusCorrect);
- }
-
- @Override
- public void onFocusChange(View view, boolean hasFocus) {
- if (view.getId() == R.id.host_URL) {
- if (!hasFocus) {
- TextView tv = ((TextView) findViewById(R.id.host_URL));
- String uri = tv.getText().toString().trim();
- if (uri.length() != 0) {
- setResultIconAndText(R.drawable.progress_small,
- R.string.auth_testing_connection);
- //mConnChkRunnable = new ConnectionCheckerRunnable(uri, this);
- mConnChkRunnable = new ConnectionCheckOperation(uri, this);
- //mConnChkRunnable.setListener(this, mHandler);
- //mAuthThread = new Thread(mConnChkRunnable);
- //mAuthThread.start();
- WebdavClient client = OwnCloudClientUtils.createOwnCloudClient(Uri.parse(uri), this);
- mAuthThread = mConnChkRunnable.execute(client, this, mHandler);
- } else {
- findViewById(R.id.refreshButton).setVisibility(
- View.INVISIBLE);
- setResultIconAndText(0, 0);
- }
- } else {
- // avoids that the 'connect' button can be clicked if the test was previously passed
- findViewById(R.id.buttonOK).setEnabled(false);
- }
- } else if (view.getId() == R.id.account_password) {
- ImageView iv = (ImageView) findViewById(R.id.viewPassword);
- if (hasFocus) {
- iv.setVisibility(View.VISIBLE);
- } else {
- TextView v = (TextView) findViewById(R.id.account_password);
- int input_type = InputType.TYPE_CLASS_TEXT
- | InputType.TYPE_TEXT_VARIATION_PASSWORD;
- v.setInputType(input_type);
- iv.setVisibility(View.INVISIBLE);
- }
- }
- }
-
- private void setResultIconAndText(int drawable_id, int text_id) {
- ImageView iv = (ImageView) findViewById(R.id.action_indicator);
- TextView tv = (TextView) findViewById(R.id.status_text);
-
- if (drawable_id == 0 && text_id == 0) {
- iv.setVisibility(View.INVISIBLE);
- tv.setVisibility(View.INVISIBLE);
- } else {
- iv.setImageResource(drawable_id);
- tv.setText(text_id);
- iv.setVisibility(View.VISIBLE);
- tv.setVisibility(View.VISIBLE);
- }
- }
-
- @Override
- public void onClick(View v) {
- if (v.getId() == R.id.refreshButton) {
- onFocusChange(findViewById(R.id.host_URL), false);
- } else if (v.getId() == R.id.viewPassword) {
- EditText view = (EditText) findViewById(R.id.account_password);
- int selectionStart = view.getSelectionStart();
- int selectionEnd = view.getSelectionEnd();
- int input_type = view.getInputType();
- if ((input_type & InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) {
- input_type = InputType.TYPE_CLASS_TEXT
- | InputType.TYPE_TEXT_VARIATION_PASSWORD;
- } else {
- input_type = InputType.TYPE_CLASS_TEXT
- | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;
- }
- view.setInputType(input_type);
- view.setSelection(selectionStart, selectionEnd);
- }
- }
-
- @Override
- public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) {
- if (operation.equals(mConnChkRunnable)) {
-
- mStatusText = mStatusIcon = 0;
- mStatusCorrect = false;
- String t_url = ((TextView) findViewById(R.id.host_URL)).getText()
- .toString().trim().toLowerCase();
-
- switch (result.getCode()) {
- case OK_SSL:
- mIsSslConn = true;
- mStatusIcon = android.R.drawable.ic_secure;
- mStatusText = R.string.auth_secure_connection;
- mStatusCorrect = true;
- break;
-
- case OK_NO_SSL:
- case OK:
- mIsSslConn = false;
- mStatusCorrect = true;
- if (t_url.startsWith("http://") ) {
- mStatusText = R.string.auth_connection_established;
- mStatusIcon = R.drawable.ic_ok;
- } else {
- mStatusText = R.string.auth_nossl_plain_ok_title;
- mStatusIcon = android.R.drawable.ic_partial_secure;
- }
- break;
-
-
- case BAD_OC_VERSION:
- mStatusIcon = R.drawable.common_error;
- mStatusText = R.string.auth_bad_oc_version_title;
- break;
- case WRONG_CONNECTION:
- mStatusIcon = R.drawable.common_error;
- mStatusText = R.string.auth_wrong_connection_title;
- break;
- case TIMEOUT:
- mStatusIcon = R.drawable.common_error;
- mStatusText = R.string.auth_timeout_title;
- break;
- case INCORRECT_ADDRESS:
- mStatusIcon = R.drawable.common_error;
- mStatusText = R.string.auth_incorrect_address_title;
- break;
-
- case SSL_RECOVERABLE_PEER_UNVERIFIED:
- mStatusIcon = R.drawable.common_error;
- mStatusText = R.string.auth_ssl_unverified_server_title;
- mLastSslUntrustedServerResult = result;
- showDialog(DIALOG_SSL_VALIDATOR);
- break;
-
- case SSL_ERROR:
- mStatusIcon = R.drawable.common_error;
- mStatusText = R.string.auth_ssl_general_error_title;
- break;
-
- case HOST_NOT_AVAILABLE:
- mStatusIcon = R.drawable.common_error;
- mStatusText = R.string.auth_unknown_host_title;
- break;
- case NO_NETWORK_CONNECTION:
- mStatusIcon = R.drawable.no_network;
- mStatusText = R.string.auth_no_net_conn_title;
- break;
- case INSTANCE_NOT_CONFIGURED:
- mStatusIcon = R.drawable.common_error;
- mStatusText = R.string.auth_not_configured_title;
- break;
- case FILE_NOT_FOUND:
- mStatusIcon = R.drawable.common_error;
- mStatusText = R.string.auth_incorrect_path_title;
- break;
- case UNHANDLED_HTTP_CODE:
- case UNKNOWN_ERROR:
- mStatusIcon = R.drawable.common_error;
- mStatusText = R.string.auth_unknown_error_title;
- break;
- default:
- Log_OC.e(TAG, "Incorrect connection checker result type: " + result.getHttpCode());
- }
- setResultIconAndText(mStatusIcon, mStatusText);
- if (!mStatusCorrect)
- findViewById(R.id.refreshButton).setVisibility(View.VISIBLE);
- else
- findViewById(R.id.refreshButton).setVisibility(View.INVISIBLE);
- findViewById(R.id.buttonOK).setEnabled(mStatusCorrect);
- }
- }
-
-
- public void onSavedCertificate() {
- mAuthThread = mConnChkRunnable.retry(this, mHandler);
- }
-
- @Override
- public void onFailedSavingCertificate() {
- showDialog(DIALOG_CERT_NOT_SAVED);
- }
-
-}
package com.owncloud.android.ui.activity;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-import com.owncloud.android.Log_OC;
+import com.actionbarsherlock.app.ActionBar;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.files.services.FileUploader;
import com.owncloud.android.ui.dialog.ConflictsResolveDialog;
import com.owncloud.android.ui.dialog.ConflictsResolveDialog.Decision;
import com.owncloud.android.ui.dialog.ConflictsResolveDialog.OnConflictDecisionMadeListener;
+import com.owncloud.android.utils.DisplayUtils;
+import com.owncloud.android.utils.Log_OC;
-import android.accounts.Account;
import android.content.Intent;
import android.os.Bundle;
* application.
*
* @author Bartek Przybylski
- *
+ * @author David A. Velasco
*/
-public class ConflictsResolveActivity extends SherlockFragmentActivity implements OnConflictDecisionMadeListener {
-
- public static final String EXTRA_FILE = "FILE";
- public static final String EXTRA_ACCOUNT = "ACCOUNT";
+public class ConflictsResolveActivity extends FileActivity implements OnConflictDecisionMadeListener {
private String TAG = ConflictsResolveActivity.class.getSimpleName();
- //private String mRemotePath;
-
- //private String mLocalPath;
-
- private OCFile mFile;
- private Account mOCAccount;
-
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
-
- //mRemotePath = getIntent().getStringExtra("remotepath");
- //mLocalPath = getIntent().getStringExtra("localpath");
- mFile = getIntent().getParcelableExtra(EXTRA_FILE);
- mOCAccount = getIntent().getParcelableExtra(EXTRA_ACCOUNT);
- ConflictsResolveDialog d = ConflictsResolveDialog.newInstance(mFile.getRemotePath(), this);
- d.showDialog(this);
+ ActionBar actionBar = getSupportActionBar();
+ actionBar.setIcon(DisplayUtils.getSeasonalIconId());
}
@Override
- public void ConflictDecisionMade(Decision decision) {
+ public void conflictDecisionMade(Decision decision) {
Intent i = new Intent(getApplicationContext(), FileUploader.class);
switch (decision) {
Log_OC.wtf(TAG, "Unhandled conflict decision " + decision);
return;
}
- i.putExtra(FileUploader.KEY_ACCOUNT, mOCAccount);
- i.putExtra(FileUploader.KEY_FILE, mFile);
+ i.putExtra(FileUploader.KEY_ACCOUNT, getAccount());
+ i.putExtra(FileUploader.KEY_FILE, getFile());
i.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_SINGLE_FILE);
startService(i);
finish();
}
+
+ @Override
+ protected void onAccountSet(boolean stateWasRecovered) {
+ super.onAccountSet(stateWasRecovered);
+ if (getAccount() != null) {
+ OCFile file = getFile();
+ if (getFile() == null) {
+ Log_OC.e(TAG, "No conflictive file received");
+ finish();
+ } else {
+ /// Check whether the 'main' OCFile handled by the Activity is contained in the current Account
+ file = getStorageManager().getFileByPath(file.getRemotePath()); // file = null if not in the current Account
+ if (file != null) {
+ setFile(file);
+ ConflictsResolveDialog d = ConflictsResolveDialog.newInstance(file.getRemotePath(), this);
+ d.showDialog(this);
+
+ } else {
+ // account was changed to a different one - just finish
+ finish();
+ }
+ }
+
+ } else {
+ finish();
+ }
+
+ }
}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2014 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.ui.activity;
+
+import com.owncloud.android.R;
+
+import android.app.Activity;
+import android.content.ClipData;
+import android.content.Intent;
+import android.os.Bundle;
+import android.text.ClipboardManager;
+import android.widget.Toast;
+
+/**
+ * Activity copying the text of the received Intent into the system clibpoard.
+ *
+ * @author David A. Velasco
+ */
+@SuppressWarnings("deprecation")
+public class CopyToClipboardActivity extends Activity {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // get the clipboard system service
+ ClipboardManager clipboardManager = (ClipboardManager) this.getSystemService(CLIPBOARD_SERVICE);
+
+ // get the text to copy into the clipboard
+ Intent intent = getIntent();
+ CharSequence text = intent.getCharSequenceExtra(Intent.EXTRA_TEXT);
+
+ // and put the text the clipboard
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
+ // API level >= 11 -> modern Clipboard
+ ClipData clip = ClipData.newPlainText("ownCloud was here", text);
+ ((android.content.ClipboardManager)clipboardManager).setPrimaryClip(clip);
+
+ } else {
+ // API level >= 11 -> legacy Clipboard
+ clipboardManager.setText(text);
+ }
+
+ // alert the user that the text is in the clipboard and we're done
+ Toast.makeText(this, R.string.clipboard_text_copied, Toast.LENGTH_SHORT).show();
+
+ finish();
+ }
+
+}
import android.os.Handler;
import android.support.v4.app.DialogFragment;
import android.text.method.ScrollingMovementMethod;
-import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockFragmentActivity;
-import com.owncloud.android.Log_OC;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
+
import com.owncloud.android.ui.dialog.IndeterminateProgressDialog;
import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.Log_OC;
+
/**
/// customize buttons
Button cancelBtn = (Button) findViewById(R.id.cancel);
Button okBtn = (Button) findViewById(R.id.ok);
+
okBtn.setText(R.string.foreign_files_move);
cancelBtn.setOnClickListener(this);
okBtn.setOnClickListener(this);
+/* ownCloud Android client application\r
+ * Copyright (C) 2012-2013 ownCloud Inc.\r
+ *\r
+ * This program is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License version 2,\r
+ * as published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.\r
+ *\r
+ */\r
+\r
package com.owncloud.android.ui.activity;\r
\r
+import com.owncloud.android.R;\r
+\r
import android.app.Activity;\r
import android.os.Bundle;\r
import android.view.View;\r
import android.widget.Button;\r
import android.widget.TextView;\r
\r
-import com.owncloud.android.R;\r
\r
/**\r
* This Activity is used to display a detail message for failed uploads\r
* \r
* The entry-point for this activity is the 'Failed upload Notification"\r
* \r
- * \r
* @author andomaex / Matthias Baumann\r
- * \r
- * This program is free software: you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation, either version 3 of the License. (at\r
- * your option) any later version.\r
- * \r
- * This program is distributed in the hope that it will be useful, but\r
- * WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
- * General Public License for more de/\r
*/\r
public class FailedUploadActivity extends Activity {\r
\r
String message = getIntent().getStringExtra(MESSAGE);\r
TextView textView = (TextView) findViewById(R.id.faild_upload_message);\r
textView.setText(message);\r
- Button close_button = (Button) findViewById(R.id.failed_uploadactivity_close_button);\r
- close_button.setOnClickListener(new OnClickListener() {\r
+ Button closeBtn = (Button) findViewById(R.id.failed_uploadactivity_close_button);\r
+ \r
+ closeBtn.setOnClickListener(new OnClickListener() {\r
@Override\r
public void onClick(View v) {\r
finish();\r
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2011 Bartek Przybylski
+ * Copyright (C) 2012-2013 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.ui.activity;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.AccountManagerCallback;
+import android.accounts.AccountManagerFuture;
+import android.accounts.OperationCanceledException;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentTransaction;
+import android.widget.Toast;
+
+import com.actionbarsherlock.app.SherlockFragmentActivity;
+import com.owncloud.android.MainApp;
+import com.owncloud.android.R;
+import com.owncloud.android.authentication.AccountUtils;
+import com.owncloud.android.datamodel.FileDataStorageManager;
+import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.files.FileOperationsHelper;
+import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.operations.CreateShareOperation;
+import com.owncloud.android.operations.UnshareLinkOperation;
+
+import com.owncloud.android.services.OperationsService;
+import com.owncloud.android.services.OperationsService.OperationsServiceBinder;
+import com.owncloud.android.ui.dialog.LoadingDialog;
+import com.owncloud.android.utils.Log_OC;
+
+
+/**
+ * Activity with common behaviour for activities handling {@link OCFile}s in ownCloud {@link Account}s .
+ *
+ * @author David A. Velasco
+ */
+public class FileActivity extends SherlockFragmentActivity implements OnRemoteOperationListener {
+
+ public static final String EXTRA_FILE = "com.owncloud.android.ui.activity.FILE";
+ public static final String EXTRA_ACCOUNT = "com.owncloud.android.ui.activity.ACCOUNT";
+ public static final String EXTRA_WAITING_TO_PREVIEW = "com.owncloud.android.ui.activity.WAITING_TO_PREVIEW";
+ public static final String EXTRA_FROM_NOTIFICATION= "com.owncloud.android.ui.activity.FROM_NOTIFICATION";
+
+ public static final String TAG = FileActivity.class.getSimpleName();
+
+ private static final String DIALOG_WAIT_TAG = "DIALOG_WAIT";
+
+
+ /** OwnCloud {@link Account} where the main {@link OCFile} handled by the activity is located. */
+ private Account mAccount;
+
+ /** Main {@link OCFile} handled by the activity.*/
+ private OCFile mFile;
+
+ /** Flag to signal that the activity will is finishing to enforce the creation of an ownCloud {@link Account} */
+ private boolean mRedirectingToSetupAccount = false;
+
+ /** Flag to signal when the value of mAccount was set */
+ private boolean mAccountWasSet;
+
+ /** Flag to signal when the value of mAccount was restored from a saved state */
+ private boolean mAccountWasRestored;
+
+ /** Flag to signal if the activity is launched by a notification */
+ private boolean mFromNotification;
+
+ /** Messages handler associated to the main thread and the life cycle of the activity */
+ private Handler mHandler;
+
+ /** Access point to the cached database for the current ownCloud {@link Account} */
+ private FileDataStorageManager mStorageManager = null;
+
+ private FileOperationsHelper mFileOperationsHelper;
+
+ private ServiceConnection mOperationsServiceConnection = null;
+
+ private OperationsServiceBinder mOperationsServiceBinder = null;
+
+
+ /**
+ * Loads the ownCloud {@link Account} and main {@link OCFile} to be handled by the instance of
+ * the {@link FileActivity}.
+ *
+ * Grants that a valid ownCloud {@link Account} is associated to the instance, or that the user
+ * is requested to create a new one.
+ */
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mHandler = new Handler();
+ mFileOperationsHelper = new FileOperationsHelper();
+ Account account;
+ if(savedInstanceState != null) {
+ account = savedInstanceState.getParcelable(FileActivity.EXTRA_ACCOUNT);
+ mFile = savedInstanceState.getParcelable(FileActivity.EXTRA_FILE);
+ mFromNotification = savedInstanceState.getBoolean(FileActivity.EXTRA_FROM_NOTIFICATION);
+ } else {
+ account = getIntent().getParcelableExtra(FileActivity.EXTRA_ACCOUNT);
+ mFile = getIntent().getParcelableExtra(FileActivity.EXTRA_FILE);
+ mFromNotification = getIntent().getBooleanExtra(FileActivity.EXTRA_FROM_NOTIFICATION, false);
+ }
+
+ setAccount(account, savedInstanceState != null);
+
+ mOperationsServiceConnection = new OperationsServiceConnection();
+ bindService(new Intent(this, OperationsService.class), mOperationsServiceConnection, Context.BIND_AUTO_CREATE);
+ }
+
+
+ /**
+ * Since ownCloud {@link Account}s can be managed from the system setting menu,
+ * the existence of the {@link Account} associated to the instance must be checked
+ * every time it is restarted.
+ */
+ @Override
+ protected void onRestart() {
+ super.onRestart();
+ boolean validAccount = (mAccount != null && AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), mAccount.name));
+ if (!validAccount) {
+ swapToDefaultAccount();
+ }
+ }
+
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+
+ if (mAccountWasSet) {
+ onAccountSet(mAccountWasRestored);
+ }
+ if (mOperationsServiceBinder != null) {
+ mOperationsServiceBinder.addOperationListener(FileActivity.this, mHandler);
+ }
+ }
+
+
+ @Override
+ protected void onStop() {
+
+ if (mOperationsServiceBinder != null) {
+ mOperationsServiceBinder.removeOperationListener(this);
+ }
+
+ super.onStop();
+ }
+
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ if (mOperationsServiceConnection != null) {
+ unbindService(mOperationsServiceConnection);
+ mOperationsServiceBinder = null;
+ }
+ }
+
+
+ /**
+ * Sets and validates the ownCloud {@link Account} associated to the Activity.
+ *
+ * If not valid, tries to swap it for other valid and existing ownCloud {@link Account}.
+ *
+ * POSTCONDITION: updates {@link #mAccountWasSet} and {@link #mAccountWasRestored}.
+ *
+ * @param account New {@link Account} to set.
+ * @param savedAccount When 'true', account was retrieved from a saved instance state.
+ */
+ private void setAccount(Account account, boolean savedAccount) {
+ Account oldAccount = mAccount;
+ boolean validAccount = (account != null && AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), account.name));
+ if (validAccount) {
+ mAccount = account;
+ mAccountWasSet = true;
+ mAccountWasRestored = (savedAccount || mAccount.equals(oldAccount));
+
+ } else {
+ swapToDefaultAccount();
+ }
+ }
+
+
+ /**
+ * Tries to swap the current ownCloud {@link Account} for other valid and existing.
+ *
+ * If no valid ownCloud {@link Account} exists, the the user is requested
+ * to create a new ownCloud {@link Account}.
+ *
+ * POSTCONDITION: updates {@link #mAccountWasSet} and {@link #mAccountWasRestored}.
+ *
+ * @return 'True' if the checked {@link Account} was valid.
+ */
+ private void swapToDefaultAccount() {
+ // default to the most recently used account
+ Account newAccount = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext());
+ if (newAccount == null) {
+ /// no account available: force account creation
+ createFirstAccount();
+ mRedirectingToSetupAccount = true;
+ mAccountWasSet = false;
+ mAccountWasRestored = false;
+
+ } else {
+ mAccountWasSet = true;
+ mAccountWasRestored = (newAccount.equals(mAccount));
+ mAccount = newAccount;
+ }
+ }
+
+
+ /**
+ * Launches the account creation activity. To use when no ownCloud account is available
+ */
+ private void createFirstAccount() {
+ AccountManager am = AccountManager.get(getApplicationContext());
+ am.addAccount(MainApp.getAccountType(),
+ null,
+ null,
+ null,
+ this,
+ new AccountCreationCallback(),
+ null);
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putParcelable(FileActivity.EXTRA_FILE, mFile);
+ outState.putParcelable(FileActivity.EXTRA_ACCOUNT, mAccount);
+ outState.putBoolean(FileActivity.EXTRA_FROM_NOTIFICATION, mFromNotification);
+ }
+
+
+ /**
+ * Getter for the main {@link OCFile} handled by the activity.
+ *
+ * @return Main {@link OCFile} handled by the activity.
+ */
+ public OCFile getFile() {
+ return mFile;
+ }
+
+
+ /**
+ * Setter for the main {@link OCFile} handled by the activity.
+ *
+ * @param file Main {@link OCFile} to be handled by the activity.
+ */
+ public void setFile(OCFile file) {
+ mFile = file;
+ }
+
+
+ /**
+ * Getter for the ownCloud {@link Account} where the main {@link OCFile} handled by the activity is located.
+ *
+ * @return OwnCloud {@link Account} where the main {@link OCFile} handled by the activity is located.
+ */
+ public Account getAccount() {
+ return mAccount;
+ }
+
+ /**
+ * @return Value of mFromNotification: True if the Activity is launched by a notification
+ */
+ public boolean fromNotification() {
+ return mFromNotification;
+ }
+
+ /**
+ * @return 'True' when the Activity is finishing to enforce the setup of a new account.
+ */
+ protected boolean isRedirectingToSetupAccount() {
+ return mRedirectingToSetupAccount;
+ }
+
+
+ public OperationsServiceBinder getOperationsServiceBinder() {
+ return mOperationsServiceBinder;
+ }
+
+
+ /**
+ * Helper class handling a callback from the {@link AccountManager} after the creation of
+ * a new ownCloud {@link Account} finished, successfully or not.
+ *
+ * At this moment, only called after the creation of the first account.
+ *
+ * @author David A. Velasco
+ */
+ public class AccountCreationCallback implements AccountManagerCallback<Bundle> {
+
+ @Override
+ public void run(AccountManagerFuture<Bundle> future) {
+ FileActivity.this.mRedirectingToSetupAccount = false;
+ boolean accountWasSet = false;
+ if (future != null) {
+ try {
+ Bundle result;
+ result = future.getResult();
+ String name = result.getString(AccountManager.KEY_ACCOUNT_NAME);
+ String type = result.getString(AccountManager.KEY_ACCOUNT_TYPE);
+ if (AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), name)) {
+ setAccount(new Account(name, type), false);
+ accountWasSet = true;
+ }
+ } catch (OperationCanceledException e) {
+ Log_OC.d(TAG, "Account creation canceled");
+
+ } catch (Exception e) {
+ Log_OC.e(TAG, "Account creation finished in exception: ", e);
+ }
+
+ } else {
+ Log_OC.e(TAG, "Account creation callback with null bundle");
+ }
+ if (!accountWasSet) {
+ moveTaskToBack(true);
+ }
+ }
+
+ }
+
+
+ /**
+ * Called when the ownCloud {@link Account} associated to the Activity was just updated.
+ *
+ * Child classes must grant that state depending on the {@link Account} is updated.
+ */
+ protected void onAccountSet(boolean stateWasRecovered) {
+ if (getAccount() != null) {
+ mStorageManager = new FileDataStorageManager(getAccount(), getContentResolver());
+
+ } else {
+ Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!");
+ }
+ }
+
+
+ public FileDataStorageManager getStorageManager() {
+ return mStorageManager;
+ }
+
+
+ public OnRemoteOperationListener getRemoteOperationListener() {
+ return this;
+ }
+
+
+ public Handler getHandler() {
+ return mHandler;
+ }
+
+ public FileOperationsHelper getFileOperationsHelper() {
+ return mFileOperationsHelper;
+ }
+
+ /**
+ *
+ * @param operation Removal operation performed.
+ * @param result Result of the removal.
+ */
+ @Override
+ public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) {
+ Log_OC.d(TAG, "Received result of operation in FileActivity - common behaviour for all the FileActivities ");
+ if (operation instanceof CreateShareOperation) {
+ onCreateShareOperationFinish((CreateShareOperation) operation, result);
+
+ } else if (operation instanceof UnshareLinkOperation) {
+ onUnshareLinkOperationFinish((UnshareLinkOperation)operation, result);
+
+ }
+ }
+
+ private void onCreateShareOperationFinish(CreateShareOperation operation, RemoteOperationResult result) {
+ dismissLoadingDialog();
+ if (result.isSuccess()) {
+ updateFileFromDB();
+
+ Intent sendIntent = operation.getSendIntent();
+ startActivity(sendIntent);
+
+ } else if (result.getCode() == ResultCode.SHARE_NOT_FOUND) { // Error --> SHARE_NOT_FOUND
+ Toast t = Toast.makeText(this, getString(R.string.share_link_file_no_exist), Toast.LENGTH_LONG);
+ t.show();
+ } else { // Generic error
+ // Show a Message, operation finished without success
+ Toast t = Toast.makeText(this, getString(R.string.share_link_file_error), Toast.LENGTH_LONG);
+ t.show();
+ }
+ }
+
+
+ private void onUnshareLinkOperationFinish(UnshareLinkOperation operation, RemoteOperationResult result) {
+ dismissLoadingDialog();
+
+ if (result.isSuccess()){
+ updateFileFromDB();
+
+ } else if (result.getCode() == ResultCode.SHARE_NOT_FOUND) { // Error --> SHARE_NOT_FOUND
+ Toast t = Toast.makeText(this, getString(R.string.unshare_link_file_no_exist), Toast.LENGTH_LONG);
+ t.show();
+ } else { // Generic error
+ // Show a Message, operation finished without success
+ Toast t = Toast.makeText(this, getString(R.string.unshare_link_file_error), Toast.LENGTH_LONG);
+ t.show();
+ }
+
+ }
+
+
+ private void updateFileFromDB(){
+ OCFile file = getStorageManager().getFileByPath(getFile().getRemotePath());
+ if (file != null) {
+ setFile(file);
+ }
+ }
+
+ /**
+ * Show loading dialog
+ */
+ public void showLoadingDialog() {
+ // Construct dialog
+ LoadingDialog loading = new LoadingDialog(getResources().getString(R.string.wait_a_moment));
+ FragmentManager fm = getSupportFragmentManager();
+ FragmentTransaction ft = fm.beginTransaction();
+ loading.show(ft, DIALOG_WAIT_TAG);
+
+ }
+
+
+ /**
+ * Dismiss loading dialog
+ */
+ public void dismissLoadingDialog(){
+ Fragment frag = getSupportFragmentManager().findFragmentByTag(DIALOG_WAIT_TAG);
+ if (frag != null) {
+ LoadingDialog loading = (LoadingDialog) frag;
+ loading.dismiss();
+ }
+ }
+
+
+ /**
+ * Implements callback methods for service binding. Passed as a parameter to {
+ */
+ private class OperationsServiceConnection implements ServiceConnection {
+
+ @Override
+ public void onServiceConnected(ComponentName component, IBinder service) {
+ if (component.equals(new ComponentName(FileActivity.this, OperationsService.class))) {
+ Log_OC.d(TAG, "Operations service connected");
+ mOperationsServiceBinder = (OperationsServiceBinder) service;
+ mOperationsServiceBinder.addOperationListener(FileActivity.this, mHandler);
+ if (!mOperationsServiceBinder.isPerformingBlockingOperation()) {
+ dismissLoadingDialog();
+ }
+
+ } else {
+ return;
+ }
+ }
+
+
+ @Override
+ public void onServiceDisconnected(ComponentName component) {
+ if (component.equals(new ComponentName(FileActivity.this, OperationsService.class))) {
+ Log_OC.d(TAG, "Operations service disconnected");
+ mOperationsServiceBinder = null;
+ // TODO whatever could be waiting for the service is unbound
+ }
+ }
+ };
+
+}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2011 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-package com.owncloud.android.ui.activity;
-
-import android.accounts.Account;
-import android.app.Dialog;
-import android.app.ProgressDialog;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.ServiceConnection;
-import android.content.res.Configuration;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentTransaction;
-import android.util.Log;
-
-import com.actionbarsherlock.app.ActionBar;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-import com.actionbarsherlock.view.MenuItem;
-import com.owncloud.android.datamodel.FileDataStorageManager;
-import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.files.services.FileDownloader;
-import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
-import com.owncloud.android.files.services.FileUploader;
-import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
-import com.owncloud.android.ui.fragment.FileDetailFragment;
-import com.owncloud.android.ui.fragment.FileFragment;
-import com.owncloud.android.ui.preview.PreviewMediaFragment;
-import com.owncloud.android.AccountUtils;
-import com.owncloud.android.Log_OC;
-
-import com.owncloud.android.R;
-
-/**
- * This activity displays the details of a file like its name, its size and so
- * on.
- *
- * @author Bartek Przybylski
- * @author David A. Velasco
- */
-public class FileDetailActivity extends SherlockFragmentActivity implements FileFragment.ContainerActivity {
-
- public static final int DIALOG_SHORT_WAIT = 0;
-
- public static final String TAG = FileDetailActivity.class.getSimpleName();
-
- public static final String EXTRA_MODE = "MODE";
- public static final int MODE_DETAILS = 0;
- public static final int MODE_PREVIEW = 1;
-
- public static final String KEY_WAITING_TO_PREVIEW = "WAITING_TO_PREVIEW";
-
- private boolean mConfigurationChangedToLandscape = false;
- private FileDownloaderBinder mDownloaderBinder = null;
- private ServiceConnection mDownloadConnection, mUploadConnection = null;
- private FileUploaderBinder mUploaderBinder = null;
- private boolean mWaitingToPreview;
-
- private OCFile mFile;
- private Account mAccount;
-
- private FileDataStorageManager mStorageManager;
- private DownloadFinishReceiver mDownloadFinishReceiver;
-
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- mFile = getIntent().getParcelableExtra(FileDetailFragment.EXTRA_FILE);
- mAccount = getIntent().getParcelableExtra(FileDetailFragment.EXTRA_ACCOUNT);
- mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());
-
- // check if configuration changed to large-land ; for a tablet being changed from portrait to landscape when in FileDetailActivity
- Configuration conf = getResources().getConfiguration();
- mConfigurationChangedToLandscape = (conf.orientation == Configuration.ORIENTATION_LANDSCAPE &&
- (conf.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE
- );
-
- if (!mConfigurationChangedToLandscape) {
- setContentView(R.layout.file_activity_details);
-
- ActionBar actionBar = getSupportActionBar();
- actionBar.setDisplayHomeAsUpEnabled(true);
-
- if (savedInstanceState == null) {
- mWaitingToPreview = false;
- createChildFragment();
- } else {
- mWaitingToPreview = savedInstanceState.getBoolean(KEY_WAITING_TO_PREVIEW);
- }
-
- mDownloadConnection = new DetailsServiceConnection();
- bindService(new Intent(this, FileDownloader.class), mDownloadConnection, Context.BIND_AUTO_CREATE);
- mUploadConnection = new DetailsServiceConnection();
- bindService(new Intent(this, FileUploader.class), mUploadConnection, Context.BIND_AUTO_CREATE);
-
-
- } else {
- backToDisplayActivity(false); // the 'back' won't be effective until this.onStart() and this.onResume() are completed;
- }
-
- }
-
- /**
- * Creates the proper fragment depending upon the state of the handled {@link OCFile} and
- * the requested {@link Intent}.
- */
- private void createChildFragment() {
- int mode = getIntent().getIntExtra(EXTRA_MODE, MODE_PREVIEW);
-
- Fragment newFragment = null;
- if (PreviewMediaFragment.canBePreviewed(mFile) && mode == MODE_PREVIEW) {
- if (mFile.isDown()) {
- newFragment = new PreviewMediaFragment(mFile, mAccount);
-
- } else {
- newFragment = new FileDetailFragment(mFile, mAccount);
- mWaitingToPreview = true;
- }
-
- } else {
- newFragment = new FileDetailFragment(mFile, mAccount);
- }
- FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
- ft.replace(R.id.fragment, newFragment, FileDetailFragment.FTAG);
- ft.commit();
- }
-
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putBoolean(KEY_WAITING_TO_PREVIEW, mWaitingToPreview);
- }
-
-
- @Override
- public void onPause() {
- super.onPause();
- if (mDownloadFinishReceiver != null) {
- unregisterReceiver(mDownloadFinishReceiver);
- mDownloadFinishReceiver = null;
- }
- }
-
-
- @Override
- public void onResume() {
- super.onResume();
- if (!mConfigurationChangedToLandscape) {
- // TODO this is probably unnecessary
- Fragment fragment = getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);
- if (fragment != null && fragment instanceof FileDetailFragment) {
- ((FileDetailFragment) fragment).updateFileDetails(false, false);
- }
- }
- // Listen for download messages
- IntentFilter downloadIntentFilter = new IntentFilter(FileDownloader.DOWNLOAD_ADDED_MESSAGE);
- downloadIntentFilter.addAction(FileDownloader.DOWNLOAD_FINISH_MESSAGE);
- mDownloadFinishReceiver = new DownloadFinishReceiver();
- registerReceiver(mDownloadFinishReceiver, downloadIntentFilter);
- }
-
-
- /** Defines callbacks for service binding, passed to bindService() */
- private class DetailsServiceConnection implements ServiceConnection {
-
- @Override
- public void onServiceConnected(ComponentName component, IBinder service) {
-
- if (component.equals(new ComponentName(FileDetailActivity.this, FileDownloader.class))) {
- Log_OC.d(TAG, "Download service connected");
- mDownloaderBinder = (FileDownloaderBinder) service;
- if (mWaitingToPreview) {
- requestForDownload();
- }
-
- } else if (component.equals(new ComponentName(FileDetailActivity.this, FileUploader.class))) {
- Log_OC.d(TAG, "Upload service connected");
- mUploaderBinder = (FileUploaderBinder) service;
- } else {
- return;
- }
-
- Fragment fragment = getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);
- FileDetailFragment detailsFragment = (fragment instanceof FileDetailFragment) ? (FileDetailFragment) fragment : null;
- if (detailsFragment != null) {
- detailsFragment.listenForTransferProgress();
- detailsFragment.updateFileDetails(mWaitingToPreview, false); // let the fragment gets the mDownloadBinder through getDownloadBinder() (see FileDetailFragment#updateFileDetais())
- }
- }
-
- @Override
- public void onServiceDisconnected(ComponentName component) {
- if (component.equals(new ComponentName(FileDetailActivity.this, FileDownloader.class))) {
- Log_OC.d(TAG, "Download service disconnected");
- mDownloaderBinder = null;
- } else if (component.equals(new ComponentName(FileDetailActivity.this, FileUploader.class))) {
- Log_OC.d(TAG, "Upload service disconnected");
- mUploaderBinder = null;
- }
- }
- };
-
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- if (mDownloadConnection != null) {
- unbindService(mDownloadConnection);
- mDownloadConnection = null;
- }
- if (mUploadConnection != null) {
- unbindService(mUploadConnection);
- mUploadConnection = null;
- }
- }
-
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- boolean returnValue = false;
-
- switch(item.getItemId()){
- case android.R.id.home:
- backToDisplayActivity(true);
- returnValue = true;
- break;
- default:
- returnValue = super.onOptionsItemSelected(item);
- }
-
- return returnValue;
- }
-
- private void backToDisplayActivity(boolean moveToParent) {
- Intent intent = new Intent(this, FileDisplayActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- OCFile targetFile = null;
- if (mFile != null) {
- targetFile = moveToParent ? mStorageManager.getFileById(mFile.getParentId()) : mFile;
- }
- intent.putExtra(FileDetailFragment.EXTRA_FILE, targetFile);
- intent.putExtra(FileDetailFragment.EXTRA_ACCOUNT, mAccount);
- startActivity(intent);
- finish();
- }
-
-
- @Override
- protected Dialog onCreateDialog(int id) {
- Dialog dialog = null;
- switch (id) {
- case DIALOG_SHORT_WAIT: {
- ProgressDialog working_dialog = new ProgressDialog(this);
- working_dialog.setMessage(getResources().getString(
- R.string.wait_a_moment));
- working_dialog.setIndeterminate(true);
- working_dialog.setCancelable(false);
- dialog = working_dialog;
- break;
- }
- default:
- dialog = null;
- }
- return dialog;
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void onFileStateChanged() {
- // nothing to do here!
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public FileDownloaderBinder getFileDownloaderBinder() {
- return mDownloaderBinder;
- }
-
-
- @Override
- public FileUploaderBinder getFileUploaderBinder() {
- return mUploaderBinder;
- }
-
-
- @Override
- public void showFragmentWithDetails(OCFile file) {
- FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
- transaction.replace(R.id.fragment, new FileDetailFragment(file, mAccount), FileDetailFragment.FTAG);
- transaction.commit();
- }
-
-
- private void requestForDownload() {
- if (!mDownloaderBinder.isDownloading(mAccount, mFile)) {
- Intent i = new Intent(this, FileDownloader.class);
- i.putExtra(FileDownloader.EXTRA_ACCOUNT, mAccount);
- i.putExtra(FileDownloader.EXTRA_FILE, mFile);
- startService(i);
- }
- }
-
-
- /**
- * Class waiting for broadcast events from the {@link FielDownloader} service.
- *
- * Updates the UI when a download is started or finished, provided that it is relevant for the
- * current file.
- */
- private class DownloadFinishReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- boolean sameAccount = isSameAccount(context, intent);
- String downloadedRemotePath = intent.getStringExtra(FileDownloader.EXTRA_REMOTE_PATH);
- boolean samePath = (mFile != null && mFile.getRemotePath().equals(downloadedRemotePath));
-
- if (sameAccount && samePath) {
- updateChildFragment(intent.getAction(), downloadedRemotePath, intent.getBooleanExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, false));
- }
-
- removeStickyBroadcast(intent);
- }
-
- private boolean isSameAccount(Context context, Intent intent) {
- String accountName = intent.getStringExtra(FileDownloader.ACCOUNT_NAME);
- return (accountName != null && accountName.equals(AccountUtils.getCurrentOwnCloudAccount(context).name));
- }
- }
-
-
- public void updateChildFragment(String downloadEvent, String downloadedRemotePath, boolean success) {
- Fragment fragment = getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);
- if (fragment != null && fragment instanceof FileDetailFragment) {
- FileDetailFragment detailsFragment = (FileDetailFragment) fragment;
- OCFile fileInFragment = detailsFragment.getFile();
- if (fileInFragment != null && !downloadedRemotePath.equals(fileInFragment.getRemotePath())) {
- // this never should happen; fileInFragment should be always equals to mFile, that was compared to downloadedRemotePath in DownloadReceiver
- mWaitingToPreview = false;
-
- } else if (downloadEvent.equals(FileDownloader.DOWNLOAD_ADDED_MESSAGE)) {
- // grants that the progress bar is updated
- detailsFragment.listenForTransferProgress();
- detailsFragment.updateFileDetails(true, false);
-
- } else if (downloadEvent.equals(FileDownloader.DOWNLOAD_FINISH_MESSAGE)) {
- // refresh the details fragment
- if (success && mWaitingToPreview) {
- mFile = mStorageManager.getFileById(mFile.getFileId()); // update the file from database, for the local storage path
- FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
- transaction.replace(R.id.fragment, new PreviewMediaFragment(mFile, mAccount), FileDetailFragment.FTAG);
- transaction.commit();
- mWaitingToPreview = false;
-
- } else {
- detailsFragment.updateFileDetails(false, (success));
- // TODO error message if !success ¿?
- }
- }
- } // TODO else if (fragment != null && fragment )
-
- }
-
-}
import android.accounts.Account;
import android.app.AlertDialog;
-import android.app.ProgressDialog;
-import android.app.AlertDialog.Builder;
import android.app.Dialog;
+import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
-import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
-import android.content.SharedPreferences.Editor;
-import android.content.pm.PackageInfo;
+import android.content.SyncRequest;
import android.content.res.Resources.NotFoundException;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
-import android.os.Handler;
import android.os.IBinder;
import android.preference.PreferenceManager;
import android.provider.MediaStore;
import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
+//import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
-import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.ActionBar.OnNavigationListener;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.view.Window;
-import com.owncloud.android.AccountUtils;
-import com.owncloud.android.Log_OC;
+import com.owncloud.android.MainApp;
import com.owncloud.android.R;
-import com.owncloud.android.authenticator.AccountAuthenticator;
-import com.owncloud.android.datamodel.DataStorageManager;
-import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.files.services.FileDownloader;
-import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
import com.owncloud.android.files.services.FileObserverService;
import com.owncloud.android.files.services.FileUploader;
+import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
-import com.owncloud.android.network.OwnCloudClientUtils;
-import com.owncloud.android.operations.OnRemoteOperationListener;
-import com.owncloud.android.operations.RemoteOperation;
-import com.owncloud.android.operations.RemoteOperationResult;
+import com.owncloud.android.operations.CreateFolderOperation;
+
+import com.owncloud.android.lib.common.network.CertificateCombinedException;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.operations.CreateShareOperation;
import com.owncloud.android.operations.RemoveFileOperation;
import com.owncloud.android.operations.RenameFileOperation;
import com.owncloud.android.operations.SynchronizeFileOperation;
-import com.owncloud.android.operations.RemoteOperationResult.ResultCode;
-import com.owncloud.android.syncadapter.FileSyncService;
-import com.owncloud.android.ui.dialog.ChangelogDialog;
+import com.owncloud.android.operations.SynchronizeFolderOperation;
+import com.owncloud.android.operations.UnshareLinkOperation;
+import com.owncloud.android.services.OperationsService;
+import com.owncloud.android.syncadapter.FileSyncAdapter;
import com.owncloud.android.ui.dialog.EditNameDialog;
-import com.owncloud.android.ui.dialog.SslValidatorDialog;
+import com.owncloud.android.ui.dialog.SslUntrustedCertDialog;
import com.owncloud.android.ui.dialog.EditNameDialog.EditNameDialogListener;
-import com.owncloud.android.ui.dialog.SslValidatorDialog.OnSslValidatorListener;
+import com.owncloud.android.ui.dialog.SslUntrustedCertDialog.OnSslUntrustedCertListener;
import com.owncloud.android.ui.fragment.FileDetailFragment;
import com.owncloud.android.ui.fragment.FileFragment;
import com.owncloud.android.ui.fragment.OCFileListFragment;
import com.owncloud.android.ui.preview.PreviewImageActivity;
-import com.owncloud.android.ui.preview.PreviewImageFragment;
import com.owncloud.android.ui.preview.PreviewMediaFragment;
+import com.owncloud.android.ui.preview.PreviewVideoActivity;
+import com.owncloud.android.utils.DisplayUtils;
+import com.owncloud.android.utils.Log_OC;
-import eu.alefzero.webdav.WebdavClient;
/**
* Displays, what files the user has available in his ownCloud.
* @author David A. Velasco
*/
-public class FileDisplayActivity extends SherlockFragmentActivity implements
- OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNavigationListener, OnSslValidatorListener, OnRemoteOperationListener, EditNameDialogListener {
-
+public class FileDisplayActivity extends HookActivity implements
+OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNavigationListener, OnSslUntrustedCertListener, EditNameDialogListener {
+
private ArrayAdapter<String> mDirectories;
- private OCFile mCurrentDir = null;
- private OCFile mCurrentFile = null;
- private DataStorageManager mStorageManager;
private SyncBroadcastReceiver mSyncBroadcastReceiver;
private UploadFinishReceiver mUploadFinishReceiver;
private DownloadFinishReceiver mDownloadFinishReceiver;
+ //private OperationsServiceReceiver mOperationsServiceReceiver;
private FileDownloaderBinder mDownloaderBinder = null;
private FileUploaderBinder mUploaderBinder = null;
private ServiceConnection mDownloadConnection = null, mUploadConnection = null;
private RemoteOperationResult mLastSslUntrustedServerResult = null;
-
- private OCFileListFragment mFileList;
-
+
private boolean mDualPane;
- private boolean mBackFromCreatingFirstAccount;
+ private View mLeftFragmentContainer;
+ private View mRightFragmentContainer;
+
+ private static final String KEY_WAITING_TO_PREVIEW = "WAITING_TO_PREVIEW";
+ private static final String KEY_SYNC_IN_PROGRESS = "SYNC_IN_PROGRESS";
+ //private static final String KEY_REFRESH_SHARES_IN_PROGRESS = "SHARES_IN_PROGRESS";
+ private static final String KEY_WAITING_TO_SEND = "WAITING_TO_SEND";
+
+ public static final int DIALOG_SHORT_WAIT = 0;
+ private static final int DIALOG_CHOOSE_UPLOAD_SOURCE = 1;
+ //private static final int DIALOG_SSL_VALIDATOR = 2;
+ private static final int DIALOG_CERT_NOT_SAVED = 2;
- private static final int DIALOG_SETUP_ACCOUNT = 0;
- private static final int DIALOG_CREATE_DIR = 1;
- public static final int DIALOG_SHORT_WAIT = 3;
- private static final int DIALOG_CHOOSE_UPLOAD_SOURCE = 4;
- private static final int DIALOG_SSL_VALIDATOR = 5;
- private static final int DIALOG_CERT_NOT_SAVED = 6;
- private static final String DIALOG_CHANGELOG_TAG = "DIALOG_CHANGELOG";
+ public static final String ACTION_DETAILS = "com.owncloud.android.ui.activity.action.DETAILS";
-
private static final int ACTION_SELECT_CONTENT_FROM_APPS = 1;
private static final int ACTION_SELECT_MULTIPLE_FILES = 2;
-
- private static final String TAG = "FileDisplayActivity";
+
+ private static final String TAG = FileDisplayActivity.class.getSimpleName();
+
+ private static final String TAG_LIST_OF_FILES = "LIST_OF_FILES";
+ private static final String TAG_SECOND_FRAGMENT = "SECOND_FRAGMENT";
private OCFile mWaitingToPreview;
- private Handler mHandler;
+
+ private boolean mSyncInProgress = false;
+ //private boolean mRefreshSharesInProgress = false;
+
+ private String DIALOG_UNTRUSTED_CERT;
+
+ private OCFile mWaitingToSend;
@Override
- public void onCreate(Bundle savedInstanceState) {
- Log_OC.d(getClass().toString(), "onCreate() start");
- super.onCreate(savedInstanceState);
-
- /// Load of parameters from received intent
- Account account = getIntent().getParcelableExtra(FileDetailFragment.EXTRA_ACCOUNT);
- if (account != null && AccountUtils.setCurrentOwnCloudAccount(this, account.name)) {
- mCurrentDir = getIntent().getParcelableExtra(FileDetailFragment.EXTRA_FILE);
- }
-
- /// Load of saved instance state: keep this always before initDataFromCurrentAccount()
- if(savedInstanceState != null) {
- // TODO - test if savedInstanceState should take precedence over file in the intent ALWAYS (now), NEVER. SOME TIMES
- mCurrentDir = savedInstanceState.getParcelable(FileDetailFragment.EXTRA_FILE);
- mWaitingToPreview = (OCFile) savedInstanceState.getParcelable(FileDetailActivity.KEY_WAITING_TO_PREVIEW);
+ protected void onCreate(Bundle savedInstanceState) {
+ Log_OC.d(TAG, "onCreate() start");
+ requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
- } else {
- mWaitingToPreview = null;
- }
-
- if (!AccountUtils.accountsAreSetup(this)) {
- /// no account available: FORCE ACCOUNT CREATION
- mStorageManager = null;
- createFirstAccount();
-
- } else { /// at least an account is available
-
- initDataFromCurrentAccount(); // it checks mCurrentDir and mCurrentFile with the current account
-
- }
-
+ super.onCreate(savedInstanceState); // this calls onAccountChanged() when ownCloud Account is valid
+
+ /// bindings to transference services
mUploadConnection = new ListServiceConnection();
mDownloadConnection = new ListServiceConnection();
bindService(new Intent(this, FileUploader.class), mUploadConnection, Context.BIND_AUTO_CREATE);
// PIN CODE request ; best location is to decide, let's try this first
if (getIntent().getAction() != null && getIntent().getAction().equals(Intent.ACTION_MAIN) && savedInstanceState == null) {
requestPinCode();
+ } else if (getIntent().getAction() == null && savedInstanceState == null) {
+ requestPinCode();
}
- // file observer
+ /// file observer
Intent observer_intent = new Intent(this, FileObserverService.class);
observer_intent.putExtra(FileObserverService.KEY_FILE_CMD, FileObserverService.CMD_INIT_OBSERVED_LIST);
startService(observer_intent);
-
-
+
+ /// Load of saved instance state
+ if(savedInstanceState != null) {
+ mWaitingToPreview = (OCFile) savedInstanceState.getParcelable(FileDisplayActivity.KEY_WAITING_TO_PREVIEW);
+ mSyncInProgress = savedInstanceState.getBoolean(KEY_SYNC_IN_PROGRESS);
+ //mRefreshSharesInProgress = savedInstanceState.getBoolean(KEY_REFRESH_SHARES_IN_PROGRESS);
+ mWaitingToSend = (OCFile) savedInstanceState.getParcelable(FileDisplayActivity.KEY_WAITING_TO_SEND);
+
+ } else {
+ mWaitingToPreview = null;
+ mSyncInProgress = false;
+ //mRefreshSharesInProgress = false;
+ mWaitingToSend = null;
+ }
+
/// USER INTERFACE
- requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
-
- // Drop-down navigation
- mDirectories = new CustomArrayAdapter<String>(this, R.layout.sherlock_spinner_dropdown_item);
- OCFile currFile = mCurrentDir;
- while(mStorageManager != null && currFile != null && currFile.getFileName() != OCFile.PATH_SEPARATOR) {
- mDirectories.add(currFile.getFileName());
- currFile = mStorageManager.getFileById(currFile.getParentId());
- }
- mDirectories.add(OCFile.PATH_SEPARATOR);
// Inflate and set the layout view
setContentView(R.layout.files);
- mFileList = (OCFileListFragment) getSupportFragmentManager().findFragmentById(R.id.fileList);
- mDualPane = (findViewById(R.id.file_details_container) != null);
- if (mDualPane) {
- if (savedInstanceState == null) initFileDetailsInDualPane();
+ mDualPane = getResources().getBoolean(R.bool.large_land_layout);
+ mLeftFragmentContainer = findViewById(R.id.left_fragment_container);
+ mRightFragmentContainer = findViewById(R.id.right_fragment_container);
+ if (savedInstanceState == null) {
+ createMinFragments();
} else {
- // quick patchES to fix problem in turn from landscape to portrait, when a file is selected in the right pane
- // TODO serious refactorization in activities and fragments providing file browsing and handling
- if (mCurrentFile != null) {
- onFileClick(mCurrentFile);
- mCurrentFile = null;
- }
- Fragment rightPanel = getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);
- if (rightPanel != null) {
- FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
- transaction.remove(rightPanel);
- transaction.commit();
+ Log_OC.d(TAG, "Init the secondFragment again");
+ if (mDualPane) {
+ initFragmentsWithFile();
}
}
-
+
// Action bar setup
- ActionBar actionBar = getSupportActionBar();
- actionBar.setHomeButtonEnabled(true); // mandatory since Android ICS, according to the official documentation
- actionBar.setDisplayHomeAsUpEnabled(mCurrentDir != null && mCurrentDir.getParentId() != 0);
- actionBar.setDisplayShowTitleEnabled(false);
- actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
- actionBar.setListNavigationCallbacks(mDirectories, this);
- setSupportProgressBarIndeterminateVisibility(false); // always AFTER setContentView(...) ; to workaround bug in its implementation
-
-
- // show changelog, if needed
- //showChangeLog();
- mBackFromCreatingFirstAccount = false;
+ mDirectories = new CustomArrayAdapter<String>(this, R.layout.sherlock_spinner_dropdown_item);
+ getSupportActionBar().setHomeButtonEnabled(true); // mandatory since Android ICS, according to the official documentation
+ setSupportProgressBarIndeterminateVisibility(mSyncInProgress /*|| mRefreshSharesInProgress*/); // always AFTER setContentView(...) ; to work around bug in its implementation
- Log_OC.d(getClass().toString(), "onCreate() end");
+ Log_OC.d(TAG, "onCreate() end");
}
-
+ @Override
+ protected void onStart() {
+ super.onStart();
+ getSupportActionBar().setIcon(DisplayUtils.getSeasonalIconId());
+ refeshListOfFilesFragment();
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ if (mDownloadConnection != null)
+ unbindService(mDownloadConnection);
+ if (mUploadConnection != null)
+ unbindService(mUploadConnection);
+ }
+
/**
- * Shows a dialog with the change log of the current version after each app update
- *
- * TODO make it permanent; by now, only to advice the workaround app for 4.1.x
- */
- private void showChangeLog() {
- if (android.os.Build.VERSION.SDK_INT == android.os.Build.VERSION_CODES.JELLY_BEAN) {
- final String KEY_VERSION = "version";
- SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
- int currentVersionNumber = 0;
- int savedVersionNumber = sharedPref.getInt(KEY_VERSION, 0);
- try {
- PackageInfo pi = getPackageManager().getPackageInfo(getPackageName(), 0);
- currentVersionNumber = pi.versionCode;
- } catch (Exception e) {}
-
- if (currentVersionNumber > savedVersionNumber) {
- ChangelogDialog.newInstance(true).show(getSupportFragmentManager(), DIALOG_CHANGELOG_TAG);
- Editor editor = sharedPref.edit();
- editor.putInt(KEY_VERSION, currentVersionNumber);
- editor.commit();
+ * Called when the ownCloud {@link Account} associated to the Activity was just updated.
+ */
+ @Override
+ protected void onAccountSet(boolean stateWasRecovered) {
+ super.onAccountSet(stateWasRecovered);
+ if (getAccount() != null) {
+ /// Check whether the 'main' OCFile handled by the Activity is contained in the current Account
+ OCFile file = getFile();
+ // get parent from path
+ String parentPath = "";
+ if (file != null) {
+ if (file.isDown() && file.getLastSyncDateForProperties() == 0) {
+ // upload in progress - right now, files are not inserted in the local cache until the upload is successful
+ // get parent from path
+ parentPath = file.getRemotePath().substring(0, file.getRemotePath().lastIndexOf(file.getFileName()));
+ if (getStorageManager().getFileByPath(parentPath) == null)
+ file = null; // not able to know the directory where the file is uploading
+ } else {
+ file = getStorageManager().getFileByPath(file.getRemotePath()); // currentDir = null if not in the current Account
+ }
+ }
+ if (file == null) {
+ // fall back to root folder
+ file = getStorageManager().getFileByPath(OCFile.ROOT_PATH); // never returns null
+ }
+ setFile(file);
+ setNavigationListWithFolder(file);
+
+ if (!stateWasRecovered) {
+ Log_OC.e(TAG, "Initializing Fragments in onAccountChanged..");
+ initFragmentsWithFile();
+ if (file.isFolder()) {
+ startSyncFolderOperation(file);
+ }
+
+ } else {
+ updateFragmentsVisibility(!file.isFolder());
+ updateNavigationElementsInActionBar(file.isFolder() ? null : file);
}
}
}
-
- /**
- * Launches the account creation activity. To use when no ownCloud account is available
- */
- private void createFirstAccount() {
- Intent intent = new Intent(android.provider.Settings.ACTION_ADD_ACCOUNT);
- intent.putExtra(android.provider.Settings.EXTRA_AUTHORITIES, new String[] { AccountAuthenticator.AUTH_TOKEN_TYPE });
- startActivity(intent); // the new activity won't be created until this.onStart() and this.onResume() are finished;
+
+ private void setNavigationListWithFolder(OCFile file) {
+ mDirectories.clear();
+ OCFile fileIt = file;
+ String parentPath;
+ while(fileIt != null && fileIt.getFileName() != OCFile.ROOT_PATH) {
+ if (fileIt.isFolder()) {
+ mDirectories.add(fileIt.getFileName());
+ }
+ // get parent from path
+ parentPath = fileIt.getRemotePath().substring(0, fileIt.getRemotePath().lastIndexOf(fileIt.getFileName()));
+ fileIt = getStorageManager().getFileByPath(parentPath);
+ }
+ mDirectories.add(OCFile.PATH_SEPARATOR);
}
+
+ private void createMinFragments() {
+ OCFileListFragment listOfFiles = new OCFileListFragment();
+ FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
+ transaction.add(R.id.left_fragment_container, listOfFiles, TAG_LIST_OF_FILES);
+ transaction.commit();
+ }
+ private void initFragmentsWithFile() {
+ if (getAccount() != null && getFile() != null) {
+ /// First fragment
+ OCFileListFragment listOfFiles = getListOfFilesFragment();
+ if (listOfFiles != null) {
+ listOfFiles.listDirectory(getCurrentDir());
+ } else {
+ Log.e(TAG, "Still have a chance to lose the initializacion of list fragment >(");
+ }
+
+ /// Second fragment
+ OCFile file = getFile();
+ Fragment secondFragment = chooseInitialSecondFragment(file);
+ if (secondFragment != null) {
+ setSecondFragment(secondFragment);
+ updateFragmentsVisibility(true);
+ updateNavigationElementsInActionBar(file);
+
+ } else {
+ cleanSecondFragment();
+ }
+
+ } else {
+ Log.wtf(TAG, "initFragments() called with invalid NULLs!");
+ if (getAccount() == null) {
+ Log.wtf(TAG, "\t account is NULL");
+ }
+ if (getFile() == null) {
+ Log.wtf(TAG, "\t file is NULL");
+ }
+ }
+ }
+
+ private Fragment chooseInitialSecondFragment(OCFile file) {
+ Fragment secondFragment = null;
+ if (file != null && !file.isFolder()) {
+ if (file.isDown() && PreviewMediaFragment.canBePreviewed(file)
+ && file.getLastSyncDateForProperties() > 0 // temporal fix
+ ) {
+ int startPlaybackPosition = getIntent().getIntExtra(PreviewVideoActivity.EXTRA_START_POSITION, 0);
+ boolean autoplay = getIntent().getBooleanExtra(PreviewVideoActivity.EXTRA_AUTOPLAY, true);
+ secondFragment = new PreviewMediaFragment(file, getAccount(), startPlaybackPosition, autoplay);
+
+ } else {
+ secondFragment = new FileDetailFragment(file, getAccount());
+ }
+ }
+ return secondFragment;
+ }
+
+
/**
- * Load of state dependent of the existence of an ownCloud account
+ * Replaces the second fragment managed by the activity with the received as
+ * a parameter.
+ *
+ * Assumes never will be more than two fragments managed at the same time.
+ *
+ * @param fragment New second Fragment to set.
*/
- private void initDataFromCurrentAccount() {
- /// Storage manager initialization - access to local database
- mStorageManager = new FileDataStorageManager(
- AccountUtils.getCurrentOwnCloudAccount(this),
- getContentResolver());
-
- /// Check if mCurrentDir is a directory
- if(mCurrentDir != null && !mCurrentDir.isDirectory()) {
- mCurrentFile = mCurrentDir;
- mCurrentDir = mStorageManager.getFileById(mCurrentDir.getParentId());
+ private void setSecondFragment(Fragment fragment) {
+ FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
+ transaction.replace(R.id.right_fragment_container, fragment, TAG_SECOND_FRAGMENT);
+ transaction.commit();
+ }
+
+
+ private void updateFragmentsVisibility(boolean existsSecondFragment) {
+ if (mDualPane) {
+ if (mLeftFragmentContainer.getVisibility() != View.VISIBLE) {
+ mLeftFragmentContainer.setVisibility(View.VISIBLE);
+ }
+ if (mRightFragmentContainer.getVisibility() != View.VISIBLE) {
+ mRightFragmentContainer.setVisibility(View.VISIBLE);
+ }
+
+ } else if (existsSecondFragment) {
+ if (mLeftFragmentContainer.getVisibility() != View.GONE) {
+ mLeftFragmentContainer.setVisibility(View.GONE);
+ }
+ if (mRightFragmentContainer.getVisibility() != View.VISIBLE) {
+ mRightFragmentContainer.setVisibility(View.VISIBLE);
+ }
+
+ } else {
+ if (mLeftFragmentContainer.getVisibility() != View.VISIBLE) {
+ mLeftFragmentContainer.setVisibility(View.VISIBLE);
+ }
+ if (mRightFragmentContainer.getVisibility() != View.GONE) {
+ mRightFragmentContainer.setVisibility(View.GONE);
+ }
}
-
- /// Check if mCurrentDir and mCurrentFile are in the current account, and update them
- if (mCurrentDir != null) {
- mCurrentDir = mStorageManager.getFileByPath(mCurrentDir.getRemotePath()); // mCurrentDir == null if it is not in the current account
+ }
+
+
+ private OCFileListFragment getListOfFilesFragment() {
+ Fragment listOfFiles = getSupportFragmentManager().findFragmentByTag(FileDisplayActivity.TAG_LIST_OF_FILES);
+ if (listOfFiles != null) {
+ return (OCFileListFragment)listOfFiles;
+ }
+ Log_OC.wtf(TAG, "Access to unexisting list of files fragment!!");
+ return null;
+ }
+
+ protected FileFragment getSecondFragment() {
+ Fragment second = getSupportFragmentManager().findFragmentByTag(FileDisplayActivity.TAG_SECOND_FRAGMENT);
+ if (second != null) {
+ return (FileFragment)second;
}
- if (mCurrentFile != null) {
- if (mCurrentFile.fileExists()) {
- mCurrentFile = mStorageManager.getFileByPath(mCurrentFile.getRemotePath()); // mCurrentFile == null if it is not in the current account
- } // else : keep mCurrentFile with the received value; this is currently the case of an upload in progress, when the user presses the status notification in a landscape tablet
+ return null;
+ }
+
+ public void cleanSecondFragment() {
+ Fragment second = getSecondFragment();
+ if (second != null) {
+ FragmentTransaction tr = getSupportFragmentManager().beginTransaction();
+ tr.remove(second);
+ tr.commit();
}
-
- /// Default to root if mCurrentDir was not found
- if (mCurrentDir == null) {
- mCurrentDir = mStorageManager.getFileByPath("/"); // will be NULL if the database was never synchronized
+ updateFragmentsVisibility(false);
+ updateNavigationElementsInActionBar(null);
+ }
+
+ protected void refeshListOfFilesFragment() {
+ OCFileListFragment fileListFragment = getListOfFilesFragment();
+ if (fileListFragment != null) {
+ fileListFragment.listDirectory();
}
}
-
-
- private void initFileDetailsInDualPane() {
- if (mDualPane && getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG) == null) {
- FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
- if (mCurrentFile != null) {
- if (PreviewMediaFragment.canBePreviewed(mCurrentFile)) {
- if (mCurrentFile.isDown()) {
- transaction.replace(R.id.file_details_container, new PreviewMediaFragment(mCurrentFile, AccountUtils.getCurrentOwnCloudAccount(this)), FileDetailFragment.FTAG);
- } else {
- transaction.replace(R.id.file_details_container, new FileDetailFragment(mCurrentFile, AccountUtils.getCurrentOwnCloudAccount(this)), FileDetailFragment.FTAG);
- mWaitingToPreview = mCurrentFile;
+
+ protected void refreshSecondFragment(String downloadEvent, String downloadedRemotePath, boolean success) {
+ FileFragment secondFragment = getSecondFragment();
+ boolean waitedPreview = (mWaitingToPreview != null && mWaitingToPreview.getRemotePath().equals(downloadedRemotePath));
+ if (secondFragment != null && secondFragment instanceof FileDetailFragment) {
+ FileDetailFragment detailsFragment = (FileDetailFragment) secondFragment;
+ OCFile fileInFragment = detailsFragment.getFile();
+ if (fileInFragment != null && !downloadedRemotePath.equals(fileInFragment.getRemotePath())) {
+ // the user browsed to other file ; forget the automatic preview
+ mWaitingToPreview = null;
+
+ } else if (downloadEvent.equals(FileDownloader.getDownloadAddedMessage())) {
+ // grant that the right panel updates the progress bar
+ detailsFragment.listenForTransferProgress();
+ detailsFragment.updateFileDetails(true, false);
+
+ } else if (downloadEvent.equals(FileDownloader.getDownloadFinishMessage())) {
+ // update the right panel
+ boolean detailsFragmentChanged = false;
+ if (waitedPreview) {
+ if (success) {
+ mWaitingToPreview = getStorageManager().getFileById(mWaitingToPreview.getFileId()); // update the file from database, for the local storage path
+ if (PreviewMediaFragment.canBePreviewed(mWaitingToPreview)) {
+ startMediaPreview(mWaitingToPreview, 0, true);
+ detailsFragmentChanged = true;
+ } else {
+ getFileOperationsHelper().openFile(mWaitingToPreview, this);
+ }
}
- } else {
- transaction.replace(R.id.file_details_container, new FileDetailFragment(mCurrentFile, AccountUtils.getCurrentOwnCloudAccount(this)), FileDetailFragment.FTAG);
+ mWaitingToPreview = null;
+ }
+ if (!detailsFragmentChanged) {
+ detailsFragment.updateFileDetails(false, (success));
}
- mCurrentFile = null;
-
- } else {
- transaction.replace(R.id.file_details_container, new FileDetailFragment(null, null), FileDetailFragment.FTAG); // empty FileDetailFragment
}
- transaction.commit();
}
}
-
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- if (mDownloadConnection != null)
- unbindService(mDownloadConnection);
- if (mUploadConnection != null)
- unbindService(mUploadConnection);
- }
-
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getSherlock().getMenuInflater();
- inflater.inflate(R.menu.main_menu, menu);
-
- return true;
+ inflater.inflate(R.menu.main_menu, menu);
+ return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
boolean retval = true;
switch (item.getItemId()) {
- case R.id.action_create_dir: {
- EditNameDialog dialog = EditNameDialog.newInstance(getString(R.string.uploader_info_dirname), "", -1, -1, this);
- dialog.show(getSupportFragmentManager(), "createdirdialog");
- break;
- }
- case R.id.action_sync_account: {
- startSynchronization();
- break;
- }
- case R.id.action_upload: {
- showDialog(DIALOG_CHOOSE_UPLOAD_SOURCE);
- break;
- }
- case R.id.action_settings: {
- Intent settingsIntent = new Intent(this, Preferences.class);
- startActivity(settingsIntent);
- break;
- }
- case android.R.id.home: {
- if(mCurrentDir != null && mCurrentDir.getParentId() != 0){
- onBackPressed();
- }
- break;
+ case R.id.action_create_dir: {
+ EditNameDialog dialog = EditNameDialog.newInstance(getString(R.string.uploader_info_dirname), "", -1, -1, this);
+ dialog.show(getSupportFragmentManager(), "createdirdialog");
+ break;
+ }
+ case R.id.action_sync_account: {
+ startSynchronization();
+ break;
+ }
+ case R.id.action_upload: {
+ showDialog(DIALOG_CHOOSE_UPLOAD_SOURCE);
+ break;
+ }
+ case R.id.action_settings: {
+ Intent settingsIntent = new Intent(this, Preferences.class);
+ startActivity(settingsIntent);
+ break;
+ }
+ case android.R.id.home: {
+ FileFragment second = getSecondFragment();
+ OCFile currentDir = getCurrentDir();
+ if((currentDir != null && currentDir.getParentId() != 0) ||
+ (second != null && second.getFile() != null)) {
+ onBackPressed();
+
}
- default:
- retval = super.onOptionsItemSelected(item);
+ break;
+ }
+ default:
+ retval = super.onOptionsItemSelected(item);
}
return retval;
}
private void startSynchronization() {
- ContentResolver.cancelSync(null, AccountAuthenticator.AUTH_TOKEN_TYPE); // cancel the current synchronizations of any ownCloud account
- Bundle bundle = new Bundle();
- bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
- ContentResolver.requestSync(
- AccountUtils.getCurrentOwnCloudAccount(this),
- AccountAuthenticator.AUTH_TOKEN_TYPE, bundle);
+ Log_OC.e(TAG, "Got to start sync");
+ if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.KITKAT) {
+ Log_OC.e(TAG, "Canceling all syncs for " + MainApp.getAuthority());
+ ContentResolver.cancelSync(null, MainApp.getAuthority()); // cancel the current synchronizations of any ownCloud account
+ Bundle bundle = new Bundle();
+ bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
+ bundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
+ Log_OC.e(TAG, "Requesting sync for " + getAccount().name + " at " + MainApp.getAuthority());
+ ContentResolver.requestSync(
+ getAccount(),
+ MainApp.getAuthority(), bundle);
+ } else {
+ Log_OC.e(TAG, "Requesting sync for " + getAccount().name + " at " + MainApp.getAuthority() + " with new API");
+ SyncRequest.Builder builder = new SyncRequest.Builder();
+ builder.setSyncAdapter(getAccount(), MainApp.getAuthority());
+ builder.setExpedited(true);
+ builder.setManual(true);
+ builder.syncOnce();
+ SyncRequest request = builder.build();
+ ContentResolver.requestSync(request);
+ }
}
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
- int i = itemPosition;
- while (i-- != 0) {
- onBackPressed();
+ if (itemPosition != 0) {
+ String targetPath = "";
+ for (int i=itemPosition; i < mDirectories.getCount() - 1; i++) {
+ targetPath = mDirectories.getItem(i) + OCFile.PATH_SEPARATOR + targetPath;
+ }
+ targetPath = OCFile.PATH_SEPARATOR + targetPath;
+ OCFile targetFolder = getStorageManager().getFileByPath(targetPath);
+ if (targetFolder != null) {
+ browseTo(targetFolder);
+ }
+
+ // the next operation triggers a new call to this method, but it's necessary to
+ // ensure that the name exposed in the action bar is the current directory when the
+ // user selected it in the navigation list
+ if (getSupportActionBar().getNavigationMode() == ActionBar.NAVIGATION_MODE_LIST && itemPosition != 0)
+ getSupportActionBar().setSelectedNavigationItem(0);
}
- // the next operation triggers a new call to this method, but it's necessary to
- // ensure that the name exposed in the action bar is the current directory when the
- // user selected it in the navigation list
- if (itemPosition != 0)
- getSupportActionBar().setSelectedNavigationItem(0);
return true;
}
/**
* Called, when the user selected something for uploading
*/
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
-
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+
if (requestCode == ACTION_SELECT_CONTENT_FROM_APPS && (resultCode == RESULT_OK || resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) {
requestSimpleUpload(data, resultCode);
-
+
} else if (requestCode == ACTION_SELECT_MULTIPLE_FILES && (resultCode == RESULT_OK || resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) {
requestMultipleUpload(data, resultCode);
-
+
}
}
}
Intent i = new Intent(this, FileUploader.class);
- i.putExtra(FileUploader.KEY_ACCOUNT, AccountUtils.getCurrentOwnCloudAccount(this));
+ i.putExtra(FileUploader.KEY_ACCOUNT, getAccount());
i.putExtra(FileUploader.KEY_LOCAL_FILE, filePaths);
i.putExtra(FileUploader.KEY_REMOTE_FILE, remotePaths);
i.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_MULTIPLE_FILES);
if (resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)
i.putExtra(FileUploader.KEY_LOCAL_BEHAVIOUR, FileUploader.LOCAL_BEHAVIOUR_MOVE);
startService(i);
-
+
} else {
- Log_OC.d("FileDisplay", "User clicked on 'Update' with no selection");
+ Log_OC.d(TAG, "User clicked on 'Update' with no selection");
Toast t = Toast.makeText(this, getString(R.string.filedisplay_no_file_selected), Toast.LENGTH_LONG);
t.show();
return;
filepath = selectedImagePath;
else
filepath = filemanagerstring;
-
+
} catch (Exception e) {
- Log_OC.e("FileDisplay", "Unexpected exception when trying to read the result of Intent.ACTION_GET_CONTENT", e);
+ Log_OC.e(TAG, "Unexpected exception when trying to read the result of Intent.ACTION_GET_CONTENT", e);
e.printStackTrace();
-
+
} finally {
if (filepath == null) {
- Log_OC.e("FileDisplay", "Couldnt resolve path to file");
+ Log_OC.e(TAG, "Couldnt resolve path to file");
Toast t = Toast.makeText(this, getString(R.string.filedisplay_unexpected_bad_get_content), Toast.LENGTH_LONG);
t.show();
return;
Intent i = new Intent(this, FileUploader.class);
i.putExtra(FileUploader.KEY_ACCOUNT,
- AccountUtils.getCurrentOwnCloudAccount(this));
+ getAccount());
String remotepath = new String();
for (int j = mDirectories.getCount() - 2; j >= 0; --j) {
remotepath += OCFile.PATH_SEPARATOR + mDirectories.getItem(j);
startService(i);
}
-
@Override
public void onBackPressed() {
- if (mDirectories.getCount() <= 1) {
- finish();
- return;
- }
- popDirname();
- mFileList.onNavigateUp();
- mCurrentDir = mFileList.getCurrentFile();
-
- if (mDualPane) {
- // Resets the FileDetailsFragment on Tablets so that it always displays
- Fragment fileFragment = getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);
- if (fileFragment != null && (fileFragment instanceof PreviewMediaFragment || !((FileDetailFragment) fileFragment).isEmpty())) {
- FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
- transaction.replace(R.id.file_details_container, new FileDetailFragment(null, null), FileDetailFragment.FTAG); // empty FileDetailFragment
- transaction.commit();
+ OCFileListFragment listOfFiles = getListOfFilesFragment();
+ if (mDualPane || getSecondFragment() == null) {
+ if (listOfFiles != null) { // should never be null, indeed
+ if (mDirectories.getCount() <= 1) {
+ finish();
+ return;
+ }
+ int levelsUp = listOfFiles.onBrowseUp();
+ for (int i=0; i < levelsUp && mDirectories.getCount() > 1 ; i++) {
+ popDirname();
+ }
}
}
-
- if(mCurrentDir.getParentId() == 0){
- ActionBar actionBar = getSupportActionBar();
- actionBar.setDisplayHomeAsUpEnabled(false);
- }
+ if (listOfFiles != null) { // should never be null, indeed
+ setFile(listOfFiles.getCurrentFile());
+ }
+ cleanSecondFragment();
+
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// responsibility of restore is preferred in onCreate() before than in onRestoreInstanceState when there are Fragments involved
- Log_OC.d(getClass().toString(), "onSaveInstanceState() start");
+ Log_OC.e(TAG, "onSaveInstanceState() start");
super.onSaveInstanceState(outState);
- outState.putParcelable(FileDetailFragment.EXTRA_FILE, mCurrentDir);
- if (mDualPane) {
- FileFragment fragment = (FileFragment) getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);
- if (fragment != null) {
- OCFile file = fragment.getFile();
- if (file != null) {
- outState.putParcelable(FileDetailFragment.EXTRA_FILE, file);
- }
- }
- }
- outState.putParcelable(FileDetailActivity.KEY_WAITING_TO_PREVIEW, mWaitingToPreview);
- Log_OC.d(getClass().toString(), "onSaveInstanceState() end");
- }
+ outState.putParcelable(FileDisplayActivity.KEY_WAITING_TO_PREVIEW, mWaitingToPreview);
+ outState.putBoolean(FileDisplayActivity.KEY_SYNC_IN_PROGRESS, mSyncInProgress);
+ //outState.putBoolean(FileDisplayActivity.KEY_REFRESH_SHARES_IN_PROGRESS, mRefreshSharesInProgress);
+ outState.putParcelable(FileDisplayActivity.KEY_WAITING_TO_SEND, mWaitingToSend);
+ Log_OC.d(TAG, "onSaveInstanceState() end");
+ }
+
+
@Override
protected void onResume() {
- Log_OC.d(getClass().toString(), "onResume() start");
super.onResume();
-
- if (AccountUtils.accountsAreSetup(this)) {
-
- if (mStorageManager == null) {
- // this is necessary for handling the come back to FileDisplayActivity when the first ownCloud account is created
- initDataFromCurrentAccount();
- if (mDualPane) {
- initFileDetailsInDualPane();
- }
- mBackFromCreatingFirstAccount = true;
- }
-
- // Listen for sync messages
- IntentFilter syncIntentFilter = new IntentFilter(FileSyncService.SYNC_MESSAGE);
- mSyncBroadcastReceiver = new SyncBroadcastReceiver();
- registerReceiver(mSyncBroadcastReceiver, syncIntentFilter);
-
- // Listen for upload messages
- IntentFilter uploadIntentFilter = new IntentFilter(FileUploader.UPLOAD_FINISH_MESSAGE);
- mUploadFinishReceiver = new UploadFinishReceiver();
- registerReceiver(mUploadFinishReceiver, uploadIntentFilter);
-
- // Listen for download messages
- IntentFilter downloadIntentFilter = new IntentFilter(FileDownloader.DOWNLOAD_ADDED_MESSAGE);
- downloadIntentFilter.addAction(FileDownloader.DOWNLOAD_FINISH_MESSAGE);
- mDownloadFinishReceiver = new DownloadFinishReceiver();
- registerReceiver(mDownloadFinishReceiver, downloadIntentFilter);
+ Log_OC.e(TAG, "onResume() start");
+
+ // Listen for sync messages
+ IntentFilter syncIntentFilter = new IntentFilter(FileSyncAdapter.EVENT_FULL_SYNC_START);
+ syncIntentFilter.addAction(FileSyncAdapter.EVENT_FULL_SYNC_END);
+ //syncIntentFilter.addAction(FileSyncAdapter.EVENT_FULL_SYNC_FOLDER_SIZE_SYNCED);
+ syncIntentFilter.addAction(FileSyncAdapter.EVENT_FULL_SYNC_FOLDER_CONTENTS_SYNCED);
+ syncIntentFilter.addAction(SynchronizeFolderOperation.EVENT_SINGLE_FOLDER_CONTENTS_SYNCED);
+ syncIntentFilter.addAction(SynchronizeFolderOperation.EVENT_SINGLE_FOLDER_SHARES_SYNCED);
+ mSyncBroadcastReceiver = new SyncBroadcastReceiver();
+ registerReceiver(mSyncBroadcastReceiver, syncIntentFilter);
+ //LocalBroadcastManager.getInstance(this).registerReceiver(mSyncBroadcastReceiver, syncIntentFilter);
+
+ // Listen for upload messages
+ IntentFilter uploadIntentFilter = new IntentFilter(FileUploader.getUploadFinishMessage());
+ mUploadFinishReceiver = new UploadFinishReceiver();
+ registerReceiver(mUploadFinishReceiver, uploadIntentFilter);
+
+ // Listen for download messages
+ IntentFilter downloadIntentFilter = new IntentFilter(FileDownloader.getDownloadAddedMessage());
+ downloadIntentFilter.addAction(FileDownloader.getDownloadFinishMessage());
+ mDownloadFinishReceiver = new DownloadFinishReceiver();
+ registerReceiver(mDownloadFinishReceiver, downloadIntentFilter);
- // List current directory
- mFileList.listDirectory(mCurrentDir); // TODO we should find the way to avoid the need of this (maybe it's not necessary yet; to check)
-
- } else {
-
- mStorageManager = null; // an invalid object will be there if all the ownCloud accounts are removed
- showDialog(DIALOG_SETUP_ACCOUNT);
-
- }
- Log_OC.d(getClass().toString(), "onResume() end");
+ // Listen for messages from the OperationsService
+ /*
+ IntentFilter operationsIntentFilter = new IntentFilter(OperationsService.ACTION_OPERATION_ADDED);
+ operationsIntentFilter.addAction(OperationsService.ACTION_OPERATION_FINISHED);
+ mOperationsServiceReceiver = new OperationsServiceReceiver();
+ LocalBroadcastManager.getInstance(this).registerReceiver(mOperationsServiceReceiver, operationsIntentFilter);
+ */
+
+ Log_OC.d(TAG, "onResume() end");
}
-
+
@Override
protected void onPause() {
- Log_OC.d(getClass().toString(), "onPause() start");
super.onPause();
+ Log_OC.e(TAG, "onPause() start");
if (mSyncBroadcastReceiver != null) {
unregisterReceiver(mSyncBroadcastReceiver);
+ //LocalBroadcastManager.getInstance(this).unregisterReceiver(mSyncBroadcastReceiver);
mSyncBroadcastReceiver = null;
}
if (mUploadFinishReceiver != null) {
unregisterReceiver(mDownloadFinishReceiver);
mDownloadFinishReceiver = null;
}
- if (!AccountUtils.accountsAreSetup(this)) {
- dismissDialog(DIALOG_SETUP_ACCOUNT);
+ /*
+ if (mOperationsServiceReceiver != null) {
+ LocalBroadcastManager.getInstance(this).unregisterReceiver(mOperationsServiceReceiver);
+ mOperationsServiceReceiver = null;
}
-
- Log_OC.d(getClass().toString(), "onPause() end");
+ */
+ Log_OC.d(TAG, "onPause() end");
}
-
- @Override
- protected void onPrepareDialog(int id, Dialog dialog, Bundle args) {
- if (id == DIALOG_SSL_VALIDATOR && mLastSslUntrustedServerResult != null) {
- ((SslValidatorDialog)dialog).updateResult(mLastSslUntrustedServerResult);
- }
- }
-
@Override
protected Dialog onCreateDialog(int id) {
Dialog dialog = null;
AlertDialog.Builder builder;
switch (id) {
- case DIALOG_SETUP_ACCOUNT: {
- builder = new AlertDialog.Builder(this);
- builder.setTitle(R.string.main_tit_accsetup);
- builder.setMessage(R.string.main_wrn_accsetup);
- builder.setCancelable(false);
- builder.setPositiveButton(android.R.string.ok, new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- createFirstAccount();
- dialog.dismiss();
- }
- });
- String message = String.format(getString(R.string.common_exit), getString(R.string.app_name));
- builder.setNegativeButton(message, new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- finish();
- }
- });
- //builder.setNegativeButton(android.R.string.cancel, this);
- dialog = builder.create();
- break;
- }
- case DIALOG_CREATE_DIR: {
- builder = new Builder(this);
- final EditText dirNameInput = new EditText(getBaseContext());
- builder.setView(dirNameInput);
- builder.setTitle(R.string.uploader_info_dirname);
- int typed_color = getResources().getColor(R.color.setup_text_typed);
- dirNameInput.setTextColor(typed_color);
- builder.setPositiveButton(android.R.string.ok,
- new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- String directoryName = dirNameInput.getText().toString();
- if (directoryName.trim().length() == 0) {
- dialog.cancel();
- return;
- }
-
- // Figure out the path where the dir needs to be created
- String path;
- if (mCurrentDir == null) {
- // this is just a patch; we should ensure that mCurrentDir never is null
- if (!mStorageManager.fileExists(OCFile.PATH_SEPARATOR)) {
- OCFile file = new OCFile(OCFile.PATH_SEPARATOR);
- mStorageManager.saveFile(file);
- }
- mCurrentDir = mStorageManager.getFileByPath(OCFile.PATH_SEPARATOR);
- }
- path = FileDisplayActivity.this.mCurrentDir.getRemotePath();
-
- // Create directory
- path += directoryName + OCFile.PATH_SEPARATOR;
- Thread thread = new Thread(new DirectoryCreator(path, AccountUtils.getCurrentOwnCloudAccount(FileDisplayActivity.this), new Handler()));
- thread.start();
-
- dialog.dismiss();
-
- showDialog(DIALOG_SHORT_WAIT);
- }
- });
- builder.setNegativeButton(R.string.common_cancel,
- new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- dialog.cancel();
- }
- });
- dialog = builder.create();
- break;
- }
case DIALOG_SHORT_WAIT: {
ProgressDialog working_dialog = new ProgressDialog(this);
working_dialog.setMessage(getResources().getString(
break;
}
case DIALOG_CHOOSE_UPLOAD_SOURCE: {
-
+
String[] items = null;
-
+
String[] allTheItems = { getString(R.string.actionbar_upload_files),
- getString(R.string.actionbar_upload_from_apps),
- getString(R.string.actionbar_failed_instant_upload) };
-
+ getString(R.string.actionbar_upload_from_apps),
+ getString(R.string.actionbar_failed_instant_upload) };
+
String[] commonItems = { getString(R.string.actionbar_upload_files),
- getString(R.string.actionbar_upload_from_apps) };
-
+ getString(R.string.actionbar_upload_from_apps) };
+
if (InstantUploadActivity.IS_ENABLED)
items = allTheItems;
else
items = commonItems;
-
+
builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.actionbar_upload);
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
if (item == 0) {
// if (!mDualPane) {
- Intent action = new Intent(FileDisplayActivity.this, UploadFilesActivity.class);
- action.putExtra(UploadFilesActivity.EXTRA_ACCOUNT,
- AccountUtils.getCurrentOwnCloudAccount(FileDisplayActivity.this));
- startActivityForResult(action, ACTION_SELECT_MULTIPLE_FILES);
- // } else {
- // TODO create and handle new fragment
- // LocalFileListFragment
- // }
+ Intent action = new Intent(FileDisplayActivity.this, UploadFilesActivity.class);
+ action.putExtra(UploadFilesActivity.EXTRA_ACCOUNT, FileDisplayActivity.this.getAccount());
+ startActivityForResult(action, ACTION_SELECT_MULTIPLE_FILES);
+ // } else {
+ // TODO create and handle new fragment
+ // LocalFileListFragment
+ // }
} else if (item == 1) {
Intent action = new Intent(Intent.ACTION_GET_CONTENT);
action = action.setType("*/*").addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(Intent.createChooser(action, getString(R.string.upload_chooser_title)),
ACTION_SELECT_CONTENT_FROM_APPS);
} else if (item == 2 && InstantUploadActivity.IS_ENABLED) {
- Account account = AccountUtils.getCurrentOwnCloudAccount(FileDisplayActivity.this);
Intent action = new Intent(FileDisplayActivity.this, InstantUploadActivity.class);
- action.putExtra(FileUploader.KEY_ACCOUNT, account);
+ action.putExtra(FileUploader.KEY_ACCOUNT, FileDisplayActivity.this.getAccount());
startActivity(action);
}
}
dialog = builder.create();
break;
}
- case DIALOG_SSL_VALIDATOR: {
- dialog = SslValidatorDialog.newInstance(this, mLastSslUntrustedServerResult, this);
- break;
- }
case DIALOG_CERT_NOT_SAVED: {
builder = new AlertDialog.Builder(this);
builder.setMessage(getResources().getString(R.string.ssl_validator_not_saved));
builder.setCancelable(false);
builder.setPositiveButton(R.string.common_ok, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- };
- });
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ };
+ });
dialog = builder.create();
break;
}
default:
dialog = null;
}
-
+
return dialog;
}
-
+
/**
* Translates a content URI of an image to a physical path
* on the disk
}
return null;
}
-
+
/**
* Pushes a directory to the drop down list
* @param directory to push
- * @throws IllegalArgumentException If the {@link OCFile#isDirectory()} returns false.
+ * @throws IllegalArgumentException If the {@link OCFile#isFolder()} returns false.
*/
public void pushDirname(OCFile directory) {
- if(!directory.isDirectory()){
+ if(!directory.isFolder()){
throw new IllegalArgumentException("Only directories may be pushed!");
}
mDirectories.insert(directory.getFileName(), 0);
- mCurrentDir = directory;
+ setFile(directory);
}
/**
return !mDirectories.isEmpty();
}
- private class DirectoryCreator implements Runnable {
- private String mTargetPath;
- private Account mAccount;
- private Handler mHandler;
-
- public DirectoryCreator(String targetPath, Account account, Handler handler) {
- mTargetPath = targetPath;
- mAccount = account;
- mHandler = handler;
- }
-
- @Override
- public void run() {
- WebdavClient wdc = OwnCloudClientUtils.createOwnCloudClient(mAccount, getApplicationContext());
- boolean created = wdc.createDirectory(mTargetPath);
- if (created) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- dismissDialog(DIALOG_SHORT_WAIT);
-
- // Save new directory in local database
- OCFile newDir = new OCFile(mTargetPath);
- newDir.setMimetype("DIR");
- newDir.setParentId(mCurrentDir.getFileId());
- mStorageManager.saveFile(newDir);
-
- // Display the new folder right away
- mFileList.listDirectory();
- }
- });
-
- } else {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- dismissDialog(DIALOG_SHORT_WAIT);
- try {
- Toast msg = Toast.makeText(FileDisplayActivity.this, R.string.create_dir_fail_msg, Toast.LENGTH_LONG);
- msg.show();
-
- } catch (NotFoundException e) {
- Log_OC.e(TAG, "Error while trying to show fail message ", e);
- }
- }
- });
- }
- }
-
- }
-
// Custom array adapter to override text colors
private class CustomArrayAdapter<T> extends ArrayAdapter<T> {
-
+
public CustomArrayAdapter(FileDisplayActivity ctx, int view) {
super(ctx, view);
}
-
+
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView(position, convertView, parent);
-
+
((TextView) v).setTextColor(getResources().getColorStateList(
android.R.color.white));
+
+ fixRoot((TextView) v );
return v;
}
-
+
public View getDropDownView(int position, View convertView,
ViewGroup parent) {
View v = super.getDropDownView(position, convertView, parent);
-
+
((TextView) v).setTextColor(getResources().getColorStateList(
android.R.color.white));
-
+
+ fixRoot((TextView) v );
return v;
}
-
+
+ private void fixRoot(TextView v) {
+ if (v.getText().equals(OCFile.PATH_SEPARATOR)) {
+ v.setText(R.string.default_display_name_for_root_folder);
+ }
+ }
+
}
private class SyncBroadcastReceiver extends BroadcastReceiver {
/**
* {@link BroadcastReceiver} to enable syncing feedback in UI
- */
- @Override
- public void onReceive(Context context, Intent intent) {
- boolean inProgress = intent.getBooleanExtra(FileSyncService.IN_PROGRESS, false);
- String accountName = intent.getStringExtra(FileSyncService.ACCOUNT_NAME);
-
- Log_OC.d("FileDisplay", "sync of account " + accountName + " is in_progress: " + inProgress);
-
- if (accountName.equals(AccountUtils.getCurrentOwnCloudAccount(context).name)) {
-
- String synchFolderRemotePath = intent.getStringExtra(FileSyncService.SYNC_FOLDER_REMOTE_PATH);
-
- boolean fillBlankRoot = false;
- if (mCurrentDir == null) {
- mCurrentDir = mStorageManager.getFileByPath("/");
- fillBlankRoot = (mCurrentDir != null);
- }
-
- if ((synchFolderRemotePath != null && mCurrentDir != null && (mCurrentDir.getRemotePath().equals(synchFolderRemotePath)))
- || fillBlankRoot ) {
- if (!fillBlankRoot)
- mCurrentDir = getStorageManager().getFileByPath(synchFolderRemotePath);
- OCFileListFragment fileListFragment = (OCFileListFragment) getSupportFragmentManager()
- .findFragmentById(R.id.fileList);
- if (fileListFragment != null) {
- fileListFragment.listDirectory(mCurrentDir);
- }
+ */
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ try {
+ String event = intent.getAction();
+ Log_OC.d(TAG, "Received broadcast " + event);
+ String accountName = intent.getStringExtra(FileSyncAdapter.EXTRA_ACCOUNT_NAME);
+ String synchFolderRemotePath = intent.getStringExtra(FileSyncAdapter.EXTRA_FOLDER_PATH);
+ RemoteOperationResult synchResult = (RemoteOperationResult)intent.getSerializableExtra(FileSyncAdapter.EXTRA_RESULT);
+ boolean sameAccount = (getAccount() != null && accountName.equals(getAccount().name) && getStorageManager() != null);
+
+ if (sameAccount) {
+
+ if (FileSyncAdapter.EVENT_FULL_SYNC_START.equals(event)) {
+ mSyncInProgress = true;
+
+ } else {
+ OCFile currentFile = (getFile() == null) ? null : getStorageManager().getFileByPath(getFile().getRemotePath());
+ OCFile currentDir = (getCurrentDir() == null) ? null : getStorageManager().getFileByPath(getCurrentDir().getRemotePath());
+
+ if (currentDir == null) {
+ // current folder was removed from the server
+ Toast.makeText( FileDisplayActivity.this,
+ String.format(getString(R.string.sync_current_folder_was_removed), mDirectories.getItem(0)),
+ Toast.LENGTH_LONG)
+ .show();
+ browseToRoot();
+
+ } else {
+ if (currentFile == null && !getFile().isFolder()) {
+ // currently selected file was removed in the server, and now we know it
+ cleanSecondFragment();
+ currentFile = currentDir;
+ }
+
+ if (synchFolderRemotePath != null && currentDir.getRemotePath().equals(synchFolderRemotePath)) {
+ OCFileListFragment fileListFragment = getListOfFilesFragment();
+ if (fileListFragment != null) {
+ fileListFragment.listDirectory(currentDir);
+ }
+ }
+ setFile(currentFile);
+ }
+
+ mSyncInProgress = (!FileSyncAdapter.EVENT_FULL_SYNC_END.equals(event) && !SynchronizeFolderOperation.EVENT_SINGLE_FOLDER_SHARES_SYNCED.equals(event));
+
+ /*
+ if (synchResult != null &&
+ synchResult.isSuccess() &&
+ (SynchronizeFolderOperation.EVENT_SINGLE_FOLDER_SYNCED.equals(event) ||
+ FileSyncAdapter.EVENT_FULL_SYNC_FOLDER_CONTENTS_SYNCED.equals(event)
+ ) &&
+ !mRefreshSharesInProgress &&
+ getFileOperationsHelper().isSharedSupported(FileDisplayActivity.this)
+ ) {
+ startGetShares();
+ }
+ */
+
+ }
+ removeStickyBroadcast(intent);
+ Log_OC.d(TAG, "Setting progress visibility to " + mSyncInProgress);
+ setSupportProgressBarIndeterminateVisibility(mSyncInProgress /*|| mRefreshSharesInProgress*/);
}
- setSupportProgressBarIndeterminateVisibility(inProgress);
- if (mBackFromCreatingFirstAccount) {
- // awful patch to fix problem with visibility of progress circle with the first refresh of the first account
- // TODO - kill this Activity when the first account has to be created instead of stack the account creation on it
- getSupportActionBar().hide();
- getSupportActionBar().show();
- mBackFromCreatingFirstAccount = false;
+ if (synchResult != null) {
+ if (synchResult.getCode().equals(RemoteOperationResult.ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED)) {
+ mLastSslUntrustedServerResult = synchResult;
+ }
}
+ } catch (RuntimeException e) {
+ // avoid app crashes after changing the serial id of RemoteOperationResult
+ // in owncloud library with broadcast notifications pending to process
removeStickyBroadcast(intent);
-
- }
-
- RemoteOperationResult synchResult = (RemoteOperationResult)intent.getSerializableExtra(FileSyncService.SYNC_RESULT);
- if (synchResult != null) {
- if (synchResult.getCode().equals(RemoteOperationResult.ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED)) {
- mLastSslUntrustedServerResult = synchResult;
- showDialog(DIALOG_SSL_VALIDATOR);
- }
}
}
}
public void onReceive(Context context, Intent intent) {
String uploadedRemotePath = intent.getStringExtra(FileDownloader.EXTRA_REMOTE_PATH);
String accountName = intent.getStringExtra(FileUploader.ACCOUNT_NAME);
- boolean sameAccount = accountName.equals(AccountUtils.getCurrentOwnCloudAccount(context).name);
- boolean isDescendant = (mCurrentDir != null) && (uploadedRemotePath != null) && (uploadedRemotePath.startsWith(mCurrentDir.getRemotePath()));
+ boolean sameAccount = getAccount() != null && accountName.equals(getAccount().name);
+ OCFile currentDir = getCurrentDir();
+ boolean isDescendant = (currentDir != null) && (uploadedRemotePath != null) && (uploadedRemotePath.startsWith(currentDir.getRemotePath()));
if (sameAccount && isDescendant) {
- OCFileListFragment fileListFragment = (OCFileListFragment) getSupportFragmentManager().findFragmentById(R.id.fileList);
- if (fileListFragment != null) {
- fileListFragment.listDirectory();
- }
+ refeshListOfFilesFragment();
}
}
-
+
}
-
-
+
+
/**
* Class waiting for broadcast events from the {@link FielDownloader} service.
*
boolean sameAccount = isSameAccount(context, intent);
String downloadedRemotePath = intent.getStringExtra(FileDownloader.EXTRA_REMOTE_PATH);
boolean isDescendant = isDescendant(downloadedRemotePath);
-
+
if (sameAccount && isDescendant) {
- updateLeftPanel();
- if (mDualPane) {
- updateRightPanel(intent.getAction(), downloadedRemotePath, intent.getBooleanExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, false));
+ refeshListOfFilesFragment();
+ refreshSecondFragment(intent.getAction(), downloadedRemotePath, intent.getBooleanExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, false));
+ }
+
+ if (mWaitingToSend != null) {
+ mWaitingToSend = getStorageManager().getFileByPath(mWaitingToSend.getRemotePath()); // Update the file to send
+ if (mWaitingToSend.isDown()) {
+ sendDownloadedFile();
}
}
}
private boolean isDescendant(String downloadedRemotePath) {
- return (mCurrentDir != null && downloadedRemotePath != null && downloadedRemotePath.startsWith(mCurrentDir.getRemotePath()));
+ OCFile currentDir = getCurrentDir();
+ return (currentDir != null && downloadedRemotePath != null && downloadedRemotePath.startsWith(currentDir.getRemotePath()));
}
private boolean isSameAccount(Context context, Intent intent) {
String accountName = intent.getStringExtra(FileDownloader.ACCOUNT_NAME);
- return (accountName != null && accountName.equals(AccountUtils.getCurrentOwnCloudAccount(context).name));
+ return (accountName != null && getAccount() != null && accountName.equals(getAccount().name));
}
}
- protected void updateLeftPanel() {
- OCFileListFragment fileListFragment = (OCFileListFragment) getSupportFragmentManager().findFragmentById(R.id.fileList);
- if (fileListFragment != null) {
- fileListFragment.listDirectory();
- }
- }
+ /**
+ * Class waiting for broadcast events from the {@link OperationsService}.
+ *
+ * Updates the list of files when a get for shares is finished; at this moment the refresh of shares is the only
+ * operation performed in {@link OperationsService}.
+ *
+ * In the future will handle the progress or finalization of all the operations performed in {@link OperationsService},
+ * probably all the operations associated to the app model.
+ */
+ private class OperationsServiceReceiver extends BroadcastReceiver {
- protected void updateRightPanel(String downloadEvent, String downloadedRemotePath, boolean success) {
- Fragment fragment = getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);
- boolean waitedPreview = (mWaitingToPreview != null && mWaitingToPreview.getRemotePath().equals(downloadedRemotePath));
- if (fragment != null && fragment instanceof FileDetailFragment) {
- FileDetailFragment detailsFragment = (FileDetailFragment) fragment;
- OCFile fileInFragment = detailsFragment.getFile();
- if (fileInFragment != null && !downloadedRemotePath.equals(fileInFragment.getRemotePath())) {
- // the user browsed to other file ; forget the automatic preview
- mWaitingToPreview = null;
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (OperationsService.ACTION_OPERATION_ADDED.equals(intent.getAction())) {
- } else if (downloadEvent.equals(FileDownloader.DOWNLOAD_ADDED_MESSAGE)) {
- // grant that the right panel updates the progress bar
- detailsFragment.listenForTransferProgress();
- detailsFragment.updateFileDetails(true, false);
+ } else if (OperationsService.ACTION_OPERATION_FINISHED.equals(intent.getAction())) {
+ //mRefreshSharesInProgress = false;
- } else if (downloadEvent.equals(FileDownloader.DOWNLOAD_FINISH_MESSAGE)) {
- // update the right panel
- if (success && waitedPreview) {
- mWaitingToPreview = mStorageManager.getFileById(mWaitingToPreview.getFileId()); // update the file from database, for the local storage path
- FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
- transaction.replace(R.id.file_details_container, new PreviewMediaFragment(mWaitingToPreview, AccountUtils.getCurrentOwnCloudAccount(this)), FileDetailFragment.FTAG);
- transaction.commit();
- mWaitingToPreview = null;
-
- } else {
- detailsFragment.updateFileDetails(false, (success));
+ Account account = intent.getParcelableExtra(OperationsService.EXTRA_ACCOUNT);
+ RemoteOperationResult getSharesResult = (RemoteOperationResult)intent.getSerializableExtra(OperationsService.EXTRA_RESULT);
+ if (getAccount() != null && account.name.equals(getAccount().name)
+ && getStorageManager() != null
+ ) {
+ refeshListOfFilesFragment();
+ }
+ if ((getSharesResult != null) &&
+ RemoteOperationResult.ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED.equals(getSharesResult.getCode())) {
+ mLastSslUntrustedServerResult = getSharesResult;
+ showUntrustedCertDialog(mLastSslUntrustedServerResult);
}
+
+ //setSupportProgressBarIndeterminateVisibility(mRefreshSharesInProgress || mSyncInProgress);
}
+
}
+
}
-
- /**
- * {@inheritDoc}
- */
- @Override
- public DataStorageManager getStorageManager() {
- return mStorageManager;
+ public void browseToRoot() {
+ OCFileListFragment listOfFiles = getListOfFilesFragment();
+ if (listOfFiles != null) { // should never be null, indeed
+ while (mDirectories.getCount() > 1) {
+ popDirname();
+ }
+ OCFile root = getStorageManager().getFileByPath(OCFile.ROOT_PATH);
+ listOfFiles.listDirectory(root);
+ setFile(listOfFiles.getCurrentFile());
+ startSyncFolderOperation(root);
+ }
+ cleanSecondFragment();
}
+
+ public void browseTo(OCFile folder) {
+ if (folder == null || !folder.isFolder()) {
+ throw new IllegalArgumentException("Trying to browse to invalid folder " + folder);
+ }
+ OCFileListFragment listOfFiles = getListOfFilesFragment();
+ if (listOfFiles != null) {
+ setNavigationListWithFolder(folder);
+ listOfFiles.listDirectory(folder);
+ setFile(listOfFiles.getCurrentFile());
+ startSyncFolderOperation(folder);
+ } else {
+ Log_OC.e(TAG, "Unexpected null when accessing list fragment");
+ }
+ cleanSecondFragment();
+ }
+
/**
* {@inheritDoc}
+ *
+ * Updates action bar and second fragment, if in dual pane mode.
*/
@Override
- public void onDirectoryClick(OCFile directory) {
+ public void onBrowsedDownTo(OCFile directory) {
pushDirname(directory);
- ActionBar actionBar = getSupportActionBar();
- actionBar.setDisplayHomeAsUpEnabled(true);
+ cleanSecondFragment();
+
+ // Sync Folder
+ startSyncFolderOperation(directory);
- if (mDualPane) {
- // Resets the FileDetailsFragment on Tablets so that it always displays
- Fragment fileFragment = getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);
- if (fileFragment != null && (fileFragment instanceof PreviewMediaFragment || !((FileDetailFragment) fileFragment).isEmpty())) {
- FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
- transaction.replace(R.id.file_details_container, new FileDetailFragment(null, null), FileDetailFragment.FTAG); // empty FileDetailFragment
- transaction.commit();
- }
- }
}
-
-
+
/**
- * {@inheritDoc}
+ * Opens the image gallery showing the image {@link OCFile} received as parameter.
+ *
+ * @param file Image {@link OCFile} to show.
*/
@Override
- public void onFileClick(OCFile file) {
- if (file != null && PreviewImageFragment.canBePreviewed(file)) {
- // preview image - it handles the download, if needed
- startPreviewImage(file);
-
- } else if (file != null && PreviewMediaFragment.canBePreviewed(file)) {
- if (file.isDown()) {
- // general preview
- startMediaPreview(file);
-
- } else {
- // automatic download, preview on finish
- startDownloadForPreview(file);
-
- }
- } else {
- // details view
- startDetails(file);
- }
- }
-
- private void startPreviewImage(OCFile file) {
+ public void startImagePreview(OCFile file) {
Intent showDetailsIntent = new Intent(this, PreviewImageActivity.class);
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_FILE, file);
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_ACCOUNT, AccountUtils.getCurrentOwnCloudAccount(this));
+ showDetailsIntent.putExtra(EXTRA_FILE, file);
+ showDetailsIntent.putExtra(EXTRA_ACCOUNT, getAccount());
startActivity(showDetailsIntent);
}
-
- private void startMediaPreview(OCFile file) {
- if (mDualPane) {
- FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
- transaction.replace(R.id.file_details_container, new PreviewMediaFragment(file, AccountUtils.getCurrentOwnCloudAccount(this)), FileDetailFragment.FTAG);
- transaction.commit();
-
- } else {
- Intent showDetailsIntent = new Intent(this, FileDetailActivity.class);
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_FILE, file);
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_ACCOUNT, AccountUtils.getCurrentOwnCloudAccount(this));
- startActivity(showDetailsIntent);
- }
- }
-
- private void startDownloadForPreview(OCFile file) {
- if (mDualPane) {
- FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
- transaction.replace(R.id.file_details_container, new FileDetailFragment(file, AccountUtils.getCurrentOwnCloudAccount(this)), FileDetailFragment.FTAG);
- transaction.commit();
- mWaitingToPreview = file;
- requestForDownload();
-
- } else {
- Intent showDetailsIntent = new Intent(this, FileDetailActivity.class);
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_FILE, file);
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_ACCOUNT, AccountUtils.getCurrentOwnCloudAccount(this));
- startActivity(showDetailsIntent);
- }
+
+ /**
+ * Stars the preview of an already down media {@link OCFile}.
+ *
+ * @param file Media {@link OCFile} to preview.
+ * @param startPlaybackPosition Media position where the playback will be started, in milliseconds.
+ * @param autoplay When 'true', the playback will start without user interactions.
+ */
+ @Override
+ public void startMediaPreview(OCFile file, int startPlaybackPosition, boolean autoplay) {
+ Fragment mediaFragment = new PreviewMediaFragment(file, getAccount(), startPlaybackPosition, autoplay);
+ setSecondFragment(mediaFragment);
+ updateFragmentsVisibility(true);
+ updateNavigationElementsInActionBar(file);
+ setFile(file);
}
-
- private void startDetails(OCFile file) {
- if (mDualPane && !file.isImage()) {
- FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
- transaction.replace(R.id.file_details_container, new FileDetailFragment(file, AccountUtils.getCurrentOwnCloudAccount(this)), FileDetailFragment.FTAG);
- transaction.commit();
- } else {
- Intent showDetailsIntent = new Intent(this, FileDetailActivity.class);
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_FILE, file);
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_ACCOUNT, AccountUtils.getCurrentOwnCloudAccount(this));
- startActivity(showDetailsIntent);
- }
+ /**
+ * Requests the download of the received {@link OCFile} , updates the UI
+ * to monitor the download progress and prepares the activity to preview
+ * or open the file when the download finishes.
+ *
+ * @param file {@link OCFile} to download and preview.
+ */
+ @Override
+ public void startDownloadForPreview(OCFile file) {
+ Fragment detailFragment = new FileDetailFragment(file, getAccount());
+ setSecondFragment(detailFragment);
+ mWaitingToPreview = file;
+ requestForDownload();
+ updateFragmentsVisibility(true);
+ updateNavigationElementsInActionBar(file);
+ setFile(file);
}
/**
- * {@inheritDoc}
+ * Shows the information of the {@link OCFile} received as a
+ * parameter in the second fragment.
+ *
+ * @param file {@link OCFile} whose details will be shown
*/
@Override
- public OCFile getInitialDirectory() {
- return mCurrentDir;
+ public void showDetails(OCFile file) {
+ Fragment detailFragment = new FileDetailFragment(file, getAccount());
+ setSecondFragment(detailFragment);
+ updateFragmentsVisibility(true);
+ updateNavigationElementsInActionBar(file);
+ setFile(file);
}
-
-
+
+
+ /**
+ * TODO
+ */
+ private void updateNavigationElementsInActionBar(OCFile chosenFile) {
+ ActionBar actionBar = getSupportActionBar();
+ if (chosenFile == null || mDualPane) {
+ // only list of files - set for browsing through folders
+ OCFile currentDir = getCurrentDir();
+ boolean noRoot = (currentDir != null && currentDir.getParentId() != 0);
+ actionBar.setDisplayHomeAsUpEnabled(noRoot);
+ actionBar.setDisplayShowTitleEnabled(!noRoot);
+ if (!noRoot) {
+ actionBar.setTitle(getString(R.string.default_display_name_for_root_folder));
+ }
+ actionBar.setNavigationMode(!noRoot ? ActionBar.NAVIGATION_MODE_STANDARD : ActionBar.NAVIGATION_MODE_LIST);
+ actionBar.setListNavigationCallbacks(mDirectories, this); // assuming mDirectories is updated
+
+ } else {
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ actionBar.setDisplayShowTitleEnabled(true);
+ actionBar.setTitle(chosenFile.getFileName());
+ actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
+ }
+ }
+
+
/**
* {@inheritDoc}
*/
@Override
public void onFileStateChanged() {
- OCFileListFragment fileListFragment = (OCFileListFragment) getSupportFragmentManager().findFragmentById(R.id.fileList);
- if (fileListFragment != null) {
- fileListFragment.listDirectory();
- }
+ refeshListOfFilesFragment();
+ updateNavigationElementsInActionBar(getSecondFragment().getFile());
}
-
+
/**
* {@inheritDoc}
*/
return mDownloaderBinder;
}
-
+
/**
* {@inheritDoc}
*/
public FileUploaderBinder getFileUploaderBinder() {
return mUploaderBinder;
}
-
-
+
+
/** Defines callbacks for service binding, passed to bindService() */
private class ListServiceConnection implements ServiceConnection {
if (mWaitingToPreview != null) {
requestForDownload();
}
-
+
} else if (component.equals(new ComponentName(FileDisplayActivity.this, FileUploader.class))) {
Log_OC.d(TAG, "Upload service connected");
mUploaderBinder = (FileUploaderBinder) service;
return;
}
// a new chance to get the mDownloadBinder through getFileDownloadBinder() - THIS IS A MESS
- if (mFileList != null)
- mFileList.listDirectory();
- if (mDualPane) {
- Fragment fragment = getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);
- if (fragment != null && fragment instanceof FileDetailFragment) {
- FileDetailFragment detailFragment = (FileDetailFragment)fragment;
- detailFragment.listenForTransferProgress();
- detailFragment.updateFileDetails(false, false);
- }
+ OCFileListFragment listOfFiles = getListOfFilesFragment();
+ if (listOfFiles != null) {
+ listOfFiles.listDirectory();
+ }
+ FileFragment secondFragment = getSecondFragment();
+ if (secondFragment != null && secondFragment instanceof FileDetailFragment) {
+ FileDetailFragment detailFragment = (FileDetailFragment)secondFragment;
+ detailFragment.listenForTransferProgress();
+ detailFragment.updateFileDetails(false, false);
}
}
}
};
-
-
+
+
/**
* Launch an intent to request the PIN code to the user before letting him use the app
*/
@Override
public void onSavedCertificate() {
- startSynchronization();
+ startSyncFolderOperation(getCurrentDir());
}
showDialog(DIALOG_CERT_NOT_SAVED);
}
+ @Override
+ public void onCancelCertificate() {
+ // nothing to do
+ }
/**
* Updates the view associated to the activity after the finish of some operation over files
*/
@Override
public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) {
+ super.onRemoteOperationFinish(operation, result);
+
if (operation instanceof RemoveFileOperation) {
onRemoveFileOperationFinish((RemoveFileOperation)operation, result);
-
+
} else if (operation instanceof RenameFileOperation) {
onRenameFileOperationFinish((RenameFileOperation)operation, result);
-
+
} else if (operation instanceof SynchronizeFileOperation) {
onSynchronizeFileOperationFinish((SynchronizeFileOperation)operation, result);
- }
+
+ } else if (operation instanceof CreateFolderOperation) {
+ onCreateFolderOperationFinish((CreateFolderOperation)operation, result);
+
+ } else if (operation instanceof CreateShareOperation) {
+ onCreateShareOperationFinish((CreateShareOperation) operation, result);
+
+ } else if (operation instanceof UnshareLinkOperation) {
+ onUnshareLinkOperationFinish((UnshareLinkOperation)operation, result);
+
+ }
+
}
+
+ private void onCreateShareOperationFinish(CreateShareOperation operation, RemoteOperationResult result) {
+ if (result.isSuccess()) {
+ refreshShowDetails();
+ refeshListOfFilesFragment();
+ }
+ }
+
+ private void onUnshareLinkOperationFinish(UnshareLinkOperation operation, RemoteOperationResult result) {
+ if (result.isSuccess()) {
+ refreshShowDetails();
+ refeshListOfFilesFragment();
+ } else if (result.getCode() == ResultCode.SHARE_NOT_FOUND) {
+ cleanSecondFragment();
+ refeshListOfFilesFragment();
+ }
+ }
+
+ private void refreshShowDetails() {
+ FileFragment details = getSecondFragment();
+ if (details != null) {
+ OCFile file = details.getFile();
+ if (file != null) {
+ file = getStorageManager().getFileByPath(file.getRemotePath());
+ if (details instanceof PreviewMediaFragment) {
+ // Refresh OCFile of the fragment
+ ((PreviewMediaFragment) details).updateFile(file);
+ } else {
+ showDetails(file);
+ }
+ }
+ invalidateOptionsMenu();
+ }
+ }
+
/**
* Updates the view associated to the activity after the finish of an operation trying to remove a
* file.
* @param result Result of the removal.
*/
private void onRemoveFileOperationFinish(RemoveFileOperation operation, RemoteOperationResult result) {
- dismissDialog(DIALOG_SHORT_WAIT);
+ dismissLoadingDialog();
if (result.isSuccess()) {
Toast msg = Toast.makeText(this, R.string.remove_success_msg, Toast.LENGTH_LONG);
msg.show();
OCFile removedFile = operation.getFile();
- if (mDualPane) {
- FileFragment details = (FileFragment) getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);
- if (details != null && removedFile.equals(details.getFile())) {
- FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
- transaction.replace(R.id.file_details_container, new FileDetailFragment(null, null)); // empty FileDetailFragment
- transaction.commit();
- }
+ getSecondFragment();
+ FileFragment second = getSecondFragment();
+ if (second != null && removedFile.equals(second.getFile())) {
+ cleanSecondFragment();
}
- if (mStorageManager.getFileById(removedFile.getParentId()).equals(mCurrentDir)) {
- mFileList.listDirectory();
+ if (getStorageManager().getFileById(removedFile.getParentId()).equals(getCurrentDir())) {
+ refeshListOfFilesFragment();
}
-
+
} else {
Toast msg = Toast.makeText(this, R.string.remove_fail_msg, Toast.LENGTH_LONG);
msg.show();
if (result.isSslRecoverableException()) {
mLastSslUntrustedServerResult = result;
- showDialog(DIALOG_SSL_VALIDATOR);
+ showUntrustedCertDialog(mLastSslUntrustedServerResult);
+ }
+ }
+ }
+
+ /**
+ * Updates the view associated to the activity after the finish of an operation trying create a new folder
+ *
+ * @param operation Creation operation performed.
+ * @param result Result of the creation.
+ */
+ private void onCreateFolderOperationFinish(CreateFolderOperation operation, RemoteOperationResult result) {
+ if (result.isSuccess()) {
+ dismissLoadingDialog();
+ refeshListOfFilesFragment();
+
+ } else {
+ dismissLoadingDialog();
+ if (result.getCode() == ResultCode.INVALID_CHARACTER_IN_NAME) {
+ Toast.makeText(FileDisplayActivity.this, R.string.filename_forbidden_characters, Toast.LENGTH_LONG).show();
+ } else {
+ try {
+ Toast msg = Toast.makeText(FileDisplayActivity.this, R.string.create_dir_fail_msg, Toast.LENGTH_LONG);
+ msg.show();
+
+ } catch (NotFoundException e) {
+ Log_OC.e(TAG, "Error while trying to show fail message " , e);
+ }
}
}
}
+
/**
* Updates the view associated to the activity after the finish of an operation trying to rename a
* file.
* @param result Result of the renaming.
*/
private void onRenameFileOperationFinish(RenameFileOperation operation, RemoteOperationResult result) {
- dismissDialog(DIALOG_SHORT_WAIT);
+ dismissLoadingDialog();
OCFile renamedFile = operation.getFile();
if (result.isSuccess()) {
if (mDualPane) {
- FileFragment details = (FileFragment) getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);
+ FileFragment details = getSecondFragment();
if (details != null && details instanceof FileDetailFragment && renamedFile.equals(details.getFile()) ) {
- ((FileDetailFragment) details).updateFileDetails(renamedFile, AccountUtils.getCurrentOwnCloudAccount(this));
+ ((FileDetailFragment) details).updateFileDetails(renamedFile, getAccount());
}
}
- if (mStorageManager.getFileById(renamedFile.getParentId()).equals(mCurrentDir)) {
- mFileList.listDirectory();
+ if (getStorageManager().getFileById(renamedFile.getParentId()).equals(getCurrentDir())) {
+ refeshListOfFilesFragment();
}
-
+
} else {
if (result.getCode().equals(ResultCode.INVALID_LOCAL_FILE_NAME)) {
Toast msg = Toast.makeText(this, R.string.rename_local_fail_msg, Toast.LENGTH_LONG);
msg.show();
// TODO throw again the new rename dialog
+ } if (result.getCode().equals(ResultCode.INVALID_CHARACTER_IN_NAME)) {
+ Toast msg = Toast.makeText(this, R.string.filename_forbidden_characters, Toast.LENGTH_LONG);
+ msg.show();
} else {
Toast msg = Toast.makeText(this, R.string.rename_server_fail_msg, Toast.LENGTH_LONG);
msg.show();
if (result.isSslRecoverableException()) {
mLastSslUntrustedServerResult = result;
- showDialog(DIALOG_SSL_VALIDATOR);
+ showUntrustedCertDialog(mLastSslUntrustedServerResult);
}
}
}
private void onSynchronizeFileOperationFinish(SynchronizeFileOperation operation, RemoteOperationResult result) {
- dismissDialog(DIALOG_SHORT_WAIT);
+ dismissLoadingDialog();
OCFile syncedFile = operation.getLocalFile();
if (!result.isSuccess()) {
if (result.getCode() == ResultCode.SYNC_CONFLICT) {
Intent i = new Intent(this, ConflictsResolveActivity.class);
i.putExtra(ConflictsResolveActivity.EXTRA_FILE, syncedFile);
- i.putExtra(ConflictsResolveActivity.EXTRA_ACCOUNT, AccountUtils.getCurrentOwnCloudAccount(this));
+ i.putExtra(ConflictsResolveActivity.EXTRA_ACCOUNT, getAccount());
startActivity(i);
-
- } else {
- Toast msg = Toast.makeText(this, R.string.sync_file_fail_msg, Toast.LENGTH_LONG);
- msg.show();
- }
-
+
+ }
+
} else {
if (operation.transferWasRequested()) {
- mFileList.listDirectory();
+ refeshListOfFilesFragment();
onTransferStateChanged(syncedFile, true, true);
-
+
} else {
Toast msg = Toast.makeText(this, R.string.sync_file_nothing_to_do_msg, Toast.LENGTH_LONG);
msg.show();
*/
@Override
public void onTransferStateChanged(OCFile file, boolean downloading, boolean uploading) {
- /*OCFileListFragment fileListFragment = (OCFileListFragment) getSupportFragmentManager().findFragmentById(R.id.fileList);
- if (fileListFragment != null) {
- fileListFragment.listDirectory();
- }*/
if (mDualPane) {
- FileFragment details = (FileFragment) getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);
+ FileFragment details = getSecondFragment();
if (details != null && details instanceof FileDetailFragment && file.equals(details.getFile()) ) {
if (downloading || uploading) {
- ((FileDetailFragment)details).updateFileDetails(file, AccountUtils.getCurrentOwnCloudAccount(this));
+ ((FileDetailFragment)details).updateFileDetails(file, getAccount());
} else {
((FileDetailFragment)details).updateFileDetails(false, true);
}
}
- @Override
- public void showFragmentWithDetails(OCFile file) {
- if (mDualPane) {
- FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
- transaction.replace(R.id.file_details_container, new FileDetailFragment(file, AccountUtils.getCurrentOwnCloudAccount(this)), FileDetailFragment.FTAG);
- transaction.commit();
-
- } else {
- Intent showDetailsIntent = new Intent(this, FileDetailActivity.class);
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_FILE, file);
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_ACCOUNT, AccountUtils.getCurrentOwnCloudAccount(this));
- showDetailsIntent.putExtra(FileDetailActivity.EXTRA_MODE, FileDetailActivity.MODE_DETAILS);
- startActivity(showDetailsIntent);
- }
- }
-
public void onDismiss(EditNameDialog dialog) {
- //dialog.dismiss();
if (dialog.getResult()) {
String newDirectoryName = dialog.getNewFilename().trim();
- Log.d(TAG, "'create directory' dialog dismissed with new name " + newDirectoryName);
+ Log_OC.d(TAG, "'create directory' dialog dismissed with new name " + newDirectoryName);
if (newDirectoryName.length() > 0) {
- String path;
- if (mCurrentDir == null) {
- // this is just a patch; we should ensure that mCurrentDir never is null
- if (!mStorageManager.fileExists(OCFile.PATH_SEPARATOR)) {
- OCFile file = new OCFile(OCFile.PATH_SEPARATOR);
- mStorageManager.saveFile(file);
- }
- mCurrentDir = mStorageManager.getFileByPath(OCFile.PATH_SEPARATOR);
- }
- path = FileDisplayActivity.this.mCurrentDir.getRemotePath();
-
+ String path = getCurrentDir().getRemotePath();
+
// Create directory
path += newDirectoryName + OCFile.PATH_SEPARATOR;
- Thread thread = new Thread(new DirectoryCreator(path, AccountUtils.getCurrentOwnCloudAccount(FileDisplayActivity.this), new Handler()));
- thread.start();
-
- showDialog(DIALOG_SHORT_WAIT);
+ RemoteOperation operation = new CreateFolderOperation(path, false, getStorageManager());
+ operation.execute( getAccount(),
+ FileDisplayActivity.this,
+ FileDisplayActivity.this,
+ getHandler(),
+ FileDisplayActivity.this);
+
+ showLoadingDialog();
}
}
}
+
private void requestForDownload() {
- Account account = AccountUtils.getCurrentOwnCloudAccount(this);
+ Account account = getAccount();
if (!mDownloaderBinder.isDownloading(account, mWaitingToPreview)) {
Intent i = new Intent(this, FileDownloader.class);
i.putExtra(FileDownloader.EXTRA_ACCOUNT, account);
}
}
+
+ private OCFile getCurrentDir() {
+ OCFile file = getFile();
+ if (file != null) {
+ if (file.isFolder()) {
+ return file;
+ } else if (getStorageManager() != null) {
+ String parentPath = file.getRemotePath().substring(0, file.getRemotePath().lastIndexOf(file.getFileName()));
+ return getStorageManager().getFileByPath(parentPath);
+ }
+ }
+ return null;
+ }
+
+ public void startSyncFolderOperation(OCFile folder) {
+ long currentSyncTime = System.currentTimeMillis();
+
+ mSyncInProgress = true;
+
+ // perform folder synchronization
+ RemoteOperation synchFolderOp = new SynchronizeFolderOperation( folder,
+ currentSyncTime,
+ false,
+ getFileOperationsHelper().isSharedSupported(this),
+ getStorageManager(),
+ getAccount(),
+ getApplicationContext()
+ );
+ synchFolderOp.execute(getAccount(), this, null, null, this);
+
+ setSupportProgressBarIndeterminateVisibility(true);
+ }
+
+ /*
+ private void startGetShares() {
+ // Get shared files/folders
+ Intent intent = new Intent(this, OperationsService.class);
+ intent.putExtra(OperationsService.EXTRA_ACCOUNT, getAccount());
+ startService(intent);
+
+ mRefreshSharesInProgress = true;
+ }
+ */
+
+ /**
+ * Show untrusted cert dialog
+ */
+ public void showUntrustedCertDialog(RemoteOperationResult result) {
+ // Show a dialog with the certificate info
+ SslUntrustedCertDialog dialog = SslUntrustedCertDialog.newInstanceForFullSslError((CertificateCombinedException)result.getException());
+ FragmentManager fm = getSupportFragmentManager();
+ FragmentTransaction ft = fm.beginTransaction();
+ dialog.show(ft, DIALOG_UNTRUSTED_CERT);
+ }
+
+ /**
+ * Requests the download of the received {@link OCFile} , updates the UI
+ * to monitor the download progress and prepares the activity to send the file
+ * when the download finishes.
+ *
+ * @param file {@link OCFile} to download and preview.
+ */
+ @Override
+ public void startDownloadForSending(OCFile file) {
+ mWaitingToSend = file;
+ requestForDownload(mWaitingToSend);
+ boolean hasSecondFragment = (getSecondFragment()!= null);
+ updateFragmentsVisibility(hasSecondFragment);
+ }
+
+ private void requestForDownload(OCFile file) {
+ Account account = getAccount();
+ if (!mDownloaderBinder.isDownloading(account, file)) {
+ Intent i = new Intent(this, FileDownloader.class);
+ i.putExtra(FileDownloader.EXTRA_ACCOUNT, account);
+ i.putExtra(FileDownloader.EXTRA_FILE, file);
+ startService(i);
+ }
+ }
+
+ private void sendDownloadedFile(){
+ getFileOperationsHelper().sendDownloadedFile(mWaitingToSend, this);
+ mWaitingToSend = null;
+ }
}
import android.widget.ListView;
import android.widget.TextView;
+import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.owncloud.android.R;
+import com.owncloud.android.utils.DisplayUtils;
+
/**
* Activity showing a text message and, optionally, a couple list of single or paired text strings.
} else {
listView.setVisibility(View.GONE);
}
+
+ ActionBar actionBar = getSupportActionBar();
+ actionBar.setIcon(DisplayUtils.getSeasonalIconId());
}
public class ExplanationListAdapterView extends ArrayAdapter<String> {
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2014 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.ui.activity;
+
+public abstract class HookActivity extends FileActivity {
+
+ private static final String TAG = HookActivity.class.getName();
+
+}
* Copyright (C) 2012-2013 ownCloud Inc.
*
* 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.
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
import java.util.ArrayList;
import java.util.List;
+import com.owncloud.android.R;
+import com.owncloud.android.authentication.AccountUtils;
+import com.owncloud.android.db.DbHandler;
+import com.owncloud.android.files.InstantUploadBroadcastReceiver;
+import com.owncloud.android.files.services.FileUploader;
+import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.Log_OC;
+
import android.accounts.Account;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
-import android.util.Log;
import android.util.SparseArray;
import android.view.Gravity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
-import com.owncloud.android.AccountUtils;
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.R;
-import com.owncloud.android.db.DbHandler;
-import com.owncloud.android.files.InstantUploadBroadcastReceiver;
-import com.owncloud.android.files.services.FileUploader;
-import com.owncloud.android.utils.FileStorageUtils;
/**
* This Activity is used to display a list with images they could not be
* sub-menu underneath the 'Upload' menu-item
*
* @author andomaex / Matthias Baumann
- *
- * 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. (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 de/
*/
public class InstantUploadActivity extends Activity {
super.onCreate(savedInstanceState);
setContentView(R.layout.failed_upload_files);
- Button delete_all_btn = (Button) findViewById(R.id.failed_upload_delete_all_btn);
- delete_all_btn.setOnClickListener(getDeleteListner());
- Button retry_all_btn = (Button) findViewById(R.id.failed_upload_retry_all_btn);
- retry_all_btn.setOnClickListener(getRetryListner());
+ Button deleteAllBtn = (Button) findViewById(R.id.failed_upload_delete_all_btn);
+ deleteAllBtn.setOnClickListener(getDeleteListner());
+ Button retryAllBtn = (Button) findViewById(R.id.failed_upload_retry_all_btn);
+ retryAllBtn.setOnClickListener(getRetryListner());
this.failed_upload_all_cb = (CheckBox) findViewById(R.id.failed_upload_headline_cb);
failed_upload_all_cb.setOnCheckedChangeListener(getCheckAllListener());
listView = (LinearLayout) findViewById(R.id.failed_upload_scrollviewlayout);
-
+
loadListView(true);
}
loadmoreBtn = new Button(this);
loadmoreBtn.setId(42);
loadmoreBtn.setText(getString(R.string.failed_upload_load_more_images));
- loadmoreBtn.setBackgroundResource(R.color.owncloud_white);
+ loadmoreBtn.setBackgroundResource(R.color.background_color);
loadmoreBtn.setTextSize(12);
loadmoreBtn.setOnClickListener(new OnClickListener() {
@Override
TextView failureTextView = new TextView(this);
failureTextView.setText(getString(R.string.failed_upload_failure_text) + message);
- failureTextView.setBackgroundResource(R.color.owncloud_white);
+ failureTextView.setBackgroundResource(R.color.background_color);
failureTextView.setTextSize(8);
failureTextView.setOnLongClickListener(getOnLongClickListener(message));
failureTextView.setPadding(5, 5, 5, 10);
TextView retryButton = new TextView(this);
retryButton.setId(id);
retryButton.setText(img_path);
- retryButton.setBackgroundResource(R.color.owncloud_white);
+ retryButton.setBackgroundResource(R.color.background_color);
retryButton.setTextSize(8);
retryButton.setOnClickListener(getImageButtonOnClickListener(img_path));
retryButton.setOnLongClickListener(getOnLongClickListener(message));
@Override
public boolean onLongClick(View v) {
- Log.d(LOG_TAG, message);
+ Log_OC.d(LOG_TAG, message);
Toast toast = Toast.makeText(InstantUploadActivity.this, getString(R.string.failed_upload_retry_text)
+ message, Toast.LENGTH_LONG);
toast.show();
private CheckBox getFileCheckbox(int id) {
CheckBox retryCB = new CheckBox(this);
retryCB.setId(id);
- retryCB.setBackgroundResource(R.color.owncloud_white);
+ retryCB.setBackgroundResource(R.color.background_color);
retryCB.setTextSize(8);
retryCB.setTag(retry_chexbox_tag);
return retryCB;
+++ /dev/null
-/* ownCloud Android client application\r
- * Copyright (C) 2011 Bartek Przybylski\r
- *\r
- * This program is free software: you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License version 2,\r
- * as published by the Free Software Foundation.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program. If not, see <http://www.gnu.org/licenses/>.\r
- *\r
- */\r
-package com.owncloud.android.ui.activity;\r
-\r
-import com.actionbarsherlock.app.SherlockFragmentActivity;\r
-import com.owncloud.android.authenticator.AccountAuthenticator;\r
-import com.owncloud.android.ui.adapter.LandingScreenAdapter;\r
-\r
-import android.accounts.Account;\r
-import android.accounts.AccountManager;\r
-import android.app.AlertDialog;\r
-import android.app.Dialog;\r
-import android.content.DialogInterface;\r
-import android.content.DialogInterface.OnClickListener;\r
-import android.content.Intent;\r
-import android.os.Bundle;\r
-import android.view.View;\r
-import android.widget.AdapterView;\r
-import android.widget.AdapterView.OnItemClickListener;\r
-import android.widget.GridView;\r
-import android.widget.Toast;\r
-import com.owncloud.android.R;\r
-\r
-/**\r
- * This activity is used as a landing page when the user first opens this app.\r
- * \r
- * @author Lennart Rosam\r
- * \r
- */\r
-public class LandingActivity extends SherlockFragmentActivity implements\r
- OnClickListener, OnItemClickListener {\r
-\r
- public static final int DIALOG_SETUP_ACCOUNT = 1;\r
-\r
- @Override\r
- protected void onCreate(Bundle savedInstanceState) {\r
- super.onCreate(savedInstanceState);\r
- setContentView(R.layout.main);\r
-\r
- // Fill the grid view of the landing screen with icons\r
- GridView landingScreenItems = (GridView) findViewById(R.id.homeScreenGrid);\r
- landingScreenItems.setAdapter(new LandingScreenAdapter(this));\r
- landingScreenItems.setOnItemClickListener(this);\r
-\r
- // Check, if there are ownCloud accounts\r
- if (!accountsAreSetup()) {\r
- showDialog(DIALOG_SETUP_ACCOUNT);\r
- } else {\r
- // Start device tracking service\r
- Intent locationServiceIntent = new Intent();\r
- locationServiceIntent\r
- .setAction("com.owncloud.android.location.LocationLauncher");\r
- sendBroadcast(locationServiceIntent);\r
- }\r
-\r
- }\r
-\r
- @Override\r
- protected void onRestart() {\r
- super.onRestart();\r
- // Check, if there are ownCloud accounts\r
- if (!accountsAreSetup()) {\r
- showDialog(DIALOG_SETUP_ACCOUNT);\r
- }\r
- }\r
-\r
- @Override\r
- protected void onRestoreInstanceState(Bundle savedInstanceState) {\r
- super.onRestoreInstanceState(savedInstanceState);\r
- // Check, if there are ownCloud accounts\r
- if (!accountsAreSetup()) {\r
- showDialog(DIALOG_SETUP_ACCOUNT);\r
- }\r
- }\r
-\r
- @Override\r
- protected Dialog onCreateDialog(int id) {\r
- Dialog dialog;\r
- switch (id) {\r
- case DIALOG_SETUP_ACCOUNT:\r
- AlertDialog.Builder builder = new AlertDialog.Builder(this);\r
- builder.setTitle(R.string.main_tit_accsetup);\r
- builder.setMessage(R.string.main_wrn_accsetup);\r
- builder.setCancelable(false);\r
- builder.setPositiveButton(R.string.common_ok, this);\r
- builder.setNegativeButton(R.string.common_cancel, this);\r
- dialog = builder.create();\r
- break;\r
- default:\r
- dialog = null;\r
- }\r
-\r
- return dialog;\r
- }\r
-\r
- public void onClick(DialogInterface dialog, int which) {\r
- // In any case - we won't need it anymore\r
- dialog.dismiss();\r
- switch (which) {\r
- case DialogInterface.BUTTON_POSITIVE:\r
- Intent intent = new Intent("android.settings.ADD_ACCOUNT_SETTINGS");\r
- intent.putExtra("authorities",\r
- new String[] { AccountAuthenticator.AUTH_TOKEN_TYPE });\r
- startActivity(intent);\r
- break;\r
- case DialogInterface.BUTTON_NEGATIVE:\r
- finish();\r
- }\r
-\r
- }\r
-\r
- @Override\r
- /**\r
- * Start an activity based on the selection\r
- * the user made\r
- */\r
- public void onItemClick(AdapterView<?> parent, View view, int position,\r
- long id) {\r
- Intent intent;\r
- intent = (Intent) parent.getAdapter().getItem(position);\r
- if (intent != null) {\r
- startActivity(intent);\r
- } else {\r
- // TODO: Implement all of this and make this text go away ;-)\r
- Toast toast = Toast.makeText(this, "Not yet implemented!",\r
- Toast.LENGTH_SHORT);\r
- toast.show();\r
- }\r
- }\r
-\r
- /**\r
- * Checks, whether or not there are any ownCloud accounts setup.\r
- * \r
- * @return true, if there is at least one account.\r
- */\r
- private boolean accountsAreSetup() {\r
- AccountManager accMan = AccountManager.get(this);\r
- Account[] accounts = accMan\r
- .getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE);\r
- return accounts.length > 0;\r
- }\r
-\r
-}\r
import com.actionbarsherlock.view.MenuItem;
import com.owncloud.android.R;
import com.owncloud.android.ui.adapter.LogListAdapter;
+import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.FileStorageUtils;
+
public class LogHistoryActivity extends SherlockPreferenceActivity implements OnPreferenceChangeListener {
String logpath = FileStorageUtils.getLogPath();
File logDIR = null;
setContentView(R.layout.log_send_file);
setTitle("Log History");
ActionBar actionBar = getSherlock().getActionBar();
+ actionBar.setIcon(DisplayUtils.getSeasonalIconId());
actionBar.setDisplayHomeAsUpEnabled(true);
ListView listView = (ListView) findViewById(android.R.id.list);
Button deleteHistoryButton = (Button) findViewById(R.id.deleteLogHistoryButton);
+
deleteHistoryButton.setOnClickListener(new OnClickListener() {
@Override
import java.util.Arrays;
+import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockFragmentActivity;
-
import com.owncloud.android.R;
+import com.owncloud.android.utils.DisplayUtils;
import android.app.AlertDialog;
import android.content.DialogInterface;
public final static String EXTRA_ACTIVITY = "com.owncloud.android.ui.activity.PinCodeActivity.ACTIVITY";
public final static String EXTRA_NEW_STATE = "com.owncloud.android.ui.activity.PinCodeActivity.NEW_STATE";
- Button bCancel;
- TextView mPinHdr;
- TextView mPinHdrExplanation;
- EditText mText1;
- EditText mText2;
- EditText mText3;
- EditText mText4;
+ private Button mBCancel;
+ private TextView mPinHdr;
+ private TextView mPinHdrExplanation;
+ private EditText mText1;
+ private EditText mText2;
+ private EditText mText3;
+ private EditText mText4;
- String [] tempText ={"","","",""};
+ private String [] mTempText ={"","","",""};
- String activity;
+ private String mActivity;
- boolean confirmingPinCode = false;
- boolean pinCodeChecked = false;
- boolean newPasswordEntered = false;
- boolean bChange = true; // to control that only one blocks jump
- int tCounter ; // Count the number of attempts an user could introduce the PIN code
+ private boolean mConfirmingPinCode = false;
+ private boolean mPinCodeChecked = false;
+ private boolean mNewPasswordEntered = false;
+ private boolean mBChange = true; // to control that only one blocks jump
+ //private int mTCounter ; // Count the number of attempts an user could introduce the PIN code
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.pincodelock);
Intent intent = getIntent();
- activity = intent.getStringExtra(EXTRA_ACTIVITY);
+ mActivity = intent.getStringExtra(EXTRA_ACTIVITY);
- bCancel = (Button) findViewById(R.id.cancel);
+ mBCancel = (Button) findViewById(R.id.cancel);
mPinHdr = (TextView) findViewById(R.id.pinHdr);
mPinHdrExplanation = (TextView) findViewById(R.id.pinHdrExpl);
mText1 = (EditText) findViewById(R.id.txt1);
mText3 = (EditText) findViewById(R.id.txt3);
mText4 = (EditText) findViewById(R.id.txt4);
-
-
SharedPreferences appPrefs = PreferenceManager
.getDefaultSharedPreferences(getApplicationContext());
// In a previous version settings is allow from start
if ( (appPrefs.getString("PrefPinCode1", null) == null ) ){
setChangePincodeView(true);
- pinCodeChecked = true;
- newPasswordEntered = true;
+ mPinCodeChecked = true;
+ mNewPasswordEntered = true;
}else{
if (appPrefs.getBoolean("set_pincode", false)){
// pincode activated
- if (activity.equals("preferences")){
+ if (mActivity.equals("preferences")){
// PIN has been activated yet
mPinHdr.setText(R.string.pincode_configure_your_pin);
mPinHdrExplanation.setVisibility(View.VISIBLE);
- pinCodeChecked = true ; // No need to check it
+ mPinCodeChecked = true ; // No need to check it
setChangePincodeView(true);
}else{
// PIN active
- bCancel.setVisibility(View.INVISIBLE);
- bCancel.setVisibility(View.GONE);
+ mBCancel.setVisibility(View.INVISIBLE);
+ mBCancel.setVisibility(View.GONE);
mPinHdr.setText(R.string.pincode_enter_pin_code);
mPinHdrExplanation.setVisibility(View.INVISIBLE);
setChangePincodeView(false);
// pincode removal
mPinHdr.setText(R.string.pincode_remove_your_pincode);
mPinHdrExplanation.setVisibility(View.INVISIBLE);
- pinCodeChecked = false;
+ mPinCodeChecked = false;
setChangePincodeView(true);
}
}
setTextListeners();
-
+ ActionBar actionBar = getSupportActionBar();
+ actionBar.setIcon(DisplayUtils.getSeasonalIconId());
}
protected void setInitVars(){
- confirmingPinCode = false;
- pinCodeChecked = false;
- newPasswordEntered = false;
+ mConfirmingPinCode = false;
+ mPinCodeChecked = false;
+ mNewPasswordEntered = false;
}
protected void setInitView(){
- bCancel.setVisibility(View.INVISIBLE);
- bCancel.setVisibility(View.GONE);
+ mBCancel.setVisibility(View.INVISIBLE);
+ mBCancel.setVisibility(View.GONE);
mPinHdr.setText(R.string.pincode_enter_pin_code);
mPinHdrExplanation.setVisibility(View.INVISIBLE);
}
protected void setChangePincodeView(boolean state){
if(state){
- bCancel.setVisibility(View.VISIBLE);
- bCancel.setOnClickListener(new OnClickListener() {
+ mBCancel.setVisibility(View.VISIBLE);
+ mBCancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
@Override
public void afterTextChanged(Editable s) {
if (s.length() > 0) {
- if (!confirmingPinCode){
- tempText[0] = mText1.getText().toString();
+ if (!mConfirmingPinCode){
+ mTempText[0] = mText1.getText().toString();
}
mText2.requestFocus();
@Override
public void afterTextChanged(Editable s) {
if (s.length() > 0) {
- if (!confirmingPinCode){
- tempText[1] = mText2.getText().toString();
+ if (!mConfirmingPinCode){
+ mTempText[1] = mText2.getText().toString();
}
mText3.requestFocus();
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_DEL && bChange) {
+ if (keyCode == KeyEvent.KEYCODE_DEL && mBChange) {
mText1.setText("");
mText1.requestFocus();
- if (!confirmingPinCode)
- tempText[0] = "";
- bChange= false;
+ if (!mConfirmingPinCode)
+ mTempText[0] = "";
+ mBChange= false;
- }else if(!bChange){
- bChange=true;
+ }else if(!mBChange){
+ mBChange=true;
}
return false;
@Override
public void afterTextChanged(Editable s) {
if (s.length() > 0) {
- if (!confirmingPinCode){
- tempText[2] = mText3.getText().toString();
+ if (!mConfirmingPinCode){
+ mTempText[2] = mText3.getText().toString();
}
mText4.requestFocus();
}
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_DEL && bChange) {
+ if (keyCode == KeyEvent.KEYCODE_DEL && mBChange) {
mText2.requestFocus();
- if (!confirmingPinCode)
- tempText[1] = "";
+ if (!mConfirmingPinCode)
+ mTempText[1] = "";
mText2.setText("");
- bChange= false;
+ mBChange= false;
- }else if(!bChange){
- bChange=true;
+ }else if(!mBChange){
+ mBChange=true;
}
return false;
public void afterTextChanged(Editable s) {
if (s.length() > 0) {
- if (!confirmingPinCode){
- tempText[3] = mText4.getText().toString();
+ if (!mConfirmingPinCode){
+ mTempText[3] = mText4.getText().toString();
}
mText1.requestFocus();
- if (!pinCodeChecked){
- pinCodeChecked = checkPincode();
+ if (!mPinCodeChecked){
+ mPinCodeChecked = checkPincode();
}
- if (pinCodeChecked && activity.equals("FileDisplayActivity")){
+ if (mPinCodeChecked &&
+ ( mActivity.equals("FileDisplayActivity") || mActivity.equals("PreviewImageActivity") ) ){
finish();
- } else if (pinCodeChecked){
+ } else if (mPinCodeChecked){
Intent intent = getIntent();
String newState = intent.getStringExtra(EXTRA_NEW_STATE);
}else{
- if (!confirmingPinCode){
+ if (!mConfirmingPinCode){
pinCodeChangeRequest();
} else {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_DEL && bChange) {
+ if (keyCode == KeyEvent.KEYCODE_DEL && mBChange) {
mText3.requestFocus();
- if (!confirmingPinCode)
- tempText[2]="";
+ if (!mConfirmingPinCode)
+ mTempText[2]="";
mText3.setText("");
- bChange= false;
+ mBChange= false;
- }else if(!bChange){
- bChange=true;
+ }else if(!mBChange){
+ mBChange=true;
}
return false;
}
clearBoxes();
mPinHdr.setText(R.string.pincode_reenter_your_pincode);
mPinHdrExplanation.setVisibility(View.INVISIBLE);
- confirmingPinCode =true;
+ mConfirmingPinCode =true;
}
String pText3 = appPrefs.getString("PrefPinCode3", null);
String pText4 = appPrefs.getString("PrefPinCode4", null);
- if ( tempText[0].equals(pText1) &&
- tempText[1].equals(pText2) &&
- tempText[2].equals(pText3) &&
- tempText[3].equals(pText4) ) {
+ if ( mTempText[0].equals(pText1) &&
+ mTempText[1].equals(pText2) &&
+ mTempText[2].equals(pText3) &&
+ mTempText[3].equals(pText4) ) {
return true;
}else {
- Arrays.fill(tempText, null);
+ Arrays.fill(mTempText, null);
AlertDialog aDialog = new AlertDialog.Builder(this).create();
CharSequence errorSeq = getString(R.string.common_error);
aDialog.setTitle(errorSeq);
clearBoxes();
mPinHdr.setText(R.string.pincode_enter_pin_code);
mPinHdrExplanation.setVisibility(View.INVISIBLE);
- newPasswordEntered = true;
- confirmingPinCode = false;
+ mNewPasswordEntered = true;
+ mConfirmingPinCode = false;
}
protected void confirmPincode(){
- confirmingPinCode = false;
+ mConfirmingPinCode = false;
String rText1 = mText1.getText().toString();
String rText2 = mText2.getText().toString();
String rText3 = mText3.getText().toString();
String rText4 = mText4.getText().toString();
- if ( tempText[0].equals(rText1) &&
- tempText[1].equals(rText2) &&
- tempText[2].equals(rText3) &&
- tempText[3].equals(rText4) ) {
+ if ( mTempText[0].equals(rText1) &&
+ mTempText[1].equals(rText2) &&
+ mTempText[2].equals(rText3) &&
+ mTempText[3].equals(rText4) ) {
savePincodeAndExit();
} else {
- Arrays.fill(tempText, null);
+ Arrays.fill(mTempText, null);
AlertDialog aDialog = new AlertDialog.Builder(this).create();
CharSequence errorSeq = getString(R.string.common_error);
aDialog.setTitle(errorSeq);
SharedPreferences.Editor appPrefs = PreferenceManager
.getDefaultSharedPreferences(getApplicationContext()).edit();
- appPrefs.putString("PrefPinCode1", tempText[0]);
- appPrefs.putString("PrefPinCode2",tempText[1]);
- appPrefs.putString("PrefPinCode3", tempText[2]);
- appPrefs.putString("PrefPinCode4", tempText[3]);
+ appPrefs.putString("PrefPinCode1", mTempText[0]);
+ appPrefs.putString("PrefPinCode2",mTempText[1]);
+ appPrefs.putString("PrefPinCode3", mTempText[2]);
+ appPrefs.putString("PrefPinCode4", mTempText[3]);
appPrefs.putBoolean("set_pincode",true);
appPrefs.commit();
public boolean onKeyDown(int keyCode, KeyEvent event){
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount()== 0){
- if (activity.equals("preferences")){
+ if (mActivity.equals("preferences")){
SharedPreferences.Editor appPrefsE = PreferenceManager
.getDefaultSharedPreferences(getApplicationContext()).edit();
*/
package com.owncloud.android.ui.activity;
-import java.io.File;
-import java.util.Vector;
-
+import android.accounts.Account;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.net.Uri;
import android.os.Bundle;
-import android.os.Environment;
import android.preference.CheckBoxPreference;
-import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
+import android.preference.PreferenceCategory;
import android.preference.PreferenceManager;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockPreferenceActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.OwnCloudSession;
import com.owncloud.android.R;
+import com.owncloud.android.authentication.AccountUtils;
import com.owncloud.android.db.DbHandler;
+import com.owncloud.android.utils.DisplayUtils;
+import com.owncloud.android.utils.Log_OC;
+
/**
* An Activity that allows the user to change the application's settings.
*
* @author Bartek Przybylski
- *
+ * @author David A. Velasco
*/
-public class Preferences extends SherlockPreferenceActivity implements OnPreferenceChangeListener {
+public class Preferences extends SherlockPreferenceActivity {
private static final String TAG = "OwnCloudPreferences";
- private final int mNewSession = 47;
- private final int mEditSession = 48;
private DbHandler mDbHandler;
- private Vector<OwnCloudSession> mSessions;
- private ListPreference mTrackingUpdateInterval;
- private CheckBoxPreference mDeviceTracking;
private CheckBoxPreference pCode;
- private CheckBoxPreference pLogging;
- private Preference pLoggingHistory;
+ //private CheckBoxPreference pLogging;
+ //private Preference pLoggingHistory;
private Preference pAboutApp;
- private int mSelectedMenuItem;
@SuppressWarnings("deprecation")
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mDbHandler = new DbHandler(getBaseContext());
- mSessions = new Vector<OwnCloudSession>();
addPreferencesFromResource(R.xml.preferences);
//populateAccountList();
ActionBar actionBar = getSherlock().getActionBar();
+ actionBar.setIcon(DisplayUtils.getSeasonalIconId());
actionBar.setDisplayHomeAsUpEnabled(true);
+
Preference p = findPreference("manage_account");
if (p != null)
p.setOnPreferenceClickListener(new OnPreferenceClickListener() {
i.putExtra(PinCodeActivity.EXTRA_ACTIVITY, "preferences");
i.putExtra(PinCodeActivity.EXTRA_NEW_STATE, newValue.toString());
startActivity(i);
+
return true;
}
- });
+ });
+
+ }
+
+
+
+ PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference("more");
+
+ boolean helpEnabled = getResources().getBoolean(R.bool.help_enabled);
+ Preference pHelp = findPreference("help");
+ if (pHelp != null ){
+ if (helpEnabled) {
+ pHelp.setOnPreferenceClickListener(new OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ String helpWeb =(String) getText(R.string.url_help);
+ if (helpWeb != null && helpWeb.length() > 0) {
+ Uri uriUrl = Uri.parse(helpWeb);
+ Intent intent = new Intent(Intent.ACTION_VIEW, uriUrl);
+ startActivity(intent);
+ }
+ return true;
+ }
+ });
+ } else {
+ preferenceCategory.removePreference(pHelp);
+ }
+
+ }
+
+
+ boolean recommendEnabled = getResources().getBoolean(R.bool.recommend_enabled);
+ Preference pRecommend = findPreference("recommend");
+ if (pRecommend != null){
+ if (recommendEnabled) {
+ pRecommend.setOnPreferenceClickListener(new OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+
+ Intent intent = new Intent(Intent.ACTION_SENDTO);
+ intent.setType("text/plain");
+ intent.setData(Uri.parse(getString(R.string.mail_recommend)));
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ String appName = getString(R.string.app_name);
+ String downloadUrl = getString(R.string.url_app_download);
+ Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(Preferences.this);
+ String username = currentAccount.name.substring(0, currentAccount.name.lastIndexOf('@'));
+
+ String recommendSubject = String.format(getString(R.string.recommend_subject), appName);
+ String recommendText = String.format(getString(R.string.recommend_text), appName, downloadUrl, username);
+
+ intent.putExtra(Intent.EXTRA_SUBJECT, recommendSubject);
+ intent.putExtra(Intent.EXTRA_TEXT, recommendText);
+ startActivity(intent);
+
+
+ return(true);
+
+ }
+ });
+ } else {
+ preferenceCategory.removePreference(pRecommend);
+ }
- /* About App */
+ }
+
+ boolean feedbackEnabled = getResources().getBoolean(R.bool.feedback_enabled);
+ Preference pFeedback = findPreference("feedback");
+ if (pFeedback != null){
+ if (feedbackEnabled) {
+ pFeedback.setOnPreferenceClickListener(new OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ String feedbackMail =(String) getText(R.string.mail_feedback);
+ String feedback =(String) getText(R.string.prefs_feedback);
+ Intent intent = new Intent(Intent.ACTION_SENDTO);
+ intent.setType("text/plain");
+ intent.putExtra(Intent.EXTRA_SUBJECT, feedback);
+
+ intent.setData(Uri.parse(feedbackMail));
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity(intent);
+
+ return true;
+ }
+ });
+ } else {
+ preferenceCategory.removePreference(pFeedback);
+ }
+
+ }
+
+ boolean imprintEnabled = getResources().getBoolean(R.bool.imprint_enabled);
+ Preference pImprint = findPreference("imprint");
+ if (pImprint != null) {
+ if (imprintEnabled) {
+ pImprint.setOnPreferenceClickListener(new OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ String imprintWeb = (String) getText(R.string.url_imprint);
+ if (imprintWeb != null && imprintWeb.length() > 0) {
+ Uri uriUrl = Uri.parse(imprintWeb);
+ Intent intent = new Intent(Intent.ACTION_VIEW, uriUrl);
+ startActivity(intent);
+ }
+ //ImprintDialog.newInstance(true).show(preference.get, "IMPRINT_DIALOG");
+ return true;
+ }
+ });
+ } else {
+ preferenceCategory.removePreference(pImprint);
+ }
+ }
+
+ /* About App */
pAboutApp = (Preference) findPreference("about_app");
if (pAboutApp != null) {
pAboutApp.setTitle(String.format(getString(R.string.about_android), getString(R.string.app_name)));
}
}
+ /* DISABLED FOR RELEASE UNTIL FIXED
pLogging = (CheckBoxPreference) findPreference("log_to_file");
if (pLogging != null) {
pLogging.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
}
});
}
- }
+ */
+
}
@Override
Intent intent;
switch (item.getItemId()) {
- //case R.id.addSessionItem:
- case 1:
- intent = new Intent(this, PreferencesNewSession.class);
- startActivityForResult(intent, mNewSession);
- break;
- case R.id.SessionContextEdit:
- intent = new Intent(this, PreferencesNewSession.class);
- intent.putExtra("sessionId", mSessions.get(mSelectedMenuItem)
- .getEntryId());
- intent.putExtra("sessionName", mSessions.get(mSelectedMenuItem)
- .getName());
- intent.putExtra("sessionURL", mSessions.get(mSelectedMenuItem)
- .getUrl());
- startActivityForResult(intent, mEditSession);
- break;
case android.R.id.home:
intent = new Intent(getBaseContext(), FileDisplayActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
super.onDestroy();
}
- @Override
- /**
- * Updates various summaries after updates. Also starts and stops
- * the
- */
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- // Update current account summary
- /*if (preference.equals(mAccountList)) {
- mAccountList.setSummary(newValue.toString());
- }
-
- // Update tracking interval summary
- else*/ if (preference.equals(mTrackingUpdateInterval)) {
- String trackingSummary = getResources().getString(
- R.string.prefs_trackmydevice_interval_summary);
- trackingSummary = String.format(trackingSummary,
- newValue.toString());
- mTrackingUpdateInterval.setSummary(trackingSummary);
- }
-
- // Start or stop tracking service
- else if (preference.equals(mDeviceTracking)) {
- Intent locationServiceIntent = new Intent();
- locationServiceIntent
- .setAction("com.owncloud.android.location.LocationLauncher");
- locationServiceIntent.putExtra("TRACKING_SETTING",
- (Boolean) newValue);
- sendBroadcast(locationServiceIntent);
- }
- return true;
- }
}
+++ /dev/null
-/* ownCloud Android client application\r
- * Copyright (C) 2012 Bartek Przybylski\r
- * Copyright (C) 2012-2013 ownCloud Inc.\r
- *\r
- * This program is free software: you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License version 2,\r
- * as published by the Free Software Foundation.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program. If not, see <http://www.gnu.org/licenses/>.\r
- *\r
- */\r
-\r
-package com.owncloud.android.ui.activity;\r
-\r
-import android.accounts.AccountAuthenticatorActivity;\r
-import android.app.Activity;\r
-import android.os.Bundle;\r
-import android.view.View;\r
-import android.view.View.OnClickListener;\r
-\r
-public class PreferencesNewSession extends AccountAuthenticatorActivity\r
- implements OnClickListener {\r
- @Override\r
- public void onCreate(Bundle savedInstanceState) {\r
- super.onCreate(savedInstanceState);\r
- // setContentView(R.layout.add_new_session);\r
- /*\r
- * EditText et;// = (EditText)\r
- * findViewById(R.id.newSession_sessionName);\r
- * \r
- * et = (EditText) findViewById(R.id.newSession_URL); if\r
- * (getIntent().hasExtra("sessionURL")) { try { URI uri = new\r
- * URI(getIntent().getStringExtra("sessionURL")); String url =\r
- * uri.getHost(); if (uri.getPort() != -1) { url += ":" +\r
- * String.valueOf(uri.getPort()); } if (uri.getPath() != null) { url +=\r
- * uri.getPath(); } else { url += "/"; } et.setText(url); et =\r
- * (EditText) findViewById(R.id.newSession_username); if\r
- * (uri.getAuthority() != null) { if (uri.getUserInfo().indexOf(':') !=\r
- * -1) { et.setText(uri.getUserInfo().substring(0,\r
- * uri.getUserInfo().indexOf(':'))); et = (EditText)\r
- * findViewById(R.id.newSession_password);\r
- * et.setText(uri.getUserInfo().substring\r
- * (uri.getUserInfo().indexOf(':')+1)); } else {\r
- * et.setText(uri.getUserInfo()); } }\r
- * \r
- * } catch (URISyntaxException e) { Log.e(TAG, "Incorrect URI syntax " +\r
- * e.getLocalizedMessage()); } }\r
- * \r
- * mReturnData = new Intent(); setResult(Activity.RESULT_OK,\r
- * mReturnData); ((Button)\r
- * findViewById(R.id.button1)).setOnClickListener(this); ((Button)\r
- * findViewById(R.id.button2)).setOnClickListener(this);\r
- */\r
- }\r
-\r
- @Override\r
- protected void onResume() {\r
- super.onResume();\r
- }\r
-\r
- public void onClick(View v) {\r
- /*\r
- * switch (v.getId()) { case R.id.button1: Intent intent = new Intent();\r
- * if (getIntent().hasExtra("sessionId")) { intent.putExtra("sessionId",\r
- * getIntent().getIntExtra("sessionId", -1)); } //String sessionName =\r
- * ((EditText)\r
- * findViewById(R.id.newSession_sessionName)).getText().toString(); //\r
- * if (sessionName.trim().equals("") || !isNameValid(sessionName)) { //\r
- * Toast.makeText(this, R.string.new_session_session_name_error,\r
- * Toast.LENGTH_LONG).show(); // break; // } URI uri = prepareURI(); if\r
- * (uri != null) { //intent.putExtra("sessionName", sessionName);\r
- * intent.putExtra("sessionURL", uri.toString());\r
- * setResult(Activity.RESULT_OK, intent); AccountManager accMgr =\r
- * AccountManager.get(this); Account a = new Account("OwnCloud",\r
- * AccountAuthenticatorService.ACCOUNT_TYPE);\r
- * accMgr.addAccountExplicitly(a, "asd", null); finish(); } break; case\r
- * R.id.button2: setResult(Activity.RESULT_CANCELED); finish(); break; }\r
- */\r
- }\r
-\r
- /*\r
- * private URI prepareURI() { URI uri = null; String url = ""; try { String\r
- * username = ((EditText)\r
- * findViewById(R.id.newSession_username)).getText().toString().trim();\r
- * String password = ((EditText)\r
- * findViewById(R.id.newSession_password)).getText().toString().trim();\r
- * String hostname = ((EditText)\r
- * findViewById(R.id.newSession_URL)).getText().toString().trim(); String\r
- * scheme; if (hostname.matches("[A-Za-z]://")) { scheme =\r
- * hostname.substring(0, hostname.indexOf("://")+3); hostname =\r
- * hostname.substring(hostname.indexOf("://")+3); } else { scheme =\r
- * "http://"; } if (!username.equals("")) { if (!password.equals("")) {\r
- * username += ":" + password + "@"; } else { username += "@"; } } url =\r
- * scheme + username + hostname; Log.i(TAG, url); uri = new URI(url); }\r
- * catch (URISyntaxException e) { Log.e(TAG, "Incorrect URI syntax " +\r
- * e.getLocalizedMessage()); Toast.makeText(this,\r
- * R.string.new_session_uri_error, Toast.LENGTH_LONG).show(); } return uri;\r
- * }\r
- * \r
- * private boolean isNameValid(String string) { return\r
- * string.matches("[A-Za-z0-9 _-]*"); }\r
- */\r
-\r
- @Override\r
- public void onBackPressed() {\r
- setResult(Activity.RESULT_CANCELED);\r
- super.onBackPressed();\r
- }\r
-\r
-}\r
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.DialogFragment;
-import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.ActionBar.OnNavigationListener;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.MenuItem;
+import com.owncloud.android.R;
import com.owncloud.android.ui.dialog.IndeterminateProgressDialog;
import com.owncloud.android.ui.fragment.ConfirmationDialogFragment;
import com.owncloud.android.ui.fragment.LocalFileListFragment;
import com.owncloud.android.ui.fragment.ConfirmationDialogFragment.ConfirmationDialogFragmentListener;
+import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.Log_OC;
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.R;
/**
* Displays local files and let the user choose what of them wants to upload
*
*/
-public class UploadFilesActivity extends SherlockFragmentActivity implements
+public class UploadFilesActivity extends FileActivity implements
LocalFileListFragment.ContainerActivity, OnNavigationListener, OnClickListener, ConfirmationDialogFragmentListener {
private ArrayAdapter<String> mDirectories;
private LocalFileListFragment mFileListFragment;
private Button mCancelBtn;
private Button mUploadBtn;
- private Account mAccount;
+ private Account mAccountOnCreation;
private DialogFragment mCurrentDialog;
- public static final String EXTRA_ACCOUNT = UploadFilesActivity.class.getCanonicalName() + ".EXTRA_ACCOUNT";
public static final String EXTRA_CHOSEN_FILES = UploadFilesActivity.class.getCanonicalName() + ".EXTRA_CHOSEN_FILES";
public static final int RESULT_OK_AND_MOVE = RESULT_FIRST_USER;
mCurrentDir = Environment.getExternalStorageDirectory();
}
- mAccount = getIntent().getParcelableExtra(EXTRA_ACCOUNT);
+ mAccountOnCreation = getAccount();
/// USER INTERFACE
mCancelBtn.setOnClickListener(this);
mUploadBtn = (Button) findViewById(R.id.upload_files_btn_upload);
mUploadBtn.setOnClickListener(this);
+
// Action bar setup
ActionBar actionBar = getSupportActionBar();
+ actionBar.setIcon(DisplayUtils.getSeasonalIconId());
actionBar.setHomeButtonEnabled(true); // mandatory since Android ICS, according to the official documentation
actionBar.setDisplayHomeAsUpEnabled(mCurrentDir != null && mCurrentDir.getName() != null);
actionBar.setDisplayShowTitleEnabled(false);
File localFile = new File(localPath);
total += localFile.length();
}
- return (FileStorageUtils.getUsableSpace(mAccount.name) >= total);
+ return (FileStorageUtils.getUsableSpace(mAccountOnCreation.name) >= total);
}
/**
public void onCancel(String callerTag) {
/// nothing to do; don't finish, let the user change the selection
Log_OC.d(TAG, "Negative button in dialog was clicked; dialog tag is " + callerTag);
+ }
+
+
+ @Override
+ protected void onAccountSet(boolean stateWasRecovered) {
+ super.onAccountSet(stateWasRecovered);
+ if (getAccount() != null) {
+ if (!mAccountOnCreation.equals(getAccount())) {
+ setResult(RESULT_CANCELED);
+ finish();
+ }
+
+ } else {
+ setResult(RESULT_CANCELED);
+ finish();
+ }
}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012 Bartek Przybylski
+ * Copyright (C) 2012-2013 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.ui.activity;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Stack;
+import java.util.Vector;
+
+import com.owncloud.android.MainApp;
+import com.owncloud.android.R;
+import com.owncloud.android.authentication.AccountAuthenticator;
+import com.owncloud.android.datamodel.FileDataStorageManager;
+import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.files.services.FileUploader;
+import com.owncloud.android.utils.Log_OC;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.app.AlertDialog;
+import android.app.AlertDialog.Builder;
+import android.app.Dialog;
+import android.app.ListActivity;
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnCancelListener;
+import android.content.DialogInterface.OnClickListener;
+import android.content.Intent;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.provider.MediaStore.Audio;
+import android.provider.MediaStore.Images;
+import android.provider.MediaStore.Video;
+import android.view.View;
+import android.view.Window;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.SimpleAdapter;
+import android.widget.Toast;
+
+
+/**
+ * This can be used to upload things to an ownCloud instance.
+ *
+ * @author Bartek Przybylski
+ *
+ */
+public class Uploader extends ListActivity implements OnItemClickListener, android.view.View.OnClickListener {
+ private static final String TAG = "ownCloudUploader";
+
+ private Account mAccount;
+ private AccountManager mAccountManager;
+ private Stack<String> mParents;
+ private ArrayList<Parcelable> mStreamsToUpload;
+ private boolean mCreateDir;
+ private String mUploadPath;
+ private FileDataStorageManager mStorageManager;
+ private OCFile mFile;
+
+ private final static int DIALOG_NO_ACCOUNT = 0;
+ private final static int DIALOG_WAITING = 1;
+ private final static int DIALOG_NO_STREAM = 2;
+ private final static int DIALOG_MULTIPLE_ACCOUNT = 3;
+
+ private final static int REQUEST_CODE_SETUP_ACCOUNT = 0;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ getWindow().requestFeature(Window.FEATURE_NO_TITLE);
+ mParents = new Stack<String>();
+ mParents.add("");
+ if (prepareStreamsToUpload()) {
+ mAccountManager = (AccountManager) getSystemService(Context.ACCOUNT_SERVICE);
+ Account[] accounts = mAccountManager.getAccountsByType(MainApp.getAccountType());
+ if (accounts.length == 0) {
+ Log_OC.i(TAG, "No ownCloud account is available");
+ showDialog(DIALOG_NO_ACCOUNT);
+ } else if (accounts.length > 1) {
+ Log_OC.i(TAG, "More then one ownCloud is available");
+ showDialog(DIALOG_MULTIPLE_ACCOUNT);
+ } else {
+ mAccount = accounts[0];
+ mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());
+ populateDirectoryList();
+ }
+ } else {
+ showDialog(DIALOG_NO_STREAM);
+ }
+ }
+
+ @Override
+ protected Dialog onCreateDialog(final int id) {
+ final AlertDialog.Builder builder = new Builder(this);
+ switch (id) {
+ case DIALOG_WAITING:
+ ProgressDialog pDialog = new ProgressDialog(this);
+ pDialog.setIndeterminate(false);
+ pDialog.setCancelable(false);
+ pDialog.setMessage(getResources().getString(R.string.uploader_info_uploading));
+ return pDialog;
+ case DIALOG_NO_ACCOUNT:
+ builder.setIcon(android.R.drawable.ic_dialog_alert);
+ builder.setTitle(R.string.uploader_wrn_no_account_title);
+ builder.setMessage(String.format(getString(R.string.uploader_wrn_no_account_text), getString(R.string.app_name)));
+ builder.setCancelable(false);
+ builder.setPositiveButton(R.string.uploader_wrn_no_account_setup_btn_text, new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.ECLAIR_MR1) {
+ // using string value since in API7 this
+ // constatn is not defined
+ // in API7 < this constatant is defined in
+ // Settings.ADD_ACCOUNT_SETTINGS
+ // and Settings.EXTRA_AUTHORITIES
+ Intent intent = new Intent(android.provider.Settings.ACTION_ADD_ACCOUNT);
+ intent.putExtra("authorities", new String[] { MainApp.getAuthTokenType() });
+ startActivityForResult(intent, REQUEST_CODE_SETUP_ACCOUNT);
+ } else {
+ // since in API7 there is no direct call for
+ // account setup, so we need to
+ // show our own AccountSetupAcricity, get
+ // desired results and setup
+ // everything for ourself
+ Intent intent = new Intent(getBaseContext(), AccountAuthenticator.class);
+ startActivityForResult(intent, REQUEST_CODE_SETUP_ACCOUNT);
+ }
+ }
+ });
+ builder.setNegativeButton(R.string.uploader_wrn_no_account_quit_btn_text, new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ finish();
+ }
+ });
+ return builder.create();
+ case DIALOG_MULTIPLE_ACCOUNT:
+ CharSequence ac[] = new CharSequence[mAccountManager.getAccountsByType(MainApp.getAccountType()).length];
+ for (int i = 0; i < ac.length; ++i) {
+ ac[i] = mAccountManager.getAccountsByType(MainApp.getAccountType())[i].name;
+ }
+ builder.setTitle(R.string.common_choose_account);
+ builder.setItems(ac, new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ mAccount = mAccountManager.getAccountsByType(MainApp.getAccountType())[which];
+ mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());
+ populateDirectoryList();
+ }
+ });
+ builder.setCancelable(true);
+ builder.setOnCancelListener(new OnCancelListener() {
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ dialog.cancel();
+ finish();
+ }
+ });
+ return builder.create();
+ case DIALOG_NO_STREAM:
+ builder.setIcon(android.R.drawable.ic_dialog_alert);
+ builder.setTitle(R.string.uploader_wrn_no_content_title);
+ builder.setMessage(R.string.uploader_wrn_no_content_text);
+ builder.setCancelable(false);
+ builder.setNegativeButton(R.string.common_cancel, new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ finish();
+ }
+ });
+ return builder.create();
+ default:
+ throw new IllegalArgumentException("Unknown dialog id: " + id);
+ }
+ }
+
+ class a implements OnClickListener {
+ String mPath;
+ EditText mDirname;
+
+ public a(String path, EditText dirname) {
+ mPath = path;
+ mDirname = dirname;
+ }
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ Uploader.this.mUploadPath = mPath + mDirname.getText().toString();
+ Uploader.this.mCreateDir = true;
+ uploadFiles();
+ }
+ }
+
+ @Override
+ public void onBackPressed() {
+
+ if (mParents.size() <= 1) {
+ super.onBackPressed();
+ return;
+ } else {
+ mParents.pop();
+ populateDirectoryList();
+ }
+ }
+
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ // click on folder in the list
+ Log_OC.d(TAG, "on item click");
+ Vector<OCFile> tmpfiles = mStorageManager.getFolderContent(mFile);
+ if (tmpfiles.size() <= 0) return;
+ // filter on dirtype
+ Vector<OCFile> files = new Vector<OCFile>();
+ for (OCFile f : tmpfiles)
+ if (f.isFolder())
+ files.add(f);
+ if (files.size() < position) {
+ throw new IndexOutOfBoundsException("Incorrect item selected");
+ }
+ mParents.push(files.get(position).getFileName());
+ populateDirectoryList();
+ }
+
+ @Override
+ public void onClick(View v) {
+ // click on button
+ switch (v.getId()) {
+ case R.id.uploader_choose_folder:
+ mUploadPath = ""; // first element in mParents is root dir, represented by ""; init mUploadPath with "/" results in a "//" prefix
+ for (String p : mParents)
+ mUploadPath += p + OCFile.PATH_SEPARATOR;
+ Log_OC.d(TAG, "Uploading file to dir " + mUploadPath);
+
+ uploadFiles();
+
+ break;
+ default:
+ throw new IllegalArgumentException("Wrong element clicked");
+ }
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ Log_OC.i(TAG, "result received. req: " + requestCode + " res: " + resultCode);
+ if (requestCode == REQUEST_CODE_SETUP_ACCOUNT) {
+ dismissDialog(DIALOG_NO_ACCOUNT);
+ if (resultCode == RESULT_CANCELED) {
+ finish();
+ }
+ Account[] accounts = mAccountManager.getAccountsByType(MainApp.getAuthTokenType());
+ if (accounts.length == 0) {
+ showDialog(DIALOG_NO_ACCOUNT);
+ } else {
+ // there is no need for checking for is there more then one
+ // account at this point
+ // since account setup can set only one account at time
+ mAccount = accounts[0];
+ populateDirectoryList();
+ }
+ }
+ }
+
+ private void populateDirectoryList() {
+ setContentView(R.layout.uploader_layout);
+
+ String full_path = "";
+ for (String a : mParents)
+ full_path += a + "/";
+
+ Log_OC.d(TAG, "Populating view with content of : " + full_path);
+
+ mFile = mStorageManager.getFileByPath(full_path);
+ if (mFile != null) {
+ Vector<OCFile> files = mStorageManager.getFolderContent(mFile);
+ List<HashMap<String, Object>> data = new LinkedList<HashMap<String,Object>>();
+ for (OCFile f : files) {
+ HashMap<String, Object> h = new HashMap<String, Object>();
+ if (f.isFolder()) {
+ h.put("dirname", f.getFileName());
+ data.add(h);
+ }
+ }
+ SimpleAdapter sa = new SimpleAdapter(this,
+ data,
+ R.layout.uploader_list_item_layout,
+ new String[] {"dirname"},
+ new int[] {R.id.textView1});
+ setListAdapter(sa);
+ Button btn = (Button) findViewById(R.id.uploader_choose_folder);
+ btn.setOnClickListener(this);
+ getListView().setOnItemClickListener(this);
+ }
+ }
+
+ private boolean prepareStreamsToUpload() {
+ if (getIntent().getAction().equals(Intent.ACTION_SEND)) {
+ mStreamsToUpload = new ArrayList<Parcelable>();
+ mStreamsToUpload.add(getIntent().getParcelableExtra(Intent.EXTRA_STREAM));
+ } else if (getIntent().getAction().equals(Intent.ACTION_SEND_MULTIPLE)) {
+ mStreamsToUpload = getIntent().getParcelableArrayListExtra(Intent.EXTRA_STREAM);
+ }
+ return (mStreamsToUpload != null && mStreamsToUpload.get(0) != null);
+ }
+
+ public void uploadFiles() {
+ try {
+ //OwnCloudClient webdav = OwnCloudClientUtils.createOwnCloudClient(mAccount, getApplicationContext());
+
+ ArrayList<String> local = new ArrayList<String>();
+ ArrayList<String> remote = new ArrayList<String>();
+
+ /* TODO - mCreateDir can never be true at this moment; we will replace wdc.createDirectory by CreateFolderOperation when that is fixed
+ OwnCloudClient wdc = OwnCloudClientUtils.createOwnCloudClient(mAccount, getApplicationContext());
+ // create last directory in path if necessary
+ if (mCreateDir) {
+ wdc.createDirectory(mUploadPath);
+ }
+ */
+
+ // this checks the mimeType
+ for (Parcelable mStream : mStreamsToUpload) {
+
+ Uri uri = (Uri) mStream;
+ if (uri !=null) {
+ if (uri.getScheme().equals("content")) {
+
+ String mimeType = getContentResolver().getType(uri);
+
+ if (mimeType.contains("image")) {
+ String[] CONTENT_PROJECTION = { Images.Media.DATA, Images.Media.DISPLAY_NAME, Images.Media.MIME_TYPE, Images.Media.SIZE};
+ Cursor c = getContentResolver().query(uri, CONTENT_PROJECTION, null, null, null);
+ c.moveToFirst();
+ int index = c.getColumnIndex(Images.Media.DATA);
+ String data = c.getString(index);
+ local.add(data);
+ remote.add(mUploadPath + c.getString(c.getColumnIndex(Images.Media.DISPLAY_NAME)));
+
+ }
+ else if (mimeType.contains("video")) {
+ String[] CONTENT_PROJECTION = { Video.Media.DATA, Video.Media.DISPLAY_NAME, Video.Media.MIME_TYPE, Video.Media.SIZE, Video.Media.DATE_MODIFIED };
+ Cursor c = getContentResolver().query(uri, CONTENT_PROJECTION, null, null, null);
+ c.moveToFirst();
+ int index = c.getColumnIndex(Video.Media.DATA);
+ String data = c.getString(index);
+ local.add(data);
+ remote.add(mUploadPath + c.getString(c.getColumnIndex(Video.Media.DISPLAY_NAME)));
+
+ }
+ else if (mimeType.contains("audio")) {
+ String[] CONTENT_PROJECTION = { Audio.Media.DATA, Audio.Media.DISPLAY_NAME, Audio.Media.MIME_TYPE, Audio.Media.SIZE };
+ Cursor c = getContentResolver().query(uri, CONTENT_PROJECTION, null, null, null);
+ c.moveToFirst();
+ int index = c.getColumnIndex(Audio.Media.DATA);
+ String data = c.getString(index);
+ local.add(data);
+ remote.add(mUploadPath + c.getString(c.getColumnIndex(Audio.Media.DISPLAY_NAME)));
+
+ }
+ else {
+ String filePath = Uri.decode(uri.toString()).replace(uri.getScheme() + "://", "");
+ // cut everything whats before mnt. It occured to me that sometimes apps send their name into the URI
+ if (filePath.contains("mnt")) {
+ String splitedFilePath[] = filePath.split("/mnt");
+ filePath = splitedFilePath[1];
+ }
+ final File file = new File(filePath);
+ local.add(file.getAbsolutePath());
+ remote.add(mUploadPath + file.getName());
+ }
+
+ } else if (uri.getScheme().equals("file")) {
+ String filePath = Uri.decode(uri.toString()).replace(uri.getScheme() + "://", "");
+ if (filePath.contains("mnt")) {
+ String splitedFilePath[] = filePath.split("/mnt");
+ filePath = splitedFilePath[1];
+ }
+ final File file = new File(filePath);
+ local.add(file.getAbsolutePath());
+ remote.add(mUploadPath + file.getName());
+ }
+ else {
+ throw new SecurityException();
+ }
+ }
+ else {
+ throw new SecurityException();
+ }
+
+ Intent intent = new Intent(getApplicationContext(), FileUploader.class);
+ intent.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_MULTIPLE_FILES);
+ intent.putExtra(FileUploader.KEY_LOCAL_FILE, local.toArray(new String[local.size()]));
+ intent.putExtra(FileUploader.KEY_REMOTE_FILE, remote.toArray(new String[remote.size()]));
+ intent.putExtra(FileUploader.KEY_ACCOUNT, mAccount);
+ startService(intent);
+ finish();
+ }
+
+ } catch (SecurityException e) {
+ String message = String.format(getString(R.string.uploader_error_forbidden_content), getString(R.string.app_name));
+ Toast.makeText(this, message, Toast.LENGTH_LONG).show();
+ }
+ }
+
+}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2014 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package com.owncloud.android.ui.adapter;
+
+import com.owncloud.android.R;
+import com.owncloud.android.lib.common.network.CertificateCombinedException;
+import com.owncloud.android.ui.dialog.SslUntrustedCertDialog;
+
+import android.view.View;
+import android.widget.TextView;
+
+/**
+ * TODO
+ *
+ * @author masensio
+ * @author David A. Velasco
+ *
+ */
+public class CertificateCombinedExceptionViewAdapter implements SslUntrustedCertDialog.ErrorViewAdapter {
+
+ //private final static String TAG = CertificateCombinedExceptionViewAdapter.class.getSimpleName();
+
+ private CertificateCombinedException mSslException = null;
+
+ public CertificateCombinedExceptionViewAdapter(CertificateCombinedException sslException) {
+ mSslException = sslException;
+ }
+
+ @Override
+ public void updateErrorView(View dialogView) {
+ /// clean
+ dialogView.findViewById(R.id.reason_no_info_about_error).setVisibility(View.GONE);
+
+ /// refresh
+ if (mSslException.getCertPathValidatorException() != null) {
+ ((TextView)dialogView.findViewById(R.id.reason_cert_not_trusted)).setVisibility(View.VISIBLE);
+ } else {
+ dialogView.findViewById(R.id.reason_cert_not_trusted).setVisibility(View.GONE);
+ }
+
+ if (mSslException.getCertificateExpiredException() != null) {
+ ((TextView)dialogView.findViewById(R.id.reason_cert_expired)).setVisibility(View.VISIBLE);
+ } else {
+ dialogView.findViewById(R.id.reason_cert_expired).setVisibility(View.GONE);
+ }
+
+ if (mSslException.getCertificateNotYetValidException() != null) {
+ ((TextView)dialogView.findViewById(R.id.reason_cert_not_yet_valid)).setVisibility(View.VISIBLE);
+ } else {
+ dialogView.findViewById(R.id.reason_cert_not_yet_valid).setVisibility(View.GONE);
+ }
+
+ if (mSslException.getSslPeerUnverifiedException() != null) {
+ ((TextView)dialogView.findViewById(R.id.reason_hostname_not_verified)).setVisibility(View.VISIBLE);
+ } else {
+ dialogView.findViewById(R.id.reason_hostname_not_verified).setVisibility(View.GONE);
+ }
+
+ }
+}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2011 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.ui.adapter;
-
-import java.io.File;
-
-import com.owncloud.android.db.ProviderMeta.ProviderTableMeta;
-
-import com.owncloud.android.AccountUtils;
-import com.owncloud.android.R;
-import eu.alefzero.webdav.WebdavUtils;
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.content.Context;
-import android.content.Intent;
-import android.database.Cursor;
-import android.database.DataSetObserver;
-import android.net.Uri;
-import android.text.TextUtils;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.ListAdapter;
-import android.widget.TextView;
-
-public class FileListActionListAdapter implements ListAdapter {
-
- private Context mContext;
- private Account mAccount;
- private String mFilename, mFileType, mFilePath, mFileStoragePath;
-
- private final int ITEM_DOWNLOAD = 0;
-
- // private final int ITEM_SHARE = 1;
-
- public FileListActionListAdapter(Cursor c, Context co, Account account) {
- mContext = co;
- mFilename = c.getString(c.getColumnIndex(ProviderTableMeta.FILE_NAME));
- mFileType = c.getString(c
- .getColumnIndex(ProviderTableMeta.FILE_CONTENT_TYPE));
- mFilePath = c.getString(c.getColumnIndex(ProviderTableMeta.FILE_PATH));
- mFileStoragePath = c.getString(c
- .getColumnIndex(ProviderTableMeta.FILE_STORAGE_PATH));
- // mItemId = c.getString(c.getColumnIndex(ProviderTableMeta._ID));
- mAccount = account;
- }
-
- public boolean areAllItemsEnabled() {
- return true;
- }
-
- public boolean isEnabled(int position) {
- return true;
- }
-
- public int getCount() {
- return 1;
- }
-
- public Object getItem(int position) {
- if (position == 0) {
- Intent intent = new Intent(Intent.ACTION_VIEW);
- if (TextUtils.isEmpty(mFileStoragePath)) {
- intent.putExtra("toDownload", true);
- AccountManager accm = (AccountManager) mContext
- .getSystemService(Context.ACCOUNT_SERVICE);
- String ocurl = accm.getUserData(mAccount,
- AccountUtils.constructFullURLForAccount(mContext, mAccount));
- ocurl += WebdavUtils.encodePath(mFilePath + mFilename);
- intent.setData(Uri.parse(ocurl));
- } else {
- intent.putExtra("toDownload", false);
- intent.setDataAndType(Uri.fromFile(new File(mFileStoragePath)),
- mFileType);
- }
- return intent;
- }
- return null;
- }
-
- public long getItemId(int position) {
- return 0;
- }
-
- public int getItemViewType(int position) {
- return 0;
- }
-
- public View getView(int position, View convertView, ViewGroup parent) {
- View v = convertView;
- if (v == null) {
- LayoutInflater vi = (LayoutInflater) mContext
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- v = vi.inflate(R.layout.file_display_action_list_element, null);
- }
-
- TextView tv;
- ImageView iv;
- switch (position) {
- case ITEM_DOWNLOAD:
- tv = (TextView) v.findViewById(R.id.textView1);
- if (mFileStoragePath == null) {
- tv.setText("Download");
- } else {
- setActionName(tv);
- }
- iv = (ImageView) v.findViewById(R.id.imageView1);
- iv.setImageResource(R.drawable.download);
- break;
- }
-
- return v;
- }
-
- public int getViewTypeCount() {
- return 2;
- }
-
- public boolean hasStableIds() {
- return false;
- }
-
- public boolean isEmpty() {
- return false;
- }
-
- public void registerDataSetObserver(DataSetObserver observer) { }
-
- public void unregisterDataSetObserver(DataSetObserver observer) { }
-
- private void setActionName(TextView tv) {
- if (mFileType.matches("image/.*")) {
- tv.setText("View");
- } else if (mFileType.matches("audio/.*")
- || mFileType.matches("video/.*")) {
- tv.setText("Play");
- } else {
- tv.setText("Open");
- }
- }
-
-}
/* ownCloud Android client application\r
* Copyright (C) 2011 Bartek Przybylski\r
- * Copyright (C) 2012-2013 ownCloud Inc.\r
+ * Copyright (C) 2012-2014 ownCloud Inc.\r
*\r
* This program is free software: you can redistribute it and/or modify\r
* it under the terms of the GNU General Public License version 2,\r
*/\r
package com.owncloud.android.ui.adapter;\r
\r
-import java.util.Vector;\r
-\r
-import com.owncloud.android.AccountUtils;\r
-import com.owncloud.android.DisplayUtils;\r
-import com.owncloud.android.datamodel.DataStorageManager;\r
-import com.owncloud.android.datamodel.OCFile;\r
-import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;\r
-import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;\r
-import com.owncloud.android.ui.activity.TransferServiceGetter;\r
-\r
-import com.owncloud.android.R;\r
-\r
import android.accounts.Account;\r
import android.content.Context;\r
import android.view.LayoutInflater;\r
import android.widget.ListView;\r
import android.widget.TextView;\r
\r
+\r
+import java.util.Vector;\r
+\r
+import com.owncloud.android.R;\r
+import com.owncloud.android.authentication.AccountUtils;\r
+import com.owncloud.android.datamodel.FileDataStorageManager;\r
+import com.owncloud.android.datamodel.OCFile;\r
+import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;\r
+import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;\r
+import com.owncloud.android.ui.activity.TransferServiceGetter;\r
+import com.owncloud.android.utils.DisplayUtils;\r
+\r
+\r
/**\r
* This Adapter populates a ListView with all files and folders in an ownCloud\r
* instance.\r
private Context mContext;\r
private OCFile mFile = null;\r
private Vector<OCFile> mFiles = null;\r
- private DataStorageManager mStorageManager;\r
+ private FileDataStorageManager mStorageManager;\r
private Account mAccount;\r
private TransferServiceGetter mTransferServiceGetter;\r
-\r
- public FileListListAdapter(OCFile file, DataStorageManager storage_man,\r
- Context context, TransferServiceGetter transferServiceGetter) {\r
- mStorageManager = storage_man;\r
+ \r
+ public FileListListAdapter(Context context, TransferServiceGetter transferServiceGetter) {\r
mContext = context;\r
mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext);\r
mTransferServiceGetter = transferServiceGetter;\r
- swapDirectory(file, mStorageManager);\r
- /*mFile = file;\r
- mFiles = mStorageManager.getDirectoryContent(mFile);*/\r
}\r
\r
@Override\r
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\r
view = inflator.inflate(R.layout.list_item, null);\r
}\r
+ \r
if (mFiles != null && mFiles.size() > position) {\r
OCFile file = mFiles.get(position);\r
TextView fileName = (TextView) view.findViewById(R.id.Filename);\r
} else {\r
localStateView.setVisibility(View.INVISIBLE);\r
}\r
-\r
\r
TextView fileSizeV = (TextView) view.findViewById(R.id.file_size);\r
TextView lastModV = (TextView) view.findViewById(R.id.last_mod);\r
ImageView checkBoxV = (ImageView) view.findViewById(R.id.custom_checkbox);\r
\r
- if (!file.isDirectory()) {\r
+ if (!file.isFolder()) {\r
fileSizeV.setVisibility(View.VISIBLE);\r
fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength()));\r
lastModV.setVisibility(View.VISIBLE);\r
checkBoxV.setVisibility(View.VISIBLE);\r
}\r
\r
+ } \r
+ else {\r
+ \r
+ fileSizeV.setVisibility(View.INVISIBLE);\r
+ //fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength()));\r
+ lastModV.setVisibility(View.VISIBLE);\r
+ lastModV.setText(DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp()));\r
+ checkBoxV.setVisibility(View.GONE);\r
+ view.findViewById(R.id.imageView3).setVisibility(View.GONE);\r
+ }\r
+ \r
+ ImageView shareIconV = (ImageView) view.findViewById(R.id.shareIcon);\r
+ if (file.isShareByLink()) {\r
+ shareIconV.setVisibility(View.VISIBLE);\r
} else {\r
- fileSizeV.setVisibility(View.GONE);\r
- lastModV.setVisibility(View.GONE);\r
- checkBoxV.setVisibility(View.GONE);\r
- view.findViewById(R.id.imageView3).setVisibility(View.GONE);\r
+ shareIconV.setVisibility(View.INVISIBLE);\r
}\r
}\r
\r
* @param directory New file to adapt. Can be NULL, meaning "no content to adapt".\r
* @param updatedStorageManager Optional updated storage manager; used to replace mStorageManager if is different (and not NULL)\r
*/\r
- public void swapDirectory(OCFile directory, DataStorageManager updatedStorageManager) {\r
+ public void swapDirectory(OCFile directory, FileDataStorageManager updatedStorageManager) {\r
mFile = directory;\r
if (updatedStorageManager != null && updatedStorageManager != mStorageManager) {\r
mStorageManager = updatedStorageManager;\r
mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext);\r
}\r
if (mStorageManager != null) {\r
- mFiles = mStorageManager.getDirectoryContent(mFile);\r
+ mFiles = mStorageManager.getFolderContent(mFile);\r
} else {\r
mFiles = null;\r
}\r
+++ /dev/null
-/* ownCloud Android client application\r
- * Copyright (C) 2011 Bartek Przybylski\r
- * Copyright (C) 2012-2013 ownCloud Inc.\r
- *\r
- * This program is free software: you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License version 2,\r
- * as published by the Free Software Foundation.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program. If not, see <http://www.gnu.org/licenses/>.\r
- *\r
- */\r
-package com.owncloud.android.ui.adapter;\r
-\r
-import com.owncloud.android.AccountUtils;\r
-import com.owncloud.android.ui.activity.FileDisplayActivity;\r
-import com.owncloud.android.ui.activity.Preferences;\r
-\r
-import android.content.Context;\r
-import android.content.Intent;\r
-import android.view.LayoutInflater;\r
-import android.view.View;\r
-import android.view.ViewGroup;\r
-import android.widget.BaseAdapter;\r
-import android.widget.ImageView;\r
-import android.widget.TextView;\r
-import com.owncloud.android.R;\r
-\r
-/**\r
- * Populates the landing screen icons.\r
- * \r
- * @author Lennart Rosam\r
- * \r
- */\r
-public class LandingScreenAdapter extends BaseAdapter {\r
-\r
- private Context mContext;\r
-\r
- private final Integer[] mLandingScreenIcons = { R.drawable.home,\r
- R.drawable.music, R.drawable.contacts, R.drawable.calendar,\r
- android.R.drawable.ic_menu_agenda, R.drawable.settings };\r
-\r
- private final Integer[] mLandingScreenTexts = { R.string.main_files,\r
- R.string.main_music, R.string.main_contacts,\r
- R.string.main_calendar, R.string.main_bookmarks,\r
- R.string.main_settings };\r
-\r
- public LandingScreenAdapter(Context context) {\r
- mContext = context;\r
- }\r
-\r
- @Override\r
- public int getCount() {\r
- return mLandingScreenIcons.length;\r
- }\r
-\r
- @Override\r
- /**\r
- * Returns the Intent associated with this object\r
- * or null if the functionality is not yet implemented\r
- */\r
- public Object getItem(int position) {\r
- Intent intent = new Intent();\r
-\r
- switch (position) {\r
- case 0:\r
- /*\r
- * The FileDisplayActivity requires the ownCloud account as an\r
- * parcableExtra. We will put in the one that is selected in the\r
- * preferences\r
- */\r
- intent.setClass(mContext, FileDisplayActivity.class);\r
- intent.putExtra("ACCOUNT",\r
- AccountUtils.getCurrentOwnCloudAccount(mContext));\r
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\r
- break;\r
- case 5:\r
- intent.setClass(mContext, Preferences.class);\r
- break;\r
- default:\r
- intent = null;\r
- }\r
- return intent;\r
- }\r
-\r
- @Override\r
- public long getItemId(int position) {\r
- return position;\r
- }\r
-\r
- @Override\r
- public View getView(int position, View convertView, ViewGroup parent) {\r
- if (convertView == null) {\r
- LayoutInflater inflator = LayoutInflater.from(mContext);\r
- convertView = inflator.inflate(R.layout.landing_page_item, null);\r
-\r
- ImageView icon = (ImageView) convertView\r
- .findViewById(R.id.gridImage);\r
- TextView iconText = (TextView) convertView\r
- .findViewById(R.id.gridText);\r
-\r
- icon.setImageResource(mLandingScreenIcons[position]);\r
- iconText.setText(mLandingScreenTexts[position]);\r
- }\r
- return convertView;\r
- }\r
-}\r
/* ownCloud Android client application
* Copyright (C) 2011 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
+ * Copyright (C) 2012-2014 ownCloud Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2,
import java.util.Arrays;
import java.util.Comparator;
-import com.owncloud.android.DisplayUtils;
import com.owncloud.android.R;
+import com.owncloud.android.utils.DisplayUtils;
+
import android.content.Context;
import android.view.LayoutInflater;
view.findViewById(R.id.imageView2).setVisibility(View.INVISIBLE); // not GONE; the alignment changes; ugly way to keep it
view.findViewById(R.id.imageView3).setVisibility(View.GONE);
+
+ view.findViewById(R.id.shareIcon).setVisibility(View.GONE);
}
return view;
import java.io.File;
+import com.owncloud.android.R;
+
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.widget.ArrayAdapter;
import android.widget.TextView;
-import com.owncloud.android.R;
public class LogListAdapter extends ArrayAdapter<String> {
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2014 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package com.owncloud.android.ui.adapter;
+
+import java.text.DateFormat;
+import java.util.Date;
+
+import com.owncloud.android.R;
+import com.owncloud.android.ui.dialog.SslUntrustedCertDialog;
+import android.net.http.SslCertificate;
+import android.view.View;
+import android.widget.TextView;
+
+/**
+ * TODO
+ *
+ * @author masensio
+ * @author David A. Velasco
+ */
+public class SslCertificateViewAdapter implements SslUntrustedCertDialog.CertificateViewAdapter {
+
+ //private final static String TAG = SslCertificateViewAdapter.class.getSimpleName();
+
+ private SslCertificate mCertificate;
+
+
+ /**
+ * Constructor
+ *
+ * @param
+ */
+ public SslCertificateViewAdapter(SslCertificate certificate) {
+ mCertificate = certificate;
+ }
+
+ @Override
+ public void updateCertificateView(View dialogView) {
+ TextView nullCerView = (TextView) dialogView.findViewById(R.id.null_cert);
+ if (mCertificate != null) {
+ nullCerView.setVisibility(View.GONE);
+ showSubject(mCertificate.getIssuedTo(), dialogView);
+ showIssuer(mCertificate.getIssuedBy(), dialogView);
+ showValidity(mCertificate.getValidNotBeforeDate(), mCertificate.getValidNotAfterDate(), dialogView);
+ hideSignature(dialogView);
+
+ } else {
+ nullCerView.setVisibility(View.VISIBLE);
+ }
+ }
+
+ private void showValidity(Date notBefore, Date notAfter, View dialogView) {
+ TextView fromView = ((TextView)dialogView.findViewById(R.id.value_validity_from));
+ TextView toView = ((TextView)dialogView.findViewById(R.id.value_validity_to));
+ DateFormat dateFormat = DateFormat.getDateInstance();
+ fromView.setText(dateFormat.format(notBefore));
+ toView.setText(dateFormat.format(notAfter));
+ }
+
+
+ private void showSubject(SslCertificate.DName subject, View dialogView) {
+ TextView cnView = ((TextView)dialogView.findViewById(R.id.value_subject_CN));
+ cnView.setText(subject.getCName());
+ cnView.setVisibility(View.VISIBLE);
+
+ TextView oView = ((TextView)dialogView.findViewById(R.id.value_subject_O));
+ oView.setText(subject.getOName());
+ oView.setVisibility(View.VISIBLE);
+
+ TextView ouView = ((TextView)dialogView.findViewById(R.id.value_subject_OU));
+ ouView.setText(subject.getUName());
+ ouView.setVisibility(View.VISIBLE);
+
+ // SslCertificates don't offer this information
+ ((TextView)dialogView.findViewById(R.id.value_subject_C)).setVisibility(View.GONE);
+ ((TextView)dialogView.findViewById(R.id.value_subject_ST)).setVisibility(View.GONE);
+ ((TextView)dialogView.findViewById(R.id.value_subject_L)).setVisibility(View.GONE);
+ ((TextView)dialogView.findViewById(R.id.label_subject_C)).setVisibility(View.GONE);
+ ((TextView)dialogView.findViewById(R.id.label_subject_ST)).setVisibility(View.GONE);
+ ((TextView)dialogView.findViewById(R.id.label_subject_L)).setVisibility(View.GONE);
+ }
+
+
+ private void showIssuer(SslCertificate.DName issuer, View dialogView) {
+ TextView cnView = ((TextView)dialogView.findViewById(R.id.value_issuer_CN));
+ cnView.setText(issuer.getCName());
+ cnView.setVisibility(View.VISIBLE);
+
+ TextView oView = ((TextView)dialogView.findViewById(R.id.value_issuer_O));
+ oView.setText(issuer.getOName());
+ oView.setVisibility(View.VISIBLE);
+
+ TextView ouView = ((TextView)dialogView.findViewById(R.id.value_issuer_OU));
+ ouView.setText(issuer.getUName());
+ ouView.setVisibility(View.VISIBLE);
+
+ // SslCertificates don't offer this information
+ ((TextView)dialogView.findViewById(R.id.value_issuer_C)).setVisibility(View.GONE);
+ ((TextView)dialogView.findViewById(R.id.value_issuer_ST)).setVisibility(View.GONE);
+ ((TextView)dialogView.findViewById(R.id.value_issuer_L)).setVisibility(View.GONE);
+ ((TextView)dialogView.findViewById(R.id.label_issuer_C)).setVisibility(View.GONE);
+ ((TextView)dialogView.findViewById(R.id.label_issuer_ST)).setVisibility(View.GONE);
+ ((TextView)dialogView.findViewById(R.id.label_issuer_L)).setVisibility(View.GONE);
+ }
+
+ private void hideSignature(View dialogView) {
+ ((TextView)dialogView.findViewById(R.id.label_signature)).setVisibility(View.GONE);
+ ((TextView)dialogView.findViewById(R.id.label_signature_algorithm)).setVisibility(View.GONE);
+ ((TextView)dialogView.findViewById(R.id.value_signature_algorithm)).setVisibility(View.GONE);
+ ((TextView)dialogView.findViewById(R.id.value_signature)).setVisibility(View.GONE);
+ }
+
+}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2014 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package com.owncloud.android.ui.adapter;
+
+import com.owncloud.android.R;
+import com.owncloud.android.ui.dialog.SslUntrustedCertDialog;
+import android.net.http.SslError;
+import android.view.View;
+import android.widget.TextView;
+
+/**
+ * Dialog to show an Untrusted Certificate
+ *
+ * @author masensio
+ * @author David A. Velasco
+ *
+ */
+public class SslErrorViewAdapter implements SslUntrustedCertDialog.ErrorViewAdapter {
+
+ //private final static String TAG = SslErrorViewAdapter.class.getSimpleName();
+
+ private SslError mSslError;
+
+ public SslErrorViewAdapter(SslError sslError) {
+ mSslError = sslError;
+ }
+
+ @Override
+ public void updateErrorView(View dialogView) {
+ /// clean
+ dialogView.findViewById(R.id.reason_no_info_about_error).setVisibility(View.GONE);
+
+ /// refresh
+ if (mSslError.hasError(SslError.SSL_UNTRUSTED)) {
+ ((TextView)dialogView.findViewById(R.id.reason_cert_not_trusted)).setVisibility(View.VISIBLE);
+ } else {
+ dialogView.findViewById(R.id.reason_cert_not_trusted).setVisibility(View.GONE);
+ }
+
+ if (mSslError.hasError(SslError.SSL_EXPIRED)) {
+ ((TextView)dialogView.findViewById(R.id.reason_cert_expired)).setVisibility(View.VISIBLE);
+ } else {
+ dialogView.findViewById(R.id.reason_cert_expired).setVisibility(View.GONE);
+ }
+
+ if (mSslError.getPrimaryError() == SslError.SSL_NOTYETVALID) {
+ ((TextView)dialogView.findViewById(R.id.reason_cert_not_yet_valid)).setVisibility(View.VISIBLE);
+ } else {
+ dialogView.findViewById(R.id.reason_cert_not_yet_valid).setVisibility(View.GONE);
+ }
+
+ if (mSslError.getPrimaryError() == SslError.SSL_IDMISMATCH) {
+ ((TextView)dialogView.findViewById(R.id.reason_hostname_not_verified)).setVisibility(View.VISIBLE);
+ } else {
+ dialogView.findViewById(R.id.reason_hostname_not_verified).setVisibility(View.GONE);
+ }
+ }
+
+}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2014 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package com.owncloud.android.ui.adapter;
+
+import java.security.cert.X509Certificate;
+import java.text.DateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.security.auth.x500.X500Principal;
+
+import com.owncloud.android.R;
+import com.owncloud.android.ui.dialog.SslUntrustedCertDialog;
+
+import android.view.View;
+import android.widget.TextView;
+
+/**
+ *
+ * @author masensio
+ * @author David A. Velasco
+ *
+ */
+public class X509CertificateViewAdapter implements SslUntrustedCertDialog.CertificateViewAdapter {
+
+ //private final static String TAG = X509CertificateViewAdapter.class.getSimpleName();
+
+ private X509Certificate mCertificate = null;
+
+ public X509CertificateViewAdapter(X509Certificate certificate) {
+ mCertificate = certificate;
+ }
+
+ @Override
+ public void updateCertificateView(View dialogView) {
+ TextView nullCerView = (TextView) dialogView.findViewById(R.id.null_cert);
+
+ if (mCertificate != null) {
+ nullCerView.setVisibility(View.GONE);
+ showSubject(mCertificate.getSubjectX500Principal(), dialogView);
+ showIssuer(mCertificate.getIssuerX500Principal(), dialogView);
+ showValidity(mCertificate.getNotBefore(), mCertificate.getNotAfter(), dialogView);
+ showSignature(dialogView);
+
+ } else {
+ nullCerView.setVisibility(View.VISIBLE);
+ }
+ }
+
+ private void showSignature(View dialogView) {
+ TextView sigView = ((TextView)dialogView.findViewById(R.id.value_signature));
+ TextView algorithmView = ((TextView)dialogView.findViewById(R.id.value_signature_algorithm));
+ sigView.setText(getHex(mCertificate.getSignature()));
+ algorithmView.setText(mCertificate.getSigAlgName());
+ }
+
+ public String getHex(final byte [] raw) {
+ if (raw == null) {
+ return null;
+ }
+ final StringBuilder hex = new StringBuilder(2 * raw.length);
+ for (final byte b : raw) {
+ final int hiVal = (b & 0xF0) >> 4;
+ final int loVal = b & 0x0F;
+ hex.append((char) ('0' + (hiVal + (hiVal / 10 * 7))));
+ hex.append((char) ('0' + (loVal + (loVal / 10 * 7))));
+ }
+ return hex.toString();
+ }
+
+ private void showValidity(Date notBefore, Date notAfter, View dialogView) {
+ TextView fromView = ((TextView)dialogView.findViewById(R.id.value_validity_from));
+ TextView toView = ((TextView)dialogView.findViewById(R.id.value_validity_to));
+ DateFormat dateFormat = DateFormat.getDateInstance();
+ fromView.setText(dateFormat.format(notBefore));
+ toView.setText(dateFormat.format(notAfter));
+ }
+
+ private void showSubject(X500Principal subject, View dialogView) {
+ Map<String, String> s = parsePrincipal(subject);
+ TextView cnView = ((TextView)dialogView.findViewById(R.id.value_subject_CN));
+ TextView oView = ((TextView)dialogView.findViewById(R.id.value_subject_O));
+ TextView ouView = ((TextView)dialogView.findViewById(R.id.value_subject_OU));
+ TextView cView = ((TextView)dialogView.findViewById(R.id.value_subject_C));
+ TextView stView = ((TextView)dialogView.findViewById(R.id.value_subject_ST));
+ TextView lView = ((TextView)dialogView.findViewById(R.id.value_subject_L));
+
+ if (s.get("CN") != null) {
+ cnView.setText(s.get("CN"));
+ cnView.setVisibility(View.VISIBLE);
+ } else {
+ cnView.setVisibility(View.GONE);
+ }
+ if (s.get("O") != null) {
+ oView.setText(s.get("O"));
+ oView.setVisibility(View.VISIBLE);
+ } else {
+ oView.setVisibility(View.GONE);
+ }
+ if (s.get("OU") != null) {
+ ouView.setText(s.get("OU"));
+ ouView.setVisibility(View.VISIBLE);
+ } else {
+ ouView.setVisibility(View.GONE);
+ }
+ if (s.get("C") != null) {
+ cView.setText(s.get("C"));
+ cView.setVisibility(View.VISIBLE);
+ } else {
+ cView.setVisibility(View.GONE);
+ }
+ if (s.get("ST") != null) {
+ stView.setText(s.get("ST"));
+ stView.setVisibility(View.VISIBLE);
+ } else {
+ stView.setVisibility(View.GONE);
+ }
+ if (s.get("L") != null) {
+ lView.setText(s.get("L"));
+ lView.setVisibility(View.VISIBLE);
+ } else {
+ lView.setVisibility(View.GONE);
+ }
+ }
+
+ private void showIssuer(X500Principal issuer, View dialogView) {
+ Map<String, String> s = parsePrincipal(issuer);
+ TextView cnView = ((TextView)dialogView.findViewById(R.id.value_issuer_CN));
+ TextView oView = ((TextView)dialogView.findViewById(R.id.value_issuer_O));
+ TextView ouView = ((TextView)dialogView.findViewById(R.id.value_issuer_OU));
+ TextView cView = ((TextView)dialogView.findViewById(R.id.value_issuer_C));
+ TextView stView = ((TextView)dialogView.findViewById(R.id.value_issuer_ST));
+ TextView lView = ((TextView)dialogView.findViewById(R.id.value_issuer_L));
+
+ if (s.get("CN") != null) {
+ cnView.setText(s.get("CN"));
+ cnView.setVisibility(View.VISIBLE);
+ } else {
+ cnView.setVisibility(View.GONE);
+ }
+ if (s.get("O") != null) {
+ oView.setText(s.get("O"));
+ oView.setVisibility(View.VISIBLE);
+ } else {
+ oView.setVisibility(View.GONE);
+ }
+ if (s.get("OU") != null) {
+ ouView.setText(s.get("OU"));
+ ouView.setVisibility(View.VISIBLE);
+ } else {
+ ouView.setVisibility(View.GONE);
+ }
+ if (s.get("C") != null) {
+ cView.setText(s.get("C"));
+ cView.setVisibility(View.VISIBLE);
+ } else {
+ cView.setVisibility(View.GONE);
+ }
+ if (s.get("ST") != null) {
+ stView.setText(s.get("ST"));
+ stView.setVisibility(View.VISIBLE);
+ } else {
+ stView.setVisibility(View.GONE);
+ }
+ if (s.get("L") != null) {
+ lView.setText(s.get("L"));
+ lView.setVisibility(View.VISIBLE);
+ } else {
+ lView.setVisibility(View.GONE);
+ }
+ }
+
+
+ private Map<String, String> parsePrincipal(X500Principal principal) {
+ Map<String, String> result = new HashMap<String, String>();
+ String toParse = principal.getName();
+ String[] pieces = toParse.split(",");
+ String[] tokens = {"CN", "O", "OU", "C", "ST", "L"};
+ for (int i=0; i < pieces.length ; i++) {
+ for (int j=0; j<tokens.length; j++) {
+ if (pieces[i].startsWith(tokens[j] + "=")) {
+ result.put(tokens[j], pieces[i].substring(tokens[j].length()+1));
+ }
+ }
+ }
+ return result;
+ }
+
+}
package com.owncloud.android.ui.dialog;
-import java.io.InputStream;
-import java.util.Scanner;
-
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
-import android.net.Uri;
import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
import android.webkit.WebView;
-import android.widget.TextView;
import com.actionbarsherlock.app.SherlockDialogFragment;
import com.owncloud.android.R;
+import com.owncloud.android.utils.DisplayUtils;
+
/**
* Dialog to show the contents of res/raw/CHANGELOG.txt
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
Dialog dialog = builder.setView(webview)
- .setIcon(R.drawable.icon)
+ .setIcon(DisplayUtils.getSeasonalIconId())
//.setTitle(R.string.whats_new)
.setPositiveButton(R.string.common_ok,
new DialogInterface.OnClickListener() {
import com.actionbarsherlock.app.SherlockDialogFragment;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.owncloud.android.R;
+import com.owncloud.android.utils.DisplayUtils;
+
/**
* Dialog which will be displayed to user upon keep-in-sync file conflict.
public Dialog onCreateDialog(Bundle savedInstanceState) {
String remotepath = getArguments().getString("remotepath");
return new AlertDialog.Builder(getSherlockActivity())
- .setIcon(R.drawable.icon)
+ .setIcon(DisplayUtils.getSeasonalIconId())
.setTitle(R.string.conflict_title)
.setMessage(String.format(getString(R.string.conflict_message), remotepath))
.setPositiveButton(R.string.conflict_overwrite,
@Override
public void onClick(DialogInterface dialog, int which) {
if (mListener != null)
- mListener.ConflictDecisionMade(Decision.OVERWRITE);
+ mListener.conflictDecisionMade(Decision.OVERWRITE);
}
})
.setNeutralButton(R.string.conflict_keep_both,
@Override
public void onClick(DialogInterface dialog, int which) {
if (mListener != null)
- mListener.ConflictDecisionMade(Decision.KEEP_BOTH);
+ mListener.conflictDecisionMade(Decision.KEEP_BOTH);
}
})
.setNegativeButton(R.string.conflict_dont_upload,
@Override
public void onClick(DialogInterface dialog, int which) {
if (mListener != null)
- mListener.ConflictDecisionMade(Decision.CANCEL);
+ mListener.conflictDecisionMade(Decision.CANCEL);
}
})
.create();
@Override
public void onCancel(DialogInterface dialog) {
- mListener.ConflictDecisionMade(Decision.CANCEL);
+ mListener.conflictDecisionMade(Decision.CANCEL);
}
public interface OnConflictDecisionMadeListener {
- public void ConflictDecisionMade(Decision decision);
+ public void conflictDecisionMade(Decision decision);
}
}
import android.view.WindowManager.LayoutParams;
import android.widget.EditText;
import android.widget.TextView;
+import android.widget.Toast;
import com.actionbarsherlock.app.SherlockDialogFragment;
import com.owncloud.android.R;
+import com.owncloud.android.lib.resources.files.FileUtils;
/**
switch (which) {
case AlertDialog.BUTTON_POSITIVE: {
mNewFilename = ((TextView)(getDialog().findViewById(R.id.user_input))).getText().toString();
+ if (!FileUtils.isValidName(mNewFilename)) {
+ Toast.makeText(getSherlockActivity(), R.string.filename_forbidden_characters, Toast.LENGTH_LONG).show();
+ return;
+ }
mResult = true;
}
case AlertDialog.BUTTON_NEGATIVE: { // fall through
import com.actionbarsherlock.app.SherlockDialogFragment;
import com.owncloud.android.R;
+
public class IndeterminateProgressDialog extends SherlockDialogFragment {
private static final String ARG_MESSAGE_ID = IndeterminateProgressDialog.class.getCanonicalName() + ".ARG_MESSAGE_ID";
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2014 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package com.owncloud.android.ui.dialog;
+
+import com.owncloud.android.R;
+
+import android.app.Dialog;
+import android.os.Bundle;
+import android.support.v4.app.DialogFragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.widget.TextView;
+
+public class LoadingDialog extends DialogFragment {
+
+ private String mMessage;
+
+ public LoadingDialog() {
+ super();
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setRetainInstance(true);
+ setCancelable(false);
+ }
+
+ public LoadingDialog(String message) {
+ this.mMessage = message;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ // Create a view by inflating desired layout
+ View v = inflater.inflate(R.layout.loading_dialog, container, false);
+
+ // set value
+ TextView tv = (TextView) v.findViewById(R.id.loadingText);
+ tv.setText(mMessage);
+
+ return v;
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ Dialog dialog = super.onCreateDialog(savedInstanceState);
+ dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
+ return dialog;
+ }
+
+ @Override
+ public void onDestroyView() {
+ if (getDialog() != null && getRetainInstance())
+ getDialog().setDismissMessage(null);
+ super.onDestroyView();
+ }
+}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2014 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.ui.dialog;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v4.app.FragmentTransaction;
+import android.support.v4.app.FragmentManager;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.webkit.CookieManager;
+import android.webkit.CookieSyncManager;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.widget.RelativeLayout;
+
+import com.actionbarsherlock.app.SherlockDialogFragment;
+import com.owncloud.android.R;
+import com.owncloud.android.authentication.SsoWebViewClient;
+import com.owncloud.android.authentication.SsoWebViewClient.SsoWebViewClientListener;
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.utils.Log_OC;
+
+
+/**
+ * Dialog to show the WebView for SAML Authentication
+ *
+ * @author Maria Asensio
+ * @author David A. Velasco
+ */
+public class SamlWebViewDialog extends SherlockDialogFragment {
+
+ public final String SAML_DIALOG_TAG = "SamlWebViewDialog";
+
+ private final static String TAG = SamlWebViewDialog.class.getSimpleName();
+
+ private static final String ARG_INITIAL_URL = "INITIAL_URL";
+ private static final String ARG_TARGET_URL = "TARGET_URL";
+
+ private WebView mSsoWebView;
+ private SsoWebViewClient mWebViewClient;
+
+ private String mInitialUrl;
+ private String mTargetUrl;
+
+ private Handler mHandler;
+
+ private SsoWebViewClientListener mSsoWebViewClientListener;
+
+ /**
+ * Public factory method to get dialog instances.
+ *
+ * @param handler
+ * @param Url Url to open at WebView
+ * @param targetURL mBaseUrl + AccountUtils.getWebdavPath(mDiscoveredVersion, mCurrentAuthTokenType)
+ * @return New dialog instance, ready to show.
+ */
+ public static SamlWebViewDialog newInstance(String url, String targetUrl) {
+ Log_OC.d(TAG, "New instance");
+ SamlWebViewDialog fragment = new SamlWebViewDialog();
+ Bundle args = new Bundle();
+ args.putString(ARG_INITIAL_URL, url);
+ args.putString(ARG_TARGET_URL, targetUrl);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+
+ public SamlWebViewDialog() {
+ super();
+ Log_OC.d(TAG, "constructor");
+ }
+
+
+ @Override
+ public void onAttach(Activity activity) {
+ Log_OC.d(TAG, "onAttach");
+ super.onAttach(activity);
+ try {
+ mSsoWebViewClientListener = (SsoWebViewClientListener) activity;
+ mHandler = new Handler();
+ mWebViewClient = new SsoWebViewClient(activity, mHandler, mSsoWebViewClientListener);
+
+ } catch (ClassCastException e) {
+ throw new ClassCastException(activity.toString() + " must implement " + SsoWebViewClientListener.class.getSimpleName());
+ }
+ }
+
+
+ @SuppressLint("SetJavaScriptEnabled")
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ Log_OC.d(TAG, "onCreate, savedInstanceState is " + savedInstanceState);
+ super.onCreate(savedInstanceState);
+
+ setRetainInstance(true);
+
+ CookieSyncManager.createInstance(getSherlockActivity().getApplicationContext());
+
+ if (savedInstanceState == null) {
+ mInitialUrl = getArguments().getString(ARG_INITIAL_URL);
+ mTargetUrl = getArguments().getString(ARG_TARGET_URL);
+ } else {
+ mInitialUrl = savedInstanceState.getString(ARG_INITIAL_URL);
+ mTargetUrl = savedInstanceState.getString(ARG_TARGET_URL);
+ }
+
+ setStyle(SherlockDialogFragment.STYLE_NO_TITLE, R.style.Theme_ownCloud_Dialog);
+ }
+
+ @SuppressWarnings("deprecation")
+ @SuppressLint("SetJavaScriptEnabled")
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ Log_OC.d(TAG, "onCreateView, savedInsanceState is " + savedInstanceState);
+
+ // Inflate layout of the dialog
+ RelativeLayout ssoRootView = (RelativeLayout) inflater.inflate(R.layout.sso_dialog, container, false); // null parent view because it will go in the dialog layout
+
+ if (mSsoWebView == null) {
+ // initialize the WebView
+ mSsoWebView = new SsoWebView(getSherlockActivity().getApplicationContext());
+ mSsoWebView.setFocusable(true);
+ mSsoWebView.setFocusableInTouchMode(true);
+ mSsoWebView.setClickable(true);
+
+ CookieManager cookieManager = CookieManager.getInstance();
+ cookieManager.setAcceptCookie(true);
+ cookieManager.removeAllCookie();
+ mSsoWebView.loadUrl(mInitialUrl);
+
+ WebSettings webSettings = mSsoWebView.getSettings();
+ webSettings.setJavaScriptEnabled(true);
+ webSettings.setBuiltInZoomControls(false);
+ webSettings.setLoadWithOverviewMode(false);
+ webSettings.setSavePassword(false);
+ webSettings.setUserAgentString(OwnCloudClient.USER_AGENT);
+ webSettings.setSaveFormData(false);
+ }
+
+ mWebViewClient.setTargetUrl(mTargetUrl);
+ mSsoWebView.setWebViewClient(mWebViewClient);
+
+ // add the webview into the layout
+ RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
+ RelativeLayout.LayoutParams.WRAP_CONTENT,
+ RelativeLayout.LayoutParams.WRAP_CONTENT
+ );
+ ssoRootView.addView(mSsoWebView, layoutParams);
+ ssoRootView.requestLayout();
+
+ return ssoRootView;
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ Log_OC.d(TAG, "onSaveInstanceState being CALLED");
+ super.onSaveInstanceState(outState);
+
+ // save URLs
+ outState.putString(ARG_INITIAL_URL, mInitialUrl);
+ outState.putString(ARG_TARGET_URL, mTargetUrl);
+ }
+
+ @Override
+ public void onDestroyView() {
+ Log_OC.d(TAG, "onDestroyView");
+
+ if ((ViewGroup)mSsoWebView.getParent() != null) {
+ ((ViewGroup)mSsoWebView.getParent()).removeView(mSsoWebView);
+ }
+
+ mSsoWebView.setWebViewClient(null);
+
+ // Work around bug: http://code.google.com/p/android/issues/detail?id=17423
+ Dialog dialog = getDialog();
+ if ((dialog != null)) {
+ dialog.setOnDismissListener(null);
+ //dialog.dismiss();
+ //dialog.setDismissMessage(null);
+ }
+
+ super.onDestroyView();
+ }
+
+ @Override
+ public void onDestroy() {
+ Log_OC.d(TAG, "onDestroy");
+ super.onDestroy();
+ }
+
+ @Override
+ public void onDetach() {
+ Log_OC.d(TAG, "onDetach");
+ mSsoWebViewClientListener = null;
+ mWebViewClient = null;
+ super.onDetach();
+ }
+
+ @Override
+ public void onCancel (DialogInterface dialog) {
+ Log_OC.d(TAG, "onCancel");
+ super.onCancel(dialog);
+ }
+
+ @Override
+ public void onDismiss (DialogInterface dialog) {
+ Log_OC.d(TAG, "onDismiss");
+ super.onDismiss(dialog);
+ }
+
+ @Override
+ public void onStart() {
+ Log_OC.d(TAG, "onStart");
+ super.onStart();
+ }
+
+ @Override
+ public void onStop() {
+ Log_OC.d(TAG, "onStop");
+ super.onStop();
+ }
+
+ @Override
+ public void onResume() {
+ Log_OC.d(TAG, "onResume");
+ super.onResume();
+ mSsoWebView.onResume();
+ }
+
+ @Override
+ public void onPause() {
+ Log_OC.d(TAG, "onPause");
+ mSsoWebView.onPause();
+ super.onPause();
+ }
+
+ @Override
+ public int show (FragmentTransaction transaction, String tag) {
+ Log_OC.d(TAG, "show (transaction)");
+ return super.show(transaction, tag);
+ }
+
+ @Override
+ public void show (FragmentManager manager, String tag) {
+ Log_OC.d(TAG, "show (manager)");
+ super.show(manager, tag);
+ }
+
+}
\ No newline at end of file
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2014 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.ui.dialog;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.actionbarsherlock.app.SherlockDialogFragment;
+import com.owncloud.android.R;
+import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.files.FileOperationsHelper;
+import com.owncloud.android.ui.activity.CopyToClipboardActivity;
+import com.owncloud.android.ui.activity.FileActivity;
+import com.owncloud.android.utils.Log_OC;
+
+/**
+ * Dialog showing a list activities able to resolve a given Intent,
+ * filtering out the activities matching give package names.
+ *
+ * @author David A. Velasco
+ */
+public class ShareLinkToDialog extends SherlockDialogFragment {
+
+ private final static String TAG = ShareLinkToDialog.class.getSimpleName();
+ private final static String ARG_INTENT = ShareLinkToDialog.class.getSimpleName() + ".ARG_INTENT";
+ private final static String ARG_PACKAGES_TO_EXCLUDE = ShareLinkToDialog.class.getSimpleName() + ".ARG_PACKAGES_TO_EXCLUDE";
+ private final static String ARG_FILE_TO_SHARE = ShareLinkToDialog.class.getSimpleName() + ".FILE_TO_SHARE";
+
+ private ActivityAdapter mAdapter;
+ private OCFile mFile;
+ private Intent mIntent;
+
+ public static ShareLinkToDialog newInstance(Intent intent, String[] packagesToExclude, OCFile fileToShare) {
+ ShareLinkToDialog f = new ShareLinkToDialog();
+ Bundle args = new Bundle();
+ args.putParcelable(ARG_INTENT, intent);
+ args.putStringArray(ARG_PACKAGES_TO_EXCLUDE, packagesToExclude);
+ args.putParcelable(ARG_FILE_TO_SHARE, fileToShare);
+ f.setArguments(args);
+ return f;
+ }
+
+ public ShareLinkToDialog() {
+ super();
+ Log_OC.d(TAG, "constructor");
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ mIntent = getArguments().getParcelable(ARG_INTENT);
+ String[] packagesToExclude = getArguments().getStringArray(ARG_PACKAGES_TO_EXCLUDE);
+ List<String> packagesToExcludeList = Arrays.asList(packagesToExclude != null ? packagesToExclude : new String[0]);
+ mFile = getArguments().getParcelable(ARG_FILE_TO_SHARE);
+
+ PackageManager pm= getSherlockActivity().getPackageManager();
+ List<ResolveInfo> activities = pm.queryIntentActivities(mIntent, PackageManager.MATCH_DEFAULT_ONLY);
+ Iterator<ResolveInfo> it = activities.iterator();
+ ResolveInfo resolveInfo;
+ while (it.hasNext()) {
+ resolveInfo = it.next();
+ if (packagesToExcludeList.contains(resolveInfo.activityInfo.packageName.toLowerCase())) {
+ it.remove();
+ }
+ }
+
+ boolean sendAction = mIntent.getBooleanExtra(Intent.ACTION_SEND, false);
+
+ if (!sendAction) {
+ // add activity for copy to clipboard
+ Intent copyToClipboardIntent = new Intent(getSherlockActivity(), CopyToClipboardActivity.class);
+ List<ResolveInfo> copyToClipboard = pm.queryIntentActivities(copyToClipboardIntent, 0);
+ if (!copyToClipboard.isEmpty()) {
+ activities.add(copyToClipboard.get(0));
+ }
+ }
+
+ Collections.sort(activities, new ResolveInfo.DisplayNameComparator(pm));
+ mAdapter = new ActivityAdapter(getSherlockActivity(), pm, activities);
+
+ return createSelector(sendAction);
+
+ }
+
+ private AlertDialog createSelector(final boolean sendAction) {
+
+ int titleId;
+ if (sendAction) {
+ titleId = R.string.activity_chooser_send_file_title;
+ } else {
+ titleId = R.string.activity_chooser_title;
+ }
+
+ return new AlertDialog.Builder(getSherlockActivity())
+ .setTitle(titleId)
+ .setAdapter(mAdapter, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // Add the information of the chosen activity to the intent to send
+ ResolveInfo chosen = mAdapter.getItem(which);
+ ActivityInfo actInfo = chosen.activityInfo;
+ ComponentName name=new ComponentName(actInfo.applicationInfo.packageName, actInfo.name);
+ mIntent.setComponent(name);
+
+ if (sendAction) {
+ dialog.dismiss(); // explicitly added for Android 2.x devices
+
+ // Send the file
+ ((FileActivity)getSherlockActivity()).startActivity(mIntent);
+
+ } else {
+ // Create a new share resource
+ FileOperationsHelper foh = new FileOperationsHelper();
+ foh.shareFileWithLinkToApp(mFile, mIntent, (FileActivity)getSherlockActivity());
+ }
+ }
+ })
+ .create();
+ }
+
+ class ActivityAdapter extends ArrayAdapter<ResolveInfo> {
+
+ private PackageManager mPackageManager;
+
+ ActivityAdapter(Context context, PackageManager pm, List<ResolveInfo> apps) {
+ super(context, R.layout.activity_row, apps);
+ this.mPackageManager = pm;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ if (convertView == null) {
+ convertView = newView(parent);
+ }
+ bindView(position, convertView);
+ return convertView;
+ }
+
+ private View newView(ViewGroup parent) {
+ return(((LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.activity_row, parent, false));
+ }
+
+ private void bindView(int position, View row) {
+ TextView label = (TextView) row.findViewById(R.id.title);
+ label.setText(getItem(position).loadLabel(mPackageManager));
+ ImageView icon = (ImageView) row.findViewById(R.id.icon);
+ icon.setImageDrawable(getItem(position).loadIcon(mPackageManager));
+ }
+ }
+
+}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2014 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package com.owncloud.android.ui.dialog;
+
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.security.cert.X509Certificate;
+
+import android.app.Activity;
+import android.app.Dialog;
+import android.net.http.SslError;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.View.OnClickListener;
+import android.webkit.SslErrorHandler;
+import android.widget.Button;
+
+import com.actionbarsherlock.app.SherlockDialogFragment;
+import com.owncloud.android.R;
+import com.owncloud.android.lib.common.network.CertificateCombinedException;
+import com.owncloud.android.lib.common.network.NetworkUtils;
+import com.owncloud.android.ui.adapter.CertificateCombinedExceptionViewAdapter;
+import com.owncloud.android.ui.adapter.SslCertificateViewAdapter;
+import com.owncloud.android.ui.adapter.SslErrorViewAdapter;
+import com.owncloud.android.ui.adapter.X509CertificateViewAdapter;
+import com.owncloud.android.utils.Log_OC;
+
+/**
+ * Dialog to show information about an untrusted certificate and allow the user
+ * to decide trust on it or not.
+ *
+ * Abstract implementation of common functionality for different dialogs that
+ * get the information about the error and the certificate from different classes.
+ *
+ * @author masensio
+ * @author David A. Velasco
+ */
+public class SslUntrustedCertDialog extends SherlockDialogFragment {
+
+ private final static String TAG = SslUntrustedCertDialog.class.getSimpleName();
+
+ protected View mView = null;
+ protected SslErrorHandler mHandler = null;
+ protected X509Certificate m509Certificate = null;
+
+ private ErrorViewAdapter mErrorViewAdapter = null;
+ private CertificateViewAdapter mCertificateViewAdapter = null;
+
+ public static SslUntrustedCertDialog newInstanceForEmptySslError(SslError error, SslErrorHandler handler) {
+ if (error == null) {
+ throw new IllegalArgumentException("Trying to create instance with parameter error == null");
+ }
+ if (handler == null) {
+ throw new IllegalArgumentException("Trying to create instance with parameter handler == null");
+ }
+ SslUntrustedCertDialog dialog = new SslUntrustedCertDialog();
+ dialog.mHandler = handler;
+ dialog.mErrorViewAdapter = new SslErrorViewAdapter(error);
+ dialog.mCertificateViewAdapter = new SslCertificateViewAdapter(error.getCertificate());
+ return dialog;
+ }
+
+ public static SslUntrustedCertDialog newInstanceForFullSslError(CertificateCombinedException sslException) {
+ if (sslException == null) {
+ throw new IllegalArgumentException("Trying to create instance with parameter sslException == null");
+ }
+ SslUntrustedCertDialog dialog = new SslUntrustedCertDialog();
+ dialog.m509Certificate = sslException.getServerCertificate();
+ dialog.mErrorViewAdapter = new CertificateCombinedExceptionViewAdapter(sslException);
+ dialog.mCertificateViewAdapter = new X509CertificateViewAdapter(sslException.getServerCertificate());
+ return dialog;
+ }
+
+ public static SslUntrustedCertDialog newInstanceForFullSslError(X509Certificate cert, SslError error, SslErrorHandler handler) {
+ if (cert == null) {
+ throw new IllegalArgumentException("Trying to create instance with parameter cert == null");
+ }
+ if (error == null) {
+ throw new IllegalArgumentException("Trying to create instance with parameter error == null");
+ }
+ if (handler == null) {
+ throw new IllegalArgumentException("Trying to create instance with parameter handler == null");
+ }
+ SslUntrustedCertDialog dialog = new SslUntrustedCertDialog();
+ dialog.m509Certificate = cert;
+ dialog.mHandler = handler;
+ dialog.mErrorViewAdapter = new SslErrorViewAdapter(error);
+ dialog.mCertificateViewAdapter = new X509CertificateViewAdapter(cert);
+ return dialog;
+ }
+
+
+ @Override
+ public void onAttach(Activity activity) {
+ Log_OC.d(TAG, "onAttach");
+ super.onAttach(activity);
+ if (!(activity instanceof OnSslUntrustedCertListener)) {
+ throw new IllegalArgumentException("The host activity must implement " + OnSslUntrustedCertListener.class.getCanonicalName());
+ }
+ }
+
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ Log_OC.d(TAG, "onCreate, savedInstanceState is " + savedInstanceState);
+ super.onCreate(savedInstanceState);
+ setRetainInstance(true); // force to keep the state of the fragment on configuration changes (such as device rotations)
+ setCancelable(false);
+ mView = null;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ Log_OC.d(TAG, "onCreateView, savedInsanceState is " + savedInstanceState);
+ // Create a view by inflating desired layout
+ if (mView == null) {
+ mView = inflater.inflate(R.layout.ssl_untrusted_cert_layout, container, false);
+ mView.findViewById(R.id.details_scroll).setVisibility(View.GONE);
+ mErrorViewAdapter.updateErrorView(mView);
+ } else {
+ ((ViewGroup)mView.getParent()).removeView(mView);
+ }
+
+ Button ok = (Button) mView.findViewById(R.id.ok);
+ ok.setOnClickListener(new OnCertificateTrusted());
+
+ Button cancel = (Button) mView.findViewById(R.id.cancel);
+ cancel.setOnClickListener(new OnCertificateNotTrusted());
+
+ Button details = (Button) mView.findViewById(R.id.details_btn);
+ details.setOnClickListener(new OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+ View detailsScroll = mView.findViewById(R.id.details_scroll);
+ if (detailsScroll.getVisibility() == View.VISIBLE) {
+ detailsScroll.setVisibility(View.GONE);
+ ((Button) v).setText(R.string.ssl_validator_btn_details_see);
+
+ } else {
+ detailsScroll.setVisibility(View.VISIBLE);
+ ((Button) v).setText(R.string.ssl_validator_btn_details_hide);
+ mCertificateViewAdapter.updateCertificateView(mView);
+ }
+ }
+
+ });
+
+ return mView;
+ }
+
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ Log_OC.d(TAG, "onCreateDialog, savedInstanceState is " + savedInstanceState);
+ final Dialog dialog = super.onCreateDialog(savedInstanceState);
+ dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
+ return dialog;
+ }
+
+ @Override
+ public void onDestroyView() {
+ Log_OC.d(TAG, "onDestroyView");
+ if (getDialog() != null && getRetainInstance())
+ getDialog().setDismissMessage(null);
+ super.onDestroyView();
+ }
+
+ private class OnCertificateNotTrusted implements OnClickListener {
+
+ @Override
+ public void onClick(View v) {
+ getDialog().cancel();
+ if (mHandler != null) {
+ mHandler.cancel();
+ }
+ ((OnSslUntrustedCertListener)getSherlockActivity()).onCancelCertificate();
+ }
+ }
+
+
+ private class OnCertificateTrusted implements OnClickListener {
+
+ @Override
+ public void onClick(View v) {
+ dismiss();
+ if (mHandler != null) {
+ mHandler.proceed();
+ }
+ if (m509Certificate != null) {
+ Activity activity = getSherlockActivity();
+ try {
+ NetworkUtils.addCertToKnownServersStore(m509Certificate, activity); // TODO make this asynchronously, it can take some time
+ ((OnSslUntrustedCertListener)activity).onSavedCertificate();
+
+ } catch (GeneralSecurityException e) {
+ ((OnSslUntrustedCertListener)activity).onFailedSavingCertificate();
+ Log_OC.e(TAG, "Server certificate could not be saved in the known-servers trust store ", e);
+
+ } catch (IOException e) {
+ ((OnSslUntrustedCertListener)activity).onFailedSavingCertificate();
+ Log_OC.e(TAG, "Server certificate could not be saved in the known-servers trust store ", e);
+ }
+ }
+ }
+
+ }
+
+
+ public interface OnSslUntrustedCertListener {
+ public void onSavedCertificate();
+ public void onFailedSavingCertificate();
+ public void onCancelCertificate();
+ }
+
+ public interface ErrorViewAdapter {
+ void updateErrorView(View mView);
+ }
+
+ public interface CertificateViewAdapter {
+ void updateCertificateView(View mView);
+ }
+
+}
package com.owncloud.android.ui.dialog;
import java.io.IOException;
+import java.security.GeneralSecurityException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import javax.security.auth.x500.X500Principal;
+import com.owncloud.android.R;
+
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
-import android.util.Log;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.R;
-import com.owncloud.android.network.CertificateCombinedException;
-import com.owncloud.android.network.OwnCloudClientUtils;
-import com.owncloud.android.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.network.CertificateCombinedException;
+import com.owncloud.android.lib.common.network.NetworkUtils;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.utils.Log_OC;
/**
* Dialog to request the user about a certificate that could not be validated with the certificates store in the system.
else
Log_OC.d(TAG, "Nobody there to notify the certificate was saved");
- } catch (Exception e) {
+ } catch (GeneralSecurityException e) {
+ dismiss();
+ if (mListener != null)
+ mListener.onFailedSavingCertificate();
+ Log_OC.e(TAG, "Server certificate could not be saved in the known servers trust store ", e);
+
+ } catch (IOException e) {
dismiss();
if (mListener != null)
mListener.onFailedSavingCertificate();
View detailsScroll = findViewById(R.id.details_scroll);
if (detailsScroll.getVisibility() == View.VISIBLE) {
detailsScroll.setVisibility(View.GONE);
- ((Button)v).setText(R.string.ssl_validator_btn_details_see);
+ ((Button) v).setText(R.string.ssl_validator_btn_details_see);
} else {
detailsScroll.setVisibility(View.VISIBLE);
- ((Button)v).setText(R.string.ssl_validator_btn_details_hide);
+ ((Button) v).setText(R.string.ssl_validator_btn_details_hide);
}
}
});
return hex.toString();
}
+ @SuppressWarnings("deprecation")
private void showValidity(Date notBefore, Date notAfter) {
TextView fromView = ((TextView)mView.findViewById(R.id.value_validity_from));
TextView toView = ((TextView)mView.findViewById(R.id.value_validity_to));
private void saveServerCert() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException {
if (mException.getServerCertificate() != null) {
// TODO make this asynchronously, it can take some time
- OwnCloudClientUtils.addCertToKnownServersStore(mException.getServerCertificate(), getContext());
+ NetworkUtils.addCertToKnownServersStore(mException.getServerCertificate(), getContext());
}
}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2013 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.ui.dialog;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.webkit.WebView;
+
+public class SsoWebView extends WebView {
+
+ public SsoWebView(Context context) {
+ super(context);
+ }
+
+ public SsoWebView(Context context, AttributeSet attr) {
+ super(context, attr);
+ }
+
+ @Override
+ public boolean onCheckIsTextEditor () {
+ return false;
+ }
+
+}
+
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
-import android.util.Log;
import com.actionbarsherlock.app.SherlockDialogFragment;
-import com.owncloud.android.Log_OC;
+import com.owncloud.android.utils.Log_OC;
+
public class ConfirmationDialogFragment extends SherlockDialogFragment {
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012 Bartek Przybylski
+ * Copyright (C) 2012-2013 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.ui.fragment;
+
+import com.actionbarsherlock.app.SherlockFragment;
+import com.owncloud.android.R;
+import com.owncloud.android.ui.ExtendedListView;
+import com.owncloud.android.utils.Log_OC;
+
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ListAdapter;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.ListView;
+
+/**
+ * TODO extending SherlockListFragment instead of SherlockFragment
+ */
+public class ExtendedListFragment extends SherlockFragment implements OnItemClickListener {
+
+ private static final String TAG = ExtendedListFragment.class.getSimpleName();
+
+ private static final String KEY_SAVED_LIST_POSITION = "SAVED_LIST_POSITION";
+
+ protected ExtendedListView mList;
+
+ public void setListAdapter(ListAdapter listAdapter) {
+ mList.setAdapter(listAdapter);
+ mList.invalidate();
+ }
+
+ public ListView getListView() {
+ return mList;
+ }
+
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ Log_OC.e(TAG, "onCreateView");
+ //mList = new ExtendedListView(getActivity());
+ View v = inflater.inflate(R.layout.list_fragment, null);
+ mList = (ExtendedListView)(v.findViewById(R.id.list_root));
+ mList.setOnItemClickListener(this);
+ //mList.setEmptyView(v.findViewById(R.id.empty_list_view)); // looks like it's not a cool idea
+ mList.setDivider(getResources().getDrawable(R.drawable.uploader_list_separator));
+ mList.setDividerHeight(1);
+
+ if (savedInstanceState != null) {
+ int referencePosition = savedInstanceState.getInt(KEY_SAVED_LIST_POSITION);
+ setReferencePosition(referencePosition);
+ }
+
+ return v;
+ }
+
+
+ @Override
+ public void onSaveInstanceState(Bundle savedInstanceState) {
+ super.onSaveInstanceState(savedInstanceState);
+ Log_OC.e(TAG, "onSaveInstanceState()");
+ savedInstanceState.putInt(KEY_SAVED_LIST_POSITION, getReferencePosition());
+ }
+
+
+ /**
+ * Calculates the position of the item that will be used as a reference to reposition the visible items in the list when
+ * the device is turned to other position.
+ *
+ * THe current policy is take as a reference the visible item in the center of the screen.
+ *
+ * @return The position in the list of the visible item in the center of the screen.
+ */
+ protected int getReferencePosition() {
+ if (mList != null) {
+ return (mList.getFirstVisiblePosition() + mList.getLastVisiblePosition()) / 2;
+ } else {
+ return 0;
+ }
+ }
+
+
+ /**
+ * Sets the visible part of the list from the reference position.
+ *
+ * @param position Reference position previously returned by {@link LocalFileListFragment#getReferencePosition()}
+ */
+ protected void setReferencePosition(int position) {
+ if (mList != null) {
+ mList.setAndCenterSelection(position);
+ }
+ }
+
+ @Override
+ public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
+ // to be @overriden
+ }
+
+
+}
import java.util.ArrayList;
import java.util.List;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.commons.httpclient.methods.PostMethod;
-import org.apache.commons.httpclient.methods.StringRequestEntity;
-import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
-import org.apache.http.HttpStatus;
-import org.apache.http.NameValuePair;
-import org.apache.http.client.utils.URLEncodedUtils;
-import org.apache.http.message.BasicNameValuePair;
-import org.apache.http.protocol.HTTP;
-import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;
-import org.json.JSONObject;
-
import android.accounts.Account;
-import android.accounts.AccountManager;
-//import android.annotation.SuppressLint;
import android.app.Activity;
-import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
-import android.support.v4.app.FragmentTransaction;
-import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
-import android.webkit.MimeTypeMap;
-import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.BitmapFactory.Options;
-import android.graphics.Point;
-import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.Handler;
-import android.support.v4.app.DialogFragment;
-import android.support.v4.app.FragmentTransaction;
-import android.util.Log;
-import android.view.Display;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.webkit.MimeTypeMap;
-import android.widget.Button;
-import android.widget.CheckBox;
-import android.widget.ImageView;
-import android.widget.TextView;
-import android.widget.Toast;
-
-
-import com.actionbarsherlock.app.SherlockFragment;
-import com.owncloud.android.AccountUtils;
-import com.owncloud.android.DisplayUtils;
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.authenticator.AccountAuthenticator;
+import com.actionbarsherlock.view.Menu;
+import com.actionbarsherlock.view.MenuInflater;
+import com.actionbarsherlock.view.MenuItem;
+import com.owncloud.android.R;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.files.services.FileObserverService;
import com.owncloud.android.files.services.FileUploader;
import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
-import com.owncloud.android.network.OwnCloudClientUtils;
-import com.owncloud.android.operations.OnRemoteOperationListener;
-import com.owncloud.android.operations.RemoteOperation;
-import com.owncloud.android.operations.RemoteOperationResult;
-import com.owncloud.android.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.lib.common.network.OnDatatransferProgressListener;
+import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
import com.owncloud.android.operations.RemoveFileOperation;
import com.owncloud.android.operations.RenameFileOperation;
import com.owncloud.android.operations.SynchronizeFileOperation;
import com.owncloud.android.ui.activity.ConflictsResolveActivity;
-import com.owncloud.android.ui.activity.FileDetailActivity;
+import com.owncloud.android.ui.activity.FileActivity;
import com.owncloud.android.ui.activity.FileDisplayActivity;
import com.owncloud.android.ui.dialog.EditNameDialog;
import com.owncloud.android.ui.dialog.EditNameDialog.EditNameDialogListener;
-import com.owncloud.android.utils.OwnCloudVersion;
-
-import com.owncloud.android.R;
-
-import eu.alefzero.webdav.OnDatatransferProgressListener;
-import eu.alefzero.webdav.WebdavClient;
-import eu.alefzero.webdav.WebdavUtils;
+import com.owncloud.android.ui.preview.PreviewImageFragment;
+import com.owncloud.android.utils.DisplayUtils;
+import com.owncloud.android.utils.Log_OC;
/**
* @author Bartek Przybylski
* @author David A. Velasco
*/
-public class FileDetailFragment extends SherlockFragment implements
+public class FileDetailFragment extends FileFragment implements
OnClickListener,
- ConfirmationDialogFragment.ConfirmationDialogFragmentListener, OnRemoteOperationListener, EditNameDialogListener,
- FileFragment {
-
- public static final String EXTRA_FILE = "FILE";
- public static final String EXTRA_ACCOUNT = "ACCOUNT";
+ ConfirmationDialogFragment.ConfirmationDialogFragmentListener, OnRemoteOperationListener, EditNameDialogListener {
private FileFragment.ContainerActivity mContainerActivity;
private int mLayout;
private View mView;
- private OCFile mFile;
private Account mAccount;
private FileDataStorageManager mStorageManager;
private RemoteOperation mLastRemoteOperation;
private static final String TAG = FileDetailFragment.class.getSimpleName();
- public static final String FTAG = "FileDetails";
public static final String FTAG_CONFIRMATION = "REMOVE_CONFIRMATION_FRAGMENT";
* It's necessary to keep a public constructor without parameters; the system uses it when tries to reinstantiate a fragment automatically.
*/
public FileDetailFragment() {
- mFile = null;
+ super();
mAccount = null;
mStorageManager = null;
mLayout = R.layout.file_details_empty;
mProgressListener = null;
}
-
/**
* Creates a details fragment.
*
* @param ocAccount An ownCloud account; needed to start downloads
*/
public FileDetailFragment(OCFile fileToDetail, Account ocAccount) {
- mFile = fileToDetail;
+ super(fileToDetail);
mAccount = ocAccount;
mStorageManager = null; // we need a context to init this; the container activity is not available yet at this moment
mLayout = R.layout.file_details_empty;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHandler = new Handler();
+ setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- super.onCreateView(inflater, container, savedInstanceState);
+ //super.onCreateView(inflater, container, savedInstanceState);
if (savedInstanceState != null) {
- mFile = savedInstanceState.getParcelable(FileDetailFragment.EXTRA_FILE);
- mAccount = savedInstanceState.getParcelable(FileDetailFragment.EXTRA_ACCOUNT);
+ setFile((OCFile)savedInstanceState.getParcelable(FileActivity.EXTRA_FILE));
+ mAccount = savedInstanceState.getParcelable(FileActivity.EXTRA_ACCOUNT);
}
- if(mFile != null && mAccount != null) {
+ if(getFile() != null && mAccount != null) {
mLayout = R.layout.file_details_fragment;
}
View view = null;
- view = inflater.inflate(mLayout, container, false);
+ //view = inflater.inflate(mLayout, container, false);
+ view = inflater.inflate(mLayout, null);
mView = view;
if (mLayout == R.layout.file_details_fragment) {
mView.findViewById(R.id.fdKeepInSync).setOnClickListener(this);
- mView.findViewById(R.id.fdRenameBtn).setOnClickListener(this);
- mView.findViewById(R.id.fdDownloadBtn).setOnClickListener(this);
- mView.findViewById(R.id.fdOpenBtn).setOnClickListener(this);
- mView.findViewById(R.id.fdRemoveBtn).setOnClickListener(this);
- //mView.findViewById(R.id.fdShareBtn).setOnClickListener(this);
ProgressBar progressBar = (ProgressBar)mView.findViewById(R.id.fdProgressBar);
mProgressListener = new ProgressListener(progressBar);
+ mView.findViewById(R.id.fdCancelBtn).setOnClickListener(this);
}
updateFileDetails(false, false);
return view;
}
-
/**
* {@inheritDoc}
*/
super.onActivityCreated(savedInstanceState);
if (mAccount != null) {
mStorageManager = new FileDataStorageManager(mAccount, getActivity().getApplicationContext().getContentResolver());
+ OCFile file = mStorageManager.getFileByPath(getFile().getRemotePath());
+ if (file != null) {
+ setFile(file);
+ }
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
- outState.putParcelable(FileDetailFragment.EXTRA_FILE, mFile);
- outState.putParcelable(FileDetailFragment.EXTRA_ACCOUNT, mAccount);
+ outState.putParcelable(FileActivity.EXTRA_FILE, getFile());
+ outState.putParcelable(FileActivity.EXTRA_ACCOUNT, mAccount);
}
@Override
public void onResume() {
super.onResume();
mUploadFinishReceiver = new UploadFinishReceiver();
- IntentFilter filter = new IntentFilter(FileUploader.UPLOAD_FINISH_MESSAGE);
+ IntentFilter filter = new IntentFilter(FileUploader.getUploadFinishMessage());
getActivity().registerReceiver(mUploadFinishReceiver, filter);
}
return super.getView() == null ? mView : super.getView();
}
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ super.onCreateOptionsMenu(menu, inflater);
+ inflater.inflate(R.menu.file_actions_menu, menu);
+ MenuItem item = menu.findItem(R.id.action_see_details);
+ if (item != null) {
+ item.setVisible(false);
+ item.setEnabled(false);
+ }
+
+ // Send file
+ item = menu.findItem(R.id.action_send_file);
+ boolean sendEnabled = getString(R.string.send_files_to_other_apps).equalsIgnoreCase("on");
+ if (item != null) {
+ if (sendEnabled) {
+ item.setVisible(true);
+ item.setEnabled(true);
+ } else {
+ item.setVisible(false);
+ item.setEnabled(false);
+
+ }
+ }
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
@Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.fdDownloadBtn: {
- FileDownloaderBinder downloaderBinder = mContainerActivity.getFileDownloaderBinder();
- FileUploaderBinder uploaderBinder = mContainerActivity.getFileUploaderBinder();
- if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, mFile)) {
- downloaderBinder.cancel(mAccount, mFile);
- if (mFile.isDown()) {
- setButtonsForDown();
- } else {
- setButtonsForRemote();
- }
+ public void onPrepareOptionsMenu (Menu menu) {
+ super.onPrepareOptionsMenu(menu);
+
+ List<Integer> toHide = new ArrayList<Integer>();
+ List<Integer> toShow = new ArrayList<Integer>();
+ OCFile file = getFile();
+
+ FileDownloaderBinder downloaderBinder = mContainerActivity.getFileDownloaderBinder();
+ boolean downloading = downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file);
+ FileUploaderBinder uploaderBinder = mContainerActivity.getFileUploaderBinder();
+ boolean uploading = uploaderBinder != null && uploaderBinder.isUploading(mAccount, getFile());
+
+ if (downloading || uploading) {
+ toHide.add(R.id.action_download_file);
+ toHide.add(R.id.action_rename_file);
+ toHide.add(R.id.action_remove_file);
+ toHide.add(R.id.action_open_file_with);
+ if (!downloading) {
+ toHide.add(R.id.action_cancel_download);
+ toShow.add(R.id.action_cancel_upload);
+ } else {
+ toHide.add(R.id.action_cancel_upload);
+ toShow.add(R.id.action_cancel_download);
+ }
- } else if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, mFile)) {
- uploaderBinder.cancel(mAccount, mFile);
- if (!mFile.fileExists()) {
- // TODO make something better
- if (getActivity() instanceof FileDisplayActivity) {
- // double pane
- FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
- transaction.replace(R.id.file_details_container, new FileDetailFragment(null, null), FTAG); // empty FileDetailFragment
- transaction.commit();
- mContainerActivity.onFileStateChanged();
- } else {
- getActivity().finish();
- }
-
- } else if (mFile.isDown()) {
- setButtonsForDown();
- } else {
- setButtonsForRemote();
- }
+ } else if (file != null && file.isDown()) {
+ toHide.add(R.id.action_download_file);
+ toHide.add(R.id.action_cancel_download);
+ toHide.add(R.id.action_cancel_upload);
+
+ toShow.add(R.id.action_rename_file);
+ toShow.add(R.id.action_remove_file);
+ toShow.add(R.id.action_open_file_with);
+ toShow.add(R.id.action_sync_file);
+
+ } else if (file != null) {
+ toHide.add(R.id.action_open_file_with);
+ toHide.add(R.id.action_cancel_download);
+ toHide.add(R.id.action_cancel_upload);
+ toHide.add(R.id.action_sync_file);
+
+ toShow.add(R.id.action_rename_file);
+ toShow.add(R.id.action_remove_file);
+ toShow.add(R.id.action_download_file);
+
+ } else {
+ toHide.add(R.id.action_open_file_with);
+ toHide.add(R.id.action_cancel_download);
+ toHide.add(R.id.action_cancel_upload);
+ toHide.add(R.id.action_sync_file);
+ toHide.add(R.id.action_download_file);
+ toHide.add(R.id.action_rename_file);
+ toHide.add(R.id.action_remove_file);
+
+ }
+
+ // Options shareLink
+ if (!file.isShareByLink()) {
+ toHide.add(R.id.action_unshare_file);
+ } else {
+ toShow.add(R.id.action_unshare_file);
+ }
+
+ MenuItem item = null;
+ for (int i : toHide) {
+ item = menu.findItem(i);
+ if (item != null) {
+ item.setVisible(false);
+ item.setEnabled(false);
+ }
+ }
+ for (int i : toShow) {
+ item = menu.findItem(i);
+ if (item != null) {
+ item.setVisible(true);
+ item.setEnabled(true);
+ }
+ }
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.action_share_file: {
+ FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity();
+ activity.getFileOperationsHelper().shareFileWithLink(getFile(), activity);
+ return true;
+ }
+ case R.id.action_unshare_file: {
+ FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity();
+ activity.getFileOperationsHelper().unshareFileWithLink(getFile(), activity);
+ return true;
+ }
+ case R.id.action_open_file_with: {
+ FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity();
+ activity.getFileOperationsHelper().openFile(getFile(), activity);
+ return true;
+ }
+ case R.id.action_remove_file: {
+ removeFile();
+ return true;
+ }
+ case R.id.action_rename_file: {
+ renameFile();
+ return true;
+ }
+ case R.id.action_download_file:
+ case R.id.action_cancel_download:
+ case R.id.action_cancel_upload:
+ case R.id.action_sync_file: {
+ synchronizeFile();
+ return true;
+ }
+ case R.id.action_send_file: {
+ FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity();
+ // Obtain the file
+ if (!getFile().isDown()) { // Download the file
+ Log_OC.d(TAG, getFile().getRemotePath() + " : File must be downloaded");
+ activity.startDownloadForSending(getFile());
} else {
- mLastRemoteOperation = new SynchronizeFileOperation(mFile, null, mStorageManager, mAccount, true, false, getActivity());
- WebdavClient wc = OwnCloudClientUtils.createOwnCloudClient(mAccount, getSherlockActivity().getApplicationContext());
- mLastRemoteOperation.execute(wc, this, mHandler);
-
- // update ui
- boolean inDisplayActivity = getActivity() instanceof FileDisplayActivity;
- getActivity().showDialog((inDisplayActivity)? FileDisplayActivity.DIALOG_SHORT_WAIT : FileDetailActivity.DIALOG_SHORT_WAIT);
-
+ activity.getFileOperationsHelper().sendDownloadedFile(getFile(), activity);
}
- break;
+ return true;
}
+ default:
+ return false;
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
case R.id.fdKeepInSync: {
- CheckBox cb = (CheckBox) getView().findViewById(R.id.fdKeepInSync);
- mFile.setKeepInSync(cb.isChecked());
- mStorageManager.saveFile(mFile);
-
- /// register the OCFile instance in the observer service to monitor local updates;
- /// if necessary, the file is download
- Intent intent = new Intent(getActivity().getApplicationContext(),
- FileObserverService.class);
- intent.putExtra(FileObserverService.KEY_FILE_CMD,
- (cb.isChecked()?
- FileObserverService.CMD_ADD_OBSERVED_FILE:
- FileObserverService.CMD_DEL_OBSERVED_FILE));
- intent.putExtra(FileObserverService.KEY_CMD_ARG_FILE, mFile);
- intent.putExtra(FileObserverService.KEY_CMD_ARG_ACCOUNT, mAccount);
- getActivity().startService(intent);
-
- if (mFile.keepInSync()) {
- onClick(getView().findViewById(R.id.fdDownloadBtn)); // force an immediate synchronization
- }
+ toggleKeepInSync();
break;
}
- case R.id.fdRenameBtn: {
- String fileName = mFile.getFileName();
- int extensionStart = mFile.isDirectory() ? -1 : fileName.lastIndexOf(".");
- int selectionEnd = (extensionStart >= 0) ? extensionStart : fileName.length();
- EditNameDialog dialog = EditNameDialog.newInstance(getString(R.string.rename_dialog_title), fileName, 0, selectionEnd, this);
- dialog.show(getFragmentManager(), "nameeditdialog");
- break;
- }
- case R.id.fdRemoveBtn: {
- ConfirmationDialogFragment confDialog = ConfirmationDialogFragment.newInstance(
- R.string.confirmation_remove_alert,
- new String[]{mFile.getFileName()},
- mFile.isDown() ? R.string.confirmation_remove_remote_and_local : R.string.confirmation_remove_remote,
- mFile.isDown() ? R.string.confirmation_remove_local : -1,
- R.string.common_cancel);
- confDialog.setOnConfirmationListener(this);
- confDialog.show(getFragmentManager(), FTAG_CONFIRMATION);
- break;
- }
- case R.id.fdOpenBtn: {
- openFile();
+ case R.id.fdCancelBtn: {
+ synchronizeFile();
break;
}
default:
Log_OC.e(TAG, "Incorrect view clicked!");
}
-
- /* else if (v.getId() == R.id.fdShareBtn) {
- Thread t = new Thread(new ShareRunnable(mFile.getRemotePath()));
- t.start();
- }*/
}
- /**
- * Opens mFile.
- */
- private void openFile() {
+ private void toggleKeepInSync() {
+ CheckBox cb = (CheckBox) getView().findViewById(R.id.fdKeepInSync);
+ OCFile file = getFile();
+ file.setKeepInSync(cb.isChecked());
+ mStorageManager.saveFile(file);
- String storagePath = mFile.getStoragePath();
- String encodedStoragePath = WebdavUtils.encodePath(storagePath);
- try {
- Intent i = new Intent(Intent.ACTION_VIEW);
- i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), mFile.getMimetype());
- i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
- startActivity(i);
-
- } catch (Throwable t) {
- Log.e(TAG, "Fail when trying to open with the mimeType provided from the ownCloud server: " + mFile.getMimetype());
- boolean toastIt = true;
- String mimeType = "";
- try {
- Intent i = new Intent(Intent.ACTION_VIEW);
- mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(storagePath.substring(storagePath.lastIndexOf('.') + 1));
- if (mimeType == null || !mimeType.equals(mFile.getMimetype())) {
- if (mimeType != null) {
- i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), mimeType);
- } else {
- // desperate try
- i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), "*/*");
- }
- i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
- startActivity(i);
- toastIt = false;
- }
-
- } catch (IndexOutOfBoundsException e) {
- Log.e(TAG, "Trying to find out MIME type of a file without extension: " + storagePath);
-
- } catch (ActivityNotFoundException e) {
- Log.e(TAG, "No activity found to handle: " + storagePath + " with MIME type " + mimeType + " obtained from extension");
-
- } catch (Throwable th) {
- Log.e(TAG, "Unexpected problem when opening: " + storagePath, th);
+ /// register the OCFile instance in the observer service to monitor local updates;
+ /// if necessary, the file is download
+ Intent intent = new Intent(getActivity().getApplicationContext(),
+ FileObserverService.class);
+ intent.putExtra(FileObserverService.KEY_FILE_CMD,
+ (cb.isChecked()?
+ FileObserverService.CMD_ADD_OBSERVED_FILE:
+ FileObserverService.CMD_DEL_OBSERVED_FILE));
+ intent.putExtra(FileObserverService.KEY_CMD_ARG_FILE, file);
+ intent.putExtra(FileObserverService.KEY_CMD_ARG_ACCOUNT, mAccount);
+ getActivity().startService(intent);
+
+ if (file.keepInSync()) {
+ synchronizeFile(); // force an immediate synchronization
+ }
+ }
+
+ private void removeFile() {
+ OCFile file = getFile();
+ ConfirmationDialogFragment confDialog = ConfirmationDialogFragment.newInstance(
+ R.string.confirmation_remove_alert,
+ new String[]{file.getFileName()},
+ file.isDown() ? R.string.confirmation_remove_remote_and_local : R.string.confirmation_remove_remote,
+ file.isDown() ? R.string.confirmation_remove_local : -1,
+ R.string.common_cancel);
+ confDialog.setOnConfirmationListener(this);
+ confDialog.show(getFragmentManager(), FTAG_CONFIRMATION);
+ }
+
+
+ private void renameFile() {
+ OCFile file = getFile();
+ String fileName = file.getFileName();
+ int extensionStart = file.isFolder() ? -1 : fileName.lastIndexOf(".");
+ int selectionEnd = (extensionStart >= 0) ? extensionStart : fileName.length();
+ EditNameDialog dialog = EditNameDialog.newInstance(getString(R.string.rename_dialog_title), fileName, 0, selectionEnd, this);
+ dialog.show(getFragmentManager(), "nameeditdialog");
+ }
+
+ private void synchronizeFile() {
+ OCFile file = getFile();
+ FileDownloaderBinder downloaderBinder = mContainerActivity.getFileDownloaderBinder();
+ FileUploaderBinder uploaderBinder = mContainerActivity.getFileUploaderBinder();
+ if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)) {
+ downloaderBinder.cancel(mAccount, file);
+ if (file.isDown()) {
+ setButtonsForDown();
+ } else {
+ setButtonsForRemote();
+ }
+
+ } else if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, file)) {
+ uploaderBinder.cancel(mAccount, file);
+ if (!file.fileExists()) {
+ // TODO make something better
+ ((FileDisplayActivity)getActivity()).cleanSecondFragment();
- } finally {
- if (toastIt) {
- Toast.makeText(getActivity(), "There is no application to handle file " + mFile.getFileName(), Toast.LENGTH_SHORT).show();
- }
+ } else if (file.isDown()) {
+ setButtonsForDown();
+ } else {
+ setButtonsForRemote();
}
+ } else {
+ mLastRemoteOperation = new SynchronizeFileOperation(file, null, mStorageManager, mAccount, true, getActivity());
+ mLastRemoteOperation.execute(mAccount, getSherlockActivity(), this, mHandler, getSherlockActivity());
+
+ // update ui
+ ((FileDisplayActivity) getActivity()).showLoadingDialog();
+
}
}
-
@Override
public void onConfirmation(String callerTag) {
+ OCFile file = getFile();
if (callerTag.equals(FTAG_CONFIRMATION)) {
- if (mStorageManager.getFileById(mFile.getFileId()) != null) {
- mLastRemoteOperation = new RemoveFileOperation( mFile,
+ if (mStorageManager.getFileById(file.getFileId()) != null) {
+ mLastRemoteOperation = new RemoveFileOperation( file,
true,
mStorageManager);
- WebdavClient wc = OwnCloudClientUtils.createOwnCloudClient(mAccount, getSherlockActivity().getApplicationContext());
- mLastRemoteOperation.execute(wc, this, mHandler);
-
- boolean inDisplayActivity = getActivity() instanceof FileDisplayActivity;
- getActivity().showDialog((inDisplayActivity)? FileDisplayActivity.DIALOG_SHORT_WAIT : FileDetailActivity.DIALOG_SHORT_WAIT);
+ mLastRemoteOperation.execute(mAccount, getSherlockActivity(), this, mHandler, getSherlockActivity());
+
+ ((FileDisplayActivity) getActivity()).showLoadingDialog();
}
}
}
@Override
public void onNeutral(String callerTag) {
- File f = null;
- if (mFile.isDown() && (f = new File(mFile.getStoragePath())).exists()) {
- f.delete();
- mFile.setStoragePath(null);
- mStorageManager.saveFile(mFile);
- updateFileDetails(mFile, mAccount);
+ OCFile file = getFile();
+ mStorageManager.removeFile(file, false, true); // TODO perform in background task / new thread
+ if (file.getStoragePath() != null) {
+ file.setStoragePath(null);
+ updateFileDetails(file, mAccount);
}
}
@Override
public void onCancel(String callerTag) {
- Log.d(TAG, "REMOVAL CANCELED");
+ Log_OC.d(TAG, "REMOVAL CANCELED");
}
* @return True when the fragment was created with the empty layout.
*/
public boolean isEmpty() {
- return (mLayout == R.layout.file_details_empty || mFile == null || mAccount == null);
+ return (mLayout == R.layout.file_details_empty || getFile() == null || mAccount == null);
}
/**
- * {@inheritDoc}
- */
- public OCFile getFile(){
- return mFile;
- }
-
- /**
* Use this method to signal this Activity that it shall update its view.
*
* @param file : An {@link OCFile}
*/
public void updateFileDetails(OCFile file, Account ocAccount) {
- mFile = file;
+ setFile(file);
if (ocAccount != null && (
mStorageManager == null ||
(mAccount != null && !mAccount.equals(ocAccount))
if (readyToShow()) {
if (refresh && mStorageManager != null) {
- mFile = mStorageManager.getFileByPath(mFile.getRemotePath());
+ setFile(mStorageManager.getFileByPath(getFile().getRemotePath()));
}
+ OCFile file = getFile();
// set file details
- setFilename(mFile.getFileName());
- setFiletype(mFile.getMimetype());
- setFilesize(mFile.getFileLength());
+ setFilename(file.getFileName());
+ setFiletype(file.getMimetype());
+ setFilesize(file.getFileLength());
if(ocVersionSupportsTimeCreated()){
- setTimeCreated(mFile.getCreationTimestamp());
+ setTimeCreated(file.getCreationTimestamp());
}
- setTimeModified(mFile.getModificationTimestamp());
+ setTimeModified(file.getModificationTimestamp());
CheckBox cb = (CheckBox)getView().findViewById(R.id.fdKeepInSync);
- cb.setChecked(mFile.keepInSync());
+ cb.setChecked(file.keepInSync());
// configure UI for depending upon local state of the file
//if (FileDownloader.isDownloading(mAccount, mFile.getRemotePath()) || FileUploader.isUploading(mAccount, mFile.getRemotePath())) {
FileDownloaderBinder downloaderBinder = mContainerActivity.getFileDownloaderBinder();
FileUploaderBinder uploaderBinder = mContainerActivity.getFileUploaderBinder();
- if (transferring || (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, mFile)) || (uploaderBinder != null && uploaderBinder.isUploading(mAccount, mFile))) {
+ if (transferring || (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)) || (uploaderBinder != null && uploaderBinder.isUploading(mAccount, file))) {
setButtonsForTransferring();
- } else if (mFile.isDown()) {
+ } else if (file.isDown()) {
setButtonsForDown();
getView().invalidate();
}
-
/**
* Checks if the fragment is ready to show details of a OCFile
*
* @return 'True' when the fragment is ready to show details of a file
*/
private boolean readyToShow() {
- return (mFile != null && mAccount != null && mLayout == R.layout.file_details_fragment);
+ return (getFile() != null && mAccount != null && mLayout == R.layout.file_details_fragment);
}
*/
private void setButtonsForTransferring() {
if (!isEmpty()) {
- Button downloadButton = (Button) getView().findViewById(R.id.fdDownloadBtn);
- downloadButton.setText(R.string.common_cancel);
- //downloadButton.setEnabled(false);
-
// let's protect the user from himself ;)
- ((Button) getView().findViewById(R.id.fdOpenBtn)).setEnabled(false);
- ((Button) getView().findViewById(R.id.fdRenameBtn)).setEnabled(false);
- ((Button) getView().findViewById(R.id.fdRemoveBtn)).setEnabled(false);
getView().findViewById(R.id.fdKeepInSync).setEnabled(false);
// show the progress bar for the transfer
- ProgressBar progressBar = (ProgressBar)getView().findViewById(R.id.fdProgressBar);
- progressBar.setVisibility(View.VISIBLE);
+ getView().findViewById(R.id.fdProgressBlock).setVisibility(View.VISIBLE);
TextView progressText = (TextView)getView().findViewById(R.id.fdProgressText);
progressText.setVisibility(View.VISIBLE);
FileDownloaderBinder downloaderBinder = mContainerActivity.getFileDownloaderBinder();
FileUploaderBinder uploaderBinder = mContainerActivity.getFileUploaderBinder();
- if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, mFile)) {
+ if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, getFile())) {
progressText.setText(R.string.downloader_download_in_progress_ticker);
- } else if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, mFile)) {
+ } else if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, getFile())) {
progressText.setText(R.string.uploader_upload_in_progress_ticker);
}
}
*/
private void setButtonsForDown() {
if (!isEmpty()) {
- Button downloadButton = (Button) getView().findViewById(R.id.fdDownloadBtn);
- downloadButton.setText(R.string.filedetails_sync_file);
-
- ((Button) getView().findViewById(R.id.fdOpenBtn)).setEnabled(true);
- ((Button) getView().findViewById(R.id.fdRenameBtn)).setEnabled(true);
- ((Button) getView().findViewById(R.id.fdRemoveBtn)).setEnabled(true);
getView().findViewById(R.id.fdKeepInSync).setEnabled(true);
// hides the progress bar
- ProgressBar progressBar = (ProgressBar)getView().findViewById(R.id.fdProgressBar);
- progressBar.setVisibility(View.GONE);
+ getView().findViewById(R.id.fdProgressBlock).setVisibility(View.GONE);
TextView progressText = (TextView)getView().findViewById(R.id.fdProgressText);
progressText.setVisibility(View.GONE);
}
*/
private void setButtonsForRemote() {
if (!isEmpty()) {
- Button downloadButton = (Button) getView().findViewById(R.id.fdDownloadBtn);
- downloadButton.setText(R.string.filedetails_download);
-
- ((Button) getView().findViewById(R.id.fdOpenBtn)).setEnabled(false);
- ((Button) getView().findViewById(R.id.fdRenameBtn)).setEnabled(true);
- ((Button) getView().findViewById(R.id.fdRemoveBtn)).setEnabled(true);
getView().findViewById(R.id.fdKeepInSync).setEnabled(true);
// hides the progress bar
- ProgressBar progressBar = (ProgressBar)getView().findViewById(R.id.fdProgressBar);
- progressBar.setVisibility(View.GONE);
+ getView().findViewById(R.id.fdProgressBlock).setVisibility(View.GONE);
TextView progressText = (TextView)getView().findViewById(R.id.fdProgressText);
progressText.setVisibility(View.GONE);
}
if (!isEmpty() && accountName.equals(mAccount.name)) {
boolean uploadWasFine = intent.getBooleanExtra(FileUploader.EXTRA_UPLOAD_RESULT, false);
String uploadRemotePath = intent.getStringExtra(FileUploader.EXTRA_REMOTE_PATH);
- boolean renamedInUpload = mFile.getRemotePath().equals(intent.getStringExtra(FileUploader.EXTRA_OLD_REMOTE_PATH));
- if (mFile.getRemotePath().equals(uploadRemotePath) ||
+ boolean renamedInUpload = getFile().getRemotePath().equals(intent.getStringExtra(FileUploader.EXTRA_OLD_REMOTE_PATH));
+ if (getFile().getRemotePath().equals(uploadRemotePath) ||
renamedInUpload) {
if (uploadWasFine) {
- mFile = mStorageManager.getFileByPath(uploadRemotePath);
+ setFile(mStorageManager.getFileByPath(uploadRemotePath));
}
if (renamedInUpload) {
String newName = (new File(uploadRemotePath)).getName();
msg.show();
}
getSherlockActivity().removeStickyBroadcast(intent); // not the best place to do this; a small refactorization of BroadcastReceivers should be done
+
updateFileDetails(false, false); // it updates the buttons; must be called although !uploadWasFine; interrupted uploads still leave an incomplete file in the server
+
+ // Force the preview if the file is an image
+ if (uploadWasFine && PreviewImageFragment.canBePreviewed(getFile())) {
+ ((FileDisplayActivity) mContainerActivity).startImagePreview(getFile());
+ }
}
}
}
}
- // this is a temporary class for sharing purposes, it need to be replaced in transfer service
- @SuppressWarnings("unused")
- private class ShareRunnable implements Runnable {
- private String mPath;
-
- public ShareRunnable(String path) {
- mPath = path;
- }
-
- public void run() {
- AccountManager am = AccountManager.get(getActivity());
- Account account = AccountUtils.getCurrentOwnCloudAccount(getActivity());
- OwnCloudVersion ocv = new OwnCloudVersion(am.getUserData(account, AccountAuthenticator.KEY_OC_VERSION));
- String url = am.getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL) + AccountUtils.getWebdavPath(ocv);
-
- Log.d("share", "sharing for version " + ocv.toString());
-
- if (ocv.compareTo(new OwnCloudVersion(0x040000)) >= 0) {
- String APPS_PATH = "/apps/files_sharing/";
- String SHARE_PATH = "ajax/share.php";
-
- String SHARED_PATH = "/apps/files_sharing/get.php?token=";
-
- final String WEBDAV_SCRIPT = "webdav.php";
- final String WEBDAV_FILES_LOCATION = "/files/";
-
- WebdavClient wc = OwnCloudClientUtils.createOwnCloudClient(account, getActivity().getApplicationContext());
- HttpConnectionManagerParams params = new HttpConnectionManagerParams();
- params.setMaxConnectionsPerHost(wc.getHostConfiguration(), 5);
-
- //wc.getParams().setParameter("http.protocol.single-cookie-header", true);
- //wc.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
-
- PostMethod post = new PostMethod(am.getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL) + APPS_PATH + SHARE_PATH);
-
- post.addRequestHeader("Content-type","application/x-www-form-urlencoded; charset=UTF-8" );
- post.addRequestHeader("Referer", am.getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL));
- List<NameValuePair> formparams = new ArrayList<NameValuePair>();
- Log.d("share", mPath+"");
- formparams.add(new BasicNameValuePair("sources",mPath));
- formparams.add(new BasicNameValuePair("uid_shared_with", "public"));
- formparams.add(new BasicNameValuePair("permissions", "0"));
- post.setRequestEntity(new StringRequestEntity(URLEncodedUtils.format(formparams, HTTP.UTF_8)));
-
- int status;
- try {
- PropFindMethod find = new PropFindMethod(url+"/");
- find.addRequestHeader("Referer", am.getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL));
- Log.d("sharer", ""+ url+"/");
-
- for (org.apache.commons.httpclient.Header a : find.getRequestHeaders()) {
- Log.d("sharer-h", a.getName() + ":"+a.getValue());
- }
-
- int status2 = wc.executeMethod(find);
-
- Log.d("sharer", "propstatus "+status2);
-
- GetMethod get = new GetMethod(am.getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL) + "/");
- get.addRequestHeader("Referer", am.getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL));
-
- status2 = wc.executeMethod(get);
-
- Log.d("sharer", "getstatus "+status2);
- Log.d("sharer", "" + get.getResponseBodyAsString());
-
- for (org.apache.commons.httpclient.Header a : get.getResponseHeaders()) {
- Log.d("sharer", a.getName() + ":"+a.getValue());
- }
-
- status = wc.executeMethod(post);
- for (org.apache.commons.httpclient.Header a : post.getRequestHeaders()) {
- Log.d("sharer-h", a.getName() + ":"+a.getValue());
- }
- for (org.apache.commons.httpclient.Header a : post.getResponseHeaders()) {
- Log.d("sharer", a.getName() + ":"+a.getValue());
- }
- String resp = post.getResponseBodyAsString();
- Log.d("share", ""+post.getURI().toString());
- Log.d("share", "returned status " + status);
- Log.d("share", " " +resp);
-
- if(status != HttpStatus.SC_OK ||resp == null || resp.equals("") || resp.startsWith("false")) {
- return;
- }
-
- JSONObject jsonObject = new JSONObject (resp);
- String jsonStatus = jsonObject.getString("status");
- if(!jsonStatus.equals("success")) throw new Exception("Error while sharing file status != success");
-
- String token = jsonObject.getString("data");
- String uri = am.getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL) + SHARED_PATH + token;
- Log.d("Actions:shareFile ok", "url: " + uri);
-
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- } else if (ocv.compareTo(new OwnCloudVersion(0x030000)) >= 0) {
-
- }
- }
- }
-
public void onDismiss(EditNameDialog dialog) {
if (dialog.getResult()) {
String newFilename = dialog.getNewFilename();
- Log.d(TAG, "name edit dialog dismissed with new name " + newFilename);
- mLastRemoteOperation = new RenameFileOperation( mFile,
+ Log_OC.d(TAG, "name edit dialog dismissed with new name " + newFilename);
+ mLastRemoteOperation = new RenameFileOperation( getFile(),
mAccount,
newFilename,
new FileDataStorageManager(mAccount, getActivity().getContentResolver()));
- WebdavClient wc = OwnCloudClientUtils.createOwnCloudClient(mAccount, getSherlockActivity().getApplicationContext());
- mLastRemoteOperation.execute(wc, this, mHandler);
- boolean inDisplayActivity = getActivity() instanceof FileDisplayActivity;
- getActivity().showDialog((inDisplayActivity)? FileDisplayActivity.DIALOG_SHORT_WAIT : FileDetailActivity.DIALOG_SHORT_WAIT);
+ mLastRemoteOperation.execute(mAccount, getSherlockActivity(), this, mHandler, getSherlockActivity());
+ ((FileDisplayActivity) getActivity()).showLoadingDialog();
}
}
private void onRemoveFileOperationFinish(RemoveFileOperation operation, RemoteOperationResult result) {
- boolean inDisplayActivity = getActivity() instanceof FileDisplayActivity;
- getActivity().dismissDialog((inDisplayActivity)? FileDisplayActivity.DIALOG_SHORT_WAIT : FileDetailActivity.DIALOG_SHORT_WAIT);
-
+ ((FileDisplayActivity) getActivity()).dismissLoadingDialog();
if (result.isSuccess()) {
Toast msg = Toast.makeText(getActivity().getApplicationContext(), R.string.remove_success_msg, Toast.LENGTH_LONG);
msg.show();
- if (inDisplayActivity) {
- // double pane
- FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
- transaction.replace(R.id.file_details_container, new FileDetailFragment(null, null)); // empty FileDetailFragment
- transaction.commit();
- mContainerActivity.onFileStateChanged();
- } else {
- getActivity().finish();
- }
-
+ ((FileDisplayActivity)getActivity()).cleanSecondFragment();
+
} else {
Toast msg = Toast.makeText(getActivity(), R.string.remove_fail_msg, Toast.LENGTH_LONG);
msg.show();
}
private void onRenameFileOperationFinish(RenameFileOperation operation, RemoteOperationResult result) {
- boolean inDisplayActivity = getActivity() instanceof FileDisplayActivity;
- getActivity().dismissDialog((inDisplayActivity)? FileDisplayActivity.DIALOG_SHORT_WAIT : FileDetailActivity.DIALOG_SHORT_WAIT);
+ ((FileDisplayActivity) getActivity()).dismissLoadingDialog();
if (result.isSuccess()) {
updateFileDetails(((RenameFileOperation)operation).getFile(), mAccount);
Toast msg = Toast.makeText(getActivity(), R.string.rename_local_fail_msg, Toast.LENGTH_LONG);
msg.show();
// TODO throw again the new rename dialog
+ } if (result.getCode().equals(ResultCode.INVALID_CHARACTER_IN_NAME)) {
+ Toast msg = Toast.makeText(getActivity(), R.string.filename_forbidden_characters, Toast.LENGTH_LONG);
+ msg.show();
} else {
Toast msg = Toast.makeText(getActivity(), R.string.rename_server_fail_msg, Toast.LENGTH_LONG);
msg.show();
}
private void onSynchronizeFileOperationFinish(SynchronizeFileOperation operation, RemoteOperationResult result) {
- boolean inDisplayActivity = getActivity() instanceof FileDisplayActivity;
- getActivity().dismissDialog((inDisplayActivity)? FileDisplayActivity.DIALOG_SHORT_WAIT : FileDetailActivity.DIALOG_SHORT_WAIT);
-
+ ((FileDisplayActivity) getActivity()).dismissLoadingDialog();
+ OCFile file = getFile();
if (!result.isSuccess()) {
if (result.getCode() == ResultCode.SYNC_CONFLICT) {
Intent i = new Intent(getActivity(), ConflictsResolveActivity.class);
- i.putExtra(ConflictsResolveActivity.EXTRA_FILE, mFile);
+ i.putExtra(ConflictsResolveActivity.EXTRA_FILE, file);
i.putExtra(ConflictsResolveActivity.EXTRA_ACCOUNT, mAccount);
startActivity(i);
- } else {
- Toast msg = Toast.makeText(getActivity(), R.string.sync_file_fail_msg, Toast.LENGTH_LONG);
- msg.show();
- }
+ }
- if (mFile.isDown()) {
+ if (file.isDown()) {
setButtonsForDown();
} else {
} else {
Toast msg = Toast.makeText(getActivity(), R.string.sync_file_nothing_to_do_msg, Toast.LENGTH_LONG);
msg.show();
- if (mFile.isDown()) {
+ if (file.isDown()) {
setButtonsForDown();
} else {
}
}
-
+
public void listenForTransferProgress() {
if (mProgressListener != null) {
if (mContainerActivity.getFileDownloaderBinder() != null) {
- mContainerActivity.getFileDownloaderBinder().addDatatransferProgressListener(mProgressListener, mAccount, mFile);
+ mContainerActivity.getFileDownloaderBinder().addDatatransferProgressListener(mProgressListener, mAccount, getFile());
}
if (mContainerActivity.getFileUploaderBinder() != null) {
- mContainerActivity.getFileUploaderBinder().addDatatransferProgressListener(mProgressListener, mAccount, mFile);
+ mContainerActivity.getFileUploaderBinder().addDatatransferProgressListener(mProgressListener, mAccount, getFile());
}
}
}
public void leaveTransferProgress() {
if (mProgressListener != null) {
if (mContainerActivity.getFileDownloaderBinder() != null) {
- mContainerActivity.getFileDownloaderBinder().removeDatatransferProgressListener(mProgressListener, mAccount, mFile);
+ mContainerActivity.getFileDownloaderBinder().removeDatatransferProgressListener(mProgressListener, mAccount, getFile());
}
if (mContainerActivity.getFileUploaderBinder() != null) {
- mContainerActivity.getFileUploaderBinder().removeDatatransferProgressListener(mProgressListener, mAccount, mFile);
+ mContainerActivity.getFileUploaderBinder().removeDatatransferProgressListener(mProgressListener, mAccount, getFile());
}
}
}
}
@Override
- public void onTransferProgress(long progressRate) {
- // old method, nothing here
- };
-
- @Override
public void onTransferProgress(long progressRate, long totalTransferredSoFar, long totalToTransfer, String filename) {
int percent = (int)(100.0*((double)totalTransferredSoFar)/((double)totalToTransfer));
if (percent != mLastPercent) {
};
-}
\ No newline at end of file
+}
package com.owncloud.android.ui.fragment;
-import android.content.Intent;
import android.support.v4.app.Fragment;
+import com.actionbarsherlock.app.SherlockFragment;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.ui.activity.TransferServiceGetter;
+
/**
* Common methods for {@link Fragment}s containing {@link OCFile}s
*
* @author David A. Velasco
*
*/
-public interface FileFragment {
+public class FileFragment extends SherlockFragment {
+ private OCFile mFile;
+
+
+ /**
+ * Creates an empty fragment.
+ *
+ * It's necessary to keep a public constructor without parameters; the system uses it when tries to reinstantiate a fragment automatically.
+ */
+ public FileFragment() {
+ mFile = null;
+ }
+
+ /**
+ * Creates an instance for a given {@OCFile}.
+ *
+ * @param file
+ */
+ public FileFragment(OCFile file) {
+ mFile = file;
+ }
+
/**
* Getter for the hold {@link OCFile}
*
* @return The {@link OCFile} hold
*/
- public OCFile getFile();
+ public OCFile getFile() {
+ return mFile;
+ }
+ protected void setFile(OCFile file) {
+ mFile = file;
+ }
+
/**
* Interface to implement by any Activity that includes some instance of FileFragment
*
*
* @param file File to show details
*/
- public void showFragmentWithDetails(OCFile file);
-
-
+ public void showDetails(OCFile file);
+
}
}
+++ /dev/null
-/* ownCloud Android client application\r
- * Copyright (C) 2011 Bartek Przybylski\r
- * Copyright (C) 2012-2013 ownCloud Inc.\r
- *\r
- * This program is free software: you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License version 2,\r
- * as published by the Free Software Foundation.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program. If not, see <http://www.gnu.org/licenses/>.\r
- *\r
- */\r
-package com.owncloud.android.ui.fragment;\r
-\r
-import com.actionbarsherlock.app.SherlockFragment;\r
-import com.owncloud.android.ui.activity.LandingActivity;\r
-import com.owncloud.android.ui.adapter.LandingScreenAdapter;\r
-\r
-import android.os.Bundle;\r
-import android.view.LayoutInflater;\r
-import android.view.View;\r
-import android.view.ViewGroup;\r
-import android.widget.ListView;\r
-import com.owncloud.android.R;\r
-\r
-/**\r
- * Used on the Landing page to display what Components of the ownCloud there\r
- * are. Like Files, Music, Contacts, etc.\r
- * \r
- * @author Lennart Rosam\r
- * \r
- */\r
-public class LandingPageFragment extends SherlockFragment {\r
-\r
- @Override\r
- public View onCreateView(LayoutInflater inflater, ViewGroup container,\r
- Bundle savedInstanceState) {\r
- View root = inflater.inflate(R.layout.landing_page_fragment, container);\r
- return root;\r
- }\r
-\r
- @Override\r
- public void onActivityCreated(Bundle savedInstanceState) {\r
- super.onActivityCreated(savedInstanceState);\r
-\r
- ListView landingScreenItems = (ListView) getView().findViewById(\r
- R.id.homeScreenList);\r
- landingScreenItems.setAdapter(new LandingScreenAdapter(getActivity()));\r
- landingScreenItems\r
- .setOnItemClickListener((LandingActivity) getActivity());\r
- }\r
-\r
-}\r
import java.io.File;
-import com.owncloud.android.ui.FragmentListView;
+import com.owncloud.android.R;
import com.owncloud.android.ui.adapter.LocalFileListAdapter;
+import com.owncloud.android.utils.Log_OC;
+
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
-import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.ListView;
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.R;
/**
* A Fragment that lists all files and folders in a given LOCAL path.
* @author David A. Velasco
*
*/
-public class LocalFileListFragment extends FragmentListView {
+public class LocalFileListFragment extends ExtendedListFragment {
private static final String TAG = "LocalFileListFragment";
- private static final String SAVED_LIST_POSITION = "LIST_POSITION";
/** Reference to the Activity which this fragment is attached to. For callbacks */
private LocalFileListFragment.ContainerActivity mContainerActivity;
mAdapter = new LocalFileListAdapter(mContainerActivity.getInitialDirectory(), getActivity());
setListAdapter(mAdapter);
- if (savedInstanceState != null) {
- Log_OC.i(TAG, "savedInstanceState is not null");
- int position = savedInstanceState.getInt(SAVED_LIST_POSITION);
- setReferencePosition(position);
- }
-
Log_OC.i(TAG, "onActivityCreated() stop");
}
- @Override
- public void onSaveInstanceState(Bundle savedInstanceState) {
- Log_OC.i(TAG, "onSaveInstanceState() start");
-
- savedInstanceState.putInt(SAVED_LIST_POSITION, getReferencePosition());
-
-
- Log_OC.i(TAG, "onSaveInstanceState() stop");
- }
-
-
/**
* Checks the file clicked over. Browses inside if it is a directory. Notifies the container activity in any case.
*/
import java.util.ArrayList;
import java.util.List;
-import com.owncloud.android.AccountUtils;
-import com.owncloud.android.Log_OC;
import com.owncloud.android.R;
-import com.owncloud.android.datamodel.DataStorageManager;
+import com.owncloud.android.authentication.AccountUtils;
+import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
-import com.owncloud.android.network.OwnCloudClientUtils;
-import com.owncloud.android.operations.OnRemoteOperationListener;
-import com.owncloud.android.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.operations.RemoveFileOperation;
import com.owncloud.android.operations.RenameFileOperation;
import com.owncloud.android.operations.SynchronizeFileOperation;
-import com.owncloud.android.ui.FragmentListView;
import com.owncloud.android.ui.activity.FileDisplayActivity;
import com.owncloud.android.ui.activity.TransferServiceGetter;
import com.owncloud.android.ui.adapter.FileListListAdapter;
import com.owncloud.android.ui.dialog.EditNameDialog;
import com.owncloud.android.ui.dialog.EditNameDialog.EditNameDialogListener;
import com.owncloud.android.ui.fragment.ConfirmationDialogFragment.ConfirmationDialogFragmentListener;
-
-import eu.alefzero.webdav.WebdavClient;
-import eu.alefzero.webdav.WebdavUtils;
+import com.owncloud.android.ui.preview.PreviewImageFragment;
+import com.owncloud.android.ui.preview.PreviewMediaFragment;
+import com.owncloud.android.utils.Log_OC;
import android.accounts.Account;
import android.app.Activity;
-import android.content.ActivityNotFoundException;
-import android.content.Intent;
-import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
-import android.util.Log;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
-import android.webkit.MimeTypeMap;
import android.widget.AdapterView;
-import android.widget.Toast;
import android.widget.AdapterView.AdapterContextMenuInfo;
/**
* @author Bartek Przybylski
*
*/
-public class OCFileListFragment extends FragmentListView implements EditNameDialogListener, ConfirmationDialogFragmentListener {
- private static final String TAG = "FileListFragment";
- private static final String SAVED_LIST_POSITION = "LIST_POSITION";
+public class OCFileListFragment extends ExtendedListFragment implements EditNameDialogListener, ConfirmationDialogFragmentListener {
+
+ private static final String TAG = OCFileListFragment.class.getSimpleName();
+
+ private static final String MY_PACKAGE = OCFileListFragment.class.getPackage() != null ? OCFileListFragment.class.getPackage().getName() : "com.owncloud.android.ui.fragment";
+ private static final String EXTRA_FILE = MY_PACKAGE + ".extra.FILE";
private OCFileListFragment.ContainerActivity mContainerActivity;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
+ Log_OC.e(TAG, "onAttach");
try {
mContainerActivity = (ContainerActivity) activity;
} catch (ClassCastException e) {
*/
@Override
public void onActivityCreated(Bundle savedInstanceState) {
- Log_OC.i(TAG, "onActivityCreated() start");
-
super.onActivityCreated(savedInstanceState);
- mAdapter = new FileListListAdapter(mContainerActivity.getInitialDirectory(), mContainerActivity.getStorageManager(), getActivity(), mContainerActivity);
- setListAdapter(mAdapter);
-
+ Log_OC.e(TAG, "onActivityCreated() start");
+ mAdapter = new FileListListAdapter(getActivity(), mContainerActivity);
if (savedInstanceState != null) {
- Log_OC.i(TAG, "savedInstanceState is not null");
- int position = savedInstanceState.getInt(SAVED_LIST_POSITION);
- setReferencePosition(position);
+ mFile = savedInstanceState.getParcelable(EXTRA_FILE);
}
+ setListAdapter(mAdapter);
registerForContextMenu(getListView());
getListView().setOnCreateContextMenuListener(this);
mHandler = new Handler();
-
- Log_OC.i(TAG, "onActivityCreated() stop");
+
}
-
-
+ /**
+ * Saves the current listed folder.
+ */
@Override
- public void onSaveInstanceState(Bundle savedInstanceState) {
- Log_OC.i(TAG, "onSaveInstanceState() start");
+ public void onSaveInstanceState (Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putParcelable(EXTRA_FILE, mFile);
+ }
+
+
+ /**
+ * Call this, when the user presses the up button.
+ *
+ * Tries to move up the current folder one level. If the parent folder was removed from the database,
+ * it continues browsing up until finding an existing folders.
+ *
+ * return Count of folder levels browsed up.
+ */
+ public int onBrowseUp() {
+ OCFile parentDir = null;
+ int moveCount = 0;
- savedInstanceState.putInt(SAVED_LIST_POSITION, getReferencePosition());
+ if(mFile != null){
+ FileDataStorageManager storageManager = mContainerActivity.getStorageManager();
+
+ String parentPath = null;
+ if (mFile.getParentId() != FileDataStorageManager.ROOT_PARENT_ID) {
+ parentPath = new File(mFile.getRemotePath()).getParent();
+ parentPath = parentPath.endsWith(OCFile.PATH_SEPARATOR) ? parentPath : parentPath + OCFile.PATH_SEPARATOR;
+ parentDir = storageManager.getFileByPath(parentPath);
+ moveCount++;
+ } else {
+ parentDir = storageManager.getFileByPath(OCFile.ROOT_PATH); // never returns null; keep the path in root folder
+ }
+ while (parentDir == null) {
+ parentPath = new File(parentPath).getParent();
+ parentPath = parentPath.endsWith(OCFile.PATH_SEPARATOR) ? parentPath : parentPath + OCFile.PATH_SEPARATOR;
+ parentDir = storageManager.getFileByPath(parentPath);
+ moveCount++;
+ } // exit is granted because storageManager.getFileByPath("/") never returns null
+ mFile = parentDir;
+ }
- Log_OC.i(TAG, "onSaveInstanceState() stop");
+ if (mFile != null) {
+ listDirectory(mFile);
+
+ mContainerActivity.startSyncFolderOperation(mFile);
+ } // else - should never happen now
+
+ return moveCount;
}
-
@Override
public void onItemClick(AdapterView<?> l, View v, int position, long id) {
OCFile file = (OCFile) mAdapter.getItem(position);
if (file != null) {
- /// Click on a directory
- if (file.getMimetype().equals("DIR")) {
- // just local updates
- mFile = file;
+ if (file.isFolder()) {
+ // update state and view of this fragment
listDirectory(file);
- // any other updates are let to the container Activity
- mContainerActivity.onDirectoryClick(file);
-
- } else { /// Click on a file
- mContainerActivity.onFileClick(file);
+ // then, notify parent activity to let it update its state and view, and other fragments
+ mContainerActivity.onBrowsedDownTo(file);
+
+ } else { /// Click on a file
+ if (PreviewImageFragment.canBePreviewed(file)) {
+ // preview image - it handles the download, if needed
+ mContainerActivity.startImagePreview(file);
+
+ } else if (file.isDown()) {
+ if (PreviewMediaFragment.canBePreviewed(file)) {
+ // media preview
+ mContainerActivity.startMediaPreview(file, 0, true);
+ } else {
+ FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity();
+ activity.getFileOperationsHelper().openFile(file, activity);
+ }
+
+ } else {
+ // automatic download, preview on finish
+ mContainerActivity.startDownloadForPreview(file);
+ }
+
}
} else {
List<Integer> toDisable = new ArrayList<Integer>();
MenuItem item = null;
- if (targetFile.isDirectory()) {
+ if (targetFile.isFolder()) {
// contextual menu for folders
toHide.add(R.id.action_open_file_with);
toHide.add(R.id.action_download_file);
toHide.add(R.id.action_cancel_download);
toHide.add(R.id.action_cancel_upload);
+ toHide.add(R.id.action_sync_file);
toHide.add(R.id.action_see_details);
+ toHide.add(R.id.action_send_file);
if ( mContainerActivity.getFileDownloaderBinder().isDownloading(AccountUtils.getCurrentOwnCloudAccount(getActivity()), targetFile) ||
mContainerActivity.getFileUploaderBinder().isUploading(AccountUtils.getCurrentOwnCloudAccount(getActivity()), targetFile) ) {
toDisable.add(R.id.action_rename_file);
} else {
// contextual menu for regular files
+
+ // new design: 'download' and 'open with' won't be available anymore in context menu
+ toHide.add(R.id.action_download_file);
+ toHide.add(R.id.action_open_file_with);
+
if (targetFile.isDown()) {
toHide.add(R.id.action_cancel_download);
toHide.add(R.id.action_cancel_upload);
- item = menu.findItem(R.id.action_download_file);
- if (item != null) {
- item.setTitle(R.string.filedetails_sync_file);
- }
+
} else {
- toHide.add(R.id.action_open_file_with);
+ toHide.add(R.id.action_sync_file);
}
if ( mContainerActivity.getFileDownloaderBinder().isDownloading(AccountUtils.getCurrentOwnCloudAccount(getActivity()), targetFile)) {
- toHide.add(R.id.action_download_file);
toHide.add(R.id.action_cancel_upload);
- toDisable.add(R.id.action_open_file_with);
toDisable.add(R.id.action_rename_file);
toDisable.add(R.id.action_remove_file);
} else if ( mContainerActivity.getFileUploaderBinder().isUploading(AccountUtils.getCurrentOwnCloudAccount(getActivity()), targetFile)) {
- toHide.add(R.id.action_download_file);
toHide.add(R.id.action_cancel_download);
- toDisable.add(R.id.action_open_file_with);
toDisable.add(R.id.action_rename_file);
toDisable.add(R.id.action_remove_file);
toHide.add(R.id.action_cancel_upload);
}
}
+
+ // Options shareLink
+ if (!targetFile.isShareByLink()) {
+ toHide.add(R.id.action_unshare_file);
+ }
+ // Send file
+ boolean sendEnabled = getString(R.string.send_files_to_other_apps).equalsIgnoreCase("on");
+ if (!sendEnabled) {
+ toHide.add(R.id.action_send_file);
+ }
+
for (int i : toHide) {
item = menu.findItem(i);
if (item != null) {
public boolean onContextItemSelected (MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
mTargetFile = (OCFile) mAdapter.getItem(info.position);
- switch (item.getItemId()) {
+ switch (item.getItemId()) {
+ case R.id.action_share_file: {
+ FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity();
+ activity.getFileOperationsHelper().shareFileWithLink(mTargetFile, activity);
+ return true;
+ }
+ case R.id.action_unshare_file: {
+ FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity();
+ activity.getFileOperationsHelper().unshareFileWithLink(mTargetFile, activity);
+ return true;
+ }
case R.id.action_rename_file: {
String fileName = mTargetFile.getFileName();
- int extensionStart = mTargetFile.isDirectory() ? -1 : fileName.lastIndexOf(".");
+ int extensionStart = mTargetFile.isFolder() ? -1 : fileName.lastIndexOf(".");
int selectionEnd = (extensionStart >= 0) ? extensionStart : fileName.length();
EditNameDialog dialog = EditNameDialog.newInstance(getString(R.string.rename_dialog_title), fileName, 0, selectionEnd, this);
dialog.show(getFragmentManager(), EditNameDialog.TAG);
int messageStringId = R.string.confirmation_remove_alert;
int posBtnStringId = R.string.confirmation_remove_remote;
int neuBtnStringId = -1;
- if (mTargetFile.isDirectory()) {
+ if (mTargetFile.isFolder()) {
messageStringId = R.string.confirmation_remove_folder_alert;
posBtnStringId = R.string.confirmation_remove_remote_and_local;
neuBtnStringId = R.string.confirmation_remove_folder_local;
confDialog.show(getFragmentManager(), FileDetailFragment.FTAG_CONFIRMATION);
return true;
}
- case R.id.action_open_file_with: {
- String storagePath = mTargetFile.getStoragePath();
- String encodedStoragePath = WebdavUtils.encodePath(storagePath);
- try {
- Intent i = new Intent(Intent.ACTION_VIEW);
- i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), mTargetFile.getMimetype());
- i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
- startActivity(i);
-
- } catch (Throwable t) {
- Log_OC.e(TAG, "Fail when trying to open with the mimeType provided from the ownCloud server: " + mTargetFile.getMimetype());
- boolean toastIt = true;
- String mimeType = "";
- try {
- Intent i = new Intent(Intent.ACTION_VIEW);
- mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(storagePath.substring(storagePath.lastIndexOf('.') + 1));
- if (mimeType == null || !mimeType.equals(mTargetFile.getMimetype())) {
- if (mimeType != null) {
- i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), mimeType);
- } else {
- // desperate try
- i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), "*/*");
- }
- i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
- startActivity(i);
- toastIt = false;
- }
-
- } catch (IndexOutOfBoundsException e) {
- Log_OC.e(TAG, "Trying to find out MIME type of a file without extension: " + storagePath);
-
- } catch (ActivityNotFoundException e) {
- Log_OC.e(TAG, "No activity found to handle: " + storagePath + " with MIME type " + mimeType + " obtained from extension");
-
- } catch (Throwable th) {
- Log_OC.e(TAG, "Unexpected problem when opening: " + storagePath, th);
-
- } finally {
- if (toastIt) {
- Toast.makeText(getActivity(), "There is no application to handle file " + mTargetFile.getFileName(), Toast.LENGTH_SHORT).show();
- }
- }
-
- }
- return true;
- }
- case R.id.action_download_file: {
+ case R.id.action_sync_file: {
Account account = AccountUtils.getCurrentOwnCloudAccount(getSherlockActivity());
- RemoteOperation operation = new SynchronizeFileOperation(mTargetFile, null, mContainerActivity.getStorageManager(), account, true, false, getSherlockActivity());
- WebdavClient wc = OwnCloudClientUtils.createOwnCloudClient(account, getSherlockActivity().getApplicationContext());
- operation.execute(wc, mContainerActivity, mHandler);
- getSherlockActivity().showDialog(FileDisplayActivity.DIALOG_SHORT_WAIT);
+ RemoteOperation operation = new SynchronizeFileOperation(mTargetFile, null, mContainerActivity.getStorageManager(), account, true, getSherlockActivity());
+ operation.execute(account, getSherlockActivity(), mContainerActivity, mHandler, getSherlockActivity());
+ ((FileDisplayActivity) getSherlockActivity()).showLoadingDialog();
return true;
}
case R.id.action_cancel_download: {
return true;
}
case R.id.action_see_details: {
- ((FileFragment.ContainerActivity)getActivity()).showFragmentWithDetails(mTargetFile);
+ ((FileFragment.ContainerActivity)getActivity()).showDetails(mTargetFile);
+ return true;
+ }
+ case R.id.action_send_file: {
+ // Obtain the file
+ if (!mTargetFile.isDown()) { // Download the file
+ Log_OC.d(TAG, mTargetFile.getRemotePath() + " : File must be downloaded");
+ mContainerActivity.startDownloadForSending(mTargetFile);
+
+ } else {
+
+ FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity();
+ activity.getFileOperationsHelper().sendDownloadedFile(mTargetFile, activity);
+ }
return true;
}
default:
return super.onContextItemSelected(item);
}
}
-
- /**
- * Call this, when the user presses the up button
- */
- public void onNavigateUp() {
- OCFile parentDir = null;
-
- if(mFile != null){
- DataStorageManager storageManager = mContainerActivity.getStorageManager();
- parentDir = storageManager.getFileById(mFile.getParentId());
- mFile = parentDir;
- }
- listDirectory(parentDir);
- }
/**
* Use this to query the {@link OCFile} that is currently
* @param directory File to be listed
*/
public void listDirectory(OCFile directory) {
- DataStorageManager storageManager = mContainerActivity.getStorageManager();
+ FileDataStorageManager storageManager = mContainerActivity.getStorageManager();
if (storageManager != null) {
// Check input parameters for null
// If that's not a directory -> List its parent
- if(!directory.isDirectory()){
+ if(!directory.isFolder()){
Log_OC.w(TAG, "You see, that is not a directory -> " + directory.toString());
directory = storageManager.getFileById(directory.getParentId());
}
public interface ContainerActivity extends TransferServiceGetter, OnRemoteOperationListener {
/**
- * Callback method invoked when a directory is clicked by the user on the files list
+ * Callback method invoked when a the user browsed into a different folder through the list of files
*
* @param file
*/
- public void onDirectoryClick(OCFile file);
+ public void onBrowsedDownTo(OCFile folder);
+
+ public void startDownloadForPreview(OCFile file);
+
+ public void startMediaPreview(OCFile file, int i, boolean b);
+
+ public void startImagePreview(OCFile file);
- /**
- * Callback method invoked when a file (non directory) is clicked by the user on the files list
- *
- * @param file
- */
- public void onFileClick(OCFile file);
+ public void startSyncFolderOperation(OCFile folder);
/**
* Getter for the current DataStorageManager in the container activity
*/
- public DataStorageManager getStorageManager();
-
-
- /**
- * Callback method invoked when the parent activity is fully created to get the directory to list firstly.
- *
- * @return Directory to list firstly. Can be NULL.
- */
- public OCFile getInitialDirectory();
+ public FileDataStorageManager getStorageManager();
/**
* @param uploading Flag signaling if the file is now uploading.
*/
public void onTransferStateChanged(OCFile file, boolean downloading, boolean uploading);
+
+ void startDownloadForSending(OCFile file);
}
AccountUtils.getCurrentOwnCloudAccount(getActivity()),
newFilename,
mContainerActivity.getStorageManager());
- WebdavClient wc = OwnCloudClientUtils.createOwnCloudClient(AccountUtils.getCurrentOwnCloudAccount(getSherlockActivity()), getSherlockActivity().getApplicationContext());
- operation.execute(wc, mContainerActivity, mHandler);
- getActivity().showDialog(FileDisplayActivity.DIALOG_SHORT_WAIT);
+ operation.execute(AccountUtils.getCurrentOwnCloudAccount(getSherlockActivity()), getSherlockActivity(), mContainerActivity, mHandler, getSherlockActivity());
+ ((FileDisplayActivity) getActivity()).showLoadingDialog();
}
}
RemoteOperation operation = new RemoveFileOperation( mTargetFile,
true,
mContainerActivity.getStorageManager());
- WebdavClient wc = OwnCloudClientUtils.createOwnCloudClient(AccountUtils.getCurrentOwnCloudAccount(getSherlockActivity()), getSherlockActivity().getApplicationContext());
- operation.execute(wc, mContainerActivity, mHandler);
+ operation.execute(AccountUtils.getCurrentOwnCloudAccount(getSherlockActivity()), getSherlockActivity(), mContainerActivity, mHandler, getSherlockActivity());
- getActivity().showDialog(FileDisplayActivity.DIALOG_SHORT_WAIT);
+ ((FileDisplayActivity) getActivity()).showLoadingDialog();
}
}
}
@Override
public void onNeutral(String callerTag) {
- File f = null;
- if (mTargetFile.isDirectory()) {
- // TODO run in a secondary thread?
- mContainerActivity.getStorageManager().removeDirectory(mTargetFile, false, true);
-
- } else if (mTargetFile.isDown() && (f = new File(mTargetFile.getStoragePath())).exists()) {
- f.delete();
- mTargetFile.setStoragePath(null);
- mContainerActivity.getStorageManager().saveFile(mTargetFile);
- }
+ mContainerActivity.getStorageManager().removeFile(mTargetFile, false, true); // TODO perform in background task / new thread
listDirectory();
mContainerActivity.onTransferStateChanged(mTargetFile, false, false);
}
* Copyright (C) 2012-2013 ownCloud Inc.
*
* 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.
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
import java.lang.ref.WeakReference;
+import com.owncloud.android.R;
+import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
+import com.owncloud.android.ui.fragment.FileFragment;
+import com.owncloud.android.utils.Log_OC;
+
import android.accounts.Account;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.FragmentStatePagerAdapter;
-import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
-import android.widget.Button;
+import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.TextView;
-import com.actionbarsherlock.app.SherlockFragment;
-import com.owncloud.android.datamodel.FileDataStorageManager;
-import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
-import com.owncloud.android.ui.fragment.FileFragment;
-
-import com.owncloud.android.R;
+import com.owncloud.android.lib.common.network.OnDatatransferProgressListener;
-import eu.alefzero.webdav.OnDatatransferProgressListener;
/**
* This Fragment is used to monitor the progress of a file downloading.
*
* @author David A. Velasco
*/
-public class FileDownloadFragment extends SherlockFragment implements OnClickListener, FileFragment {
+public class FileDownloadFragment extends FileFragment implements OnClickListener {
public static final String EXTRA_FILE = "FILE";
public static final String EXTRA_ACCOUNT = "ACCOUNT";
private FileFragment.ContainerActivity mContainerActivity;
private View mView;
- private OCFile mFile;
private Account mAccount;
- private FileDataStorageManager mStorageManager;
public ProgressListener mProgressListener;
private boolean mListening;
* It's necessary to keep a public constructor without parameters; the system uses it when tries to reinstantiate a fragment automatically.
*/
public FileDownloadFragment() {
- mFile = null;
+ super();
mAccount = null;
- mStorageManager = null;
mProgressListener = null;
mListening = false;
mIgnoreFirstSavedState = false;
* @param ignoreFirstSavedState Flag to work around an unexpected behaviour of {@link FragmentStatePagerAdapter}; TODO better solution
*/
public FileDownloadFragment(OCFile fileToDetail, Account ocAccount, boolean ignoreFirstSavedState) {
- mFile = fileToDetail;
+ super(fileToDetail);
mAccount = ocAccount;
- mStorageManager = null; // we need a context to init this; the container activity is not available yet at this moment
mProgressListener = null;
mListening = false;
mIgnoreFirstSavedState = ignoreFirstSavedState;
if (savedInstanceState != null) {
if (!mIgnoreFirstSavedState) {
- mFile = savedInstanceState.getParcelable(FileDownloadFragment.EXTRA_FILE);
+ setFile((OCFile)savedInstanceState.getParcelable(FileDownloadFragment.EXTRA_FILE));
mAccount = savedInstanceState.getParcelable(FileDownloadFragment.EXTRA_ACCOUNT);
mError = savedInstanceState.getBoolean(FileDownloadFragment.EXTRA_ERROR);
} else {
ProgressBar progressBar = (ProgressBar)mView.findViewById(R.id.progressBar);
mProgressListener = new ProgressListener(progressBar);
- ((Button)mView.findViewById(R.id.cancelBtn)).setOnClickListener(this);
+ ((ImageButton)mView.findViewById(R.id.cancelBtn)).setOnClickListener(this);
if (mError) {
setButtonsForRemote();
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (mAccount != null) {
- mStorageManager = new FileDataStorageManager(mAccount, getActivity().getApplicationContext().getContentResolver());;
+ //mStorageManager = new FileDataStorageManager(mAccount, getActivity().getApplicationContext().getContentResolver());;
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
- outState.putParcelable(FileDownloadFragment.EXTRA_FILE, mFile);
+ outState.putParcelable(FileDownloadFragment.EXTRA_FILE, getFile());
outState.putParcelable(FileDownloadFragment.EXTRA_ACCOUNT, mAccount);
outState.putBoolean(FileDownloadFragment.EXTRA_ERROR, mError);
}
switch (v.getId()) {
case R.id.cancelBtn: {
FileDownloaderBinder downloaderBinder = mContainerActivity.getFileDownloaderBinder();
- if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, mFile)) {
- downloaderBinder.cancel(mAccount, mFile);
+ if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, getFile())) {
+ downloaderBinder.cancel(mAccount, getFile());
getActivity().finish(); // :)
/*
leaveTransferProgress();
break;
}
default:
- Log.e(TAG, "Incorrect view clicked!");
+ Log_OC.e(TAG, "Incorrect view clicked!");
}
}
/**
- * {@inheritDoc}
- */
- public OCFile getFile(){
- return mFile;
- }
-
-
- /**
* Updates the view depending upon the state of the downloading file.
*
* @param transferring When true, the view must be updated assuming that the holded file is
public void updateView(boolean transferring) {
// configure UI for depending upon local state of the file
FileDownloaderBinder downloaderBinder = (mContainerActivity == null) ? null : mContainerActivity.getFileDownloaderBinder();
- if (transferring || (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, mFile))) {
+ if (transferring || (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, getFile()))) {
setButtonsForTransferring();
- } else if (mFile.isDown()) {
+ } else if (getFile().isDown()) {
setButtonsForDown();
public void listenForTransferProgress() {
if (mProgressListener != null && !mListening) {
if (mContainerActivity.getFileDownloaderBinder() != null) {
- mContainerActivity.getFileDownloaderBinder().addDatatransferProgressListener(mProgressListener, mAccount, mFile);
+ mContainerActivity.getFileDownloaderBinder().addDatatransferProgressListener(mProgressListener, mAccount, getFile());
mListening = true;
setButtonsForTransferring();
}
public void leaveTransferProgress() {
if (mProgressListener != null) {
if (mContainerActivity.getFileDownloaderBinder() != null) {
- mContainerActivity.getFileDownloaderBinder().removeDatatransferProgressListener(mProgressListener, mAccount, mFile);
+ mContainerActivity.getFileDownloaderBinder().removeDatatransferProgressListener(mProgressListener, mAccount, getFile());
mListening = false;
}
}
}
@Override
- public void onTransferProgress(long progressRate) {
- // old method, nothing here
- };
-
- @Override
public void onTransferProgress(long progressRate, long totalTransferredSoFar, long totalToTransfer, String filename) {
int percent = (int)(100.0*((double)totalTransferredSoFar)/((double)totalToTransfer));
if (percent != mLastPercent) {
*/
package com.owncloud.android.ui.preview;
-import org.apache.commons.httpclient.methods.PostMethod;
-
-import android.accounts.Account;
-import android.app.Dialog;
-import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
+import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.IBinder;
+import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
-import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import com.actionbarsherlock.app.ActionBar;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.view.Window;
-import com.owncloud.android.datamodel.DataStorageManager;
+import com.owncloud.android.R;
+import com.owncloud.android.authentication.AccountUtils;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.files.services.FileDownloader;
-import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
import com.owncloud.android.files.services.FileUploader;
+import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
-import com.owncloud.android.ui.activity.FileDetailActivity;
-import com.owncloud.android.ui.fragment.FileDetailFragment;
+import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.operations.CreateShareOperation;
+import com.owncloud.android.operations.UnshareLinkOperation;
+import com.owncloud.android.ui.activity.FileActivity;
+import com.owncloud.android.ui.activity.FileDisplayActivity;
+import com.owncloud.android.ui.activity.PinCodeActivity;
+import com.owncloud.android.ui.dialog.LoadingDialog;
import com.owncloud.android.ui.fragment.FileFragment;
+import com.owncloud.android.utils.DisplayUtils;
+import com.owncloud.android.utils.Log_OC;
-import com.owncloud.android.AccountUtils;
-import com.owncloud.android.R;
/**
- * Used as an utility to preview image files contained in an ownCloud account.
+ * Holds a swiping galley where image files contained in an ownCloud directory are shown
*
* @author David A. Velasco
*/
-public class PreviewImageActivity extends SherlockFragmentActivity implements FileFragment.ContainerActivity, ViewPager.OnPageChangeListener, OnTouchListener {
+public class PreviewImageActivity extends FileActivity implements FileFragment.ContainerActivity, ViewPager.OnPageChangeListener, OnTouchListener , OnRemoteOperationListener{
public static final int DIALOG_SHORT_WAIT = 0;
public static final String KEY_WAITING_TO_PREVIEW = "WAITING_TO_PREVIEW";
private static final String KEY_WAITING_FOR_BINDER = "WAITING_FOR_BINDER";
- private OCFile mFile;
- private OCFile mParentFolder;
- private Account mAccount;
- private DataStorageManager mStorageManager;
+ private static final String DIALOG_WAIT_TAG = "DIALOG_WAIT";
private ViewPager mViewPager;
private PreviewImagePagerAdapter mPreviewImagePagerAdapter;
private boolean mFullScreen;
-
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- mFile = getIntent().getParcelableExtra(FileDetailFragment.EXTRA_FILE);
- mAccount = getIntent().getParcelableExtra(FileDetailFragment.EXTRA_ACCOUNT);
- if (mFile == null) {
- throw new IllegalStateException("Instanced with a NULL OCFile");
- }
- if (mAccount == null) {
- throw new IllegalStateException("Instanced with a NULL ownCloud Account");
- }
- if (!mFile.isImage()) {
- throw new IllegalArgumentException("Non-image file passed as argument");
- }
requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
setContentView(R.layout.preview_image_activity);
-
+
ActionBar actionBar = getSupportActionBar();
+ actionBar.setIcon(DisplayUtils.getSeasonalIconId());
actionBar.setDisplayHomeAsUpEnabled(true);
- actionBar.setTitle(mFile.getFileName());
actionBar.hide();
- mFullScreen = true;
+ // PIN CODE request
+ if (getIntent().getExtras() != null && savedInstanceState == null && fromNotification()) {
+ requestPinCode();
+ }
- mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());
- mParentFolder = mStorageManager.getFileById(mFile.getParentId());
- if (mParentFolder == null) {
- // should not be necessary
- mParentFolder = mStorageManager.getFileByPath(OCFile.PATH_SEPARATOR);
- }
-
+ mFullScreen = true;
if (savedInstanceState != null) {
mRequestWaitingForBinder = savedInstanceState.getBoolean(KEY_WAITING_FOR_BINDER);
} else {
mRequestWaitingForBinder = false;
}
- createViewPager();
-
}
- private void createViewPager() {
- mPreviewImagePagerAdapter = new PreviewImagePagerAdapter(getSupportFragmentManager(), mParentFolder, mAccount, mStorageManager);
+ private void initViewPager() {
+ // get parent from path
+ String parentPath = getFile().getRemotePath().substring(0, getFile().getRemotePath().lastIndexOf(getFile().getFileName()));
+ OCFile parentFolder = getStorageManager().getFileByPath(parentPath);
+ if (parentFolder == null) {
+ // should not be necessary
+ parentFolder = getStorageManager().getFileByPath(OCFile.ROOT_PATH);
+ }
+ mPreviewImagePagerAdapter = new PreviewImagePagerAdapter(getSupportFragmentManager(), parentFolder, getAccount(), getStorageManager());
mViewPager = (ViewPager) findViewById(R.id.fragmentPager);
- int position = mPreviewImagePagerAdapter.getFilePosition(mFile);
+ int position = mPreviewImagePagerAdapter.getFilePosition(getFile());
position = (position >= 0) ? position : 0;
mViewPager.setAdapter(mPreviewImagePagerAdapter);
mViewPager.setOnPageChangeListener(this);
mViewPager.setCurrentItem(position);
- if (position == 0 && !mFile.isDown()) {
+ if (position == 0 && !getFile().isDown()) {
// this is necessary because mViewPager.setCurrentItem(0) just after setting the adapter does not result in a call to #onPageSelected(0)
mRequestWaitingForBinder = true;
}
outState.putBoolean(KEY_WAITING_FOR_BINDER, mRequestWaitingForBinder);
}
-
+ @Override
+ public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) {
+ super.onRemoteOperationFinish(operation, result);
+
+ if (operation instanceof CreateShareOperation) {
+ onCreateShareOperationFinish((CreateShareOperation) operation, result);
+
+ } else if (operation instanceof UnshareLinkOperation) {
+ onUnshareLinkOperationFinish((UnshareLinkOperation) operation, result);
+
+ }
+ }
+
+
+ private void onUnshareLinkOperationFinish(UnshareLinkOperation operation, RemoteOperationResult result) {
+ if (result.isSuccess()) {
+ OCFile file = getStorageManager().getFileByPath(getFile().getRemotePath());
+ if (file != null) {
+ setFile(file);
+ }
+ invalidateOptionsMenu();
+ } else if (result.getCode() == ResultCode.SHARE_NOT_FOUND) {
+ backToDisplayActivity();
+ }
+
+ }
+
+ private void onCreateShareOperationFinish(CreateShareOperation operation, RemoteOperationResult result) {
+ if (result.isSuccess()) {
+ OCFile file = getStorageManager().getFileByPath(getFile().getRemotePath());
+ if (file != null) {
+ setFile(file);
+ }
+ invalidateOptionsMenu();
+ }
+ }
+
/** Defines callbacks for service binding, passed to bindService() */
private class PreviewImageServiceConnection implements ServiceConnection {
mDownloaderBinder = (FileDownloaderBinder) service;
if (mRequestWaitingForBinder) {
mRequestWaitingForBinder = false;
- Log.d(TAG, "Simulating reselection of current page after connection of download binder");
+ Log_OC.d(TAG, "Simulating reselection of current page after connection of download binder");
onPageSelected(mViewPager.getCurrentItem());
}
-
+
} else if (component.equals(new ComponentName(PreviewImageActivity.this, FileUploader.class))) {
- Log.d(TAG, "Upload service connected");
+ Log_OC.d(TAG, "Upload service connected");
mUploaderBinder = (FileUploaderBinder) service;
} else {
return;
@Override
public void onServiceDisconnected(ComponentName component) {
if (component.equals(new ComponentName(PreviewImageActivity.this, FileDownloader.class))) {
- Log.d(TAG, "Download service suddenly disconnected");
+ Log_OC.d(TAG, "Download service suddenly disconnected");
mDownloaderBinder = null;
} else if (component.equals(new ComponentName(PreviewImageActivity.this, FileUploader.class))) {
- Log.d(TAG, "Upload service suddenly disconnected");
+ Log_OC.d(TAG, "Upload service suddenly disconnected");
mUploaderBinder = null;
}
}
super.onDestroy();
}
-
@Override
public boolean onOptionsItemSelected(MenuItem item) {
boolean returnValue = false;
super.onResume();
//Log.e(TAG, "ACTIVITY, ONRESUME");
mDownloadFinishReceiver = new DownloadFinishReceiver();
- IntentFilter filter = new IntentFilter(FileDownloader.DOWNLOAD_FINISH_MESSAGE);
- filter.addAction(FileDownloader.DOWNLOAD_ADDED_MESSAGE);
+
+ IntentFilter filter = new IntentFilter(FileDownloader.getDownloadFinishMessage());
+ filter.addAction(FileDownloader.getDownloadAddedMessage());
registerReceiver(mDownloadFinishReceiver, filter);
}
private void backToDisplayActivity() {
- /*
- Intent intent = new Intent(this, FileDisplayActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- intent.putExtra(FileDetailFragment.EXTRA_FILE, mFile);
- intent.putExtra(FileDetailFragment.EXTRA_ACCOUNT, mAccount);
- startActivity(intent);
- */
finish();
}
+ /**
+ * Show loading dialog
+ */
+ public void showLoadingDialog() {
+ // Construct dialog
+ LoadingDialog loading = new LoadingDialog(getResources().getString(R.string.wait_a_moment));
+ FragmentManager fm = getSupportFragmentManager();
+ FragmentTransaction ft = fm.beginTransaction();
+ loading.show(ft, DIALOG_WAIT_TAG);
+
+ }
- @Override
- protected Dialog onCreateDialog(int id) {
- Dialog dialog = null;
- switch (id) {
- case DIALOG_SHORT_WAIT: {
- ProgressDialog working_dialog = new ProgressDialog(this);
- working_dialog.setMessage(getResources().getString(
- R.string.wait_a_moment));
- working_dialog.setIndeterminate(true);
- working_dialog.setCancelable(false);
- dialog = working_dialog;
- break;
- }
- default:
- dialog = null;
+ /**
+ * Dismiss loading dialog
+ */
+ public void dismissLoadingDialog(){
+ Fragment frag = getSupportFragmentManager().findFragmentByTag(DIALOG_WAIT_TAG);
+ if (frag != null) {
+ LoadingDialog loading = (LoadingDialog) frag;
+ loading.dismiss();
}
- return dialog;
}
-
/**
* {@inheritDoc}
*/
@Override
- public void showFragmentWithDetails(OCFile file) {
- Intent showDetailsIntent = new Intent(this, FileDetailActivity.class);
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_FILE, file);
- showDetailsIntent.putExtra(FileDetailFragment.EXTRA_ACCOUNT, AccountUtils.getCurrentOwnCloudAccount(this));
- showDetailsIntent.putExtra(FileDetailActivity.EXTRA_MODE, FileDetailActivity.MODE_DETAILS);
+ public void showDetails(OCFile file) {
+ Intent showDetailsIntent = new Intent(this, FileDisplayActivity.class);
+ showDetailsIntent.setAction(FileDisplayActivity.ACTION_DETAILS);
+ showDetailsIntent.putExtra(FileActivity.EXTRA_FILE, file);
+ showDetailsIntent.putExtra(FileActivity.EXTRA_ACCOUNT, AccountUtils.getCurrentOwnCloudAccount(this));
startActivity(showDetailsIntent);
int pos = mPreviewImagePagerAdapter.getFilePosition(file);
file = mPreviewImagePagerAdapter.getFileAt(pos);
private void requestForDownload(OCFile file) {
if (mDownloaderBinder == null) {
- Log.d(TAG, "requestForDownload called without binder to download service");
+ Log_OC.d(TAG, "requestForDownload called without binder to download service");
- } else if (!mDownloaderBinder.isDownloading(mAccount, file)) {
+ } else if (!mDownloaderBinder.isDownloading(getAccount(), file)) {
Intent i = new Intent(this, FileDownloader.class);
- i.putExtra(FileDownloader.EXTRA_ACCOUNT, mAccount);
+ i.putExtra(FileDownloader.EXTRA_ACCOUNT, getAccount());
i.putExtra(FileDownloader.EXTRA_FILE, file);
startService(i);
}
public void onReceive(Context context, Intent intent) {
String accountName = intent.getStringExtra(FileDownloader.ACCOUNT_NAME);
String downloadedRemotePath = intent.getStringExtra(FileDownloader.EXTRA_REMOTE_PATH);
- if (mAccount.name.equals(accountName) &&
+ if (getAccount().name.equals(accountName) &&
downloadedRemotePath != null) {
- OCFile file = mStorageManager.getFileByPath(downloadedRemotePath);
+ OCFile file = getStorageManager().getFileByPath(downloadedRemotePath);
int position = mPreviewImagePagerAdapter.getFilePosition(file);
boolean downloadWasFine = intent.getBooleanExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, false);
//boolean isOffscreen = Math.abs((mViewPager.getCurrentItem() - position)) <= mViewPager.getOffscreenPageLimit();
- if (position >= 0 && intent.getAction().equals(FileDownloader.DOWNLOAD_FINISH_MESSAGE)) {
+ if (position >= 0 && intent.getAction().equals(FileDownloader.getDownloadFinishMessage())) {
if (downloadWasFine) {
mPreviewImagePagerAdapter.updateFile(position, file);
mPreviewImagePagerAdapter.notifyDataSetChanged(); // will trigger the creation of new fragments
} else {
- Log.d(TAG, "Download finished, but the fragment is offscreen");
+ Log_OC.d(TAG, "Download finished, but the fragment is offscreen");
}
}
}
mFullScreen = !mFullScreen;
}
+
+ @Override
+ protected void onAccountSet(boolean stateWasRecovered) {
+ super.onAccountSet(stateWasRecovered);
+ if (getAccount() != null) {
+ OCFile file = getFile();
+ /// Validate handled file (first image to preview)
+ if (file == null) {
+ throw new IllegalStateException("Instanced with a NULL OCFile");
+ }
+ if (!file.isImage()) {
+ throw new IllegalArgumentException("Non-image file passed as argument");
+ }
+
+ // Update file according to DB file, if it is possible
+ if (file.getFileId() > FileDataStorageManager.ROOT_PARENT_ID)
+ file = getStorageManager().getFileById(file.getFileId());
+
+ if (file != null) {
+ /// Refresh the activity according to the Account and OCFile set
+ setFile(file); // reset after getting it fresh from storageManager
+ getSupportActionBar().setTitle(getFile().getFileName());
+ //if (!stateWasRecovered) {
+ initViewPager();
+ //}
+
+ } else {
+ // handled file not in the current Account
+ finish();
+ }
+ }
+ }
+ /**
+ * Launch an intent to request the PIN code to the user before letting him use the app
+ */
+ private void requestPinCode() {
+ boolean pinStart = false;
+ SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
+ pinStart = appPrefs.getBoolean("set_pincode", false);
+ if (pinStart) {
+ Intent i = new Intent(getApplicationContext(), PinCodeActivity.class);
+ i.putExtra(PinCodeActivity.EXTRA_ACTIVITY, "PreviewImageActivity");
+ startActivity(i);
+ }
+ }
+
}
*/
package com.owncloud.android.ui.preview;
-import java.io.File;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.FragmentStatePagerAdapter;
-import android.util.Log;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
-import com.actionbarsherlock.app.SherlockFragment;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
+import com.owncloud.android.R;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.network.OwnCloudClientUtils;
-import com.owncloud.android.operations.OnRemoteOperationListener;
-import com.owncloud.android.operations.RemoteOperation;
-import com.owncloud.android.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.network.WebdavUtils;
+import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.operations.RemoveFileOperation;
+import com.owncloud.android.ui.activity.FileActivity;
import com.owncloud.android.ui.fragment.ConfirmationDialogFragment;
import com.owncloud.android.ui.fragment.FileFragment;
-
-import com.owncloud.android.R;
-import eu.alefzero.webdav.WebdavClient;
-import eu.alefzero.webdav.WebdavUtils;
+import com.owncloud.android.utils.Log_OC;
/**
*
* @author David A. Velasco
*/
-public class PreviewImageFragment extends SherlockFragment implements FileFragment,
- OnRemoteOperationListener,
+public class PreviewImageFragment extends FileFragment implements OnRemoteOperationListener,
ConfirmationDialogFragment.ConfirmationDialogFragmentListener {
public static final String EXTRA_FILE = "FILE";
public static final String EXTRA_ACCOUNT = "ACCOUNT";
private View mView;
- private OCFile mFile;
private Account mAccount;
private FileDataStorageManager mStorageManager;
private ImageView mImageView;
* @param ignoreFirstSavedState Flag to work around an unexpected behaviour of {@link FragmentStatePagerAdapter}; TODO better solution
*/
public PreviewImageFragment(OCFile fileToDetail, Account ocAccount, boolean ignoreFirstSavedState) {
- mFile = fileToDetail;
+ super(fileToDetail);
mAccount = ocAccount;
mStorageManager = null; // we need a context to init this; the container activity is not available yet at this moment
mIgnoreFirstSavedState = ignoreFirstSavedState;
* DO NOT CALL IT: an {@link OCFile} and {@link Account} must be provided for a successful construction
*/
public PreviewImageFragment() {
- mFile = null;
+ super();
mAccount = null;
mStorageManager = null;
mIgnoreFirstSavedState = false;
mStorageManager = new FileDataStorageManager(mAccount, getActivity().getApplicationContext().getContentResolver());
if (savedInstanceState != null) {
if (!mIgnoreFirstSavedState) {
- mFile = savedInstanceState.getParcelable(PreviewImageFragment.EXTRA_FILE);
+ OCFile file = (OCFile)savedInstanceState.getParcelable(PreviewImageFragment.EXTRA_FILE);
mAccount = savedInstanceState.getParcelable(PreviewImageFragment.EXTRA_ACCOUNT);
+
+ // Update the file
+ if (mAccount!= null) {
+ mStorageManager = new FileDataStorageManager(mAccount, getActivity().getApplicationContext().getContentResolver());
+ OCFile updatedFile = mStorageManager.getFileByPath(file.getRemotePath());
+ if (updatedFile != null) {
+ setFile(updatedFile);
+ } else {
+ setFile(file);
+ }
+ } else {
+ setFile(file);
+ }
+
} else {
mIgnoreFirstSavedState = false;
}
}
- if (mFile == null) {
+ if (getFile() == null) {
throw new IllegalStateException("Instanced with a NULL OCFile");
}
if (mAccount == null) {
throw new IllegalStateException("Instanced with a NULL ownCloud Account");
}
- if (!mFile.isDown()) {
+ if (!getFile().isDown()) {
throw new IllegalStateException("There is no local file to preview");
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
- outState.putParcelable(PreviewImageFragment.EXTRA_FILE, mFile);
+ outState.putParcelable(PreviewImageFragment.EXTRA_FILE, getFile());
outState.putParcelable(PreviewImageFragment.EXTRA_ACCOUNT, mAccount);
}
@Override
public void onStart() {
super.onStart();
- if (mFile != null) {
+ if (getFile() != null) {
BitmapLoader bl = new BitmapLoader(mImageView, mMessageView, mProgressWheel);
- bl.execute(new String[]{mFile.getStoragePath()});
+ bl.execute(new String[]{getFile().getStoragePath()});
}
}
toHide.add(R.id.action_cancel_upload);
toHide.add(R.id.action_download_file);
toHide.add(R.id.action_rename_file); // by now
+
+ // Options shareLink
+ if (!getFile().isShareByLink()) {
+ toHide.add(R.id.action_unshare_file);
+ }
+ // Send file
+ boolean sendEnabled = getString(R.string.send_files_to_other_apps).equalsIgnoreCase("on");
+ if (!sendEnabled) {
+ toHide.add(R.id.action_send_file);
+ }
+
for (int i : toHide) {
item = menu.findItem(i);
if (item != null) {
}
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void onPrepareOptionsMenu(Menu menu) {
+ super.onPrepareOptionsMenu(menu);
+
+ MenuItem item = menu.findItem(R.id.action_unshare_file);
+ // Options shareLink
+ OCFile file = ((FileActivity) getSherlockActivity()).getFile();
+ if (!file.isShareByLink()) {
+ item.setVisible(false);
+ item.setEnabled(false);
+ } else {
+ item.setVisible(true);
+ item.setEnabled(true);
+ }
+
+ }
+
+
/**
* {@inheritDoc}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
+ case R.id.action_share_file: {
+ FileActivity act = (FileActivity)getSherlockActivity();
+ act.getFileOperationsHelper().shareFileWithLink(getFile(), act);
+ return true;
+ }
+ case R.id.action_unshare_file: {
+ FileActivity act = (FileActivity)getSherlockActivity();
+ act.getFileOperationsHelper().unshareFileWithLink(getFile(), act);
+ return true;
+ }
case R.id.action_open_file_with: {
openFile();
return true;
seeDetails();
return true;
}
+ case R.id.action_send_file: {
+ FileActivity act = (FileActivity)getSherlockActivity();
+ act.getFileOperationsHelper().sendDownloadedFile(getFile(), act);
+ return true;
+ }
default:
return false;
}
}
-
+
private void seeDetails() {
- ((FileFragment.ContainerActivity)getActivity()).showFragmentWithDetails(mFile);
+ ((FileFragment.ContainerActivity)getActivity()).showDetails(getFile());
}
@Override
public void onResume() {
super.onResume();
- //Log.e(TAG, "FRAGMENT, ONRESUME");
- /*
- mDownloadFinishReceiver = new DownloadFinishReceiver();
- IntentFilter filter = new IntentFilter(
- FileDownloader.DOWNLOAD_FINISH_MESSAGE);
- getActivity().registerReceiver(mDownloadFinishReceiver, filter);
-
- mUploadFinishReceiver = new UploadFinishReceiver();
- filter = new IntentFilter(FileUploader.UPLOAD_FINISH_MESSAGE);
- getActivity().registerReceiver(mUploadFinishReceiver, filter);
- */
-
}
@Override
public void onPause() {
super.onPause();
- /*
- if (mVideoPreview.getVisibility() == View.VISIBLE) {
- mSavedPlaybackPosition = mVideoPreview.getCurrentPosition();
- }*/
- /*
- getActivity().unregisterReceiver(mDownloadFinishReceiver);
- mDownloadFinishReceiver = null;
-
- getActivity().unregisterReceiver(mUploadFinishReceiver);
- mUploadFinishReceiver = null;
- */
}
* available apps for the MIME type known from the file extension, to let the user choose
*/
private void openFile() {
- String storagePath = mFile.getStoragePath();
+ OCFile file = getFile();
+ String storagePath = file.getStoragePath();
String encodedStoragePath = WebdavUtils.encodePath(storagePath);
try {
Intent i = new Intent(Intent.ACTION_VIEW);
- i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), mFile.getMimetype());
+ i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), file.getMimetype());
i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivity(i);
} catch (Throwable t) {
- Log.e(TAG, "Fail when trying to open with the mimeType provided from the ownCloud server: " + mFile.getMimetype());
+ Log_OC.e(TAG, "Fail when trying to open with the mimeType provided from the ownCloud server: " + file.getMimetype());
boolean toastIt = true;
String mimeType = "";
try {
Intent i = new Intent(Intent.ACTION_VIEW);
mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(storagePath.substring(storagePath.lastIndexOf('.') + 1));
- if (mimeType == null || !mimeType.equals(mFile.getMimetype())) {
+ if (mimeType == null || !mimeType.equals(file.getMimetype())) {
if (mimeType != null) {
i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), mimeType);
} else {
}
} catch (IndexOutOfBoundsException e) {
- Log.e(TAG, "Trying to find out MIME type of a file without extension: " + storagePath);
+ Log_OC.e(TAG, "Trying to find out MIME type of a file without extension: " + storagePath);
} catch (ActivityNotFoundException e) {
- Log.e(TAG, "No activity found to handle: " + storagePath + " with MIME type " + mimeType + " obtained from extension");
+ Log_OC.e(TAG, "No activity found to handle: " + storagePath + " with MIME type " + mimeType + " obtained from extension");
} catch (Throwable th) {
- Log.e(TAG, "Unexpected problem when opening: " + storagePath, th);
+ Log_OC.e(TAG, "Unexpected problem when opening: " + storagePath, th);
} finally {
if (toastIt) {
- Toast.makeText(getActivity(), "There is no application to handle file " + mFile.getFileName(), Toast.LENGTH_SHORT).show();
+ Toast.makeText(getActivity(), "There is no application to handle file " + file.getFileName(), Toast.LENGTH_SHORT).show();
}
}
private void removeFile() {
ConfirmationDialogFragment confDialog = ConfirmationDialogFragment.newInstance(
R.string.confirmation_remove_alert,
- new String[]{mFile.getFileName()},
+ new String[]{getFile().getFileName()},
R.string.confirmation_remove_remote_and_local,
R.string.confirmation_remove_local,
R.string.common_cancel);
*/
@Override
public void onConfirmation(String callerTag) {
- if (mStorageManager.getFileById(mFile.getFileId()) != null) { // check that the file is still there;
- mLastRemoteOperation = new RemoveFileOperation( mFile, // TODO we need to review the interface with RemoteOperations, and use OCFile IDs instead of OCFile objects as parameters
+ if (mStorageManager.getFileById(getFile().getFileId()) != null) { // check that the file is still there;
+ mLastRemoteOperation = new RemoveFileOperation( getFile(), // TODO we need to review the interface with RemoteOperations, and use OCFile IDs instead of OCFile objects as parameters
true,
mStorageManager);
- WebdavClient wc = OwnCloudClientUtils.createOwnCloudClient(mAccount, getSherlockActivity().getApplicationContext());
- mLastRemoteOperation.execute(wc, this, mHandler);
+ mLastRemoteOperation.execute(mAccount, getSherlockActivity(), this, mHandler, getSherlockActivity());
- getActivity().showDialog(PreviewImageActivity.DIALOG_SHORT_WAIT);
+ ((PreviewImageActivity) getActivity()).showLoadingDialog();
}
}
*/
@Override
public void onNeutral(String callerTag) {
- // TODO this code should be made in a secondary thread,
- if (mFile.isDown()) { // checks it is still there
- File f = new File(mFile.getStoragePath());
- f.delete();
- mFile.setStoragePath(null);
- mStorageManager.saveFile(mFile);
- finish();
- }
+ OCFile file = getFile();
+ mStorageManager.removeFile(file, false, true); // TODO perform in background task / new thread
+ finish();
}
/**
}
- /**
- * {@inheritDoc}
- */
- public OCFile getFile(){
- return mFile;
- }
-
- /*
- /**
- * Use this method to signal this Activity that it shall update its view.
- *
- * @param file : An {@link OCFile}
- *-/
- public void updateFileDetails(OCFile file, Account ocAccount) {
- mFile = file;
- if (ocAccount != null && (
- mStorageManager == null ||
- (mAccount != null && !mAccount.equals(ocAccount))
- )) {
- mStorageManager = new FileDataStorageManager(ocAccount, getActivity().getApplicationContext().getContentResolver());
- }
- mAccount = ocAccount;
- updateFileDetails(false);
- }
- */
-
-
private class BitmapLoader extends AsyncTask<String, Void, Bitmap> {
/**
// really load the bitmap
options.inJustDecodeBounds = false; // the next decodeFile call will be real
result = BitmapFactory.decodeFile(storagePath, options);
- //Log.d(TAG, "Image loaded - width: " + options.outWidth + ", loaded height: " + options.outHeight);
+ //Log_OC.d(TAG, "Image loaded - width: " + options.outWidth + ", loaded height: " + options.outHeight);
if (result == null) {
mErrorMessageId = R.string.preview_image_error_unknown_format;
- Log.e(TAG, "File could not be loaded as a bitmap: " + storagePath);
+ Log_OC.e(TAG, "File could not be loaded as a bitmap: " + storagePath);
}
} catch (OutOfMemoryError e) {
mErrorMessageId = R.string.preview_image_error_unknown_format;
- Log.e(TAG, "Out of memory occured for file " + storagePath, e);
+ Log_OC.e(TAG, "Out of memory occured for file " + storagePath, e);
} catch (NoSuchFieldError e) {
mErrorMessageId = R.string.common_error_unknown;
- Log.e(TAG, "Error from access to unexisting field despite protection; file " + storagePath, e);
+ Log_OC.e(TAG, "Error from access to unexisting field despite protection; file " + storagePath, e);
} catch (Throwable t) {
mErrorMessageId = R.string.common_error_unknown;
- Log.e(TAG, "Unexpected error loading " + mFile.getStoragePath(), t);
+ Log_OC.e(TAG, "Unexpected error loading " + getFile().getStoragePath(), t);
}
return result;
}
private void onRemoveFileOperationFinish(RemoveFileOperation operation, RemoteOperationResult result) {
- getActivity().dismissDialog(PreviewImageActivity.DIALOG_SHORT_WAIT);
+ ((PreviewImageActivity) getActivity()).dismissLoadingDialog();
if (result.isSuccess()) {
Toast msg = Toast.makeText(getActivity().getApplicationContext(), R.string.remove_success_msg, Toast.LENGTH_LONG);
*/
package com.owncloud.android.ui.preview;
-import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.Vector;
+import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.ui.fragment.FileFragment;
+
import android.accounts.Account;
-import android.os.Bundle;
-import android.os.Parcelable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
-import android.support.v4.app.FragmentTransaction;
-import android.support.v4.view.PagerAdapter;
-import android.support.v4.view.ViewPager;
-import android.util.Log;
-import android.view.View;
import android.view.ViewGroup;
-import com.owncloud.android.datamodel.DataStorageManager;
-import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.ui.fragment.FileFragment;
+import com.owncloud.android.datamodel.FileDataStorageManager;
/**
* Adapter class that provides Fragment instances
//public class PreviewImagePagerAdapter extends PagerAdapter {
public class PreviewImagePagerAdapter extends FragmentStatePagerAdapter {
- private static final String TAG = PreviewImagePagerAdapter.class.getSimpleName();
-
private Vector<OCFile> mImageFiles;
private Account mAccount;
private Set<Object> mObsoleteFragments;
private Set<Integer> mObsoletePositions;
private Set<Integer> mDownloadErrors;
- private DataStorageManager mStorageManager;
+ private FileDataStorageManager mStorageManager;
private Map<Integer, FileFragment> mCachedFragments;
- /*
- private final FragmentManager mFragmentManager;
- private FragmentTransaction mCurTransaction = null;
- private ArrayList<Fragment.SavedState> mSavedState = new ArrayList<Fragment.SavedState>();
- private ArrayList<Fragment> mFragments = new ArrayList<Fragment>();
- private Fragment mCurrentPrimaryItem = null;
- */
-
/**
* Constructor.
*
* @param parentFolder Folder where images will be searched for.
* @param storageManager Bridge to database.
*/
- public PreviewImagePagerAdapter(FragmentManager fragmentManager, OCFile parentFolder, Account account, DataStorageManager storageManager) {
+ public PreviewImagePagerAdapter(FragmentManager fragmentManager, OCFile parentFolder, Account account, FileDataStorageManager storageManager) {
super(fragmentManager);
if (fragmentManager == null) {
mAccount = account;
mStorageManager = storageManager;
- mImageFiles = mStorageManager.getDirectoryImages(parentFolder);
+ mImageFiles = mStorageManager.getFolderImages(parentFolder);
mObsoleteFragments = new HashSet<Object>();
mObsoletePositions = new HashSet<Integer>();
mDownloadErrors = new HashSet<Integer>();
return mDownloadErrors.contains(Integer.valueOf(position));
}
-
-
/* -*
* Called when a change in the shown pages is going to start being made.
*
*/
package com.owncloud.android.ui.preview;
-import java.io.File;
import java.util.ArrayList;
import java.util.List;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.ServiceConnection;
+import android.content.res.Configuration;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
-import android.support.v4.app.FragmentTransaction;
-import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
import android.widget.VideoView;
-import com.actionbarsherlock.app.SherlockFragment;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
+import com.owncloud.android.R;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.media.MediaControlView;
import com.owncloud.android.media.MediaService;
import com.owncloud.android.media.MediaServiceBinder;
-import com.owncloud.android.network.OwnCloudClientUtils;
-import com.owncloud.android.operations.OnRemoteOperationListener;
-import com.owncloud.android.operations.RemoteOperation;
-import com.owncloud.android.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.network.WebdavUtils;
+import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.operations.RemoveFileOperation;
-import com.owncloud.android.ui.activity.FileDetailActivity;
+import com.owncloud.android.ui.activity.FileActivity;
import com.owncloud.android.ui.activity.FileDisplayActivity;
import com.owncloud.android.ui.fragment.ConfirmationDialogFragment;
-import com.owncloud.android.ui.fragment.FileDetailFragment;
import com.owncloud.android.ui.fragment.FileFragment;
+import com.owncloud.android.utils.Log_OC;
-import com.owncloud.android.R;
-import eu.alefzero.webdav.WebdavClient;
-import eu.alefzero.webdav.WebdavUtils;
/**
* This fragment shows a preview of a downloaded media file (audio or video).
*
* @author David A. Velasco
*/
-public class PreviewMediaFragment extends SherlockFragment implements
- OnTouchListener , FileFragment,
+public class PreviewMediaFragment extends FileFragment implements
+ OnTouchListener,
ConfirmationDialogFragment.ConfirmationDialogFragmentListener, OnRemoteOperationListener {
public static final String EXTRA_FILE = "FILE";
private static final String EXTRA_PLAYING = "PLAYING";
private View mView;
- private OCFile mFile;
private Account mAccount;
private FileDataStorageManager mStorageManager;
private ImageView mImagePreview;
private MediaServiceConnection mMediaServiceConnection = null;
private VideoHelper mVideoHelper;
private boolean mAutoplay;
+ public boolean mPrepared;
private static final String TAG = PreviewMediaFragment.class.getSimpleName();
* @param fileToDetail An {@link OCFile} to preview in the fragment
* @param ocAccount An ownCloud account; needed to start downloads
*/
- public PreviewMediaFragment(OCFile fileToDetail, Account ocAccount) {
- mFile = fileToDetail;
+ public PreviewMediaFragment(OCFile fileToDetail, Account ocAccount, int startPlaybackPosition, boolean autoplay) {
+ super(fileToDetail);
mAccount = ocAccount;
- mSavedPlaybackPosition = 0;
+ mSavedPlaybackPosition = startPlaybackPosition;
mStorageManager = null; // we need a context to init this; the container activity is not available yet at this moment
- mAutoplay = true;
+ mAutoplay = autoplay;
}
* DO NOT CALL IT: an {@link OCFile} and {@link Account} must be provided for a successful construction
*/
public PreviewMediaFragment() {
- mFile = null;
+ super();
mAccount = null;
mSavedPlaybackPosition = 0;
mStorageManager = null;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
+ Log_OC.e(TAG, "onCreateView");
+
mView = inflater.inflate(R.layout.file_preview, container, false);
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
+ Log_OC.e(TAG, "onAttach");
+
if (!(activity instanceof FileFragment.ContainerActivity))
throw new ClassCastException(activity.toString() + " must implement " + FileFragment.ContainerActivity.class.getSimpleName());
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
+ Log_OC.e(TAG, "onActivityCreated");
mStorageManager = new FileDataStorageManager(mAccount, getActivity().getApplicationContext().getContentResolver());
if (savedInstanceState != null) {
- mFile = savedInstanceState.getParcelable(PreviewMediaFragment.EXTRA_FILE);
+ setFile((OCFile)savedInstanceState.getParcelable(PreviewMediaFragment.EXTRA_FILE));
mAccount = savedInstanceState.getParcelable(PreviewMediaFragment.EXTRA_ACCOUNT);
mSavedPlaybackPosition = savedInstanceState.getInt(PreviewMediaFragment.EXTRA_PLAY_POSITION);
mAutoplay = savedInstanceState.getBoolean(PreviewMediaFragment.EXTRA_PLAYING);
}
- if (mFile == null) {
+ OCFile file = getFile();
+ if (file == null) {
throw new IllegalStateException("Instanced with a NULL OCFile");
}
if (mAccount == null) {
throw new IllegalStateException("Instanced with a NULL ownCloud Account");
}
- if (!mFile.isDown()) {
+ if (!file.isDown()) {
throw new IllegalStateException("There is no local file to preview");
}
- if (mFile.isVideo()) {
+ if (file.isVideo()) {
mVideoPreview.setVisibility(View.VISIBLE);
mImagePreview.setVisibility(View.GONE);
prepareVideo();
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
- outState.putParcelable(PreviewMediaFragment.EXTRA_FILE, mFile);
+ Log_OC.e(TAG, "onSaveInstanceState");
+
+ outState.putParcelable(PreviewMediaFragment.EXTRA_FILE, getFile());
outState.putParcelable(PreviewMediaFragment.EXTRA_ACCOUNT, mAccount);
- if (mFile.isVideo()) {
+ if (getFile().isVideo()) {
mSavedPlaybackPosition = mVideoPreview.getCurrentPosition();
mAutoplay = mVideoPreview.isPlaying();
outState.putInt(PreviewMediaFragment.EXTRA_PLAY_POSITION , mSavedPlaybackPosition);
@Override
public void onStart() {
super.onStart();
+ Log_OC.e(TAG, "onStart");
- if (mFile != null) {
- if (mFile.isAudio()) {
+ OCFile file = getFile();
+ if (file != null) {
+ if (file.isAudio()) {
bindMediaService();
- } else if (mFile.isVideo()) {
+ } else if (file.isVideo()) {
stopAudio();
playVideo();
}
toHide.add(R.id.action_cancel_download);
toHide.add(R.id.action_cancel_upload);
toHide.add(R.id.action_download_file);
+ toHide.add(R.id.action_sync_file);
toHide.add(R.id.action_rename_file); // by now
-
+
+ // Options shareLink
+ if (!getFile().isShareByLink()) {
+ toHide.add(R.id.action_unshare_file);
+ }
+
+ // Send file
+ boolean sendEnabled = getString(R.string.send_files_to_other_apps).equalsIgnoreCase("on");
+ if (!sendEnabled) {
+ toHide.add(R.id.action_send_file);
+ }
+
for (int i : toHide) {
item = menu.findItem(i);
if (item != null) {
}
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void onPrepareOptionsMenu(Menu menu) {
+ super.onPrepareOptionsMenu(menu);
+
+ MenuItem item = menu.findItem(R.id.action_unshare_file);
+ // Options shareLink
+ if (!getFile().isShareByLink()) {
+ item.setVisible(false);
+ item.setEnabled(false);
+ } else {
+ item.setVisible(true);
+ item.setEnabled(true);
+ }
+ }
+
/**
* {@inheritDoc}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
+ case R.id.action_share_file: {
+ shareFileWithLink();
+ return true;
+ }
+ case R.id.action_unshare_file: {
+ unshareFileWithLink();
+ return true;
+ }
case R.id.action_open_file_with: {
openFile();
return true;
seeDetails();
return true;
}
+ case R.id.action_send_file: {
+ sendFile();
+ }
default:
return false;
}
}
+
+
+ /**
+ * Update the file of the fragment with file value
+ * @param file
+ */
+ public void updateFile(OCFile file){
+ setFile(file);
+ }
+ private void unshareFileWithLink() {
+ stopPreview(false);
+ FileActivity activity = (FileActivity)((FileFragment.ContainerActivity)getActivity());
+ activity.getFileOperationsHelper().unshareFileWithLink(getFile(), activity);
+ }
+
+ private void shareFileWithLink() {
+ stopPreview(false);
+ FileActivity activity = (FileActivity)((FileFragment.ContainerActivity)getActivity());
+ activity.getFileOperationsHelper().shareFileWithLink(getFile(), activity);
+
+ }
+
+ private void sendFile() {
+ stopPreview(false);
+ FileActivity activity = (FileActivity)((FileFragment.ContainerActivity)getActivity());
+ activity.getFileOperationsHelper().sendDownloadedFile(getFile(), activity);
+
+ }
+
private void seeDetails() {
stopPreview(false);
- ((FileFragment.ContainerActivity)getActivity()).showFragmentWithDetails(mFile);
+ ((FileFragment.ContainerActivity)getActivity()).showDetails(getFile());
}
mMediaController.setMediaPlayer(mVideoPreview);
// load the video file in the video player ; when done, VideoHelper#onPrepared() will be called
- mVideoPreview.setVideoPath(mFile.getStoragePath());
+ mVideoPreview.setVideoPath(getFile().getStoragePath());
}
*/
@Override
public void onPrepared(MediaPlayer vp) {
- Log.e(TAG, "onPrepared");
+ Log_OC.e(TAG, "onPrepared");
mVideoPreview.seekTo(mSavedPlaybackPosition);
if (mAutoplay) {
mVideoPreview.start();
}
mMediaController.setEnabled(true);
mMediaController.updatePausePlay();
+ mPrepared = true;
}
*/
@Override
public void onCompletion(MediaPlayer mp) {
- Log.e(TAG, "completed");
+ Log_OC.e(TAG, "completed");
if (mp != null) {
mVideoPreview.seekTo(0);
// next lines are necessary to work around undesired video loops
mVideoPreview.stopPlayback();
mAutoplay = false;
mSavedPlaybackPosition = 0;
- mVideoPreview.setVideoPath(mFile.getStoragePath());
+ mVideoPreview.setVideoPath(getFile().getStoragePath());
}
} // else : called from onError()
mMediaController.updatePausePlay();
@Override
+ public void onPause() {
+ super.onPause();
+ Log_OC.e(TAG, "onPause");
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ Log_OC.e(TAG, "onResume");
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ Log_OC.e(TAG, "onDestroy");
+ }
+
+ @Override
public void onStop() {
+ Log_OC.e(TAG, "onStop");
super.onStop();
-
+
+ mPrepared = false;
if (mMediaServiceConnection != null) {
- Log.d(TAG, "Unbinding from MediaService ...");
+ Log_OC.d(TAG, "Unbinding from MediaService ...");
if (mMediaServiceBinder != null && mMediaController != null) {
mMediaServiceBinder.unregisterMediaController(mMediaController);
}
private void startFullScreenVideo() {
Intent i = new Intent(getActivity(), PreviewVideoActivity.class);
- i.putExtra(PreviewVideoActivity.EXTRA_ACCOUNT, mAccount);
- i.putExtra(PreviewVideoActivity.EXTRA_FILE, mFile);
+ i.putExtra(FileActivity.EXTRA_ACCOUNT, mAccount);
+ i.putExtra(FileActivity.EXTRA_FILE, getFile());
i.putExtra(PreviewVideoActivity.EXTRA_AUTOPLAY, mVideoPreview.isPlaying());
mVideoPreview.pause();
i.putExtra(PreviewVideoActivity.EXTRA_START_POSITION, mVideoPreview.getCurrentPosition());
startActivityForResult(i, 0);
}
+ @Override
+ public void onConfigurationChanged (Configuration newConfig) {
+ Log_OC.e(TAG, "onConfigurationChanged " + this);
+ }
@Override
public void onActivityResult (int requestCode, int resultCode, Intent data) {
+ Log_OC.e(TAG, "onActivityResult " + this);
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
mSavedPlaybackPosition = data.getExtras().getInt(PreviewVideoActivity.EXTRA_START_POSITION);
private void playAudio() {
- if (!mMediaServiceBinder.isPlaying(mFile)) {
- Log.d(TAG, "starting playback of " + mFile.getStoragePath());
- mMediaServiceBinder.start(mAccount, mFile, mAutoplay, mSavedPlaybackPosition);
+ OCFile file = getFile();
+ if (!mMediaServiceBinder.isPlaying(file)) {
+ Log_OC.d(TAG, "starting playback of " + file.getStoragePath());
+ mMediaServiceBinder.start(mAccount, file, mAutoplay, mSavedPlaybackPosition);
} else {
if (!mMediaServiceBinder.isPlaying() && mAutoplay) {
private void bindMediaService() {
- Log.d(TAG, "Binding to MediaService...");
+ Log_OC.d(TAG, "Binding to MediaService...");
if (mMediaServiceConnection == null) {
mMediaServiceConnection = new MediaServiceConnection();
}
@Override
public void onServiceConnected(ComponentName component, IBinder service) {
- if (component.equals(new ComponentName(getActivity(), MediaService.class))) {
- Log.d(TAG, "Media service connected");
- mMediaServiceBinder = (MediaServiceBinder) service;
- if (mMediaServiceBinder != null) {
- prepareMediaController();
- playAudio(); // do not wait for the touch of nobody to play audio
-
- Log.d(TAG, "Successfully bound to MediaService, MediaController ready");
-
- } else {
- Log.e(TAG, "Unexpected response from MediaService while binding");
+ if (getActivity() != null) {
+ if (component.equals(new ComponentName(getActivity(), MediaService.class))) {
+ Log_OC.d(TAG, "Media service connected");
+ mMediaServiceBinder = (MediaServiceBinder) service;
+ if (mMediaServiceBinder != null) {
+ prepareMediaController();
+ playAudio(); // do not wait for the touch of nobody to play audio
+
+ Log_OC.d(TAG, "Successfully bound to MediaService, MediaController ready");
+
+ } else {
+ Log_OC.e(TAG, "Unexpected response from MediaService while binding");
+ }
}
}
}
@Override
public void onServiceDisconnected(ComponentName component) {
if (component.equals(new ComponentName(getActivity(), MediaService.class))) {
- Log.e(TAG, "Media service suddenly disconnected");
+ Log_OC.e(TAG, "Media service suddenly disconnected");
if (mMediaController != null) {
mMediaController.setMediaPlayer(null);
} else {
* available apps for the MIME type known from the file extension, to let the user choose
*/
private void openFile() {
+ OCFile file = getFile();
stopPreview(true);
- String storagePath = mFile.getStoragePath();
+ String storagePath = file.getStoragePath();
String encodedStoragePath = WebdavUtils.encodePath(storagePath);
try {
Intent i = new Intent(Intent.ACTION_VIEW);
- i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), mFile.getMimetype());
+ i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), file.getMimetype());
i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivity(i);
} catch (Throwable t) {
- Log.e(TAG, "Fail when trying to open with the mimeType provided from the ownCloud server: " + mFile.getMimetype());
+ Log_OC.e(TAG, "Fail when trying to open with the mimeType provided from the ownCloud server: " + file.getMimetype());
boolean toastIt = true;
String mimeType = "";
try {
Intent i = new Intent(Intent.ACTION_VIEW);
mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(storagePath.substring(storagePath.lastIndexOf('.') + 1));
- if (mimeType == null || !mimeType.equals(mFile.getMimetype())) {
+ if (mimeType == null || !mimeType.equals(file.getMimetype())) {
if (mimeType != null) {
i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), mimeType);
} else {
}
} catch (IndexOutOfBoundsException e) {
- Log.e(TAG, "Trying to find out MIME type of a file without extension: " + storagePath);
+ Log_OC.e(TAG, "Trying to find out MIME type of a file without extension: " + storagePath);
} catch (ActivityNotFoundException e) {
- Log.e(TAG, "No activity found to handle: " + storagePath + " with MIME type " + mimeType + " obtained from extension");
+ Log_OC.e(TAG, "No activity found to handle: " + storagePath + " with MIME type " + mimeType + " obtained from extension");
} catch (Throwable th) {
- Log.e(TAG, "Unexpected problem when opening: " + storagePath, th);
+ Log_OC.e(TAG, "Unexpected problem when opening: " + storagePath, th);
} finally {
if (toastIt) {
- Toast.makeText(getActivity(), "There is no application to handle file " + mFile.getFileName(), Toast.LENGTH_SHORT).show();
+ Toast.makeText(getActivity(), "There is no application to handle file " + file.getFileName(), Toast.LENGTH_SHORT).show();
}
}
private void removeFile() {
ConfirmationDialogFragment confDialog = ConfirmationDialogFragment.newInstance(
R.string.confirmation_remove_alert,
- new String[]{mFile.getFileName()},
+ new String[]{getFile().getFileName()},
R.string.confirmation_remove_remote_and_local,
R.string.confirmation_remove_local,
R.string.common_cancel);
*/
@Override
public void onConfirmation(String callerTag) {
- if (mStorageManager.getFileById(mFile.getFileId()) != null) { // check that the file is still there;
+ OCFile file = getFile();
+ if (mStorageManager.getFileById(file.getFileId()) != null) { // check that the file is still there;
stopPreview(true);
- mLastRemoteOperation = new RemoveFileOperation( mFile, // TODO we need to review the interface with RemoteOperations, and use OCFile IDs instead of OCFile objects as parameters
+ mLastRemoteOperation = new RemoveFileOperation( file, // TODO we need to review the interface with RemoteOperations, and use OCFile IDs instead of OCFile objects as parameters
true,
mStorageManager);
- WebdavClient wc = OwnCloudClientUtils.createOwnCloudClient(mAccount, getSherlockActivity().getApplicationContext());
- mLastRemoteOperation.execute(wc, this, mHandler);
+ mLastRemoteOperation.execute(mAccount, getSherlockActivity(), this, mHandler, getSherlockActivity());
- boolean inDisplayActivity = getActivity() instanceof FileDisplayActivity;
- getActivity().showDialog((inDisplayActivity)? FileDisplayActivity.DIALOG_SHORT_WAIT : FileDetailActivity.DIALOG_SHORT_WAIT);
+ ((FileDisplayActivity) getActivity()).showLoadingDialog();
}
}
*/
@Override
public void onNeutral(String callerTag) {
- // TODO this code should be made in a secondary thread,
- if (mFile.isDown()) { // checks it is still there
- stopPreview(true);
- File f = new File(mFile.getStoragePath());
- f.delete();
- mFile.setStoragePath(null);
- mStorageManager.saveFile(mFile);
- finish();
- }
+ OCFile file = getFile();
+ stopPreview(true);
+ mStorageManager.removeFile(file, false, true); // TODO perform in background task / new thread
+ finish();
}
/**
/**
- * {@inheritDoc}
- */
- public OCFile getFile(){
- return mFile;
- }
-
- /*
- /**
- * Use this method to signal this Activity that it shall update its view.
- *
- * @param file : An {@link OCFile}
- *-/
- public void updateFileDetails(OCFile file, Account ocAccount) {
- mFile = file;
- if (ocAccount != null && (
- mStorageManager == null ||
- (mAccount != null && !mAccount.equals(ocAccount))
- )) {
- mStorageManager = new FileDataStorageManager(ocAccount, getActivity().getApplicationContext().getContentResolver());
- }
- mAccount = ocAccount;
- updateFileDetails(false);
- }
- */
-
-
- /**
* Helper method to test if an {@link OCFile} can be passed to a {@link PreviewMediaFragment} to be previewed.
*
* @param file File to test if can be previewed.
}
private void onRemoveFileOperationFinish(RemoveFileOperation operation, RemoteOperationResult result) {
- boolean inDisplayActivity = getActivity() instanceof FileDisplayActivity;
- getActivity().dismissDialog((inDisplayActivity)? FileDisplayActivity.DIALOG_SHORT_WAIT : FileDetailActivity.DIALOG_SHORT_WAIT);
-
+ ((FileDisplayActivity) getActivity()).dismissLoadingDialog();
if (result.isSuccess()) {
Toast msg = Toast.makeText(getActivity().getApplicationContext(), R.string.remove_success_msg, Toast.LENGTH_LONG);
msg.show();
}
private void stopPreview(boolean stopAudio) {
- if (mFile.isAudio() && stopAudio) {
+ OCFile file = getFile();
+ if (file.isAudio() && stopAudio) {
mMediaServiceBinder.pause();
- } else if (mFile.isVideo()) {
+ } else if (file.isVideo()) {
mVideoPreview.stopPlayback();
}
}
* Finishes the preview
*/
private void finish() {
- Activity container = getActivity();
- if (container instanceof FileDisplayActivity) {
- // double pane
- FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
- transaction.replace(R.id.file_details_container, new FileDetailFragment(null, null), FileDetailFragment.FTAG); // empty FileDetailFragment
- transaction.commit();
- ((FileFragment.ContainerActivity)container).onFileStateChanged();
- } else {
- container.finish();
+ getActivity().onBackPressed();
+ }
+
+
+ public int getPosition() {
+ if (mPrepared) {
+ mSavedPlaybackPosition = mVideoPreview.getCurrentPosition();
+ }
+ Log_OC.e(TAG, "getting position: " + mSavedPlaybackPosition);
+ return mSavedPlaybackPosition;
+ }
+
+ public boolean isPlaying() {
+ if (mPrepared) {
+ mAutoplay = mVideoPreview.isPlaying();
}
+ return mAutoplay;
}
}
package com.owncloud.android.ui.preview;
+import com.owncloud.android.R;
+import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.media.MediaService;
+import com.owncloud.android.ui.activity.FileActivity;
+import com.owncloud.android.utils.Log_OC;
+
import android.accounts.Account;
-import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.media.MediaPlayer.OnPreparedListener;
import android.net.Uri;
import android.os.Bundle;
-import android.util.Log;
-import android.view.MotionEvent;
import android.widget.MediaController;
import android.widget.VideoView;
-import com.owncloud.android.AccountUtils;
-import com.owncloud.android.R;
-import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.media.MediaService;
+import com.owncloud.android.lib.common.accounts.AccountUtils;
+import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException;
/**
* Activity implementing a basic video player.
*
* @author David A. Velasco
*/
-public class PreviewVideoActivity extends Activity implements OnCompletionListener, OnPreparedListener, OnErrorListener {
+public class PreviewVideoActivity extends FileActivity implements OnCompletionListener, OnPreparedListener, OnErrorListener {
- /** Key to receive an {@link OCFile} to play as an extra value in an {@link Intent} */
- public static final String EXTRA_FILE = "FILE";
-
- /** Key to receive the ownCloud {@link Account} where the file to play is saved as an extra value in an {@link Intent} */
- public static final String EXTRA_ACCOUNT = "ACCOUNT";
-
/** Key to receive a flag signaling if the video should be started immediately */
public static final String EXTRA_AUTOPLAY = "AUTOPLAY";
private static final String TAG = PreviewVideoActivity.class.getSimpleName();
- private OCFile mFile; // video file to play
- private Account mAccount; // ownCloud account holding mFile
private int mSavedPlaybackPosition; // in the unit time handled by MediaPlayer.getCurrentPosition()
private boolean mAutoplay; // when 'true', the playback starts immediately with the activity
private VideoView mVideoPlayer; // view to play the file; both performs and show the playback
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- Log.e(TAG, "ACTIVITY\t\tonCreate");
+ Log_OC.e(TAG, "ACTIVITY\t\tonCreate");
setContentView(R.layout.video_layout);
if (savedInstanceState == null) {
Bundle extras = getIntent().getExtras();
- mFile = extras.getParcelable(EXTRA_FILE);
- mAccount = extras.getParcelable(EXTRA_ACCOUNT);
mSavedPlaybackPosition = extras.getInt(EXTRA_START_POSITION);
mAutoplay = extras.getBoolean(EXTRA_AUTOPLAY);
} else {
- mFile = savedInstanceState.getParcelable(EXTRA_FILE);
- mAccount = savedInstanceState.getParcelable(EXTRA_ACCOUNT);
mSavedPlaybackPosition = savedInstanceState.getInt(EXTRA_START_POSITION);
mAutoplay = savedInstanceState.getBoolean(EXTRA_AUTOPLAY);
}
// keep the screen on while the playback is performed (prevents screen off by battery save)
mVideoPlayer.setKeepScreenOn(true);
-
- if (mFile != null) {
- if (mFile.isDown()) {
- mVideoPlayer.setVideoPath(mFile.getStoragePath());
-
- } else if (mAccount != null) {
- // not working now
- String url = AccountUtils.constructFullURLForAccount(this, mAccount) + mFile.getRemotePath();
- mVideoPlayer.setVideoURI(Uri.parse(url));
-
- } else {
- onError(null, MediaService.OC_MEDIA_ERROR, R.string.media_err_no_account);
- }
-
- // create and prepare control panel for the user
- mMediaController = new MediaController(this);
- mMediaController.setMediaPlayer(mVideoPlayer);
- mMediaController.setAnchorView(mVideoPlayer);
- mVideoPlayer.setMediaController(mMediaController);
-
- } else {
- onError(null, MediaService.OC_MEDIA_ERROR, R.string.media_err_nothing_to_play);
- }
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
- Log.e(TAG, "ACTIVITY\t\tonSaveInstanceState");
- outState.putParcelable(PreviewVideoActivity.EXTRA_FILE, mFile);
- outState.putParcelable(PreviewVideoActivity.EXTRA_ACCOUNT, mAccount);
+ Log_OC.e(TAG, "ACTIVITY\t\tonSaveInstanceState");
outState.putInt(PreviewVideoActivity.EXTRA_START_POSITION, mVideoPlayer.getCurrentPosition());
outState.putBoolean(PreviewVideoActivity.EXTRA_AUTOPLAY , mVideoPlayer.isPlaying());
}
@Override
public void onBackPressed() {
- Log.e(TAG, "ACTIVTIY\t\tonBackPressed");
+ Log_OC.e(TAG, "ACTIVTIY\t\tonBackPressed");
Intent i = new Intent();
i.putExtra(EXTRA_AUTOPLAY, mVideoPlayer.isPlaying());
i.putExtra(EXTRA_START_POSITION, mVideoPlayer.getCurrentPosition());
}
- @Override
- public void onResume() {
- super.onResume();
- Log.e(TAG, "ACTIVTIY\t\tonResume");
- }
-
-
- @Override
- public void onStart() {
- super.onStart();
- Log.e(TAG, "ACTIVTIY\t\tonStart");
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- Log.e(TAG, "ACTIVITY\t\tonDestroy");
- }
-
- @Override
- public void onStop() {
- super.onStop();
- Log.e(TAG, "ACTIVTIY\t\tonStop");
- }
-
-
- @Override
- public void onPause() {
- super.onPause();
- Log.e(TAG, "ACTIVTIY\t\tonPause");
- }
-
-
/**
* Called when the file is ready to be played.
*
*/
@Override
public void onPrepared(MediaPlayer mp) {
- Log.e(TAG, "ACTIVITY\t\tonPrepare");
+ Log_OC.e(TAG, "ACTIVITY\t\tonPrepare");
mVideoPlayer.seekTo(mSavedPlaybackPosition);
if (mAutoplay) {
mVideoPlayer.start();
*/
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
- Log.e(TAG, "Error in video playback, what = " + what + ", extra = " + extra);
+ Log_OC.e(TAG, "Error in video playback, what = " + what + ", extra = " + extra);
if (mMediaController != null) {
mMediaController.hide();
return true;
}
-
- /**
- * Screen touches trigger the appearance of the control panel for a limited time.
- *
- * {@inheritDoc}
- */
@Override
- public boolean onTouchEvent (MotionEvent ev){
- /*if (ev.getAction() == MotionEvent.ACTION_DOWN) {
- if (mMediaController.isShowing()) {
- mMediaController.hide();
+ protected void onAccountSet(boolean stateWasRecovered) {
+ super.onAccountSet(stateWasRecovered);
+ if (getAccount() != null) {
+ OCFile file = getFile();
+ /// Validate handled file (first image to preview)
+ if (file == null) {
+ throw new IllegalStateException("Instanced with a NULL OCFile");
+ }
+ if (!file.isVideo()) {
+ throw new IllegalArgumentException("Non-video file passed as argument");
+ }
+ file = getStorageManager().getFileById(file.getFileId());
+ if (file != null) {
+ if (file.isDown()) {
+ mVideoPlayer.setVideoPath(file.getStoragePath());
+
+ } else {
+ // not working yet
+ String url;
+ try {
+ url = AccountUtils.constructFullURLForAccount(this, getAccount()) + file.getRemotePath();
+ mVideoPlayer.setVideoURI(Uri.parse(url));
+ } catch (AccountNotFoundException e) {
+ onError(null, MediaService.OC_MEDIA_ERROR, R.string.media_err_no_account);
+ }
+ }
+
+ // create and prepare control panel for the user
+ mMediaController = new MediaController(this);
+ mMediaController.setMediaPlayer(mVideoPlayer);
+ mMediaController.setAnchorView(mVideoPlayer);
+ mVideoPlayer.setMediaController(mMediaController);
+
} else {
- mMediaController.show(MediaService.MEDIA_CONTROL_SHORT_LIFE);
+ finish();
}
- return true;
} else {
- return false;
- }*/
- return false;
- }
+ finish();
+ }
+ }
}
\ No newline at end of file
--- /dev/null
+/* ownCloud Android client application\r
+ * Copyright (C) 2011 Bartek Przybylski\r
+ * Copyright (C) 2012-2013 ownCloud Inc.\r
+ *\r
+ * This program is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License version 2,\r
+ * as published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.\r
+ *\r
+ */\r
+\r
+package com.owncloud.android.utils;\r
+\r
+import java.util.Arrays;\r
+import java.util.Calendar;\r
+import java.util.Date;\r
+import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.Set;\r
+\r
+import com.owncloud.android.R;\r
+\r
+/**\r
+ * A helper class for some string operations.\r
+ * \r
+ * @author Bartek Przybylski\r
+ * @author David A. Velasco\r
+ */\r
+public class DisplayUtils {\r
+ \r
+ //private static String TAG = DisplayUtils.class.getSimpleName(); \r
+ \r
+ private static final String[] sizeSuffixes = { "B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" };\r
+\r
+ private static HashMap<String, String> mimeType2HUmanReadable;\r
+ static {\r
+ mimeType2HUmanReadable = new HashMap<String, String>();\r
+ // images\r
+ mimeType2HUmanReadable.put("image/jpeg", "JPEG image");\r
+ mimeType2HUmanReadable.put("image/jpg", "JPEG image");\r
+ mimeType2HUmanReadable.put("image/png", "PNG image");\r
+ mimeType2HUmanReadable.put("image/bmp", "Bitmap image");\r
+ mimeType2HUmanReadable.put("image/gif", "GIF image");\r
+ mimeType2HUmanReadable.put("image/svg+xml", "JPEG image");\r
+ mimeType2HUmanReadable.put("image/tiff", "TIFF image");\r
+ // music\r
+ mimeType2HUmanReadable.put("audio/mpeg", "MP3 music file");\r
+ mimeType2HUmanReadable.put("application/ogg", "OGG music file");\r
+\r
+ }\r
+\r
+ private static final String TYPE_APPLICATION = "application";\r
+ private static final String TYPE_AUDIO = "audio";\r
+ private static final String TYPE_IMAGE = "image";\r
+ private static final String TYPE_TXT = "text";\r
+ private static final String TYPE_VIDEO = "video";\r
+ \r
+ private static final String SUBTYPE_PDF = "pdf";\r
+ private static final String[] SUBTYPES_DOCUMENT = { "msword", "mspowerpoint", "msexcel", \r
+ "vnd.oasis.opendocument.presentation",\r
+ "vnd.oasis.opendocument.spreadsheet",\r
+ "vnd.oasis.opendocument.text"\r
+ };\r
+ private static Set<String> SUBTYPES_DOCUMENT_SET = new HashSet<String>(Arrays.asList(SUBTYPES_DOCUMENT));\r
+ private static final String[] SUBTYPES_COMPRESSED = {"x-tar", "x-gzip", "zip"};\r
+ private static final Set<String> SUBTYPES_COMPRESSED_SET = new HashSet<String>(Arrays.asList(SUBTYPES_COMPRESSED));\r
+ \r
+ /**\r
+ * Converts the file size in bytes to human readable output.\r
+ * \r
+ * @param bytes Input file size\r
+ * @return Like something readable like "12 MB"\r
+ */\r
+ public static String bytesToHumanReadable(long bytes) {\r
+ double result = bytes;\r
+ int attachedsuff = 0;\r
+ while (result > 1024 && attachedsuff < sizeSuffixes.length) {\r
+ result /= 1024.;\r
+ attachedsuff++;\r
+ }\r
+ result = ((int) (result * 100)) / 100.;\r
+ return result + " " + sizeSuffixes[attachedsuff];\r
+ }\r
+\r
+ /**\r
+ * Removes special HTML entities from a string\r
+ * \r
+ * @param s Input string\r
+ * @return A cleaned version of the string\r
+ */\r
+ public static String HtmlDecode(String s) {\r
+ /*\r
+ * TODO: Perhaps we should use something more proven like:\r
+ * http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/StringEscapeUtils.html#unescapeHtml%28java.lang.String%29\r
+ */\r
+\r
+ String ret = "";\r
+ for (int i = 0; i < s.length(); ++i) {\r
+ if (s.charAt(i) == '%') {\r
+ ret += (char) Integer.parseInt(s.substring(i + 1, i + 3), 16);\r
+ i += 2;\r
+ } else {\r
+ ret += s.charAt(i);\r
+ }\r
+ }\r
+ return ret;\r
+ }\r
+\r
+ /**\r
+ * Converts MIME types like "image/jpg" to more end user friendly output\r
+ * like "JPG image".\r
+ * \r
+ * @param mimetype MIME type to convert\r
+ * @return A human friendly version of the MIME type\r
+ */\r
+ public static String convertMIMEtoPrettyPrint(String mimetype) {\r
+ if (mimeType2HUmanReadable.containsKey(mimetype)) {\r
+ return mimeType2HUmanReadable.get(mimetype);\r
+ }\r
+ if (mimetype.split("/").length >= 2)\r
+ return mimetype.split("/")[1].toUpperCase() + " file";\r
+ return "Unknown type";\r
+ }\r
+ \r
+ \r
+ /**\r
+ * Returns the resource identifier of an image resource to use as icon associated to a \r
+ * known MIME type.\r
+ * \r
+ * @param mimetype MIME type string.\r
+ * @return Resource identifier of an image resource.\r
+ */\r
+ public static int getResourceId(String mimetype) {\r
+\r
+ if (mimetype == null || "DIR".equals(mimetype)) {\r
+ return R.drawable.ic_menu_archive;\r
+ \r
+ } else {\r
+ String [] parts = mimetype.split("/");\r
+ String type = parts[0];\r
+ String subtype = (parts.length > 1) ? parts[1] : "";\r
+ \r
+ if(TYPE_TXT.equals(type)) {\r
+ return R.drawable.file_doc;\r
+ \r
+ } else if(TYPE_IMAGE.equals(type)) {\r
+ return R.drawable.file_image;\r
+ \r
+ } else if(TYPE_VIDEO.equals(type)) {\r
+ return R.drawable.file_movie;\r
+ \r
+ } else if(TYPE_AUDIO.equals(type)) { \r
+ return R.drawable.file_sound;\r
+ \r
+ } else if(TYPE_APPLICATION.equals(type)) {\r
+ \r
+ if (SUBTYPE_PDF.equals(subtype)) {\r
+ return R.drawable.file_pdf;\r
+ \r
+ } else if (SUBTYPES_DOCUMENT_SET.contains(subtype)) {\r
+ return R.drawable.file_doc;\r
+\r
+ } else if (SUBTYPES_COMPRESSED_SET.contains(subtype)) {\r
+ return R.drawable.file_zip;\r
+ }\r
+ \r
+ }\r
+ // problems: RAR, RTF, 3GP are send as application/octet-stream from the server ; extension in the filename should be explicitly reviewed\r
+ }\r
+\r
+ // default icon\r
+ return R.drawable.file;\r
+ }\r
+\r
+ \r
+\r
+ /**\r
+ * Converts Unix time to human readable format\r
+ * @param miliseconds that have passed since 01/01/1970\r
+ * @return The human readable time for the users locale\r
+ */\r
+ public static String unixTimeToHumanReadable(long milliseconds) {\r
+ Date date = new Date(milliseconds);\r
+ return date.toLocaleString();\r
+ }\r
+ \r
+ \r
+ public static int getSeasonalIconId() {\r
+ if (Calendar.getInstance().get(Calendar.DAY_OF_YEAR) >= 354) {\r
+ return R.drawable.winter_holidays_icon;\r
+ } else {\r
+ return R.drawable.icon;\r
+ }\r
+ }\r
+}\r
import java.io.File;
+import com.owncloud.android.MainApp;
+import com.owncloud.android.R;
+import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.lib.resources.files.RemoteFile;
+
import android.annotation.SuppressLint;
import android.content.Context;
import android.net.Uri;
import android.os.Environment;
import android.os.StatFs;
-import android.util.Log;
-import com.owncloud.android.R;
-import com.owncloud.android.datamodel.OCFile;
/**
* Static methods to help in access to local file system.
* @author David A. Velasco
*/
public class FileStorageUtils {
- private static final String LOG_TAG = "FileStorageUtils";
+ //private static final String LOG_TAG = "FileStorageUtils";
public static final String getSavePath(String accountName) {
File sdCard = Environment.getExternalStorageDirectory();
- return sdCard.getAbsolutePath() + "/owncloud/" + Uri.encode(accountName, "@");
+ return sdCard.getAbsolutePath() + "/" + MainApp.getDataFolder() + "/" + Uri.encode(accountName, "@");
// URL encoding is an 'easy fix' to overcome that NTFS and FAT32 don't allow ":" in file names, that can be in the accountName since 0.1.190B
}
public static final String getTemporalPath(String accountName) {
File sdCard = Environment.getExternalStorageDirectory();
- return sdCard.getAbsolutePath() + "/owncloud/tmp/" + Uri.encode(accountName, "@");
+ return sdCard.getAbsolutePath() + "/" + MainApp.getDataFolder() + "/tmp/" + Uri.encode(accountName, "@");
// URL encoding is an 'easy fix' to overcome that NTFS and FAT32 don't allow ":" in file names, that can be in the accountName since 0.1.190B
}
}
public static final String getLogPath() {
- return Environment.getExternalStorageDirectory() + File.separator + "owncloud" + File.separator + "log";
+ return Environment.getExternalStorageDirectory() + File.separator + MainApp.getDataFolder() + File.separator + "log";
}
public static String getInstantUploadFilePath(Context context, String fileName) {
String value = uploadPath + OCFile.PATH_SEPARATOR + (fileName == null ? "" : fileName);
return value;
}
+
+ public static String getParentPath(String remotePath) {
+ String parentPath = new File(remotePath).getParent();
+ parentPath = parentPath.endsWith(OCFile.PATH_SEPARATOR) ? parentPath : parentPath + OCFile.PATH_SEPARATOR;
+ return parentPath;
+ }
+
+ /**
+ * Creates and populates a new {@link OCFile} object with the data read from the server.
+ *
+ * @param remote remote file read from the server (remote file or folder).
+ * @return New OCFile instance representing the remote resource described by we.
+ */
+ public static OCFile fillOCFile(RemoteFile remote) {
+ OCFile file = new OCFile(remote.getRemotePath());
+ file.setCreationTimestamp(remote.getCreationTimestamp());
+ file.setFileLength(remote.getLength());
+ file.setMimetype(remote.getMimeType());
+ file.setModificationTimestamp(remote.getModifiedTimestamp());
+ file.setEtag(remote.getEtag());
+
+ return file;
+ }
+
+ /**
+ * Creates and populates a new {@link RemoteFile} object with the data read from an {@link OCFile}.
+ *
+ * @param oCFile OCFile
+ * @return New RemoteFile instance representing the resource described by ocFile.
+ */
+ public static RemoteFile fillRemoteFile(OCFile ocFile){
+ RemoteFile file = new RemoteFile(ocFile.getRemotePath());
+ file.setCreationTimestamp(ocFile.getCreationTimestamp());
+ file.setLength(ocFile.getFileLength());
+ file.setMimeType(ocFile.getMimetype());
+ file.setModifiedTimestamp(ocFile.getModificationTimestamp());
+ file.setEtag(ocFile.getEtag());
+ return file;
+ }
+
}
\ No newline at end of file
--- /dev/null
+package com.owncloud.android.utils;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+import com.owncloud.android.MainApp;
+
+import android.util.Log;
+
+
+
+public class Log_OC {
+
+
+ private static boolean isEnabled = false;
+ private static File logFile;
+ private static File folder;
+ private static BufferedWriter buf;
+
+ public static void i(String TAG, String message){
+ // Printing the message to LogCat console
+ int a = Log.i(TAG, message);
+ // Write the log message to the file
+ appendLog(TAG+" : "+message);
+ }
+
+ public static void d(String TAG, String message){
+ Log.d(TAG, message);
+ appendLog(TAG + " : " + message);
+ }
+ public static void d(String TAG, String message, Exception e) {
+ Log.d(TAG, message, e);
+ appendLog(TAG + " : " + message + " Exception : "+ e.getStackTrace());
+ }
+ public static void e(String TAG, String message){
+ Log.e(TAG, message);
+ appendLog(TAG + " : " + message);
+ }
+
+ public static void e(String TAG, String message, Throwable e) {
+ Log.e(TAG, message, e);
+ appendLog(TAG+" : " + message +" Exception : " + e.getStackTrace());
+ }
+
+ public static void v(String TAG, String message){
+ Log.v(TAG, message);
+ appendLog(TAG+" : "+ message);
+ }
+
+ public static void w(String TAG, String message) {
+ Log.w(TAG,message);
+ appendLog(TAG+" : "+ message);
+ }
+
+ public static void wtf(String TAG, String message) {
+ Log.wtf(TAG,message);
+ appendLog(TAG+" : "+ message);
+ }
+
+ public static void startLogging(String logPath) {
+ folder = new File(logPath);
+ logFile = new File(folder + File.separator + "log.txt");
+
+ if (!folder.exists()) {
+ folder.mkdirs();
+ }
+ if (logFile.exists()) {
+ logFile.delete();
+ }
+ try {
+ logFile.createNewFile();
+ buf = new BufferedWriter(new FileWriter(logFile, true));
+ isEnabled = true;
+ appendPhoneInfo();
+ }catch (IOException e){
+ e.printStackTrace();
+ }
+ }
+
+ public static void stopLogging() {
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());
+ String currentDateandTime = sdf.format(new Date());
+ if (logFile != null) {
+ logFile.renameTo(new File(folder + File.separator + MainApp.getLogName() + currentDateandTime+".log"));
+
+ isEnabled = false;
+ try {
+ buf.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ }
+
+ private static void appendPhoneInfo() {
+ appendLog("Model : " + android.os.Build.MODEL);
+ appendLog("Brand : " + android.os.Build.BRAND);
+ appendLog("Product : " + android.os.Build.PRODUCT);
+ appendLog("Device : " + android.os.Build.DEVICE);
+ appendLog("Version-Codename : " + android.os.Build.VERSION.CODENAME);
+ appendLog("Version-Release : " + android.os.Build.VERSION.RELEASE);
+ }
+
+ private static void appendLog(String text) {
+ if (isEnabled) {
+ try {
+ buf.append(text);
+ buf.newLine();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+}
+
+
+
+
+
+
+
+
+}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2014 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.utils;
+
+import com.owncloud.android.R;
+
+import android.app.Notification;
+import android.content.Context;
+import android.os.Build;
+import android.support.v4.app.NotificationCompat;
+import android.view.View;
+import android.widget.RemoteViews;
+
+/**
+ * Extends the support class {@link NotificationCompat.Builder} to grant that
+ * a progress bar is available in every Android version, because
+ * {@link NotificationCompat.Builder#setProgress(int, int, boolean)} has no
+ * real effect for Android < 4.0
+ *
+ * @author David A. Velasco
+ */
+public class NotificationBuilderWithProgressBar extends NotificationCompat.Builder {
+
+ /**
+ * Custom view to replace the original layout of the notifications
+ */
+ private RemoteViews mContentView = null;
+
+ /**
+ * Fatory method.
+ *
+ * Instances of this class will be only returned in Android versions needing it.
+ *
+ * @param context Context that will use the builder to create notifications
+ * @return An instance of this class, or of the regular
+ * {@link NotificationCompat.Builder}, when it is good enough.
+ */
+ public static NotificationCompat.Builder newNotificationBuilderWithProgressBar(Context context) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+ return new NotificationBuilderWithProgressBar(context);
+ } else {
+ return new NotificationCompat.Builder(context);
+ }
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param context Context that will use the builder to create notifications.
+ */
+ private NotificationBuilderWithProgressBar(Context context) {
+ super(context);
+ mContentView = new RemoteViews(context.getPackageName(), R.layout.notification_with_progress_bar);
+ setContent(mContentView);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public NotificationCompat.Builder setProgress(int max, int progress, boolean indeterminate) {
+ mContentView.setProgressBar(R.id.progress, max, progress, indeterminate);
+ if (max > 0) {
+ mContentView.setViewVisibility(R.id.progressHolder, View.VISIBLE);
+ } else {
+ mContentView.setViewVisibility(R.id.progressHolder, View.GONE);
+ }
+ return this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public NotificationCompat.Builder setSmallIcon(int icon) {
+ super.setSmallIcon(icon); // necessary
+ mContentView.setImageViewResource(R.id.icon, icon);
+ return this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public NotificationCompat.Builder setContentTitle(CharSequence title) {
+ super.setContentTitle(title);
+ mContentView.setTextViewText(R.id.title, title);
+ return this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public NotificationCompat.Builder setContentText(CharSequence text) {
+ super.setContentText(text);
+ mContentView.setTextViewText(R.id.text, text);
+ if (text != null && text.length() > 0) {
+ mContentView.setViewVisibility(R.id.text, View.VISIBLE);
+ } else {
+ mContentView.setViewVisibility(R.id.text, View.GONE);
+ }
+ return this;
+ }
+
+ @Override
+ public Notification build() {
+ Notification result = super.build();
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
+ // super.build() in Android 2.x totally ruins whatever was made #setContent
+ result.contentView = mContentView;
+ }
+ return result;
+ }
+
+}
--- /dev/null
+/* ownCloud Android client application\r
+ * Copyright (C) 2011 Bartek Przybylski\r
+ * Copyright (C) 2012-2013 ownCloud Inc.\r
+ *\r
+ * This program is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License version 2,\r
+ * as published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.\r
+ *\r
+ */\r
+package com.owncloud.android.utils;\r
+\r
+/**\r
+ * Represents a session to an ownCloud instance\r
+ * \r
+ * @author Bartek Przybylski\r
+ * \r
+ */\r
+public class OwnCloudSession {\r
+ private String mSessionName;\r
+ private String mSessionUrl;\r
+ private int mEntryId;\r
+\r
+ public OwnCloudSession(String name, String url, int entryId) {\r
+ mSessionName = name;\r
+ mSessionUrl = url;\r
+ mEntryId = entryId;\r
+ }\r
+\r
+ public void setName(String name) {\r
+ mSessionName = name;\r
+ }\r
+\r
+ public String getName() {\r
+ return mSessionName;\r
+ }\r
+\r
+ public void setUrl(String url) {\r
+ mSessionUrl = url;\r
+ }\r
+\r
+ public String getUrl() {\r
+ return mSessionUrl;\r
+ }\r
+\r
+ public int getEntryId() {\r
+ return mEntryId;\r
+ }\r
+}\r
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.utils;
-
-public class OwnCloudVersion implements Comparable<OwnCloudVersion> {
- public static final OwnCloudVersion owncloud_v1 = new OwnCloudVersion(
- 0x010000);
- public static final OwnCloudVersion owncloud_v2 = new OwnCloudVersion(
- 0x020000);
- public static final OwnCloudVersion owncloud_v3 = new OwnCloudVersion(
- 0x030000);
- public static final OwnCloudVersion owncloud_v4 = new OwnCloudVersion(
- 0x040000);
- public static final OwnCloudVersion owncloud_v4_5 = new OwnCloudVersion(
- 0x040500);
-
- // format is in version
- // 0xAABBCC
- // for version AA.BB.CC
- // ie version 2.0.3 will be stored as 0x030003
- private int mVersion;
- private boolean mIsValid;
-
- public OwnCloudVersion(int version) {
- mVersion = version;
- mIsValid = true;
- }
-
- public OwnCloudVersion(String version) {
- mVersion = 0;
- mIsValid = false;
- parseVersionString(version);
- }
-
- public String toString() {
- return ((mVersion >> 16) % 256) + "." + ((mVersion >> 8) % 256) + "."
- + ((mVersion) % 256);
- }
-
- public boolean isVersionValid() {
- return mIsValid;
- }
-
- @Override
- public int compareTo(OwnCloudVersion another) {
- return another.mVersion == mVersion ? 0
- : another.mVersion < mVersion ? 1 : -1;
- }
-
- private void parseVersionString(String version) {
- try {
- String[] nums = version.split("\\.");
- if (nums.length > 0) {
- mVersion += Integer.parseInt(nums[0]);
- }
- mVersion = mVersion << 8;
- if (nums.length > 1) {
- mVersion += Integer.parseInt(nums[1]);
- }
- mVersion = mVersion << 8;
- if (nums.length > 2) {
- mVersion += Integer.parseInt(nums[2]);
- }
- mIsValid = true;
- } catch (Exception e) {
- mIsValid = false;
- }
- }
-}
import java.lang.reflect.Method;
import com.owncloud.android.R;
+
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package eu.alefzero.webdav;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.nio.ByteBuffer;
-import java.nio.channels.FileChannel;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.apache.commons.httpclient.methods.RequestEntity;
-
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.network.ProgressiveDataTransferer;
-
-import eu.alefzero.webdav.OnDatatransferProgressListener;
-
-
-/**
- * A RequestEntity that represents a PIECE of a file.
- *
- * @author David A. Velasco
- */
-public class ChunkFromFileChannelRequestEntity implements RequestEntity, ProgressiveDataTransferer {
-
- private static final String TAG = ChunkFromFileChannelRequestEntity.class.getSimpleName();
-
- //private final File mFile;
- private final FileChannel mChannel;
- private final String mContentType;
- private final long mChunkSize;
- private final File mFile;
- private long mOffset;
- private long mTransferred;
- Set<OnDatatransferProgressListener> mDataTransferListeners = new HashSet<OnDatatransferProgressListener>();
- private ByteBuffer mBuffer = ByteBuffer.allocate(4096);
-
- public ChunkFromFileChannelRequestEntity(final FileChannel channel, final String contentType, long chunkSize, final File file) {
- super();
- if (channel == null) {
- throw new IllegalArgumentException("File may not be null");
- }
- if (chunkSize <= 0) {
- throw new IllegalArgumentException("Chunk size must be greater than zero");
- }
- mChannel = channel;
- mContentType = contentType;
- mChunkSize = chunkSize;
- mFile = file;
- mOffset = 0;
- mTransferred = 0;
- }
-
- public void setOffset(long offset) {
- mOffset = offset;
- }
-
- public long getContentLength() {
- try {
- return Math.min(mChunkSize, mChannel.size() - mChannel.position());
- } catch (IOException e) {
- return mChunkSize;
- }
- }
-
- public String getContentType() {
- return mContentType;
- }
-
- public boolean isRepeatable() {
- return true;
- }
-
- @Override
- public void addDatatransferProgressListener(OnDatatransferProgressListener listener) {
- synchronized (mDataTransferListeners) {
- mDataTransferListeners.add(listener);
- }
- }
-
- @Override
- public void addDatatransferProgressListeners(Collection<OnDatatransferProgressListener> listeners) {
- synchronized (mDataTransferListeners) {
- mDataTransferListeners.addAll(listeners);
- }
- }
-
- @Override
- public void removeDatatransferProgressListener(OnDatatransferProgressListener listener) {
- synchronized (mDataTransferListeners) {
- mDataTransferListeners.remove(listener);
- }
- }
-
-
- public void writeRequest(final OutputStream out) throws IOException {
- int readCount = 0;
- Iterator<OnDatatransferProgressListener> it = null;
-
- try {
- mChannel.position(mOffset);
- long size = mFile.length();
- if (size == 0) size = -1;
- while (mChannel.position() < mOffset + mChunkSize && mChannel.position() < mChannel.size()) {
- readCount = mChannel.read(mBuffer);
- out.write(mBuffer.array(), 0, readCount);
- mBuffer.clear();
- mTransferred += readCount;
- synchronized (mDataTransferListeners) {
- it = mDataTransferListeners.iterator();
- while (it.hasNext()) {
- it.next().onTransferProgress(readCount, mTransferred, size, mFile.getName());
- }
- }
- }
-
- } catch (IOException io) {
- Log_OC.e(TAG, io.getMessage());
- throw new RuntimeException("Ugly solution to workaround the default policy of retries when the server falls while uploading ; temporal fix; really", io);
-
- }
- }
-
-}
\ No newline at end of file
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package eu.alefzero.webdav;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.RandomAccessFile;
-import java.nio.ByteBuffer;
-import java.nio.channels.FileChannel;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.apache.commons.httpclient.methods.RequestEntity;
-
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.network.ProgressiveDataTransferer;
-
-import eu.alefzero.webdav.OnDatatransferProgressListener;
-
-
-/**
- * A RequestEntity that represents a File.
- *
- */
-public class FileRequestEntity implements RequestEntity, ProgressiveDataTransferer {
-
- final File mFile;
- final String mContentType;
- Set<OnDatatransferProgressListener> mDataTransferListeners = new HashSet<OnDatatransferProgressListener>();
-
- public FileRequestEntity(final File file, final String contentType) {
- super();
- this.mFile = file;
- this.mContentType = contentType;
- if (file == null) {
- throw new IllegalArgumentException("File may not be null");
- }
- }
-
- @Override
- public long getContentLength() {
- return mFile.length();
- }
-
- @Override
- public String getContentType() {
- return mContentType;
- }
-
- @Override
- public boolean isRepeatable() {
- return true;
- }
-
- @Override
- public void addDatatransferProgressListener(OnDatatransferProgressListener listener) {
- synchronized (mDataTransferListeners) {
- mDataTransferListeners.add(listener);
- }
- }
-
- @Override
- public void addDatatransferProgressListeners(Collection<OnDatatransferProgressListener> listeners) {
- synchronized (mDataTransferListeners) {
- mDataTransferListeners.addAll(listeners);
- }
- }
-
- @Override
- public void removeDatatransferProgressListener(OnDatatransferProgressListener listener) {
- synchronized (mDataTransferListeners) {
- mDataTransferListeners.remove(listener);
- }
- }
-
-
- @Override
- public void writeRequest(final OutputStream out) throws IOException {
- //byte[] tmp = new byte[4096];
- ByteBuffer tmp = ByteBuffer.allocate(4096);
- int readResult = 0;
-
- // TODO(bprzybylski): each mem allocation can throw OutOfMemoryError we need to handle it
- // globally in some fashionable manner
- RandomAccessFile raf = new RandomAccessFile(mFile, "r");
- FileChannel channel = raf.getChannel();
- Iterator<OnDatatransferProgressListener> it = null;
- long transferred = 0;
- long size = mFile.length();
- if (size == 0) size = -1;
- try {
- while ((readResult = channel.read(tmp)) >= 0) {
- out.write(tmp.array(), 0, readResult);
- tmp.clear();
- transferred += readResult;
- synchronized (mDataTransferListeners) {
- it = mDataTransferListeners.iterator();
- while (it.hasNext()) {
- it.next().onTransferProgress(readResult, transferred, size, mFile.getName());
- }
- }
- }
-
- } catch (IOException io) {
- Log_OC.e("FileRequestException", io.getMessage());
- throw new RuntimeException("Ugly solution to workaround the default policy of retries when the server falls while uploading ; temporal fix; really", io);
-
- } finally {
- channel.close();
- raf.close();
- }
- }
-
-}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package eu.alefzero.webdav;
-
-public interface OnDatatransferProgressListener {
- public void onTransferProgress(long progressRate);
- public void onTransferProgress(long progressRate, long totalTransferredSoFar, long totalToTransfer, String fileName);
-}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2011 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-package eu.alefzero.webdav;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.apache.commons.httpclient.Credentials;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpConnectionManager;
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.HttpMethodBase;
-import org.apache.commons.httpclient.HttpVersion;
-import org.apache.commons.httpclient.UsernamePasswordCredentials;
-import org.apache.commons.httpclient.auth.AuthScope;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.commons.httpclient.methods.HeadMethod;
-import org.apache.commons.httpclient.methods.PutMethod;
-import org.apache.commons.httpclient.params.HttpMethodParams;
-import org.apache.http.HttpStatus;
-import org.apache.http.params.CoreProtocolPNames;
-import org.apache.jackrabbit.webdav.client.methods.DavMethod;
-import org.apache.jackrabbit.webdav.client.methods.DeleteMethod;
-import org.apache.jackrabbit.webdav.client.methods.MkColMethod;
-
-import com.owncloud.android.Log_OC;
-
-import android.net.Uri;
-import android.util.Log;
-
-public class WebdavClient extends HttpClient {
- private Uri mUri;
- private Credentials mCredentials;
- final private static String TAG = "WebdavClient";
- private static final String USER_AGENT = "Android-ownCloud";
-
- private OnDatatransferProgressListener mDataTransferListener;
- static private byte[] sExhaustBuffer = new byte[1024];
-
- /**
- * Constructor
- */
- public WebdavClient(HttpConnectionManager connectionMgr) {
- super(connectionMgr);
- Log_OC.d(TAG, "Creating WebdavClient");
- getParams().setParameter(HttpMethodParams.USER_AGENT, USER_AGENT);
- getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
- }
-
- public void setCredentials(String username, String password) {
- getParams().setAuthenticationPreemptive(true);
- getState().setCredentials(AuthScope.ANY,
- getCredentials(username, password));
- }
-
- private Credentials getCredentials(String username, String password) {
- if (mCredentials == null)
- mCredentials = new UsernamePasswordCredentials(username, password);
- return mCredentials;
- }
-
- /**
- * Downloads a file in remoteFilepath to the local targetPath.
- *
- * @param remoteFilepath Path to the file in the remote server, URL DECODED.
- * @param targetFile Local path to save the downloaded file.
- * @return 'True' when the file is successfully downloaded.
- */
- public boolean downloadFile(String remoteFilePath, File targetFile) {
- boolean ret = false;
- GetMethod get = new GetMethod(mUri.toString() + WebdavUtils.encodePath(remoteFilePath));
-
- try {
- int status = executeMethod(get);
- if (status == HttpStatus.SC_OK) {
- targetFile.createNewFile();
- BufferedInputStream bis = new BufferedInputStream(
- get.getResponseBodyAsStream());
- FileOutputStream fos = new FileOutputStream(targetFile);
-
- byte[] bytes = new byte[4096];
- int readResult;
- while ((readResult = bis.read(bytes)) != -1) {
- if (mDataTransferListener != null)
- mDataTransferListener.onTransferProgress(readResult);
- fos.write(bytes, 0, readResult);
- }
- fos.close();
- ret = true;
- } else {
- exhaustResponse(get.getResponseBodyAsStream());
- }
- Log_OC.e(TAG, "Download of " + remoteFilePath + " to " + targetFile + " finished with HTTP status " + status + (!ret?"(FAIL)":""));
-
- } catch (Exception e) {
- logException(e, "dowloading " + remoteFilePath);
-
- } finally {
- if (!ret && targetFile.exists()) {
- targetFile.delete();
- }
- get.releaseConnection(); // let the connection available for other methods
- }
- return ret;
- }
-
- /**
- * Deletes a remote file via webdav
- * @param remoteFilePath Remote file path of the file to delete, in URL DECODED format.
- * @return
- */
- public boolean deleteFile(String remoteFilePath) {
- boolean ret = false;
- DavMethod delete = new DeleteMethod(mUri.toString() + WebdavUtils.encodePath(remoteFilePath));
- try {
- int status = executeMethod(delete);
- ret = (status == HttpStatus.SC_OK || status == HttpStatus.SC_ACCEPTED || status == HttpStatus.SC_NO_CONTENT);
- exhaustResponse(delete.getResponseBodyAsStream());
-
- Log_OC.e(TAG, "DELETE of " + remoteFilePath + " finished with HTTP status " + status + (!ret?"(FAIL)":""));
-
- } catch (Exception e) {
- logException(e, "deleting " + remoteFilePath);
-
- } finally {
- delete.releaseConnection(); // let the connection available for other methods
- }
- return ret;
- }
-
-
- public void setDataTransferProgressListener(OnDatatransferProgressListener listener) {
- mDataTransferListener = listener;
- }
-
- /**
- * Creates or update a file in the remote server with the contents of a local file.
- *
- * @param localFile Path to the local file to upload.
- * @param remoteTarget Remote path to the file to create or update, URL DECODED
- * @param contentType MIME type of the file.
- * @return Status HTTP code returned by the server.
- * @throws IOException When a transport error that could not be recovered occurred while uploading the file to the server.
- * @throws HttpException When a violation of the HTTP protocol occurred.
- */
- public int putFile(String localFile, String remoteTarget, String contentType) throws HttpException, IOException {
- int status = -1;
- PutMethod put = new PutMethod(mUri.toString() + WebdavUtils.encodePath(remoteTarget));
-
- try {
- File f = new File(localFile);
- FileRequestEntity entity = new FileRequestEntity(f, contentType);
- entity.addDatatransferProgressListener(mDataTransferListener);
- put.setRequestEntity(entity);
- status = executeMethod(put);
-
- exhaustResponse(put.getResponseBodyAsStream());
-
- } finally {
- put.releaseConnection(); // let the connection available for other methods
- }
- return status;
- }
-
- /**
- * Tries to log in to the current URI, with the current credentials
- *
- * @return A {@link HttpStatus}-Code of the result. SC_OK is good.
- */
- public int tryToLogin() {
- int status = 0;
- HeadMethod head = new HeadMethod(mUri.toString());
- try {
- status = executeMethod(head);
- boolean result = status == HttpStatus.SC_OK;
- Log_OC.d(TAG, "HEAD for " + mUri + " finished with HTTP status " + status + (!result?"(FAIL)":""));
- exhaustResponse(head.getResponseBodyAsStream());
-
- } catch (Exception e) {
- logException(e, "trying to login at " + mUri.toString());
-
- } finally {
- head.releaseConnection();
- }
- return status;
- }
-
- /**
- * Creates a remote directory with the received path.
- *
- * @param path Path of the directory to create, URL DECODED
- * @return 'True' when the directory is successfully created
- */
- public boolean createDirectory(String path) {
- boolean result = false;
- int status = -1;
- MkColMethod mkcol = new MkColMethod(mUri.toString() + WebdavUtils.encodePath(path));
- try {
- Log_OC.d(TAG, "Creating directory " + path);
- status = executeMethod(mkcol);
- Log_OC.d(TAG, "Status returned: " + status);
- result = mkcol.succeeded();
-
- Log_OC.d(TAG, "MKCOL to " + path + " finished with HTTP status " + status + (!result?"(FAIL)":""));
- exhaustResponse(mkcol.getResponseBodyAsStream());
-
- } catch (Exception e) {
- logException(e, "creating directory " + path);
-
- } finally {
- mkcol.releaseConnection(); // let the connection available for other methods
- }
- return result;
- }
-
-
- /**
- * Check if a file exists in the OC server
- *
- * @return 'true' if the file exists; 'false' it doesn't exist
- * @throws Exception When the existence could not be determined
- */
- public boolean existsFile(String path) throws IOException, HttpException {
- HeadMethod head = new HeadMethod(mUri.toString() + WebdavUtils.encodePath(path));
- try {
- int status = executeMethod(head);
- Log_OC.d(TAG, "HEAD to " + path + " finished with HTTP status " + status + ((status != HttpStatus.SC_OK)?"(FAIL)":""));
- exhaustResponse(head.getResponseBodyAsStream());
- return (status == HttpStatus.SC_OK);
-
- } finally {
- head.releaseConnection(); // let the connection available for other methods
- }
- }
-
- /**
- * Requests the received method with the received timeout (milliseconds).
- *
- * Executes the method through the inherited HttpClient.executedMethod(method).
- *
- * Sets the socket and connection timeouts only for the method received.
- *
- * The timeouts are both in milliseconds; 0 means 'infinite'; < 0 means 'do not change the default'
- *
- * @param method HTTP method request.
- * @param readTimeout Timeout to set for data reception
- * @param conntionTimout Timeout to set for connection establishment
- */
- public int executeMethod(HttpMethodBase method, int readTimeout, int connectionTimeout) throws HttpException, IOException {
- int oldSoTimeout = getParams().getSoTimeout();
- int oldConnectionTimeout = getHttpConnectionManager().getParams().getConnectionTimeout();
- try {
- if (readTimeout >= 0) {
- method.getParams().setSoTimeout(readTimeout); // this should be enough...
- getParams().setSoTimeout(readTimeout); // ... but this looks like necessary for HTTPS
- }
- if (connectionTimeout >= 0) {
- getHttpConnectionManager().getParams().setConnectionTimeout(connectionTimeout);
- }
- return executeMethod(method);
- } finally {
- getParams().setSoTimeout(oldSoTimeout);
- getHttpConnectionManager().getParams().setConnectionTimeout(oldConnectionTimeout);
- }
- }
-
- /**
- * Exhausts a not interesting HTTP response. Encouraged by HttpClient documentation.
- *
- * @param responseBodyAsStream InputStream with the HTTP response to exhaust.
- */
- public void exhaustResponse(InputStream responseBodyAsStream) {
- if (responseBodyAsStream != null) {
- try {
- while (responseBodyAsStream.read(sExhaustBuffer) >= 0);
- responseBodyAsStream.close();
-
- } catch (IOException io) {
- Log_OC.e(TAG, "Unexpected exception while exhausting not interesting HTTP response; will be IGNORED", io);
- }
- }
- }
-
- /**
- * Logs an exception triggered in a HTTP request.
- *
- * @param e Caught exception.
- * @param doing Suffix to add at the end of the logged message.
- */
- private void logException(Exception e, String doing) {
- if (e instanceof HttpException) {
- Log_OC.e(TAG, "HTTP violation while " + doing, e);
-
- } else if (e instanceof IOException) {
- Log_OC.e(TAG, "Unrecovered transport exception while " + doing, e);
-
- } else {
- Log_OC.e(TAG, "Unexpected exception while " + doing, e);
- }
- }
-
-
- /**
- * Sets the connection and wait-for-data timeouts to be applied by default to the methods performed by this client.
- */
- public void setDefaultTimeouts(int defaultDataTimeout, int defaultConnectionTimeout) {
- getParams().setSoTimeout(defaultDataTimeout);
- getHttpConnectionManager().getParams().setConnectionTimeout(defaultConnectionTimeout);
- }
-
- /**
- * Sets the base URI for the helper methods that receive paths as parameters, instead of full URLs
- * @param uri
- */
- public void setBaseUri(Uri uri) {
- mUri = uri;
- }
-
- public Uri getBaseUri() {
- return mUri;
- }
-
-}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 ownCloud
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-package eu.alefzero.webdav;
-
-import java.util.Date;
-
-import org.apache.jackrabbit.webdav.MultiStatusResponse;
-import org.apache.jackrabbit.webdav.property.DavProperty;
-import org.apache.jackrabbit.webdav.property.DavPropertyName;
-import org.apache.jackrabbit.webdav.property.DavPropertySet;
-
-import com.owncloud.android.Log_OC;
-
-import android.net.Uri;
-import android.util.Log;
-
-public class WebdavEntry {
- private String mName, mPath, mUri, mContentType;
- private long mContentLength, mCreateTimestamp, mModifiedTimestamp;
-
- public WebdavEntry(MultiStatusResponse ms, String splitElement) {
- resetData();
- if (ms.getStatus().length != 0) {
- mUri = ms.getHref();
-
- mPath = mUri.split(splitElement, 2)[1];
-
- int status = ms.getStatus()[0].getStatusCode();
- DavPropertySet propSet = ms.getProperties(status);
- @SuppressWarnings("rawtypes")
- DavProperty prop = propSet.get(DavPropertyName.DISPLAYNAME);
- if (prop != null)
- mName = (String) prop.getName().toString();
- else {
- String[] tmp = mPath.split("/");
- if (tmp.length > 0)
- mName = tmp[tmp.length - 1];
- }
-
- // use unknown mimetype as default behavior
- mContentType = "application/octet-stream";
- prop = propSet.get(DavPropertyName.GETCONTENTTYPE);
- if (prop != null) {
- mContentType = (String) prop.getValue();
- // dvelasco: some builds of ownCloud server 4.0.x added a trailing ';' to the MIME type ; if looks fixed, but let's be cautious
- if (mContentType.indexOf(";") >= 0) {
- mContentType = mContentType.substring(0, mContentType.indexOf(";"));
- }
- }
-
- // check if it's a folder in the standard way: see RFC2518 12.2 . RFC4918 14.3
- prop = propSet.get(DavPropertyName.RESOURCETYPE);
- if (prop!= null) {
- Object value = prop.getValue();
- if (value != null) {
- mContentType = "DIR"; // a specific attribute would be better, but this is enough; unless while we have no reason to distinguish MIME types for folders
- }
- }
-
- prop = propSet.get(DavPropertyName.GETCONTENTLENGTH);
- if (prop != null)
- mContentLength = Long.parseLong((String) prop.getValue());
-
- prop = propSet.get(DavPropertyName.GETLASTMODIFIED);
- if (prop != null) {
- Date d = WebdavUtils
- .parseResponseDate((String) prop.getValue());
- mModifiedTimestamp = (d != null) ? d.getTime() : 0;
- }
-
- prop = propSet.get(DavPropertyName.CREATIONDATE);
- if (prop != null) {
- Date d = WebdavUtils
- .parseResponseDate((String) prop.getValue());
- mCreateTimestamp = (d != null) ? d.getTime() : 0;
- }
-
- } else {
- Log_OC.e("WebdavEntry",
- "General fuckup, no status for webdav response");
- }
- }
-
- public String path() {
- return mPath;
- }
-
- public String decodedPath() {
- return Uri.decode(mPath);
- }
-
- public String name() {
- return mName;
- }
-
- public boolean isDirectory() {
- return mContentType.equals("DIR");
- }
-
- public String contentType() {
- return mContentType;
- }
-
- public String uri() {
- return mUri;
- }
-
- public long contentLength() {
- return mContentLength;
- }
-
- public long createTimestamp() {
- return mCreateTimestamp;
- }
-
- public long modifiedTimestamp() {
- return mModifiedTimestamp;
- }
-
- private void resetData() {
- mName = mUri = mContentType = null;
- mContentLength = mCreateTimestamp = mModifiedTimestamp = 0;
- }
-}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package eu.alefzero.webdav;
-
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Locale;
-
-import android.net.Uri;
-
-public class WebdavUtils {
- public static final SimpleDateFormat DISPLAY_DATE_FORMAT = new SimpleDateFormat(
- "dd.MM.yyyy hh:mm");
- private static final SimpleDateFormat DATETIME_FORMATS[] = {
- new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US),
- new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US),
- new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.sss'Z'", Locale.US),
- new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US),
- new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US),
- new SimpleDateFormat("EEEEEE, dd-MMM-yy HH:mm:ss zzz", Locale.US),
- new SimpleDateFormat("EEE MMMM d HH:mm:ss yyyy", Locale.US) };
-
- public static String prepareXmlForPropFind() {
- String ret = "<?xml version=\"1.0\" ?><D:propfind xmlns:D=\"DAV:\"><D:allprop/></D:propfind>";
- return ret;
- }
-
- public static String prepareXmlForPatch() {
- return "<?xml version=\"1.0\" ?><D:propertyupdate xmlns:D=\"DAV:\"></D:propertyupdate>";
- }
-
- public static Date parseResponseDate(String date) {
- Date returnDate = null;
- for (int i = 0; i < DATETIME_FORMATS.length; ++i) {
- try {
- returnDate = DATETIME_FORMATS[i].parse(date);
- return returnDate;
- } catch (ParseException e) {
- }
- }
- return null;
- }
-
- /**
- * Encodes a path according to URI RFC 2396.
- *
- * If the received path doesn't start with "/", the method adds it.
- *
- * @param remoteFilePath Path
- * @return Encoded path according to RFC 2396, always starting with "/"
- */
- public static String encodePath(String remoteFilePath) {
- String encodedPath = Uri.encode(remoteFilePath, "/");
- if (!encodedPath.startsWith("/"))
- encodedPath = "/" + encodedPath;
- return encodedPath;
- }
-
-}
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry combineaccessrules="false" kind="src" path="/owncloud-android"/>
- <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
- <classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
- <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/owncloud-android"/>
+ <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
+ <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
+ <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>
--- /dev/null
+eclipse.preferences.version=1
+<<<<<<< HEAD
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+=======
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+>>>>>>> develop
+org.eclipse.jdt.core.compiler.source=1.6
<uses-library android:name="android.test.runner" />
</application>
<!--
- This declares that this application uses the instrumentation test runner targeting
- the package of com.owncloud.android.test. To run the tests use the command:
- "adb shell am instrument -w com.owncloud.android.tests/android.test.InstrumentationTestRunner"
+ This declares that this application uses the instrumentation test runner targeting
+ the package of com.owncloud.android.test. To run the tests use the command:
+ "adb shell am instrument -w com.owncloud.android.tests/android.test.InstrumentationTestRunner"
-->
<instrumentation android:name="android.test.InstrumentationTestRunner"
- android:targetPackage="com.owncloud.android"
- android:label="Tests for com.owncloud.android"/>
+ android:targetPackage="com.owncloud.android"
+ android:label="Tests for com.owncloud.android"/>
</manifest>
--- /dev/null
+# This file is used to override default values used by the Ant build system.
+#
+# This file must be checked into Version Control Systems, as it is
+# integral to the build system of your project.
+
+# This file is only used by the Ant script.
+
+# You can use this to override default values such as
+# 'source.dir' for the location of your java source folder and
+# 'out.dir' for the location of your output folder.
+
+# You can also use it define how the release builds are signed by declaring
+# the following properties:
+# 'key.store' for the location of your keystore and
+# 'key.alias' for the name of the key to use.
+# The password will be asked during the build when you use the 'release' target.
+
+tested.project.dir=..
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="ownCloudTest" default="help">
+
+ <!-- The local.properties file is created and updated by the 'android' tool.
+ It contains the path to the SDK. It should *NOT* be checked into
+ Version Control Systems. -->
+ <property file="local.properties" />
+
+ <!-- The ant.properties file can be created by you. It is only edited by the
+ 'android' tool to add properties to it.
+ This is the place to change some Ant specific build properties.
+ Here are some properties you may want to change/update:
+
+ source.dir
+ The name of the source directory. Default is 'src'.
+ out.dir
+ The name of the output directory. Default is 'bin'.
+
+ For other overridable properties, look at the beginning of the rules
+ files in the SDK, at tools/ant/build.xml
+
+ Properties related to the SDK location or the project target should
+ be updated using the 'android' tool with the 'update' action.
+
+ This file is an integral part of the build system for your
+ application and should be checked into Version Control Systems.
+
+ -->
+ <property file="ant.properties" />
+
+ <!-- if sdk.dir was not set from one of the property file, then
+ get it from the ANDROID_HOME env var.
+ This must be done before we load project.properties since
+ the proguard config can use sdk.dir -->
+ <property environment="env" />
+ <condition property="sdk.dir" value="${env.ANDROID_HOME}">
+ <isset property="env.ANDROID_HOME" />
+ </condition>
+
+ <!-- The project.properties file is created and updated by the 'android'
+ tool, as well as ADT.
+
+ This contains project specific properties such as project target, and library
+ dependencies. Lower level build properties are stored in ant.properties
+ (or in .classpath for Eclipse projects).
+
+ This file is an integral part of the build system for your
+ application and should be checked into Version Control Systems. -->
+ <loadproperties srcFile="project.properties" />
+
+ <!-- quick check on sdk.dir -->
+ <fail
+ message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
+ unless="sdk.dir"
+ />
+
+ <!--
+ Import per project custom build rules if present at the root of the project.
+ This is the place to put custom intermediary targets such as:
+ -pre-build
+ -pre-compile
+ -post-compile (This is typically used for code obfuscation.
+ Compiled code location: ${out.classes.absolute.dir}
+ If this is not done in place, override ${out.dex.input.absolute.dir})
+ -post-package
+ -post-build
+ -pre-clean
+ -->
+ <import file="custom_rules.xml" optional="true" />
+
+ <!-- Import the actual build file.
+
+ To customize existing targets, there are two options:
+ - Customize only one target:
+ - copy/paste the target into this file, *before* the
+ <import> task.
+ - customize it to your needs.
+ - Customize the whole content of build.xml
+ - copy/paste the content of the rules files (minus the top node)
+ into this file, replacing the <import> task.
+ - customize to your needs.
+
+ ***********************
+ ****** IMPORTANT ******
+ ***********************
+ In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
+ in order to avoid having your file be overridden by tools such as "android update project"
+ -->
+ <!-- version-tag: 1 -->
+ <import file="${sdk.dir}/tools/ant/build.xml" />
+
+</project>
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
-target=android-14
+target=android-19
package com.owncloud.android.test;
+import com.owncloud.android.lib.common.accounts.AccountUtils;
+import com.owncloud.android.lib.resources.status.OwnCloudVersion;
+
import android.test.AndroidTestCase;
-import com.owncloud.android.AccountUtils;
-import com.owncloud.android.utils.OwnCloudVersion;
public class AccountUtilsTest extends AndroidTestCase {
OwnCloudVersion ocv45 = new OwnCloudVersion(0x040500);
OwnCloudVersion ocv70 = new OwnCloudVersion(0x070000);
- assertTrue(AccountUtils.getWebdavPath(ocv12).equals("/webdav/owncloud.php"));
- assertTrue(AccountUtils.getWebdavPath(ocv12s).equals("/webdav/owncloud.php"));
- assertTrue(AccountUtils.getWebdavPath(ocv22).equals("/files/webdav.php"));
- assertTrue(AccountUtils.getWebdavPath(ocv30).equals("/files/webdav.php"));
- assertTrue(AccountUtils.getWebdavPath(ocv33s).equals("/files/webdav.php"));
- assertTrue(AccountUtils.getWebdavPath(ocv45).equals("/remote.php/webdav"));
- assertTrue(AccountUtils.getWebdavPath(ocv70).equals("/remote.php/webdav"));
- assertNull(AccountUtils.getWebdavPath(null));
+ assertTrue(AccountUtils.getWebdavPath(ocv12, false, false).equals("/webdav/owncloud.php"));
+ assertTrue(AccountUtils.getWebdavPath(ocv12s, false, false).equals("/webdav/owncloud.php"));
+ assertTrue(AccountUtils.getWebdavPath(ocv22, false, false).equals("/files/webdav.php"));
+ assertTrue(AccountUtils.getWebdavPath(ocv30,false, false).equals("/files/webdav.php"));
+ assertTrue(AccountUtils.getWebdavPath(ocv33s, false, false).equals("/files/webdav.php"));
+ assertTrue(AccountUtils.getWebdavPath(ocv45, false, false).equals("/remote.php/webdav"));
+ assertTrue(AccountUtils.getWebdavPath(ocv70, false, false).equals("/remote.php/webdav"));
+ assertNull(AccountUtils.getWebdavPath(null, false, false));
+ assertTrue(AccountUtils.getWebdavPath(ocv12, true, false).equals("/remote.php/odav"));
+ assertTrue(AccountUtils.getWebdavPath(ocv12s, true, false).equals("/remote.php/odav"));
+ assertTrue(AccountUtils.getWebdavPath(ocv22, true, false).equals("/remote.php/odav"));
+ assertTrue(AccountUtils.getWebdavPath(ocv30, true, false).equals("/remote.php/odav"));
+ assertTrue(AccountUtils.getWebdavPath(ocv33s, true, false).equals("/remote.php/odav"));
+ assertTrue(AccountUtils.getWebdavPath(ocv45, true, false).equals("/remote.php/odav"));
+ assertTrue(AccountUtils.getWebdavPath(ocv70, true, false).equals("/remote.php/odav"));
OwnCloudVersion invalidVer = new OwnCloudVersion("a.b.c");
assertFalse(invalidVer.isVersionValid());
--- /dev/null
+package com.owncloud.android.test;
+
+import com.owncloud.android.db.ProviderMeta.ProviderTableMeta;
+import com.owncloud.android.providers.FileContentProvider;
+import android.annotation.TargetApi;
+import android.net.Uri;
+import android.os.Build;
+import android.test.ProviderTestCase2;
+import android.test.mock.MockContentResolver;
+import android.util.Log;
+
+@TargetApi(Build.VERSION_CODES.CUPCAKE)
+public class FileContentProviderTest extends ProviderTestCase2<FileContentProvider> {
+
+ private static final String TAG = FileContentProvider.class.getName();
+
+ private static MockContentResolver resolve;
+
+ public FileContentProviderTest(Class<FileContentProvider> providerClass,
+ String providerAuthority) {
+ super(providerClass, providerAuthority);
+ // TODO Auto-generated constructor stub
+ }
+
+ public FileContentProviderTest() {
+ super(FileContentProvider.class, "com.owncloud.android.providers.FileContentProvider");
+ }
+
+ @Override
+ public void setUp() {
+ Log.i(TAG, "Entered setup");
+ try {
+ super.setUp();
+ resolve = this.getMockContentResolver();
+ } catch (Exception e) {
+
+ }
+ }
+
+ public void testGetTypeFile() {
+ Uri testuri = Uri.parse("content://org.owncloud/file/");
+ assertEquals(ProviderTableMeta.CONTENT_TYPE_ITEM, resolve.getType(testuri));
+
+ testuri = Uri.parse("content://org.owncloud/file/123");
+ assertEquals(ProviderTableMeta.CONTENT_TYPE_ITEM, resolve.getType(testuri));
+ }
+
+ public void testGetTypeRoot() {
+ Uri testuri = Uri.parse("content://org.owncloud/");
+ assertEquals(ProviderTableMeta.CONTENT_TYPE, resolve.getType(testuri));
+ }
+
+}
+++ /dev/null
-.tx
-*pyc
-*pyo
-*~
-*egg-info*
+++ /dev/null
-Releasing
-=========
-
-To create a new release:
-
-1. Update local rep and update the version in ``setup.py``::
-
- $ hg pull -u
- $ vim setup.py
-
-2. Test::
-
- $ python setup.py clean sdist
- $ cd dist
- $ tar zxf ...
- $ cd transifex-client
- ...test
-
-3. Package and upload on PyPI::
-
- $ python setup.py clean sdist bdist_egg upload
+++ /dev/null
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software
- interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Program does not specify a
-version number of this License, you may choose any version ever
-published by the Free Software Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these
-terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- 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 2 of the License, or
-
- 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.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
-
+++ /dev/null
-include tx
-
-# Docs
-include LICENSE README.rst
-recursive-include docs *
-
+++ /dev/null
-
-=============================
- Transifex Command-Line Tool
-=============================
-
-The Transifex Command-line Client is a command line tool that enables
-you to easily manage your translations within a project without the need
-of an elaborate UI system.
-
-You can use the command line client to easily create new resources, map
-locale files to translations and synchronize your Transifex project with
-your local repository and vice verca. Translators and localization
-managers can also use it to handle large volumes of translation files
-easily and without much hassle.
-
-Check the full documentation at
-http://help.transifex.com/user-guide/client/
-
-
-Installing
-==========
-
-You can install the latest version of transifex-client running ``pip
-install transifex-client`` or ``easy_install transifex-client``
-You can also install the `in-development version`_ of transifex-client
-with ``pip install transifex-client==dev`` or ``easy_install
-transifex-client==dev``.
-
-.. _in-development version: http://code.transifex.com/transifex-client/
-
+++ /dev/null
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-import os
-import glob
-from codecs import BOM
-
-from setuptools import setup, find_packages
-from setuptools.command.build_py import build_py as _build_py
-
-from txclib import get_version
-
-readme_file = open(u'README.rst')
-long_description = readme_file.read()
-readme_file.close()
-if long_description.startswith(BOM):
- long_description = long_description.lstrip(BOM)
-long_description = long_description.decode('utf-8')
-
-package_data = {
- '': ['LICENSE', 'README.rst'],
-}
-
-scripts = ['tx']
-
-install_requires = []
-try:
- import json
-except ImportError:
- install_requires.append('simplejson')
-
-setup(
- name="transifex-client",
- version=get_version(),
- scripts=scripts,
- description="A command line interface for Transifex",
- long_description=long_description,
- author="Transifex",
- author_email="info@transifex.com",
- url="https://www.transifex.com",
- license="GPLv2",
- dependency_links = [
- ],
- setup_requires = [
- ],
- install_requires = install_requires,
- tests_require = ["mock", ],
- data_files=[
- ],
- test_suite="tests",
- zip_safe=False,
- packages=['txclib', ],
- include_package_data=True,
- package_data = package_data,
- keywords = ('translation', 'localization', 'internationalization',),
-)
+++ /dev/null
-# -*- coding: utf-8 -*-
-
-"""
-Unit tests for processor functions.
-"""
-
-import unittest
-from urlparse import urlparse
-from txclib.processors import hostname_tld_migration, hostname_ssl_migration
-
-
-class TestHostname(unittest.TestCase):
- """Test for hostname processors."""
-
- def test_tld_migration_needed(self):
- """
- Test the tld migration of Transifex, when needed.
- """
- hostnames = [
- 'http://transifex.net', 'http://www.transifex.net',
- 'https://fedora.transifex.net',
- ]
- for h in hostnames:
- hostname = hostname_tld_migration(h)
- self.assertTrue(hostname.endswith('com'))
- orig_hostname = 'http://www.transifex.net/path/'
- hostname = hostname_tld_migration(orig_hostname)
- self.assertEqual(hostname, orig_hostname.replace('net', 'com', 1))
-
- def test_tld_migration_needed(self):
- """
- Test that unneeded tld migrations are detected correctly.
- """
- hostnames = [
- 'https://www.transifex.com', 'http://fedora.transifex.com',
- 'http://www.example.net/path/'
- ]
- for h in hostnames:
- hostname = hostname_tld_migration(h)
- self.assertEqual(hostname, h)
-
- def test_no_scheme_specified(self):
- """
- Test that, if no scheme has been specified, the https one will be used.
- """
- hostname = '//transifex.net'
- hostname = hostname_ssl_migration(hostname)
- self.assertTrue(hostname.startswith('https://'))
-
- def test_http_replacement(self):
- """Test the replacement of http with https."""
- hostnames = [
- 'http://transifex.com', 'http://transifex.net/http/',
- 'http://www.transifex.com/path/'
- ]
- for h in hostnames:
- hostname = hostname_ssl_migration(h)
- self.assertEqual(hostname[:8], 'https://')
- self.assertEqual(hostname[7:], h[6:])
-
- def test_no_http_replacement_needed(self):
- """Test that http will not be replaces with https, when not needed."""
- for h in ['http://example.com', 'http://example.com/http/']:
- hostname = hostname_ssl_migration(h)
- self.assertEqual(hostname, hostname)
+++ /dev/null
-# -*- coding: utf-8 -*-
-
-from __future__ import with_statement
-import unittest
-import contextlib
-import itertools
-try:
- import json
-except ImportError:
- import simplejson as json
-from mock import Mock, patch
-
-from txclib.project import Project
-from txclib.config import Flipdict
-
-
-class TestProject(unittest.TestCase):
-
- def test_extract_fields(self):
- """Test the functions that extract a field from a stats object."""
- stats = {
- 'completed': '80%',
- 'last_update': '00:00',
- 'foo': 'bar',
- }
- self.assertEqual(
- stats['completed'], '%s%%' % Project._extract_completed(stats)
- )
- self.assertEqual(stats['last_update'], Project._extract_updated(stats))
-
- def test_specifying_resources(self):
- """Test the various ways to specify resources in a project."""
- p = Project(init=False)
- resources = [
- 'proj1.res1',
- 'proj2.res2',
- 'transifex.txn',
- 'transifex.txo',
- ]
- with patch.object(p, 'get_resource_list') as mock:
- mock.return_value = resources
- cmd_args = [
- 'proj1.res1', '*1*', 'transifex*', '*r*',
- '*o', 'transifex.tx?', 'transifex.txn',
- ]
- results = [
- ['proj1.res1', ],
- ['proj1.res1', ],
- ['transifex.txn', 'transifex.txo', ],
- ['proj1.res1', 'proj2.res2', 'transifex.txn', 'transifex.txo', ],
- ['transifex.txo', ],
- ['transifex.txn', 'transifex.txo', ],
- ['transifex.txn', ],
- [],
- ]
-
- for i, arg in enumerate(cmd_args):
- resources = [arg]
- self.assertEqual(p.get_chosen_resources(resources), results[i])
-
- # wrong argument
- resources = ['*trasnifex*', ]
- self.assertRaises(Exception, p.get_chosen_resources, resources)
-
-
-class TestProjectMinimumPercent(unittest.TestCase):
- """Test the minimum-perc option."""
-
- def setUp(self):
- super(TestProjectMinimumPercent, self).setUp()
- self.p = Project(init=False)
- self.p.minimum_perc = None
- self.p.resource = "resource"
-
- def test_cmd_option(self):
- """Test command-line option."""
- self.p.minimum_perc = 20
- results = itertools.cycle([80, 90 ])
- def side_effect(*args):
- return results.next()
-
- with patch.object(self.p, "get_resource_option") as mock:
- mock.side_effect = side_effect
- self.assertFalse(self.p._satisfies_min_translated({'completed': '12%'}))
- self.assertTrue(self.p._satisfies_min_translated({'completed': '20%'}))
- self.assertTrue(self.p._satisfies_min_translated({'completed': '30%'}))
-
- def test_global_only(self):
- """Test only global option."""
- results = itertools.cycle([80, None ])
- def side_effect(*args):
- return results.next()
-
- with patch.object(self.p, "get_resource_option") as mock:
- mock.side_effect = side_effect
- self.assertFalse(self.p._satisfies_min_translated({'completed': '70%'}))
- self.assertTrue(self.p._satisfies_min_translated({'completed': '80%'}))
- self.assertTrue(self.p._satisfies_min_translated({'completed': '90%'}))
-
- def test_local_lower_than_global(self):
- """Test the case where the local option is lower than the global."""
- results = itertools.cycle([80, 70 ])
- def side_effect(*args):
- return results.next()
-
- with patch.object(self.p, "get_resource_option") as mock:
- mock.side_effect = side_effect
- self.assertFalse(self.p._satisfies_min_translated({'completed': '60%'}))
- self.assertTrue(self.p._satisfies_min_translated({'completed': '70%'}))
- self.assertTrue(self.p._satisfies_min_translated({'completed': '80%'}))
- self.assertTrue(self.p._satisfies_min_translated({'completed': '90%'}))
-
- def test_local_higher_than_global(self):
- """Test the case where the local option is lower than the global."""
- results = itertools.cycle([60, 70 ])
- def side_effect(*args):
- return results.next()
-
- with patch.object(self.p, "get_resource_option") as mock:
- mock.side_effect = side_effect
- self.assertFalse(self.p._satisfies_min_translated({'completed': '60%'}))
- self.assertTrue(self.p._satisfies_min_translated({'completed': '70%'}))
- self.assertTrue(self.p._satisfies_min_translated({'completed': '80%'}))
- self.assertTrue(self.p._satisfies_min_translated({'completed': '90%'}))
-
- def test_local_only(self):
- """Test the case where the local option is lower than the global."""
- results = itertools.cycle([None, 70 ])
- def side_effect(*args):
- return results.next()
-
- with patch.object(self.p, "get_resource_option") as mock:
- mock.side_effect = side_effect
- self.assertFalse(self.p._satisfies_min_translated({'completed': '60%'}))
- self.assertTrue(self.p._satisfies_min_translated({'completed': '70%'}))
- self.assertTrue(self.p._satisfies_min_translated({'completed': '80%'}))
- self.assertTrue(self.p._satisfies_min_translated({'completed': '90%'}))
-
- def test_no_option(self):
- """"Test the case there is nothing defined."""
- results = itertools.cycle([None, None ])
- def side_effect(*args):
- return results.next()
-
- with patch.object(self.p, "get_resource_option") as mock:
- mock.side_effect = side_effect
- self.assertTrue(self.p._satisfies_min_translated({'completed': '0%'}))
- self.assertTrue(self.p._satisfies_min_translated({'completed': '10%'}))
- self.assertTrue(self.p._satisfies_min_translated({'completed': '90%'}))
-
-
-class TestProjectFilters(unittest.TestCase):
- """Test filters used to decide whether to push/pull a translation or not."""
-
- def setUp(self):
- super(TestProjectFilters, self).setUp()
- self.p = Project(init=False)
- self.p.minimum_perc = None
- self.p.resource = "resource"
- self.stats = {
- 'en': {
- 'completed': '100%', 'last_update': '2011-11-01 15:00:00',
- }, 'el': {
- 'completed': '60%', 'last_update': '2011-11-01 15:00:00',
- }, 'pt': {
- 'completed': '70%', 'last_update': '2011-11-01 15:00:00',
- },
- }
- self.langs = self.stats.keys()
-
- def test_add_translation(self):
- """Test filters for adding translations.
-
- We do not test here for minimum percentages.
- """
- with patch.object(self.p, "get_resource_option") as mock:
- mock.return_value = None
- should_add = self.p._should_add_translation
- for force in [True, False]:
- for lang in self.langs:
- self.assertTrue(should_add(lang, self.stats, force))
-
- # unknown language
- self.assertFalse(should_add('es', self.stats))
-
- def test_update_translation(self):
- """Test filters for updating a translation.
-
- We do not test here for minimum percentages.
- """
- with patch.object(self.p, "get_resource_option") as mock:
- mock.return_value = None
-
- should_update = self.p._should_update_translation
- force = True
- for lang in self.langs:
- self.assertTrue(should_update(lang, self.stats, 'foo', force))
-
- force = False # reminder
- local_file = 'foo'
-
- # unknown language
- self.assertFalse(should_update('es', self.stats, local_file))
-
- # no local file
- with patch.object(self.p, "_get_time_of_local_file") as time_mock:
- time_mock.return_value = None
- with patch.object(self.p, "get_full_path") as path_mock:
- path_mock.return_value = "foo"
- for lang in self.langs:
- self.assertTrue(
- should_update(lang, self.stats, local_file)
- )
-
- # older local files
- local_times = [self.p._generate_timestamp('2011-11-01 14:00:59')]
- results = itertools.cycle(local_times)
- def side_effect(*args):
- return results.next()
-
- with patch.object(self.p, "_get_time_of_local_file") as time_mock:
- time_mock.side_effect = side_effect
- with patch.object(self.p, "get_full_path") as path_mock:
- path_mock.return_value = "foo"
- for lang in self.langs:
- self.assertTrue(
- should_update(lang, self.stats, local_file)
- )
-
- # newer local files
- local_times = [self.p._generate_timestamp('2011-11-01 15:01:59')]
- results = itertools.cycle(local_times)
- def side_effect(*args):
- return results.next()
-
- with patch.object(self.p, "_get_time_of_local_file") as time_mock:
- time_mock.side_effect = side_effect
- with patch.object(self.p, "get_full_path") as path_mock:
- path_mock.return_value = "foo"
- for lang in self.langs:
- self.assertFalse(
- should_update(lang, self.stats, local_file)
- )
-
- def test_push_translation(self):
- """Test filters for pushing a translation file."""
- with patch.object(self.p, "get_resource_option") as mock:
- mock.return_value = None
-
- local_file = 'foo'
- should_push = self.p._should_push_translation
- force = True
- for lang in self.langs:
- self.assertTrue(should_push(lang, self.stats, local_file, force))
-
- force = False # reminder
-
- # unknown language
- self.assertTrue(should_push('es', self.stats, local_file))
-
- # older local files
- local_times = [self.p._generate_timestamp('2011-11-01 14:00:59')]
- results = itertools.cycle(local_times)
- def side_effect(*args):
- return results.next()
-
- with patch.object(self.p, "_get_time_of_local_file") as time_mock:
- time_mock.side_effect = side_effect
- with patch.object(self.p, "get_full_path") as path_mock:
- path_mock.return_value = "foo"
- for lang in self.langs:
- self.assertFalse(
- should_push(lang, self.stats, local_file)
- )
-
- # newer local files
- local_times = [self.p._generate_timestamp('2011-11-01 15:01:59')]
- results = itertools.cycle(local_times)
- def side_effect(*args):
- return results.next()
-
- with patch.object(self.p, "_get_time_of_local_file") as time_mock:
- time_mock.side_effect = side_effect
- with patch.object(self.p, "get_full_path") as path_mock:
- path_mock.return_value = "foo"
- for lang in self.langs:
- self.assertTrue(
- should_push(lang, self.stats, local_file)
- )
-
-
-class TestProjectPull(unittest.TestCase):
- """Test bits & pieces of the pull method."""
-
- def setUp(self):
- super(TestProjectPull, self).setUp()
- self.p = Project(init=False)
- self.p.minimum_perc = None
- self.p.resource = "resource"
- self.p.host = 'foo'
- self.p.project_slug = 'foo'
- self.p.resource_slug = 'foo'
- self.stats = {
- 'en': {
- 'completed': '100%', 'last_update': '2011-11-01 15:00:00',
- }, 'el': {
- 'completed': '60%', 'last_update': '2011-11-01 15:00:00',
- }, 'pt': {
- 'completed': '70%', 'last_update': '2011-11-01 15:00:00',
- },
- }
- self.langs = self.stats.keys()
- self.files = dict(zip(self.langs, itertools.repeat(None)))
- self.details = {'available_languages': []}
- for lang in self.langs:
- self.details['available_languages'].append({'code': lang})
- self.slang = 'en'
- self.lang_map = Flipdict()
-
- def test_new_translations(self):
- """Test finding new transaltions to add."""
- with patch.object(self.p, 'do_url_request') as resource_mock:
- resource_mock.return_value = json.dumps(self.details)
- files_keys = self.langs
- new_trans = self.p._new_translations_to_add
- for force in [True, False]:
- res = new_trans(
- self.files, self.slang, self.lang_map, self.stats, force
- )
- self.assertEquals(res, set([]))
-
- with patch.object(self.p, '_should_add_translation') as filter_mock:
- filter_mock.return_value = True
- for force in [True, False]:
- res = new_trans(
- {'el': None}, self.slang, self.lang_map, self.stats, force
- )
- self.assertEquals(res, set(['pt']))
- for force in [True, False]:
- res = new_trans(
- {}, self.slang, self.lang_map, self.stats, force
- )
- self.assertEquals(res, set(['el', 'pt']))
-
- files = {}
- files['pt_PT'] = None
- lang_map = {'pt': 'pt_PT'}
- for force in [True, False]:
- res = new_trans(
- files, self.slang, lang_map, self.stats, force
- )
- self.assertEquals(res, set(['el']))
-
- def test_languages_to_pull_empty_initial_list(self):
- """Test determining the languages to pull, when the initial
- list is empty.
- """
- languages = []
- force = False
-
- res = self.p._languages_to_pull(
- languages, self.files, self.lang_map, self.stats, force
- )
- existing = res[0]
- new = res[1]
- self.assertEquals(existing, set(['el', 'en', 'pt']))
- self.assertFalse(new)
-
- del self.files['el']
- self.files['el-gr'] = None
- self.lang_map['el'] = 'el-gr'
- res = self.p._languages_to_pull(
- languages, self.files, self.lang_map, self.stats, force
- )
- existing = res[0]
- new = res[1]
- self.assertEquals(existing, set(['el', 'en', 'pt']))
- self.assertFalse(new)
-
- def test_languages_to_pull_with_initial_list(self):
- """Test determining the languages to pull, then there is a
- language selection from the user.
- """
- languages = ['el', 'en']
- self.lang_map['el'] = 'el-gr'
- del self.files['el']
- self.files['el-gr'] = None
- force = False
-
- with patch.object(self.p, '_should_add_translation') as mock:
- mock.return_value = True
- res = self.p._languages_to_pull(
- languages, self.files, self.lang_map, self.stats, force
- )
- existing = res[0]
- new = res[1]
- self.assertEquals(existing, set(['en', 'el-gr', ]))
- self.assertFalse(new)
-
- mock.return_value = False
- res = self.p._languages_to_pull(
- languages, self.files, self.lang_map, self.stats, force
- )
- existing = res[0]
- new = res[1]
- self.assertEquals(existing, set(['en', 'el-gr', ]))
- self.assertFalse(new)
-
- del self.files['el-gr']
- mock.return_value = True
- res = self.p._languages_to_pull(
- languages, self.files, self.lang_map, self.stats, force
- )
- existing = res[0]
- new = res[1]
- self.assertEquals(existing, set(['en', ]))
- self.assertEquals(new, set(['el', ]))
-
- mock.return_value = False
- res = self.p._languages_to_pull(
- languages, self.files, self.lang_map, self.stats, force
- )
- existing = res[0]
- new = res[1]
- self.assertEquals(existing, set(['en', ]))
- self.assertEquals(new, set([]))
-
- def test_in_combination_with_force_option(self):
- """Test the minumum-perc option along with -f."""
- with patch.object(self.p, 'get_resource_option') as mock:
- mock.return_value = 70
-
- res = self.p._should_download('de', self.stats, None, False)
- self.assertEquals(res, False)
- res = self.p._should_download('el', self.stats, None, False)
- self.assertEquals(res, False)
- res = self.p._should_download('el', self.stats, None, True)
- self.assertEquals(res, False)
- res = self.p._should_download('en', self.stats, None, False)
- self.assertEquals(res, True)
- res = self.p._should_download('en', self.stats, None, True)
- self.assertEquals(res, True)
-
- with patch.object(self.p, '_remote_is_newer') as local_file_mock:
- local_file_mock = False
- res = self.p._should_download('pt', self.stats, None, False)
- self.assertEquals(res, True)
- res = self.p._should_download('pt', self.stats, None, True)
- self.assertEquals(res, True)
-
-
-class TestFormats(unittest.TestCase):
- """Tests for the supported formats."""
-
- def setUp(self):
- self.p = Project(init=False)
-
- def test_extensions(self):
- """Test returning the correct extension for a format."""
- sample_formats = {
- 'PO': {'file-extensions': '.po, .pot'},
- 'QT': {'file-extensions': '.ts'},
- }
- extensions = ['.po', '.ts', '', ]
- with patch.object(self.p, "do_url_request") as mock:
- mock.return_value = json.dumps(sample_formats)
- for (type_, ext) in zip(['PO', 'QT', 'NONE', ], extensions):
- extension = self.p._extension_for(type_)
- self.assertEquals(extension, ext)
-
-
-class TestOptions(unittest.TestCase):
- """Test the methods related to parsing the configuration file."""
-
- def setUp(self):
- self.p = Project(init=False)
-
- def test_get_option(self):
- """Test _get_option method."""
- with contextlib.nested(
- patch.object(self.p, 'get_resource_option'),
- patch.object(self.p, 'config', create=True)
- ) as (rmock, cmock):
- rmock.return_value = 'resource'
- cmock.has_option.return_value = 'main'
- cmock.get.return_value = 'main'
- self.assertEqual(self.p._get_option(None, None), 'resource')
- rmock.return_value = None
- cmock.has_option.return_value = 'main'
- cmock.get.return_value = 'main'
- self.assertEqual(self.p._get_option(None, None), 'main')
- cmock.has_option.return_value = None
- self.assertIs(self.p._get_option(None, None), None)
-
-
-class TestConfigurationOptions(unittest.TestCase):
- """Test the various configuration options."""
-
- def test_i18n_type(self):
- p = Project(init=False)
- type_string = 'type'
- i18n_type = 'PO'
- with patch.object(p, 'config', create=True) as config_mock:
- p.set_i18n_type([], i18n_type)
- calls = config_mock.method_calls
- self.assertEquals('set', calls[0][0])
- self.assertEquals('main', calls[0][1][0])
- p.set_i18n_type(['transifex.txo'], 'PO')
- calls = config_mock.method_calls
- self.assertEquals('set', calls[0][0])
- p.set_i18n_type(['transifex.txo', 'transifex.txn'], 'PO')
- calls = config_mock.method_calls
- self.assertEquals('set', calls[0][0])
- self.assertEquals('set', calls[1][0])
-
-
-class TestStats(unittest.TestCase):
- """Test the access to the stats objects."""
-
- def setUp(self):
- self.stats = Mock()
- self.stats.__getitem__ = Mock()
- self.stats.__getitem__.return_value = '12%'
-
- def test_field_used_per_mode(self):
- """Test the fields used for each mode."""
- Project._extract_completed(self.stats, 'translate')
- self.stats.__getitem__.assert_called_with('completed')
- Project._extract_completed(self.stats, 'reviewed')
- self.stats.__getitem__.assert_called_with('reviewed_percentage')
-
+++ /dev/null
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from optparse import OptionParser, OptionValueError
-import os
-import sys
-
-from txclib import utils
-from txclib import get_version
-from txclib.log import set_log_level, logger
-
-reload(sys) # WTF? Otherwise setdefaultencoding doesn't work
-
-# This block ensures that ^C interrupts are handled quietly.
-try:
- import signal
-
- def exithandler(signum,frame):
- signal.signal(signal.SIGINT, signal.SIG_IGN)
- signal.signal(signal.SIGTERM, signal.SIG_IGN)
- sys.exit(1)
-
- signal.signal(signal.SIGINT, exithandler)
- signal.signal(signal.SIGTERM, exithandler)
- if hasattr(signal, 'SIGPIPE'):
- signal.signal(signal.SIGPIPE, signal.SIG_DFL)
-
-except KeyboardInterrupt:
- sys.exit(1)
-
-# When we open file with f = codecs.open we specifi FROM what encoding to read
-# This sets the encoding for the strings which are created with f.read()
-sys.setdefaultencoding('utf-8')
-
-
-def main(argv):
- """
- Here we parse the flags (short, long) and we instantiate the classes.
- """
- usage = "usage: %prog [options] command [cmd_options]"
- description = "This is the Transifex command line client which"\
- " allows you to manage your translations locally and sync"\
- " them with the master Transifex server.\nIf you'd like to"\
- " check the available commands issue `%prog help` or if you"\
- " just want help with a specific command issue `%prog help"\
- " command`"
-
- parser = OptionParser(
- usage=usage, version=get_version(), description=description
- )
- parser.disable_interspersed_args()
- parser.add_option(
- "-d", "--debug", action="store_true", dest="debug",
- default=False, help=("enable debug messages")
- )
- parser.add_option(
- "-q", "--quiet", action="store_true", dest="quiet",
- default=False, help="don't print status messages to stdout"
- )
- parser.add_option(
- "-r", "--root", action="store", dest="root_dir", type="string",
- default=None, help="change root directory (default is cwd)"
- )
- parser.add_option(
- "--traceback", action="store_true", dest="trace", default=False,
- help="print full traceback on exceptions"
- )
- parser.add_option(
- "--disable-colors", action="store_true", dest="color_disable",
- default=(os.name == 'nt' or not sys.stdout.isatty()),
- help="disable colors in the output of commands"
- )
- (options, args) = parser.parse_args()
-
- if len(args) < 1:
- parser.error("No command was given")
-
- utils.DISABLE_COLORS = options.color_disable
-
- # set log level
- if options.quiet:
- set_log_level('WARNING')
- elif options.debug:
- set_log_level('DEBUG')
-
- # find .tx
- path_to_tx = options.root_dir or utils.find_dot_tx()
-
-
- cmd = args[0]
- try:
- utils.exec_command(cmd, args[1:], path_to_tx)
- except utils.UnknownCommandError:
- logger.error("tx: Command %s not found" % cmd)
- except SystemExit:
- sys.exit()
- except:
- import traceback
- if options.trace:
- traceback.print_exc()
- else:
- formatted_lines = traceback.format_exc().splitlines()
- logger.error(formatted_lines[-1])
- sys.exit(1)
-
-# Run baby :) ... run
-if __name__ == "__main__":
- # sys.argv[0] is the name of the script that we’re running.
- main(sys.argv[1:])
+++ /dev/null
-# -*- coding: utf-8 -*-
-
-"""
-Copyright (C) 2010 by Indifex (www.indifex.com), see AUTHORS.
-License: BSD, see LICENSE for details.
-
-For further information visit http://code.indifex.com/transifex-client
-"""
-
-
-VERSION = (0, 9, 0, 'devel')
-
-def get_version():
- version = '%s.%s' % (VERSION[0], VERSION[1])
- if VERSION[2]:
- version = '%s.%s' % (version, VERSION[2])
- if VERSION[3] != 'final':
- version = '%s %s' % (version, VERSION[3])
- return version
+++ /dev/null
-# -*- coding: utf-8 -*-
-"""
-In this file we have all the top level commands for the transifex client.
-Since we're using a way to automatically list them and execute them, when
-adding code to this file you must take care of the following:
- * Added functions must begin with 'cmd_' followed by the actual name of the
- command being used in the command line (eg cmd_init)
- * The description for each function that we display to the user is read from
- the func_doc attribute which reads the doc string. So, when adding
- docstring to a new function make sure you add an oneliner which is
- descriptive and is meant to be seen by the user.
- * When including libraries, it's best if you include modules instead of
- functions because that way our function resolution will work faster and the
- chances of overlapping are minimal
- * All functions should use the OptionParser and should have a usage and
- descripition field.
-"""
-import os
-import re, shutil
-import sys
-from optparse import OptionParser, OptionGroup
-import ConfigParser
-
-
-from txclib import utils, project
-from txclib.utils import parse_json, compile_json, relpath
-from txclib.config import OrderedRawConfigParser
-from txclib.exceptions import UnInitializedError
-from txclib.parsers import delete_parser, help_parser, parse_csv_option, \
- status_parser, pull_parser, set_parser, push_parser, init_parser
-from txclib.log import logger
-
-
-def cmd_init(argv, path_to_tx):
- "Initialize a new transifex project."
- parser = init_parser()
- (options, args) = parser.parse_args(argv)
- if len(args) > 1:
- parser.error("Too many arguments were provided. Aborting...")
- if args:
- path_to_tx = args[0]
- else:
- path_to_tx = os.getcwd()
-
- if os.path.isdir(os.path.join(path_to_tx,".tx")):
- logger.info("tx: There is already a tx folder!")
- reinit = raw_input("Do you want to delete it and reinit the project? [y/N]: ")
- while (reinit != 'y' and reinit != 'Y' and reinit != 'N' and reinit != 'n' and reinit != ''):
- reinit = raw_input("Do you want to delete it and reinit the project? [y/N]: ")
- if not reinit or reinit in ['N', 'n', 'NO', 'no', 'No']:
- return
- # Clean the old settings
- # FIXME: take a backup
- else:
- rm_dir = os.path.join(path_to_tx, ".tx")
- shutil.rmtree(rm_dir)
-
- logger.info("Creating .tx folder...")
- os.mkdir(os.path.join(path_to_tx,".tx"))
-
- # Handle the credentials through transifexrc
- home = os.path.expanduser("~")
- txrc = os.path.join(home, ".transifexrc")
- config = OrderedRawConfigParser()
-
- default_transifex = "https://www.transifex.com"
- transifex_host = options.host or raw_input("Transifex instance [%s]: " % default_transifex)
-
- if not transifex_host:
- transifex_host = default_transifex
- if not transifex_host.startswith(('http://', 'https://')):
- transifex_host = 'https://' + transifex_host
-
- config_file = os.path.join(path_to_tx, ".tx", "config")
- if not os.path.exists(config_file):
- # The path to the config file (.tx/config)
- logger.info("Creating skeleton...")
- config = OrderedRawConfigParser()
- config.add_section('main')
- config.set('main', 'host', transifex_host)
- # Touch the file if it doesn't exist
- logger.info("Creating config file...")
- fh = open(config_file, 'w')
- config.write(fh)
- fh.close()
-
- prj = project.Project(path_to_tx)
- prj.getset_host_credentials(transifex_host, user=options.user,
- password=options.password)
- prj.save()
- logger.info("Done.")
-
-
-def cmd_set(argv, path_to_tx):
- "Add local or remote files under transifex"
- parser = set_parser()
- (options, args) = parser.parse_args(argv)
-
- # Implement options/args checks
- # TODO !!!!!!!
- if options.local:
- try:
- expression = args[0]
- except IndexError:
- parser.error("Please specify an expression.")
- if not options.resource:
- parser.error("Please specify a resource")
- if not options.source_language:
- parser.error("Please specify a source language.")
- if not '<lang>' in expression:
- parser.error("The expression you have provided is not valid.")
- if not utils.valid_slug(options.resource):
- parser.error("Invalid resource slug. The format is <project_slug>"\
- ".<resource_slug> and the valid characters include [_-\w].")
- _auto_local(path_to_tx, options.resource,
- source_language=options.source_language,
- expression = expression, source_file=options.source_file,
- execute=options.execute, regex=False)
- if options.execute:
- _set_minimum_perc(options.resource, options.minimum_perc, path_to_tx)
- _set_mode(options.resource, options.mode, path_to_tx)
- _set_type(options.resource, options.i18n_type, path_to_tx)
- return
-
- if options.remote:
- try:
- url = args[0]
- except IndexError:
- parser.error("Please specify an remote url")
- _auto_remote(path_to_tx, url)
- _set_minimum_perc(options.resource, options.minimum_perc, path_to_tx)
- _set_mode(options.resource, options.mode, path_to_tx)
- return
-
- if options.is_source:
- resource = options.resource
- if not resource:
- parser.error("You must specify a resource name with the"
- " -r|--resource flag.")
-
- lang = options.language
- if not lang:
- parser.error("Please specify a source language.")
-
- if len(args) != 1:
- parser.error("Please specify a file.")
-
- if not utils.valid_slug(resource):
- parser.error("Invalid resource slug. The format is <project_slug>"\
- ".<resource_slug> and the valid characters include [_-\w].")
-
- file = args[0]
- # Calculate relative path
- path_to_file = relpath(file, path_to_tx)
- _set_source_file(path_to_tx, resource, options.language, path_to_file)
- elif options.resource or options.language:
- resource = options.resource
- lang = options.language
-
- if len(args) != 1:
- parser.error("Please specify a file")
-
- # Calculate relative path
- path_to_file = relpath(args[0], path_to_tx)
-
- try:
- _go_to_dir(path_to_tx)
- except UnInitializedError, e:
- utils.logger.error(e)
- return
-
- if not utils.valid_slug(resource):
- parser.error("Invalid resource slug. The format is <project_slug>"\
- ".<resource_slug> and the valid characters include [_-\w].")
- _set_translation(path_to_tx, resource, lang, path_to_file)
-
- _set_mode(options.resource, options.mode, path_to_tx)
- _set_type(options.resource, options.i18n_type, path_to_tx)
- _set_minimum_perc(options.resource, options.minimum_perc, path_to_tx)
-
- logger.info("Done.")
- return
-
-
-def _auto_local(path_to_tx, resource, source_language, expression, execute=False,
- source_file=None, regex=False):
- """Auto configure local project."""
- # The path everything will be relative to
- curpath = os.path.abspath(os.curdir)
-
- # Force expr to be a valid regex expr (escaped) but keep <lang> intact
- expr_re = utils.regex_from_filefilter(expression, curpath)
- expr_rec = re.compile(expr_re)
-
- if not execute:
- logger.info("Only printing the commands which will be run if the "
- "--execute switch is specified.")
-
- # First, let's construct a dictionary of all matching files.
- # Note: Only the last matching file of a language will be stored.
- translation_files = {}
- for root, dirs, files in os.walk(curpath):
- for f in files:
- f_path = os.path.abspath(os.path.join(root, f))
- match = expr_rec.match(f_path)
- if match:
- lang = match.group(1)
- f_path = os.path.abspath(f_path)
- if lang == source_language and not source_file:
- source_file = f_path
- else:
- translation_files[lang] = f_path
-
- if not source_file:
- raise Exception("Could not find a source language file. Please run"
- " set --source manually and then re-run this command or provide"
- " the source file with the -s flag.")
- if execute:
- logger.info("Updating source for resource %s ( %s -> %s )." % (resource,
- source_language, relpath(source_file, path_to_tx)))
- _set_source_file(path_to_tx, resource, source_language,
- relpath(source_file, path_to_tx))
- else:
- logger.info('\ntx set --source -r %(res)s -l %(lang)s %(file)s\n' % {
- 'res': resource,
- 'lang': source_language,
- 'file': relpath(source_file, curpath)})
-
- prj = project.Project(path_to_tx)
- root_dir = os.path.abspath(path_to_tx)
-
- if execute:
- try:
- prj.config.get("%s" % resource, "source_file")
- except ConfigParser.NoSectionError:
- raise Exception("No resource with slug \"%s\" was found.\nRun 'tx set --auto"
- "-local -r %s \"expression\"' to do the initial configuration." % resource)
-
- # Now let's handle the translation files.
- if execute:
- logger.info("Updating file expression for resource %s ( %s )." % (resource,
- expression))
- # Eval file_filter relative to root dir
- file_filter = relpath(os.path.join(curpath, expression),
- path_to_tx)
- prj.config.set("%s" % resource, "file_filter", file_filter)
- else:
- for (lang, f_path) in sorted(translation_files.items()):
- logger.info('tx set -r %(res)s -l %(lang)s %(file)s' % {
- 'res': resource,
- 'lang': lang,
- 'file': relpath(f_path, curpath)})
-
- if execute:
- prj.save()
-
-
-def _auto_remote(path_to_tx, url):
- """
- Initialize a remote release/project/resource to the current directory.
- """
- logger.info("Auto configuring local project from remote URL...")
-
- type, vars = utils.parse_tx_url(url)
- prj = project.Project(path_to_tx)
- username, password = prj.getset_host_credentials(vars['hostname'])
-
- if type == 'project':
- logger.info("Getting details for project %s" % vars['project'])
- proj_info = utils.get_details('project_details',
- username, password,
- hostname = vars['hostname'], project = vars['project'])
- resources = [ '.'.join([vars['project'], r['slug']]) for r in proj_info['resources'] ]
- logger.info("%s resources found. Configuring..." % len(resources))
- elif type == 'release':
- logger.info("Getting details for release %s" % vars['release'])
- rel_info = utils.get_details('release_details',
- username, password, hostname = vars['hostname'],
- project = vars['project'], release = vars['release'])
- resources = []
- for r in rel_info['resources']:
- if r.has_key('project'):
- resources.append('.'.join([r['project']['slug'], r['slug']]))
- else:
- resources.append('.'.join([vars['project'], r['slug']]))
- logger.info("%s resources found. Configuring..." % len(resources))
- elif type == 'resource':
- logger.info("Getting details for resource %s" % vars['resource'])
- resources = [ '.'.join([vars['project'], vars['resource']]) ]
- else:
- raise("Url '%s' is not recognized." % url)
-
- for resource in resources:
- logger.info("Configuring resource %s." % resource)
- proj, res = resource.split('.')
- res_info = utils.get_details('resource_details',
- username, password, hostname = vars['hostname'],
- project = proj, resource=res)
- try:
- source_lang = res_info['source_language_code']
- i18n_type = res_info['i18n_type']
- except KeyError:
- raise Exception("Remote server seems to be running an unsupported version"
- " of Transifex. Either update your server software of fallback"
- " to a previous version of transifex-client.")
- prj.set_remote_resource(
- resource=resource,
- host = vars['hostname'],
- source_lang = source_lang,
- i18n_type = i18n_type)
-
- prj.save()
-
-
-def cmd_push(argv, path_to_tx):
- "Push local files to remote server"
- parser = push_parser()
- (options, args) = parser.parse_args(argv)
- force_creation = options.force_creation
- languages = parse_csv_option(options.languages)
- resources = parse_csv_option(options.resources)
- skip = options.skip_errors
- prj = project.Project(path_to_tx)
- if not (options.push_source or options.push_translations):
- parser.error("You need to specify at least one of the -s|--source,"
- " -t|--translations flags with the push command.")
-
- prj.push(
- force=force_creation, resources=resources, languages=languages,
- skip=skip, source=options.push_source,
- translations=options.push_translations,
- no_interactive=options.no_interactive
- )
- logger.info("Done.")
-
-
-def cmd_pull(argv, path_to_tx):
- "Pull files from remote server to local repository"
- parser = pull_parser()
- (options, args) = parser.parse_args(argv)
- if options.fetchall and options.languages:
- parser.error("You can't user a language filter along with the"\
- " -a|--all option")
- languages = parse_csv_option(options.languages)
- resources = parse_csv_option(options.resources)
- skip = options.skip_errors
- minimum_perc = options.minimum_perc or None
-
- try:
- _go_to_dir(path_to_tx)
- except UnInitializedError, e:
- utils.logger.error(e)
- return
-
- # instantiate the project.Project
- prj = project.Project(path_to_tx)
- prj.pull(
- languages=languages, resources=resources, overwrite=options.overwrite,
- fetchall=options.fetchall, fetchsource=options.fetchsource,
- force=options.force, skip=skip, minimum_perc=minimum_perc,
- mode=options.mode
- )
- logger.info("Done.")
-
-
-def _set_source_file(path_to_tx, resource, lang, path_to_file):
- """Reusable method to set source file."""
- proj, res = resource.split('.')
- if not proj or not res:
- raise Exception("\"%s.%s\" is not a valid resource identifier. It should"
- " be in the following format project_slug.resource_slug." %
- (proj, res))
- if not lang:
- raise Exception("You haven't specified a source language.")
-
- try:
- _go_to_dir(path_to_tx)
- except UnInitializedError, e:
- utils.logger.error(e)
- return
-
- if not os.path.exists(path_to_file):
- raise Exception("tx: File ( %s ) does not exist." %
- os.path.join(path_to_tx, path_to_file))
-
- # instantiate the project.Project
- prj = project.Project(path_to_tx)
- root_dir = os.path.abspath(path_to_tx)
-
- if root_dir not in os.path.normpath(os.path.abspath(path_to_file)):
- raise Exception("File must be under the project root directory.")
-
- logger.info("Setting source file for resource %s.%s ( %s -> %s )." % (
- proj, res, lang, path_to_file))
-
- path_to_file = relpath(path_to_file, root_dir)
-
- prj = project.Project(path_to_tx)
-
- # FIXME: Check also if the path to source file already exists.
- try:
- try:
- prj.config.get("%s.%s" % (proj, res), "source_file")
- except ConfigParser.NoSectionError:
- prj.config.add_section("%s.%s" % (proj, res))
- except ConfigParser.NoOptionError:
- pass
- finally:
- prj.config.set("%s.%s" % (proj, res), "source_file",
- path_to_file)
- prj.config.set("%s.%s" % (proj, res), "source_lang",
- lang)
-
- prj.save()
-
-
-def _set_translation(path_to_tx, resource, lang, path_to_file):
- """Reusable method to set translation file."""
-
- proj, res = resource.split('.')
- if not project or not resource:
- raise Exception("\"%s\" is not a valid resource identifier. It should"
- " be in the following format project_slug.resource_slug." %
- resource)
-
- try:
- _go_to_dir(path_to_tx)
- except UnInitializedError, e:
- utils.logger.error(e)
- return
-
- # Warn the user if the file doesn't exist
- if not os.path.exists(path_to_file):
- logger.info("Warning: File '%s' doesn't exist." % path_to_file)
-
- # instantiate the project.Project
- prj = project.Project(path_to_tx)
- root_dir = os.path.abspath(path_to_tx)
-
- if root_dir not in os.path.normpath(os.path.abspath(path_to_file)):
- raise Exception("File must be under the project root directory.")
-
- if lang == prj.config.get("%s.%s" % (proj, res), "source_lang"):
- raise Exception("tx: You cannot set translation file for the source language."
- " Source languages contain the strings which will be translated!")
-
- logger.info("Updating translations for resource %s ( %s -> %s )." % (resource,
- lang, path_to_file))
- path_to_file = relpath(path_to_file, root_dir)
- prj.config.set("%s.%s" % (proj, res), "trans.%s" % lang,
- path_to_file)
-
- prj.save()
-
-
-def cmd_status(argv, path_to_tx):
- "Print status of current project"
- parser = status_parser()
- (options, args) = parser.parse_args(argv)
- resources = parse_csv_option(options.resources)
- prj = project.Project(path_to_tx)
- resources = prj.get_chosen_resources(resources)
- resources_num = len(resources)
- for idx, res in enumerate(resources):
- p, r = res.split('.')
- logger.info("%s -> %s (%s of %s)" % (p, r, idx + 1, resources_num))
- logger.info("Translation Files:")
- slang = prj.get_resource_option(res, 'source_lang')
- sfile = prj.get_resource_option(res, 'source_file') or "N/A"
- lang_map = prj.get_resource_lang_mapping(res)
- logger.info(" - %s: %s (%s)" % (utils.color_text(slang, "RED"),
- sfile, utils.color_text("source", "YELLOW")))
- files = prj.get_resource_files(res)
- fkeys = files.keys()
- fkeys.sort()
- for lang in fkeys:
- local_lang = lang
- if lang in lang_map.values():
- local_lang = lang_map.flip[lang]
- logger.info(" - %s: %s" % (utils.color_text(local_lang, "RED"),
- files[lang]))
- logger.info("")
-
-
-def cmd_help(argv, path_to_tx):
- """List all available commands"""
- parser = help_parser()
- (options, args) = parser.parse_args(argv)
- if len(args) > 1:
- parser.error("Multiple arguments received. Exiting...")
-
- # Get all commands
- fns = utils.discover_commands()
-
- # Print help for specific command
- if len(args) == 1:
- try:
- fns[argv[0]](['--help'], path_to_tx)
- except KeyError:
- utils.logger.error("Command %s not found" % argv[0])
- # or print summary of all commands
-
- # the code below will only be executed if the KeyError exception is thrown
- # becuase in all other cases the function called with --help will exit
- # instead of return here
- keys = fns.keys()
- keys.sort()
-
- logger.info("Transifex command line client.\n")
- logger.info("Available commands are:")
- for key in keys:
- logger.info(" %-15s\t%s" % (key, fns[key].func_doc))
- logger.info("\nFor more information run %s command --help" % sys.argv[0])
-
-
-def cmd_delete(argv, path_to_tx):
- "Delete an accessible resource or translation in a remote server."
- parser = delete_parser()
- (options, args) = parser.parse_args(argv)
- languages = parse_csv_option(options.languages)
- resources = parse_csv_option(options.resources)
- skip = options.skip_errors
- force = options.force_delete
- prj = project.Project(path_to_tx)
- prj.delete(resources, languages, skip, force)
- logger.info("Done.")
-
-
-def _go_to_dir(path):
- """Change the current working directory to the directory specified as
- argument.
-
- Args:
- path: The path to chdor to.
- Raises:
- UnInitializedError, in case the directory has not been initialized.
- """
- if path is None:
- raise UnInitializedError(
- "Directory has not been initialzied. "
- "Did you forget to run 'tx init' first?"
- )
- os.chdir(path)
-
-
-def _set_minimum_perc(resource, value, path_to_tx):
- """Set the minimum percentage in the .tx/config file."""
- args = (resource, 'minimum_perc', value, path_to_tx, 'set_min_perc')
- _set_project_option(*args)
-
-
-def _set_mode(resource, value, path_to_tx):
- """Set the mode in the .tx/config file."""
- args = (resource, 'mode', value, path_to_tx, 'set_default_mode')
- _set_project_option(*args)
-
-
-def _set_type(resource, value, path_to_tx):
- """Set the i18n type in the .tx/config file."""
- args = (resource, 'type', value, path_to_tx, 'set_i18n_type')
- _set_project_option(*args)
-
-
-def _set_project_option(resource, name, value, path_to_tx, func_name):
- """Save the option to the project config file."""
- if value is None:
- return
- if not resource:
- logger.debug("Setting the %s for all resources." % name)
- resources = []
- else:
- logger.debug("Setting the %s for resource %s." % (name, resource))
- resources = [resource, ]
- prj = project.Project(path_to_tx)
- getattr(prj, func_name)(resources, value)
- prj.save()
+++ /dev/null
-import ConfigParser
-
-
-class OrderedRawConfigParser( ConfigParser.RawConfigParser ):
- """
- Overload standard Class ConfigParser.RawConfigParser
- """
- def write(self, fp):
- """Write an .ini-format representation of the configuration state."""
- if self._defaults:
- fp.write("[%s]\n" % DEFAULTSECT)
- for key in sorted( self._defaults ):
- fp.write( "%s = %s\n" % (key, str( self._defaults[ key ]
- ).replace('\n', '\n\t')) )
- fp.write("\n")
- for section in self._sections:
- fp.write("[%s]\n" % section)
- for key in sorted( self._sections[section] ):
- if key != "__name__":
- fp.write("%s = %s\n" %
- (key, str( self._sections[section][ key ]
- ).replace('\n', '\n\t')))
- fp.write("\n")
-
- optionxform = str
-
-
-_NOTFOUND = object()
-
-
-class Flipdict(dict):
- """An injective (one-to-one) python dict. Ensures that each key maps
- to a unique value, and each value maps back to that same key.
-
- Code mostly taken from here:
- http://code.activestate.com/recipes/576968-flipdict-python-dict-that-also-maintains-a-one-to-/
- """
-
- def __init__(self, *args, **kw):
- self._flip = dict.__new__(self.__class__)
- setattr(self._flip, "_flip", self)
- for key, val in dict(*args, **kw).iteritems():
- self[key] = val
-
- @property
- def flip(self):
- """The inverse mapping."""
- return self._flip
-
- def __repr__(self):
- return "%s(%r)" % (self.__class__.__name__, dict(self))
-
- __str__ = __repr__
-
- def copy(self):
- return self.__class__(self)
-
- @classmethod
- def fromkeys(cls, keys, value=None):
- return cls(dict.fromkeys(keys, value))
-
- def __setitem__(self, key, val):
- k = self._flip.get(val, _NOTFOUND)
- if not (k is _NOTFOUND or k==key):
- raise KeyError('(key,val) would erase mapping for value %r' % val)
-
- v = self.get(key, _NOTFOUND)
- if v is not _NOTFOUND:
- dict.__delitem__(self._flip, v)
-
- dict.__setitem__(self, key, val)
- dict.__setitem__(self._flip, val, key)
-
- def setdefault(self, key, default = None):
- # Copied from python's UserDict.DictMixin code.
- try:
- return self[key]
- except KeyError:
- self[key] = default
- return default
-
- def update(self, other = None, **kwargs):
- # Copied from python's UserDict.DictMixin code.
- # Make progressively weaker assumptions about "other"
- if other is None:
- pass
- elif hasattr(other, 'iteritems'): # iteritems saves memory and lookups
- for k, v in other.iteritems():
- self[k] = v
- elif hasattr(other, 'keys'):
- for k in other.keys():
- self[k] = other[k]
- else:
- for k, v in other:
- self[k] = v
- if kwargs:
- self.update(kwargs)
-
- def __delitem__(self, key):
- val = dict.pop(self, key)
- dict.__delitem__(self._flip, val)
-
- def pop(self, key, *args):
- val = dict.pop(self, key, *args)
- dict.__delitem__(self._flip, val)
- return val
-
- def popitem(self):
- key, val = dict.popitem(self)
- dict.__delitem__(self._flip, val)
- return key, val
-
- def clear(self):
- dict.clear(self)
- dict.clear(self._flip)
+++ /dev/null
-# -*- coding: utf-8 -*-
-
-"""
-Exception classes for the tx client.
-"""
-
-
-class UnInitializedError(Exception):
- """The project directory has not been initialized."""
-
-
-class UnknownCommandError(Exception):
- """The provided command is not supported."""
+++ /dev/null
-# -*- coding: utf-8 -*-
-
-"""
-HTTP-related utility functions.
-"""
-
-from __future__ import with_statement
-import gzip
-try:
- import cStringIO as StringIO
-except ImportError:
- import StringIO
-
-
-def _gzip_decode(gzip_data):
- """
- Unzip gzipped data and return them.
-
- :param gzip_data: Gzipped data.
- :returns: The actual data.
- """
- try:
- gzip_data = StringIO.StringIO(gzip_data)
- gzip_file = gzip.GzipFile(fileobj=gzip_data)
- data = gzip_file.read()
- return data
- finally:
- gzip_data.close()
-
-
-def http_response(response):
- """
- Return the response of a HTTP request.
-
- If the response has been gzipped, gunzip it first.
-
- :param response: The raw response of a HTTP request.
- :returns: A response suitable to be used by clients.
- """
- metadata = response.info()
- data = response.read()
- response.close()
- if metadata.get('content-encoding') == 'gzip':
- return _gzip_decode(data)
- else:
- return data
+++ /dev/null
-# -*- coding: utf-8 -*-
-
-"""
-Add logging capabilities to tx-client.
-"""
-
-import sys
-import logging
-
-_logger = logging.getLogger('txclib')
-_logger.setLevel(logging.INFO)
-
-_formatter = logging.Formatter('%(message)s')
-
-_error_handler = logging.StreamHandler(sys.stderr)
-_error_handler.setLevel(logging.ERROR)
-_error_handler.setFormatter(_formatter)
-_logger.addHandler(_error_handler)
-
-_msg_handler = logging.StreamHandler(sys.stdout)
-_msg_handler.setLevel(logging.DEBUG)
-_msg_handler.setFormatter(_formatter)
-_msg_filter = logging.Filter()
-_msg_filter.filter = lambda r: r.levelno < logging.ERROR
-_msg_handler.addFilter(_msg_filter)
-_logger.addHandler(_msg_handler)
-
-logger = _logger
-
-
-def set_log_level(level):
- """Set the level for the logger.
-
- Args:
- level: A string among DEBUG, INFO, WARNING, ERROR, CRITICAL.
- """
- logger.setLevel(getattr(logging, level))
+++ /dev/null
-# -*- coding: utf-8 -*-
-
-from optparse import OptionParser, OptionGroup
-
-
-class EpilogParser(OptionParser):
- def format_epilog(self, formatter):
- return self.epilog
-
-
-def delete_parser():
- """Return the command-line parser for the delete command."""
- usage = "usage: %prog [tx_options] delete OPTION [OPTIONS]"
- description = (
- "This command deletes translations for a resource in the remote server."
- )
- epilog = (
- "\nExamples:\n"
- " To delete a translation:\n "
- "$ tx delete -r project.resource -l <lang_code>\n\n"
- " To delete a resource:\n $ tx delete -r project.resource\n"
- )
- parser = EpilogParser(usage=usage, description=description, epilog=epilog)
- parser.add_option(
- "-r", "--resource", action="store", dest="resources", default=None,
- help="Specify the resource you want to delete (defaults to all)"
- )
- parser.add_option(
- "-l","--language", action="store", dest="languages",
- default=None, help="Specify the translation you want to delete"
- )
- parser.add_option(
- "--skip", action="store_true", dest="skip_errors", default=False,
- help="Don't stop on errors."
- )
- parser.add_option(
- "-f","--force", action="store_true", dest="force_delete",
- default=False, help="Delete an entity forcefully."
- )
- return parser
-
-
-def help_parser():
- """Return the command-line parser for the help command."""
- usage="usage: %prog help command"
- description="Lists all available commands in the transifex command"\
- " client. If a command is specified, the help page of the specific"\
- " command is displayed instead."
-
- parser = OptionParser(usage=usage, description=description)
- return parser
-
-
-def init_parser():
- """Return the command-line parser for the init command."""
- usage="usage: %prog [tx_options] init <path>"
- description="This command initializes a new project for use with"\
- " transifex. It is recommended to execute this command in the"\
- " top level directory of your project so that you can include"\
- " all files under it in transifex. If no path is provided, the"\
- " current working dir will be used."
- parser = OptionParser(usage=usage, description=description)
- parser.add_option("--host", action="store", dest="host",
- default=None, help="Specify a default Transifex host.")
- parser.add_option("--user", action="store", dest="user",
- default=None, help="Specify username for Transifex server.")
- parser.add_option("--pass", action="store", dest="password",
- default=None, help="Specify password for Transifex server.")
- return parser
-
-
-def pull_parser():
- """Return the command-line parser for the pull command."""
- usage="usage: %prog [tx_options] pull [options]"
- description="This command pulls all outstanding changes from the remote"\
- " Transifex server to the local repository. By default, only the"\
- " files that are watched by Transifex will be updated but if you"\
- " want to fetch the translations for new languages as well, use the"\
- " -a|--all option. (Note: new translations are saved in the .tx folder"\
- " and require the user to manually rename them and add then in "\
- " transifex using the set_translation command)."
- parser = OptionParser(usage=usage,description=description)
- parser.add_option("-l","--language", action="store", dest="languages",
- default=[], help="Specify which translations you want to pull"
- " (defaults to all)")
- parser.add_option("-r","--resource", action="store", dest="resources",
- default=[], help="Specify the resource for which you want to pull"
- " the translations (defaults to all)")
- parser.add_option("-a","--all", action="store_true", dest="fetchall",
- default=False, help="Fetch all translation files from server (even new"
- " ones)")
- parser.add_option("-s","--source", action="store_true", dest="fetchsource",
- default=False, help="Force the fetching of the source file (default:"
- " False)")
- parser.add_option("-f","--force", action="store_true", dest="force",
- default=False, help="Force download of translations files.")
- parser.add_option("--skip", action="store_true", dest="skip_errors",
- default=False, help="Don't stop on errors. Useful when pushing many"
- " files concurrently.")
- parser.add_option("--disable-overwrite", action="store_false",
- dest="overwrite", default=True,
- help="By default transifex will fetch new translations files and"\
- " replace existing ones. Use this flag if you want to disable"\
- " this feature")
- parser.add_option("--minimum-perc", action="store", type="int",
- dest="minimum_perc", default=0,
- help="Specify the minimum acceptable percentage of a translation "
- "in order to download it.")
- parser.add_option(
- "--mode", action="store", dest="mode", help=(
- "Specify the mode of the translation file to pull (e.g. "
- "'reviewed'). See http://bit.ly/txcmod1 for available values."
- )
- )
- return parser
-
-
-def push_parser():
- """Return the command-line parser for the push command."""
- usage="usage: %prog [tx_options] push [options]"
- description="This command pushes all local files that have been added to"\
- " Transifex to the remote server. All new translations are merged"\
- " with existing ones and if a language doesn't exists then it gets"\
- " created. If you want to push the source file as well (either"\
- " because this is your first time running the client or because"\
- " you just have updated with new entries), use the -f|--force option."\
- " By default, this command will push all files which are watched by"\
- " Transifex but you can filter this per resource or/and language."
- parser = OptionParser(usage=usage, description=description)
- parser.add_option("-l","--language", action="store", dest="languages",
- default=None, help="Specify which translations you want to push"
- " (defaults to all)")
- parser.add_option("-r","--resource", action="store", dest="resources",
- default=None, help="Specify the resource for which you want to push"
- " the translations (defaults to all)")
- parser.add_option("-f","--force", action="store_true", dest="force_creation",
- default=False, help="Push source files without checking modification"
- " times.")
- parser.add_option("--skip", action="store_true", dest="skip_errors",
- default=False, help="Don't stop on errors. Useful when pushing many"
- " files concurrently.")
- parser.add_option("-s", "--source", action="store_true", dest="push_source",
- default=False, help="Push the source file to the server.")
-
- parser.add_option("-t", "--translations", action="store_true", dest="push_translations",
- default=False, help="Push the translation files to the server")
- parser.add_option("--no-interactive", action="store_true", dest="no_interactive",
- default=False, help="Don't require user input when forcing a push.")
- return parser
-
-
-def set_parser():
- """Return the command-line parser for the set command."""
- usage="usage: %prog [tx_options] set [options] [args]"
- description="This command can be used to create a mapping between files"\
- " and projects either using local files or using files from a remote"\
- " Transifex server."
- epilog="\nExamples:\n"\
- " To set the source file:\n $ tx set -r project.resource --source -l en <file>\n\n"\
- " To set a single translation file:\n $ tx set -r project.resource -l de <file>\n\n"\
- " To automatically detect and assign the source files and translations:\n"\
- " $ tx set --auto-local -r project.resource 'expr' --source-lang en\n\n"\
- " To set a specific file as a source and auto detect translations:\n"\
- " $ tx set --auto-local -r project.resource 'expr' --source-lang en"\
- " --source-file <file>\n\n"\
- " To set a remote release/resource/project:\n"\
- " $ tx set --auto-remote <transifex-url>\n"
- parser = EpilogParser(usage=usage, description=description, epilog=epilog)
- parser.add_option("--auto-local", action="store_true", dest="local",
- default=False, help="Used when auto configuring local project.")
- parser.add_option("--auto-remote", action="store_true", dest="remote",
- default=False, help="Used when adding remote files from Transifex"
- " server.")
- parser.add_option("-r","--resource", action="store", dest="resource",
- default=None, help="Specify the slug of the resource that you're"
- " setting up (This must be in the following format:"
- " `project_slug.resource_slug`).")
- parser.add_option(
- "--source", action="store_true", dest="is_source", default=False,
- help=(
- "Specify that the given file is a source file "
- "[doesn't work with the --auto-* commands]."
- )
- )
- parser.add_option("-l","--language", action="store", dest="language",
- default=None, help="Specify which translations you want to pull"
- " [doesn't work with the --auto-* commands].")
- parser.add_option("-t", "--type", action="store", dest="i18n_type",
- help=(
- "Specify the i18n type of the resource(s). This is only needed, if "
- "the resource(s) does not exist yet in Transifex. For a list of "
- "available i18n types, see "
- "http://help.transifex.com/features/formats.html"
- )
- )
- parser.add_option("--minimum-perc", action="store", dest="minimum_perc",
- help=(
- "Specify the minimum acceptable percentage of a translation "
- "in order to download it."
- )
- )
- parser.add_option(
- "--mode", action="store", dest="mode", help=(
- "Specify the mode of the translation file to pull (e.g. "
- "'reviewed'). See http://help.transifex.com/features/client/"
- "index.html#defining-the-mode-of-the-translated-file for the"
- "available values."
- )
- )
- group = OptionGroup(parser, "Extended options", "These options can only be"
- " used with the --auto-local command.")
- group.add_option("-s","--source-language", action="store",
- dest="source_language",
- default=None, help="Specify the source language of a resource"
- " [requires --auto-local].")
- group.add_option("-f","--source-file", action="store", dest="source_file",
- default=None, help="Specify the source file of a resource [requires"
- " --auto-local].")
- group.add_option("--execute", action="store_true", dest="execute",
- default=False, help="Execute commands [requires --auto-local].")
- parser.add_option_group(group)
- return parser
-
-
-def status_parser():
- """Return the command-line parser for the status command."""
- usage="usage: %prog [tx_options] status [options]"
- description="Prints the status of the current project by reading the"\
- " data in the configuration file."
- parser = OptionParser(usage=usage,description=description)
- parser.add_option("-r","--resource", action="store", dest="resources",
- default=[], help="Specify resources")
- return parser
-
-
-def parse_csv_option(option):
- """Return a list out of the comma-separated option or an empty list."""
- if option:
- return option.split(',')
- else:
- return []
+++ /dev/null
-# -*- coding: utf-8 -*-
-
-"""
-Module for API-related calls.
-"""
-
-import urlparse
-
-
-def hostname_tld_migration(hostname):
- """
- Migrate transifex.net to transifex.com.
-
- :param hostname: The hostname to migrate (if needed).
- :returns: A hostname with the transifex.com domain (if needed).
- """
- parts = urlparse.urlparse(hostname)
- if parts.hostname.endswith('transifex.net'):
- hostname = hostname.replace('transifex.net', 'transifex.com', 1)
- return hostname
-
-
-def hostname_ssl_migration(hostname):
- """
- Migrate Transifex hostnames to use HTTPS.
-
- :param hostname: The hostname to migrate (if needed).
- :returns: A https hostname (if needed).
- """
- parts = urlparse.urlparse(hostname)
- is_transifex = (
- parts.hostname[-14:-3] == '.transifex.' or
- parts.hostname == 'transifex.net' or
- parts.hostname == 'transifex.com'
- )
- is_https = parts.scheme == 'https'
- if is_transifex and not is_https:
- if not parts.scheme:
- hostname = 'https:' + hostname
- else:
- hostname = hostname.replace(parts.scheme, 'https', 1)
- return hostname
-
-
-def visit_hostname(hostname):
- """
- Have a chance to visit a hostname before actually using it.
-
- :param hostname: The original hostname.
- :returns: The hostname with the necessary changes.
- """
- for processor in [hostname_ssl_migration, hostname_tld_migration, ]:
- hostname = processor(hostname)
- return hostname
+++ /dev/null
-# -*- coding: utf-8 -*-
-import base64
-import copy
-import getpass
-import os
-import re
-import fnmatch
-import urllib2
-import datetime, time
-import ConfigParser
-
-from txclib.web import *
-from txclib.utils import *
-from txclib.urls import API_URLS
-from txclib.config import OrderedRawConfigParser, Flipdict
-from txclib.log import logger
-from txclib.http_utils import http_response
-from txclib.processors import visit_hostname
-
-
-class ProjectNotInit(Exception):
- pass
-
-
-class Project(object):
- """
- Represents an association between the local and remote project instances.
- """
-
- def __init__(self, path_to_tx=None, init=True):
- """
- Initialize the Project attributes.
- """
- if init:
- self._init(path_to_tx)
-
- def _init(self, path_to_tx=None):
- instructions = "Run 'tx init' to initialize your project first!"
- try:
- self.root = self._get_tx_dir_path(path_to_tx)
- self.config_file = self._get_config_file_path(self.root)
- self.config = self._read_config_file(self.config_file)
- self.txrc_file = self._get_transifex_file()
- self.txrc = self._get_transifex_config(self.txrc_file)
- except ProjectNotInit, e:
- logger.error('\n'.join([unicode(e), instructions]))
- raise
-
- def _get_config_file_path(self, root_path):
- """Check the .tx/config file exists."""
- config_file = os.path.join(root_path, ".tx", "config")
- logger.debug("Config file is %s" % config_file)
- if not os.path.exists(config_file):
- msg = "Cannot find the config file (.tx/config)!"
- raise ProjectNotInit(msg)
- return config_file
-
- def _get_tx_dir_path(self, path_to_tx):
- """Check the .tx directory exists."""
- root_path = path_to_tx or find_dot_tx()
- logger.debug("Path to tx is %s." % root_path)
- if not root_path:
- msg = "Cannot find any .tx directory!"
- raise ProjectNotInit(msg)
- return root_path
-
- def _read_config_file(self, config_file):
- """Parse the config file and return its contents."""
- config = OrderedRawConfigParser()
- try:
- config.read(config_file)
- except Exception, err:
- msg = "Cannot open/parse .tx/config file: %s" % err
- raise ProjectNotInit(msg)
- return config
-
- def _get_transifex_config(self, txrc_file):
- """Read the configuration from the .transifexrc file."""
- txrc = OrderedRawConfigParser()
- try:
- txrc.read(txrc_file)
- except Exception, e:
- msg = "Cannot read global configuration file: %s" % e
- raise ProjectNotInit(msg)
- self._migrate_txrc_file(txrc)
- return txrc
-
- def _migrate_txrc_file(self, txrc):
- """Migrate the txrc file, if needed."""
- for section in txrc.sections():
- orig_hostname = txrc.get(section, 'hostname')
- hostname = visit_hostname(orig_hostname)
- if hostname != orig_hostname:
- msg = "Hostname %s should be changed to %s."
- logger.info(msg % (orig_hostname, hostname))
- if (sys.stdin.isatty() and sys.stdout.isatty() and
- confirm('Change it now? ', default=True)):
- txrc.set(section, 'hostname', hostname)
- msg = 'Hostname changed'
- logger.info(msg)
- else:
- hostname = orig_hostname
- self._save_txrc_file(txrc)
- return txrc
-
- def _get_transifex_file(self, directory=None):
- """Fetch the path of the .transifexrc file.
-
- It is in the home directory ofthe user by default.
- """
- if directory is None:
- directory = os.path.expanduser('~')
- txrc_file = os.path.join(directory, ".transifexrc")
- logger.debug(".transifexrc file is at %s" % directory)
- if not os.path.exists(txrc_file):
- msg = "No authentication data found."
- logger.info(msg)
- mask = os.umask(077)
- open(txrc_file, 'w').close()
- os.umask(mask)
- return txrc_file
-
- def validate_config(self):
- """
- To ensure the json structure is correctly formed.
- """
- pass
-
- def getset_host_credentials(self, host, user=None, password=None):
- """
- Read .transifexrc and report user,pass for a specific host else ask the
- user for input.
- """
- try:
- username = self.txrc.get(host, 'username')
- passwd = self.txrc.get(host, 'password')
- except (ConfigParser.NoOptionError, ConfigParser.NoSectionError):
- logger.info("No entry found for host %s. Creating..." % host)
- username = user or raw_input("Please enter your transifex username: ")
- while (not username):
- username = raw_input("Please enter your transifex username: ")
- passwd = password
- while (not passwd):
- passwd = getpass.getpass()
-
- logger.info("Updating %s file..." % self.txrc_file)
- self.txrc.add_section(host)
- self.txrc.set(host, 'username', username)
- self.txrc.set(host, 'password', passwd)
- self.txrc.set(host, 'token', '')
- self.txrc.set(host, 'hostname', host)
-
- return username, passwd
-
- def set_remote_resource(self, resource, source_lang, i18n_type, host,
- file_filter="translations<sep>%(proj)s.%(res)s<sep><lang>.%(extension)s"):
- """
- Method to handle the add/conf of a remote resource.
- """
- if not self.config.has_section(resource):
- self.config.add_section(resource)
-
- p_slug, r_slug = resource.split('.')
- file_filter = file_filter.replace("<sep>", r"%s" % os.path.sep)
- self.url_info = {
- 'host': host,
- 'project': p_slug,
- 'resource': r_slug
- }
- extension = self._extension_for(i18n_type)[1:]
-
- self.config.set(resource, 'source_lang', source_lang)
- self.config.set(
- resource, 'file_filter',
- file_filter % {'proj': p_slug, 'res': r_slug, 'extension': extension}
- )
- if host != self.config.get('main', 'host'):
- self.config.set(resource, 'host', host)
-
- def get_resource_host(self, resource):
- """
- Returns the host that the resource is configured to use. If there is no
- such option we return the default one
- """
- if self.config.has_option(resource, 'host'):
- return self.config.get(resource, 'host')
- return self.config.get('main', 'host')
-
- def get_resource_lang_mapping(self, resource):
- """
- Get language mappings for a specific resource.
- """
- lang_map = Flipdict()
- try:
- args = self.config.get("main", "lang_map")
- for arg in args.replace(' ', '').split(','):
- k,v = arg.split(":")
- lang_map.update({k:v})
- except ConfigParser.NoOptionError:
- pass
- except (ValueError, KeyError):
- raise Exception("Your lang map configuration is not correct.")
-
- if self.config.has_section(resource):
- res_lang_map = Flipdict()
- try:
- args = self.config.get(resource, "lang_map")
- for arg in args.replace(' ', '').split(','):
- k,v = arg.split(":")
- res_lang_map.update({k:v})
- except ConfigParser.NoOptionError:
- pass
- except (ValueError, KeyError):
- raise Exception("Your lang map configuration is not correct.")
-
- # merge the lang maps and return result
- lang_map.update(res_lang_map)
-
- return lang_map
-
-
- def get_resource_files(self, resource):
- """
- Get a dict for all files assigned to a resource. First we calculate the
- files matching the file expression and then we apply all translation
- excpetions. The resulting dict will be in this format:
-
- { 'en': 'path/foo/en/bar.po', 'de': 'path/foo/de/bar.po', 'es': 'path/exceptions/es.po'}
-
- NOTE: All paths are relative to the root of the project
- """
- tr_files = {}
- if self.config.has_section(resource):
- try:
- file_filter = self.config.get(resource, "file_filter")
- except ConfigParser.NoOptionError:
- file_filter = "$^"
- source_lang = self.config.get(resource, "source_lang")
- source_file = self.get_resource_option(resource, 'source_file') or None
- expr_re = regex_from_filefilter(file_filter, self.root)
- expr_rec = re.compile(expr_re)
- for root, dirs, files in os.walk(self.root):
- for f in files:
- f_path = os.path.abspath(os.path.join(root, f))
- match = expr_rec.match(f_path)
- if match:
- lang = match.group(1)
- if lang != source_lang:
- f_path = relpath(f_path, self.root)
- if f_path != source_file:
- tr_files.update({lang: f_path})
-
- for (name, value) in self.config.items(resource):
- if name.startswith("trans."):
- lang = name.split('.')[1]
- # delete language which has same file
- if value in tr_files.values():
- keys = []
- for k, v in tr_files.iteritems():
- if v == value:
- keys.append(k)
- if len(keys) == 1:
- del tr_files[keys[0]]
- else:
- raise Exception("Your configuration seems wrong."\
- " You have multiple languages pointing to"\
- " the same file.")
- # Add language with correct file
- tr_files.update({lang:value})
-
- return tr_files
-
- return None
-
- def get_resource_option(self, resource, option):
- """
- Return the requested option for a specific resource
-
- If there is no such option, we return None
- """
-
- if self.config.has_section(resource):
- if self.config.has_option(resource, option):
- return self.config.get(resource, option)
- return None
-
- def get_resource_list(self, project=None):
- """
- Parse config file and return tuples with the following format
-
- [ (project_slug, resource_slug), (..., ...)]
- """
-
- resource_list= []
- for r in self.config.sections():
- if r == 'main':
- continue
- p_slug, r_slug = r.split('.', 1)
- if project and p_slug != project:
- continue
- resource_list.append(r)
-
- return resource_list
-
- def save(self):
- """
- Store the config dictionary in the .tx/config file of the project.
- """
- self._save_tx_config()
- self._save_txrc_file()
-
- def _save_tx_config(self, config=None):
- """Save the local config file."""
- if config is None:
- config = self.config
- fh = open(self.config_file,"w")
- config.write(fh)
- fh.close()
-
- def _save_txrc_file(self, txrc=None):
- """Save the .transifexrc file."""
- if txrc is None:
- txrc = self.txrc
- mask = os.umask(077)
- fh = open(self.txrc_file, 'w')
- txrc.write(fh)
- fh.close()
- os.umask(mask)
-
- def get_full_path(self, relpath):
- if relpath[0] == "/":
- return relpath
- else:
- return os.path.join(self.root, relpath)
-
- def pull(self, languages=[], resources=[], overwrite=True, fetchall=False,
- fetchsource=False, force=False, skip=False, minimum_perc=0, mode=None):
- """Pull all translations file from transifex server."""
- self.minimum_perc = minimum_perc
- resource_list = self.get_chosen_resources(resources)
-
- if mode == 'reviewed':
- url = 'pull_reviewed_file'
- elif mode == 'translator':
- url = 'pull_translator_file'
- elif mode == 'developer':
- url = 'pull_developer_file'
- else:
- url = 'pull_file'
-
- for resource in resource_list:
- logger.debug("Handling resource %s" % resource)
- self.resource = resource
- project_slug, resource_slug = resource.split('.')
- files = self.get_resource_files(resource)
- slang = self.get_resource_option(resource, 'source_lang')
- sfile = self.get_resource_option(resource, 'source_file')
- lang_map = self.get_resource_lang_mapping(resource)
- host = self.get_resource_host(resource)
- logger.debug("Language mapping is: %s" % lang_map)
- if mode is None:
- mode = self._get_option(resource, 'mode')
- self.url_info = {
- 'host': host,
- 'project': project_slug,
- 'resource': resource_slug
- }
- logger.debug("URL data are: %s" % self.url_info)
-
- stats = self._get_stats_for_resource()
-
-
- try:
- file_filter = self.config.get(resource, 'file_filter')
- except ConfigParser.NoOptionError:
- file_filter = None
-
- # Pull source file
- pull_languages = set([])
- new_translations = set([])
-
- if fetchall:
- new_translations = self._new_translations_to_add(
- files, slang, lang_map, stats, force
- )
- if new_translations:
- msg = "New translations found for the following languages: %s"
- logger.info(msg % ', '.join(new_translations))
-
- existing, new = self._languages_to_pull(
- languages, files, lang_map, stats, force
- )
- pull_languages |= existing
- new_translations |= new
- logger.debug("Adding to new translations: %s" % new)
-
- if fetchsource:
- if sfile and slang not in pull_languages:
- pull_languages.add(slang)
- elif slang not in new_translations:
- new_translations.add(slang)
-
- if pull_languages:
- logger.debug("Pulling languages for: %s" % pull_languages)
- msg = "Pulling translations for resource %s (source: %s)"
- logger.info(msg % (resource, sfile))
-
- for lang in pull_languages:
- local_lang = lang
- if lang in lang_map.values():
- remote_lang = lang_map.flip[lang]
- else:
- remote_lang = lang
- if languages and lang not in pull_languages:
- logger.debug("Skipping language %s" % lang)
- continue
- if lang != slang:
- local_file = files.get(lang, None) or files[lang_map[lang]]
- else:
- local_file = sfile
- logger.debug("Using file %s" % local_file)
-
- kwargs = {
- 'lang': remote_lang,
- 'stats': stats,
- 'local_file': local_file,
- 'force': force,
- 'mode': mode,
- }
- if not self._should_update_translation(**kwargs):
- msg = "Skipping '%s' translation (file: %s)."
- logger.info(
- msg % (color_text(remote_lang, "RED"), local_file)
- )
- continue
-
- if not overwrite:
- local_file = ("%s.new" % local_file)
- logger.warning(
- " -> %s: %s" % (color_text(remote_lang, "RED"), local_file)
- )
- try:
- r = self.do_url_request(url, language=remote_lang)
- except Exception,e:
- if not skip:
- raise e
- else:
- logger.error(e)
- continue
- base_dir = os.path.split(local_file)[0]
- mkdir_p(base_dir)
- fd = open(local_file, 'wb')
- fd.write(r)
- fd.close()
-
- if new_translations:
- msg = "Pulling new translations for resource %s (source: %s)"
- logger.info(msg % (resource, sfile))
- for lang in new_translations:
- if lang in lang_map.keys():
- local_lang = lang_map[lang]
- else:
- local_lang = lang
- remote_lang = lang
- if file_filter:
- local_file = relpath(os.path.join(self.root,
- file_filter.replace('<lang>', local_lang)), os.curdir)
- else:
- trans_dir = os.path.join(self.root, ".tx", resource)
- if not os.path.exists(trans_dir):
- os.mkdir(trans_dir)
- local_file = relpath(os.path.join(trans_dir, '%s_translation' %
- local_lang, os.curdir))
-
- if lang != slang:
- satisfies_min = self._satisfies_min_translated(
- stats[remote_lang], mode
- )
- if not satisfies_min:
- msg = "Skipping language %s due to used options."
- logger.info(msg % lang)
- continue
- logger.warning(
- " -> %s: %s" % (color_text(remote_lang, "RED"), local_file)
- )
- r = self.do_url_request(url, language=remote_lang)
-
- base_dir = os.path.split(local_file)[0]
- mkdir_p(base_dir)
- fd = open(local_file, 'wb')
- fd.write(r)
- fd.close()
-
- def push(self, source=False, translations=False, force=False, resources=[], languages=[],
- skip=False, no_interactive=False):
- """
- Push all the resources
- """
- resource_list = self.get_chosen_resources(resources)
- self.skip = skip
- self.force = force
- for resource in resource_list:
- push_languages = []
- project_slug, resource_slug = resource.split('.')
- files = self.get_resource_files(resource)
- slang = self.get_resource_option(resource, 'source_lang')
- sfile = self.get_resource_option(resource, 'source_file')
- lang_map = self.get_resource_lang_mapping(resource)
- host = self.get_resource_host(resource)
- logger.debug("Language mapping is: %s" % lang_map)
- logger.debug("Using host %s" % host)
- self.url_info = {
- 'host': host,
- 'project': project_slug,
- 'resource': resource_slug
- }
-
- logger.info("Pushing translations for resource %s:" % resource)
-
- stats = self._get_stats_for_resource()
-
- if force and not no_interactive:
- answer = raw_input("Warning: By using --force, the uploaded"
- " files will overwrite remote translations, even if they"
- " are newer than your uploaded files.\nAre you sure you"
- " want to continue? [y/N] ")
-
- if not answer in ["", 'Y', 'y', "yes", 'YES']:
- return
-
- if source:
- if sfile == None:
- logger.error("You don't seem to have a proper source file"
- " mapping for resource %s. Try without the --source"
- " option or set a source file first and then try again." %
- resource)
- continue
- # Push source file
- try:
- logger.warning("Pushing source file (%s)" % sfile)
- if not self._resource_exists(stats):
- logger.info("Resource does not exist. Creating...")
- fileinfo = "%s;%s" % (resource_slug, slang)
- filename = self.get_full_path(sfile)
- self._create_resource(resource, project_slug, fileinfo, filename)
- self.do_url_request(
- 'push_source', multipart=True, method="PUT",
- files=[(
- "%s;%s" % (resource_slug, slang)
- , self.get_full_path(sfile)
- )],
- )
- except Exception, e:
- if not skip:
- raise
- else:
- logger.error(e)
- else:
- try:
- self.do_url_request('resource_details')
- except Exception, e:
- code = getattr(e, 'code', None)
- if code == 404:
- msg = "Resource %s doesn't exist on the server."
- logger.error(msg % resource)
- continue
-
- if translations:
- # Check if given language codes exist
- if not languages:
- push_languages = files.keys()
- else:
- push_languages = []
- f_langs = files.keys()
- for l in languages:
- if l in lang_map.keys():
- l = lang_map[l]
- push_languages.append(l)
- if l not in f_langs:
- msg = "Warning: No mapping found for language code '%s'."
- logger.error(msg % color_text(l,"RED"))
- logger.debug("Languages to push are %s" % push_languages)
-
- # Push translation files one by one
- for lang in push_languages:
- local_lang = lang
- if lang in lang_map.values():
- remote_lang = lang_map.flip[lang]
- else:
- remote_lang = lang
-
- local_file = files[local_lang]
-
- kwargs = {
- 'lang': remote_lang,
- 'stats': stats,
- 'local_file': local_file,
- 'force': force,
- }
- if not self._should_push_translation(**kwargs):
- msg = "Skipping '%s' translation (file: %s)."
- logger.info(msg % (color_text(lang, "RED"), local_file))
- continue
-
- msg = "Pushing '%s' translations (file: %s)"
- logger.warning(
- msg % (color_text(remote_lang, "RED"), local_file)
- )
- try:
- self.do_url_request(
- 'push_translation', multipart=True, method='PUT',
- files=[(
- "%s;%s" % (resource_slug, remote_lang),
- self.get_full_path(local_file)
- )], language=remote_lang
- )
- logger.debug("Translation %s pushed." % remote_lang)
- except Exception, e:
- if not skip:
- raise e
- else:
- logger.error(e)
-
- def delete(self, resources=[], languages=[], skip=False, force=False):
- """Delete translations."""
- resource_list = self.get_chosen_resources(resources)
- self.skip = skip
- self.force = force
-
- if not languages:
- delete_func = self._delete_resource
- else:
- delete_func = self._delete_translations
-
- for resource in resource_list:
- project_slug, resource_slug = resource.split('.')
- host = self.get_resource_host(resource)
- self.url_info = {
- 'host': host,
- 'project': project_slug,
- 'resource': resource_slug
- }
- logger.debug("URL data are: %s" % self.url_info)
- project_details = parse_json(
- self.do_url_request('project_details', project=self)
- )
- teams = project_details['teams']
- stats = self._get_stats_for_resource()
- delete_func(project_details, resource, stats, languages)
-
- def _delete_resource(self, project_details, resource, stats, *args):
- """Delete a resource from Transifex."""
- project_slug, resource_slug = resource.split('.')
- project_resource_slugs = [
- r['slug'] for r in project_details['resources']
- ]
- logger.info("Deleting resource %s:" % resource)
- if resource_slug not in project_resource_slugs:
- if not self.skip:
- msg = "Skipping: %s : Resource does not exist."
- logger.info(msg % resource)
- return
- if not self.force:
- slang = self.get_resource_option(resource, 'source_lang')
- for language in stats:
- if language == slang:
- continue
- if int(stats[language]['translated_entities']) > 0:
- msg = (
- "Skipping: %s : Unable to delete resource because it "
- "has a not empty %s translation.\nPlease use -f or "
- "--force option to delete this resource."
- )
- logger.info(msg % (resource, language))
- return
- try:
- self.do_url_request('delete_resource', method="DELETE")
- self.config.remove_section(resource)
- self.save()
- msg = "Deleted resource %s of project %s."
- logger.info(msg % (resource_slug, project_slug))
- except Exception, e:
- msg = "Unable to delete resource %s of project %s."
- logger.error(msg % (resource_slug, project_slug))
- if not self.skip:
- raise
-
- def _delete_translations(self, project_details, resource, stats, languages):
- """Delete the specified translations for the specified resource."""
- logger.info("Deleting translations from resource %s:" % resource)
- for language in languages:
- self._delete_translation(project_details, resource, stats, language)
-
- def _delete_translation(self, project_details, resource, stats, language):
- """Delete a specific translation from the specified resource."""
- project_slug, resource_slug = resource.split('.')
- if language not in stats:
- if not self.skip:
- msg = "Skipping %s: Translation does not exist."
- logger.warning(msg % (language))
- return
- if not self.force:
- teams = project_details['teams']
- if language in teams:
- msg = (
- "Skipping %s: Unable to delete translation because it is "
- "associated with a team.\nPlease use -f or --force option "
- "to delete this translation."
- )
- logger.warning(msg % language)
- return
- if int(stats[language]['translated_entities']) > 0:
- msg = (
- "Skipping %s: Unable to delete translation because it "
- "is not empty.\nPlease use -f or --force option to delete "
- "this translation."
- )
- logger.warning(msg % language)
- return
- try:
- self.do_url_request(
- 'delete_translation', language=language, method="DELETE"
- )
- msg = "Deleted language %s from resource %s of project %s."
- logger.info(msg % (language, resource_slug, project_slug))
- except Exception, e:
- msg = "Unable to delete translation %s"
- logger.error(msg % language)
- if not self.skip:
- raise
-
- def do_url_request(self, api_call, multipart=False, data=None,
- files=[], encoding=None, method="GET", **kwargs):
- """
- Issues a url request.
- """
- # Read the credentials from the config file (.transifexrc)
- host = self.url_info['host']
- try:
- username = self.txrc.get(host, 'username')
- passwd = self.txrc.get(host, 'password')
- token = self.txrc.get(host, 'token')
- hostname = self.txrc.get(host, 'hostname')
- except ConfigParser.NoSectionError:
- raise Exception("No user credentials found for host %s. Edit"
- " ~/.transifexrc and add the appropriate info in there." %
- host)
-
- # Create the Url
- kwargs['hostname'] = hostname
- kwargs.update(self.url_info)
- url = (API_URLS[api_call] % kwargs).encode('UTF-8')
- logger.debug(url)
-
- opener = None
- headers = None
- req = None
-
- if multipart:
- opener = urllib2.build_opener(MultipartPostHandler)
- for info,filename in files:
- data = { "resource" : info.split(';')[0],
- "language" : info.split(';')[1],
- "uploaded_file" : open(filename,'rb') }
-
- urllib2.install_opener(opener)
- req = RequestWithMethod(url=url, data=data, method=method)
- else:
- req = RequestWithMethod(url=url, data=data, method=method)
- if encoding:
- req.add_header("Content-Type",encoding)
-
- base64string = base64.encodestring('%s:%s' % (username, passwd))[:-1]
- authheader = "Basic %s" % base64string
- req.add_header("Authorization", authheader)
- req.add_header("Accept-Encoding", "gzip,deflate")
- req.add_header("User-Agent", user_agent_identifier())
-
- try:
- response = urllib2.urlopen(req, timeout=300)
- return http_response(response)
- except urllib2.HTTPError, e:
- if e.code in [401, 403, 404]:
- raise e
- elif 200 <= e.code < 300:
- return None
- else:
- # For other requests, we should print the message as well
- raise Exception("Remote server replied: %s" % e.read())
- except urllib2.URLError, e:
- error = e.args[0]
- raise Exception("Remote server replied: %s" % error[1])
-
-
- def _should_update_translation(self, lang, stats, local_file, force=False,
- mode=None):
- """Whether a translation should be udpated from Transifex.
-
- We use the following criteria for that:
- - If user requested to force the download.
- - If language exists in Transifex.
- - If the local file is older than the Transifex's file.
- - If the user requested a x% completion.
-
- Args:
- lang: The language code to check.
- stats: The (global) statistics object.
- local_file: The local translation file.
- force: A boolean flag.
- mode: The mode for the translation.
- Returns:
- True or False.
- """
- return self._should_download(lang, stats, local_file, force)
-
- def _should_add_translation(self, lang, stats, force=False, mode=None):
- """Whether a translation should be added from Transifex.
-
- We use the following criteria for that:
- - If user requested to force the download.
- - If language exists in Transifex.
- - If the user requested a x% completion.
-
- Args:
- lang: The language code to check.
- stats: The (global) statistics object.
- force: A boolean flag.
- mode: The mode for the translation.
- Returns:
- True or False.
- """
- return self._should_download(lang, stats, None, force)
-
- def _should_download(self, lang, stats, local_file=None, force=False,
- mode=None):
- """Return whether a translation should be downloaded.
-
- If local_file is None, skip the timestamps check (the file does
- not exist locally).
- """
- try:
- lang_stats = stats[lang]
- except KeyError, e:
- logger.debug("No lang %s in statistics" % lang)
- return False
-
- satisfies_min = self._satisfies_min_translated(lang_stats, mode)
- if not satisfies_min:
- return False
-
- if force:
- logger.debug("Downloading translation due to -f")
- return True
-
- if local_file is not None:
- remote_update = self._extract_updated(lang_stats)
- if not self._remote_is_newer(remote_update, local_file):
- logger.debug("Local is newer than remote for lang %s" % lang)
- return False
- return True
-
- def _should_push_translation(self, lang, stats, local_file, force=False):
- """Return whether a local translation file should be
- pushed to Trasnifex.
-
- We use the following criteria for that:
- - If user requested to force the upload.
- - If language exists in Transifex.
- - If local file is younger than the remote file.
-
- Args:
- lang: The language code to check.
- stats: The (global) statistics object.
- local_file: The local translation file.
- force: A boolean flag.
- Returns:
- True or False.
- """
- if force:
- logger.debug("Push translation due to -f.")
- return True
- try:
- lang_stats = stats[lang]
- except KeyError, e:
- logger.debug("Language %s does not exist in Transifex." % lang)
- return True
- if local_file is not None:
- remote_update = self._extract_updated(lang_stats)
- if self._remote_is_newer(remote_update, local_file):
- msg = "Remote translation is newer than local file for lang %s"
- logger.debug(msg % lang)
- return False
- return True
-
- def _generate_timestamp(self, update_datetime):
- """Generate a UNIX timestamp from the argument.
-
- Args:
- update_datetime: The datetime in the format used by Transifex.
- Returns:
- A float, representing the timestamp that corresponds to the
- argument.
- """
- time_format = "%Y-%m-%d %H:%M:%S"
- return time.mktime(
- datetime.datetime(
- *time.strptime(update_datetime, time_format)[0:5]
- ).utctimetuple()
- )
-
- def _get_time_of_local_file(self, path):
- """Get the modified time of the path_.
-
- Args:
- path: The path we want the mtime for.
- Returns:
- The time as a timestamp or None, if the file does not exist
- """
- if not os.path.exists(path):
- return None
- return time.mktime(time.gmtime(os.path.getmtime(path)))
-
- def _satisfies_min_translated(self, stats, mode=None):
- """Check whether a translation fulfills the filter used for
- minimum translated percentage.
-
- Args:
- perc: The current translation percentage.
- Returns:
- True or False
- """
- cur = self._extract_completed(stats, mode)
- option_name = 'minimum_perc'
- if self.minimum_perc is not None:
- minimum_percent = self.minimum_perc
- else:
- global_minimum = int(
- self.get_resource_option('main', option_name) or 0
- )
- resource_minimum = int(
- self.get_resource_option(
- self.resource, option_name
- ) or global_minimum
- )
- minimum_percent = resource_minimum
- return cur >= minimum_percent
-
- def _remote_is_newer(self, remote_updated, local_file):
- """Check whether the remote translation is newer that the local file.
-
- Args:
- remote_updated: The date and time the translation was last
- updated remotely.
- local_file: The local file.
- Returns:
- True or False.
- """
- if remote_updated is None:
- logger.debug("No remote time")
- return False
- remote_time = self._generate_timestamp(remote_updated)
- local_time = self._get_time_of_local_file(
- self.get_full_path(local_file)
- )
- logger.debug(
- "Remote time is %s and local %s" % (remote_time, local_time)
- )
- if local_time is not None and remote_time < local_time:
- return False
- return True
-
- @classmethod
- def _extract_completed(cls, stats, mode=None):
- """Extract the information for the translated percentage from the stats.
-
- Args:
- stats: The stats object for a language as returned by Transifex.
- mode: The mode of translations requested.
- Returns:
- The percentage of translation as integer.
- """
- if mode == 'reviewed':
- key = 'reviewed_percentage'
- else:
- key = 'completed'
- try:
- return int(stats[key][:-1])
- except KeyError, e:
- return 0
-
- @classmethod
- def _extract_updated(cls, stats):
- """Extract the information for the last update of a translation.
-
- Args:
- stats: The stats object for a language as returned by Transifex.
- Returns:
- The last update field.
- """
- try:
- return stats['last_update']
- except KeyError, e:
- return None
-
- def _new_translations_to_add(self, files, slang, lang_map,
- stats, force=False):
- """Return a list of translations which are new to the
- local installation.
- """
- new_translations = []
- timestamp = time.time()
- langs = stats.keys()
- logger.debug("Available languages are: %s" % langs)
-
- for lang in langs:
- lang_exists = lang in files.keys()
- lang_is_source = lang == slang
- mapped_lang_exists = (
- lang in lang_map and lang_map[lang] in files.keys()
- )
- if lang_exists or lang_is_source or mapped_lang_exists:
- continue
- if self._should_add_translation(lang, stats, force):
- new_translations.append(lang)
- return set(new_translations)
-
- def _get_stats_for_resource(self):
- """Get the statistics information for a resource."""
- try:
- r = self.do_url_request('resource_stats')
- logger.debug("Statistics response is %s" % r)
- stats = parse_json(r)
- except urllib2.HTTPError, e:
- logger.debug("Resource not found: %s" % e)
- stats = {}
- except Exception,e:
- logger.debug("Network error: %s" % e)
- raise
- return stats
-
- def get_chosen_resources(self, resources):
- """Get the resources the user selected.
-
- Support wildcards in the resources specified by the user.
-
- Args:
- resources: A list of resources as specified in command-line or
- an empty list.
- Returns:
- A list of resources.
- """
- configured_resources = self.get_resource_list()
- if not resources:
- return configured_resources
-
- selected_resources = []
- for resource in resources:
- found = False
- for full_name in configured_resources:
- if fnmatch.fnmatch(full_name, resource):
- selected_resources.append(full_name)
- found = True
- if not found:
- msg = "Specified resource '%s' does not exist."
- raise Exception(msg % resource)
- logger.debug("Operating on resources: %s" % selected_resources)
- return selected_resources
-
- def _languages_to_pull(self, languages, files, lang_map, stats, force):
- """Get a set of langauges to pull.
-
- Args:
- languages: A list of languages the user selected in cmd.
- files: A dictionary of current local translation files.
- Returns:
- A tuple of a set of existing languages and new translations.
- """
- if not languages:
- pull_languages = set([])
- pull_languages |= set(files.keys())
- mapped_files = []
- for lang in pull_languages:
- if lang in lang_map.flip:
- mapped_files.append(lang_map.flip[lang])
- pull_languages -= set(lang_map.flip.keys())
- pull_languages |= set(mapped_files)
- return (pull_languages, set([]))
- else:
- pull_languages = []
- new_translations = []
- f_langs = files.keys()
- for l in languages:
- if l not in f_langs and not (l in lang_map and lang_map[l] in f_langs):
- if self._should_add_translation(l, stats, force):
- new_translations.append(l)
- else:
- if l in lang_map.keys():
- l = lang_map[l]
- pull_languages.append(l)
- return (set(pull_languages), set(new_translations))
-
- def _extension_for(self, i18n_type):
- """Return the extension used for the specified type."""
- try:
- res = parse_json(self.do_url_request('formats'))
- return res[i18n_type]['file-extensions'].split(',')[0]
- except Exception,e:
- logger.error(e)
- return ''
-
- def _resource_exists(self, stats):
- """Check if resource exists.
-
- Args:
- stats: The statistics dict as returned by Tx.
- Returns:
- True, if the resource exists in the server.
- """
- return bool(stats)
-
- def _create_resource(self, resource, pslug, fileinfo, filename, **kwargs):
- """Create a resource.
-
- Args:
- resource: The full resource name.
- pslug: The slug of the project.
- fileinfo: The information of the resource.
- filename: The name of the file.
- Raises:
- URLError, in case of a problem.
- """
- multipart = True
- method = "POST"
- api_call = 'create_resource'
-
- host = self.url_info['host']
- try:
- username = self.txrc.get(host, 'username')
- passwd = self.txrc.get(host, 'password')
- token = self.txrc.get(host, 'token')
- hostname = self.txrc.get(host, 'hostname')
- except ConfigParser.NoSectionError:
- raise Exception("No user credentials found for host %s. Edit"
- " ~/.transifexrc and add the appropriate info in there." %
- host)
-
- # Create the Url
- kwargs['hostname'] = hostname
- kwargs.update(self.url_info)
- kwargs['project'] = pslug
- url = (API_URLS[api_call] % kwargs).encode('UTF-8')
-
- opener = None
- headers = None
- req = None
-
- i18n_type = self._get_option(resource, 'type')
- if i18n_type is None:
- logger.error(
- "Please define the resource type in .tx/config (eg. type = PO)."
- " More info: http://bit.ly/txcl-rt"
- )
-
- opener = urllib2.build_opener(MultipartPostHandler)
- data = {
- "slug": fileinfo.split(';')[0],
- "name": fileinfo.split(';')[0],
- "uploaded_file": open(filename,'rb'),
- "i18n_type": i18n_type
- }
- urllib2.install_opener(opener)
- req = RequestWithMethod(url=url, data=data, method=method)
-
- base64string = base64.encodestring('%s:%s' % (username, passwd))[:-1]
- authheader = "Basic %s" % base64string
- req.add_header("Authorization", authheader)
-
- try:
- fh = urllib2.urlopen(req)
- except urllib2.HTTPError, e:
- if e.code in [401, 403, 404]:
- raise e
- else:
- # For other requests, we should print the message as well
- raise Exception("Remote server replied: %s" % e.read())
- except urllib2.URLError, e:
- error = e.args[0]
- raise Exception("Remote server replied: %s" % error[1])
-
- raw = fh.read()
- fh.close()
- return raw
-
- def _get_option(self, resource, option):
- """Get the value for the option in the config file.
-
- If the option is not in the resource section, look for it in
- the project.
-
- Args:
- resource: The resource name.
- option: The option the value of which we are interested in.
- Returns:
- The option value or None, if it does not exist.
- """
- value = self.get_resource_option(resource, option)
- if value is None:
- if self.config.has_option('main', option):
- return self.config.get('main', option)
- return value
-
- def set_i18n_type(self, resources, i18n_type):
- """Set the type for the specified resources."""
- self._set_resource_option(resources, key='type', value=i18n_type)
-
- def set_min_perc(self, resources, perc):
- """Set the minimum percentage for the resources."""
- self._set_resource_option(resources, key='minimum_perc', value=perc)
-
- def set_default_mode(self, resources, mode):
- """Set the default mode for the specified resources."""
- self._set_resource_option(resources, key='mode', value=mode)
-
- def _set_resource_option(self, resources, key, value):
- """Set options in the config file.
-
- If resources is empty. set the option globally.
- """
- if not resources:
- self.config.set('main', key, value)
- return
- for r in resources:
- self.config.set(r, key, value)
+++ /dev/null
-# These are the Transifex API urls
-
-API_URLS = {
- 'get_resources': '%(hostname)s/api/2/project/%(project)s/resources/',
- 'project_details': '%(hostname)s/api/2/project/%(project)s/?details',
- 'resource_details': '%(hostname)s/api/2/project/%(project)s/resource/%(resource)s/',
- 'release_details': '%(hostname)s/api/2/project/%(project)s/release/%(release)s/',
- 'pull_file': '%(hostname)s/api/2/project/%(project)s/resource/%(resource)s/translation/%(language)s/?file',
- 'pull_reviewed_file': '%(hostname)s/api/2/project/%(project)s/resource/%(resource)s/translation/%(language)s/?file&mode=reviewed',
- 'pull_translator_file': '%(hostname)s/api/2/project/%(project)s/resource/%(resource)s/translation/%(language)s/?file&mode=translated',
- 'pull_developer_file': '%(hostname)s/api/2/project/%(project)s/resource/%(resource)s/translation/%(language)s/?file&mode=default',
- 'resource_stats': '%(hostname)s/api/2/project/%(project)s/resource/%(resource)s/stats/',
- 'create_resource': '%(hostname)s/api/2/project/%(project)s/resources/',
- 'push_source': '%(hostname)s/api/2/project/%(project)s/resource/%(resource)s/content/',
- 'push_translation': '%(hostname)s/api/2/project/%(project)s/resource/%(resource)s/translation/%(language)s/',
- 'delete_translation': '%(hostname)s/api/2/project/%(project)s/resource/%(resource)s/translation/%(language)s/',
- 'formats': '%(hostname)s/api/2/formats/',
- 'delete_resource': '%(hostname)s/api/2/project/%(project)s/resource/%(resource)s/',
-}
-
-
+++ /dev/null
-import os, sys, re, errno
-try:
- from json import loads as parse_json, dumps as compile_json
-except ImportError:
- from simplejson import loads as parse_json, dumps as compile_json
-import urllib2 # This should go and instead use do_url_request everywhere
-
-from urls import API_URLS
-from txclib.log import logger
-from txclib.exceptions import UnknownCommandError
-
-
-def find_dot_tx(path = os.path.curdir, previous = None):
- """
- Return the path where .tx folder is found.
-
- The 'path' should be a DIRECTORY.
- This process is functioning recursively from the current directory to each
- one of the ancestors dirs.
- """
- path = os.path.abspath(path)
- if path == previous:
- return None
- joined = os.path.join(path, ".tx")
- if os.path.isdir(joined):
- return path
- else:
- return find_dot_tx(os.path.dirname(path), path)
-
-
-#################################################
-# Parse file filter expressions and create regex
-
-def regex_from_filefilter(file_filter, root_path = os.path.curdir):
- """
- Create proper regex from <lang> expression
- """
- # Force expr to be a valid regex expr (escaped) but keep <lang> intact
- expr_re = re.escape(os.path.join(root_path, file_filter))
- expr_re = expr_re.replace("\\<lang\\>", '<lang>').replace(
- '<lang>', '([^%(sep)s]+)' % { 'sep': re.escape(os.path.sep)})
-
- return "^%s$" % expr_re
-
-
-TX_URLS = {
- 'resource': '(?P<hostname>https?://(\w|\.|:|-)+)/projects/p/(?P<project>(\w|-)+)/resource/(?P<resource>(\w|-)+)/?$',
- 'release': '(?P<hostname>https?://(\w|\.|:|-)+)/projects/p/(?P<project>(\w|-)+)/r/(?P<release>(\w|-)+)/?$',
- 'project': '(?P<hostname>https?://(\w|\.|:|-)+)/projects/p/(?P<project>(\w|-)+)/?$',
-}
-
-
-def parse_tx_url(url):
- """
- Try to match given url to any of the valid url patterns specified in
- TX_URLS. If not match is found, we raise exception
- """
- for type in TX_URLS.keys():
- pattern = TX_URLS[type]
- m = re.match(pattern, url)
- if m:
- return type, m.groupdict()
-
- raise Exception("tx: Malformed url given. Please refer to our docs: http://bit.ly/txautor")
-
-
-def get_details(api_call, username, password, *args, **kwargs):
- """
- Get the tx project info through the API.
-
- This function can also be used to check the existence of a project.
- """
- import base64
- url = (API_URLS[api_call] % (kwargs)).encode('UTF-8')
-
- req = urllib2.Request(url=url)
- base64string = base64.encodestring('%s:%s' % (username, password))[:-1]
- authheader = "Basic %s" % base64string
- req.add_header("Authorization", authheader)
-
- try:
- fh = urllib2.urlopen(req)
- raw = fh.read()
- fh.close()
- remote_project = parse_json(raw)
- except urllib2.HTTPError, e:
- if e.code in [401, 403, 404]:
- raise e
- else:
- # For other requests, we should print the message as well
- raise Exception("Remote server replied: %s" % e.read())
- except urllib2.URLError, e:
- error = e.args[0]
- raise Exception("Remote server replied: %s" % error[1])
-
- return remote_project
-
-
-def valid_slug(slug):
- """
- Check if a slug contains only valid characters.
-
- Valid chars include [-_\w]
- """
- try:
- a, b = slug.split('.')
- except ValueError:
- return False
- else:
- if re.match("^[A-Za-z0-9_-]*$", a) and re.match("^[A-Za-z0-9_-]*$", b):
- return True
- return False
-
-
-def discover_commands():
- """
- Inspect commands.py and find all available commands
- """
- import inspect
- from txclib import commands
-
- command_table = {}
- fns = inspect.getmembers(commands, inspect.isfunction)
-
- for name, fn in fns:
- if name.startswith("cmd_"):
- command_table.update({
- name.split("cmd_")[1]:fn
- })
-
- return command_table
-
-
-def exec_command(command, *args, **kwargs):
- """
- Execute given command
- """
- commands = discover_commands()
- try:
- cmd_fn = commands[command]
- except KeyError:
- raise UnknownCommandError
- cmd_fn(*args,**kwargs)
-
-
-def mkdir_p(path):
- try:
- if path:
- os.makedirs(path)
- except OSError, exc: # Python >2.5
- if exc.errno == errno.EEXIST:
- pass
- else:
- raise
-
-
-def confirm(prompt='Continue?', default=True):
- """
- Prompt the user for a Yes/No answer.
-
- Args:
- prompt: The text displayed to the user ([Y/n] will be appended)
- default: If the default value will be yes or no
- """
- valid_yes = ['Y', 'y', 'Yes', 'yes', ]
- valid_no = ['N', 'n', 'No', 'no', ]
- if default:
- prompt = prompt + '[Y/n]'
- valid_yes.append('')
- else:
- prompt = prompt + '[y/N]'
- valid_no.append('')
-
- ans = raw_input(prompt)
- while (ans not in valid_yes and ans not in valid_no):
- ans = raw_input(prompt)
-
- return ans in valid_yes
-
-
-# Stuff for command line colored output
-
-COLORS = [
- 'BLACK', 'RED', 'GREEN', 'YELLOW',
- 'BLUE', 'MAGENTA', 'CYAN', 'WHITE'
-]
-
-DISABLE_COLORS = False
-
-
-def color_text(text, color_name, bold=False):
- """
- This command can be used to colorify command line output. If the shell
- doesn't support this or the --disable-colors options has been set, it just
- returns the plain text.
-
- Usage:
- print "%s" % color_text("This text is red", "RED")
- """
- if color_name in COLORS and not DISABLE_COLORS:
- return '\033[%s;%sm%s\033[0m' % (
- int(bold), COLORS.index(color_name) + 30, text)
- else:
- return text
-
-
-##############################################
-# relpath implementation taken from Python 2.7
-
-if not hasattr(os.path, 'relpath'):
- if os.path is sys.modules.get('ntpath'):
- def relpath(path, start=os.path.curdir):
- """Return a relative version of a path"""
-
- if not path:
- raise ValueError("no path specified")
- start_list = os.path.abspath(start).split(os.path.sep)
- path_list = os.path.abspath(path).split(os.path.sep)
- if start_list[0].lower() != path_list[0].lower():
- unc_path, rest = os.path.splitunc(path)
- unc_start, rest = os.path.splitunc(start)
- if bool(unc_path) ^ bool(unc_start):
- raise ValueError("Cannot mix UNC and non-UNC paths (%s and %s)"
- % (path, start))
- else:
- raise ValueError("path is on drive %s, start on drive %s"
- % (path_list[0], start_list[0]))
- # Work out how much of the filepath is shared by start and path.
- for i in range(min(len(start_list), len(path_list))):
- if start_list[i].lower() != path_list[i].lower():
- break
- else:
- i += 1
-
- rel_list = [os.path.pardir] * (len(start_list)-i) + path_list[i:]
- if not rel_list:
- return os.path.curdir
- return os.path.join(*rel_list)
-
- else:
- # default to posixpath definition
- def relpath(path, start=os.path.curdir):
- """Return a relative version of a path"""
-
- if not path:
- raise ValueError("no path specified")
-
- start_list = os.path.abspath(start).split(os.path.sep)
- path_list = os.path.abspath(path).split(os.path.sep)
-
- # Work out how much of the filepath is shared by start and path.
- i = len(os.path.commonprefix([start_list, path_list]))
-
- rel_list = [os.path.pardir] * (len(start_list)-i) + path_list[i:]
- if not rel_list:
- return os.path.curdir
- return os.path.join(*rel_list)
-else:
- from os.path import relpath
+++ /dev/null
-# -*- coding: utf-8 -*-
-import urllib2
-import itertools, mimetools, mimetypes
-import platform
-from txclib import get_version
-
-# Helper class to enable urllib2 to handle PUT/DELETE requests as well
-class RequestWithMethod(urllib2.Request):
- """Workaround for using DELETE with urllib2"""
- def __init__(self, url, method, data=None, headers={},
- origin_req_host=None, unverifiable=False):
- self._method = method
- urllib2.Request.__init__(self, url, data=data, headers=headers,
- origin_req_host=None, unverifiable=False)
-
- def get_method(self):
- return self._method
-
-import urllib
-import os, stat
-from cStringIO import StringIO
-
-class Callable:
- def __init__(self, anycallable):
- self.__call__ = anycallable
-
-# Controls how sequences are uncoded. If true, elements may be given multiple
-# values by assigning a sequence.
-doseq = 1
-
-class MultipartPostHandler(urllib2.BaseHandler):
- handler_order = urllib2.HTTPHandler.handler_order - 10 # needs to run first
-
- def http_request(self, request):
- data = request.get_data()
- if data is not None and type(data) != str:
- v_files = []
- v_vars = []
- try:
- for(key, value) in data.items():
- if type(value) == file:
- v_files.append((key, value))
- else:
- v_vars.append((key, value))
- except TypeError:
- systype, value, traceback = sys.exc_info()
- raise TypeError, "not a valid non-string sequence or mapping object", traceback
-
- if len(v_files) == 0:
- data = urllib.urlencode(v_vars, doseq)
- else:
- boundary, data = self.multipart_encode(v_vars, v_files)
-
- contenttype = 'multipart/form-data; boundary=%s' % boundary
- if(request.has_header('Content-Type')
- and request.get_header('Content-Type').find('multipart/form-data') != 0):
- print "Replacing %s with %s" % (request.get_header('content-type'), 'multipart/form-data')
- request.add_unredirected_header('Content-Type', contenttype)
-
- request.add_data(data)
-
- return request
-
- def multipart_encode(vars, files, boundary = None, buf = None):
- if boundary is None:
- boundary = mimetools.choose_boundary()
- if buf is None:
- buf = StringIO()
- for(key, value) in vars:
- buf.write('--%s\r\n' % boundary)
- buf.write('Content-Disposition: form-data; name="%s"' % key)
- buf.write('\r\n\r\n' + value + '\r\n')
- for(key, fd) in files:
- file_size = os.fstat(fd.fileno())[stat.ST_SIZE]
- filename = fd.name.split('/')[-1]
- contenttype = mimetypes.guess_type(filename)[0] or 'application/octet-stream'
- buf.write('--%s\r\n' % boundary)
- buf.write('Content-Disposition: form-data; name="%s"; filename="%s"\r\n' % (key, filename))
- buf.write('Content-Type: %s\r\n' % contenttype)
- # buffer += 'Content-Length: %s\r\n' % file_size
- fd.seek(0)
- buf.write('\r\n' + fd.read() + '\r\n')
- buf.write('--' + boundary + '--\r\n\r\n')
- buf = buf.getvalue()
- return boundary, buf
- multipart_encode = Callable(multipart_encode)
-
- https_request = http_request
-
-
-def user_agent_identifier():
- """Return the user agent for the client."""
- client_info = (get_version(), platform.system(), platform.machine())
- return "txclient/%s (%s %s)" % client_info