tdf#129833 android: Drop non-working ownCloud/nextCloud support

As mentioned in tdf#129833 comment 3, the idea is to
use Android's "system file dialog" to select files rather
than maintain a separate ownCloud/nextCloud connector in the
Android Viewer app.
This way, everything for which a DocumentsProvider [1] is
available will be available from within the app, once
Android Viewer has been adapted to support those, which is
planned for a subsequent step.

Corresponding DocumentsProviders for ownCloud [2] and nextCloud [3]
exist.

[1] https://developer.android.com/reference/android/provider/DocumentsProvider
[2] https://github.com/owncloud/android
[3] https://github.com/nextcloud/android

Change-Id: I6581ce36672f582f91d47598afdfd32c3a4a58da
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112765
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
diff --git a/android/source/build.gradle b/android/source/build.gradle
index add7823..10ed31b 100644
--- a/android/source/build.gradle
+++ b/android/source/build.gradle
@@ -7,9 +7,6 @@ allprojects {
    repositories {
        jcenter()
        google()
        flatDir {
            dirs "${liboWorkdir}/UnpackedTarball/owncloud_android_lib/build/outputs/aar"
        }
    }
}
//build-time dependencies - android plugin for gradle
@@ -30,7 +27,6 @@ dependencies {
            "libreoffice.jar",
            "unoloader.jar"
    ])
    implementation(name:'owncloud_android_lib', ext:'aar')
    implementation 'com.android.support:design:27.1.1' // also pulls-in corresponding support libraries
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
}
diff --git a/android/source/res/drawable/ic_cloud_black_24dp.xml b/android/source/res/drawable/ic_cloud_black_24dp.xml
deleted file mode 100644
index e0940ca..0000000
--- a/android/source/res/drawable/ic_cloud_black_24dp.xml
+++ /dev/null
@@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
    <path
        android:fillColor="#FF000000"
        android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96z"/>
</vector>
diff --git a/android/source/res/menu/navigation_menu.xml b/android/source/res/menu/navigation_menu.xml
index db680a9..4098b27 100644
--- a/android/source/res/menu/navigation_menu.xml
+++ b/android/source/res/menu/navigation_menu.xml
@@ -19,12 +19,6 @@
        <item android:id="@+id/menu_provider_otg"
            android:title="@string/otg_file_system"
            android:icon="@drawable/ic_usb_black_24dp"/>

        <item android:id="@+id/menu_provider_owncloud"
            android:title="@string/owncloud"
            android:icon="@drawable/ic_cloud_black_24dp"/>


    </group>

    <group android:orderInCategory="100">
diff --git a/android/source/res/values-de/strings.xml b/android/source/res/values-de/strings.xml
index a4f88b2..ff58b14 100644
--- a/android/source/res/values-de/strings.xml
+++ b/android/source/res/values-de/strings.xml
@@ -75,13 +75,8 @@
    <string name="local_file_system">Lokales Dateisystem</string>
    <string name="external_sd_file_system">Externe SD</string>
    <string name="otg_file_system">OTG-Gerät (experimentell)</string>
    <string name="owncloud">Entfernter Server</string>
    <string name="usb_connected_configure">USB verbunden, richten Sie Ihr Gerät ein.</string>

    <string name="owncloud_wrong_connection">Verbindung mit dem ownCloud-Server nicht möglich. Prüfen Sie die Einstellungen.</string>
    <string name="owncloud_unauthorized">Anmeldung am ownCloud-Server nicht möglich. Prüfen Sie die Einstellungen.</string>
    <string name="owncloud_unspecified_error">Nicht näher spezifizierter Fehler beim Verbindungsaufbau zum ownCloud-Server. Prüfen Sie die Einstellungen und/oder versuchen Sie es später.</string>

    <string name="ext_document_provider_error">Ungültige Wurzel-Datei. Prüfen Sie die SD-Karten-Einstellungen.</string>
    <string name="legacy_extsd_missing_error">Ungültige Wurzel-Datei. Prüfen Sie die externe SD-Karte und/oder die Einstellungen</string>
    <string name="otg_missing_error">Ungültige Wurzel-Datei. Prüfen Sie Ihr OTG-Gerät und/oder die Einstellungen.</string>
