Răsfoiți Sursa

Merge branch 'master' of https://github.com/nextcloud/android into fixingContactBackup

AndyScherzinger 8 ani în urmă
părinte
comite
dd54aa7207
30 a modificat fișierele cu 491 adăugiri și 116 ștergeri
  1. 3 3
      build.gradle
  2. 31 13
      src/main/java/com/owncloud/android/ui/activity/ActivitiesListActivity.java
  3. 11 12
      src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java
  4. 241 29
      src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java
  5. 13 0
      src/main/java/com/owncloud/android/ui/interfaces/ActivityListInterface.java
  6. 9 0
      src/main/java/com/owncloud/android/utils/DisplayUtils.java
  7. 36 0
      src/main/java/com/owncloud/android/utils/glide/CustomGlideStreamLoader.java
  8. 101 0
      src/main/java/com/owncloud/android/utils/glide/HttpStreamFetcher.java
  9. 9 3
      src/main/res/layout/activity_list_item.xml
  10. 17 0
      src/main/res/layout/activity_list_item_header.xml
  11. 0 3
      src/main/res/values-ast/strings.xml
  12. 0 3
      src/main/res/values-cs-rCZ/strings.xml
  13. 2 3
      src/main/res/values-de-rDE/strings.xml
  14. 2 3
      src/main/res/values-de/strings.xml
  15. 0 3
      src/main/res/values-el/strings.xml
  16. 2 3
      src/main/res/values-en-rGB/strings.xml
  17. 2 3
      src/main/res/values-es-rMX/strings.xml
  18. 0 3
      src/main/res/values-es/strings.xml
  19. 2 3
      src/main/res/values-fr/strings.xml
  20. 0 3
      src/main/res/values-is/strings.xml
  21. 2 1
      src/main/res/values-it/strings.xml
  22. 0 1
      src/main/res/values-ja-rJP/strings.xml
  23. 0 3
      src/main/res/values-nb-rNO/strings.xml
  24. 2 3
      src/main/res/values-nl/strings.xml
  25. 0 3
      src/main/res/values-pl/strings.xml
  26. 2 3
      src/main/res/values-pt-rBR/strings.xml
  27. 2 3
      src/main/res/values-ru/strings.xml
  28. 0 3
      src/main/res/values-sq/strings.xml
  29. 2 3
      src/main/res/values-tr/strings.xml
  30. 0 3
      src/main/res/values-zh-rCN/strings.xml

+ 3 - 3
build.gradle

@@ -13,7 +13,7 @@ buildscript {
         }
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:2.3.1'
+        classpath 'com.android.tools.build:gradle:2.3.2'
         classpath 'com.google.gms:google-services:3.0.0'
     }
 }
