// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.download;
import android.content.ComponentName;
import android.os.Bundle;
import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.browser.IntentHandler;
import org.chromium.chrome.browser.SnackbarActivity;
import org.chromium.chrome.browser.UrlConstants;
import org.chromium.chrome.browser.download.ui.DownloadFilter;
import org.chromium.chrome.browser.download.ui.DownloadManagerUi;
import org.chromium.chrome.browser.download.ui.DownloadManagerUi.DownloadUiObserver;
import org.chromium.chrome.browser.util.IntentUtils;
import java.util.Deque;
import java.util.LinkedList;
/**
* Activity for managing downloads handled through Chrome.
*/
public class DownloadActivity extends SnackbarActivity {
private DownloadManagerUi mDownloadManagerUi;
private boolean mIsOffTheRecord;
/** Caches the stack of filters applied to let the user backtrack through their history. */
private final Deque<String> mBackStack = new LinkedList<>();
private final DownloadUiObserver mUiObserver = new DownloadUiObserver() {
@Override
public void onManagerDestroyed() { }
@Override
public void onFilterChanged(int filter) {
String url = DownloadFilter.getUrlForFilter(filter);
if (mBackStack.isEmpty() || !mBackStack.peek().equals(url)) {
mBackStack.push(url);
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
boolean isOffTheRecord = DownloadUtils.shouldShowOffTheRecordDownloads(getIntent());
ComponentName parentComponent = IntentUtils.safeGetParcelableExtra(
getIntent(), IntentHandler.EXTRA_PARENT_COMPONENT);
mDownloadManagerUi = new DownloadManagerUi(this, isOffTheRecord, parentComponent);
setContentView(mDownloadManagerUi.getView());
mIsOffTheRecord = isOffTheRecord;
mDownloadManagerUi.addObserver(mUiObserver);
// Call updateForUrl() to align with how DownloadPage interacts with DownloadManagerUi.
mDownloadManagerUi.updateForUrl(UrlConstants.DOWNLOADS_URL);
}
@Override
public void onResume() {
super.onResume();
DownloadUtils.checkForExternallyRemovedDownloads(mDownloadManagerUi.getBackendProvider(),
mIsOffTheRecord);
}
@Override
public void onBackPressed() {
if (mDownloadManagerUi.onBackPressed()) return;
// The top of the stack always represents the current filter. When back is pressed,
// the top is popped off and the new top indicates what filter to use. If there are
// no filters remaining, the Activity itself is closed.
if (mBackStack.size() > 1) {
mBackStack.pop();
mDownloadManagerUi.updateForUrl(mBackStack.peek());
} else {
if (!mBackStack.isEmpty()) mBackStack.pop();
super.onBackPressed();
}
}
@Override
protected void onDestroy() {
mDownloadManagerUi.onDestroyed();
super.onDestroy();
}
@VisibleForTesting
DownloadManagerUi getDownloadManagerUiForTests() {
return mDownloadManagerUi;
}
}