Issue #19 fix. Error reporting on download errors and dl dir problems

This commit is contained in:
Sergey Eremin
2017-01-21 04:45:53 +03:00
parent f4c9b4a29b
commit c8df7de703
4 changed files with 122 additions and 35 deletions

View File

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

View File

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

View File

@@ -32,6 +32,7 @@
<string name="error_no_network">Нет соединения с сетью.</string>
<string name="error_network_other" formatted="false">Сетевая ошибка: %s</string>
<string name="error_not_purchased">Похоже, это приложение не было куплено.</string>
<string name="error_downloads_directory_not_writable">Каталог закачек недоступен для записи.</string>
<string name="details_installs" formatted="false">%s ↓</string>
<string name="details_rating" formatted="false">%.1f★</string>
<string name="details_rating_specific" formatted="false">%d★ %d</string>
@@ -67,4 +68,13 @@
<string name="pref_auto_install">Устанавливать приложения сразу</string>
<string name="pref_clear_ignored_apps">Очистить список игнорируемых приложений</string>
<string name="pref_done">Готово</string>
<string name="download_manager_ERROR_UNKNOWN">Неизвестная ошибка.</string>
<string name="download_manager_ERROR_FILE_ERROR">Неизвестная ошибка сохранения файла.</string>
<string name="download_manager_ERROR_UNHANDLED_HTTP_CODE">Сетевая ошибка. Попробуйте позднее.</string>
<string name="download_manager_ERROR_HTTP_DATA_ERROR">Сетевая ошибка. Попробуйте позднее.</string>
<string name="download_manager_ERROR_TOO_MANY_REDIRECTS">Сетевая ошибка. Слишком много редиректов.</string>
<string name="download_manager_ERROR_INSUFFICIENT_SPACE">Недостаточно места на устройстве.</string>
<string name="download_manager_ERROR_DEVICE_NOT_FOUND">Устройство хранения недоступно. Вынули SD карту?</string>
<string name="download_manager_ERROR_CANNOT_RESUME">Сетевая ошибка. Попробуйте позднее.</string>
<string name="download_manager_ERROR_BLOCKED">Загрузка прервана из-за настроек безопасности NetworkPolicyManager.</string>
</resources>

View File

@@ -32,6 +32,7 @@
<string name="error_no_network">No network connection.</string>
<string name="error_network_other" formatted="false">Network error: %s</string>
<string name="error_not_purchased">The app does not seem to be purchased.</string>
<string name="error_downloads_directory_not_writable">Downloads directory could not be created or is not writable.</string>
<string name="details_installs" formatted="false">%s ↓</string>
<string name="details_rating" formatted="false">%.1f★</string>
<string name="details_rating_specific" formatted="false">%d★ %d</string>
@@ -67,4 +68,13 @@
<string name="pref_auto_install">Install apps immediately</string>
<string name="pref_clear_ignored_apps">Clear ignored apps list</string>
<string name="pref_done">Done</string>
<string name="download_manager_ERROR_UNKNOWN">Unknown error.</string>
<string name="download_manager_ERROR_FILE_ERROR">Unknown file storage error.</string>
<string name="download_manager_ERROR_UNHANDLED_HTTP_CODE">HTTP code was received that download manager can not handle. This is a server error.</string>
<string name="download_manager_ERROR_HTTP_DATA_ERROR">Error receiving or processing data occurred at the HTTP level.</string>
<string name="download_manager_ERROR_TOO_MANY_REDIRECTS">Too many redirects.</string>
<string name="download_manager_ERROR_INSUFFICIENT_SPACE">Insufficient storage space.</string>
<string name="download_manager_ERROR_DEVICE_NOT_FOUND">No external storage device was found. Maybe the SD card is not mounted.</string>
<string name="download_manager_ERROR_CANNOT_RESUME">Some possibly transient error occurred but we can not resume the download. Retry later.</string>
<string name="download_manager_ERROR_BLOCKED">Download has failed because of NetworkPolicyManager controls on the requesting application. Check your settings.</string>
</resources>