@@ -178,7 +178,7 @@ dependencies {
     compile name: 'touch-image-view'
     compile 'com.android.support:multidex:1.0.1'
 
-    compile 'com.github.nextcloud:android-library:1.0.20'
+    compile 'com.github.nextcloud:android-library:1.0.21'
     compile "com.android.support:support-v4:${supportLibraryVersion}"
     compile "com.android.support:design:${supportLibraryVersion}"
     compile 'com.jakewharton:disklrucache:2.0.2'
@@ -238,4 +238,4 @@ tasks.withType(Test) {
 }
 
 // uncomment for gplay, modified (must be at the bottom)
-//apply plugin: 'com.google.gms.google-services'
+//apply plugin: 'com.google.gms.google-services'

+ 31 - 13
src/main/java/com/owncloud/android/ui/activity/ActivitiesListActivity.java

@@ -19,7 +19,6 @@
  * You should have received a copy of the GNU Affero General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-
 package com.owncloud.android.ui.activity;
 
 import android.accounts.Account;
@@ -30,7 +29,6 @@ import android.content.Intent;
 import android.os.Bundle;
 import android.support.design.widget.BottomNavigationView;
 import android.support.v4.widget.SwipeRefreshLayout;
-import android.support.v7.widget.DividerItemDecoration;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.view.MenuItem;
@@ -43,6 +41,7 @@ import android.widget.TextView;
 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.lib.common.OwnCloudAccount;
 import com.owncloud.android.lib.common.OwnCloudClient;
 import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
@@ -50,7 +49,12 @@ import com.owncloud.android.lib.common.operations.RemoteOperation;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.resources.activities.GetRemoteActivitiesOperation;
+import com.owncloud.android.lib.resources.activities.models.RichObject;
+import com.owncloud.android.lib.resources.files.FileUtils;
 import com.owncloud.android.ui.adapter.ActivityListAdapter;
+import com.owncloud.android.ui.interfaces.ActivityListInterface;
+import com.owncloud.android.ui.preview.PreviewImageActivity;
+import com.owncloud.android.ui.preview.PreviewImageFragment;
 import com.owncloud.android.utils.AnalyticsUtils;
 import com.owncloud.android.utils.DisplayUtils;
 
@@ -66,7 +70,7 @@ import butterknife.Unbinder;
 /**
  * Activity displaying all server side stored activity items.
  */
-public class ActivitiesListActivity extends FileActivity {
+public class ActivitiesListActivity extends FileActivity implements ActivityListInterface {
 
     private static final String TAG = ActivitiesListActivity.class.getSimpleName();
     private static final String SCREEN_NAME = "Activities";
@@ -102,6 +106,7 @@ public class ActivitiesListActivity extends FileActivity {
     private ActivityListAdapter adapter;
     private Unbinder unbinder;
 
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         Log_OC.v(TAG, "onCreate() start");
@@ -133,9 +138,9 @@ public class ActivitiesListActivity extends FileActivity {
             public void onRefresh() {
                 setLoadingMessage();
                 fetchAndSetData();
-
             }
         });
+
         setupContent();
     }
 
@@ -156,18 +161,16 @@ public class ActivitiesListActivity extends FileActivity {
      * sets up the UI elements and loads all activity items.
      */
     private void setupContent() {
+
         emptyContentIcon.setImageResource(R.drawable.ic_activity_light_grey);
         setLoadingMessage();
 
-        adapter = new ActivityListAdapter(this);
+        adapter = new ActivityListAdapter(this, this);
         recyclerView.setAdapter(adapter);
 
         LinearLayoutManager layoutManager = new LinearLayoutManager(this);
-        DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
-                layoutManager.getOrientation());
 
         recyclerView.setLayoutManager(layoutManager);
-        recyclerView.addItemDecoration(dividerItemDecoration);
 
         BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_view);
 
@@ -192,8 +195,8 @@ public class ActivitiesListActivity extends FileActivity {
                     ocAccount = new OwnCloudAccount(
                             currentAccount,
                             context
-                            );
-                    OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton().
+                    );
+                    final OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton().
                             getClientFor(ocAccount, MainApp.getAppContext());
                     mClient.setOwnCloudVersion(AccountUtils.getServerVersion(currentAccount));
 
@@ -208,7 +211,7 @@ public class ActivitiesListActivity extends FileActivity {
                             @Override
                             public void run() {
                                 if (activities.size() > 0) {
-                                    populateList(activities);
+                                    populateList(activities, mClient);
                                     swipeEmptyListRefreshLayout.setVisibility(View.GONE);
                                     swipeListRefreshLayout.setVisibility(View.VISIBLE);
                                 } else {
@@ -258,9 +261,9 @@ public class ActivitiesListActivity extends FileActivity {
         });
     }
 
-    private void populateList(List<Object> activities) {
+    private void populateList(List<Object> activities, OwnCloudClient mClient) {
 
-        adapter.setActivityItems(activities);
+        adapter.setActivityItems(activities, mClient);
     }
 
     @Override
@@ -308,4 +311,19 @@ public class ActivitiesListActivity extends FileActivity {
 
         AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG);
     }
+
+
+    @Override
+    public void onActivityClicked(RichObject richObject) {
+        Intent showDetailsIntent;
+        OCFile ocFile = new OCFile(FileUtils.PATH_SEPARATOR + richObject.getPath());
+        if (PreviewImageFragment.canBePreviewed(ocFile)) {
+            showDetailsIntent = new Intent(this, PreviewImageActivity.class);
+        } else {
+            showDetailsIntent = new Intent(this, FileDisplayActivity.class);
+        }
+        showDetailsIntent.putExtra(EXTRA_FILE, ocFile);
+        showDetailsIntent.putExtra(EXTRA_ACCOUNT, getAccount());
+        startActivity(showDetailsIntent);
+    }
 }

+ 11 - 12
src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java

@@ -317,21 +317,20 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU
             navigationView.getMenu().setGroupVisible(R.id.drawer_menu_accounts, false);
         }
 
-        Account account = AccountUtils.
-                getCurrentOwnCloudAccount(MainApp.getAppContext());
+        Account account = AccountUtils.getCurrentOwnCloudAccount(MainApp.getAppContext());
         boolean searchSupported = AccountUtils.hasSearchSupport(account);
 
-        if ((getResources().getBoolean(R.bool.bottom_toolbar_enabled) || (!searchSupported)) &&
-                (account != null)){
+        if (getResources().getBoolean(R.bool.bottom_toolbar_enabled) && account != null) {
+            navigationView.getMenu().removeItem(R.id.nav_all_files);
+            navigationView.getMenu().removeItem(R.id.nav_settings);
+            navigationView.getMenu().removeItem(R.id.nav_favorites);
             navigationView.getMenu().removeItem(R.id.nav_photos);
-            if (getResources().getBoolean(R.bool.bottom_toolbar_enabled)) {
-                navigationView.getMenu().removeItem(R.id.nav_all_files);
-                navigationView.getMenu().removeItem(R.id.nav_settings);
-                navigationView.getMenu().removeItem(R.id.nav_favorites);
-            }
-            if (!searchSupported) {
-                navigationView.getMenu().removeItem(R.id.nav_videos);
-            }
+        }
+
+        if (!searchSupported && account != null) {
+            navigationView.getMenu().removeItem(R.id.nav_photos);
+            navigationView.getMenu().removeItem(R.id.nav_favorites);
+            navigationView.getMenu().removeItem(R.id.nav_videos);
         }
 
         if (getResources().getBoolean(R.bool.use_home) && navigationView.getMenu().findItem(R.id.nav_all_files) !=

+ 241 - 29
src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java

@@ -20,14 +20,21 @@
 package com.owncloud.android.ui.adapter;
 
 import android.content.Context;
+import android.content.res.Resources;
 import android.graphics.drawable.PictureDrawable;
 import android.net.Uri;
 import android.support.v7.widget.RecyclerView;
+import android.text.SpannableStringBuilder;
 import android.text.TextUtils;
+import android.text.method.LinkMovementMethod;
+import android.text.style.ClickableSpan;
+import android.text.style.StyleSpan;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.GridLayout;
 import android.widget.ImageView;
+import android.widget.LinearLayout;
 import android.widget.TextView;
 
 import com.bumptech.glide.GenericRequestBuilder;
@@ -36,70 +43,203 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy;
 import com.bumptech.glide.load.model.StreamEncoder;
 import com.bumptech.glide.load.resource.file.FileToStreamDecoder;
 import com.caverock.androidsvg.SVG;
+import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
+import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.lib.common.OwnCloudClient;
 import com.owncloud.android.lib.resources.activities.models.Activity;
+import com.owncloud.android.lib.resources.activities.models.RichElement;
+import com.owncloud.android.lib.resources.activities.models.RichObject;
+import com.owncloud.android.ui.interfaces.ActivityListInterface;
 import com.owncloud.android.utils.DisplayUtils;
+import com.owncloud.android.utils.MimeTypeUtil;
+import com.owncloud.android.utils.glide.CustomGlideStreamLoader;
 import com.owncloud.android.utils.svg.SvgDecoder;
 import com.owncloud.android.utils.svg.SvgDrawableTranscoder;
 import com.owncloud.android.utils.svg.SvgSoftwareLayerSetter;
 
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
  * Adapter for the activity view
  */
 
-public class ActivityListAdapter extends RecyclerView.Adapter<ActivityListAdapter.ActivityViewHolder> {
+public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+
+    public static final int HEADER_TYPE = 100;
+    public static final int ACTIVITY_TYPE = 101;
+    private final ActivityListInterface activityListInterface;
+    private final int px;
+    private OwnCloudClient mClient;
 
     private Context context;
     private List<Object> mValues;
 
-    public ActivityListAdapter(Context context) {
+    public ActivityListAdapter(Context context, ActivityListInterface activityListInterface) {
         this.mValues = new ArrayList<>();
         this.context = context;
+        this.activityListInterface = activityListInterface;
+        px = getThumbnailDimension();
     }
 
-    public void setActivityItems(List<Object> activityItems) {
+    public void setActivityItems(List<Object> activityItems, OwnCloudClient client) {
+        this.mClient = client;
         mValues.clear();
-        mValues.addAll(activityItems);
+        String sTime = "";
+        for (Object o : activityItems) {
+            Activity activity = (Activity) o;
+            String time = null;
+            if (activity.getDatetime() != null) {
+                time = DisplayUtils.getRelativeTimestamp(context,
+                        activity.getDatetime().getTime()).toString();
+            } else if (activity.getDate() != null) {
+                time = DisplayUtils.getRelativeTimestamp(context,
+                        activity.getDate().getTime()).toString();
+            } else {
+                time = "Unknown";
+            }
+
+            if (sTime.equalsIgnoreCase(time)) {
+                mValues.add(activity);
+            } else {
+
+                sTime = time;
+                mValues.add(sTime);
+                mValues.add(activity);
+            }
+        }
         notifyDataSetChanged();
-    }
 
-    @Override
-    public ActivityViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
-        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_list_item, parent, false);
-        return new ActivityViewHolder(v);
     }
 
     @Override
-    public void onBindViewHolder(ActivityViewHolder holder, int position) {
-        Activity activity = (Activity) mValues.get(position);
-        if (activity.getDatetime() != null) {
-            holder.dateTime.setText(DisplayUtils.getRelativeTimestamp(context,
-                    activity.getDatetime().getTime()));
+    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        if (viewType == ACTIVITY_TYPE) {
+            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_list_item, parent, false);
+            return new ActivityViewHolder(v);
         } else {
-            holder.dateTime.setText(DisplayUtils.getRelativeTimestamp(context,
-                    activity.getDate().getTime()));
+            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_list_item_header, parent, false);
+            return new ActivityViewHeaderHolder(v);
         }
 
-        if (!TextUtils.isEmpty(activity.getSubject())) {
-            holder.subject.setText(activity.getSubject());
-            holder.subject.setVisibility(View.VISIBLE);
-        } else {
-            holder.subject.setVisibility(View.GONE);
-        }
+    }
+
+    @Override
+    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+
+        if (holder instanceof ActivityViewHolder) {
+            final ActivityViewHolder activityViewHolder = (ActivityViewHolder) holder;
+            Activity activity = (Activity) mValues.get(position);
+            if (activity.getDatetime() != null) {
+                activityViewHolder.dateTime.setText(DisplayUtils.getRelativeTimestamp(context,
+                        activity.getDatetime().getTime()));
+            } else {
+                activityViewHolder.dateTime.setText(DisplayUtils.getRelativeTimestamp(context,
+                        new Date().getTime()));
+            }
+
+            if (activity.getRichSubjectElement() != null &&
+                    !TextUtils.isEmpty(activity.getRichSubjectElement().getRichSubject())) {
+                activityViewHolder.subject.setVisibility(View.VISIBLE);
+                activityViewHolder.subject.setMovementMethod(LinkMovementMethod.getInstance());
+                activityViewHolder.subject.setText(addClickablePart(activity.getRichSubjectElement()),
+                        TextView.BufferType.SPANNABLE);
+                activityViewHolder.subject.setVisibility(View.VISIBLE);
+            } else if (!TextUtils.isEmpty(activity.getSubject())) {
+                activityViewHolder.subject.setVisibility(View.VISIBLE);
+                activityViewHolder.subject.setText(activity.getSubject());
+            } else {
+                activityViewHolder.subject.setVisibility(View.GONE);
+            }
 
-        if (!TextUtils.isEmpty(activity.getMessage())) {
-            holder.message.setText(activity.getMessage());
-            holder.message.setVisibility(View.VISIBLE);
+            if (!TextUtils.isEmpty(activity.getMessage())) {
+                activityViewHolder.message.setText(activity.getMessage());
+                activityViewHolder.message.setVisibility(View.VISIBLE);
+            } else {
+                activityViewHolder.message.setVisibility(View.GONE);
+            }
+
+            if (!TextUtils.isEmpty(activity.getIcon())) {
+                downloadIcon(activity.getIcon(), activityViewHolder.activityIcon);
+            }
+
+            if (activity.getRichSubjectElement() != null &&
+                    activity.getRichSubjectElement().getRichObjectList().size() > 0) {
+
+                activityViewHolder.list.setVisibility(View.VISIBLE);
+                activityViewHolder.list.removeAllViews();
+
+                activityViewHolder.list.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        int w = activityViewHolder.list.getMeasuredWidth();
+
+                        int elPxSize = px + 20;
+                        int totalColumnCount = (int) Math.floor(w / elPxSize);
+                        activityViewHolder.list.setColumnCount(totalColumnCount);
+                    }
+                });
+
+
+                for (RichObject richObject : activity.getRichSubjectElement().getRichObjectList()) {
+                    ImageView imageView = createThumbnail(richObject);
+                    activityViewHolder.list.addView(imageView);
+                }
+
+            } else {
+                activityViewHolder.list.removeAllViews();
+                activityViewHolder.list.setVisibility(View.GONE);
+            }
         } else {
-            holder.message.setVisibility(View.GONE);
+            ActivityViewHeaderHolder activityViewHeaderHolder = (ActivityViewHeaderHolder) holder;
+            activityViewHeaderHolder.title.setText((String) mValues.get(position));
         }
+    }
+
+    private ImageView createThumbnail(final RichObject richObject) {
+        OCFile file = new OCFile("/" + richObject.getPath());
+        file.setRemoteId(richObject.getId());
+
+        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(px, px);
+        params.setMargins(10, 10, 10, 10);
+        ImageView imageView = new ImageView(context);
+        imageView.setLayoutParams(params);
+        imageView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                activityListInterface.onActivityClicked(richObject);
+            }
+        });
+        setBitmap(file, imageView);
+
+        return imageView;
+    }
 
