summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--android/source/res/layout/activity_document_browser.xml76
-rw-r--r--android/source/res/layout/item_recent_files.xml34
-rw-r--r--android/source/res/values/strings.xml2
-rw-r--r--android/source/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java132
-rw-r--r--android/source/src/java/org/libreoffice/ui/RecentFilesAdapter.java92
5 files changed, 313 insertions, 23 deletions
diff --git a/android/source/res/layout/activity_document_browser.xml b/android/source/res/layout/activity_document_browser.xml
index 2c1874459b19..a444d6f66b49 100644
--- a/android/source/res/layout/activity_document_browser.xml
+++ b/android/source/res/layout/activity_document_browser.xml
@@ -22,23 +22,67 @@
android:layout_height="match_parent">
<!-- The content -->
-
- <android.support.v7.widget.RecyclerView
- android:id="@+id/file_recycler_view"
+ <ScrollView
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@color/background_normal"
- android:orientation="vertical" />
-
- <!-- The navigation drawer -->
- <android.support.design.widget.NavigationView
- android:id="@+id/navigation_drawer"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_gravity="start"
- android:background="@color/background_normal"
- app:menu="@menu/navigation_menu"
- android:theme="@style/LibreOfficeTheme.NavigationView" />
+ android:layout_height="match_parent">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:divider="@color/doorhanger_divider_light"
+ android:showDividers="middle">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="48dp"
+ android:id="@+id/header_recents"
+ android:text="@string/title_recents"
+ android:gravity="center_vertical"
+ android:textSize="14sp"
+ android:padding="16dp"
+ android:textStyle="bold"/>
+
+ <!--Recent files-->
+ <android.support.v7.widget.RecyclerView
+ android:id="@+id/list_recent"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dp"
+ android:layout_marginBottom="8dp"/>
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="48dp"
+ android:id="@+id/header_browser"
+ android:text="@string/title_browser"
+ android:gravity="center_vertical"
+ android:textSize="14sp"
+ android:padding="16dp"
+ android:textStyle="bold" />
+
+
+ <!--Document browser-->
+ <android.support.v7.widget.RecyclerView
+ android:id="@+id/file_recycler_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/background_normal"
+ android:orientation="vertical" />
+
+ </LinearLayout>
+
+ </ScrollView>
+
+ <!-- The navigation drawer -->
+ <android.support.design.widget.NavigationView
+ android:id="@+id/navigation_drawer"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_gravity="start"
+ android:background="@color/background_normal"
+ app:menu="@menu/navigation_menu"
+ android:theme="@style/LibreOfficeTheme.NavigationView" />
</android.support.v4.widget.DrawerLayout>
</LinearLayout>
diff --git a/android/source/res/layout/item_recent_files.xml b/android/source/res/layout/item_recent_files.xml
new file mode 100644
index 000000000000..fa966d8b554c
--- /dev/null
+++ b/android/source/res/layout/item_recent_files.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ This file is part of the LibreOffice project.
+
+ This Source Code Form is subject to the terms of the Mozilla Public
+ License, v. 2.0. If a copy of the MPL was not distributed with this
+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="48dp"
+ android:orientation="horizontal"
+ android:background="?android:attr/selectableItemBackground"
+ tools:ignore="UseCompoundDrawables">
+ <!--using compound drawables is ignored because more control over the drawable size is needed-->
+
+ <ImageView
+ android:layout_width="32dp"
+ android:layout_height="wrap_content"
+ android:layout_margin="8dp"
+ android:layout_gravity="center_vertical"
+ android:adjustViewBounds="true"
+ android:id="@+id/imageView"
+ android:contentDescription="@string/file_icon_desc"/>
+
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:id="@+id/textView"
+ style="@style/ListItemText"/>
+
+</LinearLayout> \ No newline at end of file
diff --git a/android/source/res/values/strings.xml b/android/source/res/values/strings.xml
index 5cf731100dd0..f02b4097723a 100644
--- a/android/source/res/values/strings.xml
+++ b/android/source/res/values/strings.xml
@@ -31,6 +31,8 @@
<string name="menu_sort_modified">Sort by Date</string>
<string name="menu_preferences">Preferences</string>
<string name="file_icon_desc">fileicon</string>
+ <string name="title_recents">Recent files</string>
+ <string name="title_browser">All files</string>
<!-- Pref keys as resources ; Not currently used -->
<string name="EXPLORER_VIEW_TYPE_KEY">EXPLORER_VIEW_TYPE</string>
<string name="CURRENT_DIRECTORY_KEY">CURRENT_DIRECTORY</string>
diff --git a/android/source/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java b/android/source/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java
index 5b79495b0cf1..c842abcc55e2 100644
--- a/android/source/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java
+++ b/android/source/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java
@@ -14,11 +14,15 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.content.pm.ShortcutInfo;
+import android.content.pm.ShortcutManager;
+import android.graphics.drawable.Icon;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
+import android.support.design.widget.NavigationView;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
@@ -43,10 +47,8 @@ import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
-import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
-import android.support.design.widget.NavigationView;
import org.libreoffice.AboutDialogFragment;
import org.libreoffice.LibreOfficeMainActivity;
@@ -66,10 +68,12 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
public class LibreOfficeUIActivity extends AppCompatActivity {
- private String LOGTAG = LibreOfficeUIActivity.class.getSimpleName();
+ private static final String LOGTAG = LibreOfficeUIActivity.class.getSimpleName();
private SharedPreferences prefs;
private int filterMode = FileUtilities.ALL;
private int viewMode;
@@ -85,11 +89,12 @@ public class LibreOfficeUIActivity extends AppCompatActivity {
private int currentlySelectedFile;
private static final String CURRENT_DIRECTORY_KEY = "CURRENT_DIRECTORY";
- private static final String DOC_PROIVDER_KEY = "CURRENT_DOCUMENT_PROVIDER";
+ private static final String DOC_PROVIDER_KEY = "CURRENT_DOCUMENT_PROVIDER";
private static final String FILTER_MODE_KEY = "FILTER_MODE";
public static final String EXPLORER_VIEW_TYPE_KEY = "EXPLORER_VIEW_TYPE";
public static final String EXPLORER_PREFS_KEY = "EXPLORER_PREFS";
public static final String SORT_MODE_KEY = "SORT_MODE";
+ private static final String RECENT_DOCUMENTS_KEY = "RECENT_DOCUMENTS";
public static final int GRID_VIEW = 0;
public static final int LIST_VIEW = 1;
@@ -97,7 +102,8 @@ public class LibreOfficeUIActivity extends AppCompatActivity {
private DrawerLayout drawerLayout;
private NavigationView navigationDrawer;
private ActionBarDrawerToggle drawerToggle;
- RecyclerView fileRecyclerView;
+ private RecyclerView fileRecyclerView;
+ private RecyclerView recentRecyclerView;
private boolean canQuit = false;
@@ -151,7 +157,25 @@ public class LibreOfficeUIActivity extends AppCompatActivity {
});
}
+ recentRecyclerView = (RecyclerView) findViewById(R.id.list_recent);
+
+ Set<String> recentFileStrings = prefs.getStringSet(RECENT_DOCUMENTS_KEY, new HashSet<String>());
+
+ final ArrayList<IFile> recentFiles = new ArrayList<IFile>();
+ for (String recentFileString : recentFileStrings) {
+ try {
+ recentFiles.add(documentProvider.createFromUri(new URI(recentFileString)));
+ } catch (URISyntaxException e) {
+ e.printStackTrace();
+ }
+ }
+
+ recentRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
+ recentRecyclerView.setAdapter(new RecentFilesAdapter(this, recentFiles));
+
fileRecyclerView = (RecyclerView) findViewById(R.id.file_recycler_view);
+ //This should be tested because it possibly disables view recycling
+ fileRecyclerView.setNestedScrollingEnabled(false);
openDirectory(currentDirectory);
registerForContextMenu(fileRecyclerView);
@@ -341,6 +365,18 @@ public class LibreOfficeUIActivity extends AppCompatActivity {
if (dir == null)
return;
+ //show recent files if in home directory
+ if (dir.equals(homeDirectory)) {
+ recentRecyclerView.setVisibility(View.VISIBLE);
+ findViewById(R.id.header_browser).setVisibility((View.VISIBLE));
+ findViewById(R.id.header_recents).setVisibility((View.VISIBLE));
+
+ } else {
+ recentRecyclerView.setVisibility(View.GONE);
+ findViewById(R.id.header_browser).setVisibility((View.GONE));
+ findViewById(R.id.header_recents).setVisibility((View.GONE));
+ }
+
new AsyncTask<IFile, Void, Void>() {
@Override
protected Void doInBackground(IFile... dir) {
@@ -374,6 +410,7 @@ public class LibreOfficeUIActivity extends AppCompatActivity {
}
public void open(final IFile document) {
+ addDocumentToRecents(document);
new AsyncTask<IFile, Void, File>() {
@Override
protected File doInBackground(IFile... document) {
@@ -640,7 +677,7 @@ public class LibreOfficeUIActivity extends AppCompatActivity {
outState.putString(CURRENT_DIRECTORY_KEY, currentDirectory.getUri().toString());
outState.putInt(FILTER_MODE_KEY, filterMode);
outState.putInt(EXPLORER_VIEW_TYPE_KEY , viewMode);
- outState.putInt(DOC_PROIVDER_KEY, documentProvider.getId());
+ outState.putInt(DOC_PROVIDER_KEY, documentProvider.getId());
Log.d(LOGTAG, currentDirectory.toString() + Integer.toString(filterMode) + Integer.toString(viewMode));
//prefs.edit().putInt(EXPLORER_VIEW_TYPE, viewType).commit();
@@ -657,7 +694,7 @@ public class LibreOfficeUIActivity extends AppCompatActivity {
if (documentProvider == null) {
Log.d(LOGTAG, "onRestoreInstanceState - documentProvider is null");
documentProvider = DocumentProviderFactory.getInstance()
- .getProvider(savedInstanceState.getInt(DOC_PROIVDER_KEY));
+ .getProvider(savedInstanceState.getInt(DOC_PROVIDER_KEY));
}
try {
currentDirectory = documentProvider.createFromUri(new URI(
@@ -710,6 +747,87 @@ public class LibreOfficeUIActivity extends AppCompatActivity {
return (int) (dp * scale + 0.5f);
}
+ private void addDocumentToRecents(IFile iFile) {
+ String newRecent = iFile.getUri().toString();
+ Set<String> recentsSet = prefs.getStringSet(RECENT_DOCUMENTS_KEY, new HashSet<String>());
+
+ //create array to work with
+ ArrayList<String> recentsArrayList = new ArrayList<String>(recentsSet);
+
+ //remove string if present, so that it doesn't appear multiple times
+ recentsSet.remove(newRecent);
+
+ //put the new value in the first place
+ recentsArrayList.add(0, newRecent);
+
+
+ /*
+ * 4 because the number of recommended items in App Shortcuts is 4, and also
+ * because it's a good number of recent items in general
+ */
+ final int RECENTS_SIZE = 4;
+
+ while (recentsArrayList.size() > RECENTS_SIZE) {
+ recentsArrayList.remove(RECENTS_SIZE);
+ }
+
+ //switch to Set, so that it could be inserted into prefs
+ recentsSet = new HashSet<String>(recentsArrayList);
+
+ prefs.edit().putStringSet(RECENT_DOCUMENTS_KEY, recentsSet).apply();
+
+
+ //update app shortcuts (7.0 and above)
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N_MR1) {
+ ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
+
+ //Remove all shortcuts, and apply new ones.
+ shortcutManager.removeAllDynamicShortcuts();
+
+ ArrayList<ShortcutInfo> shortcuts = new ArrayList<ShortcutInfo>();
+ for (String pathString : recentsArrayList) {
+
+ //find the appropriate drawable
+ int drawable = 0;
+ switch (FileUtilities.getType(pathString)) {
+ case FileUtilities.DOC:
+ drawable = R.drawable.writer;
+ break;
+ case FileUtilities.CALC:
+ drawable = R.drawable.calc;
+ break;
+ case FileUtilities.DRAWING:
+ drawable = R.drawable.draw;
+ break;
+ case FileUtilities.IMPRESS:
+ drawable = R.drawable.impress;
+ break;
+ }
+
+ File file = new File(pathString);
+
+ //for some reason, getName uses %20 instead of space
+ String filename = file.getName().replace("%20", " ");
+
+ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.fromFile(file));
+ String packageName = this.getApplicationContext().getPackageName();
+ ComponentName componentName = new ComponentName(packageName, LibreOfficeMainActivity.class.getName());
+ intent.setComponent(componentName);
+
+ ShortcutInfo shortcut = new ShortcutInfo.Builder(this, filename)
+ .setShortLabel(filename)
+ .setLongLabel(filename)
+ .setIcon(Icon.createWithResource(this, drawable))
+ .setIntent(intent)
+ .build();
+
+ shortcuts.add(shortcut);
+ }
+ shortcutManager.setDynamicShortcuts(shortcuts);
+ }
+ }
+
+
class ListItemAdapter extends RecyclerView.Adapter<ListItemAdapter.ViewHolder> {
private Activity mActivity;
diff --git a/android/source/src/java/org/libreoffice/ui/RecentFilesAdapter.java b/android/source/src/java/org/libreoffice/ui/RecentFilesAdapter.java
new file mode 100644
index 000000000000..4ebb9e06328a
--- /dev/null
+++ b/android/source/src/java/org/libreoffice/ui/RecentFilesAdapter.java
@@ -0,0 +1,92 @@
+/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+package org.libreoffice.ui;
+
+import android.support.v4.content.ContextCompat;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import org.libreoffice.R;
+import org.libreoffice.storage.IFile;
+
+import java.util.List;
+
+class RecentFilesAdapter extends RecyclerView.Adapter<RecentFilesAdapter.ViewHolder> {
+
+ private LibreOfficeUIActivity mActivity;
+ private List<IFile> recentFiles;
+
+ RecentFilesAdapter(LibreOfficeUIActivity activity, List<IFile> recentFiles) {
+ this.mActivity = activity;
+ this.recentFiles = recentFiles;
+ }
+
+ @Override
+ public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ View item = LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.item_recent_files, parent, false);
+ return new ViewHolder(item);
+ }
+
+ @Override
+ public void onBindViewHolder(ViewHolder holder, int position) {
+ final IFile iFile = recentFiles.get(position);
+
+ holder.itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ mActivity.open(iFile);
+ }
+ });
+
+ String filename = iFile.getName();
+
+ holder.textView.setText(filename);
+
+ int compoundDrawableInt = 0;
+
+ switch (FileUtilities.getType(filename)) {
+ case FileUtilities.DOC:
+ compoundDrawableInt = R.drawable.writer;
+ break;
+ case FileUtilities.CALC:
+ compoundDrawableInt = R.drawable.calc;
+ break;
+ case FileUtilities.DRAWING:
+ compoundDrawableInt = R.drawable.draw;
+ break;
+ case FileUtilities.IMPRESS:
+ compoundDrawableInt = R.drawable.impress;
+ break;
+ }
+ holder.imageView.setImageDrawable(ContextCompat.getDrawable(mActivity, compoundDrawableInt));
+ }
+
+ @Override
+ public int getItemCount() {
+ return recentFiles.size();
+ }
+
+ class ViewHolder extends RecyclerView.ViewHolder {
+
+ TextView textView;
+ ImageView imageView;
+
+ ViewHolder(View itemView) {
+ super(itemView);
+ this.textView = (TextView) itemView.findViewById(R.id.textView);
+ this.imageView = (ImageView) itemView.findViewById(R.id.imageView);
+ }
+ }
+}