[Libreoffice-commits] core.git: Branch 'feature/owncloud-provider-for-android' - 33 commits - android/experimental basctl/source chart2/source config_host/config_global.h.in configure.ac external/liborcus icon-themes/crystal icon-themes/galaxy icon-themes/hicontrast icon-themes/human icon-themes/industrial icon-themes/oxygen icon-themes/tango icon-themes/tango_testing oox/source sc/inc sc/source setup_native/source solenv/bin solenv/gbuild svx/uiconfig sw/source vcl/source vcl/unx

Jacobo Aragunde Pérez jaragunde at igalia.com
Tue Feb 10 10:06:51 PST 2015


Rebased ref, commits from common ancestor:
commit a9a125191af334655fdff4a9f7c9a4ad843a5ed1
Author: Jacobo Aragunde Pérez <jaragunde at igalia.com>
Date:   Tue Feb 10 18:46:54 2015 +0100

    Android: get the file to share in a different thread.
    
    Share feature for cloud files will probably not work properly as it
    is, but with this patch we prevent a crash at least.
    
    Change-Id: I95176e9e855a37adf1d3c46edceb0dc6067d9884

diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java
index 0e684a3..2a4b69f 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java
@@ -363,15 +363,42 @@ public class LibreOfficeUIActivity extends LOAbout implements ActionBar.OnNaviga
     }
 
     private void share(int position) {
-        File file = filePaths.get(position).getDocument();
-        Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
-        Uri uri = Uri.fromFile(file);
-        sharingIntent.setType(FileUtilities.getMimeType(file.getName()));
-        sharingIntent.putExtra(android.content.Intent.EXTRA_STREAM, uri);
-        sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,
-                file.getName());
-        startActivity(Intent.createChooser(sharingIntent,
-                getString(R.string.share_via)));
+
+        new AsyncTask<IFile, Void, File>() {
+            @Override
+            protected File doInBackground(IFile... document) {
+                // this operation may imply network access and must be run in
+                // a different thread
+                try {
+                    return document[0].getDocument();
+                } catch (final RuntimeException e) {
+                    final Activity activity = LibreOfficeUIActivity.this;
+                    activity.runOnUiThread(new Runnable() {
+                        @Override
+                        public void run() {
+                            Toast.makeText(activity, e.getMessage(),
+                                    Toast.LENGTH_SHORT).show();
+                        }
+                    });
+                    Log.e(tag, e.getMessage(), e.getCause());
+                    return null;
+                }
+            }
+
+            @Override
+            protected void onPostExecute(File file) {
+                if (file != null) {
+                    Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
+                    Uri uri = Uri.fromFile(file);
+                    sharingIntent.setType(FileUtilities.getMimeType(file.getName()));
+                    sharingIntent.putExtra(android.content.Intent.EXTRA_STREAM, uri);
+                    sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,
+                            file.getName());
+                    startActivity(Intent.createChooser(sharingIntent,
+                            getString(R.string.share_via)));
+                }
+            }
+        }.execute(filePaths.get(position));
     }
 
     @Override
commit 5be8ec8a1f9b7385122177915d72489abb6d84f1
Author: Jacobo Aragunde Pérez <jaragunde at igalia.com>
Date:   Tue Feb 10 16:17:12 2015 +0000

    Android: improve error handling for document providers.
    
    Now some operations in document providers may throw a RuntimeException
    in case of error. The main activity is ready to catch them and show an
    error message.
    
    This patch implements error management for ownCloud provider.
    
    Change-Id: Iad7249dbdc06b2a0890d5435ad65284b728e9707

diff --git a/android/experimental/LOAndroid3/res/values/strings.xml b/android/experimental/LOAndroid3/res/values/strings.xml
index 336b19b..135e52d 100644
--- a/android/experimental/LOAndroid3/res/values/strings.xml
+++ b/android/experimental/LOAndroid3/res/values/strings.xml
@@ -36,6 +36,10 @@
     <string name="local_file_system">Local file system</string>
     <string name="owncloud">ownCloud</string>
 