-        if (!TextUtils.isEmpty(activity.getIcon())) {
-            downloadIcon(activity.getIcon(), holder.activityIcon);
+    private void setBitmap(OCFile file, ImageView fileIcon) {
+        // No Folder
+        if (!file.isFolder()) {
+            if ((MimeTypeUtil.isImage(file) || MimeTypeUtil.isVideo(file))) {
+                String uri = mClient.getBaseUri() + "" +
+                        "/index.php/apps/files/api/v1/thumbnail/" +
+                        px + "/" + px + Uri.encode(file.getRemotePath(), "/");
+
+                Glide.with(context).using(new CustomGlideStreamLoader()).load(uri).into(fileIcon); //Using custom fetcher
+
+            } else {
+                fileIcon.setImageResource(MimeTypeUtil.getFileTypeIconId(file.getMimetype(),
+                        file.getFileName()));
+            }
+        } else {
+            // Folder
+            fileIcon.setImageDrawable(
+                    MimeTypeUtil.getFolderTypeIcon(
+                            file.isSharedWithMe() || file.isSharedWithSharee(),
+                            file.isSharedViaLink()
+                    )
+            );
         }
     }
 
@@ -125,17 +265,76 @@ public class ActivityListAdapter extends RecyclerView.Adapter<ActivityListAdapte
                 .into(itemViewType);
     }
 
+    private SpannableStringBuilder addClickablePart(RichElement richElement) {
+        String text = richElement.getRichSubject();
+        SpannableStringBuilder ssb = new SpannableStringBuilder(text);
+
+        int idx1 = text.indexOf("{");
+        int idx2;
+        while (idx1 != -1) {
+            idx2 = text.indexOf("}", idx1) + 1;
+            final String clickString = text.substring(idx1 + 1, idx2 - 1);
+            final RichObject richObject = searchObjectByName(richElement.getRichObjectList(), clickString);
+            if (richObject != null) {
+                String name = richObject.getName();
+                ssb.replace(idx1, idx2, name);
+                text = ssb.toString();
+                idx2 = idx1 + name.length();
+                ssb.setSpan(new ClickableSpan() {
+                    @Override
+                    public void onClick(View widget) {
+                        activityListInterface.onActivityClicked(richObject);
+                    }
+                }, idx1, idx2, 0);
+                ssb.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), idx1, idx2, 0);
+            }
+            idx1 = text.indexOf("{", idx2);
+        }
+
+        return ssb;
+    }
+
+    public RichObject searchObjectByName(ArrayList<RichObject> richObjectList, String name) {
+        for (RichObject richObject : richObjectList) {
+            if (richObject.getTag().equalsIgnoreCase(name))
+                return richObject;
+        }
+        return null;
+    }
+
+
+    @Override
+    public int getItemViewType(int position) {
+        if (mValues.get(position) instanceof Activity)
+            return ACTIVITY_TYPE;
+        else
+            return HEADER_TYPE;
+    }
+
     @Override
     public int getItemCount() {
         return mValues.size();
     }
 
