From c8df7de703b777a9727f850e7ae2c20b6b6a0dc7 Mon Sep 17 00:00:00 2001 From: Sergey Eremin Date: Sat, 21 Jan 2017 04:45:53 +0300 Subject: [PATCH] Issue #19 fix. Error reporting on download errors and dl dir problems --- .../yeriomin/yalpstore/DetailsActivity.java | 50 ++++++++--- .../yalpstore/DownloadBroadcastReceiver.java | 87 ++++++++++++++----- app/src/main/res/values-ru/strings.xml | 10 +++ app/src/main/res/values/strings.xml | 10 +++ 4 files changed, 122 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/com/github/yeriomin/yalpstore/DetailsActivity.java b/app/src/main/java/com/github/yeriomin/yalpstore/DetailsActivity.java index 13ed369d3..b35bd91a4 100644 --- a/app/src/main/java/com/github/yeriomin/yalpstore/DetailsActivity.java +++ b/app/src/main/java/com/github/yeriomin/yalpstore/DetailsActivity.java @@ -12,6 +12,7 @@ import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; @@ -37,6 +38,7 @@ import android.widget.Toast; import com.github.yeriomin.yalpstore.model.App; import com.github.yeriomin.yalpstore.model.Review; +import java.io.File; import java.util.ArrayList; import java.util.List; @@ -61,15 +63,29 @@ public class DetailsActivity extends Activity { @Override public void onReceive(Context context, Intent intent) { Bundle extras = intent.getExtras(); - if (null != extras) { - long id = extras.getLong(DownloadManager.EXTRA_DOWNLOAD_ID); - System.out.println("downloadId=" + downloadId + " id=" + id); - if (downloadId == id) { - Button button = (Button) findViewById(R.id.download); - button.setText(R.string.details_install); - button.setEnabled(true); - } + if (null == extras) { + return; } + long id = extras.getLong(DownloadManager.EXTRA_DOWNLOAD_ID); + if (downloadId != id) { + return; + } + DownloadManager.Query q = new DownloadManager.Query(); + q.setFilterById(id); + DownloadManager dm = (DownloadManager) context.getSystemService(DOWNLOAD_SERVICE); + Cursor cursor = dm.query(q); + if (!cursor.moveToFirst()) { + return; + } + int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)); + int reason = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_REASON)); + Button button = (Button) findViewById(R.id.download); + if (status == DownloadManager.STATUS_SUCCESSFUL || reason == DownloadManager.ERROR_FILE_ALREADY_EXISTS) { + button.setText(R.string.details_install); + } else { + button.setText(R.string.details_download); + } + button.setEnabled(true); } }; @@ -356,10 +372,22 @@ public class DetailsActivity extends Activity { getString(R.string.dialog_message_purchasing_app), getString(R.string.dialog_title_purchasing_app) ); - if (checkPermission()) { - task.execute(); + File dir = PlayStoreApiWrapper.getApkPath(app).getParentFile(); + if (!dir.exists()) { + dir.mkdirs(); + } + if (dir.exists() && dir.isDirectory() && dir.canWrite()) { + if (checkPermission()) { + task.execute(); + } else { + requestPermission(); + } } else { - requestPermission(); + Toast.makeText( + getApplicationContext(), + getString(R.string.error_downloads_directory_not_writable), + Toast.LENGTH_LONG + ).show(); } } }); diff --git a/app/src/main/java/com/github/yeriomin/yalpstore/DownloadBroadcastReceiver.java b/app/src/main/java/com/github/yeriomin/yalpstore/DownloadBroadcastReceiver.java index 30a767291..8af93ce95 100644 --- a/app/src/main/java/com/github/yeriomin/yalpstore/DownloadBroadcastReceiver.java +++ b/app/src/main/java/com/github/yeriomin/yalpstore/DownloadBroadcastReceiver.java @@ -21,45 +21,84 @@ import static android.content.Context.DOWNLOAD_SERVICE; public class DownloadBroadcastReceiver extends BroadcastReceiver { @Override - public void onReceive(Context context, Intent intent) { - Bundle extras = intent.getExtras(); + public void onReceive(Context c, Intent i) { + Bundle extras = i.getExtras(); DownloadManager.Query q = new DownloadManager.Query(); q.setFilterById(extras.getLong(DownloadManager.EXTRA_DOWNLOAD_ID)); - DownloadManager dm = (DownloadManager) context.getSystemService(DOWNLOAD_SERVICE); - Cursor c = dm.query(q); - if (c.moveToFirst()) { - int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)); - int reason = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_REASON)); + DownloadManager dm = (DownloadManager) c.getSystemService(DOWNLOAD_SERVICE); + Cursor cursor = dm.query(q); + if (cursor.moveToFirst()) { + int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)); + int reason = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_REASON)); + String packageName = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_TITLE)); if (status == DownloadManager.STATUS_SUCCESSFUL || reason == DownloadManager.ERROR_FILE_ALREADY_EXISTS) { - File file = new File(Uri.parse(c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI))).getPath()); - Intent i = PlayStoreApiWrapper.getOpenApkIntent(context, file); - SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); + File file = new File(Uri.parse(cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI))).getPath()); + Intent openApkIntent = PlayStoreApiWrapper.getOpenApkIntent(c, file); + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(c); if (sharedPreferences.getBoolean(PreferenceActivity.PREFERENCE_AUTO_INSTALL, false)) { - context.startActivity(i); + c.startActivity(openApkIntent); } else { - String title = c.getString(c.getColumnIndex(DownloadManager.COLUMN_TITLE)); - createNotification(context, i, title); - Toast.makeText( - context, - context.getString(R.string.notification_download_complete_toast, title), - Toast.LENGTH_LONG - ).show(); + createNotification(c, openApkIntent, packageName, c.getString(R.string.notification_download_complete)); + toast(c, c.getString(R.string.notification_download_complete_toast, packageName)); } + } else if (reason > 0) { + String error = getErrorString(c, reason); + toast(c, error); + createNotification(c, new Intent(), packageName, error); } } } - private void createNotification(Context context, Intent intent, String packageName) { - PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intent, 0); + private void toast(Context c, String message) { + Toast.makeText(c, message, Toast.LENGTH_LONG).show(); + } + + private String getErrorString(Context context, int reason) { + int stringId; + switch (reason) { + case DownloadManager.ERROR_CANNOT_RESUME: + stringId = R.string.download_manager_ERROR_CANNOT_RESUME; + break; + case DownloadManager.ERROR_DEVICE_NOT_FOUND: + stringId = R.string.download_manager_ERROR_DEVICE_NOT_FOUND; + break; + case DownloadManager.ERROR_FILE_ERROR: + stringId = R.string.download_manager_ERROR_FILE_ERROR; + break; + case DownloadManager.ERROR_HTTP_DATA_ERROR: + stringId = R.string.download_manager_ERROR_HTTP_DATA_ERROR; + break; + case DownloadManager.ERROR_INSUFFICIENT_SPACE: + stringId = R.string.download_manager_ERROR_INSUFFICIENT_SPACE; + break; + case DownloadManager.ERROR_TOO_MANY_REDIRECTS: + stringId = R.string.download_manager_ERROR_TOO_MANY_REDIRECTS; + break; + case DownloadManager.ERROR_UNHANDLED_HTTP_CODE: + stringId = R.string.download_manager_ERROR_UNHANDLED_HTTP_CODE; + break; + case 1010: // This constant hasn't been introduced in api 9 + stringId = R.string.download_manager_ERROR_BLOCKED; + break; + case DownloadManager.ERROR_UNKNOWN: + default: + stringId = R.string.download_manager_ERROR_UNKNOWN; + break; + } + return context.getString(stringId); + } + + private void createNotification(Context c, Intent intent, String packageName, String message) { + PendingIntent pendingIntent = PendingIntent.getActivity(c, 1, intent, 0); Notification notification = NotificationUtil.createNotification( - context, + c, pendingIntent, packageName, - context.getString(R.string.notification_download_complete), + message, R.mipmap.ic_launcher ); - NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.notify(packageName.hashCode(), notification); + NotificationManager manager = (NotificationManager) c.getSystemService(Context.NOTIFICATION_SERVICE); + manager.notify(packageName.hashCode(), notification); } } diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 26a4752ef..be77ba19f 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -32,6 +32,7 @@ Нет соединения с сетью. Сетевая ошибка: %s Похоже, это приложение не было куплено. + Каталог закачек недоступен для записи. %s ↓ %.1f★ %d★ %d @@ -67,4 +68,13 @@ Устанавливать приложения сразу Очистить список игнорируемых приложений Готово + Неизвестная ошибка. + Неизвестная ошибка сохранения файла. + Сетевая ошибка. Попробуйте позднее. + Сетевая ошибка. Попробуйте позднее. + Сетевая ошибка. Слишком много редиректов. + Недостаточно места на устройстве. + Устройство хранения недоступно. Вынули SD карту? + Сетевая ошибка. Попробуйте позднее. + Загрузка прервана из-за настроек безопасности NetworkPolicyManager. \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 19fcb83ec..d97946362 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -32,6 +32,7 @@ No network connection. Network error: %s The app does not seem to be purchased. + Downloads directory could not be created or is not writable. %s ↓ %.1f★ %d★ %d @@ -67,4 +68,13 @@ Install apps immediately Clear ignored apps list Done + Unknown error. + Unknown file storage error. + HTTP code was received that download manager can not handle. This is a server error. + Error receiving or processing data occurred at the HTTP level. + Too many redirects. + Insufficient storage space. + No external storage device was found. Maybe the SD card is not mounted. + Some possibly transient error occurred but we can not resume the download. Retry later. + Download has failed because of NetworkPolicyManager controls on the requesting application. Check your settings. \ No newline at end of file