/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.android.inputmethod.dictionarypack; import android.app.DownloadManager; import android.app.DownloadManager.Query; import android.app.DownloadManager.Request; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteException; import android.os.ParcelFileDescriptor; import android.util.Log; import java.io.FileNotFoundException; import javax.annotation.Nullable; /** * A class to help with calling DownloadManager methods. * * Mostly, the problem here is that most methods from DownloadManager may throw SQL exceptions if * they can't open the database on disk. We want to avoid crashing in these cases but can't do * much more, so this class insulates the callers from these. SQLiteException also inherit from * RuntimeException so they are unchecked :( * While we're at it, we also insulate callers from the cases where DownloadManager is disabled, * and getSystemService returns null. */ public class DownloadManagerWrapper { private final static String TAG = DownloadManagerWrapper.class.getSimpleName(); private final DownloadManager mDownloadManager; public DownloadManagerWrapper(final Context context) { this((DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE)); } private DownloadManagerWrapper(final DownloadManager downloadManager) { mDownloadManager = downloadManager; } public void remove(final long... ids) { try { if (null != mDownloadManager) { mDownloadManager.remove(ids); } } catch (IllegalArgumentException e) { // This is expected to happen on boot when the device is encrypted. } catch (SQLiteException e) { // We couldn't remove the file from DownloadManager. Apparently, the database can't // be opened. It may be a problem with file system corruption. In any case, there is // not much we can do apart from avoiding crashing. Log.e(TAG, "Can't remove files with ID " + ids + " from download manager", e); } } public ParcelFileDescriptor openDownloadedFile(final long fileId) throws FileNotFoundException { try { if (null != mDownloadManager) { return mDownloadManager.openDownloadedFile(fileId); } } catch (IllegalArgumentException e) { // This is expected to happen on boot when the device is encrypted. } catch (SQLiteException e) { Log.e(TAG, "Can't open downloaded file with ID " + fileId, e); } // We come here if mDownloadManager is null or if an exception was thrown. throw new FileNotFoundException(); } @Nullable public Cursor query(final Query query) { try { if (null != mDownloadManager) { return mDownloadManager.query(query); } } catch (IllegalArgumentException e) { // This is expected to happen on boot when the device is encrypted. } catch (SQLiteException e) { Log.e(TAG, "Can't query the download manager", e); } // We come here if mDownloadManager is null or if an exception was thrown. return null; } public long enqueue(final Request request) { try { if (null != mDownloadManager) { return mDownloadManager.enqueue(request); } } catch (IllegalArgumentException e) { // This is expected to happen on boot when the device is encrypted. } catch (SQLiteException e) { Log.e(TAG, "Can't enqueue a request with the download manager", e); } return 0; } }