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