@@ -106,14 +101,10 @@

    <!-- Document provider settings -->
    <string name="storage_provider_settings">Speicheranbieter-Einstellungen</string>
    <string name="owncloud_settings">ownCloud-Einstellungen</string>
    <string name="physical_storage_settings">Einstellungen für physikalischen Speicher</string>
    <string name="external_sd_path">Pfad zur externen SD-Karte</string>
    <string name="otg_device_path">Pfad zum OTG-Gerät</string>
    <string name="otg_warning">Experimentelles Feature: Nur verwenden, wenn OTG-Gerät beschreibbar ist.</string>
    <string name="server_url">Server-URL</string>
    <string name="server_url_and_port">URL und Port des ownCloud-Servers.</string>
    <string name="user_name">Benutzername</string>
    <string name="password">Passwort</string>
    <string name="action_undo">Rückgängig</string>
    <string name="action_redo">Wiederherstellen</string>
diff --git a/android/source/res/values-tr/strings.xml b/android/source/res/values-tr/strings.xml
index 3bada4d..4ce70e9 100644
--- a/android/source/res/values-tr/strings.xml
+++ b/android/source/res/values-tr/strings.xml
@@ -75,13 +75,8 @@
    <string name="local_file_system">Yerel dosya sistemi</string>
    <string name="external_sd_file_system">Harici SD</string>
    <string name="otg_file_system">OTG cihazı (deneysel)</string>
    <string name="owncloud">Uzak sunucu</string>
    <string name="usb_connected_configure">USB bağlantısı yapıldı, cihazınızın ayarlarını yapınız.</string>

    <string name="owncloud_wrong_connection">ownCloud sunucusuna bağlanılamadı. Ayarlarınızı kontrol ediniz.</string>
    <string name="owncloud_unauthorized">ownCloud sunucusuna giriş yapılamadı. Ayarlarınızı kontrol ediniz.</string>
    <string name="owncloud_unspecified_error">ownCloud sunucusuna bağlanırken belirtilmemiş bir hata oluştu. Lütfen daha sonra tekrar deneyiniz veya ayarlarınızı kontrol ediniz.</string>

    <string name="ext_document_provider_error">Geçersiz dizin. SD kart ayarlarınızı kontrol ediniz.</string>
    <string name="legacy_extsd_missing_error">Geçersiz dizin. SD kartınızı veya SD kart ayarlarınızı kontrol ediniz.</string>
    <string name="otg_missing_error">Geçersiz dizin. OTG cihazınızı veya OTG cihazı ayarlarınızı kontrol ediniz.</string>
@@ -106,14 +101,10 @@

    <!-- Document provider settings -->
    <string name="storage_provider_settings">Depolama sağlayıcısı ayarları</string>
    <string name="owncloud_settings">ownCloud ayarları</string>
    <string name="physical_storage_settings">Fiziksel depolama ayarları</string>
    <string name="external_sd_path">Harici SD yolu</string>
    <string name="otg_device_path">OTG cihazı yolu</string>
    <string name="otg_warning">Deneysel özellik: OTG cihazı yazılabilir ise kullanın</string>
    <string name="server_url">Sunucu URL</string>
    <string name="server_url_and_port">ownCloud sunucusu URL ve port</string>
    <string name="user_name">Kullanıcı Adı</string>
    <string name="password">Parola</string>
    <string name="action_undo">Geri Al</string>
    <string name="action_redo">Yinele</string>
