From a40a349c0107660bfb4004467550725a3ca3ec97 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Thu, 2 Aug 2012 21:58:17 -0700 Subject: Rewrite of download notifications. Switch to using new inbox-style notifications when collapsing multiple downloads. Correctly handles clustering, including cancellation of stale notifications. All notifications are now handled in a single class, making it easier to reason about correctness. Fixed bugs around handling of visibility flags. Move away from using "int" as internal keys, since they can overflow. Started work for time estimates, will finish in a future CL. Explicitly pass all relevant IDs to DownloadReceiver instead of doing a second racy query. Fix StrictMode warnings when querying in DownloadReceiver. Bug: 6777872, 5463678, 6663547, 6967346, 6634261, 5608365 Change-Id: I5eb47b73b90b6250acec2ce5bf8d7a274ed9d3a9 --- res/values/strings.xml | 34 +-- .../providers/downloads/DownloadNotification.java | 288 ------------------- .../providers/downloads/DownloadNotifier.java | 306 +++++++++++++++++++++ .../providers/downloads/DownloadProvider.java | 11 +- .../providers/downloads/DownloadReceiver.java | 194 +++++++------ .../providers/downloads/DownloadService.java | 23 +- .../providers/downloads/FakeSystemFacade.java | 5 +- .../downloads/PublicApiFunctionalTest.java | 13 +- 8 files changed, 455 insertions(+), 419 deletions(-) delete mode 100644 src/com/android/providers/downloads/DownloadNotification.java create mode 100644 src/com/android/providers/downloads/DownloadNotifier.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 56352951..c607e35f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -116,23 +116,6 @@ for a download that doesn't have a title associated with it. --> <Untitled> - - ", " - - - " and %d more" - %d%% + + + 1 file downloading + %d files downloading + + + + + 1 file waiting + %d files waiting + + + + Can\'t open file + diff --git a/src/com/android/providers/downloads/DownloadNotification.java b/src/com/android/providers/downloads/DownloadNotification.java deleted file mode 100644 index f5778e79..00000000 --- a/src/com/android/providers/downloads/DownloadNotification.java +++ /dev/null @@ -1,288 +0,0 @@ -/* - * Copyright (C) 2008 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.providers.downloads; - -import android.app.Notification; -import android.app.NotificationManager; -import android.app.PendingIntent; -import android.content.ContentUris; -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.provider.Downloads; -import android.text.TextUtils; -import android.util.SparseLongArray; - -import java.util.Collection; -import java.util.HashMap; - -/** - * This class handles the updating of the Notification Manager for the - * cases where there is an ongoing download. Once the download is complete - * (be it successful or unsuccessful) it is no longer the responsibility - * of this component to show the download in the notification manager. - * - */ -class DownloadNotification { - - private Context mContext; - private NotificationManager mNotifManager; - private HashMap mNotifications; - - /** Time when each {@link DownloadInfo#mId} was first shown. */ - private SparseLongArray mFirstShown = new SparseLongArray(); - - static final String LOGTAG = "DownloadNotification"; - static final String WHERE_RUNNING = - "(" + Downloads.Impl.COLUMN_STATUS + " >= '100') AND (" + - Downloads.Impl.COLUMN_STATUS + " <= '199') AND (" + - Downloads.Impl.COLUMN_VISIBILITY + " IS NULL OR " + - Downloads.Impl.COLUMN_VISIBILITY + " == '" + Downloads.Impl.VISIBILITY_VISIBLE + "' OR " + - Downloads.Impl.COLUMN_VISIBILITY + - " == '" + Downloads.Impl.VISIBILITY_VISIBLE_NOTIFY_COMPLETED + "')"; - static final String WHERE_COMPLETED = - Downloads.Impl.COLUMN_STATUS + " >= '200' AND " + - Downloads.Impl.COLUMN_VISIBILITY + - " == '" + Downloads.Impl.VISIBILITY_VISIBLE_NOTIFY_COMPLETED + "'"; - - - /** - * This inner class is used to collate downloads that are owned by - * the same application. This is so that only one notification line - * item is used for all downloads of a given application. - * - */ - static class NotificationItem { - // TODO: refactor to mNotifId and avoid building Uris based on it, since - // they can overflow - int mId; // This first db _id for the download for the app - long mTotalCurrent = 0; - long mTotalTotal = 0; - int mTitleCount = 0; - String mPackageName; // App package name - String mDescription; - String[] mTitles = new String[2]; // download titles. - String mPausedText = null; - - /* - * Add a second download to this notification item. - */ - void addItem(String title, long currentBytes, long totalBytes) { - mTotalCurrent += currentBytes; - if (totalBytes <= 0 || mTotalTotal == -1) { - mTotalTotal = -1; - } else { - mTotalTotal += totalBytes; - } - if (mTitleCount < 2) { - mTitles[mTitleCount] = title; - } - mTitleCount++; - } - } - - - /** - * Constructor - * @param ctx The context to use to obtain access to the - * Notification Service - */ - DownloadNotification(Context ctx, SystemFacade systemFacade) { - mContext = ctx; - mNotifManager = (NotificationManager) mContext.getSystemService( - Context.NOTIFICATION_SERVICE); - mNotifications = new HashMap(); - } - - /* - * Update the notification ui. - */ - public void updateNotification(Collection downloads) { - updateActiveNotification(downloads); - updateCompletedNotification(downloads); - } - - private void updateActiveNotification(Collection downloads) { - // Collate the notifications - mNotifications.clear(); - for (DownloadInfo download : downloads) { - if (!isActiveAndVisible(download)) { - continue; - } - String packageName = download.mPackage; - long max = download.mTotalBytes; - long progress = download.mCurrentBytes; - long id = download.mId; - String title = download.mTitle; - if (title == null || title.length() == 0) { - title = mContext.getResources().getString( - R.string.download_unknown_title); - } - - NotificationItem item; - if (mNotifications.containsKey(packageName)) { - item = mNotifications.get(packageName); - item.addItem(title, progress, max); - } else { - item = new NotificationItem(); - item.mId = (int) id; - item.mPackageName = packageName; - item.mDescription = download.mDescription; - item.addItem(title, progress, max); - mNotifications.put(packageName, item); - } - if (download.mStatus == Downloads.Impl.STATUS_QUEUED_FOR_WIFI - && item.mPausedText == null) { - item.mPausedText = mContext.getResources().getString( - R.string.notification_need_wifi_for_size); - } - } - - // Add the notifications - for (NotificationItem item : mNotifications.values()) { - // Build the notification object - final Notification.Builder builder = new Notification.Builder(mContext); - - boolean hasPausedText = (item.mPausedText != null); - int iconResource = android.R.drawable.stat_sys_download; - if (hasPausedText) { - iconResource = android.R.drawable.stat_sys_warning; - } - builder.setSmallIcon(iconResource); - builder.setOngoing(true); - - // set notification "when" to be first time this DownloadInfo.mId - // was encountered, which avoids fighting with other notifs. - long firstShown = mFirstShown.get(item.mId, -1); - if (firstShown == -1) { - firstShown = System.currentTimeMillis(); - mFirstShown.put(item.mId, firstShown); - } - builder.setWhen(firstShown); - - boolean hasContentText = false; - StringBuilder title = new StringBuilder(item.mTitles[0]); - if (item.mTitleCount > 1) { - title.append(mContext.getString(R.string.notification_filename_separator)); - title.append(item.mTitles[1]); - if (item.mTitleCount > 2) { - title.append(mContext.getString(R.string.notification_filename_extras, - new Object[] { Integer.valueOf(item.mTitleCount - 2) })); - } - } else if (!TextUtils.isEmpty(item.mDescription)) { - builder.setContentText(item.mDescription); - hasContentText = true; - } - builder.setContentTitle(title); - - if (hasPausedText) { - builder.setContentText(item.mPausedText); - } else { - builder.setProgress( - (int) item.mTotalTotal, (int) item.mTotalCurrent, item.mTotalTotal == -1); - if (hasContentText) { - builder.setContentInfo( - buildPercentageLabel(mContext, item.mTotalTotal, item.mTotalCurrent)); - } - } - - Intent intent = new Intent(Constants.ACTION_LIST); - intent.setClassName("com.android.providers.downloads", - DownloadReceiver.class.getName()); - intent.setData( - ContentUris.withAppendedId(Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, item.mId)); - intent.putExtra("multiple", item.mTitleCount > 1); - - builder.setContentIntent(PendingIntent.getBroadcast(mContext, 0, intent, 0)); - - mNotifManager.notify(item.mId, builder.build()); - } - } - - private void updateCompletedNotification(Collection downloads) { - for (DownloadInfo download : downloads) { - if (!isCompleteAndVisible(download)) { - continue; - } - notificationForCompletedDownload(download.mId, download.mTitle, - download.mStatus, download.mDestination, download.mLastMod); - } - } - void notificationForCompletedDownload(long id, String title, int status, - int destination, long lastMod) { - // Add the notifications - Notification.Builder builder = new Notification.Builder(mContext); - builder.setSmallIcon(android.R.drawable.stat_sys_download_done); - if (title == null || title.length() == 0) { - title = mContext.getResources().getString( - R.string.download_unknown_title); - } - Uri contentUri = - ContentUris.withAppendedId(Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, id); - String caption; - Intent intent; - if (Downloads.Impl.isStatusError(status)) { - caption = mContext.getResources() - .getString(R.string.notification_download_failed); - intent = new Intent(Constants.ACTION_LIST); - } else { - caption = mContext.getResources() - .getString(R.string.notification_download_complete); - if (destination != Downloads.Impl.DESTINATION_SYSTEMCACHE_PARTITION) { - intent = new Intent(Constants.ACTION_OPEN); - } else { - intent = new Intent(Constants.ACTION_LIST); - } - } - intent.setClassName("com.android.providers.downloads", - DownloadReceiver.class.getName()); - intent.setData(contentUri); - - builder.setWhen(lastMod); - builder.setContentTitle(title); - builder.setContentText(caption); - builder.setContentIntent(PendingIntent.getBroadcast(mContext, 0, intent, 0)); - - intent = new Intent(Constants.ACTION_HIDE); - intent.setClassName("com.android.providers.downloads", - DownloadReceiver.class.getName()); - intent.setData(contentUri); - builder.setDeleteIntent(PendingIntent.getBroadcast(mContext, 0, intent, 0)); - - mNotifManager.notify((int) id, builder.build()); - } - - private boolean isActiveAndVisible(DownloadInfo download) { - return 100 <= download.mStatus && download.mStatus < 200 - && download.mVisibility != Downloads.Impl.VISIBILITY_HIDDEN; - } - - private boolean isCompleteAndVisible(DownloadInfo download) { - return download.mStatus >= 200 - && download.mVisibility == Downloads.Impl.VISIBILITY_VISIBLE_NOTIFY_COMPLETED; - } - - private static String buildPercentageLabel( - Context context, long totalBytes, long currentBytes) { - if (totalBytes <= 0) { - return null; - } else { - final int percent = (int) (100 * currentBytes / totalBytes); - return context.getString(R.string.download_percent, percent); - } - } -} diff --git a/src/com/android/providers/downloads/DownloadNotifier.java b/src/com/android/providers/downloads/DownloadNotifier.java new file mode 100644 index 00000000..a1805e5e --- /dev/null +++ b/src/com/android/providers/downloads/DownloadNotifier.java @@ -0,0 +1,306 @@ +/* + * Copyright (C) 2012 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.providers.downloads; + +import static android.app.DownloadManager.Request.VISIBILITY_VISIBLE; +import static android.app.DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED; +import static android.app.DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION; + +import android.app.DownloadManager; +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.ContentUris; +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.net.Uri; +import android.provider.Downloads; +import android.text.TextUtils; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; +import com.google.common.collect.Sets; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Set; + +import javax.annotation.concurrent.GuardedBy; + +/** + * Update {@link NotificationManager} to reflect current {@link DownloadInfo} + * states. Collapses similar downloads into a single notification, and builds + * {@link PendingIntent} that launch towards {@link DownloadReceiver}. + */ +public class DownloadNotifier { + + private static final int TYPE_ACTIVE = 1; + private static final int TYPE_WAITING = 2; + private static final int TYPE_COMPLETE = 3; + + private final Context mContext; + private final NotificationManager mNotifManager; + + /** + * Currently active notifications, mapped from clustering tag to timestamp + * when first shown. + * + * @see #buildNotificationTag(DownloadInfo) + */ + @GuardedBy("mActiveNotifs") + private final HashMap mActiveNotifs = Maps.newHashMap(); + + public DownloadNotifier(Context context) { + mContext = context; + mNotifManager = (NotificationManager) context.getSystemService( + Context.NOTIFICATION_SERVICE); + } + + /** + * Update {@link NotificationManager} to reflect the given set of + * {@link DownloadInfo}, adding, collapsing, and removing as needed. + */ + public void updateWith(Collection downloads) { + synchronized (mActiveNotifs) { + updateWithLocked(downloads); + } + } + + private void updateWithLocked(Collection downloads) { + final Resources res = mContext.getResources(); + + // Cluster downloads together + final Multimap clustered = ArrayListMultimap.create(); + for (DownloadInfo info : downloads) { + final String tag = buildNotificationTag(info); + if (tag != null) { + clustered.put(tag, info); + } + } + + // Build notification for each cluster + for (String tag : clustered.keySet()) { + final int type = getNotificationTagType(tag); + final Collection cluster = clustered.get(tag); + + final Notification.Builder builder = new Notification.Builder(mContext); + + // Use time when cluster was first shown to avoid shuffling + final long firstShown; + if (mActiveNotifs.containsKey(tag)) { + firstShown = mActiveNotifs.get(tag); + } else { + firstShown = System.currentTimeMillis(); + mActiveNotifs.put(tag, firstShown); + } + builder.setWhen(firstShown); + + // Show relevant icon + if (type == TYPE_ACTIVE) { + builder.setSmallIcon(android.R.drawable.stat_sys_download); + } else if (type == TYPE_WAITING) { + builder.setSmallIcon(android.R.drawable.stat_sys_warning); + } else if (type == TYPE_COMPLETE) { + builder.setSmallIcon(android.R.drawable.stat_sys_download_done); + } + + // Build action intents + if (type == TYPE_ACTIVE || type == TYPE_WAITING) { + final Intent intent = new Intent(Constants.ACTION_LIST, + null, mContext, DownloadReceiver.class); + intent.putExtra(DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS, + getDownloadIds(cluster)); + builder.setContentIntent(PendingIntent.getBroadcast(mContext, 0, intent, 0)); + builder.setOngoing(true); + + } else if (type == TYPE_COMPLETE) { + final DownloadInfo info = cluster.iterator().next(); + final Uri uri = ContentUris.withAppendedId( + Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, info.mId); + + final String action; + if (Downloads.Impl.isStatusError(info.mStatus)) { + action = Constants.ACTION_LIST; + } else { + if (info.mDestination != Downloads.Impl.DESTINATION_SYSTEMCACHE_PARTITION) { + action = Constants.ACTION_OPEN; + } else { + action = Constants.ACTION_LIST; + } + } + + final Intent intent = new Intent(action, uri, mContext, DownloadReceiver.class); + intent.putExtra(DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS, + getDownloadIds(cluster)); + builder.setContentIntent(PendingIntent.getBroadcast(mContext, 0, intent, 0)); + + final Intent hideIntent = new Intent(Constants.ACTION_HIDE, + uri, mContext, DownloadReceiver.class); + builder.setDeleteIntent(PendingIntent.getBroadcast(mContext, 0, hideIntent, 0)); + } + + // Calculate and show progress + String remainingText = null; + String percentText = null; + if (type == TYPE_ACTIVE) { + long current = 0; + long total = 0; + for (DownloadInfo info : cluster) { + if (info.mTotalBytes != -1) { + current += info.mCurrentBytes; + total += info.mTotalBytes; + } + } + + if (total > 0) { + final int percent = (int) ((current * 100) / total); + // TODO: calculate remaining time based on recent bandwidth + percentText = res.getString(R.string.download_percent, percent); + + builder.setProgress(100, percent, false); + } else { + builder.setProgress(100, 0, true); + } + } + + // Build titles and description + final Notification notif; + if (cluster.size() == 1) { + final DownloadInfo info = cluster.iterator().next(); + + builder.setContentTitle(getDownloadTitle(res, info)); + + if (type == TYPE_ACTIVE) { + if (!TextUtils.isEmpty(info.mDescription)) { + builder.setContentText(info.mDescription); + } else { + builder.setContentText(remainingText); + } + builder.setContentInfo(percentText); + + } else if (type == TYPE_WAITING) { + builder.setContentText( + res.getString(R.string.notification_need_wifi_for_size)); + + } else if (type == TYPE_COMPLETE) { + if (Downloads.Impl.isStatusError(info.mStatus)) { + builder.setContentText(res.getText(R.string.notification_download_failed)); + } else if (Downloads.Impl.isStatusSuccess(info.mStatus)) { + builder.setContentText( + res.getText(R.string.notification_download_complete)); + } + } + + notif = builder.build(); + + } else { + final Notification.InboxStyle inboxStyle = new Notification.InboxStyle(builder); + + for (DownloadInfo info : cluster) { + inboxStyle.addLine(getDownloadTitle(res, info)); + } + + if (type == TYPE_ACTIVE) { + builder.setContentTitle(res.getQuantityString( + R.plurals.notif_summary_active, cluster.size(), cluster.size())); + builder.setContentText(remainingText); + builder.setContentInfo(percentText); + inboxStyle.setSummaryText(remainingText); + + } else if (type == TYPE_WAITING) { + builder.setContentTitle(res.getQuantityString( + R.plurals.notif_summary_waiting, cluster.size(), cluster.size())); + builder.setContentText( + res.getString(R.string.notification_need_wifi_for_size)); + inboxStyle.setSummaryText( + res.getString(R.string.notification_need_wifi_for_size)); + } + + notif = inboxStyle.build(); + } + + mNotifManager.notify(tag, 0, notif); + } + + // Remove stale tags that weren't renewed + final Iterator it = mActiveNotifs.keySet().iterator(); + while (it.hasNext()) { + final String tag = it.next(); + if (!clustered.containsKey(tag)) { + mNotifManager.cancel(tag, 0); + it.remove(); + } + } + } + + private static CharSequence getDownloadTitle(Resources res, DownloadInfo info) { + if (!TextUtils.isEmpty(info.mTitle)) { + return info.mTitle; + } else { + return res.getString(R.string.download_unknown_title); + } + } + + private long[] getDownloadIds(Collection infos) { + final long[] ids = new long[infos.size()]; + int i = 0; + for (DownloadInfo info : infos) { + ids[i++] = info.mId; + } + return ids; + } + + /** + * Build tag used for collapsing several {@link DownloadInfo} into a single + * {@link Notification}. + */ + private static String buildNotificationTag(DownloadInfo info) { + if (info.mStatus == Downloads.Impl.STATUS_QUEUED_FOR_WIFI) { + return TYPE_WAITING + ":" + info.mPackage; + } else if (isActiveAndVisible(info)) { + return TYPE_ACTIVE + ":" + info.mPackage; + } else if (isCompleteAndVisible(info)) { + // Complete downloads always have unique notifs + return TYPE_COMPLETE + ":" + info.mId; + } else { + return null; + } + } + + /** + * Return the cluster type of the given tag, as created by + * {@link #buildNotificationTag(DownloadInfo)}. + */ + private static int getNotificationTagType(String tag) { + return Integer.parseInt(tag.substring(0, tag.indexOf(':'))); + } + + private static boolean isActiveAndVisible(DownloadInfo download) { + return Downloads.Impl.isStatusInformational(download.mStatus) && + (download.mVisibility == VISIBILITY_VISIBLE + || download.mVisibility == VISIBILITY_VISIBLE_NOTIFY_COMPLETED); + } + + private static boolean isCompleteAndVisible(DownloadInfo download) { + return Downloads.Impl.isStatusCompleted(download.mStatus) && + (download.mVisibility == VISIBILITY_VISIBLE_NOTIFY_COMPLETED + || download.mVisibility == VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION); + } +} diff --git a/src/com/android/providers/downloads/DownloadProvider.java b/src/com/android/providers/downloads/DownloadProvider.java index 40ebd2bb..c554e41d 100644 --- a/src/com/android/providers/downloads/DownloadProvider.java +++ b/src/com/android/providers/downloads/DownloadProvider.java @@ -667,15 +667,10 @@ public final class DownloadProvider extends ContentProvider { Context context = getContext(); if (values.getAsInteger(Downloads.Impl.COLUMN_DESTINATION) == Downloads.Impl.DESTINATION_NON_DOWNLOADMANAGER_DOWNLOAD) { - // don't start downloadservice because it has nothing to do in this case. - // but does a completion notification need to be sent? + // When notification is requested, kick off service to process all + // relevant downloads. if (Downloads.Impl.isNotificationToBeDisplayed(vis)) { - DownloadNotification notifier = new DownloadNotification(context, mSystemFacade); - notifier.notificationForCompletedDownload(rowID, - values.getAsString(Downloads.Impl.COLUMN_TITLE), - Downloads.Impl.STATUS_SUCCESS, - Downloads.Impl.DESTINATION_NON_DOWNLOADMANAGER_DOWNLOAD, - lastMod); + context.startService(new Intent(context, DownloadService.class)); } } else { context.startService(new Intent(context, DownloadService.class)); diff --git a/src/com/android/providers/downloads/DownloadReceiver.java b/src/com/android/providers/downloads/DownloadReceiver.java index 7469508d..cbc963ce 100644 --- a/src/com/android/providers/downloads/DownloadReceiver.java +++ b/src/com/android/providers/downloads/DownloadReceiver.java @@ -16,8 +16,10 @@ package com.android.providers.downloads; +import static android.app.DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED; +import static android.app.DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION; + import android.app.DownloadManager; -import android.app.NotificationManager; import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; import android.content.ContentUris; @@ -28,9 +30,12 @@ import android.database.Cursor; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; -import android.provider.BaseColumns; +import android.os.Handler; +import android.os.HandlerThread; import android.provider.Downloads; +import android.text.TextUtils; import android.util.Log; +import android.widget.Toast; import com.google.common.annotations.VisibleForTesting; @@ -38,11 +43,21 @@ import com.google.common.annotations.VisibleForTesting; * Receives system broadcasts (boot, network connectivity) */ public class DownloadReceiver extends BroadcastReceiver { + private static final String TAG = "DownloadReceiver"; + + private static Handler sAsyncHandler; + + static { + final HandlerThread thread = new HandlerThread(TAG); + thread.start(); + sAsyncHandler = new Handler(thread.getLooper()); + } + @VisibleForTesting SystemFacade mSystemFacade = null; @Override - public void onReceive(Context context, Intent intent) { + public void onReceive(final Context context, final Intent intent) { if (mSystemFacade == null) { mSystemFacade = new RealSystemFacade(context); } @@ -72,7 +87,20 @@ public class DownloadReceiver extends BroadcastReceiver { } else if (action.equals(Constants.ACTION_OPEN) || action.equals(Constants.ACTION_LIST) || action.equals(Constants.ACTION_HIDE)) { - handleNotificationBroadcast(context, intent); + + final PendingResult result = goAsync(); + if (result == null) { + // TODO: remove this once test is refactored + handleNotificationBroadcast(context, intent); + } else { + sAsyncHandler.post(new Runnable() { + @Override + public void run() { + handleNotificationBroadcast(context, intent); + result.finish(); + } + }); + } } } @@ -80,58 +108,49 @@ public class DownloadReceiver extends BroadcastReceiver { * Handle any broadcast related to a system notification. */ private void handleNotificationBroadcast(Context context, Intent intent) { - Uri uri = intent.getData(); - String action = intent.getAction(); - if (Constants.LOGVV) { - if (action.equals(Constants.ACTION_OPEN)) { - Log.v(Constants.TAG, "Receiver open for " + uri); - } else if (action.equals(Constants.ACTION_LIST)) { - Log.v(Constants.TAG, "Receiver list for " + uri); - } else { // ACTION_HIDE - Log.v(Constants.TAG, "Receiver hide for " + uri); - } + final String action = intent.getAction(); + if (Constants.ACTION_LIST.equals(action)) { + final long[] ids = intent.getLongArrayExtra( + DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS); + sendNotificationClickedIntent(context, ids); + + } else if (Constants.ACTION_OPEN.equals(action)) { + final long id = ContentUris.parseId(intent.getData()); + openDownload(context, id); + hideNotification(context, id); + + } else if (Constants.ACTION_HIDE.equals(action)) { + final long id = ContentUris.parseId(intent.getData()); + hideNotification(context, id); } + } - Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); - if (cursor == null) { - return; - } + /** + * Mark the given {@link DownloadManager#COLUMN_ID} as being acknowledged by + * user so it's not renewed later. + */ + private void hideNotification(Context context, long id) { + final int status; + final int visibility; + + final Uri uri = ContentUris.withAppendedId(Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, id); + final Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); try { - if (!cursor.moveToFirst()) { + if (cursor.moveToFirst()) { + status = getInt(cursor, Downloads.Impl.COLUMN_STATUS); + visibility = getInt(cursor, Downloads.Impl.COLUMN_VISIBILITY); + } else { + Log.w(TAG, "Missing details for download " + id); return; } - - if (action.equals(Constants.ACTION_OPEN)) { - openDownload(context, cursor); - hideNotification(context, uri, cursor); - } else if (action.equals(Constants.ACTION_LIST)) { - sendNotificationClickedIntent(intent, cursor); - } else { // ACTION_HIDE - hideNotification(context, uri, cursor); - } } finally { cursor.close(); } - } - /** - * Hide a system notification for a download. - * @param uri URI to update the download - * @param cursor Cursor for reading the download's fields - */ - private void hideNotification(Context context, Uri uri, Cursor cursor) { - final NotificationManager notifManager = (NotificationManager) context.getSystemService( - Context.NOTIFICATION_SERVICE); - notifManager.cancel((int) ContentUris.parseId(uri)); - - int statusColumn = cursor.getColumnIndexOrThrow(Downloads.Impl.COLUMN_STATUS); - int status = cursor.getInt(statusColumn); - int visibilityColumn = - cursor.getColumnIndexOrThrow(Downloads.Impl.COLUMN_VISIBILITY); - int visibility = cursor.getInt(visibilityColumn); - if (Downloads.Impl.isStatusCompleted(status) - && visibility == Downloads.Impl.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) { - ContentValues values = new ContentValues(); + if (Downloads.Impl.isStatusCompleted(status) && + (visibility == VISIBILITY_VISIBLE_NOTIFY_COMPLETED + || visibility == VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION)) { + final ContentValues values = new ContentValues(); values.put(Downloads.Impl.COLUMN_VISIBILITY, Downloads.Impl.VISIBILITY_VISIBLE); context.getContentResolver().update(uri, values, null, null); @@ -139,69 +158,84 @@ public class DownloadReceiver extends BroadcastReceiver { } /** - * Open the download that cursor is currently pointing to, since it's completed notification - * has been clicked. + * Start activity to display the file represented by the given + * {@link DownloadManager#COLUMN_ID}. */ - private void openDownload(Context context, Cursor cursor) { - final long id = cursor.getLong(cursor.getColumnIndexOrThrow(BaseColumns._ID)); + private void openDownload(Context context, long id) { final Intent intent = OpenHelper.buildViewIntent(context, id); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); try { context.startActivity(intent); } catch (ActivityNotFoundException ex) { Log.d(Constants.TAG, "no activity for " + intent, ex); + Toast.makeText(context, R.string.download_no_application_title, Toast.LENGTH_LONG) + .show(); } } /** * Notify the owner of a running download that its notification was clicked. - * @param intent the broadcast intent sent by the notification manager - * @param cursor Cursor for reading the download's fields */ - private void sendNotificationClickedIntent(Intent intent, Cursor cursor) { - String pckg = cursor.getString( - cursor.getColumnIndexOrThrow(Downloads.Impl.COLUMN_NOTIFICATION_PACKAGE)); - if (pckg == null) { - return; + private void sendNotificationClickedIntent(Context context, long[] ids) { + final String packageName; + final String clazz; + final boolean isPublicApi; + + final Uri uri = ContentUris.withAppendedId( + Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, ids[0]); + final Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); + try { + if (cursor.moveToFirst()) { + packageName = getString(cursor, Downloads.Impl.COLUMN_NOTIFICATION_PACKAGE); + clazz = getString(cursor, Downloads.Impl.COLUMN_NOTIFICATION_CLASS); + isPublicApi = getInt(cursor, Downloads.Impl.COLUMN_IS_PUBLIC_API) != 0; + } else { + Log.w(TAG, "Missing details for download " + ids[0]); + return; + } + } finally { + cursor.close(); } - String clazz = cursor.getString( - cursor.getColumnIndexOrThrow(Downloads.Impl.COLUMN_NOTIFICATION_CLASS)); - boolean isPublicApi = - cursor.getInt(cursor.getColumnIndex(Downloads.Impl.COLUMN_IS_PUBLIC_API)) != 0; + if (TextUtils.isEmpty(packageName)) { + Log.w(TAG, "Missing package; skipping broadcast"); + return; + } Intent appIntent = null; if (isPublicApi) { appIntent = new Intent(DownloadManager.ACTION_NOTIFICATION_CLICKED); - appIntent.setPackage(pckg); - // send id of the items clicked on. - if (intent.getBooleanExtra("multiple", false)) { - // broadcast received saying click occurred on a notification with multiple titles. - // don't include any ids at all - let the caller query all downloads belonging to it - // TODO modify the broadcast to include ids of those multiple notifications. - } else { - appIntent.putExtra(DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS, - new long[] { - cursor.getLong(cursor.getColumnIndexOrThrow(Downloads.Impl._ID))}); - } + appIntent.setPackage(packageName); + appIntent.putExtra(DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS, ids); + } else { // legacy behavior - if (clazz == null) { + if (TextUtils.isEmpty(clazz)) { + Log.w(TAG, "Missing class; skipping broadcast"); return; } + appIntent = new Intent(DownloadManager.ACTION_NOTIFICATION_CLICKED); - appIntent.setClassName(pckg, clazz); - if (intent.getBooleanExtra("multiple", true)) { - appIntent.setData(Downloads.Impl.CONTENT_URI); + appIntent.setClassName(packageName, clazz); + appIntent.putExtra(DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS, ids); + + if (ids.length == 1) { + appIntent.setData(uri); } else { - long downloadId = cursor.getLong(cursor.getColumnIndexOrThrow(Downloads.Impl._ID)); - appIntent.setData( - ContentUris.withAppendedId(Downloads.Impl.CONTENT_URI, downloadId)); + appIntent.setData(Downloads.Impl.CONTENT_URI); } } mSystemFacade.sendBroadcast(appIntent); } + private static String getString(Cursor cursor, String col) { + return cursor.getString(cursor.getColumnIndexOrThrow(col)); + } + + private static int getInt(Cursor cursor, String col) { + return cursor.getInt(cursor.getColumnIndexOrThrow(col)); + } + private void startService(Context context) { context.startService(new Intent(context, DownloadService.class)); } diff --git a/src/com/android/providers/downloads/DownloadService.java b/src/com/android/providers/downloads/DownloadService.java index 8380830a..0a16a7d1 100644 --- a/src/com/android/providers/downloads/DownloadService.java +++ b/src/com/android/providers/downloads/DownloadService.java @@ -19,7 +19,6 @@ package com.android.providers.downloads; import static com.android.providers.downloads.Constants.TAG; import android.app.AlarmManager; -import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.ComponentName; @@ -65,8 +64,7 @@ public class DownloadService extends Service { private DownloadManagerContentObserver mObserver; /** Class to handle Notification Manager updates */ - private DownloadNotification mNotifier; - private NotificationManager mNotifManager; + private DownloadNotifier mNotifier; /** * The Service's view of the list of downloads, mapping download IDs to the corresponding info @@ -222,9 +220,7 @@ public class DownloadService extends Service { mMediaScannerConnecting = false; mMediaScannerConnection = new MediaScannerConnection(); - mNotifier = new DownloadNotification(this, mSystemFacade); - mNotifManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - mNotifManager.cancelAll(); + mNotifier = new DownloadNotifier(this); mStorageManager = StorageManager.getInstance(getApplicationContext()); updateFromProvider(); @@ -359,7 +355,7 @@ public class DownloadService extends Service { } } } - mNotifier.updateNotification(mDownloads.values()); + mNotifier.updateWith(mDownloads.values()); if (mustScan) { bindMediaScanner(); } else { @@ -459,18 +455,6 @@ public class DownloadService extends Service { Log.v(Constants.TAG, "processing updated download " + info.mId + ", status: " + info.mStatus); } - - boolean lostVisibility = - oldVisibility == Downloads.Impl.VISIBILITY_VISIBLE_NOTIFY_COMPLETED - && info.mVisibility != Downloads.Impl.VISIBILITY_VISIBLE_NOTIFY_COMPLETED - && Downloads.Impl.isStatusCompleted(info.mStatus); - boolean justCompleted = - !Downloads.Impl.isStatusCompleted(oldStatus) - && Downloads.Impl.isStatusCompleted(info.mStatus); - if (lostVisibility || justCompleted) { - mNotifManager.cancel((int) info.mId); - } - info.startIfReady(now, mStorageManager); } @@ -488,7 +472,6 @@ public class DownloadService extends Service { } new File(info.mFileName).delete(); } - mNotifManager.cancel((int) info.mId); mDownloads.remove(info.mId); } diff --git a/tests/src/com/android/providers/downloads/FakeSystemFacade.java b/tests/src/com/android/providers/downloads/FakeSystemFacade.java index 6898efdb..481b5cba 100644 --- a/tests/src/com/android/providers/downloads/FakeSystemFacade.java +++ b/tests/src/com/android/providers/downloads/FakeSystemFacade.java @@ -4,6 +4,7 @@ import android.content.Intent; import android.content.pm.PackageManager.NameNotFoundException; import android.net.ConnectivityManager; import android.net.NetworkInfo; +import android.net.NetworkInfo.DetailedState; import java.util.ArrayList; import java.util.LinkedList; @@ -36,7 +37,9 @@ public class FakeSystemFacade implements SystemFacade { if (mActiveNetworkType == null) { return null; } else { - return new NetworkInfo(mActiveNetworkType, 0, null, null); + final NetworkInfo info = new NetworkInfo(mActiveNetworkType, 0, null, null); + info.setDetailedState(DetailedState.CONNECTED, null, null); + return info; } } diff --git a/tests/src/com/android/providers/downloads/PublicApiFunctionalTest.java b/tests/src/com/android/providers/downloads/PublicApiFunctionalTest.java index 34a69df9..2661a1f2 100644 --- a/tests/src/com/android/providers/downloads/PublicApiFunctionalTest.java +++ b/tests/src/com/android/providers/downloads/PublicApiFunctionalTest.java @@ -17,6 +17,7 @@ package com.android.providers.downloads; import static com.google.testing.littlemock.LittleMock.anyInt; +import static com.google.testing.littlemock.LittleMock.anyString; import static com.google.testing.littlemock.LittleMock.atLeastOnce; import static com.google.testing.littlemock.LittleMock.isA; import static com.google.testing.littlemock.LittleMock.never; @@ -449,6 +450,8 @@ public class PublicApiFunctionalTest extends AbstractPublicApiTest { receiver.mSystemFacade = mSystemFacade; Intent intent = new Intent(Constants.ACTION_LIST); intent.setData(Uri.parse(Downloads.Impl.CONTENT_URI + "/" + download.mId)); + intent.putExtra(DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS, + new long[] { download.mId }); receiver.onReceive(mContext, intent); assertEquals(1, mSystemFacade.mBroadcastsSent.size()); @@ -523,7 +526,7 @@ public class PublicApiFunctionalTest extends AbstractPublicApiTest { download.runUntilStatus(DownloadManager.STATUS_SUCCESSFUL); runService(); - verify(mNotifManager, never()).notify(anyInt(), isA(Notification.class)); + verify(mNotifManager, never()).notify(anyString(), anyInt(), isA(Notification.class)); // TODO: verify that it never cancels } @@ -536,8 +539,8 @@ public class PublicApiFunctionalTest extends AbstractPublicApiTest { runService(); // TODO: verify different notif types with tags - verify(mNotifManager, atLeastOnce()).notify(anyInt(), isA(Notification.class)); - verify(mNotifManager, times(1)).cancel(anyInt()); + verify(mNotifManager, atLeastOnce()).notify(anyString(), anyInt(), isA(Notification.class)); + verify(mNotifManager, times(1)).cancel(anyString(), anyInt()); } public void testNotificationVisibleComplete() throws Exception { @@ -549,8 +552,8 @@ public class PublicApiFunctionalTest extends AbstractPublicApiTest { runService(); // TODO: verify different notif types with tags - verify(mNotifManager, atLeastOnce()).notify(anyInt(), isA(Notification.class)); - verify(mNotifManager, times(1)).cancel(anyInt()); + verify(mNotifManager, atLeastOnce()).notify(anyString(), anyInt(), isA(Notification.class)); + verify(mNotifManager, times(1)).cancel(anyString(), anyInt()); } public void testRetryAfter() throws Exception { -- cgit v1.2.3 From a8e93e66495dbb9d63f61e49a0e09210989d2e65 Mon Sep 17 00:00:00 2001 From: Baligh Uddin Date: Wed, 14 Nov 2012 08:48:12 -0800 Subject: Import translations. DO NOT MERGE Change-Id: I6ca8a2ceef5a5ad54a9cff1b4194669762d637cf Auto-generated-cl: translation import --- res/values-af/strings.xml | 8 ++++++-- res/values-am/strings.xml | 8 ++++++-- res/values-ar/strings.xml | 8 ++++++-- res/values-be/strings.xml | 8 ++++++-- res/values-bg/strings.xml | 8 ++++++-- res/values-ca/strings.xml | 8 ++++++-- res/values-cs/strings.xml | 8 ++++++-- res/values-da/strings.xml | 8 ++++++-- res/values-de/strings.xml | 12 ++++++++---- res/values-el/strings.xml | 8 ++++++-- res/values-en-rGB/strings.xml | 8 ++++++-- res/values-es-rUS/strings.xml | 8 ++++++-- res/values-es/strings.xml | 8 ++++++-- res/values-et/strings.xml | 8 ++++++-- res/values-fa/strings.xml | 8 ++++++-- res/values-fi/strings.xml | 8 ++++++-- res/values-fr/strings.xml | 8 ++++++-- res/values-hi/strings.xml | 10 +++++++--- res/values-hr/strings.xml | 8 ++++++-- res/values-hu/strings.xml | 8 ++++++-- res/values-in/strings.xml | 8 ++++++-- res/values-it/strings.xml | 8 ++++++-- res/values-iw/strings.xml | 8 ++++++-- res/values-ja/strings.xml | 8 ++++++-- res/values-ko/strings.xml | 8 ++++++-- res/values-lt/strings.xml | 8 ++++++-- res/values-lv/strings.xml | 8 ++++++-- res/values-ms/strings.xml | 8 ++++++-- res/values-nb/strings.xml | 18 +++++++++++------- res/values-nl/strings.xml | 8 ++++++-- res/values-pl/strings.xml | 8 ++++++-- res/values-pt-rPT/strings.xml | 8 ++++++-- res/values-pt/strings.xml | 8 ++++++-- res/values-ro/strings.xml | 8 ++++++-- res/values-ru/strings.xml | 8 ++++++-- res/values-sk/strings.xml | 8 ++++++-- res/values-sl/strings.xml | 8 ++++++-- res/values-sr/strings.xml | 8 ++++++-- res/values-sv/strings.xml | 8 ++++++-- res/values-sw/strings.xml | 8 ++++++-- res/values-th/strings.xml | 8 ++++++-- res/values-tl/strings.xml | 8 ++++++-- res/values-tr/strings.xml | 8 ++++++-- res/values-uk/strings.xml | 8 ++++++-- res/values-vi/strings.xml | 8 ++++++-- res/values-zh-rCN/strings.xml | 8 ++++++-- res/values-zh-rTW/strings.xml | 8 ++++++-- res/values-zu/strings.xml | 8 ++++++-- 48 files changed, 296 insertions(+), 104 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index ba7862a3..9837bfa8 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -33,8 +33,6 @@ "Kry toegang tot alle stelselaflaaisels" "Laat die program toe om alle aflaaisels wat deur enige program op hierdie stelsel geïnisieer is, te sien en te wysig." "<Ongetiteld>" - ", " - " en %d meer" "Aflaai voltooi." "Aflaai onsuksesvol." "Aflaaiselgrootte vereis Wi-Fi." @@ -47,4 +45,10 @@ "Kanselleer" "Begin nou" "%d%%" + + + + + + diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 9893dece..fe1c9620 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -33,8 +33,6 @@ "ሁሉንም የስርዓት ውርዶች ድረስ" "መተግበሪያው በሥርዓቱ ላይ ባለ መተግበሪያ እንዲጀምር የተደረጉ አውርዶችን ለማየት እና ለማሻሻል ይፈቅድለታል::" "<ርዕስ አልባ>" - ", " - " እና %d ተጨማሪ...." "አውርድ ተጠናቋል::" "አውርድ አልተሳካም።" "የአውርድ መጠን Wi-Fi ይጠይቃል" @@ -47,4 +45,10 @@ "ይቅር" "አሁን ጀምር" "%d%%" + + + + + + diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index eac5035b..6122ca66 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -33,8 +33,6 @@ "الدخول إلى جميع تنزيلات النظام" "للسماح للتطبيق بعرض وتعديل جميع التنزيلات التي بدأت من خلال أي تطبيق على النظام." "<بلا عنوان>" - "، " - " و%d أخرى" "اكتمل التنزيل." "أخفق التنزيل." "يتطلب حجم التنزيل شبكة Wi-Fi." @@ -47,4 +45,10 @@ "إلغاء" "البدء الآن" "%d%%" + + + + + + diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml index 7a9f9e47..33b47ecd 100644 --- a/res/values-be/strings.xml +++ b/res/values-be/strings.xml @@ -33,8 +33,6 @@ "Доступ да ўсіх сістэмных спамповак" "Дазваляе прыкладанню праглядаць і змяняць усе спампоўкi, пачатыя любым сiстэмным прыкладаннем." "<Без назвы>" - ", " - " і яшчэ %d" "Спампаванне завершана" "Не атрымалася спампаваць." "Для спампавання патрабуецца сетка Wi-Fi" @@ -47,4 +45,10 @@ "Адмена" "Пачаць прама цяпер" "%d%%" + + + + + + diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 0eef1a85..8793f56a 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -33,8 +33,6 @@ "Достъп до всички изтегляния в системата" "Разрешава на приложението да преглежда и променя всички изтегляния, започнати от всяко приложение в системата." "<Без заглавие>" - ", " - " и още %d" "Изтеглянето завърши." "Изтеглянето не е успешно." "Изисква се Wi-Fi." @@ -47,4 +45,10 @@ "Отказ" "Стартиране сега" "%d%%" + + + + + + diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 6187b5c9..87622b08 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -33,8 +33,6 @@ "Accedeix a totes les baixades del sistema" "Permet que l\'aplicació consulti i modifiqui totes les baixades iniciades per una aplicació al sistema." "<Sense títol>" - ", " - " i %d més" "Baixada completa." "Baixada incorrecta." "Mida baixad. req. Wi-Fi." @@ -47,4 +45,10 @@ "Cancel·la" "Inicia ara" "%d %%" + + + + + + diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index c0850a5a..734ce0e3 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -33,8 +33,6 @@ "Přístup ke všem systémovým stahováním" "Umožňuje aplikaci zobrazit a upravovat všechna stahování zahájená libovolnou aplikací v systému." "<Bez názvu>" - ", " - " a ještě %d" "Stahování dokončeno." "Stahování bylo neúspěšné." "Vzhledem k velikosti stahovaného souboru je vyžadováno připojení Wi-Fi." @@ -47,4 +45,10 @@ "Zrušit" "Spustit" "%d %%" + + + + + + diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index c7110862..4c7382b3 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -33,8 +33,6 @@ "Adgang til alle systemdownloads" "Tillader, at appen kan se og ændre alle downloads, der igangsættes af en app i systemet." "<Uden titel>" - ", " - " og %d mere" "Downloaden er fuldført." "Downloaden mislykkedes." "Downloaden kræver Wi-Fi." @@ -47,4 +45,10 @@ "Annuller" "Begynd nu" "%d %%" + + + + + + diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 7216c07e..a2d079ed 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -23,7 +23,7 @@ "Ermöglicht der App, auf die erweiterten Funktionen des Download-Managers zuzugreifen. Schadprogramme könnten damit Downloads unterbrechen und auf persönliche Informationen zugreifen." "Benachrichtigungen zu Ladevorgängen senden" "Ermöglicht der App, Benachrichtigungen über abgeschlossene Downloads zu senden. Schadprogramme können dadurch andere Apps, die Dateien herunterladen, beeinträchtigen." - "Alle USB-Speicher-Downloads anz." + "Alle USB-Speicher-Downloads" "Alle Downloads an SD-Karte anzeigen" "Ermöglicht der App, alle Downloads auf die SD-Karte anzuzeigen, unabhängig davon, von welcher App diese heruntergeladen wurden" "Speicherplatz im Download-Cache reservieren" @@ -33,10 +33,8 @@ "Zugriff auf alle System-Downloads" "Ermöglicht der App, alle Downloads anzuzeigen und zu ändern, die von Apps auf dem System gestartet wurden" "<Unbenannt>" - ", " - " und %d weitere" "Download abgeschlossen" - "Download fehlgeschlagen" + "Fehler bei Download" "Downloadgröße erfordert WLAN" "Im Hintergrund pausiert" "Download zu groß für Netzwerk dieses Betreibers." @@ -47,4 +45,10 @@ "Abbrechen" "Jetzt starten" "%d %%" + + + + + + diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 6ab87da6..6f139263 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -33,8 +33,6 @@ "Πρόσβαση σε όλα τα στοιχεία λήψης" "Επιτρέπει στην εφαρμογή την προβολή και τροποποίηση όλων των λήψεων που ξεκίνησαν από οποιαδήποτε εφαρμογή του συστήματος." "<Χωρίς τίτλο>" - ", " - " και %d ακόμα" "Η λήψη ολοκληρώθηκε." "Ανεπιτυχής λήψη." "Η λήψη απαιτεί Wi-Fi" @@ -47,4 +45,10 @@ "Ακύρωση" "Έναρξη τώρα" "%d%%" + + + + + + diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 4c9630c3..96c48c49 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -33,8 +33,6 @@ "Access all system downloads" "Allows the app to view and modify all downloads initiated by any app on the system." "<Untitled>" - ", " - " and %d more" "Download complete." "Download unsuccessful." "Download size requires Wi-Fi" @@ -47,4 +45,10 @@ "Cancel" "Start now" "%d%%" + + + + + + diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 422b7443..87ca1670 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -33,8 +33,6 @@ "Acceder a todas las descargas del sistema" "Permite que la aplicación vea y modifique las descargas que inició cualquier aplicación del sistema." "<Sin título>" - ", " - " y %d más" "Se completó la descarga." "No se pudo completar la descarga." "Tamaño requiere Wi-Fi." @@ -47,4 +45,10 @@ "Cancelar" "Comenzar ahora" "%d%%" + + + + + + diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 95594a44..b27efcc7 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -33,8 +33,6 @@ "Acceso a todas las descargas del sistema" "Permite que la aplicación vea y modifique todas las descargas iniciadas por cualquier aplicación del sistema." "<Sin título>" - ", " - " y %d más" "Descarga completada" "Descarga incorrecta" "La descarga requiere Wi-Fi" @@ -47,4 +45,10 @@ "Cancelar" "Empezar ahora" "%d%%" + + + + + + diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index 39812379..b6dae55b 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -33,8 +33,6 @@ "Juurdepääs kõigile süsteemi allalaadimistele" "Võimaldab rakendusel vaadata ja muuta kõiki allalaadimisi, mille algatas süsteemis olev mis tahes rakendus." "<Pealkirjata>" - ", " - " ja %d veel" "Allalaadimine on lõpetatud." "Allalaadimine ebaõnnestus." "Allalaad. on vaja WiFit." @@ -47,4 +45,10 @@ "Tühista" "Alusta nüüd" "%d %%" + + + + + + diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index d8ccb116..56aae2de 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -33,8 +33,6 @@ "دسترسی به همه دانلودهای سیستم" "به برنامهٔ کاربردی اجازه می‌دهد تمام دانلودهای شروع شده توسط هر برنامه‌ای را در سیستم مشاهده کرده و تغییر دهد." "<بدون عنوان>" - "، " - " و %d بیشتر" "دانلود کامل شد." "دانلود ناموفق بود." "برای این حجم از دانلود به Wi-Fi نیاز است." @@ -47,4 +45,10 @@ "لغو" "اکنون شروع" "%d%%" + + + + + + diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 605b0df2..91a71cbc 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -33,8 +33,6 @@ "Käytä kaikkia järjestelmän latauksia" "Antaa sovelluksen tarkastella ja muokata kaikkia minkä tahansa järjestelmän sovelluksen käynnistämiä latauksia." "<Nimetön>" - ", " - " ja %d muuta" "Lataus valmis." "Lataus epäonnistui." "Lataa wifi-yhteydellä" @@ -47,4 +45,10 @@ "Peruuta" "Aloita nyt" "%d %%" + + + + + + diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index e41abc2b..a42246d2 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -33,8 +33,6 @@ "Accéder à tous les téléchargements système" "Permet à l\'application d\'afficher et de modifier tous les téléchargements initiés par n\'importe quelle application du système." "<Sans_titre>" - ", " - " et %d autres" "Téléchargement terminé." "Échec du téléchargement." "Taille du fichier requiert Wi-Fi." @@ -47,4 +45,10 @@ "Annuler" "Commencer" "%d %%" + + + + + + diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 66d89eb6..52153080 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -27,14 +27,12 @@ "SD कार्ड के लिए सभी डाउनलोड देखें" "इस बात पर ध्यान दिए बिना कि किस एप्लिकेशन ने उन्हें डाउनलोड किया है, एप्लिकेशन को SD कार्ड पर किए गए सभी डाउनलोड देखने देता है." "डाउनलोड कैश में स्थान सुरक्षित रखें" - "एप्लिकेशन को डाउनलोड संचय पर फ़ाइलें डाउनलोड करने देता है, जिन्हें स्वचालित रूप से तब हटाया नहीं जा सकता, जब डाउनलोड प्रबंधक को अधिक स्थान की आवश्‍यकता होती है." + "एप्लिकेशन को डाउनलोड संचय पर फ़ाइलें डाउनलोड करने देता है, जिन्हें अपने आप तब हटाया नहीं जा सकता, जब डाउनलोड प्रबंधक को अधिक स्थान की आवश्‍यकता होती है." "बिना सूचना के फ़ाइलें डाउनलोड करें" "उपयोगकर्ता को कोई भी सूचना दिखाए बिना एप्‍लिकेशन को डाउनलोड प्रबंधक द्वारा फ़ाइलें डाउनलोड करने देता है." "सभी सिस्‍टम डाउनलोड में पहुंच प्राप्त करें" "एप्लिकेशन को सिस्टम पर किसी भी एप्लिकेशन द्वारा शुरू किए गए सभी डाउनलोड देखने और संशोधित करने देता है." "<शीर्षक-रहित>" - ", " - " और %d अधिक" "डाउनलोड पूर्ण." "डाउनलोड विफल." "डाउनलोड आकार हेतु Wi-Fi आवश्‍यक." @@ -47,4 +45,10 @@ "रद्द करें" "अब प्रारंभ करें" "%d%%" + + + + + + diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index eddac6a6..86c6b010 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -33,8 +33,6 @@ "Pristup svim preuzimanjima sustava" "Omogućuje aplikaciji prikaz i izmjenu svih preuzimanja koja je pokrenula bilo koja aplikacija u sustavu." "<Bez naslova>" - ", " - " i još %d" "Preuzimanje je dovršeno." "Preuzimanje nije uspjelo." "Veličina zahtijeva Wi-Fi" @@ -47,4 +45,10 @@ "Odustani" "Započni sad" "%d%%" + + + + + + diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index f37b4c0d..24846d74 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -33,8 +33,6 @@ "Hozzáférés a rendszer összes letöltéséhez" "Az alkalmazás megnézheti és módosíthatja a rendszer bármelyik alkalmazása által kezdeményezett letöltést." "<Névtelen>" - ", " - " és további %d" "A letöltés befejeződött." "A letöltés nem sikerült." "A letöltéshez Wi-Fi kell" @@ -47,4 +45,10 @@ "Mégse" "Indítás most" "%d%%" + + + + + + diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 75dad7f1..17624636 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -33,8 +33,6 @@ "Akses semua unduhan sistem" "Mengizinkan apl melihat dan memodifikasi semua unduhan yang dimulai oleh apl apa pun pada sistem." "<Tanpa judul>" - ", " - " dan %d lainnya" "Unduhan selesai." "Unduhan gagal." "Ukuran unduhan memerlukan Wi-Fi." @@ -47,4 +45,10 @@ "Batal" "Mulai sekarang" "%d%%" + + + + + + diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index bffa21ec..af4d55bb 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -33,8 +33,6 @@ "Accesso a tutti i dowload di sistema" "Consente all\'applicazione di visualizzare e modificare tutti i download avviati da qualsiasi applicazione sul sistema." "<Senza nome>" - ", " - " e %d altri" "Download completato." "Download non riuscito." "Wi-Fi richiesto per download" @@ -47,4 +45,10 @@ "Annulla" "Avvia adesso" "%d%%" + + + + + + diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 132ead4e..5cfc033a 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -33,8 +33,6 @@ "גישה לכל הורדות המערכת" "מאפשר ליישום להציג ולשנות את כל ההורדות שהופעלו על ידי יישום כלשהו במערכת." "<ללא כותרת>" - ", " - " ועוד %d" "ההורדה הסתיימה." "ההורדה נכשלה." "גודל ההורדה מחייב חיבור Wi-Fi" @@ -47,4 +45,10 @@ "ביטול" "התחל כעת" "%d%%" + + + + + + diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index b6a3e7ea..0a1c78aa 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -33,8 +33,6 @@ "すべてのシステムダウンロードにアクセス" "システム上の任意のアプリにより開始されたすべてのダウンロードの表示と変更をアプリに許可します。" "<無題>" - "、 " - " その他%d件" "ダウンロードが完了しました。" "ダウンロードできませんでした。" "Wi-Fi必須のサイズです。" @@ -47,4 +45,10 @@ "キャンセル" "今すぐ開始" "%d%%" + + + + + + diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 8dbdf61c..661a07d5 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -33,8 +33,6 @@ "모든 시스템 다운로드에 액세스" "시스템에 설치된 모든 앱에서 다운로드한 항목을 앱이 보고 수정할 수 있도록 허용합니다." "<제목 없음>" - ", " - " 외 %d개" "다운로드가 완료되었습니다." "다운로드에 실패했습니다." "크기가 너무 커서 Wi-Fi로 다운로드해야 합니다." @@ -47,4 +45,10 @@ "취소" "지금 시작" "%d%%" + + + + + + diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index df083475..c4e03e5c 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -33,8 +33,6 @@ "Pasiekti visus sistemos atsisiuntimus" "Leidžiama programai žiūrėti ir keisti visus atsisiuntimus, pradėtus naudojant bet kokią sistemos programą." "<Be pavadinimo>" - ", " - " ir dar %d" "Atsisiuntimas baigtas." "Atsisiuntimas nesėkmingas." "Did. f., reikia „Wi-Fi“." @@ -47,4 +45,10 @@ "Atšaukti" "Pradėti dabar" "%d %%" + + + + + + diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 322c2819..059f0de3 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -33,8 +33,6 @@ "Piekļuve visām sistēmas lejupielādēm" "Ļauj lietotnei skatīt un pārveidot visas lejupielādes, kas veiktas, izmantojot jebkuru sistēmas lietotni." "<Bez nosaukuma>" - ", " - " un vēl %d" "Lejupielāde ir pabeigta." "Lejupielāde neizdevās." "Lejupiel. nepiec. Wi-Fi." @@ -47,4 +45,10 @@ "Atcelt" "Sākt tūlīt" "%d%%" + + + + + + diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml index fb92ac78..cf4aa652 100644 --- a/res/values-ms/strings.xml +++ b/res/values-ms/strings.xml @@ -33,8 +33,6 @@ "Mengakses semua muat turun sistem" "Membenarkan aplikasi untuk melihat dan mengubah suai semua muat turun yang dimulakan oleh mana-mana aplikasi pada sistem." "<Tidak bertajuk>" - ", " - " dan %d lagi" "Muat turun selesai." "Muat turun tidak berjaya." "Saiz m.trn perlukn Wi-Fi" @@ -47,4 +45,10 @@ "Batal" "Mulakan sekarang" "%d%%" + + + + + + diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 985e9f7d..95815d6b 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -23,18 +23,16 @@ "Gir appen adgang til avanserte funksjoner i nedlastingsbehandlingen. Skadelig programvare kan bruke dette til å forstyrre nedlastinger og få tilgang til privat informasjon." "Sende nedlastingsvarslinger" "Gir appen tillatelse til å sende varslinger om fullførte nedlastinger. Skadelig programvare kan bruke dette til å forstyrre andre programmer som laster ned filer." - "Vis nedl. til USB-lagring" - "Vis alle nedlastinger til minnekort" + "Se nedlastinger til USB-lagr." + "Se alle nedlastinger til minnekort" "Gir appen tilgang til alle nedlastinger på SD-kortet, uavhengig av hvilken app som lastet dem ned." - "Reserver lagringsplass i nedlastingsbufferen" + "Reservere lagringsplass i nedlastingsbufferen" "Gir appen tillatelse til å laste ned filer til nedlastingsbufferen, slik at de ikke slettes automatisk når nedlastingsbehandlingen trenger mer lagringsplass." - "last ned filer uten varsling" + "laste ned filer uten varsling" "Gir appen tillatelse til å laste ned filer via nedlastingsbehandlingen uten at brukeren varsles." - "Tilgang til alle systemnedlastinger" + "Se alle systemnedlastinger" "Gir appen tillatelse til å se og endre alle nedlastinger uansett hvilken systemapp som har startet nedlastingene." "<Uten navn>" - ", " - " og %d til" "Nedlasting fullført." "Nedlasting mislyktes." "Krever Wi-Fi pga. størr." @@ -47,4 +45,10 @@ "Avbryt" "Start nå" "%d %%" + + + + + + diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 63634541..a1554424 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -33,8 +33,6 @@ "Toegang geven tot alle systeemdownloads" "Hiermee kan de app alle downloads bekijken en wijzigen die door een systeemapp zijn gestart." "<Zonder titel>" - ", " - " en nog %d meer" "Downloaden is voltooid." "Downloaden is mislukt." "Wifi nodig voor download" @@ -47,4 +45,10 @@ "Annuleren" "Nu starten" "%d%%" + + + + + + diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 5f15f993..c28b159a 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -33,8 +33,6 @@ "Dostęp do wszystkich pobranych pozycji w systemie" "Zezwala aplikacji na wyświetlanie i modyfikowanie wszystkich plików pobranych w dowolnej aplikacji w systemie." "<Bez nazwy>" - ", " - " i inne (%d)" "Pobieranie ukończone." "Pobranie nie powiodło się." "Pobieranie wymaga Wi-Fi" @@ -47,4 +45,10 @@ "Anuluj" "Rozpocznij teraz" "%d%%" + + + + + + diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 4d22341e..086e6f31 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -33,8 +33,6 @@ "Aceder a todas as transferências do sistema" "Permite que a aplicação veja e modifique todas as transferências iniciadas por qualquer aplicação no sistema." "<Sem nome>" - ", " - " e mais %d" "Transferência concluída." "Falha na transferência." "Tam. transf. exige wifi" @@ -47,4 +45,10 @@ "Cancelar" "Começar agora" "%d%%" + + + + + + diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index d567fd8e..f45accf1 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -33,8 +33,6 @@ "Acessar todos os downloads do sistema" "Permite que o aplicativo visualize e modifique todos os downloads iniciados por qualquer aplicativo no sistema." "<Sem título>" - ", " - " e %d mais" "Download concluído." "Falha no download." "O tamanho do download requer Wi-Fi." @@ -47,4 +45,10 @@ "Cancelar" "Iniciar agora" "%d%%" + + + + + + diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 78c3692b..1bb11a2b 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -33,8 +33,6 @@ "Accesaţi toate descărcările din sistem" "Permite aplicaţiei să vizualizeze şi să modifice toate descărcările iniţiate de orice aplicaţie din sistem." "<Fără titlu>" - ", " - " şi încă %d" "Descărcare finalizată." "Descărcare nereuşită." "Dimen. desc. nec. Wi-Fi" @@ -47,4 +45,10 @@ "Anulaţi" "Începeţi acum" "%d %%" + + + + + + diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index af380780..9611e58a 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -33,8 +33,6 @@ "Доступ ко всем загрузкам" "Приложение сможет открывать и изменять загрузки независимо от того, через какое ПО они были загружены." "<без названия>" - ", " - " и ещё %d" "Загрузка завершена." "Не удалось загрузить файл." "Загрузка только по Wi-Fi" @@ -47,4 +45,10 @@ "Отмена" "Запустить" "%d%%" + + + + + + diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 78bd63e9..3cb535bc 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -33,8 +33,6 @@ "Prístup ku všetkým systémovým prevzatiam" "Umožňuje aplikácii zobraziť a upravovať všetky preberania spustené ľubovoľnou aplikáciou v systéme." "<Bez názvu>" - ", " - " a ďalšie (%d)" "Preberanie dokončené." "Preberanie bolo neúspešné." "Vzhľadom na veľkosť preberaného súboru sa vyžaduje pripojenie Wi-Fi" @@ -47,4 +45,10 @@ "Zrušiť" "Spustiť" "%d %%" + + + + + + diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 37d226c8..fc9fd75b 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -33,8 +33,6 @@ "Dostop do vseh sistemskih prenosov" "Dovoli programu prikaz in spreminjanje vseh prenosov, ki jih je začel poljubni program v sistemu." "<Brez naslova>" - ", " - " in dodatnih %d" "Prenos je končan." "Prenos ni uspel." "Zahtev. je povez. Wi-Fi." @@ -47,4 +45,10 @@ "Prekliči" "Začni zdaj" "%d%%" + + + + + + diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index b9636962..86d515c8 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -33,8 +33,6 @@ "Приступи свим системским преузимањима" "Омогућава апликацији да прегледа и мења сва преузимања која је покренула било која апликација у систему." "<Без наслова>" - ", " - " и још %d" "Преузимање је завршено." "Преузимање није успело." "Величина ставке захтева Wi-Fi." @@ -47,4 +45,10 @@ "Откажи" "Започни одмах" "%d%%" + + + + + + diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index e9b0852b..6774b12d 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -33,8 +33,6 @@ "Åtkomst till alla hämtade filer i systemet" "Tillåter att appen visar och ändrar alla hämtningar som initieras av en app i systemet." "<Okänd>" - ", " - " och %d till" "Hämtningen har slutförts." "Det gick inte att hämta." "Hämtningen kräver Wi-Fi." @@ -47,4 +45,10 @@ "Avbryt" "Starta nu" "%d %%" + + + + + + diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 3fcf9c04..97429913 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -33,8 +33,6 @@ "Fikia vipakuzi vyote vya mfumo" "Inaruhusu programu kuona na kurekebisha vipakuzi vyote vilivyoanzishwa na programu yoyote kwenye mfumo." "<Haina Kichwa>" - ", " - " na %d zaidi" "Upakuaji umekamilika" "Kupakua hakujafaulu." "Ukubwa wa kipakuzi uhitaji Wi-Fi" @@ -47,4 +45,10 @@ "Ghairi" "Anza sasa" "%d%%" + + + + + + diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index b5be9052..4725622a 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -33,8 +33,6 @@ "เข้าถึงดาวน์โหลดทั้งหมดของระบบ" "อนุญาตให้แอปพลิเคชันนี้ดูและแก้ไขรายการดาวน์โหลดทั้งหมดของทุกแอปพลิเคชันในระบบ" "<ไม่มีชื่อ>" - ", " - " และอีก %d รายการ" "ดาวน์โหลดเสร็จสมบูรณ์" "ดาวน์โหลดไม่สำเร็จ" "ต้องใช้ WiFi ดาวน์โหลด" @@ -47,4 +45,10 @@ "ยกเลิก" "เริ่มต้นเดี๋ยวนี้" "%d%%" + + + + + + diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index f4d970de..da06dc7e 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -33,8 +33,6 @@ "I-access ang lahat ng mga pag-download ng system" "Pinapayagan ang app na tingnan at baguhin ang lahat ng download na sinimulan ng anumang app sa system." "<Walang pamagat>" - ", " - " at %d pa" "Kumpleto na ang download." "Hindi matagumpay ang pag-download." "Kailangan ng laki ng download ng Wi-Fi." @@ -47,4 +45,10 @@ "Kanselahin" "Magsimula ngayon" "%d%%" + + + + + + diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 66cb2ab3..eb316ed0 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -33,8 +33,6 @@ "Tüm sistem indirmelerine erişim" "Uygulamaya, sistemdeki herhangi bir uygulama tarafından başlatılan tüm indirme işlemlerini görüntüleme ve değiştirme izni verir." "<Adsız>" - ", " - " ve %d adet daha" "İndirme işlemi tamamlandı." "İndirme işlemi başarısız oldu." "İndirme boyutu Kablosuz bağlantı gerektiriyor." @@ -47,4 +45,10 @@ "İptal" "Şimdi başlat" "%%%d" + + + + + + diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 08a703f2..bfd7bef2 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -33,8 +33,6 @@ "Отримувати доступ до всіх завантажень у системі" "Дозволяє програмі переглядати та змінювати всі завантаження, ініційовані будь-якою програмою в системі." "<Без назви>" - ", " - " і ще %d" "Завантаження закінчено." "Завантаження не виконано." "Для завант.потрібен WiFi" @@ -47,4 +45,10 @@ "Скасувати" "Почати зараз" "%d%%" + + + + + + diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index ff6aeb22..658cb6ec 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -33,8 +33,6 @@ "Truy cập tất cả các bản tải xuống trong hệ thống" "Cho phép ứng dụng xem và sửa đổi tất cả các bản tải xuống được khởi tạo bởi bất kỳ ứng dụng nào trên hệ thống." "<Không có tiêu đề>" - ", " - " và %d mục khác" "Tải xuống hoàn tất." "Tải xuống không thành công." "Yêu cầu Wi-Fi." @@ -47,4 +45,10 @@ "Hủy" "Bắt đầu ngay bây giờ" "%d%%" + + + + + + diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 40681fcc..6c55864c 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -33,8 +33,6 @@ "访问所有系统下载内容" "允许该应用查看和修改系统上的任意应用下载的所有内容。" "<未命名>" - ", " - " 还有 %d 项" "下载已完成。" "下载失败。" "文件过大,需要通过 Wi-Fi 下载。" @@ -47,4 +45,10 @@ "取消" "立即开始" "%d%%" + + + + + + diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 1735e4dc..8d7583bd 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -33,8 +33,6 @@ "存取所有系統下載內容" "允許應用程式檢視及修改系統上任一應用程式下載的所有內容。" "<未命名>" - ", " - " 以及其他 %d 個" "下載完成。" "下載失敗。" "這個檔案較大,需要透過 Wi-Fi 下載。" @@ -47,4 +45,10 @@ "取消" "立即開始" "%d%%" + + + + + + diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 04962dc3..bf7942b9 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -33,8 +33,6 @@ "Finyelela kuko konke ukulanda kwesistimu" "vumela insiza ukuthi ibone iphinde iguqule konke okulayishiwe okuqalwe insiza ekwisistimu." "<Akunasihloko>" - ", " - " nokungu-%d okungaphezulu" "Ukulayisha ungenisa kuqedile" "Ukulayisha akuphumelelanga" "Usayizi wokulanda udinga i-Wi-Fi" @@ -47,4 +45,10 @@ "Khansela" "Qala manje" "%d%%" + + + + + + -- cgit v1.2.3 From 52b703c5d0c4cff72bafdec0e2229368d3cc20d0 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Mon, 12 Nov 2012 16:50:17 -0800 Subject: Show remaining time in download notifications. Calculate speed of in-progress downloads and estimate time remaining until completion. Uses a moving average that is weighted 1:1 with the most recent 500ms sample. Funnels timing data to notifications through DownloadHandler. Bug: 6777872 Change-Id: I9155f2979aa330bd1172f63bbfca1d053815cee5 --- res/values/strings.xml | 3 ++ .../providers/downloads/DownloadHandler.java | 46 ++++++++++++++++------ .../providers/downloads/DownloadNotifier.java | 13 ++++-- .../providers/downloads/DownloadService.java | 2 + .../providers/downloads/DownloadThread.java | 37 ++++++++++++++++- .../downloads/DownloadProviderFunctionalTest.java | 2 +- 6 files changed, 86 insertions(+), 17 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index c607e35f..3a060e2d 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -205,6 +205,9 @@ %d files waiting + + %s left + diff --git a/src/com/android/providers/downloads/DownloadHandler.java b/src/com/android/providers/downloads/DownloadHandler.java index 29d34700..dff09eb0 100644 --- a/src/com/android/providers/downloads/DownloadHandler.java +++ b/src/com/android/providers/downloads/DownloadHandler.java @@ -18,6 +18,9 @@ package com.android.providers.downloads; import android.content.res.Resources; import android.util.Log; +import android.util.LongSparseArray; + +import com.android.internal.annotations.GuardedBy; import java.util.ArrayList; import java.util.HashMap; @@ -25,31 +28,37 @@ import java.util.Iterator; import java.util.LinkedHashMap; public class DownloadHandler { - private static final String TAG = "DownloadHandler"; + + @GuardedBy("this") private final LinkedHashMap mDownloadsQueue = new LinkedHashMap(); + @GuardedBy("this") private final HashMap mDownloadsInProgress = new HashMap(); - private static final DownloadHandler mDownloadHandler = new DownloadHandler(); + @GuardedBy("this") + private final LongSparseArray mRemainingMillis = new LongSparseArray(); + private final int mMaxConcurrentDownloadsAllowed = Resources.getSystem().getInteger( com.android.internal.R.integer.config_MaxConcurrentDownloadsAllowed); - static DownloadHandler getInstance() { - return mDownloadHandler; + private static final DownloadHandler sDownloadHandler = new DownloadHandler(); + + public static DownloadHandler getInstance() { + return sDownloadHandler; } - synchronized void enqueueDownload(DownloadInfo info) { + public synchronized void enqueueDownload(DownloadInfo info) { if (!mDownloadsQueue.containsKey(info.mId)) { if (Constants.LOGV) { Log.i(TAG, "enqueued download. id: " + info.mId + ", uri: " + info.mUri); } mDownloadsQueue.put(info.mId, info); - startDownloadThread(); + startDownloadThreadLocked(); } } - private synchronized void startDownloadThread() { + private void startDownloadThreadLocked() { Iterator keys = mDownloadsQueue.keySet().iterator(); ArrayList ids = new ArrayList(); while (mDownloadsInProgress.size() < mMaxConcurrentDownloadsAllowed && keys.hasNext()) { @@ -67,21 +76,34 @@ public class DownloadHandler { } } - synchronized boolean hasDownloadInQueue(long id) { + public synchronized boolean hasDownloadInQueue(long id) { return mDownloadsQueue.containsKey(id) || mDownloadsInProgress.containsKey(id); } - synchronized void dequeueDownload(long mId) { - mDownloadsInProgress.remove(mId); - startDownloadThread(); + public synchronized void dequeueDownload(long id) { + mDownloadsInProgress.remove(id); + mRemainingMillis.remove(id); + startDownloadThreadLocked(); if (mDownloadsInProgress.size() == 0 && mDownloadsQueue.size() == 0) { notifyAll(); } } + public synchronized void setRemainingMillis(long id, long millis) { + mRemainingMillis.put(id, millis); + } + + /** + * Return remaining time until given {@link DownloadInfo} finishes, in + * milliseconds, or -1 if unknown. + */ + public synchronized long getRemainingMillis(long id) { + return mRemainingMillis.get(id, -1L); + } + // right now this is only used by tests. but there is no reason why it can't be used // by any module using DownloadManager (TODO add API to DownloadManager.java) - public synchronized void WaitUntilDownloadsTerminate() throws InterruptedException { + public synchronized void waitUntilDownloadsTerminate() throws InterruptedException { if (mDownloadsInProgress.size() == 0 && mDownloadsQueue.size() == 0) { if (Constants.LOGVV) { Log.i(TAG, "nothing to wait on"); diff --git a/src/com/android/providers/downloads/DownloadNotifier.java b/src/com/android/providers/downloads/DownloadNotifier.java index a1805e5e..f6e7a2ee 100644 --- a/src/com/android/providers/downloads/DownloadNotifier.java +++ b/src/com/android/providers/downloads/DownloadNotifier.java @@ -31,16 +31,15 @@ import android.content.res.Resources; import android.net.Uri; import android.provider.Downloads; import android.text.TextUtils; +import android.text.format.DateUtils; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; -import java.util.Set; import javax.annotation.concurrent.GuardedBy; @@ -160,18 +159,26 @@ public class DownloadNotifier { String remainingText = null; String percentText = null; if (type == TYPE_ACTIVE) { + final DownloadHandler handler = DownloadHandler.getInstance(); + long current = 0; long total = 0; + long remainingMillis = -1; for (DownloadInfo info : cluster) { if (info.mTotalBytes != -1) { current += info.mCurrentBytes; total += info.mTotalBytes; + remainingMillis = Math.max( + handler.getRemainingMillis(info.mId), remainingMillis); } } if (total > 0) { final int percent = (int) ((current * 100) / total); - // TODO: calculate remaining time based on recent bandwidth + if (remainingMillis != -1) { + remainingText = res.getString(R.string.download_remaining, + DateUtils.formatDuration(remainingMillis)); + } percentText = res.getString(R.string.download_percent, percent); builder.setProgress(100, percent, false); diff --git a/src/com/android/providers/downloads/DownloadService.java b/src/com/android/providers/downloads/DownloadService.java index 0a16a7d1..5b767a27 100644 --- a/src/com/android/providers/downloads/DownloadService.java +++ b/src/com/android/providers/downloads/DownloadService.java @@ -39,6 +39,7 @@ import android.provider.Downloads; import android.text.TextUtils; import android.util.Log; +import com.android.internal.annotations.GuardedBy; import com.android.internal.util.IndentingPrintWriter; import com.google.android.collect.Maps; import com.google.common.annotations.VisibleForTesting; @@ -72,6 +73,7 @@ public class DownloadService extends Service { * downloads based on this data, so that it can deal with situation where the data in the * content provider changes or disappears. */ + @GuardedBy("mDownloads") private Map mDownloads = Maps.newHashMap(); /** diff --git a/src/com/android/providers/downloads/DownloadThread.java b/src/com/android/providers/downloads/DownloadThread.java index e74d5c72..2bd3d362 100644 --- a/src/com/android/providers/downloads/DownloadThread.java +++ b/src/com/android/providers/downloads/DownloadThread.java @@ -29,6 +29,7 @@ import android.net.http.AndroidHttpClient; import android.os.FileUtils; import android.os.PowerManager; import android.os.Process; +import android.os.SystemClock; import android.provider.Downloads; import android.text.TextUtils; import android.util.Log; @@ -100,6 +101,15 @@ public class DownloadThread extends Thread { public long mBytesNotified = 0; public long mTimeLastNotification = 0; + /** Historical bytes/second speed of this download. */ + public long mSpeed; + /** Time when current sample started. */ + public long mSpeedSampleStart; + /** Bytes transferred since current sample started. */ + public long mSpeedSampleBytes; + /** Estimated time until finished. */ + public long mRemainingMillis; + public State(DownloadInfo info) { mMimeType = Intent.normalizeMimeType(info.mMimeType); mRequestUri = info.mUri; @@ -423,7 +433,32 @@ public class DownloadThread extends Thread { * Report download progress through the database if necessary. */ private void reportProgress(State state, InnerState innerState) { - long now = mSystemFacade.currentTimeMillis(); + final long now = SystemClock.elapsedRealtime(); + + final long sampleDelta = now - state.mSpeedSampleStart; + if (sampleDelta > 500) { + final long sampleSpeed = ((state.mCurrentBytes - state.mSpeedSampleBytes) * 1000) + / sampleDelta; + + if (state.mSpeed == 0) { + state.mSpeed = sampleSpeed; + } else { + state.mSpeed = (state.mSpeed + sampleSpeed) / 2; + } + + state.mSpeedSampleStart = now; + state.mSpeedSampleBytes = state.mCurrentBytes; + + if (state.mSpeed != 0) { + state.mRemainingMillis = ((state.mTotalBytes - state.mCurrentBytes) * 1000) + / state.mSpeed; + } else { + state.mRemainingMillis = -1; + } + + DownloadHandler.getInstance().setRemainingMillis(mInfo.mId, state.mRemainingMillis); + } + if (state.mCurrentBytes - state.mBytesNotified > Constants.MIN_PROGRESS_STEP && now - state.mTimeLastNotification > Constants.MIN_PROGRESS_TIME) { ContentValues values = new ContentValues(); diff --git a/tests/src/com/android/providers/downloads/DownloadProviderFunctionalTest.java b/tests/src/com/android/providers/downloads/DownloadProviderFunctionalTest.java index bbc5c3e0..23d300f8 100644 --- a/tests/src/com/android/providers/downloads/DownloadProviderFunctionalTest.java +++ b/tests/src/com/android/providers/downloads/DownloadProviderFunctionalTest.java @@ -116,7 +116,7 @@ public class DownloadProviderFunctionalTest extends AbstractDownloadProviderFunc int rslt = getDownloadStatus(downloadUri); if (rslt == Downloads.Impl.STATUS_RUNNING || rslt == Downloads.Impl.STATUS_PENDING) { Log.i(TAG, "status is: " + rslt + ", for: " + downloadUri); - DownloadHandler.getInstance().WaitUntilDownloadsTerminate(); + DownloadHandler.getInstance().waitUntilDownloadsTerminate(); Thread.sleep(100); } else { done = true; -- cgit v1.2.3 From 53948fb5ec17bdeffb1990554eebd8e6e7456016 Mon Sep 17 00:00:00 2001 From: Baligh Uddin Date: Fri, 16 Nov 2012 13:02:06 -0800 Subject: Import translations. DO NOT MERGE Change-Id: I79fc66232d0405d1a631ff00ae21579baa4d6a3f Auto-generated-cl: translation import --- res/values-af/strings.xml | 15 ++++++++++----- res/values-am/strings.xml | 15 ++++++++++----- res/values-ar/strings.xml | 15 ++++++++++----- res/values-be/strings.xml | 15 ++++++++++----- res/values-bg/strings.xml | 15 ++++++++++----- res/values-ca/strings.xml | 15 ++++++++++----- res/values-cs/strings.xml | 15 ++++++++++----- res/values-da/strings.xml | 15 ++++++++++----- res/values-de/strings.xml | 15 ++++++++++----- res/values-el/strings.xml | 15 ++++++++++----- res/values-en-rGB/strings.xml | 16 ++++++++++------ res/values-es-rUS/strings.xml | 15 ++++++++++----- res/values-es/strings.xml | 15 ++++++++++----- res/values-et/strings.xml | 15 ++++++++++----- res/values-fa/strings.xml | 15 ++++++++++----- res/values-fi/strings.xml | 15 ++++++++++----- res/values-fr/strings.xml | 2 ++ res/values-hi/strings.xml | 15 ++++++++++----- res/values-hr/strings.xml | 15 ++++++++++----- res/values-hu/strings.xml | 15 ++++++++++----- res/values-in/strings.xml | 15 ++++++++++----- res/values-it/strings.xml | 15 ++++++++++----- res/values-iw/strings.xml | 15 ++++++++++----- res/values-ja/strings.xml | 15 ++++++++++----- res/values-ko/strings.xml | 15 ++++++++++----- res/values-lt/strings.xml | 15 ++++++++++----- res/values-lv/strings.xml | 15 ++++++++++----- res/values-ms/strings.xml | 15 ++++++++++----- res/values-nb/strings.xml | 15 ++++++++++----- res/values-nl/strings.xml | 15 ++++++++++----- res/values-pl/strings.xml | 15 ++++++++++----- res/values-pt-rPT/strings.xml | 15 ++++++++++----- res/values-pt/strings.xml | 15 ++++++++++----- res/values-ro/strings.xml | 15 ++++++++++----- res/values-ru/strings.xml | 2 ++ res/values-sk/strings.xml | 15 ++++++++++----- res/values-sl/strings.xml | 15 ++++++++++----- res/values-sr/strings.xml | 15 ++++++++++----- res/values-sv/strings.xml | 15 ++++++++++----- res/values-sw/strings.xml | 15 ++++++++++----- res/values-th/strings.xml | 15 ++++++++++----- res/values-tl/strings.xml | 15 ++++++++++----- res/values-tr/strings.xml | 15 ++++++++++----- res/values-uk/strings.xml | 15 ++++++++++----- res/values-vi/strings.xml | 15 ++++++++++----- res/values-zh-rCN/strings.xml | 15 ++++++++++----- res/values-zh-rTW/strings.xml | 15 ++++++++++----- res/values-zu/strings.xml | 15 ++++++++++----- 48 files changed, 464 insertions(+), 231 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 9837bfa8..3727f686 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -45,10 +45,15 @@ "Kanselleer" "Begin nou" "%d%%" - - - - - + + "1 leêr laai tans af" + "%d leêrs laai tans af" + + + "1 leêr wag tans" + "%d leêrs wag tans" + + + "Kan nie lêer oopmaak nie" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index fe1c9620..2e72fb31 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -45,10 +45,15 @@ "ይቅር" "አሁን ጀምር" "%d%%" - - - - - + + "1 ፋይል በማውረድ ላይ" + "%d ፋይሎች በማውረድ ላይ" + + + "1 ፋይል በመጠበቅ ላይ" + "%d ፋይሎች በመጠበቅ ላይ" + + + "ፋይል መክፈት አይቻልም" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 6122ca66..8fff7ce0 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -45,10 +45,15 @@ "إلغاء" "البدء الآن" "%d%%" - - - - - + + "جارٍ تنزيل ملف واحد" + "جارٍ تنزيل %d من الملفات" + + + "هناك ملف واحد في وضع الانتظار" + "هناك %d من الملفات في وضع الانتظار" + + + "لا يمكن فتح الملف" diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml index 33b47ecd..8ef74382 100644 --- a/res/values-be/strings.xml +++ b/res/values-be/strings.xml @@ -45,10 +45,15 @@ "Адмена" "Пачаць прама цяпер" "%d%%" - - - - - + + "Спампоўваецца 1 файл" + "Спампоўваюцца файлы: %d" + + + "1 файл чакае" + "Файлы чакаюць: %d" + + + "Не атрымлiваецца адкрыць файл" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 8793f56a..63c12a34 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -45,10 +45,15 @@ "Отказ" "Стартиране сега" "%d%%" - - - - - + + "1 файл се изтегля" + "%d файла се изтеглят" + + + "1 файл се изчаква" + "%d файла се изчакват" + + + "Файлът не може да се отвори" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 87622b08..9de1e6b7 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -45,10 +45,15 @@ "Cancel·la" "Inicia ara" "%d %%" - - - - - + + "S\'està baixant 1 fitxer" + "S\'estan baixant %d fitxers" + + + "S\'està esperant 1 fitxer" + "S\'estan esperant %d fitxers" + + + "No es pot obrir el fitxer" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 734ce0e3..2be041db 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -45,10 +45,15 @@ "Zrušit" "Spustit" "%d %%" - - - - - + + "Stahuje se 1 soubor" + "Stahované soubory: %d" + + + "1 čekající soubor" + "Čekající soubory: %d" + + + "Soubor nelze otevřít" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 4c7382b3..3fc9bb6f 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -45,10 +45,15 @@ "Annuller" "Begynd nu" "%d %%" - - - - - + + "1 fil downloades" + "%d filer downloades" + + + "1 fil venter" + "%d filer venter" + + + "Filen kan ikke åbnes" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index a2d079ed..b0daa8bc 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -45,10 +45,15 @@ "Abbrechen" "Jetzt starten" "%d %%" - - - - - + + "1 Datei wird heruntergeladen..." + "%d Dateien werden heruntergeladen." + + + "1 Datei steht aus." + "%d Dateien stehen aus." + + + "Datei kann nicht geöffnet werden." diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 6f139263..dbb15038 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -45,10 +45,15 @@ "Ακύρωση" "Έναρξη τώρα" "%d%%" - - - - - + + "Γίνεται λήψη 1 αρχείου" + "Γίνεται λήψη %d αρχείων" + + + "1 αρχείο σε αναμονή" + "%d αρχεία σε αναμονή" + + + "Δεν είναι δυνατό το άνοιγμα του αρχείου" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 96c48c49..72a171a2 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -45,10 +45,14 @@ "Cancel" "Start now" "%d%%" - - - - - - + + "1 file downloading" + "%d files downloading" + + + "1 file waiting" + "%d files waiting" + + "%s left" + "Can\'t open file" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 87ca1670..174fc5b4 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -45,10 +45,15 @@ "Cancelar" "Comenzar ahora" "%d%%" - - - - - + + "Descargando 1 archivo..." + "Descargando %d archivos..." + + + "1 archivo en espera" + "%d archivos en espera" + + + "No se puede abrir el archivo." diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index b27efcc7..77f17fcb 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -45,10 +45,15 @@ "Cancelar" "Empezar ahora" "%d%%" - - - - - + + "Descargando 1 archivo" + "Descargando %d archivos" + + + "1 archivo en espera" + "%d archivos en espera" + + + "Error al abrir el archivo" diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index b6dae55b..f5277597 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -45,10 +45,15 @@ "Tühista" "Alusta nüüd" "%d %%" - - - - - + + "1 faili allalaadimine" + "%d faili allalaadimine" + + + "1 fail on ootel" + "%d faili on ootel" + + + "Faili ei saa avada" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 56aae2de..b164098d 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -45,10 +45,15 @@ "لغو" "اکنون شروع" "%d%%" - - - - - + + "۱ فایل در حال دانلود" + "%d فایل در حال دانلود" + + + "۱ فایل در انتظار" + "%d فایل در انتظار" + + + "فایل باز نمی‌شود" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 91a71cbc..202d3d64 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -45,10 +45,15 @@ "Peruuta" "Aloita nyt" "%d %%" - - - - - + + "1 tiedostoa ladataan" + "%d tiedostoa ladataan" + + + "1 tiedosto odottaa" + "%d tiedostoa odottaa" + + + "Tiedostoa ei voi avata" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index a42246d2..f3871f0b 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -49,6 +49,8 @@ + + diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 52153080..80e6d9fa 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -45,10 +45,15 @@ "रद्द करें" "अब प्रारंभ करें" "%d%%" - - - - - + + "1 फ़ाइल डाउनलोड हो रही है" + "%d फ़ाइलें डाउनलोड हो रही हैं" + + + "1 फ़ाइल प्रतीक्षा में है" + "%d फ़ाइलें प्रतीक्षा में हैं" + + + "फ़ाइल नहीं खोली जा सकती" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 86c6b010..128bc0e7 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -45,10 +45,15 @@ "Odustani" "Započni sad" "%d%%" - - - - - + + "Preuzimanje 1 datoteke" + "Preuzimanje datoteka (%d)" + + + "1 datoteka na čekanju" + "Datoteke na čekanju (%d)" + + + "Datoteka se ne može otvoriti" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 24846d74..834cd6a8 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -45,10 +45,15 @@ "Mégse" "Indítás most" "%d%%" - - - - - + + "1 fájl letöltése folyamatban" + "%d fájl letöltése folyamatban" + + + "1 fájl várakozik" + "%d fájl várakozik" + + + "A fájlt nem lehet megnyitni." diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 17624636..0fc25b68 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -45,10 +45,15 @@ "Batal" "Mulai sekarang" "%d%%" - - - - - + + "Mengunduh 1 file" + "Mengunduh %d file" + + + "1 file menunggu" + "%d file menunggu" + + + "Tidak dapat membuka file" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index af4d55bb..bb485fd7 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -45,10 +45,15 @@ "Annulla" "Avvia adesso" "%d%%" - - - - - + + "1 file in download" + "%d file in download" + + + "1 file in attesa" + "%d file in attesa" + + + "Impossibile aprire il file" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 5cfc033a..6c8bd25c 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -45,10 +45,15 @@ "ביטול" "התחל כעת" "%d%%" - - - - - + + "מתבצעת הורדה של קובץ אחד" + "מתבצעת הורדה של %d קבצים" + + + "קובץ אחד ממתין" + "%d קבצים ממתינים" + + + "לא ניתן לפתוח את הקובץ" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 0a1c78aa..f76abf8d 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -45,10 +45,15 @@ "キャンセル" "今すぐ開始" "%d%%" - - - - - + + "1ファイルをダウンロード中" + "%dファイルをダウンロード中" + + + "1ファイルがダウンロード待ち" + "%dファイルがダウンロード待ち" + + + "ファイルを開くことができません" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 661a07d5..9df63329 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -45,10 +45,15 @@ "취소" "지금 시작" "%d%%" - - - - - + + "1개의 파일 다운로드 중" + "%d개의 파일 다운로드 중" + + + "1개의 파일 대기 중" + "%d개의 파일 대기 중" + + + "파일을 열 수 없음" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index c4e03e5c..a4bb7e14 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -45,10 +45,15 @@ "Atšaukti" "Pradėti dabar" "%d %%" - - - - - + + "Atsisiunčiama failų: 1" + "Atsisiunčiama failų: %d" + + + "Laukiama failų: 1" + "Laukiama failų: %d" + + + "Nepavyksta atidaryti failo" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 059f0de3..06bc31c5 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -45,10 +45,15 @@ "Atcelt" "Sākt tūlīt" "%d%%" - - - - - + + "Notiek 1 faila lejupielāde" + "Notiek %d failu lejupielāde" + + + "Rindā: 1 fails" + "Rindā: %d faili" + + + "Nevar atvērt failu" diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml index cf4aa652..77c10366 100644 --- a/res/values-ms/strings.xml +++ b/res/values-ms/strings.xml @@ -45,10 +45,15 @@ "Batal" "Mulakan sekarang" "%d%%" - - - - - + + "1 fail sedang dimuat turun" + "%d fail sedang dimuat turun" + + + "1 fail sedang menunggu" + "%d fail sedang menunggu" + + + "Tidak dapat membuka fail" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 95815d6b..a90eef1e 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -45,10 +45,15 @@ "Avbryt" "Start nå" "%d %%" - - - - - + + "1 fil lastes ned" + "%d filer lastes ned" + + + "1 fil venter" + "%d filer venter" + + + "Kan ikke åpne filen" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index a1554424..73e0bef9 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -45,10 +45,15 @@ "Annuleren" "Nu starten" "%d%%" - - - - - + + "er wordt 1 bestand gedownload" + "er worden %d bestanden gedownload" + + + "1 bestand in de wachtrij" + "%d bestanden in de wachtrij" + + + "Kan bestand niet openen" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index c28b159a..bdc3e004 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -45,10 +45,15 @@ "Anuluj" "Rozpocznij teraz" "%d%%" - - - - - + + "Pobieram 1 plik" + "Pobieram %d pliki(ów)" + + + "Czeka 1 plik" + "Oczekujące pliki: %d" + + + "Nie można otworzyć pliku" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 086e6f31..097603a0 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -45,10 +45,15 @@ "Cancelar" "Começar agora" "%d%%" - - - - - + + "1 ficheiro a ser transferido" + "%d ficheiros a serem transferidos" + + + "1 ficheiro em espera" + "%d ficheiros em espera" + + + "Não é possível abrir o ficheiro" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index f45accf1..9f16cab3 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -45,10 +45,15 @@ "Cancelar" "Iniciar agora" "%d%%" - - - - - + + "Fazendo download de 1 arquivo" + "Fazendo download de %d arquivos" + + + "1 arquivo em espera" + "%d arquivos em espera" + + + "Não é possível abrir o arquivo" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 1bb11a2b..865250fc 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -45,10 +45,15 @@ "Anulaţi" "Începeţi acum" "%d %%" - - - - - + + "Se descarcă un fişier" + "Se descarcă %d (de) fişiere" + + + "Un fişier în aşteptare" + "%d (de) fişiere în aşteptare" + + + "Fişierul nu poate fi deschis" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 9611e58a..ac546a0e 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -49,6 +49,8 @@ + + diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 3cb535bc..44138f9e 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -45,10 +45,15 @@ "Zrušiť" "Spustiť" "%d %%" - - - - - + + "Preberá sa 1 súbor" + "Počet preberaných súborov: %d" + + + "1 čakajúci súbor" + "Počet čakajúcich súborov: %d" + + + "Súbor sa nepodarilo otvoriť" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index fc9fd75b..832915d1 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -45,10 +45,15 @@ "Prekliči" "Začni zdaj" "%d%%" - - - - - + + "Poteka prenos 1 datoteke" + "Poteka prenos toliko datotek: %d" + + + "Na čakanju je 1 datoteka" + "Št. datotek na čakanju: %d" + + + "Datoteke ni mogoče odpreti" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 86d515c8..11a1c952 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -45,10 +45,15 @@ "Откажи" "Започни одмах" "%d%%" - - - - - + + "Преузима се 1 датотека" + "Преузимају се датотеке (%d)" + + + "Чека се 1 датотека" + "Чекају се датотеке (%d)" + + + "Није могуће отворити датотеку" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 6774b12d..ef3f35d9 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -45,10 +45,15 @@ "Avbryt" "Starta nu" "%d %%" - - - - - + + "1 fil hämtas" + "%d filer hämtas" + + + "1 fil väntar" + "%d filer väntar" + + + "Det går inte att öppna filen" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 97429913..a675d474 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -45,10 +45,15 @@ "Ghairi" "Anza sasa" "%d%%" - - - - - + + "Faili 1 inapakua" + "Faili %d zinapakua" + + + "Faili 1 inasubiri" + "Faili %d zinasubiri" + + + "Haiwezi kufungua faili" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 4725622a..a66e55d5 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -45,10 +45,15 @@ "ยกเลิก" "เริ่มต้นเดี๋ยวนี้" "%d%%" - - - - - + + "กำลังดาวน์โหลด 1 ไฟล์" + "กำลังดาวน์โหลด %d ไฟล์" + + + "กำลังรอ 1 ไฟล์" + "กำลังรอ %d ไฟล์" + + + "ไม่สามารถเปิดไฟล์ได้" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index da06dc7e..180f0ae2 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -45,10 +45,15 @@ "Kanselahin" "Magsimula ngayon" "%d%%" - - - - - + + "1 file ang dina-download" + "%d (na) file ang dina-download" + + + "1 file ang hinihintay" + "%d (na) file ang hinihintay" + + + "Hindi mabuksan ang file" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index eb316ed0..413c2a58 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -45,10 +45,15 @@ "İptal" "Şimdi başlat" "%%%d" - - - - - + + "1 dosya indiriliyor" + "%d dosya indiriliyor" + + + "1 dosya bekliyor" + "%d dosya bekliyor" + + + "Dosya açılamıyor" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index bfd7bef2..dd2b098f 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -45,10 +45,15 @@ "Скасувати" "Почати зараз" "%d%%" - - - - - + + "Завантажується 1 файл" + "Завантажуються файли: %d" + + + "Очікує 1 файл" + "Очікують файли: %d" + + + "Неможливо відкрити файл" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 658cb6ec..a4921295 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -45,10 +45,15 @@ "Hủy" "Bắt đầu ngay bây giờ" "%d%%" - - - - - + + "Đang tải xuống 1 tệp" + "Đang tải xuống %d tệp" + + + "1 tệp đang chờ tải xuống" + "%d tệp đang chờ tải xuống" + + + "Không thể mở tệp" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 6c55864c..bb6cfcf2 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -45,10 +45,15 @@ "取消" "立即开始" "%d%%" - - - - - + + "正在下载 1 个文件" + "正在下载 %d 个文件" + + + "正在等待下载 1 个文件" + "正在等待下载 %d 个文件" + + + "无法打开文件" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 8d7583bd..accd2c19 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -45,10 +45,15 @@ "取消" "立即開始" "%d%%" - - - - - + + "正在下載 1 個檔案" + "正在下載 %d 個檔案" + + + "正在等待下載 1 個檔案" + "正在等待下載 %d 個檔案" + + + "無法開啟檔案" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index bf7942b9..68f6f640 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -45,10 +45,15 @@ "Khansela" "Qala manje" "%d%%" - - - - - + + "1 ifayela elilandwayo" + "%d amafayela alandwayo" + + + "1 ifayela elilindiwe" + "%d amafayela alindile" + + + "Ayikwazi ukuvula ifayela" -- cgit v1.2.3 From 892ed772f460bf9690d9a0b275f50c9ffab84919 Mon Sep 17 00:00:00 2001 From: Baligh Uddin Date: Tue, 20 Nov 2012 21:58:24 -0800 Subject: Import translations. DO NOT MERGE Change-Id: I5fe1cabbe3d55843bb3155efb5c0c00a511b04fd Auto-generated-cl: translation import --- res/values-af/strings.xml | 3 +-- res/values-am/strings.xml | 3 +-- res/values-ar/strings.xml | 3 +-- res/values-be/strings.xml | 3 +-- res/values-bg/strings.xml | 3 +-- res/values-da/strings.xml | 3 +-- res/values-de/strings.xml | 2 +- res/values-es-rUS/strings.xml | 7 +++---- res/values-fr/strings.xml | 15 +++++++++------ res/values-it/strings.xml | 3 +-- res/values-iw/strings.xml | 3 +-- res/values-ms/strings.xml | 3 +-- res/values-nb/strings.xml | 3 +-- res/values-nl/strings.xml | 7 +++---- res/values-pt-rPT/strings.xml | 3 +-- res/values-pt/strings.xml | 3 +-- res/values-ru/strings.xml | 15 +++++++++------ res/values-sl/strings.xml | 3 +-- res/values-sv/strings.xml | 3 +-- res/values-sw/strings.xml | 3 +-- res/values-tr/strings.xml | 3 +-- res/values-uk/strings.xml | 3 +-- res/values-vi/strings.xml | 3 +-- 23 files changed, 43 insertions(+), 57 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 3727f686..5d6d6ead 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -53,7 +53,6 @@ "1 leêr wag tans" "%d leêrs wag tans" - - + "%s oor" "Kan nie lêer oopmaak nie" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 2e72fb31..ce4811ad 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -53,7 +53,6 @@ "1 ፋይል በመጠበቅ ላይ" "%d ፋይሎች በመጠበቅ ላይ" - - + "%s ቀርቷል" "ፋይል መክፈት አይቻልም" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 8fff7ce0..9b29f6b7 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -53,7 +53,6 @@ "هناك ملف واحد في وضع الانتظار" "هناك %d من الملفات في وضع الانتظار" - - + "المدة المتبقية: %s" "لا يمكن فتح الملف" diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml index 8ef74382..ece2e91a 100644 --- a/res/values-be/strings.xml +++ b/res/values-be/strings.xml @@ -53,7 +53,6 @@ "1 файл чакае" "Файлы чакаюць: %d" - - + "Засталося %s" "Не атрымлiваецца адкрыць файл" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 63c12a34..179c29e7 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -53,7 +53,6 @@ "1 файл се изчаква" "%d файла се изчакват" - - + "Оставащо време: %s" "Файлът не може да се отвори" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 3fc9bb6f..a718871a 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -53,7 +53,6 @@ "1 fil venter" "%d filer venter" - - + "%s tilbage" "Filen kan ikke åbnes" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index b0daa8bc..1460cb35 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -47,7 +47,7 @@ "%d %%" "1 Datei wird heruntergeladen..." - "%d Dateien werden heruntergeladen." + "%d Dateien werden heruntergeladen..." "1 Datei steht aus." diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 174fc5b4..68b6a562 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -46,14 +46,13 @@ "Comenzar ahora" "%d%%" - "Descargando 1 archivo..." - "Descargando %d archivos..." + "Descargando 1 archivo" + "Descargando %d archivos" "1 archivo en espera" "%d archivos en espera" - - + "%s restantes" "No se puede abrir el archivo." diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index f3871f0b..392389fb 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -45,12 +45,15 @@ "Annuler" "Commencer" "%d %%" - - - - + + "Téléchargement d\'un fichier" + "Téléchargement de %d fichiers" + + + "1 fichier en attente" + "%d fichiers en attente" + - - + "Impossible d\'ouvrir le fichier." diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index bb485fd7..05eef883 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -53,7 +53,6 @@ "1 file in attesa" "%d file in attesa" - - + "%s rimanenti" "Impossibile aprire il file" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 6c8bd25c..1a05a6bf 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -53,7 +53,6 @@ "קובץ אחד ממתין" "%d קבצים ממתינים" - - + "%s נותרו" "לא ניתן לפתוח את הקובץ" diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml index 77c10366..3d39b8bd 100644 --- a/res/values-ms/strings.xml +++ b/res/values-ms/strings.xml @@ -53,7 +53,6 @@ "1 fail sedang menunggu" "%d fail sedang menunggu" - - + "%s tinggal" "Tidak dapat membuka fail" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index a90eef1e..f621af69 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -53,7 +53,6 @@ "1 fil venter" "%d filer venter" - - + "%s gjenstår" "Kan ikke åpne filen" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 73e0bef9..bab68bb2 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -46,14 +46,13 @@ "Nu starten" "%d%%" - "er wordt 1 bestand gedownload" - "er worden %d bestanden gedownload" + "Er wordt 1 bestand gedownload" + "Er worden %d bestanden gedownload" "1 bestand in de wachtrij" "%d bestanden in de wachtrij" - - + "%s resterend" "Kan bestand niet openen" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 097603a0..9f9869dc 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -53,7 +53,6 @@ "1 ficheiro em espera" "%d ficheiros em espera" - - + "Faltam %s" "Não é possível abrir o ficheiro" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 9f16cab3..f4b47071 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -53,7 +53,6 @@ "1 arquivo em espera" "%d arquivos em espera" - - + "%s restantes" "Não é possível abrir o arquivo" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index ac546a0e..df89400e 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -45,12 +45,15 @@ "Отмена" "Запустить" "%d%%" - - - - + + "Загрузка 1 файла…" + "Загрузка %d файлов…" + + + "Ожидается загрузка 1 файла" + "Ожидается загрузка %d файлов" + - - + "Не удается открыть файл" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 832915d1..90f766b1 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -53,7 +53,6 @@ "Na čakanju je 1 datoteka" "Št. datotek na čakanju: %d" - - + "Še %s" "Datoteke ni mogoče odpreti" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index ef3f35d9..927de7b5 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -53,7 +53,6 @@ "1 fil väntar" "%d filer väntar" - - + "%s återstår" "Det går inte att öppna filen" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index a675d474..c204feb4 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -53,7 +53,6 @@ "Faili 1 inasubiri" "Faili %d zinasubiri" - - + "%s unaosalia" "Haiwezi kufungua faili" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 413c2a58..915eb758 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -53,7 +53,6 @@ "1 dosya bekliyor" "%d dosya bekliyor" - - + "%s kaldı" "Dosya açılamıyor" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index dd2b098f..94b4a71a 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -53,7 +53,6 @@ "Очікує 1 файл" "Очікують файли: %d" - - + "Залишилося %s" "Неможливо відкрити файл" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index a4921295..d73ba6cc 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -53,7 +53,6 @@ "1 tệp đang chờ tải xuống" "%d tệp đang chờ tải xuống" - - + "Còn lại %s" "Không thể mở tệp" -- cgit v1.2.3 From 65ab05d0a0070a73ded180c2d2f639644239bcf3 Mon Sep 17 00:00:00 2001 From: Baligh Uddin Date: Thu, 22 Nov 2012 21:19:30 -0800 Subject: Import translations. DO NOT MERGE Change-Id: I8aa3828fb38dc088148dbe588735364ccb09bee5 Auto-generated-cl: translation import --- res/values-cs/strings.xml | 3 +-- res/values-de/strings.xml | 3 +-- res/values-et/strings.xml | 3 +-- res/values-fi/strings.xml | 3 +-- res/values-fr/strings.xml | 3 +-- res/values-hi/strings.xml | 3 +-- res/values-hr/strings.xml | 3 +-- res/values-hu/strings.xml | 3 +-- res/values-in/strings.xml | 3 +-- res/values-ko/strings.xml | 3 +-- res/values-lt/strings.xml | 3 +-- res/values-lv/strings.xml | 3 +-- res/values-tl/strings.xml | 3 +-- res/values-zh-rCN/strings.xml | 3 +-- 14 files changed, 14 insertions(+), 28 deletions(-) diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 2be041db..7a1dd6d5 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -53,7 +53,6 @@ "1 čekající soubor" "Čekající soubory: %d" - - + "%s do stažení" "Soubor nelze otevřít" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 1460cb35..b275e333 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -53,7 +53,6 @@ "1 Datei steht aus." "%d Dateien stehen aus." - - + "Noch %s" "Datei kann nicht geöffnet werden." diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index f5277597..08ce2627 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -53,7 +53,6 @@ "1 fail on ootel" "%d faili on ootel" - - + "Jäänud: %s" "Faili ei saa avada" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 202d3d64..d0d0aaa5 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -53,7 +53,6 @@ "1 tiedosto odottaa" "%d tiedostoa odottaa" - - + "%s jäljellä" "Tiedostoa ei voi avata" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 392389fb..c0333e73 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -53,7 +53,6 @@ "1 fichier en attente" "%d fichiers en attente" - - + "Temps restant : %s" "Impossible d\'ouvrir le fichier." diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 80e6d9fa..3c701ebe 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -53,7 +53,6 @@ "1 फ़ाइल प्रतीक्षा में है" "%d फ़ाइलें प्रतीक्षा में हैं" - - + "%s शेष" "फ़ाइल नहीं खोली जा सकती" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 128bc0e7..d436c1a3 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -53,7 +53,6 @@ "1 datoteka na čekanju" "Datoteke na čekanju (%d)" - - + "Još %s" "Datoteka se ne može otvoriti" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 834cd6a8..3fcad47c 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -53,7 +53,6 @@ "1 fájl várakozik" "%d fájl várakozik" - - + "%s van hátra" "A fájlt nem lehet megnyitni." diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 0fc25b68..8ef68cd7 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -53,7 +53,6 @@ "1 file menunggu" "%d file menunggu" - - + "%s lagi" "Tidak dapat membuka file" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 9df63329..df66b3eb 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -53,7 +53,6 @@ "1개의 파일 대기 중" "%d개의 파일 대기 중" - - + "%s 남음" "파일을 열 수 없음" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index a4bb7e14..9c3318de 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -53,7 +53,6 @@ "Laukiama failų: 1" "Laukiama failų: %d" - - + "Liko: %s" "Nepavyksta atidaryti failo" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 06bc31c5..47c0be20 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -53,7 +53,6 @@ "Rindā: 1 fails" "Rindā: %d faili" - - + "Atlikušais laiks: %s" "Nevar atvērt failu" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 180f0ae2..1d19dc24 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -53,7 +53,6 @@ "1 file ang hinihintay" "%d (na) file ang hinihintay" - - + "%s ang natitira" "Hindi mabuksan ang file" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index bb6cfcf2..8345823d 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -53,7 +53,6 @@ "正在等待下载 1 个文件" "正在等待下载 %d 个文件" - - + "剩余时间:%s" "无法打开文件" -- cgit v1.2.3 From d912ebe9c815b88bbdf43b6a9a9605a370d18eaf Mon Sep 17 00:00:00 2001 From: Baligh Uddin Date: Tue, 27 Nov 2012 12:06:10 -0800 Subject: Import translations. DO NOT MERGE Change-Id: Ib11120e47f29151b4281f86db6dbeaecf4e060d5 Auto-generated-cl: translation import --- res/values-ca/strings.xml | 3 +-- res/values-es/strings.xml | 3 +-- res/values-sw/strings.xml | 2 +- res/values-zu/strings.xml | 3 +-- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 9de1e6b7..6af70892 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -53,7 +53,6 @@ "S\'està esperant 1 fitxer" "S\'estan esperant %d fitxers" - - + "Queden %s" "No es pot obrir el fitxer" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 77f17fcb..9295a405 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -53,7 +53,6 @@ "1 archivo en espera" "%d archivos en espera" - - + "%s restantes" "Error al abrir el archivo" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index c204feb4..89ea1a11 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -53,6 +53,6 @@ "Faili 1 inasubiri" "Faili %d zinasubiri" - "%s unaosalia" + "%s zinazosalia" "Haiwezi kufungua faili" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 68f6f640..4706baff 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -53,7 +53,6 @@ "1 ifayela elilindiwe" "%d amafayela alindile" - - + "%s kwesobunxele" "Ayikwazi ukuvula ifayela" -- cgit v1.2.3 From f818eecf1b60ddba2854314863243d6aa87707b0 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Tue, 27 Nov 2012 13:47:24 -0800 Subject: Update extras for in-progress download. Follow move to EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS extras, which was missing during refactoring. Bug: 7617373 Change-Id: I26203a2bc6fc0e211a1aa602c0de018332d76f60 --- src/com/android/providers/downloads/Constants.java | 2 ++ src/com/android/providers/downloads/DownloadReceiver.java | 2 +- ui/src/com/android/providers/downloads/ui/DownloadList.java | 13 +++++-------- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/com/android/providers/downloads/Constants.java b/src/com/android/providers/downloads/Constants.java index 8481435f..8d806182 100644 --- a/src/com/android/providers/downloads/Constants.java +++ b/src/com/android/providers/downloads/Constants.java @@ -75,6 +75,8 @@ public class Constants { /** The default extension for binary files if we can't get one at the HTTP level */ public static final String DEFAULT_DL_BINARY_EXTENSION = ".bin"; + public static final String PROVIDER_PACKAGE_NAME = "com.android.providers.downloads"; + /** * When a number has to be appended to the filename, this string is used to separate the * base filename from the sequence number diff --git a/src/com/android/providers/downloads/DownloadReceiver.java b/src/com/android/providers/downloads/DownloadReceiver.java index cbc963ce..42f029a3 100644 --- a/src/com/android/providers/downloads/DownloadReceiver.java +++ b/src/com/android/providers/downloads/DownloadReceiver.java @@ -94,7 +94,7 @@ public class DownloadReceiver extends BroadcastReceiver { handleNotificationBroadcast(context, intent); } else { sAsyncHandler.post(new Runnable() { - @Override + @Override public void run() { handleNotificationBroadcast(context, intent); result.finish(); diff --git a/ui/src/com/android/providers/downloads/ui/DownloadList.java b/ui/src/com/android/providers/downloads/ui/DownloadList.java index 6ffa0691..ed369932 100644 --- a/ui/src/com/android/providers/downloads/ui/DownloadList.java +++ b/ui/src/com/android/providers/downloads/ui/DownloadList.java @@ -51,6 +51,7 @@ import android.widget.ExpandableListView.OnChildClickListener; import android.widget.ListView; import android.widget.Toast; +import com.android.providers.downloads.Constants; import com.android.providers.downloads.OpenHelper; import java.io.FileNotFoundException; @@ -624,15 +625,11 @@ public class DownloadList extends Activity { .show(); } - /** - * TODO use constants/shared code? - */ private void sendRunningDownloadClickedBroadcast(long id) { - Intent intent = new Intent("android.intent.action.DOWNLOAD_LIST"); - intent.setClassName("com.android.providers.downloads", - "com.android.providers.downloads.DownloadReceiver"); - intent.setData(ContentUris.withAppendedId(Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, id)); - intent.putExtra("multiple", false); + final Intent intent = new Intent(Constants.ACTION_LIST); + intent.setPackage(Constants.PROVIDER_PACKAGE_NAME); + intent.putExtra(DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS, + new long[] { id }); sendBroadcast(intent); } -- cgit v1.2.3 From fec5f50a85e1bfc7bb4fa12d04ffa7526c79fad7 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Wed, 28 Nov 2012 14:35:40 -0800 Subject: Improve download remaining time calculation. Calculate remaining time in DownloadNotifier so we always use the most recent progress data, which avoids showing stale times. Weight speed calculation to prefer historical data so remaining time is smoother on bumpy network connections. Bug: 7631948 Change-Id: I497be0899e65086356745340b19d3987c6185bdd --- src/com/android/providers/downloads/DownloadHandler.java | 16 ++++++---------- .../android/providers/downloads/DownloadNotifier.java | 11 ++++++----- src/com/android/providers/downloads/DownloadThread.java | 13 ++----------- 3 files changed, 14 insertions(+), 26 deletions(-) diff --git a/src/com/android/providers/downloads/DownloadHandler.java b/src/com/android/providers/downloads/DownloadHandler.java index dff09eb0..2f02864e 100644 --- a/src/com/android/providers/downloads/DownloadHandler.java +++ b/src/com/android/providers/downloads/DownloadHandler.java @@ -37,7 +37,7 @@ public class DownloadHandler { private final HashMap mDownloadsInProgress = new HashMap(); @GuardedBy("this") - private final LongSparseArray mRemainingMillis = new LongSparseArray(); + private final LongSparseArray mCurrentSpeed = new LongSparseArray(); private final int mMaxConcurrentDownloadsAllowed = Resources.getSystem().getInteger( com.android.internal.R.integer.config_MaxConcurrentDownloadsAllowed); @@ -82,23 +82,19 @@ public class DownloadHandler { public synchronized void dequeueDownload(long id) { mDownloadsInProgress.remove(id); - mRemainingMillis.remove(id); + mCurrentSpeed.remove(id); startDownloadThreadLocked(); if (mDownloadsInProgress.size() == 0 && mDownloadsQueue.size() == 0) { notifyAll(); } } - public synchronized void setRemainingMillis(long id, long millis) { - mRemainingMillis.put(id, millis); + public synchronized void setCurrentSpeed(long id, long speed) { + mCurrentSpeed.put(id, speed); } - /** - * Return remaining time until given {@link DownloadInfo} finishes, in - * milliseconds, or -1 if unknown. - */ - public synchronized long getRemainingMillis(long id) { - return mRemainingMillis.get(id, -1L); + public synchronized long getCurrentSpeed(long id) { + return mCurrentSpeed.get(id, -1L); } // right now this is only used by tests. but there is no reason why it can't be used diff --git a/src/com/android/providers/downloads/DownloadNotifier.java b/src/com/android/providers/downloads/DownloadNotifier.java index f6e7a2ee..f89d2d02 100644 --- a/src/com/android/providers/downloads/DownloadNotifier.java +++ b/src/com/android/providers/downloads/DownloadNotifier.java @@ -163,23 +163,24 @@ public class DownloadNotifier { long current = 0; long total = 0; - long remainingMillis = -1; + long speed = 0; for (DownloadInfo info : cluster) { if (info.mTotalBytes != -1) { current += info.mCurrentBytes; total += info.mTotalBytes; - remainingMillis = Math.max( - handler.getRemainingMillis(info.mId), remainingMillis); + speed += handler.getCurrentSpeed(info.mId); } } if (total > 0) { final int percent = (int) ((current * 100) / total); - if (remainingMillis != -1) { + percentText = res.getString(R.string.download_percent, percent); + + if (speed > 0) { + final long remainingMillis = ((total - current) * 1000) / speed; remainingText = res.getString(R.string.download_remaining, DateUtils.formatDuration(remainingMillis)); } - percentText = res.getString(R.string.download_percent, percent); builder.setProgress(100, percent, false); } else { diff --git a/src/com/android/providers/downloads/DownloadThread.java b/src/com/android/providers/downloads/DownloadThread.java index 2bd3d362..34bc8e34 100644 --- a/src/com/android/providers/downloads/DownloadThread.java +++ b/src/com/android/providers/downloads/DownloadThread.java @@ -107,8 +107,6 @@ public class DownloadThread extends Thread { public long mSpeedSampleStart; /** Bytes transferred since current sample started. */ public long mSpeedSampleBytes; - /** Estimated time until finished. */ - public long mRemainingMillis; public State(DownloadInfo info) { mMimeType = Intent.normalizeMimeType(info.mMimeType); @@ -443,20 +441,13 @@ public class DownloadThread extends Thread { if (state.mSpeed == 0) { state.mSpeed = sampleSpeed; } else { - state.mSpeed = (state.mSpeed + sampleSpeed) / 2; + state.mSpeed = ((state.mSpeed * 3) + sampleSpeed) / 4; } state.mSpeedSampleStart = now; state.mSpeedSampleBytes = state.mCurrentBytes; - if (state.mSpeed != 0) { - state.mRemainingMillis = ((state.mTotalBytes - state.mCurrentBytes) * 1000) - / state.mSpeed; - } else { - state.mRemainingMillis = -1; - } - - DownloadHandler.getInstance().setRemainingMillis(mInfo.mId, state.mRemainingMillis); + DownloadHandler.getInstance().setCurrentSpeed(mInfo.mId, state.mSpeed); } if (state.mCurrentBytes - state.mBytesNotified > Constants.MIN_PROGRESS_STEP && -- cgit v1.2.3 From 0daff11c040114ecee4ff8f06b982eedde85f020 Mon Sep 17 00:00:00 2001 From: Baligh Uddin Date: Thu, 29 Nov 2012 07:40:10 -0800 Subject: Import translations. DO NOT MERGE Change-Id: I195b9b502336dad204ce6b4e9a1a74cc9f9f398f Auto-generated-cl: translation import --- res/values-ca/strings.xml | 2 +- res/values-el/strings.xml | 3 +-- res/values-fa/strings.xml | 3 +-- res/values-ja/strings.xml | 3 +-- res/values-pl/strings.xml | 3 +-- res/values-ro/strings.xml | 3 +-- res/values-ru/strings.xml | 3 +-- res/values-sk/strings.xml | 3 +-- res/values-sr/strings.xml | 3 +-- res/values-th/strings.xml | 3 +-- res/values-zh-rTW/strings.xml | 3 +-- res/values-zu/strings.xml | 2 +- 12 files changed, 12 insertions(+), 22 deletions(-) diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 6af70892..ae9dabf1 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -53,6 +53,6 @@ "S\'està esperant 1 fitxer" "S\'estan esperant %d fitxers" - "Queden %s" + "Temps restant: %s" "No es pot obrir el fitxer" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index dbb15038..3fd01d6a 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -53,7 +53,6 @@ "1 αρχείο σε αναμονή" "%d αρχεία σε αναμονή" - - + "Απομένουν %s" "Δεν είναι δυνατό το άνοιγμα του αρχείου" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index b164098d..2c911822 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -53,7 +53,6 @@ "۱ فایل در انتظار" "%d فایل در انتظار" - - + "%s باقیمانده" "فایل باز نمی‌شود" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index f76abf8d..55101486 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -53,7 +53,6 @@ "1ファイルがダウンロード待ち" "%dファイルがダウンロード待ち" - - + "残り%s" "ファイルを開くことができません" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index bdc3e004..b21d423f 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -53,7 +53,6 @@ "Czeka 1 plik" "Oczekujące pliki: %d" - - + "Pozostało %s" "Nie można otworzyć pliku" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 865250fc..2bd33c95 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -53,7 +53,6 @@ "Un fişier în aşteptare" "%d (de) fişiere în aşteptare" - - + "Timp rămas: %s" "Fişierul nu poate fi deschis" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index df89400e..8e20cf3a 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -53,7 +53,6 @@ "Ожидается загрузка 1 файла" "Ожидается загрузка %d файлов" - - + "Осталось: %s" "Не удается открыть файл" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 44138f9e..1bb1b5e3 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -53,7 +53,6 @@ "1 čakajúci súbor" "Počet čakajúcich súborov: %d" - - + "Zostáva: %s" "Súbor sa nepodarilo otvoriť" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 11a1c952..b63d417f 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -53,7 +53,6 @@ "Чека се 1 датотека" "Чекају се датотеке (%d)" - - + "Још %s" "Није могуће отворити датотеку" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index a66e55d5..11a9c9df 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -53,7 +53,6 @@ "กำลังรอ 1 ไฟล์" "กำลังรอ %d ไฟล์" - - + "เหลือ %s" "ไม่สามารถเปิดไฟล์ได้" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index accd2c19..15e2ccba 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -53,7 +53,6 @@ "正在等待下載 1 個檔案" "正在等待下載 %d 個檔案" - - + "剩餘 %s" "無法開啟檔案" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 4706baff..07bec1c7 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -53,6 +53,6 @@ "1 ifayela elilindiwe" "%d amafayela alindile" - "%s kwesobunxele" + "%s esisele" "Ayikwazi ukuvula ifayela" -- cgit v1.2.3 From 5f956afb7c75a2184bbada95eb4d91c35d1736ae Mon Sep 17 00:00:00 2001 From: Baligh Uddin Date: Wed, 5 Dec 2012 10:21:54 -0800 Subject: Import translations. DO NOT MERGE Change-Id: Ia4dc102097a8c6085e20d7fc7e2e10adc475f872 Auto-generated-cl: translation import --- res/values-es/strings.xml | 2 +- res/values-pl/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 9295a405..3bdbfe06 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -53,6 +53,6 @@ "1 archivo en espera" "%d archivos en espera" - "%s restantes" + "Tiempo restante: %s" "Error al abrir el archivo" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index b21d423f..a02ef5c5 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -53,6 +53,6 @@ "Czeka 1 plik" "Oczekujące pliki: %d" - "Pozostało %s" + "Pozostało: %s" "Nie można otworzyć pliku" -- cgit v1.2.3 From 99de1b606e5462ab191d2af5b9bd8c7c4ed30d00 Mon Sep 17 00:00:00 2001 From: Baligh Uddin Date: Thu, 6 Dec 2012 08:20:19 -0800 Subject: Import translations. DO NOT MERGE Change-Id: I6882b2a17c13803e66b1afc8e0bc02dd3d4bf049 Auto-generated-cl: translation import --- res/values-th/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 11a9c9df..3f19fb60 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -53,6 +53,6 @@ "กำลังรอ 1 ไฟล์" "กำลังรอ %d ไฟล์" - "เหลือ %s" + "เหลืออีก %s" "ไม่สามารถเปิดไฟล์ได้" -- cgit v1.2.3 From 1d71eb6b347cf861c53c1bc4c18b8928528b244c Mon Sep 17 00:00:00 2001 From: Baligh Uddin Date: Wed, 12 Dec 2012 09:48:12 -0800 Subject: Import translations. DO NOT MERGE Change-Id: Icadeb210d13e600f85b1a1d21aaaa79e26d78240 Auto-generated-cl: translation import --- res/values-de/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index b275e333..ac39f692 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -18,9 +18,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Download-Manager" "Auf Download-Manager zugreifen" - "Ermöglicht der App, auf den Download-Manager zuzugreifen, um Dateien herunterzuladen. Schadprogramme könnten damit Downloads unterbrechen und auf persönliche Informationen zugreifen." + "Ermöglicht der App, auf den Download-Manager zuzugreifen, um Dateien herunterzuladen. Schadprogramme könnten damit Downloads unterbrechen und auf personenbezogene Daten zugreifen." "Erweiterte Funktionen des Download-Managers." - "Ermöglicht der App, auf die erweiterten Funktionen des Download-Managers zuzugreifen. Schadprogramme könnten damit Downloads unterbrechen und auf persönliche Informationen zugreifen." + "Ermöglicht der App, auf die erweiterten Funktionen des Download-Managers zuzugreifen. Schadprogramme könnten damit Downloads unterbrechen und auf personenbezogene Daten zugreifen." "Benachrichtigungen zu Ladevorgängen senden" "Ermöglicht der App, Benachrichtigungen über abgeschlossene Downloads zu senden. Schadprogramme können dadurch andere Apps, die Dateien herunterladen, beeinträchtigen." "Alle USB-Speicher-Downloads" -- cgit v1.2.3 From b0bb182a1b52b31ccf1ec5e0be82308ebb4857e2 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Thu, 13 Dec 2012 12:58:18 -0800 Subject: Cancel stale notifications when starting. Bug: 7693834 Change-Id: I5e212be321cccae0f7c76f80049c4e09f0867694 --- src/com/android/providers/downloads/DownloadNotifier.java | 4 ++++ src/com/android/providers/downloads/DownloadService.java | 1 + 2 files changed, 5 insertions(+) diff --git a/src/com/android/providers/downloads/DownloadNotifier.java b/src/com/android/providers/downloads/DownloadNotifier.java index f89d2d02..daae7831 100644 --- a/src/com/android/providers/downloads/DownloadNotifier.java +++ b/src/com/android/providers/downloads/DownloadNotifier.java @@ -72,6 +72,10 @@ public class DownloadNotifier { Context.NOTIFICATION_SERVICE); } + public void cancelAll() { + mNotifManager.cancelAll(); + } + /** * Update {@link NotificationManager} to reflect the given set of * {@link DownloadInfo}, adding, collapsing, and removing as needed. diff --git a/src/com/android/providers/downloads/DownloadService.java b/src/com/android/providers/downloads/DownloadService.java index 5b767a27..b97346b2 100644 --- a/src/com/android/providers/downloads/DownloadService.java +++ b/src/com/android/providers/downloads/DownloadService.java @@ -223,6 +223,7 @@ public class DownloadService extends Service { mMediaScannerConnection = new MediaScannerConnection(); mNotifier = new DownloadNotifier(this); + mNotifier.cancelAll(); mStorageManager = StorageManager.getInstance(getApplicationContext()); updateFromProvider(); -- cgit v1.2.3