Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 29f5f9bc authored by Jean Chalard's avatar Jean Chalard Committed by The Android Automerger
Browse files

Don't try to issue delete() commands on missing provider

Bug: 8173622
Change-Id: Id3dc510ae3535169b5290e87075cb2f433a1f603
parent 825abc00
Loading
Loading
Loading
Loading
+50 −21
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.inputmethod.latin;

import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
@@ -93,12 +94,30 @@ public final class BinaryDictionaryFileDumper {
                        path);
    }

    /**
     * Finds out whether the dictionary pack is available on this device.
     * @param context A context to get the content resolver.
     * @return whether the dictionary pack is present or not.
     */
    private static boolean isDictionaryPackPresent(final Context context) {
        final ContentResolver cr = context.getContentResolver();
        final ContentProviderClient client =
                cr.acquireContentProviderClient(getProviderUriBuilder("").build());
        if (client != null) {
            client.release();
            return true;
        } else {
            return false;
        }
    }

    /**
     * Queries a content provider for the list of word lists for a specific locale
     * available to copy into Latin IME.
     */
    private static List<WordListInfo> getWordListWordListInfos(final Locale locale,
            final Context context, final boolean hasDefaultWordList) {
        try {
            final ContentResolver resolver = context.getContentResolver();
            final String clientId = context.getString(R.string.dictionary_pack_client_id);
            final Uri.Builder builder = getProviderUriBuilder(clientId);
@@ -106,21 +125,24 @@ public final class BinaryDictionaryFileDumper {
            builder.appendPath(locale.toString());
            builder.appendQueryParameter(QUERY_PARAMETER_PROTOCOL, QUERY_PARAMETER_PROTOCOL_VALUE);
            if (!hasDefaultWordList) {
            builder.appendQueryParameter(QUERY_PARAMETER_MAY_PROMPT_USER, QUERY_PARAMETER_TRUE);
                builder.appendQueryParameter(QUERY_PARAMETER_MAY_PROMPT_USER,
                        QUERY_PARAMETER_TRUE);
            }
            final Uri dictionaryPackUri = builder.build();
    
        final Cursor c = resolver.query(dictionaryPackUri, DICTIONARY_PROJECTION, null, null, null);
            final Cursor c = resolver.query(dictionaryPackUri, DICTIONARY_PROJECTION, null, null,
                    null);
            if (null == c) {
            reinitializeClientRecordInDictionaryContentProvider(context, resolver, clientId);
                if (isDictionaryPackPresent(context)) {
                    reinitializeClientRecordInDictionaryContentProvider(context, resolver,
                            clientId);
                }
                return Collections.<WordListInfo>emptyList();
            }
            if (c.getCount() <= 0 || !c.moveToFirst()) {
                c.close();
                return Collections.<WordListInfo>emptyList();
            }

        try {
            final List<WordListInfo> list = CollectionUtils.newArrayList();
            do {
                final String wordListId = c.getString(0);
@@ -130,6 +152,13 @@ public final class BinaryDictionaryFileDumper {
            } while (c.moveToNext());
            c.close();
            return list;
        } catch (IllegalArgumentException e) {
            // Since we are testing for the dictionary pack presence before doing anything that may
            // crash, it's probably impossible for the code to come here. However it's very
            // dangerous because crashing here would brick any encrypted device - we need the
            // keyboard to be up and working to enter the password. So let's be as safe as possible.
            Log.e(TAG, "IllegalArgumentException: the dictionary pack can't be contacted?", e);
            return Collections.<WordListInfo>emptyList();
        } catch (Exception e) {
            // Just in case we hit a problem in communication with the dictionary pack.
            // We don't want to die.