diff --git a/android/source/res/values/strings.xml b/android/source/res/values/strings.xml
index 3669d0a..aa32497 100644
--- a/android/source/res/values/strings.xml
+++ b/android/source/res/values/strings.xml
@@ -75,13 +75,8 @@
    <string name="local_file_system">Local file system</string>
    <string name="external_sd_file_system">External SD</string>
    <string name="otg_file_system">OTG device (experimental)</string>
    <string name="owncloud">Remote server</string>
    <string name="usb_connected_configure">USB connected, configure your device.</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>

    <string name="ext_document_provider_error">Invalid root file. Check your sd card configuration.</string>
    <string name="legacy_extsd_missing_error">Invalid root file. Check your external sd card and/or configuration.</string>
    <string name="otg_missing_error">Invalid root file. Check your OTG device and/or configuration.</string>
@@ -106,14 +101,10 @@

    <!-- Document provider settings -->
    <string name="storage_provider_settings">Storage provider settings</string>
    <string name="owncloud_settings">ownCloud settings</string>
    <string name="physical_storage_settings">Physical storage settings</string>
    <string name="external_sd_path">External SD path</string>
    <string name="otg_device_path">OTG device path</string>
    <string name="otg_warning">Experimental Feature: Use only if OTG device is writable.</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>
    <string name="action_undo">Undo</string>
    <string name="action_redo">Redo</string>
diff --git a/android/source/res/xml/documentprovider_preferences.xml b/android/source/res/xml/documentprovider_preferences.xml
index bb5f087..1f4acc7 100644
--- a/android/source/res/xml/documentprovider_preferences.xml
+++ b/android/source/res/xml/documentprovider_preferences.xml
@@ -7,22 +7,6 @@
 -->
<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:hint="https://server:port/" />
        <EditTextPreference
            android:key="pref_user_name"
            android:title="@string/user_name" />
        <EditTextPreference
            android:key="pref_password"
            android:title="@string/password"
            android:password="true" />
    </PreferenceCategory>
    <PreferenceCategory
        android:title="@string/physical_storage_settings">
        <PreferenceScreen
            android:title="@string/external_sd_path"