-    class ActivityViewHolder extends RecyclerView.ViewHolder {
+    /**
+     * Converts size of file icon from dp to pixel
+     *
+     * @return int
+     */
+    private int getThumbnailDimension() {
+        // Converts dp to pixel
+        Resources r = MainApp.getAppContext().getResources();
+        Double d = Math.pow(2, Math.floor(Math.log(r.getDimension(R.dimen.file_icon_size_grid)) / Math.log(2))) / 2;
+        return d.intValue();
+    }
+
+    private class ActivityViewHolder extends RecyclerView.ViewHolder {
 
         private final ImageView activityIcon;
         private final TextView subject;
         private final TextView message;
         private final TextView dateTime;
+        private final GridLayout list;
 
         private ActivityViewHolder(View itemView) {
             super(itemView);
@@ -143,6 +342,19 @@ public class ActivityListAdapter extends RecyclerView.Adapter<ActivityListAdapte
             subject = (TextView) itemView.findViewById(R.id.activity_subject);
             message = (TextView) itemView.findViewById(R.id.activity_message);
             dateTime = (TextView) itemView.findViewById(R.id.activity_datetime);
+            list = (GridLayout) itemView.findViewById(R.id.list);
+        }
+    }
+
+    private class ActivityViewHeaderHolder extends RecyclerView.ViewHolder {
+
+        private final TextView title;
+
+        private ActivityViewHeaderHolder(View itemView) {
+            super(itemView);
+            title = (TextView) itemView.findViewById(R.id.title_header);
+
         }
     }
+
 }

+ 13 - 0
src/main/java/com/owncloud/android/ui/interfaces/ActivityListInterface.java

@@ -0,0 +1,13 @@
+package com.owncloud.android.ui.interfaces;
+
+import com.owncloud.android.lib.resources.activities.models.RichObject;
+
+/**
+ * Created by alejandro on 12/05/17.
+ */
+
+public interface ActivityListInterface {
+
+    void onActivityClicked(RichObject richObject);
+
+}

+ 9 - 0
src/main/java/com/owncloud/android/utils/DisplayUtils.java

@@ -67,6 +67,7 @@ import com.bumptech.glide.request.target.SimpleTarget;
 import com.caverock.androidsvg.SVG;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