+    <string name="owncloud_wrong_connection">Cannot connect to ownCloud server. Check your configuration.</string>
+    <string name="owncloud_unauthorized">Cannot log into ownCloud server. Check your configuration.</string>
+    <string name="owncloud_unspecified_error">Unspecified error connecting to ownCloud server. Check your configuration and/or try later.</string>
+
     <!-- Document provider settings -->
     <string name="storage_provider_settings">Storage provider settings</string>
     <string name="owncloud_settings">ownCloud settings</string>
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/IDocumentProvider.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/IDocumentProvider.java
index 191a143..bbfdecd 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/IDocumentProvider.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/IDocumentProvider.java
@@ -21,6 +21,7 @@ public interface IDocumentProvider {
      * Provides the content root element for the Document Provider.
      *
      * @return Content root element.
+     * @throws RuntimeException in case of error.
      */
     IFile getRootDirectory();
 
@@ -31,6 +32,7 @@ public interface IDocumentProvider {
      *            URI pointing to some content object that has been previously
      *            retrieved with IFile.getUri().
      * @return IFile object pointing to the content represented by uri.
+     * @throws RuntimeException in case of error.
      */
     IFile createFromUri(URI uri);
 
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/IFile.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/IFile.java
index 5b71c09..8effd0f 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/IFile.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/IFile.java
@@ -71,6 +71,7 @@ public interface IFile {
      *
      * @return list of files contained by this directory, or an empty list if
      *         this is not a directory.
+     * @throws RuntimeException in case of error.
      */
     List<IFile> listFiles();
 
@@ -82,6 +83,7 @@ public interface IFile {
      *            the filter to match names against.
      * @return filtered list of files contained by this directory, or an empty
      *         list if this is not a directory.
+     * @throws RuntimeException in case of error.
      */
     List<IFile> listFiles(FileFilter filter);
 
@@ -97,6 +99,7 @@ public interface IFile {
      * for a directory is not defined.
      *
      * @return local file containing the document wrapped by this object.
+     * @throws RuntimeException in case of error.
      */
     File getDocument();
 }
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudFile.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudFile.java
index a8d1a06..ce10ab6 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudFile.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudFile.java
@@ -69,8 +69,7 @@ public class OwnCloudFile implements IFile {
             RemoteOperationResult result = refreshOperation.execute(provider
                     .getClient());
             if (!result.isSuccess()) {
-                throw new RuntimeException(result.getLogMessage(),
-                        result.getException());
+                throw provider.buildRuntimeExceptionForResultCode(result.getCode());
             }
             for (Object obj : result.getData()) {
                 RemoteFile child = (RemoteFile) obj;
@@ -104,7 +103,10 @@ public class OwnCloudFile implements IFile {
         File downFolder = provider.getCacheDir();
         DownloadRemoteFileOperation operation = new DownloadRemoteFileOperation(
                 file.getRemotePath(), downFolder.getAbsolutePath());
-        operation.execute(provider.getClient());
+        RemoteOperationResult result = operation.execute(provider.getClient());
+        if (!result.isSuccess()) {
+            throw provider.buildRuntimeExceptionForResultCode(result.getCode());
+        }
         return new File(downFolder.getAbsolutePath() + file.getRemotePath());
     }
 
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudProvider.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudProvider.java
index 827c0af..66e4633 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudProvider.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudProvider.java
@@ -18,6 +18,7 @@ import com.owncloud.android.lib.common.OwnCloudClient;
 import com.owncloud.android.lib.common.OwnCloudClientFactory;
 import com.owncloud.android.lib.common.OwnCloudCredentialsFactory;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
 import com.owncloud.android.lib.resources.files.FileUtils;
 import com.owncloud.android.lib.resources.files.ReadRemoteFileOperation;
 import com.owncloud.android.lib.resources.files.RemoteFile;
@@ -78,8 +79,7 @@ public class OwnCloudProvider implements IDocumentProvider,
                 uri.getPath());
         RemoteOperationResult result = refreshOperation.execute(client);
         if (!result.isSuccess()) {
-            throw new RuntimeException(result.getLogMessage(),
-                    result.getException());
+            throw buildRuntimeExceptionForResultCode(result.getCode());
         }
         if (result.getData().size() > 0) {
             return new OwnCloudFile(this, (RemoteFile) result.getData().get(0));
@@ -113,6 +113,29 @@ public class OwnCloudProvider implements IDocumentProvider,
     }
 
     /**
+     * Build the proper RuntimeException for some error result.
+     *
+     * @param code Result code got from some RemoteOperationResult.
+     * @return exception with the proper internationalized error message.
+     */
+    protected RuntimeException buildRuntimeExceptionForResultCode(ResultCode code) {
+        int errorMessage;
+        switch (code) {
+            case WRONG_CONNECTION:  // SocketException
+            case FILE_NOT_FOUND:    // HTTP 404
+                errorMessage = R.string.owncloud_wrong_connection;
+                break;
+            case UNAUTHORIZED:      // wrong user/pass
+                errorMessage = R.string.owncloud_unauthorized;
+                break;
+            default:
+                errorMessage = R.string.owncloud_unspecified_error;
+                break;
+        }
+        return new RuntimeException(context.getString(errorMessage));
+    }
+
+    /**
      * Deletes files and recursively deletes directories.
      *
      * @param file
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java
index 737515e..0e684a3 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java
@@ -65,6 +65,7 @@ import android.widget.ListAdapter;
 import android.widget.ListView;
 import android.widget.SpinnerAdapter;
 import android.widget.TextView;
+import android.widget.Toast;
 
 import java.net.URI;
 import java.net.URISyntaxException;
@@ -235,11 +236,24 @@ public class LibreOfficeUIActivity extends LOAbout implements ActionBar.OnNaviga
                 // switch document provider:
                 // these operations may imply network access and must be run in
                 // a different thread
-                documentProvider = provider[0];
-                homeDirectory = documentProvider.getRootDirectory();
-                currentDirectory = homeDirectory;
-                filePaths = currentDirectory.listFiles(FileUtilities
-                        .getFileFilter(filterMode));
+                try {
+                    documentProvider = provider[0];
+                    homeDirectory = documentProvider.getRootDirectory();
+                    currentDirectory = homeDirectory;
+                    filePaths = currentDirectory.listFiles(FileUtilities
+                            .getFileFilter(filterMode));
+                }
+                catch (final RuntimeException e) {
+                    final Activity activity = LibreOfficeUIActivity.this;
+                    activity.runOnUiThread(new Runnable() {
+                        @Override
+                        public void run() {
+                            Toast.makeText(activity, e.getMessage(),
+                                    Toast.LENGTH_SHORT).show();
+                        }
+                    });
+                    Log.e(tag, e.getMessage(), e.getCause());
+                }
                 return null;
             }
 
@@ -261,8 +275,21 @@ public class LibreOfficeUIActivity extends LOAbout implements ActionBar.OnNaviga
                 // this operation may imply network access and must be run in
                 // a different thread
                 currentDirectory = dir[0];
-                filePaths = currentDirectory.listFiles(FileUtilities
-                        .getFileFilter(filterMode));
+                try {
+                    filePaths = currentDirectory.listFiles(FileUtilities
+                            .getFileFilter(filterMode));
+                }
+                catch (final RuntimeException e) {
+                    final Activity activity = LibreOfficeUIActivity.this;
+                    activity.runOnUiThread(new Runnable() {
+                        @Override
+                        public void run() {
+                            Toast.makeText(activity, e.getMessage(),
+                                    Toast.LENGTH_SHORT).show();
+                        }
+                    });
+                    Log.e(tag, e.getMessage(), e.getCause());
+                }
                 return null;
             }
 
@@ -279,17 +306,33 @@ public class LibreOfficeUIActivity extends LOAbout implements ActionBar.OnNaviga
             protected File doInBackground(IFile... document) {
                 // this operation may imply network access and must be run in
                 // a different thread
-                return document[0].getDocument();
+                try {
+                    return document[0].getDocument();
+                }
+                catch (final RuntimeException e) {
+                    final Activity activity = LibreOfficeUIActivity.this;
+                    activity.runOnUiThread(new Runnable() {
+                        @Override
+                        public void run() {
+                            Toast.makeText(activity, e.getMessage(),
+                                    Toast.LENGTH_SHORT).show();
+                        }
+                    });
+                    Log.e(tag, e.getMessage(), e.getCause());
+                    return null;
+                }
             }
 
             @Override
             protected void onPostExecute(File file) {
-                Intent i = new Intent(Intent.ACTION_VIEW, Uri.fromFile(file));
-                String packageName = getApplicationContext().getPackageName();
-                ComponentName componentName = new ComponentName(packageName,
-                        LibreOfficeMainActivity.class.getName());
-                i.setComponent(componentName);
-                startActivity(i);
+                if (file != null) {
+                    Intent i = new Intent(Intent.ACTION_VIEW, Uri.fromFile(file));
+                    String packageName = getApplicationContext().getPackageName();
+                    ComponentName componentName = new ComponentName(packageName,
+                            LibreOfficeMainActivity.class.getName());
+                    i.setComponent(componentName);
+                    startActivity(i);
+                }
             }
         }.execute(document);
     }
commit cdcef05b626c32f3b0bdbb9634434c55f785799e
Author: Jacobo Aragunde Pérez <jaragunde at igalia.com>
Date:   Mon Feb 9 20:20:11 2015 +0100

    Android: document providers listen to changes in preferences.
    
    With this patch, document providers are able to listen to changes in
    their preferences and update their internal state accordingly. Now
    ownCloud provider can see its server updated without restarting the
    application.
    
    Change-Id: I833c7ec9fc97be58bdc8ac2cbf4384a33c2b400e

diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/DocumentProviderFactory.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/DocumentProviderFactory.java
index 3d462e6..612eaa6 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/DocumentProviderFactory.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/DocumentProviderFactory.java
@@ -9,11 +9,15 @@
 
 package org.libreoffice.storage;
 
+import java.util.HashSet;
+import java.util.Set;
+
 import org.libreoffice.storage.local.LocalDocumentsDirectoryProvider;
 import org.libreoffice.storage.local.LocalDocumentsProvider;
 import org.libreoffice.storage.owncloud.OwnCloudProvider;
 
 import android.content.Context;
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
 
 /**
  * Keeps the instances of the available IDocumentProviders in the system.
@@ -103,4 +107,14 @@ public final class DocumentProviderFactory {
     public IDocumentProvider getDefaultProvider() {
         return providers[0];
     }
+
+    public Set<OnSharedPreferenceChangeListener> getChangeListeners() {
+        Set<OnSharedPreferenceChangeListener> listeners =
+                new HashSet<OnSharedPreferenceChangeListener>();
+        for (IDocumentProvider provider : providers) {
+            if (provider instanceof OnSharedPreferenceChangeListener)
+                listeners.add((OnSharedPreferenceChangeListener) provider);
+        }
+        return listeners;
+    }
 }
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/DocumentProviderSettingsActivity.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/DocumentProviderSettingsActivity.java
index d17fe51..e98534a 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/DocumentProviderSettingsActivity.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/DocumentProviderSettingsActivity.java
@@ -9,11 +9,15 @@
 
 package org.libreoffice.storage;
 
+import java.util.Set;
+
 import org.libreoffice.R;
 
 import android.app.Activity;
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
 import android.os.Bundle;
 import android.preference.PreferenceFragment;
+import android.preference.PreferenceManager;
 
 public class DocumentProviderSettingsActivity extends Activity {
 
@@ -21,6 +25,8 @@ public class DocumentProviderSettingsActivity extends Activity {
     public static final String KEY_PREF_OWNCLOUD_USER_NAME = "pref_user_name";
     public static final String KEY_PREF_OWNCLOUD_PASSWORD = "pref_password";
 
+    private Set<OnSharedPreferenceChangeListener> listeners;
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -30,6 +36,27 @@ public class DocumentProviderSettingsActivity extends Activity {
                 .replace(android.R.id.content, new SettingsFragment()).commit();
     }
 
+    @Override
+    protected void onResume() {
+        super.onResume();
+
+        listeners = DocumentProviderFactory.getInstance().getChangeListeners();
+        for (OnSharedPreferenceChangeListener listener : listeners) {
+            PreferenceManager.getDefaultSharedPreferences(this)
+                    .registerOnSharedPreferenceChangeListener(listener);
+        }
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+
+        for (OnSharedPreferenceChangeListener listener : listeners) {
+            PreferenceManager.getDefaultSharedPreferences(this)
+                    .unregisterOnSharedPreferenceChangeListener(listener);
+        }
+    }
+
     public static class SettingsFragment extends PreferenceFragment {
         @Override
         public void onCreate(Bundle savedInstanceState) {
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudProvider.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudProvider.java
index a94e1ad..827c0af 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudProvider.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudProvider.java
@@ -10,6 +10,7 @@ import org.libreoffice.storage.IFile;
 
 import android.content.Context;
 import android.content.SharedPreferences;
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
 import android.net.Uri;
 import android.preference.PreferenceManager;
 
@@ -24,8 +25,10 @@ import com.owncloud.android.lib.resources.files.RemoteFile;
 /**
  * Implementation of IDocumentProvider for ownCloud servers.
  */
-public class OwnCloudProvider implements IDocumentProvider {
+public class OwnCloudProvider implements IDocumentProvider,
+        OnSharedPreferenceChangeListener {
 
+    private Context context;
     private OwnCloudClient client;
     private File cacheDir;
 
@@ -34,6 +37,8 @@ public class OwnCloudProvider implements IDocumentProvider {
     private String password;
 
     public OwnCloudProvider(Context context) {
+        this.context = context;
+
         // read preferences
         SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
         serverUrl = preferences.getString(
@@ -43,11 +48,7 @@ public class OwnCloudProvider implements IDocumentProvider {
         password = preferences.getString(
                 DocumentProviderSettingsActivity.KEY_PREF_OWNCLOUD_PASSWORD, "");
 
-        Uri serverUri = Uri.parse(serverUrl);
-        client = OwnCloudClientFactory.createOwnCloudClient(serverUri,
-                context, true);
-        client.setCredentials(OwnCloudCredentialsFactory.newBasicCredentials(
-                userName, password));
+        setupClient();
 
         // make sure cache directory exists, and clear it
         // TODO: probably we should do smarter cache management
@@ -58,6 +59,14 @@ public class OwnCloudProvider implements IDocumentProvider {
         cacheDir.mkdirs();
     }
 
+    private void setupClient() {
+        Uri serverUri = Uri.parse(serverUrl);
+        client = OwnCloudClientFactory.createOwnCloudClient(serverUri, context,
+                true);
+        client.setCredentials(OwnCloudCredentialsFactory.newBasicCredentials(
+                userName, password));
+    }
+
     @Override
     public IFile getRootDirectory() {
         return createFromUri(URI.create(FileUtils.PATH_SEPARATOR));
@@ -116,4 +125,25 @@ public class OwnCloudProvider implements IDocumentProvider {
         }
         file.delete();
     }
+
+    @Override
+    public void onSharedPreferenceChanged(SharedPreferences preferences,
+            String key) {
+        boolean changed = false;
+        if (key.equals(DocumentProviderSettingsActivity.KEY_PREF_OWNCLOUD_SERVER)) {
+            serverUrl = preferences.getString(key, "");
+            changed = true;
+        }
+        else if (key.equals(DocumentProviderSettingsActivity.KEY_PREF_OWNCLOUD_USER_NAME)) {
+            userName = preferences.getString(key, "");
+            changed = true;
+        }
+        else if (key.equals(DocumentProviderSettingsActivity.KEY_PREF_OWNCLOUD_PASSWORD)) {
+            password = preferences.getString(key, "");
+            changed = true;
+        }
+
+        if (changed)
+            setupClient();
+    }
 }
commit 37c57699cc335e1fc28e8475767cfa5a6712744f
Author: Jacobo Aragunde Pérez <jaragunde at igalia.com>
Date:   Mon Feb 9 14:10:29 2015 +0100

    Android: add menu entry for document provider settings
    
    Change-Id: Ic48275fe2e7d83fd5e77171f4f5740a527dec7e2

diff --git a/android/experimental/LOAndroid3/res/menu/view_menu.xml b/android/experimental/LOAndroid3/res/menu/view_menu.xml
index f316f5a..aff3709 100644
--- a/android/experimental/LOAndroid3/res/menu/view_menu.xml
+++ b/android/experimental/LOAndroid3/res/menu/view_menu.xml
@@ -11,6 +11,8 @@
           android:title="@string/menu_sort_az"/>
     <item android:id="@+id/menu_sort_modified"
           android:title="@string/menu_sort_modified"/>
+    <item android:id="@+id/menu_storage_preferences"
+          android:title="@string/storage_provider_settings"/>
     <item android:id="@+id/action_about"
           android:title="@string/action_about"
           android:orderInCategory="100"/>
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java
index 7296e83..737515e 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java
@@ -13,6 +13,7 @@ import org.libreoffice.LibreOfficeMainActivity;
 import org.libreoffice.R;
 import org.libreoffice.LOAbout;
 import org.libreoffice.storage.DocumentProviderFactory;
+import org.libreoffice.storage.DocumentProviderSettingsActivity;
 import org.libreoffice.storage.IDocumentProvider;
 import org.libreoffice.storage.IFile;
 import org.libreoffice.storage.local.LocalDocumentsProvider;
@@ -374,6 +375,10 @@ public class LibreOfficeUIActivity extends LOAbout implements ActionBar.OnNaviga
             case R.id.action_about:
                 showAbout();
                 return true;
+        case R.id.menu_storage_preferences:
+            startActivity(new Intent(this, DocumentProviderSettingsActivity.class));;
+            break;
+
             default:
                 return super.onOptionsItemSelected(item);
         }
commit f5a85631dbb1e5d8944d1260ac2e103498b4867c
Author: Jacobo Aragunde Pérez <jaragunde at igalia.com>
Date:   Mon Feb 9 14:04:59 2015 +0100

    Android: setup ownCloud provider with user-defined settings
    
    Change-Id: I4ad4dd12854ca9f332055a50131959f60f7da504

diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/DocumentProviderSettingsActivity.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/DocumentProviderSettingsActivity.java
index bb04855..d17fe51 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/DocumentProviderSettingsActivity.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/DocumentProviderSettingsActivity.java
@@ -16,6 +16,11 @@ import android.os.Bundle;
 import android.preference.PreferenceFragment;
 
 public class DocumentProviderSettingsActivity extends Activity {
+
+    public static final String KEY_PREF_OWNCLOUD_SERVER = "pref_server_url";
+    public static final String KEY_PREF_OWNCLOUD_USER_NAME = "pref_user_name";
+    public static final String KEY_PREF_OWNCLOUD_PASSWORD = "pref_password";
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudProvider.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudProvider.java
index db2b698..a94e1ad 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudProvider.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudProvider.java
@@ -4,11 +4,14 @@ import java.io.File;
 import java.net.URI;
 
 import org.libreoffice.R;
+import org.libreoffice.storage.DocumentProviderSettingsActivity;
 import org.libreoffice.storage.IDocumentProvider;
 import org.libreoffice.storage.IFile;
 
 import android.content.Context;
+import android.content.SharedPreferences;
 import android.net.Uri;
+import android.preference.PreferenceManager;
 
 import com.owncloud.android.lib.common.OwnCloudClient;
 import com.owncloud.android.lib.common.OwnCloudClientFactory;
@@ -26,12 +29,20 @@ public class OwnCloudProvider implements IDocumentProvider {
     private OwnCloudClient client;
     private File cacheDir;
 
-    // TODO: these must be configurable
-    final private String serverUrl = "http://10.0.2.2/owncloud"; //emulator host machine
-    final private String userName = "admin";
-    final private String password = "admin";
+    private String serverUrl;
+    private String userName;
+    private String password;
 
     public OwnCloudProvider(Context context) {
+        // read preferences
+        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
+        serverUrl = preferences.getString(
+                DocumentProviderSettingsActivity.KEY_PREF_OWNCLOUD_SERVER, "");
+        userName = preferences.getString(
+                DocumentProviderSettingsActivity.KEY_PREF_OWNCLOUD_USER_NAME, "");
+        password = preferences.getString(
+                DocumentProviderSettingsActivity.KEY_PREF_OWNCLOUD_PASSWORD, "");
+
         Uri serverUri = Uri.parse(serverUrl);
         client = OwnCloudClientFactory.createOwnCloudClient(serverUri,
                 context, true);
commit d2382ad916b11dc1ac93410168e68aea4eaa0905
Author: Jacobo Aragunde Pérez <jaragunde at igalia.com>
Date:   Mon Feb 9 12:37:46 2015 +0100

    Android: settings activity for document providers
    
    Creates an activity to manage the settings of any document provider
    that needs them, and populated it with the settings required by the
    ownCloud implementation.
    
    The settings screen is not yet plugged to the document browser UI but
    can be launched with this command:
    
      adb shell am start -a android.intent.action.MAIN \
      -n org.libreoffice/.storage.DocumentProviderSettingsActivity
    
    Change-Id: I83cff641fa61078f2bddbb98262af989c06985a9

diff --git a/android/experimental/LOAndroid3/AndroidManifest.xml.in b/android/experimental/LOAndroid3/AndroidManifest.xml.in
index cc61db5..fc6958b 100644
--- a/android/experimental/LOAndroid3/AndroidManifest.xml.in
+++ b/android/experimental/LOAndroid3/AndroidManifest.xml.in
@@ -99,6 +99,14 @@
             </intent-filter>
         </activity>
 
+        <!-- Document Provider Settings Activity -->
+        <activity android:name=".storage.DocumentProviderSettingsActivity"
+                  android:label="@string/storage_provider_settings">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
+
     </application>
 
 </manifest>
diff --git a/android/experimental/LOAndroid3/res/values/strings.xml b/android/experimental/LOAndroid3/res/values/strings.xml
index 50cd31e..336b19b 100644
--- a/android/experimental/LOAndroid3/res/values/strings.xml
+++ b/android/experimental/LOAndroid3/res/values/strings.xml
@@ -36,4 +36,12 @@
     <string name="local_file_system">Local file system</string>
     <string name="owncloud">ownCloud</string>
 
+    <!-- Document provider settings -->
+    <string name="storage_provider_settings">Storage provider settings</string>
+    <string name="owncloud_settings">ownCloud settings</string>
+    <string name="server_url">Server URL</string>
+    <string name="server_url_and_port">URL and port of the ownCloud server.</string>
+    <string name="user_name">User name</string>
+    <string name="password">Password</string>
+
 </resources>
diff --git a/android/experimental/LOAndroid3/res/xml/documentprovider_preferences.xml b/android/experimental/LOAndroid3/res/xml/documentprovider_preferences.xml
new file mode 100644
index 0000000..a359d14
--- /dev/null
+++ b/android/experimental/LOAndroid3/res/xml/documentprovider_preferences.xml
@@ -0,0 +1,26 @@
+<?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/.
+ -->
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+    <PreferenceCategory
+        android:title="@string/owncloud_settings"
+        android:key="pref_key_owncloud_settings">
+        <EditTextPreference
+            android:key="pref_server_url"
+            android:title="@string/server_url"
+            android:summary="@string/server_url_and_port"
+            android:defaultValue="http://" />
+        <EditTextPreference
+            android:key="pref_user_name"
+            android:title="@string/user_name"
+            android:defaultValue="" />
+        <EditTextPreference
+            android:key="pref_password"
+            android:title="@string/password"
+            android:defaultValue="" />
+    </PreferenceCategory>
+</PreferenceScreen>
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/DocumentProviderSettingsActivity.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/DocumentProviderSettingsActivity.java
new file mode 100644
index 0000000..bb04855
--- /dev/null
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/DocumentProviderSettingsActivity.java
@@ -0,0 +1,37 @@
+/* -*- 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.storage;
+
+import org.libreoffice.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.preference.PreferenceFragment;
+
+public class DocumentProviderSettingsActivity extends Activity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        // Display the fragment as the main content.
+        getFragmentManager().beginTransaction()
+                .replace(android.R.id.content, new SettingsFragment()).commit();
+    }
+
+    public static class SettingsFragment extends PreferenceFragment {
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+
+            // Load the preferences from an XML resource
+            addPreferencesFromResource(R.xml.documentprovider_preferences);
+        }
+    }
+}
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java
index 24cff82..7296e83 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java
@@ -111,6 +111,8 @@ public class LibreOfficeUIActivity extends LOAbout implements ActionBar.OnNaviga
         DocumentProviderFactory.initialize(this);
         documentProviderFactory = DocumentProviderFactory.getInstance();
 
+        PreferenceManager.setDefaultValues(this, R.xml.documentprovider_preferences, false);
+
         // init UI and populate with contents from the provider
         createUI();
         switchToDocumentProvider(documentProviderFactory.getDefaultProvider());
commit cfb85d4ecd3db935d9ce06860b53d8c26410b5b3
Author: Jacobo Aragunde Pérez <jaragunde at igalia.com>
Date:   Tue Jan 27 12:44:42 2015 +0000

    Android: download documents from ownCloud.
    
    Documents are downloaded to the private cache directory of the app,
    and opened from there. That directory is cleared and created again
    every time the application starts up.
    
    Change-Id: I5c05c8ae750b6ced3b419c67d84063e8ee3d84aa

diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudFile.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudFile.java
index 8e6d6cf..a8d1a06 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudFile.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudFile.java
@@ -10,6 +10,7 @@ import java.util.List;
 import org.libreoffice.storage.IFile;
 
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.resources.files.DownloadRemoteFileOperation;
 import com.owncloud.android.lib.resources.files.ReadRemoteFolderOperation;
 import com.owncloud.android.lib.resources.files.RemoteFile;
 
@@ -97,8 +98,14 @@ public class OwnCloudFile implements IFile {
 
     @Override
     public File getDocument() {
-        // TODO Auto-generated method stub
-        return null;
+        if (isDirectory()) {
+            return null;
+        }
+        File downFolder = provider.getCacheDir();
+        DownloadRemoteFileOperation operation = new DownloadRemoteFileOperation(
+                file.getRemotePath(), downFolder.getAbsolutePath());
+        operation.execute(provider.getClient());
+        return new File(downFolder.getAbsolutePath() + file.getRemotePath());
     }
 
     @Override
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudProvider.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudProvider.java
index 7bd78e3..db2b698 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudProvider.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudProvider.java
@@ -1,5 +1,6 @@
 package org.libreoffice.storage.owncloud;
 
+import java.io.File;
 import java.net.URI;
 
 import org.libreoffice.R;
@@ -23,6 +24,7 @@ import com.owncloud.android.lib.resources.files.RemoteFile;
 public class OwnCloudProvider implements IDocumentProvider {
 
     private OwnCloudClient client;
+    private File cacheDir;
 
     // TODO: these must be configurable
     final private String serverUrl = "http://10.0.2.2/owncloud"; //emulator host machine
@@ -36,6 +38,13 @@ public class OwnCloudProvider implements IDocumentProvider {
         client.setCredentials(OwnCloudCredentialsFactory.newBasicCredentials(
                 userName, password));
 
+        // make sure cache directory exists, and clear it
+        // TODO: probably we should do smarter cache management
+        cacheDir = new File(context.getCacheDir(), "ownCloud");
+        if (cacheDir.exists()) {
+            deleteRecursive(cacheDir);
+        }
+        cacheDir.mkdirs();
     }
 
     @Override
@@ -73,4 +82,27 @@ public class OwnCloudProvider implements IDocumentProvider {
         return client;
     }
 
+    /**
+     * Used by OwnCloudFiles to get the cache directory they should download
+     * files to.
+     *
+     * @return cache directory.
+     */
+    protected File getCacheDir() {
+        return cacheDir;
+    }
+
+    /**
+     * Deletes files and recursively deletes directories.
+     *
+     * @param file
+     *            File or directory to be deleted.
+     */
+    private void deleteRecursive(File file) {
+        if (file.isDirectory()) {
+            for (File child : file.listFiles())
+                deleteRecursive(child);
+        }
+        file.delete();
+    }
 }
commit 2f8628773c8875948903c643b6c4bd9f3dff863c
Author: Jacobo Aragunde Pérez <jaragunde at igalia.com>
Date:   Wed Jan 21 13:05:41 2015 +0000

    Android: initial implementation of ownCloud provider.
    
    This implementation can connect to a local server and browser its
    contents, but cannot download and open the documents yet.
    
    TODO:
    
    * Download and open documents.
    * UI to configure server, user and password.
    * Implement filtering to show only the documents of the desired type.
    * Improve error handling.
    
    Change-Id: I54a2e2e1d3e8ec8d824d75639e176ca452551f3e

diff --git a/android/experimental/LOAndroid3/AndroidManifest.xml.in b/android/experimental/LOAndroid3/AndroidManifest.xml.in
index 244c6db..cc61db5 100644
--- a/android/experimental/LOAndroid3/AndroidManifest.xml.in
+++ b/android/experimental/LOAndroid3/AndroidManifest.xml.in
@@ -9,6 +9,7 @@
     <uses-feature android:glEsVersion="0x00020000" android:required="true" />
     <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17"/>
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+    <uses-permission android:name="android.permission.INTERNET" />
 
     <application
         @ANDROID_DEBUGGABLE@
diff --git a/android/experimental/LOAndroid3/res/values/strings.xml b/android/experimental/LOAndroid3/res/values/strings.xml
index 5e5e80e..50cd31e 100644
--- a/android/experimental/LOAndroid3/res/values/strings.xml
+++ b/android/experimental/LOAndroid3/res/values/strings.xml
@@ -34,5 +34,6 @@
     <!-- Document provider names -->
     <string name="local_documents">Local documents</string>
     <string name="local_file_system">Local file system</string>
+    <string name="owncloud">ownCloud</string>
 
 </resources>
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/DocumentProviderFactory.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/DocumentProviderFactory.java
index 9aa1973..3d462e6 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/DocumentProviderFactory.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/DocumentProviderFactory.java
@@ -11,6 +11,7 @@ package org.libreoffice.storage;
 
 import org.libreoffice.storage.local.LocalDocumentsDirectoryProvider;
 import org.libreoffice.storage.local.LocalDocumentsProvider;
+import org.libreoffice.storage.owncloud.OwnCloudProvider;
 
 import android.content.Context;
 
@@ -30,8 +31,7 @@ public final class DocumentProviderFactory {
      */
     private static DocumentProviderFactory instance = null;
 
-    private IDocumentProvider[] providers = {
-            new LocalDocumentsDirectoryProvider(), new LocalDocumentsProvider() };
+    private IDocumentProvider[] providers;
 
     private String[] providerNames;
 
@@ -52,6 +52,12 @@ public final class DocumentProviderFactory {
             instance = new DocumentProviderFactory();
 
             // initialize document providers list
+            instance.providers = new IDocumentProvider[3];
+            instance.providers[0] = new LocalDocumentsDirectoryProvider();
+            instance.providers[1] = new LocalDocumentsProvider();
+            instance.providers[2] = new OwnCloudProvider(context);
+
+            // initialize document provider names list
             instance.providerNames = new String[instance.providers.length];
             for (int i = 0; i < instance.providers.length; i++) {
                 instance.providerNames[i] = context.getString(instance
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudFile.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudFile.java
new file mode 100644
index 0000000..8e6d6cf
--- /dev/null
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudFile.java
@@ -0,0 +1,113 @@
+package org.libreoffice.storage.owncloud;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.libreoffice.storage.IFile;
+
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.resources.files.ReadRemoteFolderOperation;
+import com.owncloud.android.lib.resources.files.RemoteFile;
+
+/**
+ * Implementation of IFile for ownCloud servers.
+ */
+public class OwnCloudFile implements IFile {
+
+    private OwnCloudProvider provider;
+    private RemoteFile file;
+
+    private String name;
+    private String parentPath;
+
+    protected OwnCloudFile(OwnCloudProvider provider, RemoteFile file) {
+        this.provider = provider;
+        this.file = file;
+
+        // get name and parent from path
+        File localFile = new File(file.getRemotePath());
+        this.name = localFile.getName();
+        this.parentPath = localFile.getParent();
+    }
+
+    @Override
+    public URI getUri() {
+        return URI.create(file.getRemotePath());
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public boolean isDirectory() {
+        return file.getMimeType().equals("DIR");
+    }
+
+    @Override
+    public long getSize() {
+        return file.getLength();
+    }
+
+    @Override
+    public Date getLastModified() {
+        return new Date(file.getModifiedTimestamp());
+    }
+
+    @Override
+    public List<IFile> listFiles() {
+        List<IFile> children = new ArrayList<IFile>();
+        if (isDirectory()) {
+            ReadRemoteFolderOperation refreshOperation = new ReadRemoteFolderOperation(
+                    file.getRemotePath());
+            RemoteOperationResult result = refreshOperation.execute(provider
+                    .getClient());
+            if (!result.isSuccess()) {
+                throw new RuntimeException(result.getLogMessage(),
+                        result.getException());
+            }
+            for (Object obj : result.getData()) {
+                RemoteFile child = (RemoteFile) obj;
+                if (!child.getRemotePath().equals(file.getRemotePath()))
+                    children.add(new OwnCloudFile(provider, child));
+            }
+        }
+        return children;
+    }
+
+    @Override
+    public List<IFile> listFiles(FileFilter filter) {
+        // TODO no filtering yet
+        return listFiles();
+    }
+
+    @Override
+    public IFile getParent() {
+        if (parentPath == null)
+            // this is the root node
+            return null;
+
+        return provider.createFromUri(URI.create(parentPath));
+    }
+
+    @Override
+    public File getDocument() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object)
+            return true;
+        if (!(object instanceof OwnCloudFile))
+            return false;
+        OwnCloudFile file = (OwnCloudFile) object;
+        return file.getUri().equals(getUri());
+    }
+}
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudProvider.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudProvider.java
new file mode 100644
index 0000000..7bd78e3
--- /dev/null
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/storage/owncloud/OwnCloudProvider.java
@@ -0,0 +1,76 @@
+package org.libreoffice.storage.owncloud;
+
+import java.net.URI;
+
+import org.libreoffice.R;
+import org.libreoffice.storage.IDocumentProvider;
+import org.libreoffice.storage.IFile;
+
+import android.content.Context;
+import android.net.Uri;
+
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.lib.common.OwnCloudClientFactory;
+import com.owncloud.android.lib.common.OwnCloudCredentialsFactory;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.resources.files.FileUtils;
+import com.owncloud.android.lib.resources.files.ReadRemoteFileOperation;
+import com.owncloud.android.lib.resources.files.RemoteFile;
+
+/**
+ * Implementation of IDocumentProvider for ownCloud servers.
+ */
+public class OwnCloudProvider implements IDocumentProvider {
+
+    private OwnCloudClient client;
+
+    // TODO: these must be configurable
+    final private String serverUrl = "http://10.0.2.2/owncloud"; //emulator host machine
+    final private String userName = "admin";
+    final private String password = "admin";
+
+    public OwnCloudProvider(Context context) {
+        Uri serverUri = Uri.parse(serverUrl);
+        client = OwnCloudClientFactory.createOwnCloudClient(serverUri,
+                context, true);
+        client.setCredentials(OwnCloudCredentialsFactory.newBasicCredentials(
+                userName, password));
+
+    }
+
+    @Override
+    public IFile getRootDirectory() {
+        return createFromUri(URI.create(FileUtils.PATH_SEPARATOR));
+    }
+
+    @Override
+    public IFile createFromUri(URI uri) {
+        ReadRemoteFileOperation refreshOperation = new ReadRemoteFileOperation(
+                uri.getPath());
+        RemoteOperationResult result = refreshOperation.execute(client);
+        if (!result.isSuccess()) {
+            throw new RuntimeException(result.getLogMessage(),
+                    result.getException());
+        }
+        if (result.getData().size() > 0) {
+            return new OwnCloudFile(this, (RemoteFile) result.getData().get(0));
+        }
+        return null;
+    }
+
+    @Override
+    public int getNameResource() {
+        return R.string.owncloud;
+    }
+
+    /**
+     * Used by OwnCloudFiles to get a configured client to run their own
+     * operations.
+     *
+     * @return configured OwnCloudClient.
+     */
+    protected OwnCloudClient getClient() {
+        return client;
+    }
+
+}
commit 5654e0f6afd93b371954456523460397564b4602
Author: Jacobo Aragunde Pérez <jaragunde at igalia.com>
Date:   Tue Feb 10 18:42:40 2015 +0100

    Android: fix share feature for .odp/.odt files
    
    Added our own map of MIME types because we cannot rely on Android's.
    
    Change-Id: I11d4b639f42d30aa8adb0ea092797fb30b4fc8b9

diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/FileUtilities.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/FileUtilities.java
index f658d92..118eded 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/FileUtilities.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/FileUtilities.java
@@ -18,6 +18,7 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Comparator;
 import android.util.Log;
+import android.webkit.MimeTypeMap;
 
 public class FileUtilities {
     static final int ALL = -1;
@@ -42,6 +43,7 @@ public class FileUtilities {
     static final int SORT_SMALLEST = 5;
 
     private static final Map<String,Integer> mExtnMap = new HashMap<String,Integer>();
+    private static final Map<String, String> extensionToMimeTypeMap = new HashMap<String, String>();
     static {
         // Please keep this in sync with AndroidManifest.xml
 
@@ -97,6 +99,22 @@ public class FileUtilities {
         mExtnMap.put(".svm",  DRAWING);
         mExtnMap.put(".wmf",  DRAWING);
         mExtnMap.put(".svg",  DRAWING);
+
+        // Some basic MIME types
+        // Android's MimeTypeMap lacks some types that we need
+        extensionToMimeTypeMap.put("odb", "application/vnd.oasis.opendocument.database");
+        extensionToMimeTypeMap.put("odf", "application/vnd.oasis.opendocument.formula");
+        extensionToMimeTypeMap.put("odg", "application/vnd.oasis.opendocument.graphics");
+        extensionToMimeTypeMap.put("otg", "application/vnd.oasis.opendocument.graphics-template");
+        extensionToMimeTypeMap.put("odi", "application/vnd.oasis.opendocument.image");
+        extensionToMimeTypeMap.put("odp", "application/vnd.oasis.opendocument.presentation");
+        extensionToMimeTypeMap.put("otp", "application/vnd.oasis.opendocument.presentation-template");
+        extensionToMimeTypeMap.put("ods", "application/vnd.oasis.opendocument.spreadsheet");
+        extensionToMimeTypeMap.put("ots", "application/vnd.oasis.opendocument.spreadsheet-template");
+        extensionToMimeTypeMap.put("odt", "application/vnd.oasis.opendocument.text");
+        extensionToMimeTypeMap.put("odm", "application/vnd.oasis.opendocument.text-master");
+        extensionToMimeTypeMap.put("ott", "application/vnd.oasis.opendocument.text-template");
+        extensionToMimeTypeMap.put("oth", "application/vnd.oasis.opendocument.text-web");
     }
 
     private static final String getExtension(String filename)
@@ -124,6 +142,18 @@ public class FileUtilities {
         return type;
     }
 
+    static String getMimeType(String filename)
+    {
+        String extension = MimeTypeMap.getFileExtensionFromUrl(filename);
+        String mime = extensionToMimeTypeMap.get(extension);
+        if(mime == null) {
+            //fallback to Android's MimeTypeMap
+            mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
+                    extension);
+        }
+        return mime;
+    }
+
     // Filter by mode, and/or in future by filename/wildcard
     static private boolean doAccept(String filename, int byMode, String byFilename)
     {
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java
index 25870c0..24cff82 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java
@@ -54,7 +54,6 @@ import android.view.View;
 import android.view.View.OnLongClickListener;
 import android.view.ViewGroup;
 import android.view.View.OnClickListener;
-import android.webkit.MimeTypeMap;
 import android.widget.AdapterView;
 import android.widget.AdapterView.AdapterContextMenuInfo;
 import android.widget.AdapterView.OnItemClickListener;
@@ -321,9 +320,7 @@ public class LibreOfficeUIActivity extends LOAbout implements ActionBar.OnNaviga
         File file = filePaths.get(position).getDocument();
         Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
         Uri uri = Uri.fromFile(file);
-        String extension = MimeTypeMap.getFileExtensionFromUrl(uri.toString());
-        sharingIntent.setType(MimeTypeMap.getSingleton()
-                .getMimeTypeFromExtension(extension));
+        sharingIntent.setType(FileUtilities.getMimeType(file.getName()));
         sharingIntent.putExtra(android.content.Intent.EXTRA_STREAM, uri);
         sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,
                 file.getName());
commit b91116afb16139208fb5a4bccf45b4e06df77c8a
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Tue Feb 10 17:04:14 2015 +0000

    set ok button as fontwork gallery dialog as the default button
    
    Change-Id: I965405ab5821e86b2fa93b42db50e36dc9dbd0ad

diff --git a/svx/uiconfig/ui/fontworkgallerydialog.ui b/svx/uiconfig/ui/fontworkgallerydialog.ui
index 5ab4acf..7d94186 100644
--- a/svx/uiconfig/ui/fontworkgallerydialog.ui
+++ b/svx/uiconfig/ui/fontworkgallerydialog.ui
@@ -24,6 +24,8 @@
                 <property name="use_action_appearance">False</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
                 <property name="receives_default">True</property>
                 <property name="use_stock">True</property>
               </object>
commit cdd8ab7e0caa5b6845581afd5fc69bc69b5589df
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Tue Feb 10 17:57:48 2015 +0100

    ...next attempt at getting this through both GCC 5 and MSVC
    
    Change-Id: Id367dee6c4fe55fe039ebf28603c883014194832

diff --git a/external/liborcus/liborcus_0.7.0-configure.gcc5.patch.0 b/external/liborcus/liborcus_0.7.0-configure.gcc5.patch.0
index 1827a34..79d372c 100644
--- a/external/liborcus/liborcus_0.7.0-configure.gcc5.patch.0
+++ b/external/liborcus/liborcus_0.7.0-configure.gcc5.patch.0
@@ -296,7 +296,7 @@
  boost_save_IFS=$IFS
  boost_version_req=1.36
  IFS=.
-@@ -16193,17 +16356,28 @@ $as_echo_n "checking for Boost's header
+@@ -16193,17 +16356,30 @@ $as_echo_n "checking for Boost's header
  if ${boost_cv_lib_version+:} false; then :
    $as_echo_n "(cached) " >&6
  else
@@ -313,9 +313,11 @@
  _ACEOF
  if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
 +  grep -v '#' |
++  grep -Ev '^(conftest.cpp| *command-line arguments :)' |
    tr -d '\r' |
 -  $SED -n -e "/^boost-lib-version = /{s///;s/\"//g;p;q;}" >conftest.i 2>&1; then :
-+  $SED -n -e "/^boost-lib-version = /{s///;s/[\" ]//g;p;q;}" >conftest.i 2>&1; then :
++  tr -s '\n' ' ' |
++  $SED -n -e "/^ *boost-lib-version = /{s///;s/[\" ]//g;p;q;}" >conftest.i 2>&1; then :
    boost_cv_lib_version=`cat conftest.i`
  fi
  rm -rf conftest*
commit 4f405d8c1ff84a0db35c9a771776d170f628df57
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Tue Feb 10 16:30:46 2015 +0000

    OSL_ENSURE -> assert when followed by unconditional dereference
    
    Change-Id: Ic118450e11ca6a4f705670dd71015ff74072fa05

diff --git a/sw/source/core/layout/pagechg.cxx b/sw/source/core/layout/pagechg.cxx
index ceb3269..66e85f4 100644
--- a/sw/source/core/layout/pagechg.cxx
+++ b/sw/source/core/layout/pagechg.cxx
@@ -542,7 +542,7 @@ void SwPageFrm::_UpdateAttr( const SfxPoolItem *pOld, const SfxPoolItem *pNew,
             if( rOldCol != rNewCol )
             {
                 SwLayoutFrm *pB = FindBodyCont();
-                OSL_ENSURE( pB, "Seite ohne Body." );
+                assert(pB && "Page without Body.");
                 pB->ChgColumns( rOldCol, rNewCol );
                 rInvFlags |= 0x20;
             }
@@ -948,7 +948,7 @@ void SwPageFrm::PrepareRegisterChg()
  */
 void SwFrm::CheckPageDescs( SwPageFrm *pStart, bool bNotifyFields, SwPageFrm** ppPrev )
 {
-    OSL_ENSURE( pStart, "no starting page." );
+    assert(pStart && "no starting page.");
 
     SwViewShell *pSh   = pStart->getRootFrm()->GetCurrShell();
     SwViewImp *pImp  = pSh ? pSh->Imp() : 0;
@@ -1161,7 +1161,7 @@ SwPageFrm *SwFrm::InsertPage( SwPageFrm *pPrevPage, bool bFtn )
     if ( !pDesc )
         pDesc = pPrevPage->GetPageDesc()->GetFollow();
 
-    OSL_ENSURE( pDesc, "Missing PageDesc" );
+    assert(pDesc && "Missing PageDesc");
     if( !(bWishedOdd ? pDesc->GetRightFmt() : pDesc->GetLeftFmt()) )
         bWishedOdd = !bWishedOdd;
     bool const bWishedFirst = pDesc != pPrevPage->GetPageDesc();
@@ -1865,7 +1865,7 @@ void SwRootFrm::CheckViewLayout( const SwViewOption* pViewOpt, const SwRect* pVi
     }
     else
     {
-        OSL_ENSURE( pViewOpt, "CheckViewLayout required ViewOptions" );
+        assert(pViewOpt && "CheckViewLayout required ViewOptions");
 
         const sal_uInt16 nColumns =  pViewOpt->GetViewLayoutColumns();
         const bool   bBookMode = pViewOpt->IsViewLayoutBookMode();
commit 233da237ad4b593c945903c3b32185a540025516
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Tue Feb 10 16:05:58 2015 +0000

    Resolves: tdf#87083 images in help html stuck at default placeholder size
    
    regression from the SwapIn work.
    
    The graphic size during SetGrfFlySize appears to assume its the pre-swapped in
    size, i.e. the old 0 by 0 "size is not set" for an html image used to be the
    value used here. So get that value (and update it if necessary) before updating
    the image data and pass that to SetGrfFlySize
    
    Without the swap-in in the html filter the data gets swapped in during the
    initial draw of the image which is too late to update the image size, so
    restore the equivalent of that swap-in via GetTwipSize
    
    commit 61a5abd5fab308c9e6580e752fa846f5bf0d7e51
    Author: Zolnai Tamás <tamas.zolnai at collabora.com>
    Date:   Fri Nov 7 10:43:34 2014 +0100
    
        Make SwGrfNode swapping methods private
    
        Change the filter test accordingly.
    
        Change-Id: Ide3043f2f245c097a7b4c07ba2e0713510296b3e
    
    Change-Id: I0afe244f79d8628236b1e552036587a2b4540a76

diff --git a/sw/source/core/docnode/swbaslnk.cxx b/sw/source/core/docnode/swbaslnk.cxx
index f52e285..85ec6f8 100644
--- a/sw/source/core/docnode/swbaslnk.cxx
+++ b/sw/source/core/docnode/swbaslnk.cxx
@@ -53,7 +53,7 @@
 
 using namespace com::sun::star;
 
-static bool SetGrfFlySize( const Size& rGrfSz, const Size& rFrmSz, SwGrfNode* pGrfNd );
+static bool SetGrfFlySize( const Size& rGrfSz, const Size& rFrmSz, SwGrfNode* pGrfNd, const Size &rOrigGrfSize );
 
 TYPEINIT1( SwBaseLink, ::sfx2::SvBaseLink );
 
@@ -103,6 +103,7 @@ static void lcl_CallModify( SwGrfNode& rGrfNd, SfxPoolItem& rItem )
     {
         // Only a status change - serve Events?
         OUString sState;
+
         if( rValue.hasValue() && ( rValue >>= sState ))
         {
             sal_uInt16 nEvent = 0;
@@ -128,12 +129,15 @@ static void lcl_CallModify( SwGrfNode& rGrfNd, SfxPoolItem& rItem )
     bool bGraphicArrived = false;
     bool bGraphicPieceArrived = false;
     bool bDontNotify = false;
-    Size aGrfSz, aFrmFmtSz;
+    Size aGrfSz, aOldSz, aFrmFmtSz;
+
+    SwGrfNode* pSwGrfNode = NULL;
 
-    if( pCntntNode->IsGrfNode() )
+    if (pCntntNode->IsGrfNode())
     {
-        SwGrfNode* pSwGrfNode = pCntntNode->GetGrfNode();
-        OSL_ENSURE(pSwGrfNode, "Error, pSwGrfNode expected when node answers IsGrfNode() with true (!)");
+        pSwGrfNode = pCntntNode->GetGrfNode();
+        assert(pSwGrfNode && "Error, pSwGrfNode expected when node answers IsGrfNode() with true (!)");
+        aOldSz = pSwGrfNode->GetTwipSize();
         const GraphicObject& rGrfObj = pSwGrfNode->GetGrfObj();
 
         bDontNotify = pSwGrfNode->IsFrameInPaint();
@@ -143,6 +147,7 @@ static void lcl_CallModify( SwGrfNode& rGrfNd, SfxPoolItem& rItem )
         pSwGrfNode->SetGraphicArrived( bGraphicArrived );
 
         Graphic aGrf;
+
         if( sfx2::LinkManager::GetGraphicFromAny( rMimeType, rValue, aGrf ) &&
             ( GRAPHIC_DEFAULT != aGrf.GetType() ||
               GRAPHIC_DEFAULT != rGrfObj.GetType() ) )
@@ -159,10 +164,9 @@ static void lcl_CallModify( SwGrfNode& rGrfNd, SfxPoolItem& rItem )
             {
                 aFrmFmtSz = aGrfSz;
             }
-            Size aSz( pSwGrfNode->GetTwipSize() );
 
             if( bGraphicPieceArrived && GRAPHIC_DEFAULT != aGrf.GetType() &&
-                ( !aSz.Width() || !aSz.Height() ) )
+                ( !aOldSz.Width() || !aOldSz.Height() ) )
             {
                 // If only a part arrives, but the size is not set
                 // we need to go through bGraphicArrived down there.
@@ -181,9 +185,12 @@ static void lcl_CallModify( SwGrfNode& rGrfNd, SfxPoolItem& rItem )
             {
                 // Always use the correct graphic size
                 if( aGrfSz.Height() && aGrfSz.Width() &&
-                    aSz.Height() && aSz.Width() &&
-                    aGrfSz != aSz )
+                    aOldSz.Height() && aOldSz.Width() &&
+                    aGrfSz != aOldSz )
+                {
                     pSwGrfNode->SetTwipSize( aGrfSz );
+                    aOldSz = aGrfSz;
+                }
             }
         }
         if ( bUpdate && !bGraphicArrived && !bGraphicPieceArrived )
@@ -244,6 +251,8 @@ static void lcl_CallModify( SwGrfNode& rGrfNd, SfxPoolItem& rItem )
                         ( !bSwapIn ||
                             GRAPHIC_DEFAULT == pGrfNd->GetGrfObj().GetType()))
                     {
+                        Size aPreArriveSize(pGrfNd->GetTwipSize());
+
                         pBLink->bIgnoreDataChanged = false;
                         pBLink->DataChanged( rMimeType, rValue );
                         pBLink->bIgnoreDataChanged = true;
@@ -252,13 +261,18 @@ static void lcl_CallModify( SwGrfNode& rGrfNd, SfxPoolItem& rItem )
                                                     IsGraphicArrived() );
 
                         // Adjust the Fly's graphic
-                        if( !::SetGrfFlySize( aGrfSz, aFrmFmtSz, pGrfNd ) )
+                        if (!::SetGrfFlySize(aGrfSz, aFrmFmtSz, pGrfNd, aPreArriveSize))
                             ::lcl_CallModify( *pGrfNd, aMsgHint );
                     }
-                    else if( pBLink == this &&
-                            !::SetGrfFlySize( aGrfSz, aFrmFmtSz, pGrfNd ) )
-                        // Adjust the Fly's graphic
-                        ::lcl_CallModify( *pGrfNd, aMsgHint );
+                    else if (pBLink == this)
+                    {
+                        assert(pGrfNd == pSwGrfNode && "fdo#87083 needs a different fix");
+                        if (!::SetGrfFlySize(aGrfSz, aFrmFmtSz, pGrfNd, aOldSz))
+                        {
+                            // Adjust the Fly's graphic
+                            ::lcl_CallModify( *pGrfNd, aMsgHint );
+                        }
+                    }
                 }
             }
 
@@ -286,7 +300,7 @@ static void lcl_CallModify( SwGrfNode& rGrfNd, SfxPoolItem& rItem )
     return SUCCESS;
 }
 
-static bool SetGrfFlySize( const Size& rGrfSz, const Size& rFrmSz, SwGrfNode* pGrfNd )
+static bool SetGrfFlySize( const Size& rGrfSz, const Size& rFrmSz, SwGrfNode* pGrfNd, const Size& rOrigGrfSize )
 {
     bool bRet = false;
     SwViewShell *pSh = pGrfNd->GetDoc()->getIDocumentLayoutAccess().GetCurrentViewShell();
@@ -294,7 +308,7 @@ static bool SetGrfFlySize( const Size& rGrfSz, const Size& rFrmSz, SwGrfNode* pG
     if ( pGrfNd->GetDoc()->GetEditShell() )
         pCurr = new CurrShell( pSh );
 
-    Size aSz = pGrfNd->GetTwipSize();
+    Size aSz = rOrigGrfSize;
     if ( !(aSz.Width() && aSz.Height()) &&
             rGrfSz.Width() && rGrfSz.Height() )
     {
diff --git a/sw/source/filter/html/htmlgrin.cxx b/sw/source/filter/html/htmlgrin.cxx
index 0ca3373..cb4db4c 100644
--- a/sw/source/filter/html/htmlgrin.cxx
+++ b/sw/source/filter/html/htmlgrin.cxx
@@ -597,6 +597,7 @@ IMAGE_SETEVENT:
     Size aGrfSz( 0, 0 );
     bool bSetTwipSize = true;       // Twip-Size am Node setzen?
     bool bChangeFrmSize = false;    // Frame-Format nachtraeglich anpassen?
+    bool bRequestGrfNow = false;
     bool bSetScaleImageMap = false;
     sal_uInt8 nPrcWidth = 0, nPrcHeight = 0;
 
@@ -608,6 +609,7 @@ IMAGE_SETEVENT:
         // Tabelle layoutet wird.
         if( pTable!=0 && !nWidth )
         {
+            bRequestGrfNow = true;
             IncGrfsThatResizeTable();
         }
 
@@ -811,6 +813,15 @@ IMAGE_SETEVENT:
     if( !aMacroItem.GetMacroTable().empty() )
         pFlyFmt->SetFmtAttr( aMacroItem );
 
+    // tdf#87083 If the graphic has not been loaded yet, then load it now.
+    // Otherwise it may be loaded during the first paint of the object and it
+    // will be too late to adapt the size of the graphic at that point.
+    if (bRequestGrfNow && pGrfNd)
+    {
+        Size aUpdatedSize = pGrfNd->GetTwipSize();  //trigger a swap-in
+        SAL_WARN_IF(!aUpdatedSize.Width() || !aUpdatedSize.Width(), "sw.html", "html image with no width or height");
+    }
+
     // Ggf. Frames anlegen und Auto-gebundenen Rahmen registrieren
     RegisterFlyFrm( pFlyFmt );
 
commit 8c8e536c2c36cdf31494e7b9b9c0871169ed043c
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Tue Feb 10 13:35:17 2015 +0000

    coverity#1267630 Logically dead code
    
    Change-Id: Idf857f5681766923675bdc210c02a796e0f58024

diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx
index 80e1478..5a6475f 100644
--- a/vcl/source/window/builder.cxx
+++ b/vcl/source/window/builder.cxx
@@ -2031,7 +2031,6 @@ void VclBuilder::handleChild(vcl::Window *pParent, xmlreader::XmlReader &reader)
                         else if (sInternalChild.startsWith("action_area") || sInternalChild.startsWith("messagedialog-action_area"))
                         {
                             vcl::Window *pContentArea = pCurrentChild->GetParent();
-                            assert(pContentArea && pContentArea->GetType() == WINDOW_CONTAINER);
                             if (Dialog *pBoxParent = dynamic_cast<Dialog*>(pContentArea ? pContentArea->GetParent() : NULL))
                             {
                                 pBoxParent->set_action_area(static_cast<VclButtonBox*>(pCurrentChild));
commit a5ec343f6cb522f4d41e097eda48042bf85c4578
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Tue Feb 10 17:25:41 2015 +0100

    How is that supposed to ever work?
    
    Change-Id: Ieb13095abb399662e449fad5a056999343165025

diff --git a/external/liborcus/liborcus_0.7.0-configure.gcc5.patch.0 b/external/liborcus/liborcus_0.7.0-configure.gcc5.patch.0
index a029a27..1827a34 100644
--- a/external/liborcus/liborcus_0.7.0-configure.gcc5.patch.0
+++ b/external/liborcus/liborcus_0.7.0-configure.gcc5.patch.0
@@ -296,7 +296,7 @@
  boost_save_IFS=$IFS
  boost_version_req=1.36
  IFS=.
-@@ -16193,17 +16356,29 @@ $as_echo_n "checking for Boost's header
+@@ -16193,17 +16356,28 @@ $as_echo_n "checking for Boost's header
  if ${boost_cv_lib_version+:} false; then :
    $as_echo_n "(cached) " >&6
  else
@@ -315,7 +315,6 @@
 +  grep -v '#' |
    tr -d '\r' |
 -  $SED -n -e "/^boost-lib-version = /{s///;s/\"//g;p;q;}" >conftest.i 2>&1; then :
-+  tr -s '\n' ' ' |
 +  $SED -n -e "/^boost-lib-version = /{s///;s/[\" ]//g;p;q;}" >conftest.i 2>&1; then :
    boost_cv_lib_version=`cat conftest.i`
  fi
commit d285f273adf35acc21ac6659523b28b3321b49ae
Author: Michael Stahl <mstahl at redhat.com>
Date:   Tue Feb 10 16:53:22 2015 +0100

    coverity#1267646 coverity#1267641: sw: logically dead code
    
    ... in SwPageFrm::_UpdateAttr()
    
    It looks like SwFmtChg always is sent in pairs and shouldn't contain
    null pointers.
    
    Change-Id: Ib14650d5ac7ed579af915806e738aec8a92add32

diff --git a/sw/source/core/layout/pagechg.cxx b/sw/source/core/layout/pagechg.cxx
index 0f677c5..ceb3269 100644
--- a/sw/source/core/layout/pagechg.cxx
+++ b/sw/source/core/layout/pagechg.cxx
@@ -534,33 +534,30 @@ void SwPageFrm::_UpdateAttr( const SfxPoolItem *pOld, const SfxPoolItem *pNew,
             // If the frame format is changed, several things might also change:
             // 1. columns:
             assert(pOld && pNew); //FMT_CHG Missing Format
-            const SwFmt* pOldFmt = pOld ? static_cast<const SwFmtChg*>(pOld)->pChangedFmt : NULL;
-            const SwFmt* pNewFmt = pNew ? static_cast<const SwFmtChg*>(pNew)->pChangedFmt : NULL;
+            const SwFmt *const pOldFmt = static_cast<const SwFmtChg*>(pOld)->pChangedFmt;
+            const SwFmt *const pNewFmt = static_cast<const SwFmtChg*>(pNew)->pChangedFmt;
             assert(pOldFmt && pNewFmt); //FMT_CHG Missing Format
-            if (pOldFmt && pNewFmt)
+            const SwFmtCol &rOldCol = pOldFmt->GetCol();
+            const SwFmtCol &rNewCol = pNewFmt->GetCol();
+            if( rOldCol != rNewCol )
             {
-                const SwFmtCol &rOldCol = pOldFmt->GetCol();
-                const SwFmtCol &rNewCol = pNewFmt->GetCol();
-                if( rOldCol != rNewCol )
-                {
-                    SwLayoutFrm *pB = FindBodyCont();
-                    OSL_ENSURE( pB, "Seite ohne Body." );
-                    pB->ChgColumns( rOldCol, rNewCol );
-                    rInvFlags |= 0x20;
-                }
-
-                // 2. header and footer:
-                const SwFmtHeader &rOldH = pOldFmt->GetHeader();
-                const SwFmtHeader &rNewH = pNewFmt->GetHeader();
-                if( rOldH != rNewH )
-                    rInvFlags |= 0x08;
-
-                const SwFmtFooter &rOldF = pOldFmt->GetFooter();
-                const SwFmtFooter &rNewF = pNewFmt->GetFooter();
-                if( rOldF != rNewF )
-                    rInvFlags |= 0x10;
-                CheckDirChange();
+                SwLayoutFrm *pB = FindBodyCont();
+                OSL_ENSURE( pB, "Seite ohne Body." );
+                pB->ChgColumns( rOldCol, rNewCol );
+                rInvFlags |= 0x20;
             }
+
+            // 2. header and footer:
+            const SwFmtHeader &rOldH = pOldFmt->GetHeader();
+            const SwFmtHeader &rNewH = pNewFmt->GetHeader();
+            if( rOldH != rNewH )
+                rInvFlags |= 0x08;
+
+            const SwFmtFooter &rOldF = pOldFmt->GetFooter();
+            const SwFmtFooter &rNewF = pNewFmt->GetFooter();
+            if( rOldF != rNewF )
+                rInvFlags |= 0x10;
+            CheckDirChange();
         }
         // no break
         case RES_FRM_SIZE:
commit 9665911b79b75a82d1c287826087c717b8158976
Author: Michael Stahl <mstahl at redhat.com>
Date:   Tue Feb 10 16:30:57 2015 +0100

    coverity#1267654: sw: logically dead code in SwCrsrShell::GoNextCell()
    
    IsTableMode() should imply cursor is in table.
    
    Change-Id: Ibb94911430f947038abba2ebe013fc82fae7dd54

diff --git a/sw/source/core/crsr/trvltbl.cxx b/sw/source/core/crsr/trvltbl.cxx
index fd0d20c..4b46c98 100644
--- a/sw/source/core/crsr/trvltbl.cxx
+++ b/sw/source/core/crsr/trvltbl.cxx
@@ -65,8 +65,6 @@ bool SwCrsrShell::GoNextCell( bool bAppendLine )
                 if ( !pTblNd )
                     pTblNd = IsCrsrInTbl();
                 assert (pTblNd);
-                if (!pTblNd)
-                    return false;
                 pTableBox = & pTableBox->FindEndOfRowSpan( pTblNd->GetTable(),
                                                            (sal_uInt16)(pTableBox->getRowSpan() + pCrsr->GetCrsrRowSpanOffset() ) );
                 pTableBoxStartNode = pTableBox->GetSttNd();
commit e7b9306d8b48dda16c33be84cc926fa0fd9aeac0
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Tue Feb 10 16:56:16 2015 +0100

    ...and work around AC_RUN_IFELSE not working when cross-compiling
    
    Change-Id: I7a3a9593cabec68c0d60c17a991207b5d3dab69c

diff --git a/configure.ac b/configure.ac
index 6ea2dc5..d4594e8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -12586,33 +12586,37 @@ if test "$build_os" = "cygwin"; then
 fi
 
 AC_MSG_CHECKING([whether $CXX has broken static initializer_list support])
-save_CXXFLAGS=$CXXFLAGS
-CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11"
-save_LIBS=$LIBS
-if test -n "$ILIB1"; then
-    LIBS="$LIBS $ILIB1"
+if test "$CROSS_COMPILING" = "TRUE"; then
+    broken='assuming not (cross-compiling)'
+else
+    save_CXXFLAGS=$CXXFLAGS
+    CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11"
+    save_LIBS=$LIBS
+    if test -n "$ILIB1"; then
+        LIBS="$LIBS $ILIB1"
+    fi
+    AC_LANG_PUSH([C++])
+    AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+        // Exit with failure if the static initializer_list is stored on the
+        // stack (as done by Clang < 3.4):
+        #include <initializer_list>
+        struct S {};
+        bool g(void const * p1, void const * p2) {
+            int n;
+            return !((p1 > p2 && p2 > &n) || (p1 < p2 && p2 < &n));
+        }
+        bool f(void const * p1) {
+            static std::initializer_list<S> s { S() };
+            return g(p1, s.begin());
+        }
+        ]],[[
+            int n;
+            return f(&n) ? 0 : 1;
+        ]])], [broken=no], [broken=yes])
+    AC_LANG_POP([C++])
+    LIBS=$save_LIBS
+    CXXFLAGS=$save_CXXFLAGS
 fi
-AC_LANG_PUSH([C++])
-AC_RUN_IFELSE([AC_LANG_PROGRAM([[
-    // Exit with failure if the static initializer_list is stored on the stack
-    // (as done by Clang < 3.4):
-    #include <initializer_list>
-    struct S {};
-    bool g(void const * p1, void const * p2) {
-        int n;
-        return !((p1 > p2 && p2 > &n) || (p1 < p2 && p2 < &n));
-    }
-    bool f(void const * p1) {
-        static std::initializer_list<S> s { S() };
-        return g(p1, s.begin());
-    }
-    ]],[[
-        int n;
-        return f(&n) ? 0 : 1;
-    ]])], [broken=no], [broken=yes])
-AC_LANG_POP([C++])
-LIBS=$save_LIBS
-CXXFLAGS=$save_CXXFLAGS
 AC_MSG_RESULT([$broken])
 if test "$broken" = yes; then
     AC_DEFINE([HAVE_BROKEN_STATIC_INITILIZER_LIST])
commit e83393a98ebc512fb261d52c903fb17827648d56
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Tue Feb 10 16:41:43 2015 +0100

    Make C++ AC_RUN_IFELSE check link on Windows
    
    Change-Id: Idb4e50a98a2fcdd1746ef14fc0dbe53bf1d7db8a

diff --git a/configure.ac b/configure.ac
index 8ad4f6c..6ea2dc5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -6225,34 +6225,6 @@ if test "$GCC" = "yes"; then
 fi
 AC_SUBST(HAVE_GCC_PRAGMA_OPERATOR)
 
-AC_MSG_CHECKING([whether $CXX has broken static initializer_list support])
-save_CXXFLAGS=$CXXFLAGS
-CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11"
-AC_LANG_PUSH([C++])
-AC_RUN_IFELSE([AC_LANG_PROGRAM([[
-    // Exit with failure if the static initializer_list is stored on the stack
-    // (as done by Clang < 3.4):
-    #include <initializer_list>
-    struct S {};
-    bool g(void const * p1, void const * p2) {
-        int n;
-        return !((p1 > p2 && p2 > &n) || (p1 < p2 && p2 < &n));
-    }
-    bool f(void const * p1) {
-        static std::initializer_list<S> s { S() };
-        return g(p1, s.begin());
-    }
-    ]],[[
-        int n;
-        return f(&n) ? 0 : 1;
-    ]])], [broken=no], [broken=yes])
-AC_LANG_POP([C++])
-CXXFLAGS=$save_CXXFLAGS
-AC_MSG_RESULT([$broken])
-if test "$broken" = yes; then
-    AC_DEFINE([HAVE_BROKEN_STATIC_INITILIZER_LIST])
-fi
-
 dnl ===================================================================
 dnl system stl sanity tests
 dnl ===================================================================
@@ -12582,22 +12554,30 @@ fi
 #
 # Set up ILIB for MSVC build
 #
+ILIB1=
 if test "$build_os" = "cygwin"; then
     ILIB="."
     if test -n "$JAVA_HOME" -a "$JAVA_HOME" != "NO_JAVA_HOME"; then
         ILIB="$ILIB;$JAVA_HOME/lib"
     fi
+    ILIB1=-link
     if test "$BITNESS_OVERRIDE" = 64; then
         ILIB="$ILIB;$COMPATH/lib/amd64"
+        ILIB1="$ILIB1 -LIBPATH:$COMPATH/lib/amd64"
         ILIB="$ILIB;$WINDOWS_SDK_HOME/lib/x64"
+        ILIB1="$ILIB1 -LIBPATH:$WINDOWS_SDK_HOME/lib/x64"
         if test $WINDOWS_SDK_VERSION = 80 -o $WINDOWS_SDK_VERSION = 81; then
             ILIB="$ILIB;$WINDOWS_SDK_HOME/lib/$winsdklibsubdir/um/x64"
+            ILIB1="$ILIB1 -LIBPATH:$WINDOWS_SDK_HOME/lib/$winsdklibsubdir/um/x64"
         fi
     else
         ILIB="$ILIB;$COMPATH/lib"
+        ILIB1="$ILIB1 -LIBPATH:$COMPATH/lib"
         ILIB="$ILIB;$WINDOWS_SDK_HOME/lib"
+        ILIB1="$ILIB1 -LIBPATH:$WINDOWS_SDK_HOME/lib"
         if test $WINDOWS_SDK_VERSION = 80 -o $WINDOWS_SDK_VERSION = 81; then
             ILIB="$ILIB;$WINDOWS_SDK_HOME/lib/$winsdklibsubdir/um/x86"
+            ILIB1="$ILIB1 -LIBPATH:$WINDOWS_SDK_HOME/lib/$winsdklibsubdir/um/x86"
         fi
     fi
     ILIB="$ILIB;$DOTNET_FRAMEWORK_HOME/lib"
@@ -12605,6 +12585,39 @@ if test "$build_os" = "cygwin"; then
     AC_SUBST(ILIB)
 fi
 
+AC_MSG_CHECKING([whether $CXX has broken static initializer_list support])
+save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11"
+save_LIBS=$LIBS
+if test -n "$ILIB1"; then
+    LIBS="$LIBS $ILIB1"
+fi
+AC_LANG_PUSH([C++])
+AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+    // Exit with failure if the static initializer_list is stored on the stack
+    // (as done by Clang < 3.4):
+    #include <initializer_list>
+    struct S {};
+    bool g(void const * p1, void const * p2) {
+        int n;
+        return !((p1 > p2 && p2 > &n) || (p1 < p2 && p2 < &n));
+    }
+    bool f(void const * p1) {
+        static std::initializer_list<S> s { S() };
+        return g(p1, s.begin());
+    }
+    ]],[[
+        int n;
+        return f(&n) ? 0 : 1;
+    ]])], [broken=no], [broken=yes])
+AC_LANG_POP([C++])
+LIBS=$save_LIBS
+CXXFLAGS=$save_CXXFLAGS
+AC_MSG_RESULT([$broken])
+if test "$broken" = yes; then
+    AC_DEFINE([HAVE_BROKEN_STATIC_INITILIZER_LIST])
+fi
+
 
 # ===================================================================
 # Creating bigger shared library to link against
commit 3324d52dccacff9c3d8b18fe5deb8570a713d7c1
Author: Andrew <dent.ace at gmail.com>
Date:   Sun Feb 8 12:58:24 2015 +0000

    Remove duplicate L10n icons.
    
    Remove icons that simply duplicate the default images, but are incorrectly stored in Locale specific directories (e.g. /cmd/pt-BR/). If they are removed, the default will be used anyway. De-duplication makes the task of icon theming easier TDF#30425.
    
    Galaxy - 124x removed:
    - lc_bold x10, 2.4KB. Default: 'B'.
    - sc_bold x10, 1.6KB.
    - lc_italic  x13, 2.8KB. Default: 'I'.
    - sc_italic x13, 2.1KB.
    - lc_underline x12, 2.8KB. Default: 'U'.
    - sc_underline x12, 2.0KB.
    - lc_underlinedouble x9, 2.2KB. Default: 'U'.
    - sc_underlinedouble x9, 1.7KB.
    - sc_label x26, 5.4KB. Default: 'ABC'.
    - lc_numberformatdecimal x5, 1.7KB Default: '0.0'.
    - sc_numberformatdecimal x5, 1.2KB.
    
    Check and remove corresponding icons from other themes: Crystal - 82x.
    Hicontrast - 97x.
    Human - 76x.
    Industrial - 76x.
    Oxygen - 79x.
    Tango - 81x deletions from links.txt: "# Removing language specificity…".
    Tango_testing - 25x.
    
    Change-Id: I4e42b494cbdfac2b377fae077001306778addfd0
    Signed-off-by: Andrew <dent.ace at gmail.com>
    Reviewed-on: https://gerrit.libreoffice.org/14378
    Reviewed-by: Jan Holesovsky <kendy at collabora.com>
    Tested-by: Jan Holesovsky <kendy at collabora.com>

diff --git a/icon-themes/crystal/cmd/ar/lc_bold.png b/icon-themes/crystal/cmd/ar/lc_bold.png
deleted file mode 100644
index dbfa91b..0000000
Binary files a/icon-themes/crystal/cmd/ar/lc_bold.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/ar/lc_italic.png b/icon-themes/crystal/cmd/ar/lc_italic.png
deleted file mode 100644
index ddf8a94..0000000
Binary files a/icon-themes/crystal/cmd/ar/lc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/ar/lc_underline.png b/icon-themes/crystal/cmd/ar/lc_underline.png
deleted file mode 100644
index 5dcb197..0000000
Binary files a/icon-themes/crystal/cmd/ar/lc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/ar/sc_bold.png b/icon-themes/crystal/cmd/ar/sc_bold.png
deleted file mode 100644
index 653e0d8..0000000
Binary files a/icon-themes/crystal/cmd/ar/sc_bold.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/ar/sc_italic.png b/icon-themes/crystal/cmd/ar/sc_italic.png
deleted file mode 100644
index ff09c12..0000000
Binary files a/icon-themes/crystal/cmd/ar/sc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/ar/sc_underline.png b/icon-themes/crystal/cmd/ar/sc_underline.png
deleted file mode 100644
index 8a151c2..0000000
Binary files a/icon-themes/crystal/cmd/ar/sc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/ar/sc_underlinedouble.png b/icon-themes/crystal/cmd/ar/sc_underlinedouble.png
deleted file mode 100644
index e02d401..0000000
Binary files a/icon-themes/crystal/cmd/ar/sc_underlinedouble.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/cs/lc_bold.png b/icon-themes/crystal/cmd/cs/lc_bold.png
deleted file mode 100644
index dbfa91b..0000000
Binary files a/icon-themes/crystal/cmd/cs/lc_bold.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/cs/lc_italic.png b/icon-themes/crystal/cmd/cs/lc_italic.png
deleted file mode 100644
index ddf8a94..0000000
Binary files a/icon-themes/crystal/cmd/cs/lc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/cs/lc_underline.png b/icon-themes/crystal/cmd/cs/lc_underline.png
deleted file mode 100644
index b865e1d..0000000
Binary files a/icon-themes/crystal/cmd/cs/lc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/cs/sc_bold.png b/icon-themes/crystal/cmd/cs/sc_bold.png
deleted file mode 100644
index 653e0d8..0000000
Binary files a/icon-themes/crystal/cmd/cs/sc_bold.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/cs/sc_italic.png b/icon-themes/crystal/cmd/cs/sc_italic.png
deleted file mode 100644
index ff09c12..0000000
Binary files a/icon-themes/crystal/cmd/cs/sc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/cs/sc_underline.png b/icon-themes/crystal/cmd/cs/sc_underline.png
deleted file mode 100644
index 8a151c2..0000000
Binary files a/icon-themes/crystal/cmd/cs/sc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/cs/sc_underlinedouble.png b/icon-themes/crystal/cmd/cs/sc_underlinedouble.png
deleted file mode 100644
index e02d401..0000000
Binary files a/icon-themes/crystal/cmd/cs/sc_underlinedouble.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/de/lc_underline.png b/icon-themes/crystal/cmd/de/lc_underline.png
deleted file mode 100644
index 82bd288..0000000
Binary files a/icon-themes/crystal/cmd/de/lc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/de/sc_underline.png b/icon-themes/crystal/cmd/de/sc_underline.png
deleted file mode 100644
index 8a151c2..0000000
Binary files a/icon-themes/crystal/cmd/de/sc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/de/sc_underlinedouble.png b/icon-themes/crystal/cmd/de/sc_underlinedouble.png
deleted file mode 100644
index e02d401..0000000
Binary files a/icon-themes/crystal/cmd/de/sc_underlinedouble.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/en-GB/lc_bold.png b/icon-themes/crystal/cmd/en-GB/lc_bold.png
deleted file mode 100644
index dbfa91b..0000000
Binary files a/icon-themes/crystal/cmd/en-GB/lc_bold.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/en-GB/lc_italic.png b/icon-themes/crystal/cmd/en-GB/lc_italic.png
deleted file mode 100644
index ddf8a94..0000000
Binary files a/icon-themes/crystal/cmd/en-GB/lc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/en-GB/lc_underline.png b/icon-themes/crystal/cmd/en-GB/lc_underline.png
deleted file mode 100644
index f11738d..0000000
Binary files a/icon-themes/crystal/cmd/en-GB/lc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/en-GB/sc_bold.png b/icon-themes/crystal/cmd/en-GB/sc_bold.png
deleted file mode 100644
index 653e0d8..0000000
Binary files a/icon-themes/crystal/cmd/en-GB/sc_bold.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/en-GB/sc_italic.png b/icon-themes/crystal/cmd/en-GB/sc_italic.png
deleted file mode 100644
index ff09c12..0000000
Binary files a/icon-themes/crystal/cmd/en-GB/sc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/en-GB/sc_underline.png b/icon-themes/crystal/cmd/en-GB/sc_underline.png
deleted file mode 100644
index 8a151c2..0000000
Binary files a/icon-themes/crystal/cmd/en-GB/sc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/en-GB/sc_underlinedouble.png b/icon-themes/crystal/cmd/en-GB/sc_underlinedouble.png
deleted file mode 100644
index e02d401..0000000
Binary files a/icon-themes/crystal/cmd/en-GB/sc_underlinedouble.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/et/lc_bold.png b/icon-themes/crystal/cmd/et/lc_bold.png
deleted file mode 100644
index dbfa91b..0000000
Binary files a/icon-themes/crystal/cmd/et/lc_bold.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/et/lc_italic.png b/icon-themes/crystal/cmd/et/lc_italic.png
deleted file mode 100644
index ddf8a94..0000000
Binary files a/icon-themes/crystal/cmd/et/lc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/et/lc_underline.png b/icon-themes/crystal/cmd/et/lc_underline.png
deleted file mode 100644
index 82bd288..0000000
Binary files a/icon-themes/crystal/cmd/et/lc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/et/sc_bold.png b/icon-themes/crystal/cmd/et/sc_bold.png
deleted file mode 100644
index 653e0d8..0000000
Binary files a/icon-themes/crystal/cmd/et/sc_bold.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/et/sc_italic.png b/icon-themes/crystal/cmd/et/sc_italic.png
deleted file mode 100644
index ff09c12..0000000
Binary files a/icon-themes/crystal/cmd/et/sc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/et/sc_underline.png b/icon-themes/crystal/cmd/et/sc_underline.png
deleted file mode 100644
index 8a151c2..0000000
Binary files a/icon-themes/crystal/cmd/et/sc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/et/sc_underlinedouble.png b/icon-themes/crystal/cmd/et/sc_underlinedouble.png
deleted file mode 100644
index e02d401..0000000
Binary files a/icon-themes/crystal/cmd/et/sc_underlinedouble.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/fa/lc_bold.png b/icon-themes/crystal/cmd/fa/lc_bold.png
deleted file mode 100644
index dbfa91b..0000000
Binary files a/icon-themes/crystal/cmd/fa/lc_bold.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/fa/lc_italic.png b/icon-themes/crystal/cmd/fa/lc_italic.png
deleted file mode 100644
index ddf8a94..0000000
Binary files a/icon-themes/crystal/cmd/fa/lc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/fa/lc_underline.png b/icon-themes/crystal/cmd/fa/lc_underline.png
deleted file mode 100644
index 82bd288..0000000
Binary files a/icon-themes/crystal/cmd/fa/lc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/fa/sc_bold.png b/icon-themes/crystal/cmd/fa/sc_bold.png
deleted file mode 100644
index 653e0d8..0000000
Binary files a/icon-themes/crystal/cmd/fa/sc_bold.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/fa/sc_italic.png b/icon-themes/crystal/cmd/fa/sc_italic.png
deleted file mode 100644
index ff09c12..0000000
Binary files a/icon-themes/crystal/cmd/fa/sc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/fa/sc_underline.png b/icon-themes/crystal/cmd/fa/sc_underline.png
deleted file mode 100644
index 8a151c2..0000000
Binary files a/icon-themes/crystal/cmd/fa/sc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/fa/sc_underlinedouble.png b/icon-themes/crystal/cmd/fa/sc_underlinedouble.png
deleted file mode 100644
index e02d401..0000000
Binary files a/icon-themes/crystal/cmd/fa/sc_underlinedouble.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/fr/lc_italic.png b/icon-themes/crystal/cmd/fr/lc_italic.png
deleted file mode 100644
index ddf8a94..0000000
Binary files a/icon-themes/crystal/cmd/fr/lc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/fr/sc_italic.png b/icon-themes/crystal/cmd/fr/sc_italic.png
deleted file mode 100644
index ff09c12..0000000
Binary files a/icon-themes/crystal/cmd/fr/sc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/he/lc_bold.png b/icon-themes/crystal/cmd/he/lc_bold.png
deleted file mode 100644
index dbfa91b..0000000
Binary files a/icon-themes/crystal/cmd/he/lc_bold.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/he/lc_italic.png b/icon-themes/crystal/cmd/he/lc_italic.png
deleted file mode 100644
index ddf8a94..0000000
Binary files a/icon-themes/crystal/cmd/he/lc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/he/lc_underline.png b/icon-themes/crystal/cmd/he/lc_underline.png
deleted file mode 100644
index 82bd288..0000000
Binary files a/icon-themes/crystal/cmd/he/lc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/he/sc_bold.png b/icon-themes/crystal/cmd/he/sc_bold.png
deleted file mode 100644
index 653e0d8..0000000
Binary files a/icon-themes/crystal/cmd/he/sc_bold.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/he/sc_italic.png b/icon-themes/crystal/cmd/he/sc_italic.png
deleted file mode 100644
index ff09c12..0000000
Binary files a/icon-themes/crystal/cmd/he/sc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/he/sc_underline.png b/icon-themes/crystal/cmd/he/sc_underline.png
deleted file mode 100644
index 8a151c2..0000000
Binary files a/icon-themes/crystal/cmd/he/sc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/he/sc_underlinedouble.png b/icon-themes/crystal/cmd/he/sc_underlinedouble.png
deleted file mode 100644
index e02d401..0000000
Binary files a/icon-themes/crystal/cmd/he/sc_underlinedouble.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/ja/lc_bold.png b/icon-themes/crystal/cmd/ja/lc_bold.png
deleted file mode 100644
index dbfa91b..0000000
Binary files a/icon-themes/crystal/cmd/ja/lc_bold.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/ja/lc_italic.png b/icon-themes/crystal/cmd/ja/lc_italic.png
deleted file mode 100644
index ddf8a94..0000000
Binary files a/icon-themes/crystal/cmd/ja/lc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/ja/lc_underline.png b/icon-themes/crystal/cmd/ja/lc_underline.png
deleted file mode 100644
index b865e1d..0000000
Binary files a/icon-themes/crystal/cmd/ja/lc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/ja/sc_bold.png b/icon-themes/crystal/cmd/ja/sc_bold.png
deleted file mode 100644
index 653e0d8..0000000
Binary files a/icon-themes/crystal/cmd/ja/sc_bold.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/ja/sc_italic.png b/icon-themes/crystal/cmd/ja/sc_italic.png
deleted file mode 100644
index ff09c12..0000000
Binary files a/icon-themes/crystal/cmd/ja/sc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/ja/sc_underline.png b/icon-themes/crystal/cmd/ja/sc_underline.png
deleted file mode 100644
index 8a151c2..0000000
Binary files a/icon-themes/crystal/cmd/ja/sc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/ja/sc_underlinedouble.png b/icon-themes/crystal/cmd/ja/sc_underlinedouble.png
deleted file mode 100644
index e02d401..0000000
Binary files a/icon-themes/crystal/cmd/ja/sc_underlinedouble.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/pt-BR/lc_italic.png b/icon-themes/crystal/cmd/pt-BR/lc_italic.png
deleted file mode 100644
index ddf8a94..0000000
Binary files a/icon-themes/crystal/cmd/pt-BR/lc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/pt-BR/sc_italic.png b/icon-themes/crystal/cmd/pt-BR/sc_italic.png
deleted file mode 100644
index ff09c12..0000000
Binary files a/icon-themes/crystal/cmd/pt-BR/sc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/pt/lc_italic.png b/icon-themes/crystal/cmd/pt/lc_italic.png
deleted file mode 100644
index ddf8a94..0000000
Binary files a/icon-themes/crystal/cmd/pt/lc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/pt/sc_italic.png b/icon-themes/crystal/cmd/pt/sc_italic.png
deleted file mode 100644
index ff09c12..0000000
Binary files a/icon-themes/crystal/cmd/pt/sc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/sk/lc_bold.png b/icon-themes/crystal/cmd/sk/lc_bold.png
deleted file mode 100644
index dbfa91b..0000000
Binary files a/icon-themes/crystal/cmd/sk/lc_bold.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/sk/lc_italic.png b/icon-themes/crystal/cmd/sk/lc_italic.png
deleted file mode 100644
index 5eaaccb..0000000
Binary files a/icon-themes/crystal/cmd/sk/lc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/sk/lc_underline.png b/icon-themes/crystal/cmd/sk/lc_underline.png
deleted file mode 100644
index da8e800..0000000
Binary files a/icon-themes/crystal/cmd/sk/lc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/sk/sc_bold.png b/icon-themes/crystal/cmd/sk/sc_bold.png
deleted file mode 100644
index 653e0d8..0000000
Binary files a/icon-themes/crystal/cmd/sk/sc_bold.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/sk/sc_italic.png b/icon-themes/crystal/cmd/sk/sc_italic.png
deleted file mode 100644
index ff09c12..0000000
Binary files a/icon-themes/crystal/cmd/sk/sc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/sk/sc_underline.png b/icon-themes/crystal/cmd/sk/sc_underline.png
deleted file mode 100644
index 8a151c2..0000000
Binary files a/icon-themes/crystal/cmd/sk/sc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/sk/sc_underlinedouble.png b/icon-themes/crystal/cmd/sk/sc_underlinedouble.png
deleted file mode 100644
index e02d401..0000000
Binary files a/icon-themes/crystal/cmd/sk/sc_underlinedouble.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/sv/lc_underline.png b/icon-themes/crystal/cmd/sv/lc_underline.png
deleted file mode 100644
index 82bd288..0000000
Binary files a/icon-themes/crystal/cmd/sv/lc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/sv/sc_underline.png b/icon-themes/crystal/cmd/sv/sc_underline.png
deleted file mode 100644
index 8a151c2..0000000
Binary files a/icon-themes/crystal/cmd/sv/sc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/sv/sc_underlinedouble.png b/icon-themes/crystal/cmd/sv/sc_underlinedouble.png
deleted file mode 100644
index e02d401..0000000
Binary files a/icon-themes/crystal/cmd/sv/sc_underlinedouble.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/zh-CN/lc_bold.png b/icon-themes/crystal/cmd/zh-CN/lc_bold.png
deleted file mode 100644
index dbfa91b..0000000
Binary files a/icon-themes/crystal/cmd/zh-CN/lc_bold.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/zh-CN/lc_italic.png b/icon-themes/crystal/cmd/zh-CN/lc_italic.png
deleted file mode 100644
index ddf8a94..0000000
Binary files a/icon-themes/crystal/cmd/zh-CN/lc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/zh-CN/lc_underline.png b/icon-themes/crystal/cmd/zh-CN/lc_underline.png
deleted file mode 100644
index 82bd288..0000000
Binary files a/icon-themes/crystal/cmd/zh-CN/lc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/zh-CN/sc_bold.png b/icon-themes/crystal/cmd/zh-CN/sc_bold.png
deleted file mode 100644
index 653e0d8..0000000
Binary files a/icon-themes/crystal/cmd/zh-CN/sc_bold.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/zh-CN/sc_italic.png b/icon-themes/crystal/cmd/zh-CN/sc_italic.png
deleted file mode 100644
index ff09c12..0000000
Binary files a/icon-themes/crystal/cmd/zh-CN/sc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/zh-CN/sc_underline.png b/icon-themes/crystal/cmd/zh-CN/sc_underline.png
deleted file mode 100644
index 8a151c2..0000000
Binary files a/icon-themes/crystal/cmd/zh-CN/sc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/zh-CN/sc_underlinedouble.png b/icon-themes/crystal/cmd/zh-CN/sc_underlinedouble.png
deleted file mode 100644
index e02d401..0000000
Binary files a/icon-themes/crystal/cmd/zh-CN/sc_underlinedouble.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/zh-TW/lc_bold.png b/icon-themes/crystal/cmd/zh-TW/lc_bold.png
deleted file mode 100644
index dbfa91b..0000000
Binary files a/icon-themes/crystal/cmd/zh-TW/lc_bold.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/zh-TW/lc_italic.png b/icon-themes/crystal/cmd/zh-TW/lc_italic.png
deleted file mode 100644
index ddf8a94..0000000
Binary files a/icon-themes/crystal/cmd/zh-TW/lc_italic.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/zh-TW/lc_underline.png b/icon-themes/crystal/cmd/zh-TW/lc_underline.png
deleted file mode 100644
index 82bd288..0000000
Binary files a/icon-themes/crystal/cmd/zh-TW/lc_underline.png and /dev/null differ
diff --git a/icon-themes/crystal/cmd/zh-TW/sc_bold.png b/icon-themes/crystal/cmd/zh-TW/sc_bold.png
deleted file mode 100644
index 653e0d8..0000000

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list