# built application files
-*.apk
*.ap_
# files for the dex VM
build
# Actionbarsherlock is now ignored since scripts takes care of init the sub-modules.
-actionbarsherlock
\ No newline at end of file
+actionbarsherlock
<provider
android:name=".providers.FileContentProvider"
- android:authorities="@string/authority"
+ android:authorities="com.owncloud.beta"
android:enabled="true"
- android:exported="false"
+ android:exported="true"
android:label="@string/sync_string_files"
android:syncable="true"></provider>
+ <provider
+ android:name=".ui.adapter.DiskLruImageCacheFileProvider"
+ android:authorities="com.owncloud.beta.imageCache.provider">
+ </provider>
+
<activity
android:name=".authentication.AuthenticatorActivity"
android:exported="true"
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
+ <intent-filter>
+ <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
+ <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
+ </intent-filter>
</receiver>
<receiver android:name=".files.BootupBroadcastReceiver">
<intent-filter>
-## 1.8.0 (September 2015)
-- New MATERIAL DESIGN theme
-- Updated FILE TYPE ICONS
-- Preview TXT files within the app
-- COPY files & folders
-- Preview the full file/folder name from the long press menu
-- Set a file as FAVORITE (kept-in-sync) from the CONTEXT MENU
-- Updated CONFLICT RESOLUTION dialog (wording)
-- Updated background for images with TRANSPARENCY in GALLERY
-- Hidden files will not enforce list view instead of GRID VIEW (folders from Picasa & others)
-- Security:
- + Updated network stack with security fixes (Jackrabbit 2.10.1)
-- Bugs fixed:
- + Fixed crash when ETag is lost
- + Passcode creation not restarted on device rotation
- + Recovered share icon shown on folders 'shared with me'
- + User name added to subject when sending a share link through e-mail (fixed on SAMLed apps)
-
-## 1.7.2 (July 2015)
-- New navigation drawer
-- Improved Passcode
-- Automatic grid view just for folders full of images
-- More characters allowed in file names
-- Support for servers in same domain, different path
-- Bugs fixed:
- + Frequent crashes in folder with several images
- + Sync error in servers with huge quota and external storage enable
- + Share by link error
- + Some other crashes and minor bugs
-
-## 1.7.1 (April 2015)
-
-- Share link even with password enforced by server
-- Get the app ready for oc 8.1 servers
-- Added option to create new folder in uploads from external apps
-- Improved management of deleted users
-- Bugs fixed
- + Fixed crash on Android 2.x devices
- + Improvements on uploads
-
-## 1.7.0 (February 2015)
-
-- Download full folders
-- Grid view for images
-- Remote thumbnails (OC Server 8.0+)
-- Added number of files and folders at the end of the list
-- "Open with" in contextual menu
-- Downloads added to Media Provider
-- Uploads:
- + Local thumbnails in section "Files"
- + Multiple selection in "Content from other apps" (Android 4.3+)
-- Gallery:
- + proper handling of EXIF
- + obey sorting in the list of files
-- Settings view updated
-- Improved subjects in e-mails
-- Bugs fixed
-
-
-
+# 2015-10-29
+- PR [#1099](https://github.com/owncloud/android/pull/1099) "Switch list vs grid" merged
+- PR [#1100](https://github.com/owncloud/android/pull/1100) "Material FAB with speed dial implementation" merged
+- PR [#1209](https://github.com/owncloud/android/pull/1209) "Material buttons - before in #1090" merged
+- PR [#1205](https://github.com/owncloud/android/pull/1205) "Switch between online and offline files" merged
+- PR [#1195](https://github.com/owncloud/android/pull/1195) "Resize Cache" merged
+
+
+# 2015-10-26
+- start of branch
+- PR [#745](https://github.com/owncloud/android/pull/745) merged
+- PR [#1044](https://github.com/owncloud/android/pull/1044) merged: < 8.1: GalleryPlus app needed, >= 8.2 Gallery app needed
+- PR [#1111](https://github.com/owncloud/android/pull/1111) merged
\ No newline at end of file
-#This is the Android client for [ownCloud][0]
+#This is the BETA Android client for [ownCloud][0]
+
+The BETA app is only intended to be used by experienced users that want to use and test the latest features.
+All pull requests labeled "3 - to review" or higher will be included into the branch.
+If you find a bug please comment in the corresponding pull request or create a new issue with the label "Beta".
+
+The compiled APKs can be found [here][2]
+
+The changelog is found [here][3]
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.
## Build Status on
-Git master: 
-
-Git stable: 
+Git beta: 
## Development
[0]: https://github.com/owncloud/core
[1]: https://github.com/owncloud/android/blob/master/SETUP.md
+[2]: https://github.com/owncloud/android/tree/beta/apks/
+[3]: https://github.com/owncloud/android/blob/beta/CHANGELOG.md
### Contributing
Please see [Contribution Guidelines](https://owncloud.org/contribute/). Fork this repository and contribute back using
* Choose the projects with the next names under the 'New Project Name' column:
** owncloud-android
** android-support-appcompat-v7-exploded-aar
+** com-getbase-floatingactionbutton-1-10-0-exploded-aar
** owncloud-android-workaround-accounts (optional)
** ownCloud Android Library
** ownCloud Sample Client (optional)
* If any error persists, clean and build manually the next projects in order:
** ownCloud Android Library
** android-support-appcompat-v7-exploded-aar
+** com-getbase-floatingactionbutton-1-10-0-exploded-aar
** owncloud-android
* If any error on those projects persists, check the project properties. In the 'Android' section, API Level should be
** ownCloud Android Library -> API level 19
** android-support-appcompat-v7-exploded-aa -> API level 22
-** owncloud-android -> API level 22 ; in this project, two library projects should appear referred in the bottom of the dialog: libs\android-support-appcompat-v7-exploded-aar and owncloud-android-library. Add them if needed.
+** owncloud-android -> API level 22 ; in this project, three library projects should appear referred in the bottom of the dialog: libs\android-support-appcompat-v7-exploded-aar, ** com-getbase-floatingactionbutton-1-10-0-exploded-aar and owncloud-android-library. Add them if needed.
* After those actions you should be good to go. HAVE FUN!
modifications com.ortiz.touch.ExtendedViewPager and com.ortiz.touch.TouchImageView classes.
See https://github.com/MikeOrtiz/TouchImageView
-
\ No newline at end of file
+ * floatingactionbutton 1.10.0.
+ Copyright (c) 2014 Jerzy Chalupski
+ Licensed under Apache License, Version 2.0.
+ placed at libs/com-getbase-floatingactionbutton-1-10-0-exploded-aar has been exploded by ownCloud Inc.
+ See https://github.com/futuresimple/android-floating-action-button
\ No newline at end of file
compile project(':owncloud-android-library')
compile 'com.jakewharton:disklrucache:2.0.2'
compile 'com.android.support:appcompat-v7:22.2.1'
+ compile 'com.getbase:floatingactionbutton:1.10.1'
}
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
+
+ defaultConfig {
+ applicationId "com.owncloud.android.beta"
+ }
+
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <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>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<manifest
+ package="com.getbase.floatingactionbutton"
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:versionCode="15"
+ android:versionName="1.10.1" >
+
+ <uses-sdk
+ android:minSdkVersion="14"
+ android:targetSdkVersion="22" />
+
+ <application />
+
+</manifest>
\ No newline at end of file
--- /dev/null
+int attr fab_addButtonColorNormal 0x7f010009
+int attr fab_addButtonColorPressed 0x7f010008
+int attr fab_addButtonPlusIconColor 0x7f01000b
+int attr fab_addButtonSize 0x7f01000a
+int attr fab_addButtonStrokeVisible 0x7f01000c
+int attr fab_colorDisabled 0x7f010002
+int attr fab_colorNormal 0x7f010003
+int attr fab_colorPressed 0x7f010001
+int attr fab_expandDirection 0x7f01000f
+int attr fab_icon 0x7f010004
+int attr fab_labelStyle 0x7f01000d
+int attr fab_labelsPosition 0x7f01000e
+int attr fab_plusIconColor 0x7f010000
+int attr fab_size 0x7f010005
+int attr fab_stroke_visible 0x7f010007
+int attr fab_title 0x7f010006
+int dimen fab_actions_spacing 0x7f030000
+int dimen fab_icon_size 0x7f030001
+int dimen fab_labels_margin 0x7f030002
+int dimen fab_plus_icon_size 0x7f030003
+int dimen fab_plus_icon_stroke 0x7f030004
+int dimen fab_shadow_offset 0x7f030005
+int dimen fab_shadow_radius 0x7f030006
+int dimen fab_size_mini 0x7f030007
+int dimen fab_size_normal 0x7f030008
+int dimen fab_stroke_width 0x7f030009
+int drawable fab_bg_mini 0x7f020000
+int drawable fab_bg_normal 0x7f020001
+int id down 0x7f040006
+int id fab_expand_menu_button 0x7f040000
+int id fab_label 0x7f040001
+int id left 0x7f040004
+int id mini 0x7f040002
+int id normal 0x7f040003
+int id right 0x7f040005
+int id up 0x7f040007
+int[] styleable AddFloatingActionButton { 0x7f010000 }
+int styleable AddFloatingActionButton_fab_plusIconColor 0
+int[] styleable FloatingActionButton { 0x7f010001, 0x7f010002, 0x7f010003, 0x7f010004, 0x7f010005, 0x7f010006, 0x7f010007 }
+int styleable FloatingActionButton_fab_colorDisabled 1
+int styleable FloatingActionButton_fab_colorNormal 2
+int styleable FloatingActionButton_fab_colorPressed 0
+int styleable FloatingActionButton_fab_icon 3
+int styleable FloatingActionButton_fab_size 4
+int styleable FloatingActionButton_fab_stroke_visible 6
+int styleable FloatingActionButton_fab_title 5
+int[] styleable FloatingActionsMenu { 0x7f010008, 0x7f010009, 0x7f01000a, 0x7f01000b, 0x7f01000c, 0x7f01000d, 0x7f01000e, 0x7f01000f }
+int styleable FloatingActionsMenu_fab_addButtonColorNormal 1
+int styleable FloatingActionsMenu_fab_addButtonColorPressed 0
+int styleable FloatingActionsMenu_fab_addButtonPlusIconColor 3
+int styleable FloatingActionsMenu_fab_addButtonSize 2
+int styleable FloatingActionsMenu_fab_addButtonStrokeVisible 4
+int styleable FloatingActionsMenu_fab_expandDirection 7
+int styleable FloatingActionsMenu_fab_labelStyle 5
+int styleable FloatingActionsMenu_fab_labelsPosition 6
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<manifest
+ package="com.getbase.floatingactionbutton"
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:versionCode="15"
+ android:versionName="1.10.1" >
+
+ <uses-sdk
+ android:minSdkVersion="14"
+ android:targetSdkVersion="22" />
+
+ <application />
+
+</manifest>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="com-getbase-floatingactionbutton-1-10-0-exploded-aar" 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>
--- /dev/null
+# keep getters/setters in RotatingDrawable so that animations can still work.
+-keepclassmembers class com.getbase.floatingactionbutton.FloatingActionsMenu$RotatingDrawable {
+ void set*(***);
+ *** get*();
+}
--- /dev/null
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=android-22
+android.library=true
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <declare-styleable name="AddFloatingActionButton"><attr format="color" name="fab_plusIconColor"/></declare-styleable>
+ <declare-styleable name="FloatingActionButton"><attr format="color" name="fab_colorPressed"/><attr format="color" name="fab_colorDisabled"/><attr format="color" name="fab_colorNormal"/><attr format="reference" name="fab_icon"/><attr format="enum" name="fab_size"><enum name="normal" value="0"/><enum name="mini" value="1"/></attr><attr format="string" name="fab_title"/><attr format="boolean" name="fab_stroke_visible"/></declare-styleable>
+ <declare-styleable name="FloatingActionsMenu"><attr format="color" name="fab_addButtonColorPressed"/><attr format="color" name="fab_addButtonColorNormal"/><attr format="enum" name="fab_addButtonSize"><enum name="normal" value="0"/><enum name="mini" value="1"/></attr><attr format="color" name="fab_addButtonPlusIconColor"/><attr format="boolean" name="fab_addButtonStrokeVisible"/><attr format="reference" name="fab_labelStyle"/><attr format="enum" name="fab_labelsPosition"><enum name="left" value="0"/><enum name="right" value="1"/></attr><attr format="enum" name="fab_expandDirection"><enum name="up" value="0"/><enum name="down" value="1"/><enum name="left" value="2"/><enum name="right" value="3"/></attr></declare-styleable>
+ <!-- From: file:/Users/chalup/src/android-floating-action-button/library/src/main/res/values/dimens.xml -->
+ <eat-comment/>
+ <dimen name="fab_actions_spacing">16dp</dimen>
+ <dimen name="fab_icon_size">24dp</dimen>
+ <dimen name="fab_labels_margin">8dp</dimen>
+ <dimen name="fab_plus_icon_size">14dp</dimen>
+ <dimen name="fab_plus_icon_stroke">2dp</dimen>
+ <dimen name="fab_shadow_offset">3dp</dimen>
+ <dimen name="fab_shadow_radius">9dp</dimen>
+ <dimen name="fab_size_mini">40dp</dimen>
+ <dimen name="fab_size_normal">56dp</dimen>
+ <dimen name="fab_stroke_width">1dp</dimen>
+ <!-- From: file:/Users/chalup/src/android-floating-action-button/library/src/main/res/values/ids.xml -->
+ <eat-comment/>
+ <item name="fab_expand_menu_button" type="id"/>
+ <item name="fab_label" type="id"/>
+</resources>
\ No newline at end of file
--- /dev/null
+This hidden file is there to ensure there is an src folder.
+Once we support binary library this will go away.
\ No newline at end of file
-Subproject commit 5985ba9a9fd9a208b2a09ee7809949874e0c3a97
+Subproject commit 652cd28bb15672eaedfe8c1d9a46cf293c909b89
target=android-22
android.library.reference.1=owncloud-android-library
android.library.reference.2=libs/android-support-appcompat-v7-exploded-aar
+android.library.reference.3=libs/com-getbase-floatingactionbutton-1-10-1-exploded-aar
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="@color/black_semi_transparent"/>
+ <padding
+ android:left="@dimen/standard_padding"
+ android:top="4dp"
+ android:right="@dimen/standard_padding"
+ android:bottom="4dp"/>
+ <corners
+ android:radius="2dp"/>
+</shape>
\ No newline at end of file
android:inputType="textUri"\r
android:drawablePadding="5dp"\r
android:paddingRight="55dp"\r
- android:textColor="@color/primary"\r
android:textColorHint="@color/login_text_hint_color"\r
android:contentDescription="@string/auth_host_address"\r
>\r
android:text="@string/oauth2_url_endpoint_auth"\r
android:singleLine="true"\r
android:inputType="textUri"\r
- android:textColor="@color/primary"\r
android:textColorHint="@color/login_text_hint_color"\r
android:visibility="gone">\r
</EditText> \r
android:text="@string/oauth2_url_endpoint_access"\r
android:singleLine="true"\r
android:inputType="textUri"\r
- android:textColor="@color/primary"\r
android:textColorHint="@color/login_text_hint_color"\r
android:visibility="gone">\r
<requestFocus />\r
android:ems="10"\r
android:hint="@string/auth_username"\r
android:inputType="textNoSuggestions"\r
- android:textColor="@color/primary"\r
android:textColorHint="@color/login_text_hint_color"\r
android:contentDescription="@string/auth_username"\r
/>\r
android:hint="@string/auth_password"\r
android:inputType="textPassword"\r
android:drawablePadding="5dp"\r
- android:textColor="@color/primary"\r
android:textColorHint="@color/login_text_hint_color"\r
/>\r
\r
android:orientation="horizontal" >
<!-- 'OK' / 'CANCEL' BUTTONS CHANGE THEIR ORDER FROM ANDROID 4.0 ; THANKS, GOOGLE -->
- <Button
+ <android.support.v7.widget.AppCompatButton
android:id="@+id/cancel"
+ android:theme="@style/Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/common_cancel" />
- <Button
+ <android.support.v7.widget.AppCompatButton
android:id="@+id/ok"
+ android:theme="@style/Button.Primary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="textUri"\r
android:drawablePadding="5dp"\r
android:paddingRight="55dp"\r
- android:textColor="@color/primary"\r
android:textColorHint="@color/login_text_hint_color"\r
android:contentDescription="@string/auth_host_address"\r
>\r
android:padding="0dp"\r
android:scaleType="fitCenter"\r
android:src="@drawable/ic_action_refresh_grey"\r
- android:onClick="onRefreshClick"\r
android:visibility="gone"\r
android:background="@android:color/transparent"\r
android:contentDescription="@string/auth_refresh_button"\r
android:layout_height="wrap_content"\r
android:ems="10"\r
android:enabled="false"\r
- android:textColor="@color/primary"\r
android:textColorHint="@color/login_text_hint_color"\r
android:text="@string/oauth2_url_endpoint_auth"\r
android:singleLine="true"\r
android:text="@string/oauth2_url_endpoint_access"\r
android:singleLine="true"\r
android:inputType="textUri"\r
- android:textColor="@color/primary"\r
android:textColorHint="@color/login_text_hint_color"\r
android:visibility="gone"/>\r
\r
android:ems="10"\r
android:hint="@string/auth_username"\r
android:inputType="textNoSuggestions"\r
- android:textColor="@color/primary"\r
android:textColorHint="@color/login_text_hint_color"\r
android:contentDescription="@string/auth_username"\r
/>\r
android:ems="10"\r
android:hint="@string/auth_password"\r
android:inputType="textPassword"\r
- android:textColor="@color/primary"\r
android:textColorHint="@color/login_text_hint_color"\r
android:contentDescription="@string/auth_password"\r
/>\r
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="100dp"
- android:paddingTop="16dp"
- android:paddingBottom="16dp"
+ android:paddingTop="@dimen/standard_padding"
+ android:paddingBottom="@dimen/standard_padding"
android:background="@color/owncloud_blue_accent">
<ImageView
android:id="@+id/itemIcon"
android:layout_width="24sp"
android:layout_height="24sp"
- android:layout_marginLeft="16sp"
+ android:layout_marginLeft="@dimen/standard_padding"
android:layout_marginBottom="3dp"
android:layout_gravity="bottom"
android:src="@drawable/ic_account_circle"
android:text="@string/app_name"
android:textColor="#FFF"
android:paddingLeft="22dp"
- android:paddingRight="16dp"
+ android:paddingRight="@dimen/standard_padding"
android:textSize="24sp"
android:ellipsize="end"
android:singleLine="true"
android:layout_alignParentLeft="true"
android:orientation="horizontal"
android:background="@color/background_color"
- android:layout_marginTop="16dp"
- android:layout_marginBottom="16dp"
+ android:layout_marginTop="@dimen/standard_margin"
+ android:layout_marginBottom="@dimen/standard_margin"
android:minHeight="?android:attr/listPreferredItemHeight">
<ImageView
android:id="@+id/itemIcon"
android:layout_width="24sp"
android:layout_height="24sp"
- android:layout_marginLeft="16sp"
+ android:layout_marginLeft="@dimen/standard_margin"
android:layout_gravity="center_vertical"
/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="22dp"
- android:paddingRight="16dp"
+ android:paddingRight="@dimen/standard_margin"
android:textColor="@color/drawerMenuTextColor"
android:text="@string/app_name"
android:textStyle="normal"
android:layout_width="fill_parent"
android:layout_height="56dp"
android:gravity="center_vertical"
- android:paddingLeft="16dp"
- android:paddingRight="16dp"
- android:textColor="#000"
+ android:paddingLeft="@dimen/standard_padding"
+ android:paddingRight="@dimen/standard_padding"
+ android:textColor="@color/black"
android:textSize="18dp" />
\ No newline at end of file
android:id="@+id/fdFileHeaderContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginLeft="16dp"
- android:layout_marginRight="16dp"
- android:layout_marginTop="4dp" >
+ android:layout_marginLeft="@dimen/standard_margin"
+ android:layout_marginRight="@dimen/standard_margin"
+ android:layout_marginTop="@dimen/standard_margin">
<ImageView
android:id="@+id/fdIcon"
android:id="@+id/fdDetailsContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginLeft="16dp"
- android:layout_marginRight="16dp"
+ android:layout_marginLeft="@dimen/standard_margin"
+ android:layout_marginRight="@dimen/standard_margin"
+ android:layout_marginTop="@dimen/standard_margin"
android:layout_below="@id/fdFileHeaderContainer" >
<RelativeLayout
android:id="@+id/fdTypeLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginTop="24dp"
android:text="@string/filedetails_type"
android:textAppearance="?android:attr/textAppearanceMedium" />
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
- android:layout_marginLeft="12dp"
+ android:layout_marginLeft="@dimen/standard_margin"
android:layout_toRightOf="@+id/fdLabelContainer" >
<TextView
android:id="@+id/fdType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginTop="24dp"
android:text="@string/placeholder_filetype"
android:textAppearance="?android:attr/textAppearanceMedium" />
android:layout_height="wrap_content"
android:layout_below="@+id/fdDetailsContainer"
android:gravity="center_horizontal"
- android:layout_margin="16dp"
+ android:layout_margin="@dimen/standard_margin"
>
- <CheckBox
+ <android.support.v7.widget.AppCompatCheckBox
android:id="@+id/fdFavorite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
- android:text="@string/favorite" />
+ android:text="@string/favorite"
+ android:checked="false" />
<LinearLayout
android:layout_width="match_parent"
android:id="@+id/image_preview"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_margin="16dp"
+ android:layout_margin="@dimen/standard_margin"
android:layout_gravity="center"
android:contentDescription="@string/preview_image_description"
android:src="@drawable/logo" />
<android.support.v7.widget.AppCompatButton
android:id="@+id/folder_picker_btn_cancel"
- style="@style/ownCloud.Button"
+ android:theme="@style/Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
<android.support.v7.widget.AppCompatButton
android:id="@+id/folder_picker_btn_choose"
- style="@style/ownCloud.Button"
+ android:theme="@style/Button.Primary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
<android.support.v7.widget.AppCompatButton
android:id="@+id/ok"
- style="@style/ownCloud.Button"
+ android:theme="@style/Button.Primary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
<android.support.v7.widget.AppCompatButton
android:id="@+id/cancel"
- style="@style/ownCloud.Button"
+ android:theme="@style/Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
<TextView
android:id="@+id/footerText"
android:layout_width="match_parent"
- android:layout_height="56dp"
+ android:layout_height="wrap_content"
+ android:padding="@dimen/standard_padding"
android:layout_gravity="center"
android:gravity="center"
- android:textColor="@color/setup_text_hint"
+ android:textColor="@color/secondaryTextColor"
/>
</LinearLayout>
\ No newline at end of file
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"
+ xmlns:fab="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
+ xmlns:fab="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_weight="1" >
+ android:layout_height="match_parent">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipe_containing_list"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_weight="1"
+ android:layout_height="match_parent"
android:footerDividersEnabled="false"
android:visibility="visible" >
</ScrollView>
</android.support.v4.widget.SwipeRefreshLayout>
-</FrameLayout>
\ No newline at end of file
+</FrameLayout>
+ <com.getbase.floatingactionbutton.FloatingActionsMenu
+ android:id="@+id/fab_main"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
+ fab:fab_addButtonColorNormal="@color/owncloud_blue_accent"
+ fab:fab_addButtonColorPressed="@color/owncloud_blue"
+ fab:fab_addButtonPlusIconColor="@color/white"
+ fab:fab_labelStyle="@style/menu_labels_style"
+ android:layout_marginBottom="@dimen/standard_margin"
+ android:layout_marginRight="@dimen/standard_margin"
+ android:layout_marginEnd="@dimen/standard_margin"
+ android:visibility="gone">
+
+ <com.getbase.floatingactionbutton.FloatingActionButton
+ android:id="@+id/fab_upload"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ fab:fab_size="mini"
+ fab:fab_icon="@drawable/ic_action_upload"
+ fab:fab_colorNormal="@color/owncloud_blue_accent"
+ fab:fab_colorPressed="@color/owncloud_blue"
+ fab:fab_title=""/>
+
+ <com.getbase.floatingactionbutton.FloatingActionButton
+ android:id="@+id/fab_mkdir"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ fab:fab_size="mini"
+ fab:fab_icon="@drawable/ic_action_create_dir"
+ fab:fab_colorNormal="@color/owncloud_blue_accent"
+ fab:fab_colorPressed="@color/owncloud_blue"
+ fab:fab_title=""/>
+
+ <com.getbase.floatingactionbutton.FloatingActionButton
+ android:id="@+id/fab_upload_from_app"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ fab:fab_size="mini"
+ fab:fab_icon="@drawable/ic_import"
+ fab:fab_colorNormal="@color/owncloud_blue_accent"
+ fab:fab_colorPressed="@color/owncloud_blue"
+ fab:fab_title=""/>
+
+ </com.getbase.floatingactionbutton.FloatingActionsMenu>
+</RelativeLayout>
\ No newline at end of file
android:layout_width="match_parent"\r
android:background="@drawable/list_selector"\r
android:orientation="vertical"\r
- android:layout_height="56dp">\r
+ android:layout_height="72dp">\r
\r
<LinearLayout\r
android:layout_width="match_parent"\r
android:orientation="horizontal">\r
\r
<FrameLayout\r
- android:layout_width="56dp"\r
- android:layout_height="56dp"\r
+ android:layout_width="60dp"\r
+ android:layout_height="72dp"\r
+ android:paddingLeft="12dp"\r
+ android:paddingBottom="@dimen/standard_padding"\r
+ android:paddingTop="@dimen/standard_padding"\r
+ android:paddingRight="4dp"\r
android:focusable="false"\r
android:focusableInTouchMode="false">\r
\r
android:id="@+id/localFileIndicator"\r
android:layout_width="@dimen/file_icon_size"\r
android:layout_height="@dimen/file_icon_size"\r
- android:layout_gravity="center_vertical"\r
- android:layout_marginLeft="22dp"\r
+ android:layout_gravity="top|right"\r
+ android:layout_marginRight="4dp"\r
android:src="@drawable/local_file_indicator" />\r
\r
<ImageView\r
android:id="@+id/thumbnail"\r
android:layout_width="@dimen/file_icon_size"\r
android:layout_height="@dimen/file_icon_size"\r
- android:layout_gravity="center_vertical"\r
- android:layout_marginLeft="12dp"\r
+ android:layout_gravity="left|center_vertical"\r
android:src="@drawable/ic_menu_archive" />\r
\r
<ImageView\r
android:layout_width="wrap_content"\r
android:layout_height="wrap_content"\r
android:layout_gravity="bottom|right"\r
- android:layout_marginBottom="10dp"\r
- android:layout_marginRight="2dp"\r
+ android:layout_marginRight="4dp"\r
android:src="@drawable/ic_favorite" />\r
</FrameLayout>\r
\r
android:layout_width="0dp"\r
android:layout_height="match_parent"\r
android:layout_weight="1"\r
- android:gravity="center_vertical"\r
+ android:gravity="top"\r
+ android:paddingTop="@dimen/standard_padding"\r
android:orientation="vertical" >\r
\r
<TextView\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_marginLeft="0dp"\r
android:layout_marginRight="4dp"\r
android:ellipsize="middle"\r
android:singleLine="true"\r
android:text="TextView"\r
- android:textColor="#303030"\r
- android:textSize="16dip" />\r
+ android:textColor="@color/textColor"\r
+ android:textSize="@dimen/two_line_primary_text_size" />\r
\r
<LinearLayout\r
android:layout_width="match_parent"\r
android:layout_height="wrap_content"\r
- android:layout_marginLeft="4dp"\r
+ android:layout_marginLeft="0dp"\r
android:layout_marginRight="4dp"\r
- android:weightSum="1">\r
+ android:orientation="horizontal">\r
\r
<TextView\r
android:id="@+id/last_mod"\r
android:layout_width="wrap_content"\r
android:layout_height="wrap_content"\r
android:text="TextView"\r
- android:layout_weight=".5"\r
android:textColor="@color/list_item_lastmod_and_filesize_text"\r
- android:textSize="12dip"/>\r
+ android:textSize="@dimen/two_line_secondary_text_size"/>\r
+\r
+ <TextView\r
+ android:id="@+id/file_separator"\r
+ android:layout_width="wrap_content"\r
+ android:layout_height="wrap_content"\r
+ android:gravity="right"\r
+ android:text=", "\r
+ android:textColor="@color/list_item_lastmod_and_filesize_text"\r
+ android:textSize="@dimen/two_line_secondary_text_size"/>\r
\r
<TextView\r
android:id="@+id/file_size"\r
android:gravity="right"\r
android:text="TextView"\r
android:textColor="@color/list_item_lastmod_and_filesize_text"\r
- android:layout_weight=".5"\r
- android:textSize="12dip"/>\r
+ android:textSize="@dimen/two_line_secondary_text_size"/>\r
\r
</LinearLayout>\r
\r
android:layout_height="wrap_content"\r
android:layout_gravity="center_vertical"\r
android:layout_marginLeft="4dp"\r
- android:layout_marginRight="4dp"\r
+ android:layout_marginRight="@dimen/standard_margin"\r
android:gravity=""\r
- android:src="@android:drawable/checkbox_off_background" />\r
+ android:src="@drawable/ic_checkbox_blank_outline" />\r
</LinearLayout>\r
\r
<View\r
android:clickable="true"
android:orientation="vertical"
android:background="#fff"
- android:paddingLeft="16dp"
+ android:paddingLeft="@dimen/standard_padding"
tools:context=".MainActivity" >
<TextView
android:layout_height="wrap_content"
android:drawablePadding="5dp"
android:gravity="center_vertical"
- android:paddingLeft="16dp"
+ android:paddingLeft="@dimen/standard_padding"
android:textSize="16dp" >
</TextView>
android:layout_height="56dp"
android:layout_marginLeft="8dp"
android:gravity="left"
- android:paddingLeft="16dp"
+ android:paddingLeft="@dimen/standard_padding"
android:paddingTop="8dp"
android:textSize="16dp"
android:groupIndicator="@android:color/transparent"
android:id="@+id/loadingLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="horizontal" >
+ android:orientation="horizontal"
+ android:padding="@dimen/standard_padding">
<ProgressBar
android:id="@+id/loadingBar"
+ style="?android:attr/progressBarStyle"
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" />
+ android:indeterminate="true"
+ android:indeterminateOnly="false"/>
<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:layout_marginLeft="@dimen/standard_margin"
android:text="TextView" />
</LinearLayout>
android:textStyle="bold"
android:textSize="22dp"
android:textColor="#000000"
- android:layout_marginTop="5dp"
- android:layout_marginBottom="5dp" />
+ android:layout_marginBottom="@dimen/standard_margin" />
</LinearLayout>
\ No newline at end of file
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
- android:padding="10dp"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
android:weightSum="1" >
<ScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="0dp"
- android:layout_marginBottom="15dp"
- android:layout_weight="1" >
+ android:layout_marginBottom="@dimen/standard_margin"
+ android:layout_weight="1">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical" >
+ android:orientation="vertical"
+ android:paddingLeft="@dimen/standard_padding"
+ android:paddingRight="@dimen/standard_padding">
<TextView
android:id="@+id/logTV"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:text="@string/empty" />
+ android:text="@string/empty"
+ android:typeface="monospace"/>
</LinearLayout>
</ScrollView>
android:id="@+id/historyButtonBar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:orientation="horizontal" >
+ android:orientation="horizontal"
+ android:layout_marginBottom="@dimen/standard_margin"
+ android:layout_marginLeft="@dimen/standard_margin"
+ android:layout_marginRight="@dimen/standard_margin">
- <android.support.v7.widget.AppCompatButton
+ <Button
android:id="@+id/deleteLogHistoryButton"
- style="@style/ownCloud.Button"
+ android:theme="@style/Button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
<android.support.v7.widget.AppCompatButton
android:id="@+id/sendLogHistoryButton"
- style="@style/ownCloud.Button"
+ android:theme="@style/Button.Primary"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<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:gravity="center_horizontal"
android:orientation="vertical"
- android:padding="20dp" >
+ android:padding="@dimen/standard_padding" >
<TextView
android:text="@string/pass_code_enter_pass_code"
android:textColor="@android:color/black"
android:gravity="center_horizontal"
+ android:textSize="16sp"
/>
<TextView
android:text="@string/pass_code_configure_your_pass_code_explanation"
android:textAppearance="@android:style/TextAppearance.Small"
android:gravity="center_horizontal"
+ android:textSize="14sp"
/>
<LinearLayout
<android.support.v7.widget.AppCompatButton
android:id="@+id/cancel"
- style="@style/ownCloud.Button"
+ android:theme="@style/Button.Primary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/common_cancel" />
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
- android:padding="16dp"
+ android:padding="@dimen/standard_padding"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
- android:paddingBottom="16dp"
+ android:paddingBottom="@dimen/standard_padding"
android:text="@string/ssl_validator_header"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="@android:color/black"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
- android:paddingTop="16dp"
+ android:paddingTop="@dimen/standard_padding"
android:text="@string/ssl_validator_question"
android:textAppearance="?android:attr/textAppearanceMedium"
>
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
- android:padding="16dp">
+ android:padding="@dimen/standard_padding">
<TextView
android:id="@+id/header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/ssl_validator_header"
- android:paddingBottom="16dp"
+ android:paddingBottom="@dimen/standard_padding"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="@color/black"
/>
android:id="@+id/question"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:paddingTop="16dp"
+ android:paddingTop="@dimen/standard_padding"
android:text="@string/ssl_validator_question"
android:textAppearance="?android:attr/textAppearanceMedium"
>
\r
<android.support.v7.widget.AppCompatButton\r
android:id="@+id/upload_files_btn_cancel"\r
- style="@style/ownCloud.Button"\r
+ android:theme="@style/Button"\r
android:layout_width="wrap_content"\r
android:layout_height="wrap_content"\r
android:layout_weight="1"\r
\r
<android.support.v7.widget.AppCompatButton\r
android:id="@+id/upload_files_btn_upload"\r
- style="@style/ownCloud.Button"\r
+ android:theme="@style/Button.Primary"\r
android:layout_width="wrap_content"\r
android:layout_height="wrap_content"\r
android:layout_weight="1"\r
android:orientation="horizontal" >
<android.support.v7.widget.AppCompatButton
+ android:theme="@style/Button"
android:id="@+id/uploader_cancel"
style="@style/ownCloud.Button"
android:layout_width="fill_parent"
<android.support.v7.widget.AppCompatButton
android:id="@+id/uploader_choose_folder"
- style="@style/ownCloud.Button"
+ android:theme="@style/Button.Primary"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_width="fill_parent"
android:background="#fefefe"
android:orientation="horizontal"
- android:layout_height="56dp" >
+ android:layout_height="72dp"
+ android:padding="@dimen/standard_padding">
<ImageView
- android:layout_width="20dp"
- android:layout_height="20dp"
+ android:layout_width="@dimen/file_icon_size"
+ android:layout_height="@dimen/file_icon_size"
android:layout_gravity="center_vertical|center"
- android:layout_margin="4dp"
android:src="@drawable/ic_menu_archive"
- android:id="@+id/thumbnail" />
+ android:id="@+id/thumbnail"
+ android:layout_marginRight="@dimen/standard_padding"/>
<TextView
android:text="TextView"
-<?xml version="1.0" encoding="utf-8"?><!--
+<?xml version="1.0" encoding="utf-8"?>
+<!--
ownCloud Android client application
Copyright (C) 2012 Bartek Przybylski
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
- android:id="@+id/action_upload"
- android:icon="@drawable/ic_action_upload"
- android:orderInCategory="2"
- app:showAsAction="always"
- android:title="@string/actionbar_upload"
- android:contentDescription="@string/actionbar_upload"/>
- <item
android:id="@+id/action_create_dir"
android:icon="@drawable/ic_action_create_dir"
- android:orderInCategory="2"
+ android:orderInCategory="1"
app:showAsAction="always"
android:title="@string/actionbar_mkdir"
android:contentDescription="@string/actionbar_mkdir"/>
<item
- android:id="@+id/action_sync_account"
- android:icon="@drawable/ic_action_refresh"
+ android:id="@+id/action_switch_view"
+ android:icon="@drawable/ic_view_module"
android:orderInCategory="2"
app:showAsAction="never"
+ android:title="@string/action_switch_grid_view" />
+ <item
+ android:id="@+id/action_sync_account"
+ android:icon="@drawable/ic_action_refresh"
+ android:orderInCategory="1"
+ app:showAsAction="always"
android:title="@string/actionbar_sync"
android:contentDescription="@string/actionbar_sync"/>
<item
android:id="@+id/action_sort"
- android:icon="@android:drawable/ic_menu_sort_by_size"
- android:orderInCategory="2"
- app:showAsAction="never"
+ android:icon="@drawable/ic_sort_variant"
+ android:orderInCategory="1"
+ app:showAsAction="ifRoom"
android:title="@string/actionbar_sort"
android:contentDescription="@string/actionbar_sort"/>
<string name="file_list_seconds_ago">před pár sekundami</string>
<string name="file_list_empty">Žádný obsah. Nahrajte něco!</string>
<string name="file_list_loading">Načítání...</string>
+ <string name="file_list_no_app_for_file_type">Nebyla nalezena aplikace pro tento typ souboru!</string>
<string name="local_file_list_empty">V tomto adresáři nejsou žádné soubory.</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="file_list_seconds_ago">Gerade eben</string>
<string name="file_list_empty">Alles leer. Lade etwas hoch!</string>
<string name="file_list_loading">Lade…</string>
+ <string name="file_list_no_app_for_file_type">Es wurden keine Apps für den Dateityp gefunden!</string>
<string name="local_file_list_empty">Es befinden sich keine Dateien in diesem Ordner.</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="file_list_seconds_ago">δευτερόλεπτα πριν</string>
<string name="file_list_empty">Δεν υπάρχει τίποτα εδώ. Μεταφορτώστε κάτι!</string>
<string name="file_list_loading">Φόρτωση...</string>
+ <string name="file_list_no_app_for_file_type">Δεν βρέθηκε εφαρμογή για αυτόν τον τύπο αρχείου</string>
<string name="local_file_list_empty">Δεν υπάρχουν αρχεία σε αυτό τον φάκελο.</string>
<string name="filedetails_select_file">Αγγίξτε κάποιο αρχείο για να προβάλετε περισσότερες πληροφορίες.</string>
<string name="filedetails_size">Μέγεθος:</string>
<string name="file_list_seconds_ago">hace segundos</string>
<string name="file_list_empty">No hay nada aquí. ¡Suba algo!</string>
<string name="file_list_loading">Cargando...</string>
+ <string name="file_list_no_app_for_file_type">¡No se encontró una aplicación para el tipo de archivo!</string>
<string name="local_file_list_empty">No hay archivos en esta carpeta.</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="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_foreign_files_forgotten_content">%1$d fفایل از %2$s پوشه نتوانستند کپی شوند در</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="file_list__footer__file_and_folders">1 فایل، %1$d پوشه</string>
<string name="file_list__footer__files">%1$d فایل</string>
<string name="file_list__footer__files_and_folder">%1$d فایل، 1 پوشه</string>
+ <string name="file_list__footer__files_and_folders">%1$d فایل, %2$d پوشه</string>
</resources>
<string name="file_list_seconds_ago">sekuntia sitten</string>
<string name="file_list_empty">Täällä ei ole mitään. Lähetä tänne jotakin!</string>
<string name="file_list_loading">Ladataan…</string>
+ <string name="file_list_no_app_for_file_type">Tälle tiedostotyypille ei löytynyt sovellusta!</string>
<string name="local_file_list_empty">Tässä kansiossa ei ole tiedostoja</string>
<string name="filedetails_select_file">Napauta tiedostoa nähdäksesi lisätietoja.</string>
<string name="filedetails_size">Koko:</string>
<string name="file_list_seconds_ago">il y a quelques secondes</string>
<string name="file_list_empty">Il n\'y a rien ici ! Envoyez donc quelque chose :)</string>
<string name="file_list_loading">Chargement...</string>
+ <string name="file_list_no_app_for_file_type">Aucune app trouvée pour ce type de fichier !</string>
<string name="local_file_list_empty">Aucun fichier n\'est présent dans ce dossier.</string>
- <string name="filedetails_select_file">Appuyez sur un fichier pour afficher les informations supplémentaires</string>
+ <string name="filedetails_select_file">Appuyez sur un fichier pour afficher des informations supplémentaires</string>
<string name="filedetails_size">Taille :</string>
<string name="filedetails_type">Type :</string>
<string name="filedetails_created">Créé le :</string>
<string name="auth_can_not_auth_against_server">Impossible de s\'authentifier sur ce serveur</string>
<string name="auth_account_does_not_exist">Le compte n\'existe pas encore sur ce périphérique</string>
<string name="favorite">Ajouter aux favoris</string>
- <string name="unfavorite">Supprimer des favoris</string>
+ <string name="unfavorite">Retirer des favoris</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="activity_chooser_send_file_title">Envoyer</string>
<string name="copy_link">Copier le lien</string>
<string name="clipboard_text_copied">Copié dans le presse-papier</string>
- <string name="error_cant_bind_to_operations_service">Erreur critique : impossible de réaliser des opérations</string>
+ <string name="error_cant_bind_to_operations_service">Erreur critique : impossible de réaliser les opérations</string>
<string name="network_error_socket_exception">Une erreur est survenue pendant la connexion au serveur.</string>
<string name="network_error_socket_timeout_exception">Une erreur est survenue pendant l\'attente du serveur. L\'opération n\'a pas pu être effectuée</string>
<string name="network_error_connect_timeout_exception">Une erreur est survenue pendant l\'attente du serveur. L\'opération n\'a pas pu être effectuée</string>
<string name="auth_redirect_non_secure_connection_title">Le connexion sécurisée est redirigée vers une route non-sécurisée.</string>
<string name="actionbar_logger">Journaux</string>
<string name="log_send_history_button">Envoyer l\'historique</string>
- <string name="log_send_no_mail_app">Aucune application trouvée pour l\'envoi de journaux. Installer une application de courriel !</string>
+ <string name="log_send_no_mail_app">Aucune application trouvée pour l\'envoi de logs. Installer une application de courriel !</string>
<string name="log_send_mail_subject">Journaux de l\'application Android %1$s</string>
<string name="log_progress_dialog_text">Chargement des données…</string>
<string name="saml_authentication_required_text">Authentification requise</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="actionbar_sort">Rendezés</string>
+ <string name="actionbar_sort_title">Rendezés elve</string>
+ <string-array name="actionbar_sortby">
+ <item>A-Z</item>
+ <item>Újabb - régebbi</item>
+ </string-array>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
<!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
<!--<string name="drawer_item_accounts">Accounts</string>-->
+ <string name="drawer_item_all_files">Összes fájl</string>
<!--TODO re-enable when "On Device" is available
<string name="drawer_item_on_device">On device</string>-->
<string name="drawer_item_settings">Beállítások</string>
+ <string name="drawer_item_logs">Naplófájlok</string>
+ <string name="drawer_close">Bezárás</string>
<string name="drawer_open">Megnyitás</string>
<string name="prefs_category_general">Általános</string>
<string name="prefs_category_more">Több</string>
<string name="uploader_info_uploading">Feltöltés</string>
<string name="file_list_seconds_ago">pár másodperce</string>
<string name="file_list_empty">Itt nincs semmi. Töltsön fel valamit!</string>
+ <string name="file_list_loading">Betöltés...</string>
<string name="local_file_list_empty">Nincs fájl ebben a mappában.</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="instant_video_upload_on_wifi">Videó feltöltés csak WIFI-vel</string>
<string name="instant_upload_path">/InstantUpload</string>
<string name="conflict_keep_both">Mindkettő megtartása</string>
+ <string name="conflict_use_local_version">helyi verzió</string>
+ <string name="conflict_use_server_version">szerver verzió</string>
<string name="preview_image_description">Előnézeti kép</string>
<string name="preview_image_error_unknown_format">Ez a kép nem jeleníthető meg</string>
<string name="error__upload__local_file_not_copied">%1$s nem lehet másolni a %2$s helyi könyvtárba</string>
<string name="share_link_file_error">Hiba lépett fel a mappa megosztásakor</string>
<string name="unshare_link_file_error">Hiba lépett fel a mappa megosztásának visszavonásakor</string>
+ <string name="share_link_password_title">Jelszó beírása</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>
<string name="actionbar_move">Mozgatás</string>
<string name="folder_picker_choose_button_text">Válasszon</string>
<string name="prefs_category_security">Biztonság</string>
+ <string name="shared_subject_header">megosztva</string>
+ <string name="with_you_subject_header">veled</string>
<string name="auth_host_address">A kiszolgáló címe</string>
+ <string name="common_error_out_memory">Nincs elég memória</string>
+ <string name="username">Felhasználónév</string>
+ <string name="file_list__footer__folder">1 könyvtár</string>
+ <string name="file_list__footer__folders">%1$d könyvtár</string>
+ <string name="file_list__footer__file">1 fájl</string>
+ <string name="file_list__footer__file_and_folder">1 fájl, 1 könyvtár</string>
+ <string name="file_list__footer__file_and_folders">1 fájl, %1$d könyvtár</string>
+ <string name="file_list__footer__files">%1$d fájl</string>
+ <string name="file_list__footer__files_and_folder">%1$d fájl, 1 könyvtár</string>
+ <string name="file_list__footer__files_and_folders">%1$d fájl, %2$d könyvtár</string>
</resources>
<string name="common_cancel">Cancellar</string>
<string name="common_error">Error</string>
<string name="common_error_unknown">Error Incognite</string>
+ <string name="about_title">A proposito</string>
<string name="change_password">Cambiar contrasigno</string>
<string name="delete_account">Deler conto</string>
<string name="uploader_info_dirname">Nomine de dossier</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_from_apps">Konten dari aplikasi lain</string>
<string name="actionbar_upload_files">Berkas</string>
<string name="actionbar_open_with">Buka dengan</string>
<string name="actionbar_mkdir">Folder baru</string>
<string name="file_list_seconds_ago">beberapa detik yang lalu</string>
<string name="file_list_empty">Tidak ada apa-apa di sini. Unggah sesuatu!</string>
<string name="file_list_loading">Memuat...</string>
+ <string name="file_list_no_app_for_file_type">Aplikasi tidak ditemukan untuk tipe berkas ini!</string>
<string name="local_file_list_empty">Tidak ada satupun berkas dalam folder ini.</string>
<string name="filedetails_select_file">Sentuh pada berkas untuk menampilkan informasi tambahan</string>
<string name="filedetails_size">Ukuran:</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="common_error_unknown">Kesalahan 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="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="foreign_files_remote_text">Remote: %1$s</string>
<string name="upload_query_move_foreign_files">Ruang tidak cukup untuk menyalin berkas terpilih kedalam folder %1$s. Apakah Anda ingin memindahkannya saja?</string>
<string name="pass_code_enter_pass_code">Silakan masukkan kode sandi Anda</string>
<string name="pass_code_configure_your_pass_code">Masukkan kode sandi Anda</string>
<string name="media_event_done">%1$s pemutaran selesai</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_not_in_owncloud">Berkas 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="file_list_seconds_ago">secondi fa</string>
<string name="file_list_empty">Non c\'è niente qui. Carica qualcosa!</string>
<string name="file_list_loading">Caricamento in corso...</string>
+ <string name="file_list_no_app_for_file_type">Nessuna applicazione trovata per il tipo di file.</string>
<string name="local_file_list_empty">Non ci sono file in questa cartella.</string>
<string name="filedetails_select_file">Tocca un file per visualizzare informazioni aggiuntive.</string>
<string name="filedetails_size">Dimensione:</string>
<string name="file_list_seconds_ago">초 지남</string>
<string name="file_list_empty">내용이 없습니다. 업로드할 수 있습니다!</string>
<string name="file_list_loading">불러오는 중...</string>
+ <string name="file_list_no_app_for_file_type">파일 형식을 열 수 있는 앱이 없습니다!</string>
<string name="local_file_list_empty">이 폴더에 파일이 없습니다.</string>
<string name="filedetails_select_file">파일을 누르면 추가 정보가 표시됩니다.</string>
<string name="filedetails_size">크기:</string>
<item>Biggest - Smallest</item>-->
<!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
<!--<string name="drawer_item_accounts">Accounts</string>-->
+ <string name="drawer_item_all_files">Visi failai</string>
<!--TODO re-enable when "On Device" is available
<string name="drawer_item_on_device">On device</string>-->
<string name="drawer_item_settings">Parinktys</string>
+ <string name="drawer_item_logs">Žurnalai</string>
+ <string name="drawer_close">Užverti</string>
<string name="drawer_open">Atverti</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_passcode">Užrakto kodas</string>
<string name="prefs_instant_upload">Momentiniai nuotraukų įkėlimai</string>
<string name="prefs_instant_upload_summary">Iš karto nusiųsti nufotografuotas nuotraukas</string>
<string name="prefs_instant_video_upload">Momentiniai video įkėlimai</string>
<string name="prefs_remember_last_share_location">Prisiminti bendrinimo vietą</string>
<string name="prefs_remember_last_upload_location_summary">Prisiminti paskutinio bendrinimo įkėlimo vietą</string>
<string name="recommend_subject">Išbandykite %1$s savo išmaniajame telefone!</string>
+ <string name="recommend_text">Noriu pakviesti tave naudotis %1$s išmaniajame telefone!\nParsisiųks čia: %2$s</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="uploader_info_uploading">Išsiunčiama</string>
<string name="file_list_seconds_ago">prieš sekundę</string>
<string name="file_list_empty">Čia tuščia. Įkelkite ką nors!</string>
+ <string name="file_list_loading">Įkeliama...</string>
+ <string name="file_list_no_app_for_file_type">Nėra programėlės šiam failo tipui!</string>
<string name="local_file_list_empty">Šiame aplanke nėra failų.</string>
<string name="filedetails_select_file">Palieskite failą, kad parodyti papildomą informaciją.</string>
<string name="filedetails_size">Dydis:</string>
<string name="filedetails_download">Atsisiųsti</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="list_layout">Sąrašo išdėstymas</string>
<string name="action_share_file">Dalintis nuoroda</string>
<string name="action_unshare_file">Nebesidalinti nuoroda</string>
<string name="common_yes">Taip</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_conflicts_in_favourites_content">%1$d sinchronizuojami failai nebuvo susinchronizuoti</string>
+ <string name="sync_fail_in_favourites_ticker">Sinchronizuojamų failų klaida</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_foreign_files_forgotten_content">%1$d failai iš %2$s aplanko negali būti nukopijuoti</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="upload_query_move_foreign_files">Pasirinktiems failams nepakanka vietos %1$s aplanke. Gal juos perkelti?</string>
+ <string name="pass_code_enter_pass_code">Prašau įterpti užraktą</string>
+ <string name="pass_code_configure_your_pass_code">Įveskite užraktą</string>
+ <string name="pass_code_configure_your_pass_code_explanation">Kiekvieną kartą paleidus programėle bus reikalaujamas užraktas</string>
+ <string name="pass_code_reenter_your_pass_code">Prašau pakartoti užraką</string>
+ <string name="pass_code_remove_your_pass_code">Užrakto pašalinimas</string>
+ <string name="pass_code_mismatch">Nesutampa užraktas</string>
+ <string name="pass_code_wrong">Neteisingas užraktas</string>
+ <string name="pass_code_removed">Užraktas pašalintas</string>
+ <string name="pass_code_stored">Užraktas 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="auth_no_net_conn_title">Nėra tinklo ryšio</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">Bandomas sujungimas</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_account_not_the_same">Įvestas vartotojas neatitinka šios paskyros vartotojo</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_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="auth_fail_get_user_name">Serveris negražina tinkamo vartotojo ID, susisiekite su administratoriumi</string>
<string name="auth_can_not_auth_against_server">Jungiamasi prie autentikacijos serverio...</string>
+ <string name="auth_account_does_not_exist">Paskyra neegzistuoja įrenginyje</string>
<string name="favorite">Mėgiamas</string>
+ <string name="unfavorite">Nebemėgti</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 vietiniai</string>
+ <string name="confirmation_remove_remote">Iš serverio</string>
+ <string name="confirmation_remove_remote_and_local">Išorinis & vietinis</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="sync_file_nothing_to_do_msg">Failo turinys jau sunchronizuotas</string>
<string name="create_dir_fail_msg">Aplanko sukurti nepavyko</string>
<string name="filename_forbidden_characters">Neleistini simboliai: / \\ < > : \" | ? *</string>
+ <string name="filename_forbidden_charaters_from_server">Failo vardas sudarytas iš neleistinų simbolių</string>
<string name="filename_empty">Failo pavadinimas negali būti tuščias</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="activity_chooser_title">Siųsti nuorodą asmeniui ...</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Kopijuoti failą iš privačios talpyklos</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_label_signature_algorithm">Algoritmas:</string>
<string name="ssl_validator_null_cert">Sertifikatas negali būti parodytas.</string>
<string name="ssl_validator_no_info_about_error">- Nėra informacijos apie klaidą</string>
+ <string name="placeholder_sentence">Rezervas</string>
+ <string name="placeholder_filename">rezervas.txt</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="instant_video_upload_on_wifi">Įkelti video tik per WiFi</string>
+ <string name="instant_upload_path">/InstantUpload</string>
+ <string name="conflict_title">Failų konfliktas</string>
+ <string name="conflict_message">Kuriuos failus palikti? Jei pažymėsite abi versijas, vietinis failas bus pervadintas, pridedant skaičių prie pavadinimo.</string>
<string name="conflict_keep_both">Palikti abu</string>
+ <string name="conflict_use_local_version">Vietinė versija</string>
+ <string name="conflict_use_server_version">Versija serveryje</string>
<string name="preview_image_description">Paveikslėlio peržiūra</string>
<string name="preview_image_error_unknown_format">Neįmanoma parodyti šio paveikslėlio</string>
+ <string name="error__upload__local_file_not_copied">%1$s negali būti nukopijuota į %2$s vietinį katalogą</string>
+ <string name="prefs_instant_upload_path_title">Įkėlimo kelias</string>
+ <string name="share_link_no_support_share_api">Atsiprašome, bet serveris nepalaiko dalijimosi. Susisiekite su administratoriumi.</string>
+ <string name="share_link_file_no_exist">Nepavyko pasidalinti. Patikrinkite ar failas egzistuoja</string>
<string name="share_link_file_error">Įvyko klaida bandant dalinti šį failą ar aplanką</string>
+ <string name="unshare_link_file_no_exist">Nepavyksta nebedalinti. Patikrinkite ar failas egzistuoja</string>
<string name="unshare_link_file_error">Įvyko klaida bandant nebedalinti šio failu ar aplanku</string>
+ <string name="share_link_password_title">Įveskite slaptažodį</string>
+ <string name="share_link_empty_password">Slaptažodis privalomas</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>
+ <string name="error_cant_bind_to_operations_service">Kritinė klaida: negalima įvykdyti operacijos</string>
+ <string name="network_error_socket_exception">Klaida prisijungiant prie serverio.</string>
+ <string name="network_error_socket_timeout_exception">Klaida prisijungiant prie serverio, operacija neįvykdyta</string>
+ <string name="network_error_connect_timeout_exception">Klaida prisijungiant prie serverio, operacija neįvykdyta</string>
+ <string name="network_host_not_available">Serveris nepasiekiamas, operacija negali būti atlikta</string>
<string name="empty"></string>
+ <string name="forbidden_permissions">Neturite leidimo %s</string>
+ <string name="forbidden_permissions_rename">pervadinti failo</string>
+ <string name="forbidden_permissions_delete">ištrinti failo</string>
+ <string name="share_link_forbidden_permissions">dalintis failu</string>
+ <string name="unshare_link_forbidden_permissions">nebesidalinti failu</string>
+ <string name="forbidden_permissions_create">sukurti failą</string>
+ <string name="uploader_upload_forbidden_permissions">įkelti į aplanką</string>
+ <string name="downloader_download_file_not_found">Failas neegzistuoja serveryje</string>
<string name="prefs_category_accounts">Paskyros</string>
+ <string name="prefs_add_account">Pridėti paskyrą</string>
+ <string name="auth_redirect_non_secure_connection_title">Saugus sujungimas nukreiptas per nesaugų kelią</string>
+ <string name="actionbar_logger">Žurnalai</string>
+ <string name="log_send_history_button">Siųsti istoriją</string>
+ <string name="log_send_no_mail_app">Žurnalų siuntimui nėra programėlės. Įdiekite pašto programėlę!</string>
+ <string name="log_send_mail_subject">%1$s Android žurnalai</string>
+ <string name="log_progress_dialog_text">Įkeliama...</string>
+ <string name="saml_authentication_required_text">Reikalinga autentikacija</string>
<string name="saml_authentication_wrong_pass">Neteisingas slaptažodis</string>
+ <string name="actionbar_move">perkelti</string>
+ <string name="file_list_empty_moving">Nieko nėra. Galite pridėti aplanką!</string>
<string name="folder_picker_choose_button_text">Pasirinkite</string>
+ <string name="move_file_not_found">Negalima perkelti. Prašau patikrinti ar failas egzistuoja</string>
+ <string name="move_file_invalid_into_descendent">Neįmanoma perkelti aplanko į poaplankį</string>
+ <string name="move_file_invalid_overwrite">Failas aplanke jau egzistuoja</string>
+ <string name="move_file_error">Klaida perkeliant failą ar aplanką</string>
+ <string name="forbidden_permissions_move">perkelti šį failą</string>
+ <string name="copy_file_not_found">Nepavyko nukopijuoti. Patikrinkite ar failas egzistuoja</string>
+ <string name="copy_file_invalid_into_descendent">Neįmanoma nukopijuoti aplanko į poaplankį</string>
+ <string name="copy_file_invalid_overwrite">Failas aplanke jau egzistuoja</string>
+ <string name="copy_file_error">Klaida kopijuojant failą ar aplanką</string>
+ <string name="forbidden_permissions_copy">kopijuoti failo</string>
+ <string name="prefs_category_instant_uploading">Momentinis įkėlimas</string>
<string name="prefs_category_security">Saugumas</string>
+ <string name="prefs_instant_video_upload_path_title">Vaizdo įrašų įkėlimo kelias</string>
+ <string name="download_folder_failed_content">Nepavyko baigti %1$s atsiuntimo</string>
+ <string name="shared_subject_header">Dalinamasi</string>
+ <string name="with_you_subject_header">su jumis</string>
+ <string name="subject_token">%1$s dalinamasi \"%2$s\" su jumis</string>
+ <string name="saml_subject_token">\"%1$s\" dalinamasi su jumis</string>
+ <string name="auth_refresh_button">Atnaujinti sujungimą</string>
<string name="auth_host_address">Serverio adresas</string>
+ <string name="common_error_out_memory">Nepakanka atminties</string>
+ <string name="username">Prisijungimo vardas</string>
+ <string name="file_list__footer__folder">1 aplankalas</string>
+ <string name="file_list__footer__folders">%1$d aplankalai</string>
+ <string name="file_list__footer__file">1 failas</string>
+ <string name="file_list__footer__file_and_folder">1 failas, 1 aplankalas</string>
+ <string name="file_list__footer__file_and_folders">1 failas, %1$d aplankai</string>
+ <string name="file_list__footer__files">%1$d failai</string>
+ <string name="file_list__footer__files_and_folder">%1$d failai, 1 aplankas</string>
+ <string name="file_list__footer__files_and_folders">%1$d failai, %2$d aplankai</string>
</resources>
<item>Biggest - Smallest</item>-->
<!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
<!--<string name="drawer_item_accounts">Accounts</string>-->
+ <string name="drawer_item_all_files">Visas datnes</string>
<!--TODO re-enable when "On Device" is available
<string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">Iestatījumi</string>
+ <string name="drawer_close">Aizvērt</string>
<string name="drawer_open">Atvērt</string>
<string name="prefs_category_general">Vispārīgi</string>
<string name="prefs_category_more">Vairāk</string>
<string name="prefs_help">Palīdzība</string>
<string name="prefs_recommend">Ieteikt draugam</string>
<string name="prefs_feedback">Atsauksmes</string>
+ <string name="recommend_subject">Izmēģini %1$s uz savu viedtālruni!</string>
+ <string name="auth_check_server">Pārbaudīt serveri</string>
<string name="auth_username">Lietotājvārds</string>
<string name="auth_password">Parole</string>
<string name="sync_string_files">Datnes</string>
<string name="uploader_info_uploading">Augšupielādē</string>
<string name="file_list_seconds_ago">sekundes atpakaļ</string>
<string name="file_list_empty">Te vēl nekas nav. Rīkojies, sāc augšupielādēt!</string>
+ <string name="file_list_loading">Ielādē…</string>
<string name="local_file_list_empty">Šajā mapē nav failu</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_download">Lejupielādēt</string>
<string name="filedetails_sync_file">Atsvaidzināt failu</string>
<string name="filedetails_renamed_in_upload_msg">Datne tika pārsaukta uz %1$s augšupielādes laikā</string>
+ <string name="action_share_file">Dalīt saiti</string>
+ <string name="action_unshare_file">Pārtraukt dalīt saiti</string>
<string name="common_yes">Jā</string>
<string name="common_no">Nē</string>
<string name="common_ok">Labi</string>
<string name="common_remove">Izņemt</string>
<string name="confirmation_remove_local">Tikai lokālos</string>
<string name="confirmation_remove_folder_local">Tikai lokālos</string>
+ <string name="confirmation_remove_remote">No servera</string>
<string name="remove_success_msg">Veiksmīgi izņemts</string>
<string name="remove_fail_msg">Neizdevās izņemt</string>
<string name="rename_dialog_title">Ievadīt jaunu nosaukumu</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">Mapi nevarēja izveidot</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_label_validity_to">Kam:</string>
<string name="ssl_validator_label_signature">Paraksts:</string>
<string name="ssl_validator_label_signature_algorithm">Algoritms:</string>
+ <string name="placeholder_filetype">PNG attēls</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_keep_both">Paturēt abas</string>
+ <string name="preview_image_error_unknown_format">Šo attēlu nevar attēlot</string>
+ <string name="share_link_password_title">Ievadiet paroli</string>
+ <string name="share_link_empty_password">Jums ir jāievada paroli</string>
<string name="activity_chooser_send_file_title">Sūtīt</string>
+ <string name="copy_link">Kopēt saiti</string>
<string name="empty"></string>
+ <string name="forbidden_permissions_rename">lai pārsauktu šo datni</string>
+ <string name="forbidden_permissions_delete">lai dzēstu šo datni</string>
+ <string name="share_link_forbidden_permissions">lai dalītu šo datni</string>
+ <string name="unshare_link_forbidden_permissions">lai pārtrauktu šis datnes dalīšanu</string>
+ <string name="forbidden_permissions_create">lai izveidotu datni</string>
<string name="prefs_category_accounts">Konti</string>
+ <string name="prefs_add_account">Pievienot kontu</string>
+ <string name="log_progress_dialog_text">Ielādē datus…</string>
<string name="saml_authentication_wrong_pass">Nepareiza parole</string>
+ <string name="actionbar_move">Pārvietot</string>
+ <string name="file_list_empty_moving">Šeit nekā nav. Jūs varat pievienot mapi!</string>
<string name="folder_picker_choose_button_text">Izvēlieties</string>
+ <string name="forbidden_permissions_move">lai pārvietotu šo datni</string>
+ <string name="forbidden_permissions_copy">lai kopētu šo datni</string>
<string name="prefs_category_security">Drošība</string>
+ <string name="shared_subject_header">koplietots</string>
+ <string name="with_you_subject_header">ar jums</string>
<string name="auth_host_address">Servera adrese</string>
+ <string name="username">Lietotājvārds</string>
+ <string name="file_list__footer__folder">1 mape</string>
+ <string name="file_list__footer__file">1 datne</string>
</resources>
<string name="file_list_seconds_ago">for få sekunder siden</string>
<string name="file_list_empty">Ingenting her. Last opp noe!</string>
<string name="file_list_loading">Laster...</string>
+ <string name="file_list_no_app_for_file_type">Ingen app funnet for filtypen!</string>
<string name="local_file_list_empty">Det er ingen filer i denne mappen.</string>
<string name="filedetails_select_file">Trykk på en fil for å vise ekstra informasjon.</string>
<string name="filedetails_size">Størrelse:</string>
<string name="file_list_seconds_ago">seconden geleden</string>
<string name="file_list_empty">Er bevindt zich hier niets. Upload een bestand!</string>
<string name="file_list_loading">Laden...</string>
+ <string name="file_list_no_app_for_file_type">Geen app gevonden voor het bestandstype!</string>
<string name="local_file_list_empty">Er staan geen bestanden in deze map.</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="file_list_seconds_ago">i a qualques segondas</string>
<string name="file_list_empty">I a pas res aicí ! Mandatz doncas quicòm :)</string>
<string name="file_list_loading">Cargament...</string>
+ <string name="file_list_no_app_for_file_type">Cap d\'aplicacion pas trobada per aqueste tipe de fichièr !</string>
<string name="local_file_list_empty">Cap de fichièr es pas present dins aqueste dorsièr.</string>
<string name="filedetails_select_file">Quichatz sus un fichièr per afichar las informacions suplementàrias</string>
<string name="filedetails_size">Talha :</string>
<string name="file_list_seconds_ago">segundos atrás</string>
<string name="file_list_empty">Nada aqui. Envie alguma coisa!</string>
<string name="file_list_loading">Carregando...</string>
+ <string name="file_list_no_app_for_file_type">Nenhum aplicativo encontrado por tipo de arquivo!</string>
<string name="local_file_list_empty">Não existe nenhum arquivo nesta pasta.</string>
<string name="filedetails_select_file">Toque em um arquivo para mostrar informações adicionais.</string>
<string name="filedetails_size">Tamanho:</string>
<string name="file_list_seconds_ago">несколько секунд назад</string>
<string name="file_list_empty">Здесь ничего нет. Загрузите что-нибудь!</string>
<string name="file_list_loading">Загрузка...</string>
+ <string name="file_list_no_app_for_file_type">Не найдено приложений для этого типа файла.</string>
<string name="local_file_list_empty">В этом каталоге нет файлов.</string>
<string name="filedetails_select_file">Нажмите на файл для отображения дополнительной информации.</string>
<string name="filedetails_size">Размер:</string>
<?xml version='1.0' encoding='UTF-8'?>
<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="about_android">Aplikacioni Android %1$s</string>
+ <string name="about_version">version %1$s</string>
+ <string name="actionbar_sync">Rifreskoni llogarinë</string>
+ <string name="actionbar_upload">Ngarkoni</string>
+ <string name="actionbar_upload_from_apps">Lëndë nga aplikacione të tjera</string>
+ <string name="actionbar_upload_files">Kartela</string>
+ <string name="actionbar_open_with">Hape me</string>
+ <string name="actionbar_mkdir">Dosje e re</string>
+ <string name="actionbar_settings">Rregullime</string>
+ <string name="actionbar_see_details">Hollësi</string>
+ <string name="actionbar_send_file">Dërgoje</string>
+ <string name="actionbar_sort">Renditi</string>
+ <string name="actionbar_sort_title">Renditi sipas</string>
+ <string-array name="actionbar_sortby">
+ <item>A-Z</item>
+ <item>Më e reja - Më e vjetra</item>
+ </string-array>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
<!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
<!--<string name="drawer_item_accounts">Accounts</string>-->
+ <string name="drawer_item_all_files">Krejt kartelat</string>
<!--TODO re-enable when "On Device" is available
<string name="drawer_item_on_device">On device</string>-->
- <string name="drawer_open">Hap</string>
- <string name="prefs_category_general">Përgjithshme</string>
+ <string name="drawer_item_settings">Llogari</string>
+ <string name="drawer_item_logs">Regjistra</string>
+ <string name="drawer_close">Mbylle</string>
+ <string name="drawer_open">Hape</string>
+ <string name="prefs_category_general">Të përgjithshme</string>
<string name="prefs_category_more">Më tepër</string>
- <string name="prefs_accounts">Llogarit</string>
+ <string name="prefs_accounts">Llogari</string>
+ <string name="prefs_manage_accounts">Administroni Llogari</string>
+ <string name="prefs_passcode">Kyçje kodkalimi</string>
+ <string name="prefs_instant_upload">Ngarkime të menjëhershme fotosh</string>
+ <string name="prefs_instant_upload_summary">Ngarkoni menjëherë foto të bëra nga kamera</string>
+ <string name="prefs_instant_video_upload">Ngarkime të menjëhershme videosh</string>
+ <string name="prefs_instant_video_upload_summary">Ngarkoni menjëherë video të bëra nga kamera</string>
+ <string name="prefs_log_title">Aktivizoni Regjistrimet</string>
+ <string name="prefs_log_summary">Kjo përdoret për të regjistruar probleme</string>
+ <string name="prefs_log_title_history">Historik Regjistrimesh</string>
+ <string name="prefs_log_summary_history">Kjo shfaq regjistrimet e bëra</string>
+ <string name="prefs_log_delete_history_button">Fshije Historikun</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_btn_new_folder_text">Dosje e\'re</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="prefs_recommend">Këshillojani një shoku</string>
+ <string name="prefs_feedback">Përshtypje</string>
+ <string name="prefs_imprint">Imprint</string>
+ <string name="prefs_remember_last_share_location">Mba mend vend ndarjeje me të tjerët</string>
+ <string name="prefs_remember_last_upload_location_summary">Mba mend vendin e fundit të ngarkimit për ndarje me të tjerët</string>
+ <string name="recommend_subject">Provojeni %1$s te telefoni juaj!</string>
+ <string name="recommend_text">Dua t\’ju ftoj të përdorni %1$s në telefonin tuaj!\nShkarkojeni prej këtu: %2$s</string>
+ <string name="auth_check_server">Kontrollo Shërbyesin</string>
+ <string name="auth_host_url">Adresë https://… e shërbyesit</string>
+ <string name="auth_username">Emër përdoruesi</string>
+ <string name="auth_password">Fjalëkalim</string>
+ <string name="auth_register">Rishtar te %1$s?</string>
+ <string name="sync_string_files">Kartela</string>
+ <string name="setup_btn_connect">Lidhuni</string>
+ <string name="uploader_btn_upload_text">Ngarkoni</string>
+ <string name="uploader_btn_new_folder_text">Dosje e re</string>
+ <string name="uploader_top_message">Zgjidhni dosje ngarkimi:</string>
+ <string name="uploader_wrn_no_account_title">S\’u gjet llogari</string>
+ <string name="uploader_wrn_no_account_text">S\’ka llogari %1$s te pajisja juaj. Ju lutemi, rregulloni së pari një llogari.</string>
+ <string name="uploader_wrn_no_account_setup_btn_text">Rregullim</string>
+ <string name="uploader_wrn_no_account_quit_btn_text">Dilni</string>
+ <string name="uploader_wrn_no_content_title">Pa lëndë për ngarkim</string>
+ <string name="uploader_wrn_no_content_text">S\’u mor lëndë. Asgjë për t\’u ngarkuar.</string>
+ <string name="uploader_error_forbidden_content">%1$s nuk i lejohet të hyjë në lëndë të përbashkët</string>
+ <string name="uploader_info_uploading">Ngarkim</string>
<string name="file_list_seconds_ago">sekonda më parë</string>
- <string name="file_list_empty">Këtu nuk ka asgje. Ngarko dicka</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="action_share_file">Ndaje lidhjen</string>
+ <string name="file_list_empty">Këtu nuk ka gjë. Ngarkoni diçka!</string>
+ <string name="file_list_loading">Po ngarkohet…</string>
+ <string name="file_list_no_app_for_file_type">S\’u gjet aplikacion për llojin e kartelës!</string>
+ <string name="local_file_list_empty">Në këtë dosje s\’ka kartela.</string>
+ <string name="filedetails_select_file">Prekni mbi një kartelë që të shfaqen të dhëna shtesë.</string>
+ <string name="filedetails_size">Madhësi:</string>
+ <string name="filedetails_type">Lloj:</string>
+ <string name="filedetails_created">Krijuar më:</string>
+ <string name="filedetails_modified">Ndryshuar më:</string>
+ <string name="filedetails_download">Shkarkoje</string>
+ <string name="filedetails_sync_file">Rifreskoje kartelën</string>
+ <string name="filedetails_renamed_in_upload_msg">Kartela u riemërtua si %1$s gjatë ngarkimit</string>
+ <string name="list_layout">Skemë Liste</string>
+ <string name="action_share_file">Ndajeni lidhjen me të tjerët</string>
+ <string name="action_unshare_file">Zhbëjeni ndarjen e lidhjes me të tjerët</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="common_ok">OK</string>
+ <string name="common_cancel_download">Anulojeni shkarkimin</string>
+ <string name="common_cancel_upload">Anulojeni ngarkimin</string>
+ <string name="common_cancel">Anuloje</string>
+ <string name="common_save_exit">Ruaje & Dil</string>
+ <string name="common_error">Gabim</string>
+ <string name="common_loading">Po ngarkohet …</string>
+ <string name="common_error_unknown">Gabim i 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_info_dirname">Emri i Skedarit</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="change_password">Ndryshoni fjalëkalimin</string>
+ <string name="delete_account">Fshini llogarinë</string>
+ <string name="create_account">Krijoni llogari</string>
+ <string name="upload_chooser_title">Ngarkojeni prej …</string>
+ <string name="uploader_info_dirname">Emër dosjeje</string>
+ <string name="uploader_upload_in_progress_ticker">Po ngarkohet …</string>
+ <string name="uploader_upload_in_progress_content">%1$d%% Po ngarkohet %2$s</string>
+ <string name="uploader_upload_succeeded_ticker">Ngarkimi doli 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="uploader_upload_failed_content_single">Ngarkimi i %1$s s\’u plotësua dot</string>
+ <string name="uploader_upload_failed_credentials_error">Ngarkimi dështoi, lypset të ribëni hyrjen</string>
+ <string name="downloader_download_in_progress_ticker">Po shkarkohet …</string>
+ <string name="downloader_download_in_progress_content">%1$d%% Shkarkim %2$s</string>
+ <string name="downloader_download_succeeded_ticker">Shkarkimi doli 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="common_choose_account">Zgjidhni Llogarine</string>
- <string name="auth_no_net_conn_title">Nuk ka lidhje ne Rrjet</string>
+ <string name="downloader_download_failed_ticker">Shkarkimi dështoi</string>
+ <string name="downloader_download_failed_content">Shkarkimi i %1$s s\’u plotësua dot</string>
+ <string name="downloader_not_downloaded_yet">Ende e pashkarkuar</string>
+ <string name="downloader_download_failed_credentials_error">Shkarkimi dështoi, lypset të ribëni hyrjen</string>
+ <string name="common_choose_account">Zgjidhni llogari</string>
+ <string name="sync_fail_ticker">Njëkohësimi dështoi</string>
+ <string name="sync_fail_ticker_unauthorized">Njëkohësimi dështoi, lypset të ribëni hyrjen</string>
+ <string name="sync_fail_content">Njëkohësimi i %1$s s\’u plotësua dot</string>
+ <string name="sync_fail_content_unauthorized">Fjalëkalim i pavlefshëm për %1$s</string>
+ <string name="sync_conflicts_in_favourites_ticker">U hasën përplasje</string>
+ <string name="sync_fail_in_favourites_content">Lënda e %1$d kartelave s\’u njëkohësua dot (%2$d përplasje)</string>
+ <string name="sync_foreign_files_forgotten_ticker">Disa kartela vendore u harruan</string>
+ <string name="sync_foreign_files_forgotten_content">%1$d kartela nga dosja %2$s s\’u kopjuan dot</string>
+ <string name="sync_foreign_files_forgotten_explanation">Nga versioni 1.3.16 e tutje, kartelat e ngarkuara nga kjo pajisje kopjohen te dosja vendore %1$s, për të parandaluar humbje të dhënash, kur një kartelë e vetme njëkohësohet me disa llogari.\n\nPër shkak të këtij ndryshimi, krejt kartelat e ngarkuara nën versione të mëparshëm të këtij aplikacioni u kopjuan në dosjen %2$s. Por plotësimin e këtij veprimi e pengoi një gabim gjatë njëkohësimit të llogarisë. Ose mund t\’i lini kartelat siç janë, dhe të hiqni lidhjen për te %3$s, ose të kaloni kartelat te dosja %1$s dhe të mbani lidhjen për te %4$s.\n\nMë poshtë radhiten kartelat vendore, dhe kartelat e largëta te %5$s me të cilat lidhen.</string>
+ <string name="sync_current_folder_was_removed">Dosja %1$s s\’ekziston më</string>
+ <string name="foreign_files_move">Zhvendosi krejt</string>
+ <string name="foreign_files_success">U zhvendosën krejt kartelat</string>
+ <string name="foreign_files_fail">Disa kartela s\’u zhvendosën dot</string>
+ <string name="foreign_files_local_text">Vendore: %1$s</string>
+ <string name="foreign_files_remote_text">E largët: %1$s</string>
+ <string name="upload_query_move_foreign_files">S\’ka hapësirë të mjaftueshme për të kopjuar te dosja %1$s kartelat e përzgjedhur. Doni t\i zhvendosni më mirë? </string>
+ <string name="pass_code_enter_pass_code">Ju lutemi, futni kodkalimin tuaj</string>
+ <string name="pass_code_configure_your_pass_code">Jepni kodkalimin tuaj</string>
+ <string name="pass_code_configure_your_pass_code_explanation">Kodkalimi do të kërkohet sa herë që niset aplikacioni</string>
+ <string name="pass_code_reenter_your_pass_code">Ju lutemi, rifutni kodkalimin tuaj</string>
+ <string name="pass_code_remove_your_pass_code">Hiqeni kodkalimin tuaj</string>
+ <string name="pass_code_mismatch">Kodkalimet s\’janë të njëjtë</string>
+ <string name="pass_code_wrong">Kodkalim i pasaktë</string>
+ <string name="pass_code_removed">Kodkalimi u hoq</string>
+ <string name="pass_code_stored">Kodkalimi u depozitua</string>
+ <string name="media_notif_ticker">Lojtësi %1$s i muzikës</string>
+ <string name="media_state_playing">%1$s (po luhet)</string>
+ <string name="media_state_loading">%1$s (po ngarkohet)</string>
+ <string name="media_event_done">Luajtja e %1$s përfundoi</string>
+ <string name="media_err_nothing_to_play">S\’u gjetën kartela media</string>
+ <string name="media_err_no_account">S\’u dha llogari</string>
+ <string name="media_err_not_in_owncloud">Kartelë jo në llogari të vlefshme</string>
+ <string name="media_err_unsupported">Kodek mediash i pambuluar</string>
+ <string name="media_err_io">S\’u lexua dot kartela media</string>
+ <string name="media_err_malformed">Kartelë media e koduar jo si duhet</string>
+ <string name="media_err_timeout">Mbaroi koha, teksa përpiqej të luhej</string>
+ <string name="media_err_invalid_progressive_playback">Kartela media s\’mund të transmetohet</string>
+ <string name="media_err_unknown">Kartela media s\’mund të luhet me lojtësin standard</string>
+ <string name="media_err_security_ex">Gabim sigurie gjatë përpjekjes për luajtje të %1$s</string>
+ <string name="media_err_io_ex">Gabim input-i gjatë përpjekjes për luajtje të %1$s</string>
+ <string name="media_err_unexpected">Gabim i papritur gjatë përpjekjes për luajtje të %1$s</string>
+ <string name="media_rewind_description">Butoni Mbrapsht</string>
+ <string name="media_play_pause_description">Butoni Luaje ose Pushoje</string>
+ <string name="media_forward_description">Butoni Përpara</string>
+ <string name="auth_getting_authorization">Po merret autorizim…</string>
+ <string name="auth_trying_to_login">Po përpiqet të bëhet hyrja…</string>
+ <string name="auth_no_net_conn_title">Pa lidhje rrjeti</string>
+ <string name="auth_nossl_plain_ok_title">S\’ka lidhje të sigurt.</string>
<string name="auth_connection_established">Lidhja u vendos</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>
+ <string name="auth_testing_connection">Po provohet lidhja</string>
+ <string name="auth_not_configured_title">Formësim i keqformuar shërbyesi</string>
+ <string name="auth_account_not_new">Ka tashmë në pajisje një llogari për të njëjtin përdorues dhe shërbyes</string>
+ <string name="auth_account_not_the_same">Përdoruesi i dhënë s\’përputhet me përdoruesin e kësaj llogarie</string>
+ <string name="auth_unknown_error_title">Ndodhi një gabim i panjohur!</string>
+ <string name="auth_unknown_host_title">S\’u gjet dot strehë</string>
+ <string name="auth_incorrect_path_title">S\’u gjet dot instancë shërbyesi</string>
+ <string name="auth_timeout_title">Shërbyesit iu desh shumë kohë për përgjigje</string>
+ <string name="auth_incorrect_address_title">URL e keqformuar</string>
+ <string name="auth_ssl_general_error_title">Gatitja e SSL-së dështoi</string>
+ <string name="auth_ssl_unverified_server_title">S\’u verifikua dot identiteti i shërbyesit SSL</string>
+ <string name="auth_bad_oc_version_title">Version i papranuar shërbyesi</string>
+ <string name="auth_wrong_connection_title">S\’u vendos dot lidhja</string>
+ <string name="auth_secure_connection">U vendos lidhje e sigurt</string>
+ <string name="auth_unauthorized">Emër përdoruesi ose fjalëkalim i gabuar</string>
+ <string name="auth_oauth_error">Autorizim jo i suksesshëm</string>
+ <string name="auth_oauth_error_access_denied">Hyrje e mohuar nga shërbyesi i autorizimeve</string>
+ <string name="auth_wtf_reenter_URL">Gjendje e papritur; ju lutemi, rijepni URL-në e shërbyesit</string>
+ <string name="auth_expired_oauth_token_toast">Autorizimi juaj skadoi. Ju lutemi, autorizohuni sërish</string>
+ <string name="auth_expired_basic_auth_toast">Ju lutemi, jepni fjalëkalimin e tanishëm</string>
+ <string name="auth_expired_saml_sso_token_toast">Sesioni juaj skadoi. Ju lutemi, rilidhuni</string>
+ <string name="auth_connecting_auth_server">Po lidhet te shërbyesi i mirëfilltësimeve…</string>
+ <string name="auth_unsupported_auth_method">Shërbyesi s\’e mbulon këtë metodë mirëfilltësimesh</string>
+ <string name="auth_unsupported_multiaccount">%1$s s\’mbulon llogari të shumëfishta</string>
+ <string name="auth_fail_get_user_name">Shërbyesi juaj s\’po përgjigje me id të saktë përdoruesi, ju lutemi, lidhuni me një admin</string>
+ <string name="auth_can_not_auth_against_server">S\’mund të bëhet mirëfilltësim kundrejt këtij shërbyesi</string>
+ <string name="auth_account_does_not_exist">Llogaria s\’ekziston ende te pajisja</string>
+ <string name="favorite">Vëre te Të parapëlqyerit</string>
+ <string name="unfavorite">Hiqe nga Të parapëlqyerit</string>
+ <string name="common_rename">Riemërtojeni</string>
+ <string name="common_remove">Hiqe</string>
+ <string name="confirmation_remove_alert">Doni vërtet të hiqet %1$s?</string>
+ <string name="confirmation_remove_folder_alert">Doni vërtet të hiqet %1$s dhe lënda e tij?</string>
+ <string name="confirmation_remove_local">Vetëm vendorja</string>
+ <string name="confirmation_remove_folder_local">Vetëm vendorja</string>
+ <string name="confirmation_remove_remote">Nga shërbyesi</string>
+ <string name="confirmation_remove_remote_and_local">E largëta & dhe vendorja</string>
+ <string name="remove_success_msg">Heqja doli me sukses</string>
+ <string name="remove_fail_msg">Heqja dështoi</string>
+ <string name="rename_dialog_title">Jepni një emër të ri</string>
+ <string name="rename_local_fail_msg">Kopja vendore s\’u riemërtua dot; provoni një emër tjetër</string>
+ <string name="rename_server_fail_msg">Riemërtimi s\’u plotësua dot</string>
+ <string name="sync_file_fail_msg">S\’u kap dot kartela</string>
+ <string name="sync_file_nothing_to_do_msg">Lëndë kartele tashmë e njëkohësuar</string>
+ <string name="create_dir_fail_msg">S\’u krijua dot dosja</string>
+ <string name="filename_forbidden_characters">Shenja të ndaluara: / \\ < > : \" | ? *</string>
+ <string name="filename_forbidden_charaters_from_server">Emri i kartelës përmban të paktën një shenjë të pavlefshme</string>
+ <string name="filename_empty">Emri i kartelës s\’mund të jetë i zbrazët</string>
+ <string name="wait_a_moment">Pritni një çast</string>
+ <string name="filedisplay_unexpected_bad_get_content">Problem i papritur; ju lutemi, përzgjidhni një kartelë nga një aplikacion tjetër</string>
+ <string name="filedisplay_no_file_selected">S\’u përzgjodh kartelë</string>
+ <string name="activity_chooser_title">Dërgoni lidhje te …</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Po kopjohet kartelë nga depo private</string>
+ <string name="oauth_check_onoff">Hyrje me oAuth2</string>
+ <string name="oauth_login_connection">Po lidhet me shërbyesin oAuth2…</string>
+ <string name="ssl_validator_header">Identiteti i sajtit s\’u verifikua dot</string>
+ <string name="ssl_validator_reason_cert_not_trusted">- Dëshmia e shërbyesit s\’është e besuar</string>
+ <string name="ssl_validator_reason_cert_expired">- Dëshmia e shërbyesit skadoi</string>
+ <string name="ssl_validator_reason_cert_not_yet_valid">- Datat e vlefshmërisë së dëshmisë së shërbyesit i përkasin të ardhmes</string>
+ <string name="ssl_validator_reason_hostname_not_verified">- URL-ja s\’përputhet me emrin e strehëemrit te dëshmia</string>
+ <string name="ssl_validator_question">Doni të besohet kjo dëshmi sido qoftë?</string>
+ <string name="ssl_validator_not_saved">Dëshmia s\’u ruajt dot</string>
+ <string name="ssl_validator_btn_details_see">Hollësi</string>
+ <string name="ssl_validator_btn_details_hide">Fshihe</string>
+ <string name="ssl_validator_label_subject">Lëshuar për:</string>
+ <string name="ssl_validator_label_issuer">Lëshuar nga:</string>
+ <string name="ssl_validator_label_CN">Emër i rëndomtë:</string>
+ <string name="ssl_validator_label_O">Organizëm:</string>
+ <string name="ssl_validator_label_OU">Njësi organizative:</string>
+ <string name="ssl_validator_label_C">Vend:</string>
+ <string name="ssl_validator_label_ST">Shtet:</string>
+ <string name="ssl_validator_label_L">Vendndodhje:</string>
+ <string name="ssl_validator_label_validity">Vlefshmëri:</string>
+ <string name="ssl_validator_label_validity_from">Nga:</string>
+ <string name="ssl_validator_label_validity_to">Deri më:</string>
+ <string name="ssl_validator_label_signature">Nënshkrim:</string>
+ <string name="ssl_validator_label_signature_algorithm">Algoritëm:</string>
+ <string name="ssl_validator_null_cert">Dëshmia s\’u shfaq dot.</string>
+ <string name="ssl_validator_no_info_about_error">- Pa të dhëna rreth gabimit</string>
+ <string name="placeholder_sentence">Kjo është një vendmbajtëse</string>
+ <string name="placeholder_filename">placeholder.txt</string>
+ <string name="placeholder_filetype">Figurë 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">Fotot ngarkoji vetëm përmes WiFi-it</string>
+ <string name="instant_video_upload_on_wifi">Videot ngarkoji vetëm përmes WiFi-it</string>
+ <string name="instant_upload_path">/InstantUpload</string>
+ <string name="conflict_title">Përplasje kartelash</string>
+ <string name="conflict_message">Cilat kartela doni të mbani? Nëse përzgjidhni të dy versionet, kartelës vendore do t\’i shtohet një numër te emri.</string>
+ <string name="conflict_keep_both">Mbaji të dyja</string>
+ <string name="conflict_use_local_version">versionin vendor</string>
+ <string name="conflict_use_server_version">versionin e shërbyesit</string>
+ <string name="preview_image_description">Paraparje figure</string>
+ <string name="preview_image_error_unknown_format">Kjo figurë nuk mund të shfaqet</string>
+ <string name="error__upload__local_file_not_copied">%1$s s\’u kopjua dot te dosja vendore %2$s</string>
+ <string name="prefs_instant_upload_path_title">Shteg Ngarkimi</string>
+ <string name="share_link_no_support_share_api">Na ndjeni, ndarja me të tjerët s\’është e aktivizuar te shërbyesi juaj. Ju lutemi, lidhuni me përgjegjësin tuaj.</string>
+ <string name="share_link_file_no_exist">S\’arrin të ndajë me të tjerët. Ju lutemi, kontrolloni nëse kartela ekziston apo jo</string>
+ <string name="share_link_file_error">Ndodhi një gabim teksa përpiqej të ndahej me të tjerët kjo kartelë apo dosje</string>
+ <string name="unshare_link_file_no_exist">S\’arrin të zhbëjë ndarjen me të tjerët. Ju lutemi, kontrolloni nëse kartela ekziston</string>
+ <string name="unshare_link_file_error">Ndodhi një gabim teksa përpiqej të zhbëhej ndarja me të tjerët e kësaj kartele apo dosjeje</string>
+ <string name="share_link_password_title">Jepni një fjalëkalim</string>
+ <string name="share_link_empty_password">Duhet të jepni një fjalëkalim</string>
+ <string name="activity_chooser_send_file_title">Dërgoje</string>
+ <string name="copy_link">Kopjoje lidhjen</string>
+ <string name="clipboard_text_copied">U kopjua te e papastra</string>
+ <string name="error_cant_bind_to_operations_service">Gabim kritik: nuk mund të kryhen veprime</string>
+ <string name="network_error_socket_exception">Ndodhi një gabim teksa po lidhej me shërbyesin.</string>
+ <string name="network_error_socket_timeout_exception">Ndodhi një gabim teksa po pritej për shërbyesin, veprimi s\’u krye dot</string>
+ <string name="network_error_connect_timeout_exception">Ndodhi një gabim teksa po pritej për shërbyesin, veprimi s\’u krye dot</string>
+ <string name="network_host_not_available">Veprimi s\’u plotësua dot, shërbyesi është i pakapshëm</string>
<string name="empty"></string>
- <string name="prefs_category_accounts">Llogarit</string>
+ <string name="forbidden_permissions">Nuk keni leje %s</string>
+ <string name="forbidden_permissions_rename">për riemërtim të kësaj kartele</string>
+ <string name="forbidden_permissions_delete">për fshirje të kësaj kartele</string>
+ <string name="share_link_forbidden_permissions">për ndarje me të tjerët të kësaj kartele</string>
+ <string name="unshare_link_forbidden_permissions">për zhbërje të ndarjes me të tjerët të kësaj kartele</string>
+ <string name="forbidden_permissions_create">për krijim kartele</string>
+ <string name="uploader_upload_forbidden_permissions">për ngarkim në këtë dosje</string>
+ <string name="downloader_download_file_not_found">Kartela s\’gjendet më te shërbyesi</string>
+ <string name="prefs_category_accounts">Llogari</string>
+ <string name="prefs_add_account">Shtoni llogari</string>
+ <string name="auth_redirect_non_secure_connection_title">Lidhja e sigurt është ridrejtuar përmes një rruge të pasigurt.</string>
+ <string name="actionbar_logger">Regjistra</string>
+ <string name="log_send_history_button">Historik Dërgimesh</string>
+ <string name="log_send_no_mail_app">S\’u gjet aplikacion për dërgim regjistrash. Instaloni aplikacion email-esh!</string>
+ <string name="log_send_mail_subject">Regjistra aplikacioni %1$s për Android</string>
+ <string name="log_progress_dialog_text">Po ngarkohen të dhëna…</string>
+ <string name="saml_authentication_required_text">Lypset mirëfilltësim</string>
<string name="saml_authentication_wrong_pass">Fjalëkalim i gabuar</string>
- <string name="folder_picker_choose_button_text">Zgjidh</string>
- <string name="prefs_category_security">Siguria</string>
- <string name="auth_host_address">Adresa e serverit</string>
+ <string name="actionbar_move">Zhvendose</string>
+ <string name="file_list_empty_moving">S\’ka gjë këtu. Mund të shtoni një dosje!</string>
+ <string name="folder_picker_choose_button_text">Zgjidhni</string>
+ <string name="move_file_not_found">S\’arrin të zhvendosë. Ju lutemi, kontrolloni nëse ekziston apo jo kartela</string>
+ <string name="move_file_invalid_into_descendent">S\’është e mundur të zhvendoset një dosje në një tjetër brenda saj</string>
+ <string name="move_file_invalid_overwrite">Kartela gjendet tashmë te dosja vendmbërritje</string>
+ <string name="move_file_error">Ndodhi një gabim teksa përpiqej të zhvendosej kjo kartelë apo dosje</string>
+ <string name="forbidden_permissions_move">për zhvendosje të kësaj kartele</string>
+ <string name="copy_file_not_found">S\’arrin të kopjojë. Ju lutemi, kontrolloni nëse ekziston apo jo kartela</string>
+ <string name="copy_file_invalid_into_descendent">S\’është e mundur të kopjohet një dosje në një tjetër brenda saj</string>
+ <string name="copy_file_invalid_overwrite">Kartela gjendet tashmë te dosja vendmbërritje</string>
+ <string name="copy_file_error">Ndodhi një gabim teksa përpiqej të kopjohej kjo kartelë apo dosje</string>
+ <string name="forbidden_permissions_copy">për kopjim të kësaj kartele</string>
+ <string name="prefs_category_instant_uploading">Ngarkime të Menjëhershme</string>
+ <string name="prefs_category_security">Siguri</string>
+ <string name="prefs_instant_video_upload_path_title">Shteg Ngarkimi Videosh</string>
+ <string name="download_folder_failed_content">S\’u plotësua dot shkarkimi i dosjes %1$s</string>
+ <string name="shared_subject_header">ndarë</string>
+ <string name="with_you_subject_header">me ju</string>
+ <string name="subject_token">%1$s ndau me ju \"%2$s\"</string>
+ <string name="saml_subject_token">\"%1$s\" është ndarë me ju</string>
+ <string name="auth_refresh_button">Rifreskoni lidhjen</string>
+ <string name="auth_host_address">Adresë shërbyesi</string>
+ <string name="common_error_out_memory">Pa kujtesë të mjaftueshme</string>
+ <string name="username">Emër përdoruesi</string>
+ <string name="file_list__footer__folder">1 dosje</string>
+ <string name="file_list__footer__folders">%1$d dosje</string>
+ <string name="file_list__footer__file">1 kartelë</string>
+ <string name="file_list__footer__file_and_folder">1 kartelë, 1 dosje</string>
+ <string name="file_list__footer__file_and_folders">1 kartelë, %1$d dosje</string>
+ <string name="file_list__footer__files">%1$d kartelë</string>
+ <string name="file_list__footer__files_and_folder">%1$d kartela, 1 dosje</string>
+ <string name="file_list__footer__files_and_folders">%1$d kartela, %2$d dosje</string>
</resources>
<string name="move_file_error">Дошло је до грешке при премештању фајла или фасцикле</string>
<string name="forbidden_permissions_move">да преместите овај фајл</string>
<string name="copy_file_invalid_overwrite">Фајл већ постоји у одредишној фасцикли</string>
+ <string name="forbidden_permissions_copy">да копирате овај фајл</string>
<string name="prefs_category_instant_uploading">Тренутна отпремања</string>
<string name="prefs_category_security">Безбедност</string>
<string name="prefs_instant_video_upload_path_title">Путања отпремања видеа</string>
<string name="file_list_seconds_ago">วินาที ก่อนหน้านี้</string>
<string name="file_list_empty">ยังไม่มีไฟล์ใดๆเลย ลองอัพโหลดดูสิ!</string>
<string name="file_list_loading">กำลังโหลด...</string>
+ <string name="file_list_no_app_for_file_type">ไม่พบแอพฯ ที่จะใช้เปิดไฟล์ประเภทนี้!</string>
<string name="local_file_list_empty">ยังไม่มีไฟล์ในโฟลเดอร์นี้</string>
<string name="filedetails_select_file">แตะที่ไฟล์ เพื่อแสดงข้อมูลเพิ่มเติม</string>
<string name="filedetails_size">ขนาด:</string>
+++ /dev/null
-<?xml version='1.0' encoding='UTF-8'?>
-<resources>
- <!--TODO re-enable when server-side folder size calculation is available
- <item>Biggest - Smallest</item>-->
- <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
- <!--<string name="drawer_item_accounts">Accounts</string>-->
- <!--TODO re-enable when "On Device" is available
- <string name="drawer_item_on_device">On device</string>-->
- <string name="empty"></string>
-</resources>
<string name="file_list_seconds_ago">секунди тому</string>
<string name="file_list_empty">Тут нічого немає. Відвантажте що-небудь!</string>
<string name="file_list_loading">Завантаження…</string>
+ <string name="file_list_no_app_for_file_type">Застосунку для цього типу файла не знайдено!</string>
<string name="local_file_list_empty">В цій теці немає файлів.</string>
<string name="filedetails_select_file">Натисніть на файлі для відображення додаткової інформації</string>
<string name="filedetails_size">Розмір:</string>
<string name="filedetails_download">Завантажити</string>
<string name="filedetails_sync_file">Оновити файл</string>
<string name="filedetails_renamed_in_upload_msg">Файл був переіменований в %1$s протягом вивантаження</string>
+ <string name="list_layout">Вигляд списку</string>
<string name="action_share_file">Опублікувати посилання</string>
<string name="action_unshare_file">Видалити посилання</string>
<string name="common_yes">Так</string>
<string name="auth_can_not_auth_against_server">Аутентифікація на цьому сервері неможлива</string>
<string name="auth_account_does_not_exist">Користвача в пристрої не існуе</string>
<string name="favorite">Улюблений</string>
+ <string name="unfavorite">Прибрати з вибраного</string>
<string name="common_rename">Перейменувати</string>
<string name="common_remove">Видалити</string>
<string name="confirmation_remove_alert">Ви дійсно бажаєте видалити %1$s?</string>
<string name="move_file_error">Виникла помилка при спробі перемістити файл або теку</string>
<string name="forbidden_permissions_move">перемістити цей файл</string>
<string name="copy_file_not_found">Неможливо скопіювати. Будь ласка, перевірте, чи існує файл</string>
+ <string name="copy_file_invalid_into_descendent">Неможливо копіювати теку до підтеки</string>
<string name="copy_file_invalid_overwrite">Файл вже існує в теці призначення</string>
<string name="copy_file_error">Виникла помилка під час спроби скопіювати даний файл чи папку</string>
<string name="forbidden_permissions_copy">скопіювати даний файл</string>
<string name="prefs_category_security">Безпека</string>
<string name="prefs_instant_video_upload_path_title">Шлях завантаження відео</string>
<string name="download_folder_failed_content">Скачування теки %1$s не може бути завершено</string>
+ <string name="shared_subject_header">поширений</string>
<string name="with_you_subject_header">з Вами</string>
<string name="subject_token">%1$s поділився \"%2$s\" з вами</string>
+ <string name="saml_subject_token">З Вами поділилися \"%1$s\"</string>
<string name="auth_refresh_button">Оновити з\'єднання</string>
<string name="auth_host_address">Ареса серверу</string>
<string name="common_error_out_memory">Недостатньо пам\'яті</string>
<?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 -->
<style name="Theme.ownCloud.NotificationText.Title"
<string name="file_list_seconds_ago">几秒前</string>
<string name="file_list_empty">这里还什么都没有。上传些东西吧!</string>
<string name="file_list_loading">加载中...</string>
+ <string name="file_list_no_app_for_file_type">找不到用于打开此类型文件的应用</string>
<string name="local_file_list_empty">在该文件夹中不存在文件。</string>
<string name="filedetails_select_file">点击一个文件可以显示额外的信息。</string>
<string name="filedetails_size">大小:</string>
<string name="move_file_invalid_overwrite">该文件已经存在在目标文件夹</string>
<string name="move_file_error">尝试移动该文件或文件夹时发生错误</string>
<string name="forbidden_permissions_move">移动该文件</string>
+ <string name="copy_file_not_found">无法复制文件。请检查文件是否存在</string>
+ <string name="copy_file_invalid_into_descendent">将一个目录移动到它的子目录是不可能的</string>
<string name="copy_file_invalid_overwrite">该文件已经存在在目标文件夹</string>
+ <string name="copy_file_error">尝试复制这个文件或文件夹时发生了错误</string>
+ <string name="forbidden_permissions_copy">复制这个文件</string>
<string name="prefs_category_instant_uploading">即时上传</string>
<string name="prefs_category_security">安全</string>
<string name="prefs_instant_video_upload_path_title">视频上传路径</string>
-->
<resources>
- <color name="owncloud_blue">#1D2D44</color>
+ <color name="owncloud_blue">@color/actionbar_start_color</color>
<color name="owncloud_blue_accent">#35537A</color>
<color name="owncloud_blue_bright">#00ddff</color>
- <color name="list_item_lastmod_and_filesize_text">#989898</color>
+ <color name="list_item_lastmod_and_filesize_text">@color/secondaryTextColor</color>
<color name="black">#000000</color>
<color name="white">#FFFFFF</color>
- <color name="textColor">#303030</color>
+ <color name="fab_white">#fafafa</color>
+ <color name="white_pressed">#f1f1f1</color>
+ <color name="half_black">#808080</color>
+ <color name="black_semi_transparent">#B2000000</color>
+ <color name="textColor">@color/black</color>
<color name="drawerMenuTextColor">#000000</color>
- <color name="list_divider_background">#fff0f0f0</color>
+ <color name="list_divider_background">#eee</color>
<color name="filelist_icon_backgorund">#DDDDDD</color>
<color name="dark_background_text_color">#EEEEEE</color>
<color name="login_text_color">#757575</color>
<color name="primary_button_color">@color/owncloud_blue_accent</color>
<color name="secondary_button_color">#D6D7D7</color>
<color name="transparent">#00000000</color>
+ <color name="secondaryTextColor">#a0a0a0</color>
+ <color name="listItemHighlighted">#f8f8f8</color>
+ <color name="highlightTextColor">#55739a</color>
<!-- Colors -->
<color name="color_accent">@color/owncloud_blue_accent</color>
<!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
<!--<item>@string/prefs_accounts</item>-->
<item>@string/drawer_item_all_files</item>
- <!--<item>@string/drawer_item_on_device</item>-->
+ <item>@string/drawer_item_on_device</item>
<item>@string/actionbar_settings</item>
<item>@string/actionbar_logger</item>
</string-array>
<!-- TODO re-enable when "Accounts" is available in Navigation Drawer-->
<!--<item>@string/drawer_item_accounts</item>-->
<item>@string/drawer_item_all_files</item>
- <!--<item>@string/drawer_item_on_device</item>-->
+ <item>@string/drawer_item_on_device</item>
<item>@string/drawer_item_settings</item>
<item>@string/drawer_item_logs</item>
</string-array>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- App name and other strings-->
- <string name="app_name">ownCloud</string>
+ <string name="app_name">Owncloud Beta</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_file">owncloud-beta.db</string>
<string name ="db_name">ownCloud</string>
- <string name ="data_folder">owncloud</string>
+ <string name ="data_folder">owncloud-beta</string>
<string name ="log_name">Owncloud_</string>
<string name ="default_display_name_for_root_folder">ownCloud</string>
<string name ="user_agent">Mozilla/5.0 (Android) ownCloud-android/%1$s</string>
<!-- TODO re-enable when "Accounts" is available in Navigation Drawer -->
<!--<string name="drawer_item_accounts">Accounts</string>-->
<string name="drawer_item_all_files">All files</string>
- <!-- TODO re-enable when "On Device" is available
- <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_on_device">On device</string>
<string name="drawer_item_settings">Settings</string>
<string name="drawer_item_logs">Logs</string>
<string name="drawer_close">Close</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_video_upload_on_wifi">Upload videos via WiFi only</string>
+
+ <string name="instant_upload_on_wifi">Upload pictures via wifi only</string>
+ <string name="instant_upload_on_charging">Upload when charging only</string>
+ <string name="instant_video_upload_on_wifi">Upload videos via wifi only</string>
+ <string name="instant_video_upload_on_charging">Upload when charging only</string>
<string name="instant_upload_path">/InstantUpload</string>
<string name="conflict_title">File conflict</string>
<string name="conflict_message">Which files do you want to keep? If you select both versions, the local file will have a number added to its name.</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="prefs_instant_upload_path_title">Upload Path</string>
+ <string name="prefs_instant_upload_path_title">Upload path</string>
<string name="share_link_no_support_share_api">Sorry, sharing is not enabled on your server. Please contact your
administrator.</string>
<string name="prefs_category_instant_uploading">Instant Uploads</string>
<string name="prefs_category_security">Security</string>
- <string name="prefs_instant_video_upload_path_title">Upload Video Path</string>
+ <string name="prefs_instant_video_upload_path_title">Upload video path</string>
<string name="download_folder_failed_content">Download of %1$s folder could not be completed</string>
<string name="shared_subject_header">shared</string>
<string name="file_list__footer__files">%1$d files</string>
<string name="file_list__footer__files_and_folder">%1$d files, 1 folder</string>
<string name="file_list__footer__files_and_folders">%1$d files, %2$d folders</string>
+ <string name="action_switch_grid_view">Switch to grid view</string>
+ <string name="action_switch_list_view">Switch to list view</string>
<string name="common_category">Common</string>
<string name="pref_cache_size">Cache size</string>
<style name="Theme.ownCloud" parent="Theme.AppCompat.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="colorPrimary">@color/primary</item>
<item name="colorPrimaryDark">@color/primary_dark</item>
<item name="colorAccent">@color/color_accent</item>
<item name="android:alertDialogTheme">@style/Theme.ownCloud.Dialog</item>
<item name="alertDialogTheme">@style/ownCloud.AlertDialog</item>
- <item name="colorButtonNormal">@color/background_color</item>
- <item name="colorControlActivated">@color/primary_dark</item>
- <item name="colorControlHighlight">@color/color_accent</item>
</style>
<!-- seperate action bar style for activities without an action bar -->
<style name="Theme.ownCloud.noActionBar" parent="Theme.AppCompat.Light.DarkActionBar">
- <item name="android:buttonStyle">@style/Theme.ownCloud.ButtonStyle</item>
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="colorPrimary">@color/primary</item>
<item name="colorAccent">@color/color_accent</item>
<item name="android:alertDialogTheme">@style/Theme.ownCloud.Dialog</item>
<item name="alertDialogTheme">@style/ownCloud.AlertDialog</item>
- <item name="colorButtonNormal">@color/background_color</item>
- <item name="colorControlActivated">@color/primary_dark</item>
- <item name="colorControlHighlight">@color/color_accent</item>
</style>
<style name="Theme.ownCloud.noActionBar.Login" parent="Theme.ownCloud.noActionBar">
<item name="android:textColorPrimary">@color/primary</item>
</style>
- <style name="ownCloud.Dialog" parent="Theme.AppCompat.Light.Dialog" />
+ <style name="ownCloud.Dialog" parent="Theme.AppCompat.Light.Dialog">
+ <item name="colorAccent">@color/color_accent</item>
+ </style>
<style name="ProgressDialogTheme" parent="ownCloud.Dialog">
<item name="colorAccent">@color/color_accent</item>
<style name="Theme.ownCloud.Fullscreen" parent="style/Theme.AppCompat">
<item name="android:windowFullscreen">true</item>
+ <item name="colorAccent">@color/color_accent</item>
</style>
<item name="buttonBarStyle">@style/Theme.ownCloud.Dialog.ButtonBar</item>
</style>
+ <style name="menu_labels_style">
+ <item name="android:background">@drawable/fab_label_background</item>
+ <item name="android:textColor">@color/fab_white</item>
+ </style>
+
<!-- Button Bar hack due to Lollipop bug:
https://code.google.com/p/android/issues/detail?id=78302
fix see:
<?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.AppCompat.Spinner.DropDown.ActionBar">
ownCloud Android client application
Copyright (C) 2012 Bartek Przybylski
- Copyright (C) 2015 ownCloud Inc.
+ 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,
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
- <PreferenceCategory android:title="@string/prefs_category_accounts" android:key="accounts_category">
+ <PreferenceCategory
+ android:title="@string/prefs_category_accounts"
+ android:key="accounts_category">
</PreferenceCategory>
<PreferenceCategory android:title="@string/prefs_category_security">
- <android.preference.CheckBoxPreference android:title="@string/prefs_passcode" android:key="set_pincode" />
+ <!-- ListPreference
+ android:key="select_oc_account"
+ android:title="@string/prefs_select_oc_account"
+ android:summary="@string/prefs_summary_select_oc_account"
+ / -->
+ <com.owncloud.android.ui.CheckBoxPreferenceWithLongTitle android:title="@string/prefs_pincode" android:key="set_pincode"
+ android:summary="@string/prefs_pincode_summary"/>
</PreferenceCategory>
- <PreferenceCategory android:title="@string/prefs_category_instant_uploading" android:key="instant_uploading_category">
- <com.owncloud.android.ui.CheckBoxPreferenceWithLongTitle android:key="instant_uploading"
- android:title="@string/prefs_instant_upload"
- android:summary="@string/prefs_instant_upload_summary"/>
- <com.owncloud.android.ui.PreferenceWithLongSummary
- android:title="@string/prefs_instant_upload_path_title"
- android:key="instant_upload_path" />
+ <PreferenceCategory android:title="@string/prefs_category_instant_uploading"
+ android:key="instant_uploading_category">
+
+ <com.owncloud.android.ui.CheckBoxPreferenceWithLongTitle
+ android:key="instant_uploading"
+ android:title="@string/prefs_instant_upload"
+ android:summary="@string/prefs_instant_upload_summary"/>
+ <com.owncloud.android.ui.PreferenceWithLongSummary
+ android:dependency="instant_uploading"
+ android:disableDependentsState="true"
+ android:title="@string/prefs_instant_upload_path_title"
+ android:key="instant_upload_path" />
<com.owncloud.android.ui.CheckBoxPreferenceWithLongTitle
- android:title="@string/instant_upload_on_wifi"
- android:key="instant_upload_on_wifi"/>
- <com.owncloud.android.ui.CheckBoxPreferenceWithLongTitle android:key="instant_video_uploading"
- android:title="@string/prefs_instant_video_upload"
- android:summary="@string/prefs_instant_video_upload_summary" />
+ android:dependency="instant_uploading"
+ android:disableDependentsState="true"
+ android:title="@string/instant_upload_on_wifi"
+ android:key="instant_upload_on_wifi"/>
+ <com.owncloud.android.ui.CheckBoxPreferenceWithLongTitle
+ android:dependency="instant_uploading"
+ android:disableDependentsState="true"
+ android:title="@string/instant_upload_on_charging"
+ android:key="instant_upload_on_charging"/>
+
+ <com.owncloud.android.ui.CheckBoxPreferenceWithLongTitle
+ android:key="instant_video_uploading"
+ android:title="@string/prefs_instant_video_upload"
+ android:summary="@string/prefs_instant_video_upload_summary" />
<com.owncloud.android.ui.PreferenceWithLongSummary
- android:title="@string/prefs_instant_video_upload_path_title"
- android:key="instant_video_upload_path" />
+ android:dependency="instant_video_uploading"
+ android:disableDependentsState="true"
+ android:title="@string/prefs_instant_video_upload_path_title"
+ android:key="instant_video_upload_path" />
<com.owncloud.android.ui.CheckBoxPreferenceWithLongTitle
- android:title="@string/instant_video_upload_on_wifi"
- android:key="instant_video_upload_on_wifi"/>
- <!-- DISABLED FOR RELEASE UNTIL FIXED
+ android:dependency="instant_video_uploading"
+ android:disableDependentsState="true"
+ android:title="@string/instant_video_upload_on_wifi"
+ android:key="instant_video_upload_on_wifi"/>
+ <com.owncloud.android.ui.CheckBoxPreferenceWithLongTitle
+ android:dependency="instant_video_uploading"
+ android:disableDependentsState="true"
+ android:title="@string/instant_video_upload_on_charging"
+ android:key="instant_video_upload_on_charging"/>
+ </PreferenceCategory>
+
+ <PreferenceCategory android:title="@string/prefs_category_more" android:key="more">
+ <!-- DISABLED FOR RELEASE UNTIL FIXED
CheckBoxPreference android:key="log_to_file"
android:title="@string/prefs_log_title"
android:summary="@string/prefs_log_summary"/>
android:title="@string/about_title"
android:key="about_app" />
</PreferenceCategory>
-
+
</PreferenceScreen>
call git submodule update
call android.bat update project -p libs/android-support-appcompat-v7-exploded-aar --target android-22
+call android.bat update project -p libs/com-getbase-floatingactionbutton-1-10-1-exploded-aar --target android-22
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
#Prepare project android-support-appcompat-v7 ; JAR file is not enough, includes resources
android update lib-project -p libs/android-support-appcompat-v7-exploded-aar --target android-22
+ android update lib-project -p libs/com-getbase-floatingactionbutton-1-10-1-exploded-aar --target android-22
#As default it updates the ant scripts
android update lib-project -p owncloud-android-library
private static Context mContext;
- // TODO Enable when "On Device" is recovered?
- // TODO better place
- // private static boolean mOnlyOnDevice = false;
+ private static boolean mOnlyOnDevice = false;
public void onCreate(){
return getAppContext().getResources().getString(R.string.log_name);
}
- // TODO Enable when "On Device" is recovered ?
-// public static void showOnlyFilesOnDevice(boolean state){
-// mOnlyOnDevice = state;
-// }
-//
-// public static boolean getOnlyOnDevice(){
-// return mOnlyOnDevice;
-// }
+ public static void showOnlyFilesOnDevice(boolean state){
+ mOnlyOnDevice = state;
+ }
+
+ public static boolean getOnlyOnDevice(){
+ return mOnlyOnDevice;
+ }
// user agent
public static String getUserAgent() {
private EditText mUsernameInput;\r
private EditText mPasswordInput;\r
private View mOkButton;\r
- private View mCenteredRefreshButton;\r
private TextView mAuthStatusView;\r
\r
private int mAuthStatusText = 0, mAuthStatusIcon = 0;\r
}\r
});\r
\r
- mCenteredRefreshButton = findViewById(R.id.centeredRefreshButton);\r
- mCenteredRefreshButton.setOnClickListener(new View.OnClickListener() {\r
+ findViewById(R.id.centeredRefreshButton).setOnClickListener(new View.OnClickListener() {\r
\r
@Override\r
public void onClick(View v) {\r
checkOcServer();\r
}\r
});\r
- \r
- mOkButton = findViewById(R.id.buttonOK);\r
+\r
+ findViewById(R.id.embeddedRefreshButton).setOnClickListener(new View.OnClickListener() {\r
+\r
+ @Override\r
+ public void onClick(View v) {\r
+ checkOcServer();\r
+ }\r
+ });\r
+\r
\r
/// initialize block to be moved to single Fragment to check server and get info about it \r
initServerPreFragment(savedInstanceState);\r
\r
mHostUrlInput.removeTextChangedListener(mHostUrlInputWatcher);\r
mHostUrlInput.setOnFocusChangeListener(null);\r
- \r
+\r
super.onPause();\r
}\r
\r
Intent getServerInfoIntent = new Intent();\r
getServerInfoIntent.setAction(OperationsService.ACTION_GET_SERVER_INFO);\r
getServerInfoIntent.putExtra(\r
- OperationsService.EXTRA_SERVER_URL,\r
- normalizeUrlSuffix(uri)\r
+ OperationsService.EXTRA_SERVER_URL,\r
+ normalizeUrlSuffix(uri)\r
);\r
if (mOperationsServiceBinder != null) {\r
mWaitingForOpId = mOperationsServiceBinder.queueNewOperation(getServerInfoIntent);\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
}
- public Vector<OCFile> getFolderContent(OCFile f/*, boolean onlyOnDevice*/) {
+ public Vector<OCFile> getFolderContent(OCFile f, boolean onlyOnDevice) {
if (f != null && f.isFolder() && f.getFileId() != -1) {
- // TODO Enable when "On Device" is recovered ?
- return getFolderContent(f.getFileId()/*, onlyOnDevice*/);
+ return getFolderContent(f.getFileId(), onlyOnDevice);
} else {
return new Vector<OCFile>();
}
- public Vector<OCFile> getFolderImages(OCFile folder/*, boolean onlyOnDevice*/) {
+ public Vector<OCFile> getFolderImages(OCFile folder, boolean onlyOnDevice) {
Vector<OCFile> ret = new Vector<OCFile>();
if (folder != null) {
// TODO better implementation, filtering in the access to database instead of here
- // TODO Enable when "On Device" is recovered ?
- Vector<OCFile> tmp = getFolderContent(folder/*, onlyOnDevice*/);
+ Vector<OCFile> tmp = getFolderContent(folder, onlyOnDevice);
OCFile current = null;
for (int i=0; i<tmp.size(); i++) {
current = tmp.get(i);
File localFolder = new File(localFolderPath);
if (localFolder.exists()) {
// stage 1: remove the local files already registered in the files database
- // TODO Enable when "On Device" is recovered ?
- Vector<OCFile> files = getFolderContent(folder.getFileId()/*, false*/);
+ Vector<OCFile> files = getFolderContent(folder.getFileId(), false);
if (files != null) {
for (OCFile file : files) {
if (file.isFolder()) {
}
- private Vector<OCFile> getFolderContent(long parentId/*, boolean onlyOnDevice*/) {
+ private Vector<OCFile> getFolderContent(long parentId, boolean onlyOnDevice) {
Vector<OCFile> ret = new Vector<OCFile>();
if (c.moveToFirst()) {
do {
OCFile child = createFileInstance(c);
- // TODO Enable when "On Device" is recovered ?
- // if (child.isFolder() || !onlyOnDevice || onlyOnDevice && child.isDown()){
+ if (child.isFolder() || !onlyOnDevice || onlyOnDevice && child.isDown()){
ret.add(child);
- // }
+ }
} while (c.moveToNext());
}
+ ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?";
String [] whereArgs = new String[]{ "", mAccount.name };
- // TODO Enable when "On Device" is recovered ?
- Vector<OCFile> files = getFolderContent(folder /*, false*/);
+ Vector<OCFile> files = getFolderContent(folder, false);
for (OCFile file : files) {
whereArgs[0] = file.getRemotePath();
import com.owncloud.android.lib.common.utils.Log_OC;
import java.io.File;
+import java.util.Enumeration;
import third_parties.daveKoeller.AlphanumComparator;
public class OCFile implements Parcelable, Comparable<OCFile> {
private boolean mIsDownloading;
+ private boolean mShowGridView;
+
/**
* Create new {@link OCFile} with given path.
import org.apache.commons.httpclient.methods.GetMethod;
import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
+import android.graphics.Point;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.media.ThumbnailUtils;
import android.net.Uri;
import android.os.AsyncTask;
+import android.view.Display;
+import android.view.View;
+import android.view.WindowManager;
import android.widget.ImageView;
+import android.widget.ProgressBar;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
public static class ThumbnailGenerationTask extends AsyncTask<Object, Void, Bitmap> {
private final WeakReference<ImageView> mImageViewReference;
+ private WeakReference<ProgressBar> mProgressWheelRef;
private static Account mAccount;
private Object mFile;
+ private Boolean mIsThumbnail;
private FileDataStorageManager mStorageManager;
-
public ThumbnailGenerationTask(ImageView imageView, FileDataStorageManager storageManager,
Account account) {
// Use a WeakReference to ensure the ImageView can be garbage collected
mAccount = account;
}
+ public ThumbnailGenerationTask(ImageView imageView, FileDataStorageManager storageManager,
+ Account account, ProgressBar progressWheel) {
+ this(imageView, storageManager, account);
+ mProgressWheelRef = new WeakReference<ProgressBar>(progressWheel);
+ }
+
public ThumbnailGenerationTask(ImageView imageView) {
// Use a WeakReference to ensure the ImageView can be garbage collected
mImageViewReference = new WeakReference<ImageView>(imageView);
}
mFile = params[0];
+ mIsThumbnail = (Boolean) params[1];
+
if (mFile instanceof OCFile) {
- thumbnail = doOCFileInBackground();
+ thumbnail = doOCFileInBackground(mIsThumbnail);
} else if (mFile instanceof File) {
- thumbnail = doFileInBackground();
- //} else { do nothing
+ thumbnail = doFileInBackground(mIsThumbnail);
+ } else {
+ // do nothing
}
}catch(Throwable t){
tagId = String.valueOf(mFile.hashCode());
}
if (String.valueOf(imageView.getTag()).equals(tagId)) {
+ if (mProgressWheelRef != null) {
+ final ProgressBar progressWheel = mProgressWheelRef.get();
+ if (progressWheel != null) {
+ progressWheel.setVisibility(View.GONE);
+ }
+ }
imageView.setImageBitmap(bitmap);
+ imageView.setVisibility(View.VISIBLE);
}
}
}
* @param imageKey: thumb key
* @param bitmap: image for extracting thumbnail
* @param path: image path
- * @param px: thumbnail dp
+ * @param pxW: thumbnail width
+ * @param pxH: thumbnail height
* @return Bitmap
*/
- private Bitmap addThumbnailToCache(String imageKey, Bitmap bitmap, String path, int px){
+ private Bitmap addThumbnailToCache(String imageKey, Bitmap bitmap, String path, int pxW, int pxH){
- Bitmap thumbnail = ThumbnailUtils.extractThumbnail(bitmap, px, px);
+ Bitmap thumbnail = ThumbnailUtils.extractThumbnail(bitmap, pxW, pxH);
// Rotate image, obeying exif tag
thumbnail = BitmapUtils.rotateImage(thumbnail,path);
return Math.round(r.getDimension(R.dimen.file_icon_size_grid));
}
- private Bitmap doOCFileInBackground() {
+ private Point getScreenDimension(){
+ WindowManager wm = (WindowManager) MainApp.getAppContext().getSystemService(Context.WINDOW_SERVICE);
+ Display display = wm.getDefaultDisplay();
+ Point test = new Point();
+ display.getSize(test);
+ return test;
+ }
+
+ private Bitmap doOCFileInBackground(Boolean isThumbnail) {
+ Bitmap thumbnail = null;
OCFile file = (OCFile)mFile;
- final String imageKey = String.valueOf(file.getRemoteId());
+ // distinguish between thumbnail and resized image
+ String temp = String.valueOf(file.getRemoteId());
+ if (isThumbnail){
+ temp = "t" + temp;
+ } else {
+ temp = "r" + temp;
+ }
+
+ final String imageKey = temp;
// Check disk cache in background thread
- Bitmap thumbnail = getBitmapFromDiskCache(imageKey);
+ thumbnail = getBitmapFromDiskCache(imageKey);
// Not found in disk cache
if (thumbnail == null || file.needsUpdateThumbnail()) {
-
- int px = getThumbnailDimension();
+ int pxW = 0;
+ int pxH = 0;
+ if (mIsThumbnail) {
+ pxW = pxH = getThumbnailDimension();
+ } else {
+ Point p = getScreenDimension();
+ pxW = p.x;
+ pxH = p.y;
+ }
if (file.isDown()) {
- Bitmap temp = BitmapUtils.decodeSampledBitmapFromFile(
- file.getStoragePath(), px, px);
- Bitmap bitmap = ThumbnailUtils.extractThumbnail(temp, px, px);
+ Bitmap tempBitmap = BitmapUtils.decodeSampledBitmapFromFile(
+ file.getStoragePath(), pxW, pxH);
+ Bitmap bitmap = ThumbnailUtils.extractThumbnail(tempBitmap, pxW, pxH);
if (bitmap != null) {
// Handle PNG
if (file.getMimetype().equalsIgnoreCase("image/png")) {
- bitmap = handlePNG(bitmap, px);
+ bitmap = handlePNG(bitmap, pxW);
}
- thumbnail = addThumbnailToCache(imageKey, bitmap, file.getStoragePath(), px);
+ thumbnail = addThumbnailToCache(imageKey, bitmap,
+ file.getStoragePath(), pxW, pxH);
file.setNeedsUpdateThumbnail(false);
mStorageManager.saveFile(file);
if (mClient != null && serverOCVersion != null) {
if (serverOCVersion.supportsRemoteThumbnails()) {
try {
- String uri = mClient.getBaseUri() + "" +
- "/index.php/apps/files/api/v1/thumbnail/" +
- px + "/" + px + Uri.encode(file.getRemotePath(), "/");
- Log_OC.d("Thumbnail", "URI: " + uri);
- GetMethod get = new GetMethod(uri);
- int status = mClient.executeMethod(get);
- if (status == HttpStatus.SC_OK) {
- InputStream inputStream = get.getResponseBodyAsStream();
- Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
- thumbnail = ThumbnailUtils.extractThumbnail(bitmap, px, px);
-
- // Handle PNG
- if (file.getMimetype().equalsIgnoreCase("image/png")) {
- thumbnail = handlePNG(thumbnail, px);
+ if (mIsThumbnail) {
+ String uri = mClient.getBaseUri() + "" +
+ "/index.php/apps/files/api/v1/thumbnail/" +
+ pxW + "/" + pxH + Uri.encode(file.getRemotePath(), "/");
+ Log_OC.d("Thumbnail", "Download URI: " + uri);
+ GetMethod get = new GetMethod(uri);
+ int status = mClient.executeMethod(get);
+ if (status == HttpStatus.SC_OK) {
+ InputStream inputStream = get.getResponseBodyAsStream();
+ Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
+ thumbnail = ThumbnailUtils.extractThumbnail(bitmap, pxW, pxH);
+ } else {
+ Log_OC.d(TAG, "Status: " + status);
+ }
+ } else {
+ String gallery = "";
+ if (serverOCVersion.supportsNativeGallery()){
+ gallery = "gallery";
+ } else {
+ gallery = "galleryplus";
}
- // Add thumbnail to cache
- if (thumbnail != null) {
- addBitmapToCache(imageKey, thumbnail);
+ String uri = mClient.getBaseUri() +
+ "/index.php/apps/" + gallery + "/api/preview/" + Integer.parseInt(file.getRemoteId().substring(0,8)) +
+ "/" + pxW + "/" + pxH;
+ Log_OC.d("Thumbnail", "FileName: " + file.getFileName() + " Download URI: " + uri);
+ GetMethod get = new GetMethod(uri);
+ int status = mClient.executeMethod(get);
+ if (status == HttpStatus.SC_OK) {
+ InputStream inputStream = get.getResponseBodyAsStream();
+ Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
+ // Download via gallery app
+ thumbnail = bitmap;
}
}
+
+ // Handle PNG
+ if (thumbnail != null && file.getMimetype().equalsIgnoreCase("image/png")) {
+ thumbnail = handlePNG(thumbnail, pxW);
+ }
+
+ // Add thumbnail to cache
+ if (thumbnail != null) {
+ addBitmapToCache(imageKey, thumbnail);
+ }
} catch (Exception e) {
e.printStackTrace();
}
return resultBitmap;
}
- private Bitmap doFileInBackground() {
+ private Bitmap doFileInBackground(Boolean mIsThumbnail) {
+ Bitmap thumbnail = null;
File file = (File)mFile;
final String imageKey = String.valueOf(file.hashCode());
// Check disk cache in background thread
- Bitmap thumbnail = getBitmapFromDiskCache(imageKey);
+ thumbnail = getBitmapFromDiskCache(imageKey);
// Not found in disk cache
if (thumbnail == null) {
-
- int px = getThumbnailDimension();
+ int pxW = 0;
+ int pxH = 0;
+ if (mIsThumbnail) {
+ pxW = pxH = getThumbnailDimension();
+ } else {
+ Point p = getScreenDimension();
+ pxW = p.x;
+ pxH = p.y;
+ }
Bitmap bitmap = BitmapUtils.decodeSampledBitmapFromFile(
- file.getAbsolutePath(), px, px);
+ file.getAbsolutePath(), pxW, pxH);
if (bitmap != null) {
- thumbnail = addThumbnailToCache(imageKey, bitmap, file.getPath(), px);
+ thumbnail = addThumbnailToCache(imageKey, bitmap, file.getPath(), pxW, pxH);
}
}
return thumbnail;
} else {
toShow.add(R.id.action_unfavorite_file);
}
-
}
}
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import android.graphics.Bitmap;
import android.net.Uri;
import android.support.v4.app.DialogFragment;
import android.webkit.MimeTypeMap;
import android.widget.Toast;
+import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.authentication.AccountUtils;
import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.datamodel.ThumbnailsCacheManager;
import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
import com.owncloud.android.lib.common.network.WebdavUtils;
import com.owncloud.android.services.OperationsService;
import com.owncloud.android.services.observer.FileObserverService;
import com.owncloud.android.ui.activity.FileActivity;
+import com.owncloud.android.ui.adapter.DiskLruImageCacheFileProvider;
import com.owncloud.android.ui.dialog.ShareLinkToDialog;
import org.apache.http.protocol.HTTP;
import java.util.List;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
/**
*
*/
}
}
+ public void sendCachedImage(OCFile file) {
+ 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("content://" + DiskLruImageCacheFileProvider.AUTHORITY + "/#" + file.getRemoteId() + "#" + file.getFileName()));
+ sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://" + DiskLruImageCacheFileProvider.AUTHORITY + file.getRemotePath()));
+ sendIntent.putExtra(Intent.ACTION_SEND, true); // Send Action
+
+ // Show dialog, without the own app
+ String[] packagesToExclude = new String[] { mFileActivity.getPackageName() };
+ DialogFragment chooserDialog = ShareLinkToDialog.newInstance(sendIntent, packagesToExclude, file);
+ chooserDialog.show(mFileActivity.getSupportFragmentManager(), FTAG_CHOOSER_DIALOG);
+ } else {
+ Log_OC.wtf(TAG, "Trying to send a NULL OCFile");
+ }
+ }
+
public void syncFile(OCFile file) {
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.utils.FileStorageUtils;
-
import android.accounts.Account;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.database.Cursor;
import android.net.ConnectivityManager;
import android.net.NetworkInfo.State;
+import android.os.BatteryManager;
import android.preference.PreferenceManager;
import android.provider.MediaStore.Images;
import android.provider.MediaStore.Video;
@Override
public void onReceive(Context context, Intent intent) {
Log_OC.d(TAG, "Received: " + intent.getAction());
- if (intent.getAction().equals(android.net.ConnectivityManager.CONNECTIVITY_ACTION)) {
+ if (intent.getAction().equals(android.net.ConnectivityManager.CONNECTIVITY_ACTION) || intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)) {
handleConnectivityAction(context, intent);
}else if (intent.getAction().equals(NEW_PHOTO_ACTION_UNOFFICIAL)) {
handleNewPictureAction(context, intent);
file_name = c.getString(c.getColumnIndex(Images.Media.DISPLAY_NAME));
mime_type = c.getString(c.getColumnIndex(Images.Media.MIME_TYPE));
c.close();
-
Log_OC.d(TAG, file_path + "");
// save always temporally the picture to upload
db.putFileForLater(file_path, account.name, null);
db.close();
- if (!isOnline(context) || (instantPictureUploadViaWiFiOnly(context) && !isConnectedViaWiFi(context))) {
+ if (!isOnline(context)
+ || (instantPictureUploadViaWiFiOnly(context) && !isConnectedViaWiFi(context))
+ || (instantUploadWhenChargingOnly(context) && !isCharging(context))
+ ) {
return;
}
mime_type = c.getString(c.getColumnIndex(Video.Media.MIME_TYPE));
c.close();
Log_OC.d(TAG, file_path + "");
+
+ // save always temporally the picture to upload
+ DbHandler db = new DbHandler(context);
+ db.putFileForLater(file_path, account.name, null);
+ db.close();
- if (!isOnline(context) || (instantVideoUploadViaWiFiOnly(context) && !isConnectedViaWiFi(context))) {
+ if (!isOnline(context)
+ || (instantVideoUploadViaWiFiOnly(context) && !isConnectedViaWiFi(context))
+ || (instantVideoUploadWhenChargingOnly(context) && !isCharging(context))
+ ) {
return;
}
}
private void handleConnectivityAction(Context context, Intent intent) {
- if (!instantPictureUploadEnabled(context)) {
+ if (!instantPictureUploadEnabled(context) && !instantVideoUploadEnabled(context)) {
Log_OC.d(TAG, "Instant upload disabled, don't upload anything");
return;
}
if (!intent.hasExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY)
&& isOnline(context)
- && (!instantPictureUploadViaWiFiOnly(context) || (instantPictureUploadViaWiFiOnly(context) == isConnectedViaWiFi(context) == true))) {
+ && (!instantUploadWhenChargingOnly(context) || (instantUploadWhenChargingOnly(context) && isCharging(context)))
+ && (!instantVideoUploadWhenChargingOnly(context) || (instantVideoUploadWhenChargingOnly(context) && isCharging(context)))
+ && (!instantPictureUploadViaWiFiOnly(context) || (instantPictureUploadViaWiFiOnly(context) && isConnectedViaWiFi(context)))
+ && (!instantVideoUploadViaWiFiOnly(context) || (instantVideoUploadViaWiFiOnly(context) && isConnectedViaWiFi(context)))
+ ) {
DbHandler db = new DbHandler(context);
Cursor c = db.getAwaitingFiles();
if (c.moveToFirst()) {
c.close();
db.close();
}
-
}
public static boolean isOnline(Context context) {
&& cm.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI
&& cm.getActiveNetworkInfo().getState() == State.CONNECTED;
}
+
+ public static boolean isCharging(Context context){
+ IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
+ Intent batteryStatus = context.registerReceiver(null, ifilter);
+
+ int status = 0;
+ if (batteryStatus != null) {
+ status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
+ }
+ return status == BatteryManager.BATTERY_STATUS_CHARGING ||
+ status == BatteryManager.BATTERY_STATUS_FULL;
+ }
public static boolean instantPictureUploadEnabled(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getBoolean("instant_uploading", false);
public static boolean instantVideoUploadViaWiFiOnly(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getBoolean("instant_video_upload_on_wifi", false);
}
+ public static boolean instantUploadWhenChargingOnly(Context context) {
+ return PreferenceManager.getDefaultSharedPreferences(context).getBoolean("instant_upload_on_charging", false);
+ }
+ public static boolean instantVideoUploadWhenChargingOnly(Context context) {
+ return PreferenceManager.getDefaultSharedPreferences(context).getBoolean("instant_video_upload_on_charging", false);
+ }
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
return new NotificationBuilderWithProgressBar(context);
} else {
- return new NotificationCompat.Builder(context);
+ return new NotificationCompat.Builder(context).
+ setColor(context.getResources().getColor(R.color.primary));
}
}
if (mRemoteFolderChanged) {
result = fetchAndSyncRemoteFolder(client);
} else {
- // TODO Enable when "On Device" is recovered ?
- mChildren = mStorageManager.getFolderContent(mLocalFolder/*, false*/);
+ mChildren = mStorageManager.getFolderContent(mLocalFolder, false);
}
}
List<SynchronizeFileOperation> filesToSyncContents = new Vector<SynchronizeFileOperation>();
// get current data about local contents of the folder to synchronize
- // TODO Enable when "On Device" is recovered ?
- List<OCFile> localFiles = mStorageManager.getFolderContent(mLocalFolder/*, false*/);
+ List<OCFile> localFiles = mStorageManager.getFolderContent(mLocalFolder, false);
Map<String, OCFile> localFilesMap = new HashMap<String, OCFile>(localFiles.size());
for (OCFile file : localFiles) {
localFilesMap.put(file.getRemotePath(), file);
}
// get current data about local contents of the folder to synchronize
- // TODO Enable when "On Device" is recovered ?
- List<OCFile> localFiles = storageManager.getFolderContent(mLocalFolder/*, false*/);
+ List<OCFile> localFiles = storageManager.getFolderContent(mLocalFolder, false);
Map<String, OCFile> localFilesMap = new HashMap<String, OCFile>(localFiles.size());
for (OCFile file : localFiles) {
localFilesMap.put(file.getRemotePath(), file);
private void prepareOpsFromLocalKnowledge() throws OperationCancelledException {
- // TODO Enable when "On Device" is recovered ?
- List<OCFile> children = getStorageManager().getFolderContent(mLocalFolder/*, false*/);
+ List<OCFile> children = getStorageManager().getFolderContent(mLocalFolder, false);
for (OCFile child : children) {
/// classify file to sync/download contents later
if (child.isFolder()) {
private NotificationCompat.Builder createNotificationBuilder() {
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getContext());
notificationBuilder.setSmallIcon(R.drawable.notification_icon).setAutoCancel(true);
+ notificationBuilder.setColor(getContext().getResources().getColor(R.color.primary));
return notificationBuilder;
}
// }
// Display username in drawer
- Account account = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext());
- if (account != null) {
- TextView username = (TextView) navigationDrawerLayout.findViewById(R.id.drawer_username);
- int lastAtPos = account.name.lastIndexOf("@");
- username.setText(account.name.substring(0, lastAtPos));
- }
+ setUsernameInDrawer(navigationDrawerLayout, AccountUtils.getCurrentOwnCloudAccount(getApplicationContext()));
// load slide menu items
mDrawerTitles = getResources().getStringArray(R.array.drawer_items);
mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[0], mDrawerContentDescriptions[0],
R.drawable.ic_folder_open));
- // TODO Enable when "On Device" is recovered
// On Device
- //mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[2],
- // mDrawerContentDescriptions[2]));
+ mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[1], mDrawerContentDescriptions[1],
+ R.drawable.ic_action_download_grey));
// Settings
- mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[1], mDrawerContentDescriptions[1],
- R.drawable.ic_settings));
+ mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[2], mDrawerContentDescriptions[2],
+ R.drawable.ic_action_settings));
// Logs
if (BuildConfig.DEBUG) {
- mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[2],
- mDrawerContentDescriptions[2],R.drawable.ic_log));
+ mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[3],
+ mDrawerContentDescriptions[3],R.drawable.ic_log));
}
// setting the nav drawer list adapter
}
/**
+ * sets the given account name in the drawer in case the drawer is available. The account name
+ * is shortened beginning from the @-sign in the username.
+ *
+ * @param navigationDrawerLayout the drawer layout to be used
+ * @param account the account to be set in the drawer
+ */
+ protected void setUsernameInDrawer(RelativeLayout navigationDrawerLayout, Account account) {
+ if (navigationDrawerLayout != null && getAccount() != null) {
+ TextView username = (TextView) navigationDrawerLayout.findViewById(R.id.drawer_username);
+ int lastAtPos = account.name.lastIndexOf("@");
+ username.setText(account.name.substring(0, lastAtPos));
+ }
+ }
+
+ /**
* Updates title bar and home buttons (state and icon).
*
* Assumes that navigation drawer is NOT visible.
startActivity(i);
}
+ public void refresh(){
+ Intent i = new Intent(this, FileDisplayActivity.class);
+ i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ startActivity(i);
+ }
+
// TODO re-enable when "Accounts" is available in Navigation Drawer
// public void closeDrawer() {
// mDrawerLayout.closeDrawers();
restart();
}
+ public void refreshDirectory(){
+ // overridden by FileDisplayActivity
+ }
+
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// break;
case 0: // All Files
- allFilesOption();
+ MainApp.showOnlyFilesOnDevice(false);
+ refreshDirectory();
mDrawerLayout.closeDrawers();
break;
- // TODO Enable when "On Device" is recovered ?
-// case 2:
-// MainApp.showOnlyFilesOnDevice(true);
-// mDrawerLayout.closeDrawers();
-// break;
+ case 1: // On Device
+ MainApp.showOnlyFilesOnDevice(true);
+ refreshDirectory();
+ mDrawerLayout.closeDrawers();
+ break;
- case 1: // Settings
+ case 2: // Settings
Intent settingsIntent = new Intent(getApplicationContext(),
Preferences.class);
startActivity(settingsIntent);
mDrawerLayout.closeDrawers();
break;
- case 2: // Logs
+ case 3: // Logs
Intent loggerIntent = new Intent(getApplicationContext(),
LogHistoryActivity.class);
startActivity(loggerIntent);
private boolean mSyncInProgress = false;
private static String DIALOG_UNTRUSTED_CERT = "DIALOG_UNTRUSTED_CERT";
- private static String DIALOG_CREATE_FOLDER = "DIALOG_CREATE_FOLDER";
+ public static String DIALOG_CREATE_FOLDER = "DIALOG_CREATE_FOLDER";
private static String DIALOG_UPLOAD_SOURCE = "DIALOG_UPLOAD_SOURCE";
private static String DIALOG_CERT_NOT_SAVED = "DIALOG_CERT_NOT_SAVED";
private OCFile mWaitingToSend;
+ private Menu mOptionsMenu;
+
-
@Override
protected void onCreate(Bundle savedInstanceState) {
Log_OC.v(TAG, "onCreate() start");
setFile(file);
if (mAccountWasSet) {
- RelativeLayout navigationDrawerLayout = (RelativeLayout) findViewById(R.id.left_drawer);
- if (navigationDrawerLayout != null && getAccount() != null) {
- TextView username = (TextView) navigationDrawerLayout.findViewById(R.id.drawer_username);
- int lastAtPos = getAccount().name.lastIndexOf("@");
- username.setText(getAccount().name.substring(0, lastAtPos));
- }
+ setUsernameInDrawer((RelativeLayout) findViewById(R.id.left_drawer), getAccount());
}
if (!stateWasRecovered) {
/// First fragment
OCFileListFragment listOfFiles = getListOfFilesFragment();
if (listOfFiles != null) {
- listOfFiles.listDirectory(getCurrentDir());
- // TODO Enable when "On Device" is recovered
- // listOfFiles.listDirectory(getCurrentDir(), MainApp.getOnlyOnDevice());
-
+ listOfFiles.listDirectory(getCurrentDir(), MainApp.getOnlyOnDevice());
} else {
Log_OC.e(TAG, "Still have a chance to lose the initializacion of list fragment >(");
}
startTextPreview(file);
}
+ if (DisplayUtils.isGridView(getFile(), getStorageManager())){
+ switchToGridView();
+ } else {
+ switchToListView();
+ }
+
} else {
Log_OC.wtf(TAG, "initFragments() called with invalid NULLs!");
if (getAccount() == null) {
protected void refreshListOfFilesFragment() {
OCFileListFragment fileListFragment = getListOfFilesFragment();
if (fileListFragment != null) {
- fileListFragment.listDirectory();
- // TODO Enable when "On Device" is recovered ?
- // fileListFragment.listDirectory(MainApp.getOnlyOnDevice());
+ fileListFragment.listDirectory(MainApp.getOnlyOnDevice());
}
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
boolean drawerOpen = mDrawerLayout.isDrawerOpen(GravityCompat.START);
- menu.findItem(R.id.action_upload).setVisible(!drawerOpen);
- menu.findItem(R.id.action_create_dir).setVisible(!drawerOpen);
menu.findItem(R.id.action_sort).setVisible(!drawerOpen);
menu.findItem(R.id.action_sync_account).setVisible(!drawerOpen);
+ menu.findItem(R.id.action_switch_view).setVisible(!drawerOpen);
return super.onPrepareOptionsMenu(menu);
}
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
+ menu.findItem(R.id.action_create_dir).setVisible(false);
+ mOptionsMenu = menu;
+
+ MenuItem menuItem = mOptionsMenu.findItem(R.id.action_switch_view);
+
+ changeGridIcon();
+
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
boolean retval = true;
switch (item.getItemId()) {
- case R.id.action_create_dir: {
- CreateFolderDialogFragment dialog =
- CreateFolderDialogFragment.newInstance(getCurrentDir());
- dialog.show(getSupportFragmentManager(), DIALOG_CREATE_FOLDER);
- break;
- }
-
case R.id.action_sync_account: {
startSynchronization();
break;
}
- case R.id.action_upload: {
- UploadSourceDialogFragment dialog =
- UploadSourceDialogFragment.newInstance(getAccount());
- dialog.show(getSupportFragmentManager(), DIALOG_UPLOAD_SOURCE);
- break;
- }
case android.R.id.home: {
FileFragment second = getSecondFragment();
OCFile currentDir = getCurrentDir();
builder.create().show();
break;
}
+ case R.id.action_switch_view:{
+ if (isGridView()){
+ item.setTitle(getApplicationContext().getString(R.string.action_switch_grid_view));
+ item.setIcon(ContextCompat.getDrawable(getApplicationContext(),
+ R.drawable.ic_view_module));
+ DisplayUtils.setViewMode(getFile(), false);
+ switchToListView();
+ } else {
+ item.setTitle(getApplicationContext().getString(R.string.action_switch_list_view));
+ item.setIcon(ContextCompat.getDrawable(getApplicationContext(),
+ R.drawable.ic_view_list));
+ DisplayUtils.setViewMode(getFile(), true);
+ switchToGridView();
+ }
+
+ return true;
+ }
default:
retval = super.onOptionsItemSelected(item);
}
return retval;
}
+ public void createFolder() {
+ CreateFolderDialogFragment dialog =
+ CreateFolderDialogFragment.newInstance(getCurrentDir());
+ dialog.show(getSupportFragmentManager(), DIALOG_CREATE_FOLDER);
+ }
+
+ public void uploadLocalFilesSelected() {
+ Intent action = new Intent(this, UploadFilesActivity.class);
+ action.putExtra(
+ UploadFilesActivity.EXTRA_ACCOUNT,
+ getAccount()
+ );
+ startActivityForResult(action, ACTION_SELECT_MULTIPLE_FILES);
+ }
+
+ public void uploadFromOtherAppsSelected() {
+ Intent action = new Intent(Intent.ACTION_GET_CONTENT);
+ action = action.setType("*/*").addCategory(Intent.CATEGORY_OPENABLE);
+ //Intent.EXTRA_ALLOW_MULTIPLE is only supported on api level 18+, Jelly Bean
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+ action.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
+ }
+ startActivityForResult(
+ Intent.createChooser(action, getString(R.string.upload_chooser_title)),
+ ACTION_SELECT_CONTENT_FROM_APPS
+ );
+ }
+
private void startSynchronization() {
Log_OC.d(TAG, "Got to start sync");
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.KITKAT) {
@Override
public void onBackPressed() {
- if (!isDrawerOpen()){
+ boolean isFabOpen = isFabOpen();
+ boolean isDrawerOpen = isDrawerOpen();
+
+ /*
+ * BackPressed priority/hierarchy:
+ * 1. close drawer if opened
+ * 2. close FAB if open (only if drawer isn't open)
+ * 3. navigate up (only if drawer and FAB aren't open)
+ */
+ if(isDrawerOpen && isFabOpen) {
+ // close drawer first
+ super.onBackPressed();
+ } else if(isDrawerOpen && !isFabOpen) {
+ // close drawer
+ super.onBackPressed();
+ } else if (!isDrawerOpen && isFabOpen) {
+ // close fab
+ getListOfFilesFragment().getFabMain().collapse();
+ } else {
+ // all closed
OCFileListFragment listOfFiles = getListOfFilesFragment();
if (mDualPane || getSecondFragment() == null) {
OCFile currentDir = getCurrentDir();
setFile(listOfFiles.getCurrentFile());
}
cleanSecondFragment();
+ changeGridIcon();
+ }
+ }
+
+ private void changeGridIcon(){
+ MenuItem menuItem = mOptionsMenu.findItem(R.id.action_switch_view);
+ if (DisplayUtils.isGridView(getFile(), getStorageManager())){
+ menuItem.setTitle(getApplicationContext().getString(R.string.action_switch_list_view));
+ menuItem.setIcon(ContextCompat.getDrawable(getApplicationContext(),
+ R.drawable.ic_view_list));
} else {
- super.onBackPressed();
+ menuItem.setTitle(getApplicationContext().getString(R.string.action_switch_grid_view));
+ menuItem.setIcon(ContextCompat.getDrawable(getApplicationContext(),
+ R.drawable.ic_view_module));
}
}
Log_OC.v(TAG, "onPause() end");
}
+ public boolean isFabOpen() {
+ if(getListOfFilesFragment() != null && getListOfFilesFragment().getFabMain() != null && getListOfFilesFragment().getFabMain().isExpanded()) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
private class SyncBroadcastReceiver extends BroadcastReceiver {
currentDir.getRemotePath().equals(synchFolderRemotePath)) {
OCFileListFragment fileListFragment = getListOfFilesFragment();
if (fileListFragment != null) {
- fileListFragment.listDirectory();
- // TODO Enable when "On Device" is recovered ?
- // fileListFragment.listDirectory(currentDir,
- // MainApp.getOnlyOnDevice());
+ fileListFragment.listDirectory(currentDir,
+ MainApp.getOnlyOnDevice());
}
}
setFile(currentFile);
OCFileListFragment listOfFiles = getListOfFilesFragment();
if (listOfFiles != null) { // should never be null, indeed
OCFile root = getStorageManager().getFileByPath(OCFile.ROOT_PATH);
- listOfFiles.listDirectory(root);
- // TODO Enable when "On Device" is recovered ?
- // listOfFiles.listDirectory(root, MainApp.getOnlyOnDevice());
+ listOfFiles.listDirectory(root, MainApp.getOnlyOnDevice());
setFile(listOfFiles.getCurrentFile());
startSyncFolderOperation(root, false);
}
cleanSecondFragment();
// Sync Folder
startSyncFolderOperation(directory, false);
+
+ MenuItem menuItem = mOptionsMenu.findItem(R.id.action_switch_view);
+
+ changeGridIcon();
+ if (DisplayUtils.isGridView(directory, getStorageManager())){
+ switchToGridView();
+ } else {
+ switchToListView();
+ }
}
/**
// getFileDownloadBinder() - THIS IS A MESS
OCFileListFragment listOfFiles = getListOfFilesFragment();
if (listOfFiles != null) {
- listOfFiles.listDirectory();
- // TODO Enable when "On Device" is recovered ?
- // listOfFiles.listDirectory(MainApp.getOnlyOnDevice());
+ listOfFiles.listDirectory(MainApp.getOnlyOnDevice());
}
FileFragment secondFragment = getSecondFragment();
if (secondFragment != null && secondFragment instanceof FileDetailFragment) {
OCFile syncedFile = operation.getLocalFile();
onTransferStateChanged(syncedFile, true, true);
invalidateOptionsMenu();
+ refreshShowDetails();
}
}
}
private void sortByName(boolean ascending) {
getListOfFilesFragment().sortByName(ascending);
}
+ private boolean isGridView(){ return getListOfFilesFragment().isGridView(); }
+ private void switchToGridView() {
+ getListOfFilesFragment().switchToGridView();
+ }
+ private void switchToListView() {
+ getListOfFilesFragment().switchToListView();
+ }
public void allFilesOption() {
browseToRoot();
}
+
+ public void refreshDirectory(){
+ getListOfFilesFragment().refreshDirectory();
+ }
}
if (!stateWasRecovered) {
OCFileListFragment listOfFolders = getListOfFilesFragment();
- listOfFolders.listDirectory(folder/*, false*/);
+ listOfFolders.listDirectory(folder, false);
startSyncFolderOperation(folder, false);
}
Bundle args = new Bundle();
args.putBoolean(OCFileListFragment.ARG_JUST_FOLDERS, true);
args.putBoolean(OCFileListFragment.ARG_ALLOW_CONTEXTUAL_ACTIONS, false);
+ args.putBoolean(OCFileListFragment.ARG_HIDE_FAB, true);
listOfFiles.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.add(R.id.fragment_container, listOfFiles, TAG_LIST_OF_FOLDERS);
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
- menu.findItem(R.id.action_upload).setVisible(false);
menu.findItem(R.id.action_sort).setVisible(false);
return true;
}
protected void refreshListOfFilesFragment() {
OCFileListFragment fileListFragment = getListOfFilesFragment();
if (fileListFragment != null) {
- fileListFragment.listDirectory();
- // TODO Enable when "On Device" is recovered ?
- // fileListFragment.listDirectory(false);
+ fileListFragment.listDirectory(false);
}
}
OCFileListFragment listOfFiles = getListOfFilesFragment();
if (listOfFiles != null) { // should never be null, indeed
OCFile root = getStorageManager().getFileByPath(OCFile.ROOT_PATH);
- listOfFiles.listDirectory(root);
- // TODO Enable when "On Device" is recovered ?
- // listOfFiles.listDirectory(root, false);
+ listOfFiles.listDirectory(root, false);
setFile(listOfFiles.getCurrentFile());
updateNavigationElementsInActionBar();
startSyncFolderOperation(root, false);
equals(synchFolderRemotePath)) {
OCFileListFragment fileListFragment = getListOfFilesFragment();
if (fileListFragment != null) {
- fileListFragment.listDirectory(currentDir);
- // TODO Enable when "On Device" is recovered ?
- // fileListFragment.listDirectory(currentDir, false);
+ fileListFragment.listDirectory(currentDir, false);
}
}
setFile(currentFile);
mPrefInstantUploadCategory.addPreference(mPrefInstantUploadPathWiFi);
mPrefInstantUploadCategory.addPreference(mPrefInstantUploadPath);
} else {
- mPrefInstantUploadCategory.removePreference(mPrefInstantUploadPathWiFi);
- mPrefInstantUploadCategory.removePreference(mPrefInstantUploadPath);
+// mPrefInstantUploadCategory.removePreference(mPrefInstantUploadPathWiFi);
+// mPrefInstantUploadCategory.removePreference(mPrefInstantUploadPath);
}
}
mPrefInstantUploadCategory.addPreference(mPrefInstantVideoUploadPathWiFi);
mPrefInstantUploadCategory.addPreference(mPrefInstantVideoUploadPath);
} else {
- mPrefInstantUploadCategory.removePreference(mPrefInstantVideoUploadPathWiFi);
- mPrefInstantUploadCategory.removePreference(mPrefInstantVideoUploadPath);
+// mPrefInstantUploadCategory.removePreference(mPrefInstantVideoUploadPathWiFi);
+// mPrefInstantUploadCategory.removePreference(mPrefInstantVideoUploadPath);
}
}
SharedPreferences appPrefs =
PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
mUploadVideoPath = appPrefs.getString("instant_video_upload_path", getString(R.string.instant_upload_path));
- mPrefInstantVideoUploadPath.setSummary(mUploadVideoPath);
+// mPrefInstantVideoUploadPath.setSummary(mUploadVideoPath);
}
/**
if (!stateWasRecovered) {
OCFileListFragment listOfFolders = getListOfFilesFragment();
- // TODO Enable when "On Device" is recovered ?
- listOfFolders.listDirectory(folder/*, false*/);
+ listOfFolders.listDirectory(folder, false);
startSyncFolderOperation(folder, false);
}
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// click on folder in the list
Log_OC.d(TAG, "on item click");
- // TODO Enable when "On Device" is recovered ?
- Vector<OCFile> tmpfiles = getStorageManager().getFolderContent(mFile /*, false*/);
+ Vector<OCFile> tmpfiles = getStorageManager().getFolderContent(mFile, false);
if (tmpfiles.size() <= 0) return;
// filter on dirtype
Vector<OCFile> files = new Vector<OCFile>();
mFile = getStorageManager().getFileByPath(full_path);
if (mFile != null) {
- // TODO Enable when "On Device" is recovered ?
- Vector<OCFile> files = getStorageManager().getFolderContent(mFile/*, false*/);
+ Vector<OCFile> files = getStorageManager().getFolderContent(mFile, false);
List<HashMap<String, Object>> data = new LinkedList<HashMap<String,Object>>();
for (OCFile f : files) {
HashMap<String, Object> h = new HashMap<String, Object>();
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
- menu.findItem(R.id.action_upload).setVisible(false);
menu.findItem(R.id.action_sort).setVisible(false);
menu.findItem(R.id.action_sync_account).setVisible(false);
return true;
}
final InputStream in = snapshot.getInputStream( 0 );
if ( in != null ) {
- final BufferedInputStream buffIn =
+ final BufferedInputStream buffIn =
new BufferedInputStream( in, IO_BUFFER_SIZE );
- bitmap = BitmapFactory.decodeStream( buffIn );
- }
+ bitmap = BitmapFactory.decodeStream( buffIn );
+ }
} catch ( IOException e ) {
e.printStackTrace();
} finally {
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * Copyright (C) 2015 Tobias Kaminsky
+ * Copyright (C) 2015 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/>.
+ *
+ * adapted from: http://stephendnicholas.com/archives/974
+ *
+ */
+
+package com.owncloud.android.ui.adapter;
+
+import android.accounts.Account;
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.content.UriMatcher;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.net.Uri;
+import android.os.ParcelFileDescriptor;
+
+import com.owncloud.android.MainApp;
+import com.owncloud.android.authentication.AccountUtils;
+import com.owncloud.android.datamodel.FileDataStorageManager;
+import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.datamodel.ThumbnailsCacheManager;
+import com.owncloud.android.lib.common.utils.Log_OC;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+public class DiskLruImageCacheFileProvider extends ContentProvider {
+ private static String TAG = FileDataStorageManager.class.getSimpleName();
+
+ public static final String AUTHORITY = "com.owncloud.imageCache.provider";
+
+ @Override
+ public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
+ Account account = AccountUtils.getCurrentOwnCloudAccount(MainApp.getAppContext());
+ FileDataStorageManager fileDataStorageManager = new FileDataStorageManager(account,
+ MainApp.getAppContext().getContentResolver());
+
+ OCFile ocFile = fileDataStorageManager.getFileByPath(uri.getPath());
+
+ Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
+ String.valueOf("r" + ocFile.getRemoteId()));
+
+ // create a file to write bitmap data
+ File f = new File(MainApp.getAppContext().getCacheDir(), ocFile.getFileName());
+ try {
+ f.createNewFile();
+
+ //Convert bitmap to byte array
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ thumbnail.compress(Bitmap.CompressFormat.JPEG, 90, bos);
+ byte[] bitmapdata = bos.toByteArray();
+
+ //write the bytes in file
+ FileOutputStream fos = null;
+ try {
+ fos = new FileOutputStream(f);
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ }
+ fos.write(bitmapdata);
+ fos.flush();
+ fos.close();
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
+ }
+
+
+ @Override
+ public boolean onCreate() {
+ return true;
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
+ return null;
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ return null;
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ return null;
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ return 0;
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ return 0;
+ }
+}
switch (viewType){\r
case LIST_ITEM:\r
TextView fileSizeV = (TextView) view.findViewById(R.id.file_size);\r
+ TextView fileSizeSeparatorV = (TextView) view.findViewById(R.id.file_separator);\r
TextView lastModV = (TextView) view.findViewById(R.id.last_mod);\r
ImageView checkBoxV = (ImageView) view.findViewById(R.id.custom_checkbox);\r
\r
\r
checkBoxV.setVisibility(View.GONE);\r
\r
+ fileSizeSeparatorV.setVisibility(View.VISIBLE);\r
fileSizeV.setVisibility(View.VISIBLE);\r
fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength()));\r
\r
} else {\r
if (parentList.isItemChecked(position)) {\r
checkBoxV.setImageResource(\r
- android.R.drawable.checkbox_on_background);\r
+ R.drawable.ic_checkbox_marked);\r
} else {\r
checkBoxV.setImageResource(\r
- android.R.drawable.checkbox_off_background);\r
+ R.drawable.ic_checkbox_blank_outline);\r
}\r
checkBoxV.setVisibility(View.VISIBLE);\r
}\r
}\r
\r
} else { //Folder\r
+ fileSizeSeparatorV.setVisibility(View.INVISIBLE);\r
fileSizeV.setVisibility(View.INVISIBLE);\r
}\r
\r
task\r
);\r
fileIcon.setImageDrawable(asyncDrawable);\r
- task.execute(file);\r
+ task.execute(file, true);\r
}\r
}\r
\r
* mStorageManager if is different (and not NULL)\r
*/\r
public void swapDirectory(OCFile directory, FileDataStorageManager updatedStorageManager\r
- /*, boolean onlyOnDevice*/) {\r
+ , boolean onlyOnDevice) {\r
mFile = directory;\r
if (updatedStorageManager != null && updatedStorageManager != mStorageManager) {\r
mStorageManager = updatedStorageManager;\r
mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext);\r
}\r
if (mStorageManager != null) {\r
- // TODO Enable when "On Device" is recovered ?\r
- mFiles = mStorageManager.getFolderContent(mFile/*, onlyOnDevice*/);\r
+ mFiles = mStorageManager.getFolderContent(mFile, onlyOnDevice);\r
mFilesOrig.clear();\r
mFilesOrig.addAll(mFiles);\r
\r
public void setGridMode(boolean gridMode) {\r
mGridMode = gridMode;\r
}\r
+\r
+ public boolean isGridMode() {\r
+ return mGridMode;\r
+ }\r
}\r
fileIcon.setTag(file.hashCode());
TextView fileSizeV = (TextView) view.findViewById(R.id.file_size);
+ TextView fileSizeSeparatorV = (TextView) view.findViewById(R.id.file_separator);
TextView lastModV = (TextView) view.findViewById(R.id.last_mod);
ImageView checkBoxV = (ImageView) view.findViewById(R.id.custom_checkbox);
if (!file.isDirectory()) {
+ fileSizeSeparatorV.setVisibility(View.VISIBLE);
fileSizeV.setVisibility(View.VISIBLE);
fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.length()));
checkBoxV.setVisibility(View.GONE);
} else {
if (parentList.isItemChecked(position)) {
- checkBoxV.setImageResource(android.R.drawable.checkbox_on_background);
+ checkBoxV.setImageResource(R.drawable.ic_checkbox_marked);
} else {
- checkBoxV.setImageResource(android.R.drawable.checkbox_off_background);
+ checkBoxV.setImageResource(R.drawable.ic_checkbox_blank_outline);
}
checkBoxV.setVisibility(View.VISIBLE);
}
}
} else {
+ fileSizeSeparatorV.setVisibility(View.GONE);
fileSizeV.setVisibility(View.GONE);
lastModV.setVisibility(View.GONE);
checkBoxV.setVisibility(View.GONE);
boolean containsFavorite = false;
if (mTargetFile.isFolder()) {
- // TODO Enable when "On Device" is recovered ?
- Vector<OCFile> files = storageManager.getFolderContent(mTargetFile/*, false*/);
+ Vector<OCFile> files = storageManager.getFolderContent(mTargetFile, false);
for(OCFile file: files) {
containsFavorite = file.isFavorite() || containsFavorite;
import java.util.ArrayList;
+import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
+import android.widget.Toast;
+import com.getbase.floatingactionbutton.FloatingActionButton;
+import com.getbase.floatingactionbutton.FloatingActionsMenu;
import com.owncloud.android.R;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.ui.ExtendedListView;
import com.owncloud.android.ui.activity.OnEnforceableRefreshListener;
import com.owncloud.android.ui.adapter.FileListListAdapter;
+import com.owncloud.android.ui.dialog.CreateFolderDialogFragment;
import third_parties.in.srain.cube.GridViewWithHeaderAndFooter;
private SwipeRefreshLayout mRefreshGridLayout;
private SwipeRefreshLayout mRefreshEmptyLayout;
private TextView mEmptyListMessage;
+
+ private FloatingActionsMenu fabMain;
+ private FloatingActionButton fabUpload;
+ private FloatingActionButton fabMkdir;
+ private FloatingActionButton fabUploadFromApp;
// Save the state of the scroll in browsing
private ArrayList<Integer> mIndexes;
return mCurrentListView;
}
+ public FloatingActionButton getFabUpload() {
+ return fabUpload;
+ }
+
+ public FloatingActionButton getFabUploadFromApp() {
+ return fabUploadFromApp;
+ }
+
+ public FloatingActionButton getFabMkdir() {
+ return fabMkdir;
+ }
+
+ public FloatingActionsMenu getFabMain() {
+ return fabMain;
+ }
- protected void switchToGridView() {
+ public void switchToGridView() {
if ((mCurrentListView == mListView)) {
mListView.setAdapter(null);
mCurrentListView = mGridView;
}
}
-
- protected void switchToListView() {
+
+ public void switchToListView() {
if (mCurrentListView == mGridView) {
mGridView.setAdapter(null);
mRefreshGridLayout.setVisibility(View.GONE);
mCurrentListView = mListView;
}
}
+
+ public boolean isGridView(){
+ if (mAdapter instanceof FileListListAdapter) {
+ return ((FileListListAdapter) mAdapter).isGridMode();
+ }
+ return false;
+ }
@Override
mCurrentListView = mListView; // list as default
+ fabMain = (FloatingActionsMenu) v.findViewById(R.id.fab_main);
+ fabUpload = (FloatingActionButton) v.findViewById(R.id.fab_upload);
+ fabMkdir = (FloatingActionButton) v.findViewById(R.id.fab_mkdir);
+ fabUploadFromApp = (FloatingActionButton) v.findViewById(R.id.fab_upload_from_app);
+
return v;
}
}
/**
+ * Disables FAB.
+ *
+ * Sets the 'visibility' state of the FAB contained in the fragment.
+ *
+ * When 'false' is set, FAB visibility is set to View.GONE programatically,
+ *
+ * @param enabled Desired visibility for the FAB.
+ */
+ public void setFabEnabled(boolean enabled) {
+ if(enabled) {
+ fabMain.setVisibility(View.VISIBLE);
+ } else {
+ fabMain.setVisibility(View.GONE);
+ }
+ }
+
+ /**
* Set message for empty list view
*/
public void setMessageForEmptyList(String message) {
package com.owncloud.android.ui.fragment;
import android.accounts.Account;
+import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.widget.ProgressBar;
import android.widget.TextView;
+import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.datamodel.ThumbnailsCacheManager;
import com.owncloud.android.files.FileMenuFilter;
import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
// set file details
setFilename(file.getFileName());
- setFiletype(file.getMimetype(), file.getFileName());
+ setFiletype(file);
setFilesize(file.getFileLength());
setTimeModified(file.getModificationTimestamp());
/**
* Updates the MIME type in view
- * @param mimetype MIME type to set
- * @param filename Name of the file, to deduce the icon to use in case the MIME type is not precise enough
+ * @param file : An {@link OCFile}
*/
- private void setFiletype(String mimetype, String filename) {
+ private void setFiletype(OCFile file) {
+ String mimetype = file.getMimetype();
TextView tv = (TextView) getView().findViewById(R.id.fdType);
if (tv != null) {
+ // mimetype MIME type to set
String printableMimetype = DisplayUtils.convertMIMEtoPrettyPrint(mimetype);
tv.setText(printableMimetype);
}
+
ImageView iv = (ImageView) getView().findViewById(R.id.fdIcon);
+
if (iv != null) {
- iv.setImageResource(MimetypeIconUtil.getFileTypeIconId(mimetype, filename));
+ Bitmap thumbnail;
+ iv.setTag(file.getFileId());
+
+ if (file.isImage()) {
+ String tagId = String.valueOf(file.getRemoteId());
+ thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(tagId);
+
+ if (thumbnail != null && !file.needsUpdateThumbnail()) {
+ iv.setImageBitmap(thumbnail);
+ } else {
+ // generate new Thumbnail
+ if (ThumbnailsCacheManager.cancelPotentialWork(file, iv)) {
+ final ThumbnailsCacheManager.ThumbnailGenerationTask task =
+ new ThumbnailsCacheManager.ThumbnailGenerationTask(
+ iv, mContainerActivity.getStorageManager(), mAccount
+ );
+ if (thumbnail == null) {
+ thumbnail = ThumbnailsCacheManager.mDefaultImg;
+ }
+ final ThumbnailsCacheManager.AsyncDrawable asyncDrawable =
+ new ThumbnailsCacheManager.AsyncDrawable(
+ MainApp.getAppContext().getResources(),
+ thumbnail,
+ task
+ );
+ iv.setImageDrawable(asyncDrawable);
+ task.execute(file);
+ }
+ }
+ } else {
+ // Name of the file, to deduce the icon to use in case the MIME type is not precise enough
+ String filename = file.getFileName();
+ iv.setImageResource(MimetypeIconUtil.getFileTypeIconId(mimetype, filename));
+ }
}
}
/** Adapter to connect the data from the directory with the View object */
private LocalFileListAdapter mAdapter = null;
-
/**
* {@inheritDoc}
*/
View v = super.onCreateView(inflater, container, savedInstanceState);
setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
setSwipeEnabled(false); // Disable pull-to-refresh
+ setFabEnabled(false); // Disable FAB
setMessageForEmptyList(getString(R.string.local_file_list_empty));
Log_OC.i(TAG, "onCreateView() end");
return v;
ImageView checkBoxV = (ImageView) v.findViewById(R.id.custom_checkbox);
if (checkBoxV != null) {
if (((ListView)getListView()).isItemChecked(position)) {
- checkBoxV.setImageResource(android.R.drawable.checkbox_on_background);
+ checkBoxV.setImageResource(R.drawable.ic_checkbox_marked);
} else {
- checkBoxV.setImageResource(android.R.drawable.checkbox_off_background);
+ checkBoxV.setImageResource(R.drawable.ic_checkbox_blank_outline);
}
}
// notify the change to the container Activity
import android.app.Activity;
import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Build;
import android.os.Bundle;
+import android.preference.PreferenceManager;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.ContextMenu;
import android.view.Menu;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.PopupMenu;
+import android.widget.TextView;
+import android.widget.Toast;
+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.ui.activity.FileDisplayActivity;
import com.owncloud.android.ui.activity.FolderPickerActivity;
import com.owncloud.android.ui.activity.OnEnforceableRefreshListener;
+import com.owncloud.android.ui.activity.UploadFilesActivity;
import com.owncloud.android.ui.adapter.FileListListAdapter;
import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
+import com.owncloud.android.ui.dialog.CreateFolderDialogFragment;
import com.owncloud.android.ui.dialog.FileActionsDialogFragment;
import com.owncloud.android.ui.dialog.RemoveFileDialogFragment;
import com.owncloud.android.ui.dialog.RenameFileDialogFragment;
+import com.owncloud.android.ui.dialog.UploadSourceDialogFragment;
import com.owncloud.android.ui.preview.PreviewImageFragment;
import com.owncloud.android.ui.preview.PreviewMediaFragment;
+import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.FileStorageUtils;
import com.owncloud.android.ui.preview.PreviewTextFragment;
public final static String ARG_JUST_FOLDERS = MY_PACKAGE + ".JUST_FOLDERS";
public final static String ARG_ALLOW_CONTEXTUAL_ACTIONS = MY_PACKAGE + ".ALLOW_CONTEXTUAL";
+ public final static String ARG_HIDE_FAB = MY_PACKAGE + ".HIDE_FAB";
private static final String KEY_FILE = MY_PACKAGE + ".extra.FILE";
+ private static final String KEY_FAB_EVER_CLICKED = "FAB_EVER_CLICKED";
+
+ private static String DIALOG_CREATE_FOLDER = "DIALOG_CREATE_FOLDER";
private FileFragment.ContainerActivity mContainerActivity;
private boolean mJustFolders;
private OCFile mTargetFile;
-
-
+
+ private boolean miniFabClicked = false;
/**
* {@inheritDoc}
setListAdapter(mAdapter);
registerLongClickListener();
+
+ boolean hideFab = (args != null) && args.getBoolean(ARG_HIDE_FAB, false);
+ if (hideFab) {
+ setFabEnabled(false);
+ } else {
+ setFabEnabled(true);
+ registerFabListeners();
+
+ // detect if a mini FAB has ever been clicked
+ final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
+ if(prefs.getLong(KEY_FAB_EVER_CLICKED, 0) > 0) {
+ miniFabClicked = true;
+ }
+
+ // add labels to the min FABs when none of them has ever been clicked on
+ if(!miniFabClicked) {
+ setFabLabels();
+ } else {
+ removeFabLabels();
+ }
+ }
}
+ /**
+ * adds labels to all mini FABs.
+ */
+ private void setFabLabels() {
+ getFabUpload().setTitle(getResources().getString(R.string.actionbar_upload));
+ getFabMkdir().setTitle(getResources().getString(R.string.actionbar_mkdir));
+ getFabUploadFromApp().setTitle(getResources().getString(R.string.actionbar_upload_from_apps));
+ }
+
+ /**
+ * registers all listeners on all mini FABs.
+ */
+ private void registerFabListeners() {
+ registerFabUploadListeners();
+ registerFabMkDirListeners();
+ registerFabUploadFromAppListeners();
+ }
+
+ /**
+ * registers {@link android.view.View.OnClickListener} and {@link android.view.View.OnLongClickListener}
+ * on the Upload mini FAB for the linked action and {@link Toast} showing the underlying action.
+ */
+ private void registerFabUploadListeners() {
+ getFabUpload().setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent action = new Intent(getActivity(), UploadFilesActivity.class);
+ action.putExtra(
+ UploadFilesActivity.EXTRA_ACCOUNT,
+ ((FileActivity) getActivity()).getAccount()
+ );
+ getActivity().startActivityForResult(action, UploadSourceDialogFragment.ACTION_SELECT_MULTIPLE_FILES);
+ getFabMain().collapse();
+ recordMiniFabClick();
+ }
+ });
+
+ getFabUpload().setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ Toast.makeText(getActivity(), R.string.actionbar_upload, Toast.LENGTH_SHORT).show();
+ return true;
+ }
+ });
+ }
+
+ /**
+ * registers {@link android.view.View.OnClickListener} and {@link android.view.View.OnLongClickListener}
+ * on the 'Create Dir' mini FAB for the linked action and {@link Toast} showing the underlying action.
+ */
+ private void registerFabMkDirListeners() {
+ getFabMkdir().setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ CreateFolderDialogFragment dialog =
+ CreateFolderDialogFragment.newInstance(mFile);
+ dialog.show(getActivity().getSupportFragmentManager(), FileDisplayActivity.DIALOG_CREATE_FOLDER);
+ getFabMain().collapse();
+ recordMiniFabClick();
+ }
+ });
+
+ getFabMkdir().setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ Toast.makeText(getActivity(), R.string.actionbar_mkdir, Toast.LENGTH_SHORT).show();
+ return true;
+ }
+ });
+ }
+
+ /**
+ * registers {@link android.view.View.OnClickListener} and {@link android.view.View.OnLongClickListener}
+ * on the Upload from App mini FAB for the linked action and {@link Toast} showing the underlying action.
+ */
+ private void registerFabUploadFromAppListeners() {
+ getFabUploadFromApp().setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent action = new Intent(Intent.ACTION_GET_CONTENT);
+ action = action.setType("*/*").addCategory(Intent.CATEGORY_OPENABLE);
+
+ //Intent.EXTRA_ALLOW_MULTIPLE is only supported on api level 18+, Jelly Bean
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+ action.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
+ }
+
+ getActivity().startActivityForResult(
+ Intent.createChooser(action, getString(R.string.upload_chooser_title)),
+ UploadSourceDialogFragment.ACTION_SELECT_CONTENT_FROM_APPS
+ );
+ getFabMain().collapse();
+ recordMiniFabClick();
+ }
+ });
+
+ getFabUploadFromApp().setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ Toast.makeText(getActivity(),
+ R.string.actionbar_upload_from_apps,
+ Toast.LENGTH_SHORT).show();
+ return true;
+ }
+ });
+ }
+
+ /**
+ * records a click on a mini FAB and thus:
+ * <ol>
+ * <li>persists the click fact</li>
+ * <li>removes the mini FAB labels</li>
+ * </ol>
+ */
+ private void recordMiniFabClick() {
+ // only record if it hasn't been done already at some other time
+ if(!miniFabClicked) {
+ final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());
+ sp.edit().putLong(KEY_FAB_EVER_CLICKED, 1).commit();
+ miniFabClicked = true;
+ }
+ }
+
+ /**
+ * removes the labels on all known min FABs.
+ */
+ private void removeFabLabels() {
+ getFabUpload().setTitle(null);
+ getFabMkdir().setTitle(null);
+ getFabUploadFromApp().setTitle(null);
+ ((TextView) getFabUpload().getTag(com.getbase.floatingactionbutton.R.id.fab_label)).setVisibility(View.GONE);
+ ((TextView) getFabMkdir().getTag(com.getbase.floatingactionbutton.R.id.fab_label)).setVisibility(View.GONE);
+ ((TextView) getFabUploadFromApp().getTag(com.getbase.floatingactionbutton.R.id.fab_label)).setVisibility(View.GONE);
+ }
+
private void registerLongClickListener() {
getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> arg0, View v,
});
}
-
private void showFileAction(int fileIndex) {
Bundle args = getArguments();
PopupMenu pm = new PopupMenu(getActivity(),null);
/**
* 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.
- * <p/>
- * return Count of folder levels browsed up.
+ * <p>
+ * 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.
+ * </p>
+ * @return Count of folder levels browsed up.
*/
public int onBrowseUp() {
OCFile parentDir = null;
} // exit is granted because storageManager.getFileByPath("/") never returns null
mFile = parentDir;
- // TODO Enable when "On Device" is recovered ?
- listDirectory(mFile /*, MainApp.getOnlyOnDevice()*/);
+ listDirectory(mFile, MainApp.getOnlyOnDevice());
onRefresh(false);
if (file != null) {
if (file.isFolder()) {
// update state and view of this fragment
- // TODO Enable when "On Device" is recovered ?
- listDirectory(file/*, MainApp.getOnlyOnDevice()*/);
+ listDirectory(file, MainApp.getOnlyOnDevice());
// then, notify parent activity to let it update its state and view
mContainerActivity.onBrowsedDownTo(file);
// save index and top position
} else {
mContainerActivity.getFileOperationsHelper().openFile(file);
}
-
- } else {
- // automatic download, preview on finish
- ((FileDisplayActivity) mContainerActivity).startDownloadForPreview(file);
+
}
-
}
} else {
item.setEnabled(false);
}
}
+
+// String.format(mContext.getString(R.string.subject_token),
+// getClient().getCredentials().getUsername(), file.getFileName()));
}
}
}
/**
- * Calls {@link OCFileListFragment#listDirectory(OCFile)} with a null parameter
+ * Calls {@link OCFileListFragment#listDirectory(OCFile, boolean)} with a null parameter
*/
- public void listDirectory(/*boolean onlyOnDevice*/){
- listDirectory(null);
- // TODO Enable when "On Device" is recovered ?
- // listDirectory(null, onlyOnDevice);
+ public void listDirectory(boolean onlyOnDevice){
+ listDirectory(null, onlyOnDevice);
}
public void refreshDirectory(){
- // TODO Enable when "On Device" is recovered ?
- listDirectory(getCurrentFile()/*, MainApp.getOnlyOnDevice()*/);
+ listDirectory(getCurrentFile(), MainApp.getOnlyOnDevice());
}
/**
*
* @param directory File to be listed
*/
- public void listDirectory(OCFile directory/*, boolean onlyOnDevice*/) {
+ public void listDirectory(OCFile directory, boolean onlyOnDevice) {
FileDataStorageManager storageManager = mContainerActivity.getStorageManager();
if (storageManager != null) {
directory = storageManager.getFileById(directory.getParentId());
}
- // TODO Enable when "On Device" is recovered ?
- mAdapter.swapDirectory(directory, storageManager/*, onlyOnDevice*/);
+ mAdapter.swapDirectory(directory, storageManager, onlyOnDevice);
if (mFile == null || !mFile.equals(directory)) {
mCurrentListView.setSelection(0);
}
OwnCloudVersion version = AccountUtils.getServerVersion(
((FileActivity)mContainerActivity).getAccount());
if (version != null && version.supportsRemoteThumbnails() &&
- imagesCount > 0 && imagesCount == filesCount) {
+ DisplayUtils.isGridView(mFile, mContainerActivity.getStorageManager())) {
switchToGridView();
registerLongClickListener();
} else {
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
+import android.graphics.Movie;
import android.os.Build;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
-import com.owncloud.android.lib.common.utils.Log_OC;
+import com.owncloud.android.datamodel.OCFile;
+
+import java.io.FileInputStream;
+import java.io.InputStream;
public class ImageViewCustom extends ImageView {
private int mBitmapHeight;
private int mBitmapWidth;
-
+ private Movie mGifMovie;
+ private int mMovieWidth, mMovieHeight;
+ private long mMovieDuration;
+ private long mMovieRunDuration;
+ private long mLastTick;
+
public ImageViewCustom(Context context) {
super(context);
}
@SuppressLint("NewApi")
@Override
protected void onDraw(Canvas canvas) {
-
if(IS_ICS_OR_HIGHER && checkIfMaximumBitmapExceed(canvas) || IS_VERSION_BUGGY_ON_RECYCLES ) {
// Software type is set with two targets:
// 1. prevent that bitmaps larger than maximum textures allowed are shown as black views in devices
// with LAYER_TYPE_HARDWARE enabled by default;
- // 2. grant that bitmaps are correctly dellocated from memory in versions suffering the bug fixed in
+ // 2. grant that bitmaps are correctly de-allocated from memory in versions suffering the bug fixed in
// https://android.googlesource.com/platform/frameworks/base/+/034de6b1ec561797a2422314e6ef03e3cd3e08e0;
//
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
- super.onDraw(canvas);
+ if(mGifMovie == null){
+ super.onDraw(canvas);
+ } else {
+ long nowTick = android.os.SystemClock.uptimeMillis();
+ if (mLastTick == 0) {
+ mMovieRunDuration = 0;
+ } else {
+ mMovieRunDuration += nowTick - mLastTick;
+ if(mMovieRunDuration > mMovieDuration){
+ mMovieRunDuration = 0;
+ }
+ }
+
+ mGifMovie.setTime((int) mMovieRunDuration);
+
+ float scale;
+ if(mGifMovie.height() > getHeight() || mGifMovie.width() > getWidth()) {
+ scale = (1f / Math.min(canvas.getHeight() / mGifMovie.height(),
+ canvas.getWidth() / mGifMovie.width())) + 0.25f;
+ } else {
+ scale = Math.min(canvas.getHeight() / mGifMovie.height(),
+ canvas.getWidth() / mGifMovie.width());
+ }
+
+ canvas.scale(scale, scale);
+ canvas.translate(((float) getWidth() / scale - (float) mGifMovie.width()) / 2f,
+ ((float) getHeight() / scale - (float) mGifMovie.height()) /2f);
+
+ mGifMovie.draw(canvas, 0, 0);
+
+ mLastTick = nowTick;
+ invalidate();
+ }
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ if (mGifMovie == null){
+ setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
+ } else {
+ setMeasuredDimension(mMovieWidth, mMovieHeight);
+ }
}
/**
*/
@SuppressLint("NewApi")
private boolean checkIfMaximumBitmapExceed(Canvas canvas) {
- Log_OC.v(TAG, "Canvas maximum: " + canvas.getMaximumBitmapWidth() + " - " + canvas.getMaximumBitmapHeight());
- if (mBitmapWidth > canvas.getMaximumBitmapWidth()
- || mBitmapHeight > canvas.getMaximumBitmapHeight()) {
- return true;
- }
-
- return false;
+ return mBitmapWidth > canvas.getMaximumBitmapWidth()
+ || mBitmapHeight > canvas.getMaximumBitmapHeight();
+
}
@Override
* Keeps the size of the bitmap cached in member variables for faster access in {@link #onDraw(Canvas)} ,
* but without keeping another reference to the {@link Bitmap}
*/
- public void setImageBitmap (Bitmap bm) {
+ public void setImageBitmap(Bitmap bm) {
mBitmapWidth = bm.getWidth();
mBitmapHeight = bm.getHeight();
super.setImageBitmap(bm);
}
+ public void setGifImage(OCFile file){
+ try {
+ InputStream gifInputStream = new FileInputStream(file.getStoragePath());
+ setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+ setFocusable(true);
+
+ mGifMovie = Movie.decodeStream(gifInputStream);
+ mMovieWidth = mGifMovie.width();
+ mMovieHeight = mGifMovie.height();
+ mMovieDuration = mGifMovie.duration();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
}
import android.view.Window;
import com.ortiz.touch.ExtendedViewPager;
+import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.authentication.AccountUtils;
import com.owncloud.android.datamodel.FileDataStorageManager;
parentFolder = getStorageManager().getFileByPath(OCFile.ROOT_PATH);
}
- // TODO Enable when "On Device" is recovered ?
mPreviewImagePagerAdapter = new PreviewImagePagerAdapter(getSupportFragmentManager(),
- parentFolder, getAccount(), getStorageManager()/*, MainApp.getOnlyOnDevice()*/);
+ parentFolder, getAccount(), getStorageManager(), MainApp.getOnlyOnDevice());
mViewPager = (ExtendedViewPager) findViewById(R.id.fragmentPager);
int position = mHasSavedPosition ? mSavedPosition :
OCFile currentFile = mPreviewImagePagerAdapter.getFileAt(position);
getSupportActionBar().setTitle(currentFile.getFileName());
mDrawerToggle.setDrawerIndicatorEnabled(false);
- if (!currentFile.isDown()) {
- if (!mPreviewImagePagerAdapter.pendingErrorAt(position)) {
- requestForDownload(currentFile);
- }
- }
-
+
// Call to reset image zoom to initial state
((PreviewImagePagerAdapter) mViewPager.getAdapter()).resetZoom();
}
import android.widget.ProgressBar;
import android.widget.TextView;
+import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.datamodel.ThumbnailsCacheManager;
import com.owncloud.android.files.FileMenuFilter;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
private TextView mMessageView;
private ProgressBar mProgressWheel;
+ private Boolean mShowResizedImage = false;
+
public Bitmap mBitmap = null;
private static final String TAG = PreviewImageFragment.class.getSimpleName();
* {@link FragmentStatePagerAdapter}
* ; TODO better solution
*/
- public static PreviewImageFragment newInstance(OCFile imageFile, boolean ignoreFirstSavedState){
+ public static PreviewImageFragment newInstance(OCFile imageFile, boolean ignoreFirstSavedState,
+ boolean showResizedImage){
PreviewImageFragment frag = new PreviewImageFragment();
+ frag.mShowResizedImage = showResizedImage;
Bundle args = new Bundle();
args.putParcelable(ARG_FILE, imageFile);
args.putBoolean(ARG_IGNORE_FIRST, ignoreFirstSavedState);
if (getFile() == null) {
throw new IllegalStateException("Instanced with a NULL OCFile");
}
- if (!getFile().isDown()) {
- throw new IllegalStateException("There is no local file to preview");
- }
}
public void onStart() {
super.onStart();
if (getFile() != null) {
- mLoadBitmapTask = new LoadBitmapTask(mImageView, mMessageView, mProgressWheel);
- //mLoadBitmapTask.execute(new String[]{getFile().getStoragePath()});
-// mLoadBitmapTask.execute(getFile().getStoragePath());
- mLoadBitmapTask.execute(getFile());
+ mImageView.setTag(getFile().getFileId());
+
+ if (mShowResizedImage){
+ Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
+ String.valueOf("r" + getFile().getRemoteId())
+ );
+
+ if (thumbnail != null && !getFile().needsUpdateThumbnail()){
+ mProgressWheel.setVisibility(View.GONE);
+ mImageView.setImageBitmap(thumbnail);
+ mImageView.setVisibility(View.VISIBLE);
+ mBitmap = thumbnail;
+ } else {
+ // generate new Thumbnail
+ if (ThumbnailsCacheManager.cancelPotentialWork(getFile(), mImageView)) {
+ final ThumbnailsCacheManager.ThumbnailGenerationTask task =
+ new ThumbnailsCacheManager.ThumbnailGenerationTask(
+ mImageView, mContainerActivity.getStorageManager(),
+ mContainerActivity.getStorageManager().getAccount(),
+ mProgressWheel);
+ if (thumbnail == null) {
+ thumbnail = ThumbnailsCacheManager.mDefaultImg;
+ }
+ final ThumbnailsCacheManager.AsyncDrawable asyncDrawable =
+ new ThumbnailsCacheManager.AsyncDrawable(
+ MainApp.getAppContext().getResources(),
+ thumbnail,
+ task
+ );
+ mImageView.setImageDrawable(asyncDrawable);
+ task.execute(getFile(), false);
+ }
+ }
+ } else {
+ mLoadBitmapTask = new LoadBitmapTask(mImageView, mMessageView, mProgressWheel);
+ mLoadBitmapTask.execute(getFile());
+ }
}
}
return true;
}
case R.id.action_send_file: {
- mContainerActivity.getFileOperationsHelper().sendDownloadedFile(getFile());
- return true;
+ if (getFile().isImage() && !getFile().isDown()){
+ mContainerActivity.getFileOperationsHelper().sendCachedImage(getFile());
+ return true;
+ } else {
+ mContainerActivity.getFileOperationsHelper().sendDownloadedFile(getFile());
+ return true;
+ }
}
case R.id.action_sync_file: {
mContainerActivity.getFileOperationsHelper().syncFile(getFile());
imageView.setBackground(backrepeat);
}
- imageView.setImageBitmap(bitmap);
+ if (result.ocFile.getMimetype().equalsIgnoreCase("image/gif")){
+ imageView.setGifImage(result.ocFile);
+ } else {
+ imageView.setImageBitmap(bitmap);
+ }
+
imageView.setVisibility(View.VISIBLE);
mBitmap = bitmap; // needs to be kept for recycling when not useful
}
import java.util.Vector;
import android.accounts.Account;
+import android.graphics.Bitmap;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.datamodel.ThumbnailsCacheManager;
+import com.owncloud.android.ui.adapter.FileListListAdapter;
import com.owncloud.android.ui.fragment.FileFragment;
import com.owncloud.android.utils.FileStorageUtils;
* @param storageManager Bridge to database.
*/
public PreviewImagePagerAdapter(FragmentManager fragmentManager, OCFile parentFolder,
- Account account, FileDataStorageManager storageManager /*,
- boolean onlyOnDevice*/) {
+ Account account, FileDataStorageManager storageManager,
+ boolean onlyOnDevice) {
super(fragmentManager);
if (fragmentManager == null) {
mAccount = account;
mStorageManager = storageManager;
- // TODO Enable when "On Device" is recovered ?
- mImageFiles = mStorageManager.getFolderImages(parentFolder/*, false*/);
+ mImageFiles = mStorageManager.getFolderImages(parentFolder, false);
mImageFiles = FileStorageUtils.sortFolder(mImageFiles);
Fragment fragment = null;
if (file.isDown()) {
fragment = PreviewImageFragment.newInstance(file,
- mObsoletePositions.contains(Integer.valueOf(i)));
+ mObsoletePositions.contains(Integer.valueOf(i)), false);
} else if (mDownloadErrors.contains(Integer.valueOf(i))) {
fragment = FileDownloadFragment.newInstance(file, mAccount, true);
((FileDownloadFragment)fragment).setError(true);
mDownloadErrors.remove(Integer.valueOf(i));
-
} else {
- fragment = FileDownloadFragment.newInstance(
- file, mAccount, mObsoletePositions.contains(Integer.valueOf(i))
- );
+ fragment = PreviewImageFragment.newInstance(file,
+ mObsoletePositions.contains(Integer.valueOf(i)), true);
}
mObsoletePositions.remove(Integer.valueOf(i));
return fragment;
\r
package com.owncloud.android.utils;\r
\r
+import java.io.File;\r
+import java.net.IDN;\r
+import java.text.DateFormat;\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
+import java.util.Vector;\r
+\r
import android.annotation.TargetApi;\r
import android.app.Activity;\r
import android.content.Context;\r
+import android.content.SharedPreferences;\r
import android.graphics.Point;\r
import android.graphics.PorterDuff;\r
import android.os.Build;\r
\r
import com.owncloud.android.MainApp;\r
import com.owncloud.android.R;\r
+import com.owncloud.android.datamodel.FileDataStorageManager;\r
import com.owncloud.android.datamodel.OCFile;\r
\r
+import java.math.BigDecimal;\r
import java.net.IDN;\r
import java.text.DateFormat;\r
import java.util.Calendar;\r
private static final String OWNCLOUD_APP_NAME = "ownCloud";\r
\r
private static final String[] sizeSuffixes = { "B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" };\r
+ private static final int[] sizeScales = { 0, 0, 0, 1, 1, 2, 2, 2, 2 };\r
\r
private static Map<String, String> mimeType2HumanReadable;\r
\r
\r
/**\r
* Converts the file size in bytes to human readable output.\r
- * \r
+ * <ul>\r
+ * <li>appends a size suffix, e.g. B, KB, MB etc.</li>\r
+ * <li>rounds the size based on the suffix to 0,1 or 2 decimals</li>\r
+ * </ul>\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
+ int attachedSuff = 0;\r
+ while (result > 1024 && attachedSuff < sizeSuffixes.length) {\r
result /= 1024.;\r
- attachedsuff++;\r
+ attachedSuff++;\r
}\r
- result = ((int) (result * 100)) / 100.;\r
- return result + " " + sizeSuffixes[attachedsuff];\r
+\r
+ return new BigDecimal(result).setScale(\r
+ sizeScales[attachedSuff], BigDecimal.ROUND_HALF_UP) + " " + sizeSuffixes[attachedSuff];\r
}\r
\r
/**\r
dateString = DateUtils.getRelativeDateTimeString(c, time, minResolution, transitionResolution, flags);\r
}\r
}\r
- \r
- return dateString.toString().split(",")[0];\r
+\r
+ String[] parts = dateString.toString().split(",");\r
+ if (parts.length == 2) {\r
+ if (parts[1].contains(":") && !parts[0].contains(":")) {\r
+ return parts[0];\r
+ } else if (parts[0].contains(":") && !parts[1].contains(":")) {\r
+ return parts[1];\r
+ }\r
+ }\r
+ //dateString contains unexpected format. use localized, absolute date.\r
+ return DisplayUtils.unixTimeToHumanReadable(time);\r
}\r
\r
/**\r
}\r
\r
/**\r
+ * Determines if user set folder to grid or list view. If folder is not set itself,\r
+ * it finds a parent that is set (at least root is set).\r
+ * @param file\r
+ * @param storageManager\r
+ * @return\r
+ */\r
+ public static boolean isGridView(OCFile file, FileDataStorageManager storageManager){\r
+ if (file != null) {\r
+ OCFile fileToTest = file;\r
+ OCFile parentDir = null;\r
+ String parentPath = null;\r
+\r
+ SharedPreferences setting = MainApp.getAppContext().getSharedPreferences(\r
+ "viewMode", Context.MODE_PRIVATE);\r
+\r
+ if (setting.contains(fileToTest.getRemoteId())) {\r
+ return setting.getBoolean(fileToTest.getRemoteId(), false);\r
+ } else {\r
+ do {\r
+ if (fileToTest.getParentId() != FileDataStorageManager.ROOT_PARENT_ID) {\r
+ parentPath = new File(fileToTest.getRemotePath()).getParent();\r
+ parentPath = parentPath.endsWith(OCFile.PATH_SEPARATOR) ? parentPath :\r
+ parentPath + OCFile.PATH_SEPARATOR;\r
+ parentDir = storageManager.getFileByPath(parentPath);\r
+ } else {\r
+ parentDir = storageManager.getFileByPath(OCFile.ROOT_PATH);\r
+ }\r
+\r
+ while (parentDir == null) {\r
+ parentPath = new File(parentPath).getParent();\r
+ parentPath = parentPath.endsWith(OCFile.PATH_SEPARATOR) ? parentPath :\r
+ parentPath + OCFile.PATH_SEPARATOR;\r
+ parentDir = storageManager.getFileByPath(parentPath);\r
+ }\r
+ fileToTest = parentDir;\r
+ } while (endWhile(parentDir, setting));\r
+ return setting.getBoolean(fileToTest.getRemoteId(), false);\r
+ }\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ private static boolean endWhile(OCFile parentDir, SharedPreferences setting) {\r
+ if (parentDir.getRemotePath().compareToIgnoreCase(OCFile.ROOT_PATH) == 0) {\r
+ return false;\r
+ } else {\r
+ return !setting.contains(parentDir.getRemoteId());\r
+ }\r
+ }\r
+\r
+ public static void setViewMode(OCFile file, boolean setGrid){\r
+ SharedPreferences setting = MainApp.getAppContext().getSharedPreferences(\r
+ "viewMode", Context.MODE_PRIVATE);\r
+\r
+ SharedPreferences.Editor editor = setting.edit();\r
+ editor.putBoolean(file.getRemoteId(), setGrid);\r
+ editor.commit();\r
+ }\r
+\r
+ /**\r
* sets the coloring of the given progress bar to color_accent.\r
*\r
* @param progressBar the progress bar to be colored\r