+import com.owncloud.android.authentication.AccountUtils;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.ThumbnailsCacheManager;
@@ -592,6 +593,14 @@ public class DisplayUtils {
 
         Menu menu = view.getMenu();
 
+        Account account = AccountUtils.getCurrentOwnCloudAccount(MainApp.getAppContext());
+        boolean searchSupported = AccountUtils.hasSearchSupport(account);
+
+        if (!searchSupported) {
+            menu.removeItem(R.id.nav_bar_favorites);
+            menu.removeItem(R.id.nav_bar_photos);
+        }
+
         if (resources.getBoolean(R.bool.use_home)) {
             menu.findItem(R.id.nav_bar_files).setTitle(resources.
                     getString(R.string.drawer_item_home));

+ 36 - 0
src/main/java/com/owncloud/android/utils/glide/CustomGlideStreamLoader.java

@@ -0,0 +1,36 @@
+/**
+ * Nextcloud Android client application
+ *
+ * @author Alejandro Bautista
+ * Copyright (C) 2017 Alejandro Bautista
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.owncloud.android.utils.glide;
+
+import com.bumptech.glide.load.data.DataFetcher;
+import com.bumptech.glide.load.model.stream.StreamModelLoader;
+
+import java.io.InputStream;
+
+/**
+ * Custom Model for OwnCloudClient
+ */
+
+public class CustomGlideStreamLoader implements StreamModelLoader<String> {
+    @Override
+    public DataFetcher<InputStream> getResourceFetcher(String url, int width, int height) {
+        return new HttpStreamFetcher(url);
+    }
+}

+ 101 - 0
src/main/java/com/owncloud/android/utils/glide/HttpStreamFetcher.java

@@ -0,0 +1,101 @@
+/**
+ * Nextcloud Android client application
+ *
+ * @author Alejandro Bautista
+ * Copyright (C) 2017 Alejandro Bautista
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.owncloud.android.utils.glide;
+
+import android.accounts.Account;
+
+import com.bumptech.glide.Priority;
+import com.bumptech.glide.load.data.DataFetcher;
+import com.owncloud.android.MainApp;
+import com.owncloud.android.authentication.AccountUtils;
+import com.owncloud.android.lib.common.OwnCloudAccount;
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
+import com.owncloud.android.lib.common.utils.Log_OC;
+import com.owncloud.android.lib.resources.status.OwnCloudVersion;
+
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.methods.GetMethod;
+
+import java.io.InputStream;
+
+/**
+ * Fetcher with OwnCloudClient
+ */
+
+public class HttpStreamFetcher implements DataFetcher<InputStream> {
+
+    private static final String TAG = HttpStreamFetcher.class.getName();
+    private final String mURL;
+
+    public HttpStreamFetcher(String url) {
+        this.mURL = url;
+
+    }
+
+    @Override
+    public InputStream loadData(Priority priority) throws Exception {
+
+        Account mAccount = AccountUtils.getCurrentOwnCloudAccount(MainApp.getAppContext());
+        OwnCloudAccount ocAccount = new OwnCloudAccount(mAccount,
+                MainApp.getAppContext());
+        OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton().
+                getClientFor(ocAccount, MainApp.getAppContext());
+
+        OwnCloudVersion serverOCVersion = AccountUtils.getServerVersion(mAccount);
+        if (mClient != null && serverOCVersion != null) {
+            if (serverOCVersion.supportsRemoteThumbnails()) {
+                GetMethod get = null;
+                try {
+                    get = new GetMethod(mURL);
+                    get.setRequestHeader("Cookie",
+                            "nc_sameSiteCookielax=true;nc_sameSiteCookiestrict=true");
+                    int status = mClient.executeMethod(get);
+                    if (status == HttpStatus.SC_OK) {
+                        InputStream inputStream = get.getResponseBodyAsStream();
+                        return inputStream;
+                    } else {
+                        mClient.exhaustResponse(get.getResponseBodyAsStream());
+                    }
+                } catch (Exception e) {
+                    Log_OC.d(TAG, e.getMessage(), e);
+                }
+            } else {
+                Log_OC.d(TAG, "Server too old");
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public void cleanup() {
+        Log_OC.i(TAG,"Cleanup");
+    }
+
+    @Override
+    public String getId() {
+        return mURL;
+    }
+
+    @Override
+    public void cancel() {
+        Log_OC.i(TAG,"Cancel");
+    }
+}

+ 9 - 3
src/main/res/layout/activity_list_item.xml

@@ -30,8 +30,8 @@
 
     <ImageView
         android:id="@+id/activity_icon"
-        android:layout_width="@dimen/user_icon_size"
-        android:layout_height="@dimen/user_icon_size"
+        android:layout_width="@dimen/file_icon_size"
+        android:layout_height="@dimen/file_icon_size"
         android:layout_alignParentTop="true"
         android:layout_marginRight="24dp"
         android:src="@drawable/ic_activity"/>
@@ -48,7 +48,6 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:ellipsize="end"
-            android:maxLines="2"
             android:text="@string/placeholder_filename"
             android:textAppearance="?android:attr/textAppearanceListItem"/>
 
@@ -61,6 +60,13 @@
             android:text="@string/placeholder_sentence"
             android:textColor="?android:attr/textColorSecondary"/>
 
+        <GridLayout
+            android:id="@+id/list"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="5dp"
+            android:columnCount="3" />
+
         <TextView
             android:id="@+id/activity_datetime"
             android:layout_width="wrap_content"

+ 17 - 0
src/main/res/layout/activity_list_item_header.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical" android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <TextView
+        android:id="@+id/title_header"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:textSize="20sp"
+        android:layout_marginLeft="10dp"
+        android:layout_marginTop="10dp"
+        android:text="Header"
+
+        />
+
+</LinearLayout>

+ 0 - 3
src/main/res/values-ast/strings.xml

@@ -260,7 +260,6 @@
     <string name="activity_chooser_title">Unviar enllaz a&#8230;</string>
     <string name="wait_for_tmp_copy_from_private_storage">Copiando ficheru dende l\'almacenamientu priváu</string>
     
-    <string name="oauth_check_onoff">Aniciar sesión con oAuth2</string> 
     <string name="oauth_login_connection">Coneutando col sirvidor d\'OAuth2</string>    
         
     <string name="ssl_validator_header">La identidá del sitiu nun pue certificase</string>
@@ -372,8 +371,6 @@
     <string name="file_migration_use_data_folder">Usar</string>
 
     <string name="file_migration_source_not_readable_title">¡El direutoriu fonte nun ye lleible!</string>
-    <string name="file_migration_source_not_readable">¿Entá quies camudar el camín d\'almacenamientu a %1$s?\n\nNota: tendrán de baxase de nueves tolos datos.</string>
-
     <string name="prefs_category_accounts">Cuentes</string>
     <string name="prefs_add_account">Amestar cuenta</string>
     <string name="drawer_manage_accounts">Xestionar cuentes</string>

+ 0 - 3
src/main/res/values-cs-rCZ/strings.xml

@@ -303,7 +303,6 @@
     <string name="activity_chooser_title">Odeslat odkaz &#8230;</string>
     <string name="wait_for_tmp_copy_from_private_storage">Kopírování souboru z privátního úložiště</string>
     
-    <string name="oauth_check_onoff">Přihlásit se s oAuth2</string> 
     <string name="oauth_login_connection">Připojuji se k oAuth2 serveru...</string>    
         
     <string name="ssl_validator_header">Identitu stránky nelze ověřit</string>
@@ -422,8 +421,6 @@
     <string name="file_migration_use_data_folder">Použít</string>
 
     <string name="file_migration_source_not_readable_title">Ze zdrojového adresáře nelze číst!</string>
-    <string name="file_migration_source_not_readable">Opravdu chcete změnit adresář úložiště na %1$s?\n\nPoznámka: Všechna data budou stažena znovu.</string>
-
     <string name="prefs_category_accounts">Účty</string>
     <string name="prefs_add_account">Přidat účet</string>
     <string name="drawer_manage_accounts">Spravovat účty</string>

+ 2 - 3
src/main/res/values-de-rDE/strings.xml

@@ -304,7 +304,6 @@
     <string name="activity_chooser_title">Link senden an &#8230;</string>
     <string name="wait_for_tmp_copy_from_private_storage">Kopiere Datei vom privatem Speicher</string>
     
-    <string name="oauth_check_onoff">Anmelden mit oAuth2</string> 
     <string name="oauth_login_connection">Verbinde mit dem OAuth2-Server …</string>    
         
     <string name="ssl_validator_header">Die Identität der Website konnte nicht überprüft werden</string>
@@ -423,8 +422,6 @@
     <string name="file_migration_use_data_folder">Verwende bestehenden</string>
 
     <string name="file_migration_source_not_readable_title">Quellverzeichnis kann nicht gelesen werden!</string>
-    <string name="file_migration_source_not_readable">Möchten Sie wirklich den Speicherpfad in %1$s ändern?\n\nHinweis: Alle Daten müssen dann erneut heruntergeladen werden.</string>
-
     <string name="prefs_category_accounts">Konten</string>
     <string name="prefs_add_account">Konto hinzufügen</string>
     <string name="drawer_manage_accounts">Konten verwalten</string>
@@ -659,4 +656,6 @@
     <string name="drawer_logout">Abmelden</string>
     <string name="picture_set_as_no_app">Keine App gefunden, mit der ein Bid gesetzt werden könnte!</string>
     <string name="privacy">Datenschutz</string>
+    <string name="file_not_found">Datei nicht gefunden!</string>
+
     </resources>

+ 2 - 3
src/main/res/values-de/strings.xml

@@ -304,7 +304,6 @@
     <string name="activity_chooser_title">Link senden an &#8230;</string>
     <string name="wait_for_tmp_copy_from_private_storage">Kopiere Datei vom privatem Speicher</string>
     
-    <string name="oauth_check_onoff">Anmelden mit oAuth2</string> 
     <string name="oauth_login_connection">Verbinde mit dem oAuth2-Server...</string>    
         
     <string name="ssl_validator_header">Die Identität der Website konnte nicht überprüft werden</string>
@@ -423,8 +422,6 @@
     <string name="file_migration_use_data_folder">Verwende bestehenden</string>
 
     <string name="file_migration_source_not_readable_title">Quellverzeichnis kann nicht gelesen werden!</string>
-    <string name="file_migration_source_not_readable">Möchtest Du wirklich den Speicherpfad in %1$s ändern?\n\nHinweis: Alle Daten müssen dann erneut heruntergeladen werden.</string>
-
     <string name="prefs_category_accounts">Konten</string>
     <string name="prefs_add_account">Konto hinzufügen</string>
     <string name="drawer_manage_accounts">Konten verwalten</string>
@@ -660,4 +657,6 @@
     <string name="drawer_logout">Abmelden</string>
     <string name="picture_set_as_no_app">Keine App gefunden, mit der ein Bid gesetzt werden könnte!</string>
     <string name="privacy">Datenschutz</string>
+    <string name="file_not_found">Datei nicht gefunden!</string>
+
     </resources>

+ 0 - 3
src/main/res/values-el/strings.xml

@@ -303,7 +303,6 @@
     <string name="activity_chooser_title">Αποστολή συνδέσμου σε &#8230;</string>
     <string name="wait_for_tmp_copy_from_private_storage">Γίνεται αντιγραφή αρχείου από ιδιωτικό αποθηκευτικό χώρο</string>
     
-    <string name="oauth_check_onoff">Σύνδεση με oAuth2</string> 
     <string name="oauth_login_connection">Γίνεται σύνδεση στο διακομιστή oAuth2...</string>    
         
     <string name="ssl_validator_header">Η ταυτότητα της σελίδας δεν μπορεί να επληθευτεί</string>
@@ -421,8 +420,6 @@
     <string name="file_migration_use_data_folder">Χρήση</string>
 
     <string name="file_migration_source_not_readable_title">Ο πηγαίος φάκελος δεν ειναι αναγνώσιμος!</string>
-    <string name="file_migration_source_not_readable">Θέλετε ακόμη να αλλάξετε το μονοπάτι αποθήκευσης σε %1$s;\n\nΣημείωση: όλα τα δεδομένα θα πρέπει να κατεβαστούν ξανά. </string>
-
     <string name="prefs_category_accounts">Λογαριασμοί</string>
     <string name="prefs_add_account">Προσθήκη λογαριασμού</string>
     <string name="drawer_manage_accounts">Διαχείριση λογαριασμών</string>

+ 2 - 3
src/main/res/values-en-rGB/strings.xml

@@ -303,7 +303,6 @@
     <string name="activity_chooser_title">Send link to &#8230;</string>
     <string name="wait_for_tmp_copy_from_private_storage">Copying file from private storage</string>
     
-    <string name="oauth_check_onoff">Log in with oAuth2</string> 
     <string name="oauth_login_connection">Connecting to OAuth 2 server…</string>    
         
     <string name="ssl_validator_header">The identity of the site could not be verified</string>
@@ -422,8 +421,6 @@
     <string name="file_migration_use_data_folder">Use</string>
 
     <string name="file_migration_source_not_readable_title">Source directory not readable!</string>
-    <string name="file_migration_source_not_readable">Do you still want to change the storage path to %1$s?\n\nNote: all data will have to be downloaded again.</string>
-
     <string name="prefs_category_accounts">Accounts</string>
     <string name="prefs_add_account">Add account</string>
     <string name="drawer_manage_accounts">Manage accounts</string>
@@ -658,4 +655,6 @@
     <string name="drawer_logout">Logout</string>
     <string name="picture_set_as_no_app">No app found to set a picture with!</string>
     <string name="privacy">Privacy</string>
+    <string name="file_not_found">File not found!</string>
+
     </resources>

+ 2 - 3
src/main/res/values-es-rMX/strings.xml

@@ -304,7 +304,6 @@ en los últimos 7 días. </string>
     <string name="activity_chooser_title">Enviar la liga a &#8230;</string>
     <string name="wait_for_tmp_copy_from_private_storage">Copiando el archivo desde almacenamiento privado</string>
     
-    <string name="oauth_check_onoff">Iniciar sesión con oAuth2</string> 
     <string name="oauth_login_connection">Conectando al servidor OAuth 2...</string>    
         
     <string name="ssl_validator_header">La identidad del sitio no pudo ser verificada</string>
@@ -423,8 +422,6 @@ en los últimos 7 días. </string>
     <string name="file_migration_use_data_folder">Usar</string>
 
     <string name="file_migration_source_not_readable_title">¡El directorio fuente no se puede leer!</string>
-    <string name="file_migration_source_not_readable">¿Aún desea cambiar la ruta de almacenamiento a %1$s?\n\nNota: todos los datos tendrán que ser descargados de nuevo. </string>
-
     <string name="prefs_category_accounts">Cuentas</string>
     <string name="prefs_add_account">Agregar cuenta</string>
     <string name="drawer_manage_accounts">Administrar cuentas</string>
@@ -659,4 +656,6 @@ en los últimos 7 días. </string>
     <string name="drawer_logout">Salir de la sesión</string>
     <string name="picture_set_as_no_app">¡No se encontró una aplicación con la cual establecer una imagen!</string>
     <string name="privacy">Privacidad</string>
+    <string name="file_not_found">¡Archivo no encontrado!</string>
+
     </resources>

+ 0 - 3
src/main/res/values-es/strings.xml

@@ -304,7 +304,6 @@
     <string name="activity_chooser_title">Enviar enlace a &#8230;</string>
     <string name="wait_for_tmp_copy_from_private_storage">Copiando el archivo desde el almacenamiento privado.</string>
     
-    <string name="oauth_check_onoff">Ingresar con oAuth2</string> 
     <string name="oauth_login_connection">Conectando al servidor oAuth2...</string>    
         
     <string name="ssl_validator_header">La identidad del sitio no puede ser verificada</string>
@@ -423,8 +422,6 @@
     <string name="file_migration_use_data_folder">Usar</string>
 
     <string name="file_migration_source_not_readable_title">¡No se puede leer el directorio de origen!</string>
-    <string name="file_migration_source_not_readable">¿Aún quieres cambiar la ruta de almacenamiento a |%1$s?\n\nNota: habrá que descargar de nuevo todos los datos.</string>
-
     <string name="prefs_category_accounts">Cuentas</string>
     <string name="prefs_add_account">Agregar cuenta</string>
     <string name="drawer_manage_accounts">Administrar cuentas</string>

+ 2 - 3
src/main/res/values-fr/strings.xml

@@ -303,7 +303,6 @@
     <string name="activity_chooser_title">Envoyer le lien vers &#8230;</string>
     <string name="wait_for_tmp_copy_from_private_storage">Copie du fichier depuis le stockage privé</string>
     
-    <string name="oauth_check_onoff">Connexion avec oAuth2</string> 
     <string name="oauth_login_connection">Connexion au serveur oAuth2…</string>    
         
     <string name="ssl_validator_header">L\'identité du site ne peut être vérifiée</string>
@@ -422,8 +421,6 @@
     <string name="file_migration_use_data_folder">Conserver le dossier actuel</string>
 
     <string name="file_migration_source_not_readable_title">Le dossier n\'est pas lisible !</string>
-    <string name="file_migration_source_not_readable">Souhaitez-vous modifier le chemin de stockage pour %1$s ?\n\nNote : toutes les données devront être à nouveau téléchargées.</string>
-
     <string name="prefs_category_accounts">Comptes</string>
     <string name="prefs_add_account">Ajouter un compte</string>
     <string name="drawer_manage_accounts">Gérer les comptes</string>
@@ -658,4 +655,6 @@
     <string name="drawer_logout">Se déconnecter</string>
     <string name="picture_set_as_no_app">Aucune application trouvée pour utiliser cette image !</string>
     <string name="privacy">Vie privée</string>
+    <string name="file_not_found">Fichier non trouvé !</string>
+
     </resources>

+ 0 - 3
src/main/res/values-is/strings.xml

@@ -305,7 +305,6 @@ Smelltu hér til að fá þér einn frá þjónustuaðila.</string>
     <string name="activity_chooser_title">Senda tengil til &#8230;</string>
     <string name="wait_for_tmp_copy_from_private_storage">Afrita skrá úr einkageymslu</string>
     
-    <string name="oauth_check_onoff">Skrá inn með oAuth2</string> 
     <string name="oauth_login_connection">Tengist við OAuth-auðkenningarþjón …</string>    
         
     <string name="ssl_validator_header">Ekki var hægt að sannreyna auðkenni vefsvæðisins</string>
@@ -424,8 +423,6 @@ Smelltu hér til að fá þér einn frá þjónustuaðila.</string>
     <string name="file_migration_use_data_folder">Nota</string>
 
     <string name="file_migration_source_not_readable_title">Upprunamappa er ekki lesanleg!</string>
-    <string name="file_migration_source_not_readable">Viltu enn breyta slóð gagnageymslu í %1$s?\n\nAthugaðu: öll gögn þarf að sækja aftur.</string>
-
     <string name="prefs_category_accounts">Notandaaðgangar</string>
     <string name="prefs_add_account">Bæta við notandaaðgangi</string>
     <string name="drawer_manage_accounts">Sýsla með notandaaðganga</string>

+ 2 - 1
src/main/res/values-it/strings.xml

@@ -39,6 +39,8 @@
     <string name="prefs_passcode">Blocco con codice di sicurezza</string>
     <string name="prefs_fingerprint">Blocco con impronta digitale</string>
     <string name="prefs_show_hidden_files">Mostra i file nascosti</string>
+    <string name="prefs_instant_upload">Caricamenti istantanei delle immagini</string>
+    <string name="prefs_instant_video_upload">Caricamenti istantanei dei video</string>
     <string name="prefs_log_title">Abilita la registrazione</string>
     <string name="prefs_log_summary">Usato per registrare i problemi nei log</string>
     <string name="prefs_log_title_history">Cronologia di registrazione</string>
@@ -224,7 +226,6 @@
     <string name="activity_chooser_title">Invia collegamento a &#8230;</string>
     <string name="wait_for_tmp_copy_from_private_storage">Copia file dall\'archiviazione privata</string>
     
-    <string name="oauth_check_onoff">Accesso con oAuth2</string> 
     <string name="ssl_validator_header">L\'identità del sito non può essere verificata</string>
     <string name="ssl_validator_reason_cert_not_trusted">- Il certificato del server non è affidabile</string>
     <string name="ssl_validator_reason_cert_expired">- Il certificato del server è scaduto</string>

+ 0 - 1
src/main/res/values-ja-rJP/strings.xml

@@ -250,7 +250,6 @@
     <string name="activity_chooser_title">リンクを送信&#8230;</string>
     <string name="wait_for_tmp_copy_from_private_storage">プライベートストレージからファイルをコピー中</string>
     
-    <string name="oauth_check_onoff">oAuth2でログイン</string> 
     <string name="ssl_validator_header">サイトの識別子を確認できませんでした</string>
     <string name="ssl_validator_reason_cert_not_trusted">- サーバー証明書は信頼されていません</string>
     <string name="ssl_validator_reason_cert_expired">- サーバー証明書は有効期限切れです</string>

+ 0 - 3
src/main/res/values-nb-rNO/strings.xml

@@ -304,7 +304,6 @@
     <string name="activity_chooser_title">Send lenke til &#8230;</string>
     <string name="wait_for_tmp_copy_from_private_storage">Kopierer fil fra privat lager</string>
     
-    <string name="oauth_check_onoff">Logg inn med oAuth2</string> 
     <string name="oauth_login_connection">Kobler til OAuth2-tjener...</string>    
         
     <string name="ssl_validator_header">Identiteten til siden kunne ikke bekreftes</string>
@@ -423,8 +422,6 @@
     <string name="file_migration_use_data_folder">Bruk</string>
 
     <string name="file_migration_source_not_readable_title">Målmappa er ikke lesbar!</string>
-    <string name="file_migration_source_not_readable">Ønsker du å endre lagringsstien til %1$s\n\nMerk: All data vil måtte lastes ned igjen.</string>
-
     <string name="prefs_category_accounts">Kontoer</string>
     <string name="prefs_add_account">Legg til en konto</string>
     <string name="drawer_manage_accounts">Håndter kontoer</string>

+ 2 - 3
src/main/res/values-nl/strings.xml

@@ -305,7 +305,6 @@ Kies er eentje van een provider.</string>
     <string name="activity_chooser_title">Verstuur link naar &#8230;</string>
     <string name="wait_for_tmp_copy_from_private_storage">Bestand vanaf privéopslag kopiëren</string>
     
-    <string name="oauth_check_onoff">Inloggen met oAuth2</string> 
     <string name="oauth_login_connection">Verbinden met OAuth 2 server…</string>    
         
     <string name="ssl_validator_header">De identiteit van de site kan niet worden gecontroleerd</string>
@@ -424,8 +423,6 @@ Kies er eentje van een provider.</string>
     <string name="file_migration_use_data_folder">Gebruiken</string>
 
     <string name="file_migration_source_not_readable_title">Bronmap niet leesbaar!</string>
-    <string name="file_migration_source_not_readable">Wil je echt het opslagpad wijzigen naar  %1$s?\n\nLet op: alle gegevens moeten opnieuw worden gedownloaded.</string>
-
     <string name="prefs_category_accounts">Accounts</string>
     <string name="prefs_add_account">Account toevoegen</string>
     <string name="drawer_manage_accounts">Accounts beheren </string>
@@ -662,4 +659,6 @@ Kies er eentje van een provider.</string>
     <string name="drawer_logout">Uitloggen</string>
     <string name="picture_set_as_no_app">Geen app gevonden om afbeelding in te stellen</string>
     <string name="privacy">Privacy</string>
+    <string name="file_not_found">Bestand niet gevonden!</string>
+
     </resources>

+ 0 - 3
src/main/res/values-pl/strings.xml

@@ -303,7 +303,6 @@
     <string name="activity_chooser_title">Wyślij link do &#8230;</string>
     <string name="wait_for_tmp_copy_from_private_storage">Kopiowanie pliku z prywatnego zasobu</string>
     
-    <string name="oauth_check_onoff">Loguj przez oAuth2</string> 
     <string name="oauth_login_connection">Łączenie z serwerem OAuth 2...</string>    
         
     <string name="ssl_validator_header">Nie można zweryfikować tożsamości strony</string>
@@ -422,8 +421,6 @@
     <string name="file_migration_use_data_folder">Użyj</string>
 
     <string name="file_migration_source_not_readable_title">Nie można odczytać katalogu źródłowego!</string>
-    <string name="file_migration_source_not_readable">Czy nadal chcesz zmienić ścieżkę przechowywania na %1$s?\n\nUwaga: Wszystkie dane będą musiały zostać pobrane ponownie.</string>
-
     <string name="prefs_category_accounts">Konta</string>
     <string name="prefs_add_account">Dodaj konto</string>
     <string name="drawer_manage_accounts">Zarządzaj kontami</string>

+ 2 - 3
src/main/res/values-pt-rBR/strings.xml

@@ -304,7 +304,6 @@
     <string name="activity_chooser_title">Enviar o link para &#8230;</string>
     <string name="wait_for_tmp_copy_from_private_storage">Copiando o arquivo da armazenagem privada</string>
     
-    <string name="oauth_check_onoff">Login com oAuth2</string> 
     <string name="oauth_login_connection">Conectando ao servidor OAuth 2...</string>    
         
     <string name="ssl_validator_header">A identidade do site não pôde ser verificada</string>
@@ -423,8 +422,6 @@
     <string name="file_migration_use_data_folder">Usar</string>
 
     <string name="file_migration_source_not_readable_title">Diretório fonte não legível!</string>
-    <string name="file_migration_source_not_readable">Você ainda quer mudar o caminho de armazenagem para %1$s?\n\nImportante: Todos os dados terão de ser baixados novamente.</string>
-
     <string name="prefs_category_accounts">Contas</string>
     <string name="prefs_add_account">Adicionar uma conta</string>
     <string name="drawer_manage_accounts">Gerenciar contas</string>
@@ -659,4 +656,6 @@
     <string name="drawer_logout">Sair</string>
     <string name="picture_set_as_no_app">Nenhum aplicativo encontrado para atribuir uma imagem!</string>
     <string name="privacy">Privacidade</string>
+    <string name="file_not_found">Arquivo não encontrado!</string>
+
     </resources>

+ 2 - 3
src/main/res/values-ru/strings.xml

@@ -306,7 +306,6 @@
     <string name="activity_chooser_title">Отправить ссылку &#8230;</string>
     <string name="wait_for_tmp_copy_from_private_storage">Копирование файла из частного хранилища</string>
     
-    <string name="oauth_check_onoff">Войти через oAuth2</string> 
     <string name="oauth_login_connection">Подключение к серверу OAuth2…</string>    
         
     <string name="ssl_validator_header">Подлинность сайта не может быть проверена</string>
@@ -425,8 +424,6 @@
     <string name="file_migration_use_data_folder">Использовать существующий</string>
 
     <string name="file_migration_source_not_readable_title">Исходный каталог недоступен для чтения!</string>
-    <string name="file_migration_source_not_readable">Вы действительно хотите изменить расположение хранилища на %1$s?\n\nВнимание: придётся заново скачать все данные.</string>
-
     <string name="prefs_category_accounts">Аккаунты</string>
     <string name="prefs_add_account">Добавить аккаунт</string>
     <string name="drawer_manage_accounts">Управление аккаунтами</string>
@@ -663,4 +660,6 @@
     <string name="drawer_logout">Выйти</string>
     <string name="picture_set_as_no_app">Не надено приложения, с помощью которого можно установить изображение!</string>
     <string name="privacy">Конфиденциальность</string>
+    <string name="file_not_found">Файл не найден!</string>
+
     </resources>

+ 0 - 3
src/main/res/values-sq/strings.xml

@@ -304,7 +304,6 @@ në 7 ditët e fundit.</string>
     <string name="activity_chooser_title">Dërgoni lidhje te &#8230;</string>
     <string name="wait_for_tmp_copy_from_private_storage">Po kopjohet skedar nga depo private</string>
     
-    <string name="oauth_check_onoff">Hyrje me oAuth2</string> 
     <string name="oauth_login_connection">Po lidhet me serverin oAuth2…</string>    
         
     <string name="ssl_validator_header">Identiteti i sajtit s\’u verifikua dot</string>
@@ -422,8 +421,6 @@ në 7 ditët e fundit.</string>
     <string name="file_migration_use_data_folder">Përdor ekzistueset</string>
 
     <string name="file_migration_source_not_readable_title">Direktoria burim nuk është lexueshme!</string>
-    <string name="file_migration_source_not_readable">Doni akoma ta ndryshoni rrugën e kujtesës në %1$s? \n\n Shënim: të gjitha të dhënat duhet të shkarkohen edhe njëherë.</string>
-
     <string name="prefs_category_accounts">Llogari</string>
     <string name="prefs_add_account">Shtoni llogari</string>
     <string name="drawer_manage_accounts">Menaxhoni llogaritë</string>

+ 2 - 3
src/main/res/values-tr/strings.xml

@@ -304,7 +304,6 @@
     <string name="activity_chooser_title">Bağlantıyı gönder&#8230;</string>
     <string name="wait_for_tmp_copy_from_private_storage">Dosya kişisel depolamadan kopyalanıyor</string>
     
-    <string name="oauth_check_onoff">oAuth2 ile oturum açın</string> 
     <string name="oauth_login_connection">OAuth2 sunucusuna bağlanılıyor…</string>    
         
     <string name="ssl_validator_header">Sitenin kimliği doğrulanamadı</string>
@@ -423,8 +422,6 @@
     <string name="file_migration_use_data_folder">Kullanılsın</string>
 
     <string name="file_migration_source_not_readable_title">Kaynak klasör okunabilir değil!</string>
-    <string name="file_migration_source_not_readable">Buna rağmen depolama konumunu %1$s olarak değiştirmek istediğinize emin misiniz?\n\nNot: Tüm verilerin yeniden indirilmesi gerekecek.</string>
-
     <string name="prefs_category_accounts">Hesaplar</string>
     <string name="prefs_add_account">Hesap ekle</string>
     <string name="drawer_manage_accounts">Hesap yönetimi</string>
@@ -659,4 +656,6 @@
     <string name="drawer_logout">Oturumu Kapat</string>
     <string name="picture_set_as_no_app">Görselin ayarlanabileceği bir uygulama bulunamadı!</string>
     <string name="privacy">Gizlilik</string>
+    <string name="file_not_found">Dosya bulunamadı!</string>
+
     </resources>

+ 0 - 3
src/main/res/values-zh-rCN/strings.xml

@@ -307,7 +307,6 @@
     <string name="activity_chooser_title">发送链接给 &#8230;</string>
     <string name="wait_for_tmp_copy_from_private_storage">从私有存储中拷贝文件</string>
     
-    <string name="oauth_check_onoff">使用oAuth2登陆</string> 
     <string name="oauth_login_connection">连接到OAuth 2服务器...</string>    
         
     <string name="ssl_validator_header">站点身份无法验证</string>
@@ -425,8 +424,6 @@
     <string name="file_migration_use_data_folder">使用</string>
 
     <string name="file_migration_source_not_readable_title">源目录不可读!</string>
-    <string name="file_migration_source_not_readable">您还想将存储路径更改为%1$s?\ n \ note:所有数据都必须重新下载。</string>
-
     <string name="prefs_category_accounts">账号</string>
     <string name="prefs_add_account">添加账号</string>
     <string name="drawer_manage_accounts">管理账号</string>