diff --git a/android/source/src/java/org/libreoffice/storage/DocumentProviderFactory.java b/android/source/src/java/org/libreoffice/storage/DocumentProviderFactory.java
index acf5aeb..07387f1 100644
--- a/android/source/src/java/org/libreoffice/storage/DocumentProviderFactory.java
+++ b/android/source/src/java/org/libreoffice/storage/DocumentProviderFactory.java
@@ -16,7 +16,6 @@ import org.libreoffice.storage.external.ExtsdDocumentsProvider;
import org.libreoffice.storage.external.OTGDocumentsProvider;
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;
@@ -60,12 +59,10 @@ public final class DocumentProviderFactory {
            instance = new DocumentProviderFactory();

            // initialize document providers list
            instance.providers = new IDocumentProvider[5];
            instance.providers = new IDocumentProvider[4];
            instance.providers[0] = new LocalDocumentsDirectoryProvider(0);
            instance.providers[1] = new LocalDocumentsProvider(1);
            instance.providers[OTG_PROVIDER_INDEX] = new OTGDocumentsProvider(OTG_PROVIDER_INDEX, context);
            instance.providers[4] = new OwnCloudProvider(4, context);

            instance.providers[EXTSD_PROVIDER_INDEX] = new ExtsdDocumentsProvider(EXTSD_PROVIDER_INDEX, context);

            // initialize document provider names list
diff --git a/android/source/src/java/org/libreoffice/storage/DocumentProviderSettingsActivity.java b/android/source/src/java/org/libreoffice/storage/DocumentProviderSettingsActivity.java
index b842e79..55656f9 100644
--- a/android/source/src/java/org/libreoffice/storage/DocumentProviderSettingsActivity.java
+++ b/android/source/src/java/org/libreoffice/storage/DocumentProviderSettingsActivity.java
@@ -25,9 +25,6 @@ import android.support.v7.app.AppCompatActivity;

public class DocumentProviderSettingsActivity extends AppCompatActivity {

    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";
    public static final String KEY_PREF_EXTERNAL_SD_PATH_URI = "pref_extsd_path_uri";
    public static final String KEY_PREF_OTG_PATH_URI = "pref_otg_path_uri";

diff --git a/android/source/src/java/org/libreoffice/storage/IDocumentProvider.java b/android/source/src/java/org/libreoffice/storage/IDocumentProvider.java
index 044d7dd..4e82e25 100644
--- a/android/source/src/java/org/libreoffice/storage/IDocumentProvider.java
+++ b/android/source/src/java/org/libreoffice/storage/IDocumentProvider.java
@@ -53,8 +53,7 @@ public interface IDocumentProvider {
     * Provides the unique ID for a document provider instance in a program.
     *
     * This ID should be set when the instance is built. It could be used to
     * tell two instances of the same document provider apart, e. g. two
     * instances of OwnCloudProvider pointing to different servers.
     * tell two instances of the same document provider apart.
     *
     * @return Unique ID for a document provider instance.
     */
diff --git a/android/source/src/java/org/libreoffice/storage/owncloud/OwnCloudFile.java b/android/source/src/java/org/libreoffice/storage/owncloud/OwnCloudFile.java
deleted file mode 100644
index fa74a54..0000000
--- a/android/source/src/java/org/libreoffice/storage/owncloud/OwnCloudFile.java
+++ /dev/null
@@ -1,178 +0,0 @@
package org.libreoffice.storage.owncloud;

import android.content.Context;

import java.io.File;
import java.io.FileFilter;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URLEncoder;
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.ChunkedUploadRemoteFileOperation;
import com.owncloud.android.lib.resources.files.DownloadRemoteFileOperation;
import com.owncloud.android.lib.resources.files.ReadRemoteFolderOperation;
import com.owncloud.android.lib.resources.files.RemoteFile;
import com.owncloud.android.lib.resources.files.UploadRemoteFileOperation;

/**
 * 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(){

        try{
            return URI.create(URLEncoder.encode(file.getRemotePath(),"UTF-8"));
        }catch(UnsupportedEncodingException e){
            e.printStackTrace();
        }

        return null;
    }

    @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 provider.buildRuntimeExceptionForResultCode(result.getCode());
            }
            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) {
        List<IFile> children = new ArrayList<IFile>();
        if (isDirectory()) {
            ReadRemoteFolderOperation refreshOperation = new ReadRemoteFolderOperation(
                    file.getRemotePath());
            RemoteOperationResult result = refreshOperation.execute(provider
                    .getClient());
            if (!result.isSuccess()) {
                throw provider.buildRuntimeExceptionForResultCode(result.getCode());
            }

            for (Object obj : result.getData()) {
                RemoteFile child = (RemoteFile) obj;
                if (!child.getRemotePath().equals(file.getRemotePath())){
                    OwnCloudFile ownCloudFile = new OwnCloudFile(provider, child);
                    if(!ownCloudFile.isDirectory()){
                        File f = new File(provider.getCacheDir().getAbsolutePath(),
                                ownCloudFile.getName());
                        if(filter.accept(f))
                            children.add(ownCloudFile);
                        f.delete();
                    }else{
                        children.add(ownCloudFile);
                    }
                }
            }
        }
        return children;
    }

    @Override
    public IFile getParent(Context context) {
        if (parentPath == null)
            // this is the root node
            return null;

        return provider.createFromUri(context, URI.create(parentPath));
    }

    @Override
    public File getDocument() {
        if (isDirectory()) {
            return null;
        }
        File downFolder = provider.getCacheDir();
        DownloadRemoteFileOperation operation = new DownloadRemoteFileOperation(
                file.getRemotePath(), downFolder.getAbsolutePath());
        RemoteOperationResult result = operation.execute(provider.getClient());
        if (!result.isSuccess()) {
            throw provider.buildRuntimeExceptionForResultCode(result.getCode());
        }
        return new File(downFolder.getAbsolutePath() + file.getRemotePath());
    }

    @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());
    }

    @Override
    public void saveDocument(File newFile) {
        UploadRemoteFileOperation uploadOperation;
        if (newFile.length() > ChunkedUploadRemoteFileOperation.CHUNK_SIZE) {
            uploadOperation = new ChunkedUploadRemoteFileOperation(
                    newFile.getPath(), file.getRemotePath(), file.getMimeType());
        } else {
            uploadOperation = new UploadRemoteFileOperation(newFile.getPath(),
                    file.getRemotePath(), file.getMimeType());
        }

        RemoteOperationResult result = uploadOperation.execute(provider
                .getClient());
        if (!result.isSuccess()) {
            throw provider.buildRuntimeExceptionForResultCode(result.getCode());
        }
    }
}
diff --git a/android/source/src/java/org/libreoffice/storage/owncloud/OwnCloudProvider.java b/android/source/src/java/org/libreoffice/storage/owncloud/OwnCloudProvider.java
deleted file mode 100644
index 0852ab6..0000000
--- a/android/source/src/java/org/libreoffice/storage/owncloud/OwnCloudProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
package org.libreoffice.storage.owncloud;

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.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.net.Uri;
import android.preference.PreferenceManager;

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;


/**
 * Implementation of IDocumentProvider for ownCloud servers.
 */
public class OwnCloudProvider implements IDocumentProvider,
        OnSharedPreferenceChangeListener {

    private int id;

    private Context context;
    private OwnCloudClient client;
    private File cacheDir;

    private String serverUrl;
    private String userName;
    private String password;
    private RemoteOperationResult result;

    public OwnCloudProvider(int id, Context context) {
        this.id = id;
        this.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, "");

        setupClient();

        // 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();
    }

    private void setupClient() {
        Uri serverUri = Uri.parse(serverUrl);
        client = OwnCloudClientFactory.createOwnCloudClient(serverUri, context,
                true);
        client.setCredentials(OwnCloudCredentialsFactory.newBasicCredentials(
                userName, password));
    }

    @Override
    public IFile getRootDirectory(Context context) {
        return createFromUri(context, URI.create(FileUtils.PATH_SEPARATOR));
    }

    @Override
    public IFile createFromUri(Context context, URI uri) {
        if(serverUrl != "" || userName != "" || password != ""){
            ReadRemoteFileOperation refreshOperation = new ReadRemoteFileOperation(
                    uri.getPath());
            this.result = refreshOperation.execute(client);
            if (!result.isSuccess()) {
                throw buildRuntimeExceptionForResultCode(result.getCode());
            }
            if (result.getData().size() > 0) {
                return new OwnCloudFile(this, (RemoteFile) result.getData().get(0));
            }
        } else {
            throw buildRuntimeExceptionForResultCode(ResultCode.WRONG_CONNECTION);
        }

        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;
    }

    /**
     * Used by OwnCloudFiles to get the cache directory they should download
     * files to.
     *
     * @return cache directory.
     */
    protected File getCacheDir() {
        return cacheDir;
    }

    /**
     * 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
     *            File or directory to be deleted.
     */
    private static void deleteRecursive(File file) {
        if (file.isDirectory()) {
            for (File child : file.listFiles())
                deleteRecursive(child);
        }
        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();
    }

    @Override
    public int getId() {
        return id;
    }

    @Override
    public boolean checkProviderAvailability(Context context) {
        return client != null;
    }
}
diff --git a/android/source/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java b/android/source/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java
index a9d797c..f52972b8 100644
--- a/android/source/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java
+++ b/android/source/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java
@@ -277,11 +277,6 @@ public class LibreOfficeUIActivity extends AppCompatActivity implements Settings
                        return true;
                    }

                    case R.id.menu_provider_owncloud: {
                        switchToDocumentProvider(documentProviderFactory.getProvider(4));
                        return true;
                    }

                    default:
                        return false;
                }