Commit 21472981 authored by fukino's avatar fukino Committed by Commit bot

Files app: Make the warning banner about local space dismissable.

This CL includes following changes
- Add a dismiss button on warning banner about Downloads space. If a user dismiss the banner, we won't show unless 36 hours have passed.
- Show the warning banner about Downloads when the available size is less than 1GB. (It used to be 20%)

BUG=634207
TEST=manually tested by modifying DOWNLOADS_SPACE_WARNING_DISMISS_DURATION from 36 hours to 10 seconds.

Review-Url: https://codereview.chromium.org/2271203002
Cr-Commit-Position: refs/heads/master@{#414379}
parent 64cb9e2a
...@@ -1251,6 +1251,10 @@ html[dir='rtl'] .breadcrumbs .separator { ...@@ -1251,6 +1251,10 @@ html[dir='rtl'] .breadcrumbs .separator {
width: 16px; width: 16px;
} }
.downloads-warning .warning-message {
-webkit-margin-end: 40px;
}
.downloads-warning[hidden] { .downloads-warning[hidden] {
display: flex !important; /* Overrides [hidden] for animation. */ display: flex !important; /* Overrides [hidden] for animation. */
height: 0; height: 0;
......
...@@ -41,16 +41,23 @@ function Banners( ...@@ -41,16 +41,23 @@ function Banners(
chrome.storage.onChanged.addListener(this.onStorageChange_.bind(this)); chrome.storage.onChanged.addListener(this.onStorageChange_.bind(this));
this.welcomeHeaderCounter_ = WELCOME_HEADER_COUNTER_LIMIT; this.welcomeHeaderCounter_ = WELCOME_HEADER_COUNTER_LIMIT;
this.warningDismissedCounter_ = 0; this.warningDismissedCounter_ = 0;
this.downloadsWarningDismissedTime_ = 0;
this.ready_ = Promise.all([ this.ready_ = Promise.all([
new Promise(function(resolve, reject) { new Promise(function(resolve, reject) {
chrome.storage.local.get( chrome.storage.local.get(
[WELCOME_HEADER_COUNTER_KEY, WARNING_DISMISSED_KEY], [
WELCOME_HEADER_COUNTER_KEY,
DRIVE_WARNING_DISMISSED_KEY,
DOWNLOADS_WARNING_DISMISSED_KEY
],
function(values) { function(values) {
this.welcomeHeaderCounter_ = this.welcomeHeaderCounter_ =
parseInt(values[WELCOME_HEADER_COUNTER_KEY], 10) || 0; parseInt(values[WELCOME_HEADER_COUNTER_KEY], 10) || 0;
this.warningDismissedCounter_ = this.warningDismissedCounter_ =
parseInt(values[WARNING_DISMISSED_KEY], 10) || 0; parseInt(values[DRIVE_WARNING_DISMISSED_KEY], 10) || 0;
this.downloadsWarningDismissedTime_ =
parseInt(values[DOWNLOADS_WARNING_DISMISSED_KEY], 10) || 0;
// If it's in test, override the counter to show the header by // If it's in test, override the counter to show the header by
// force. // force.
...@@ -96,13 +103,40 @@ var WELCOME_HEADER_COUNTER_KEY = 'driveWelcomeHeaderCounter'; ...@@ -96,13 +103,40 @@ var WELCOME_HEADER_COUNTER_KEY = 'driveWelcomeHeaderCounter';
// If the warning was dismissed before, this key stores the quota value // If the warning was dismissed before, this key stores the quota value
// (as of the moment of dismissal). // (as of the moment of dismissal).
// If the warning was never dismissed or was reset this key stores 0. // If the warning was never dismissed or was reset this key stores 0.
var WARNING_DISMISSED_KEY = 'driveSpaceWarningDismissed'; var DRIVE_WARNING_DISMISSED_KEY = 'driveSpaceWarningDismissed';
/**
* If the warning was dismissed before, this key stores the moment of dismissal
* in milliseconds since the UNIX epoch (i.e. the value of Date.now()).
* @const {string}
*/
var DOWNLOADS_WARNING_DISMISSED_KEY = 'downloadsSpaceWarningDismissed';
/** /**
* Maximum times Drive Welcome banner could have shown. * Maximum times Drive Welcome banner could have shown.
*/ */
var WELCOME_HEADER_COUNTER_LIMIT = 25; var WELCOME_HEADER_COUNTER_LIMIT = 25;
/**
* If the remaining space in Drive is less than 10%, we'll show a warning.
* @const {number}
*/
var DRIVE_SPACE_WARNING_THRESHOLD_RATIO = 0.1;
/**
* If the remaining space in Downloads is less than 1GB, we'll show a warning.
* This value is in bytes.
* @const {number}
*/
var DOWNLOADS_SPACE_WARNING_THRESHOLD_SIZE = 1 * 1024 * 1024 * 1024;
/**
* After the warning banner is dismissed, we won't show it for 36 hours.
* This value is in milliseconds.
* @const {number}
*/
var DOWNLOADS_SPACE_WARNING_DISMISS_DURATION = 36 * 60 * 60 * 1000;
/** /**
* Initializes the banner to promote DRIVE. * Initializes the banner to promote DRIVE.
* This method must be called before any of showing banner functions, and * This method must be called before any of showing banner functions, and
...@@ -132,7 +166,7 @@ Banners.prototype.setWelcomeHeaderCounter_ = function(value) { ...@@ -132,7 +166,7 @@ Banners.prototype.setWelcomeHeaderCounter_ = function(value) {
*/ */
Banners.prototype.setWarningDismissedCounter_ = function(value) { Banners.prototype.setWarningDismissedCounter_ = function(value) {
var values = {}; var values = {};
values[WARNING_DISMISSED_KEY] = value; values[DRIVE_WARNING_DISMISSED_KEY] = value;
chrome.storage.local.set(values); chrome.storage.local.set(values);
}; };
...@@ -146,8 +180,13 @@ Banners.prototype.onStorageChange_ = function(changes, areaName) { ...@@ -146,8 +180,13 @@ Banners.prototype.onStorageChange_ = function(changes, areaName) {
if (areaName == 'local' && WELCOME_HEADER_COUNTER_KEY in changes) { if (areaName == 'local' && WELCOME_HEADER_COUNTER_KEY in changes) {
this.welcomeHeaderCounter_ = changes[WELCOME_HEADER_COUNTER_KEY].newValue; this.welcomeHeaderCounter_ = changes[WELCOME_HEADER_COUNTER_KEY].newValue;
} }
if (areaName == 'local' && WARNING_DISMISSED_KEY in changes) { if (areaName == 'local' && DRIVE_WARNING_DISMISSED_KEY in changes) {
this.warningDismissedCounter_ = changes[WARNING_DISMISSED_KEY].newValue; this.warningDismissedCounter_ =
changes[DRIVE_WARNING_DISMISSED_KEY].newValue;
}
if (areaName == 'local' && DOWNLOADS_WARNING_DISMISSED_KEY in changes) {
this.downloadsWarningDismissedTime_ =
changes[DOWNLOADS_WARNING_DISMISSED_KEY].newValue;
} }
}; };
...@@ -298,7 +337,7 @@ Banners.prototype.showLowDriveSpaceWarning_ = function(show, opt_sizeStats) { ...@@ -298,7 +337,7 @@ Banners.prototype.showLowDriveSpaceWarning_ = function(show, opt_sizeStats) {
box.appendChild(close); box.appendChild(close);
close.addEventListener('click', function(total) { close.addEventListener('click', function(total) {
var values = {}; var values = {};
values[WARNING_DISMISSED_KEY] = total; values[DRIVE_WARNING_DISMISSED_KEY] = total;
chrome.storage.local.set(values); chrome.storage.local.set(values);
box.hidden = true; box.hidden = true;
this.requestRelayout_(100); this.requestRelayout_(100);
...@@ -536,15 +575,12 @@ Banners.prototype.privateOnDirectoryChanged_ = function(event) { ...@@ -536,15 +575,12 @@ Banners.prototype.privateOnDirectoryChanged_ = function(event) {
*/ */
Banners.prototype.maybeShowLowSpaceWarning_ = function(volume) { Banners.prototype.maybeShowLowSpaceWarning_ = function(volume) {
// TODO(kaznacheev): Unify the two low space warning. // TODO(kaznacheev): Unify the two low space warning.
var threshold = 0;
switch (volume.volumeType) { switch (volume.volumeType) {
case VolumeManagerCommon.VolumeType.DOWNLOADS: case VolumeManagerCommon.VolumeType.DOWNLOADS:
this.showLowDriveSpaceWarning_(false); this.showLowDriveSpaceWarning_(false);
threshold = 0.2;
break; break;
case VolumeManagerCommon.VolumeType.DRIVE: case VolumeManagerCommon.VolumeType.DRIVE:
this.showLowDownloadsSpaceWarning_(false); this.showLowDownloadsSpaceWarning_(false);
threshold = 0.1;
break; break;
default: default:
// If the current file system is neither the DOWNLOAD nor the DRIVE, // If the current file system is neither the DOWNLOAD nor the DRIVE,
...@@ -572,12 +608,16 @@ Banners.prototype.maybeShowLowSpaceWarning_ = function(volume) { ...@@ -572,12 +608,16 @@ Banners.prototype.maybeShowLowSpaceWarning_ = function(volume) {
if (!sizeStats || sizeStats.totalSize == 0) if (!sizeStats || sizeStats.totalSize == 0)
return; return;
var remainingRatio = sizeStats.remainingSize / sizeStats.totalSize; if (volume.volumeType === VolumeManagerCommon.VolumeType.DOWNLOADS) {
var isLowDiskSpace = remainingRatio < threshold; // Show the warning banner when the available space is less than 1GB.
if (volume.volumeType === VolumeManagerCommon.VolumeType.DOWNLOADS) this.showLowDownloadsSpaceWarning_(
this.showLowDownloadsSpaceWarning_(isLowDiskSpace); sizeStats.remainingSize < DOWNLOADS_SPACE_WARNING_THRESHOLD_SIZE);
else } else {
this.showLowDriveSpaceWarning_(isLowDiskSpace, sizeStats); // Show the warning banner when the available space ls less than 10%.
var remainingRatio = sizeStats.remainingSize / sizeStats.totalSize;
this.showLowDriveSpaceWarning_(
remainingRatio < DRIVE_SPACE_WARNING_THRESHOLD_RATIO, sizeStats);
}
}.bind(this)); }.bind(this));
}; };
...@@ -609,12 +649,22 @@ Banners.prototype.requestRelayout_ = function(delay) { ...@@ -609,12 +649,22 @@ Banners.prototype.requestRelayout_ = function(delay) {
Banners.prototype.showLowDownloadsSpaceWarning_ = function(show) { Banners.prototype.showLowDownloadsSpaceWarning_ = function(show) {
var box = this.document_.querySelector('.downloads-warning'); var box = this.document_.querySelector('.downloads-warning');
if (box.hidden == !show) return; if (box.hidden == !show)
return;
if (this.downloadsWarningDismissedTime_) {
if (Date.now() - this.downloadsWarningDismissedTime_ <
DOWNLOADS_SPACE_WARNING_DISMISS_DURATION) {
show = false;
}
}
box.textContent = '';
if (show) { if (show) {
var icon = this.document_.createElement('div'); var icon = this.document_.createElement('div');
icon.className = 'warning-icon'; icon.className = 'warning-icon';
var message = this.document_.createElement('div'); var message = this.document_.createElement('div');
message.className = 'warning-message';
message.innerHTML = util.htmlUnescape(str('DOWNLOADS_DIRECTORY_WARNING')); message.innerHTML = util.htmlUnescape(str('DOWNLOADS_DIRECTORY_WARNING'));
box.appendChild(icon); box.appendChild(icon);
box.appendChild(message); box.appendChild(message);
...@@ -622,8 +672,17 @@ Banners.prototype.showLowDownloadsSpaceWarning_ = function(show) { ...@@ -622,8 +672,17 @@ Banners.prototype.showLowDownloadsSpaceWarning_ = function(show) {
util.visitURL(str('DOWNLOADS_LOW_SPACE_WARNING_HELP_URL')); util.visitURL(str('DOWNLOADS_LOW_SPACE_WARNING_HELP_URL'));
e.preventDefault(); e.preventDefault();
}); });
} else {
box.innerHTML = ''; var close = this.document_.createElement('div');
close.className = 'banner-close';
box.appendChild(close);
close.addEventListener('click', function() {
var values = {};
values[DOWNLOADS_WARNING_DISMISSED_KEY] = Date.now();
chrome.storage.local.set(values);
box.hidden = true;
this.requestRelayout_(100);
}.bind(this));
} }
box.hidden = !show; box.hidden = !show;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment