Commit 9bf4ba9b authored by Christian Dullweber's avatar Christian Dullweber Committed by Commit Bot

Show storage usage in PageInfo

Show amount of used storage in cookies page in PageInfo.
Fix cookie deletion by using a populated website object.

Screenshot: https://crbug.com/1077766#c46
Bug: 1077766
Change-Id: Ifce703ba4af9bdd14da8403516871b7c8001eb02
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2416371
Commit-Queue: Christian Dullweber <dullweber@chromium.org>
Reviewed-by: default avatarEhimare Okoyomon <eokoyomon@chromium.org>
Cr-Commit-Position: refs/heads/master@{#809750}
parent 509fe7c0
...@@ -8,11 +8,17 @@ import static androidx.test.espresso.Espresso.onView; ...@@ -8,11 +8,17 @@ import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.assertion.ViewAssertions.matches; import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.Visibility.GONE; import static androidx.test.espresso.matcher.ViewMatchers.Visibility.GONE;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility; import static androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
import static androidx.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.CoreMatchers.allOf;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.chromium.chrome.test.util.ViewUtils.onViewWaiting;
import static org.chromium.components.content_settings.PrefNames.COOKIE_CONTROLS_MODE; import static org.chromium.components.content_settings.PrefNames.COOKIE_CONTROLS_MODE;
import android.os.Build; import android.os.Build;
...@@ -45,6 +51,7 @@ import org.chromium.components.location.LocationUtils; ...@@ -45,6 +51,7 @@ import org.chromium.components.location.LocationUtils;
import org.chromium.components.page_info.PageInfoController; import org.chromium.components.page_info.PageInfoController;
import org.chromium.components.page_info.PageInfoFeatureList; import org.chromium.components.page_info.PageInfoFeatureList;
import org.chromium.components.user_prefs.UserPrefs; import org.chromium.components.user_prefs.UserPrefs;
import org.chromium.content_public.browser.test.util.JavaScriptUtils;
import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.content_public.common.ContentSwitches; import org.chromium.content_public.common.ContentSwitches;
import org.chromium.net.test.EmbeddedTestServerRule; import org.chromium.net.test.EmbeddedTestServerRule;
...@@ -53,6 +60,7 @@ import org.chromium.ui.test.util.DisableAnimationsTestRule; ...@@ -53,6 +60,7 @@ import org.chromium.ui.test.util.DisableAnimationsTestRule;
import org.chromium.ui.test.util.RenderTestRule; import org.chromium.ui.test.util.RenderTestRule;
import java.io.IOException; import java.io.IOException;
import java.util.concurrent.TimeoutException;
/** /**
* Tests for PageInfoView. Uses pixel tests to ensure the UI handles different * Tests for PageInfoView. Uses pixel tests to ensure the UI handles different
...@@ -62,6 +70,12 @@ import java.io.IOException; ...@@ -62,6 +70,12 @@ import java.io.IOException;
@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
ContentSwitches.HOST_RESOLVER_RULES + "=MAP * 127.0.0.1"}) ContentSwitches.HOST_RESOLVER_RULES + "=MAP * 127.0.0.1"})
public class PageInfoViewTest { public class PageInfoViewTest {
private static final String sSimpleHtml = "/chrome/test/data/android/simple.html";
private static final String sSiteDataHtml = "/content/test/data/browsing_data/site_data.html";
private static String[] sCookieDataTypes = {"Cookie", "LocalStorage", "ServiceWorker",
"CacheStorage", "IndexedDb", "FileSystem", "WebSql"};
@Rule @Rule
public ChromeActivityTestRule<ChromeActivity> mActivityTestRule = public ChromeActivityTestRule<ChromeActivity> mActivityTestRule =
new ChromeActivityTestRule<>(ChromeActivity.class); new ChromeActivityTestRule<>(ChromeActivity.class);
...@@ -85,8 +99,6 @@ public class PageInfoViewTest { ...@@ -85,8 +99,6 @@ public class PageInfoViewTest {
@ClassRule @ClassRule
public static DisableAnimationsTestRule disableAnimationsRule = new DisableAnimationsTestRule(); public static DisableAnimationsTestRule disableAnimationsRule = new DisableAnimationsTestRule();
private final String mPath = "/chrome/test/data/android/simple.html";
private void loadUrlAndOpenPageInfo(String url) { private void loadUrlAndOpenPageInfo(String url) {
mActivityTestRule.loadUrl(url); mActivityTestRule.loadUrl(url);
onView(withId(R.id.location_bar_status_icon)).perform(click()); onView(withId(R.id.location_bar_status_icon)).perform(click());
...@@ -107,6 +119,23 @@ public class PageInfoViewTest { ...@@ -107,6 +119,23 @@ public class PageInfoViewTest {
}); });
} }
private String runJavascriptAsync(String type) throws TimeoutException {
return JavaScriptUtils.runJavascriptWithAsyncResult(
mActivityTestRule.getWebContents(), type);
}
private void expectHasCookies(boolean hasData) throws TimeoutException {
for (String type : sCookieDataTypes) {
assertEquals(hasData ? "true" : "false", runJavascriptAsync("has" + type + "()"));
}
}
private void createCookies() throws TimeoutException {
for (String type : sCookieDataTypes) {
runJavascriptAsync("set" + type + "()");
}
}
private void addSomePermissions(String url) { private void addSomePermissions(String url) {
TestThreadUtils.runOnUiThreadBlocking(() -> { TestThreadUtils.runOnUiThreadBlocking(() -> {
WebsitePreferenceBridge.setContentSettingForPattern(Profile.getLastUsedRegularProfile(), WebsitePreferenceBridge.setContentSettingForPattern(Profile.getLastUsedRegularProfile(),
...@@ -158,7 +187,7 @@ public class PageInfoViewTest { ...@@ -158,7 +187,7 @@ public class PageInfoViewTest {
@Feature({"RenderTest"}) @Feature({"RenderTest"})
public void testShowOnInsecureHttpWebsite() throws IOException { public void testShowOnInsecureHttpWebsite() throws IOException {
mTestServerRule.setServerUsesHttps(false); mTestServerRule.setServerUsesHttps(false);
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath)); loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
mRenderTestRule.render(getPageInfoView(), "PageInfo_HttpWebsite"); mRenderTestRule.render(getPageInfoView(), "PageInfo_HttpWebsite");
} }
...@@ -169,7 +198,7 @@ public class PageInfoViewTest { ...@@ -169,7 +198,7 @@ public class PageInfoViewTest {
@MediumTest @MediumTest
@Feature({"RenderTest"}) @Feature({"RenderTest"})
public void testShowOnSecureWebsite() throws IOException { public void testShowOnSecureWebsite() throws IOException {
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath)); loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
mRenderTestRule.render(getPageInfoView(), "PageInfo_SecureWebsite"); mRenderTestRule.render(getPageInfoView(), "PageInfo_SecureWebsite");
} }
...@@ -181,7 +210,7 @@ public class PageInfoViewTest { ...@@ -181,7 +210,7 @@ public class PageInfoViewTest {
@Feature({"RenderTest"}) @Feature({"RenderTest"})
public void testShowOnExpiredCertificateWebsite() throws IOException { public void testShowOnExpiredCertificateWebsite() throws IOException {
mTestServerRule.setCertificateType(ServerCertificate.CERT_EXPIRED); mTestServerRule.setCertificateType(ServerCertificate.CERT_EXPIRED);
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath)); loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
mRenderTestRule.render(getPageInfoView(), "PageInfo_ExpiredCertWebsite"); mRenderTestRule.render(getPageInfoView(), "PageInfo_ExpiredCertWebsite");
} }
...@@ -206,7 +235,7 @@ public class PageInfoViewTest { ...@@ -206,7 +235,7 @@ public class PageInfoViewTest {
public void testShowWithPermissions() throws IOException { public void testShowWithPermissions() throws IOException {
mIsSystemLocationSettingEnabled = false; mIsSystemLocationSettingEnabled = false;
addSomePermissions(mTestServerRule.getServer().getURL("/")); addSomePermissions(mTestServerRule.getServer().getURL("/"));
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath)); loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
mRenderTestRule.render(getPageInfoView(), "PageInfo_Permissions"); mRenderTestRule.render(getPageInfoView(), "PageInfo_Permissions");
} }
...@@ -218,7 +247,7 @@ public class PageInfoViewTest { ...@@ -218,7 +247,7 @@ public class PageInfoViewTest {
@Feature({"RenderTest"}) @Feature({"RenderTest"})
public void testShowWithCookieBlocking() throws IOException { public void testShowWithCookieBlocking() throws IOException {
setThirdPartyCookieBlocking(CookieControlsMode.BLOCK_THIRD_PARTY); setThirdPartyCookieBlocking(CookieControlsMode.BLOCK_THIRD_PARTY);
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath)); loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
mRenderTestRule.render(getPageInfoView(), "PageInfo_CookieBlocking"); mRenderTestRule.render(getPageInfoView(), "PageInfo_CookieBlocking");
} }
...@@ -231,7 +260,7 @@ public class PageInfoViewTest { ...@@ -231,7 +260,7 @@ public class PageInfoViewTest {
public void testShowWithPermissionsAndCookieBlocking() throws IOException { public void testShowWithPermissionsAndCookieBlocking() throws IOException {
addSomePermissions(mTestServerRule.getServer().getURL("/")); addSomePermissions(mTestServerRule.getServer().getURL("/"));
setThirdPartyCookieBlocking(CookieControlsMode.BLOCK_THIRD_PARTY); setThirdPartyCookieBlocking(CookieControlsMode.BLOCK_THIRD_PARTY);
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath)); loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
mRenderTestRule.render(getPageInfoView(), "PageInfo_PermissionsAndCookieBlocking"); mRenderTestRule.render(getPageInfoView(), "PageInfo_PermissionsAndCookieBlocking");
} }
...@@ -243,7 +272,7 @@ public class PageInfoViewTest { ...@@ -243,7 +272,7 @@ public class PageInfoViewTest {
@Feature({"RenderTest"}) @Feature({"RenderTest"})
public void testShowWithDefaultSettingPermissions() throws IOException { public void testShowWithDefaultSettingPermissions() throws IOException {
addDefaultSettingPermissions(mTestServerRule.getServer().getURL("/")); addDefaultSettingPermissions(mTestServerRule.getServer().getURL("/"));
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath)); loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
mRenderTestRule.render(getPageInfoView(), "PageInfo_DefaultSettingPermissions"); mRenderTestRule.render(getPageInfoView(), "PageInfo_DefaultSettingPermissions");
} }
...@@ -255,7 +284,7 @@ public class PageInfoViewTest { ...@@ -255,7 +284,7 @@ public class PageInfoViewTest {
@Feature({"RenderTest"}) @Feature({"RenderTest"})
@Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2) @Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
public void testShowOnSecureWebsiteV2() throws IOException { public void testShowOnSecureWebsiteV2() throws IOException {
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath)); loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
mRenderTestRule.render(getPageInfoView(), "PageInfo_SecureWebsiteV2"); mRenderTestRule.render(getPageInfoView(), "PageInfo_SecureWebsiteV2");
} }
...@@ -267,7 +296,7 @@ public class PageInfoViewTest { ...@@ -267,7 +296,7 @@ public class PageInfoViewTest {
@Feature({"RenderTest"}) @Feature({"RenderTest"})
@Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2) @Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
public void testShowConnectionInfoSubpage() throws IOException { public void testShowConnectionInfoSubpage() throws IOException {
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath)); loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
onView(withId(R.id.page_info_connection_row)).perform(click()); onView(withId(R.id.page_info_connection_row)).perform(click());
mRenderTestRule.render(getPageInfoView(), "PageInfo_ConnectionInfoSubpage"); mRenderTestRule.render(getPageInfoView(), "PageInfo_ConnectionInfoSubpage");
} }
...@@ -280,7 +309,7 @@ public class PageInfoViewTest { ...@@ -280,7 +309,7 @@ public class PageInfoViewTest {
@MediumTest @MediumTest
@Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2) @Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
public void testNoPermissionsSubpage() throws IOException { public void testNoPermissionsSubpage() throws IOException {
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath)); loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
View dialog = (View) getPageInfoView().getParent(); View dialog = (View) getPageInfoView().getParent();
onView(withId(R.id.page_info_permissions_row)) onView(withId(R.id.page_info_permissions_row))
.check(matches(withEffectiveVisibility(GONE))); .check(matches(withEffectiveVisibility(GONE)));
...@@ -295,7 +324,7 @@ public class PageInfoViewTest { ...@@ -295,7 +324,7 @@ public class PageInfoViewTest {
@Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2) @Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
public void testShowPermissionsSubpage() throws IOException { public void testShowPermissionsSubpage() throws IOException {
addSomePermissions(mTestServerRule.getServer().getURL("/")); addSomePermissions(mTestServerRule.getServer().getURL("/"));
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath)); loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
onView(withId(R.id.page_info_permissions_row)).perform(click()); onView(withId(R.id.page_info_permissions_row)).perform(click());
mRenderTestRule.render(getPageInfoView(), "PageInfo_PermissionsSubpage"); mRenderTestRule.render(getPageInfoView(), "PageInfo_PermissionsSubpage");
} }
...@@ -309,10 +338,34 @@ public class PageInfoViewTest { ...@@ -309,10 +338,34 @@ public class PageInfoViewTest {
@Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2) @Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
public void testShowCookiesSubpage() throws IOException { public void testShowCookiesSubpage() throws IOException {
setThirdPartyCookieBlocking(CookieControlsMode.BLOCK_THIRD_PARTY); setThirdPartyCookieBlocking(CookieControlsMode.BLOCK_THIRD_PARTY);
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath)); loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
onView(withId(R.id.page_info_cookies_row)).perform(click()); onView(withId(R.id.page_info_cookies_row)).perform(click());
mRenderTestRule.render(getPageInfoView(), "PageInfo_CookiesSubpage"); mRenderTestRule.render(getPageInfoView(), "PageInfo_CookiesSubpage");
} }
/**
* Tests clearing cookies on the cookies page of the new PageInfo UI.
*/
@Test
@MediumTest
@Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
public void testClearCookiesOnSubpage() throws Exception {
mActivityTestRule.loadUrl(mTestServerRule.getServer().getURL(sSiteDataHtml));
// Create cookies.
expectHasCookies(false);
createCookies();
expectHasCookies(true);
// Go to cookies subpage.
onView(withId(R.id.location_bar_status_icon)).perform(click());
onView(withId(R.id.page_info_cookies_row)).perform(click());
// Check that cookies usage is displayed.
onViewWaiting(allOf(withText(containsString("stored data")), isDisplayed()));
// Clear cookies in page info.
onView(withText("Clear cookies")).perform(click());
// Wait until the UI navigates back and check cookies are deleted.
onViewWaiting(allOf(withId(R.id.page_info_cookies_row), isDisplayed()));
expectHasCookies(false);
}
// TODO(1071762): Add tests for preview pages, offline pages, offline state and other states. // TODO(1071762): Add tests for preview pages, offline pages, offline state and other states.
} }
...@@ -277,7 +277,7 @@ public class SingleWebsiteSettings extends SiteSettingsPreferenceFragment ...@@ -277,7 +277,7 @@ public class SingleWebsiteSettings extends SiteSettingsPreferenceFragment
* @param websites The websites to search in. * @param websites The websites to search in.
* @return The merged website. * @return The merged website.
*/ */
private static Website mergePermissionAndStorageInfoForTopLevelOrigin( public static Website mergePermissionAndStorageInfoForTopLevelOrigin(
WebsiteAddress address, Collection<Website> websites) { WebsiteAddress address, Collection<Website> websites) {
String origin = address.getOrigin(); String origin = address.getOrigin();
String host = Uri.parse(origin).getHost(); String host = Uri.parse(origin).getHost();
......
...@@ -9,15 +9,20 @@ import android.view.ViewGroup; ...@@ -9,15 +9,20 @@ import android.view.ViewGroup;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import org.chromium.components.browser_ui.site_settings.SingleWebsiteSettings;
import org.chromium.components.browser_ui.site_settings.SiteDataCleaner; import org.chromium.components.browser_ui.site_settings.SiteDataCleaner;
import org.chromium.components.browser_ui.site_settings.SiteSettingsCategory;
import org.chromium.components.browser_ui.site_settings.Website; import org.chromium.components.browser_ui.site_settings.Website;
import org.chromium.components.browser_ui.site_settings.WebsiteAddress; import org.chromium.components.browser_ui.site_settings.WebsiteAddress;
import org.chromium.components.browser_ui.site_settings.WebsitePermissionsFetcher;
import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge; import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge;
import org.chromium.components.content_settings.CookieControlsBridge; import org.chromium.components.content_settings.CookieControlsBridge;
import org.chromium.components.content_settings.CookieControlsEnforcement; import org.chromium.components.content_settings.CookieControlsEnforcement;
import org.chromium.components.content_settings.CookieControlsObserver; import org.chromium.components.content_settings.CookieControlsObserver;
import org.chromium.components.embedder_support.util.Origin; import org.chromium.components.embedder_support.util.Origin;
import java.util.Collection;
/** /**
* Class for controlling the page info cookies section. * Class for controlling the page info cookies section.
*/ */
...@@ -35,6 +40,7 @@ public class PageInfoCookiesController ...@@ -35,6 +40,7 @@ public class PageInfoCookiesController
private int mBlockedCookies; private int mBlockedCookies;
private int mStatus; private int mStatus;
private boolean mIsEnforced; private boolean mIsEnforced;
private Website mWebsite;
public PageInfoCookiesController(PageInfoMainController mainController, PageInfoRowView rowView, public PageInfoCookiesController(PageInfoMainController mainController, PageInfoRowView rowView,
PageInfoControllerDelegate delegate, String fullUrl) { PageInfoControllerDelegate delegate, String fullUrl) {
...@@ -80,18 +86,31 @@ public class PageInfoCookiesController ...@@ -80,18 +86,31 @@ public class PageInfoCookiesController
mSubPage.setCookiesCount(mAllowedCookies, mBlockedCookies); mSubPage.setCookiesCount(mAllowedCookies, mBlockedCookies);
mSubPage.setCookieBlockingStatus(mStatus, mIsEnforced); mSubPage.setCookieBlockingStatus(mStatus, mIsEnforced);
SiteSettingsCategory storageCategory = SiteSettingsCategory.createFromType(
mMainController.getBrowserContext(), SiteSettingsCategory.Type.USE_STORAGE);
new WebsitePermissionsFetcher(mMainController.getBrowserContext())
.fetchPreferencesForCategory(storageCategory, this::onStorageFetched);
return mSubPage.requireView(); return mSubPage.requireView();
} }
private void onStorageFetched(Collection<Website> result) {
String origin = Origin.createOrThrow(mFullUrl).toString();
WebsiteAddress address = WebsiteAddress.create(origin);
mWebsite = SingleWebsiteSettings.mergePermissionAndStorageInfoForTopLevelOrigin(
address, result);
mSubPage.setStorageUsage(mWebsite.getTotalUsage());
}
private void onCheckedChangedCallback(boolean state) { private void onCheckedChangedCallback(boolean state) {
mBridge.setThirdPartyCookieBlockingEnabledForSite(state); mBridge.setThirdPartyCookieBlockingEnabledForSite(state);
} }
private void clearData() { private void clearData() {
String origin = Origin.createOrThrow(mFullUrl).toString(); if (mWebsite == null) return;
WebsiteAddress address = WebsiteAddress.create(origin); new SiteDataCleaner().clearData(
new SiteDataCleaner().clearData(mMainController.getBrowserContext(), mMainController.getBrowserContext(), mWebsite, mMainController::exitSubpage);
new Website(address, address), mMainController::exitSubpage);
} }
@Override @Override
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
package org.chromium.components.page_info; package org.chromium.components.page_info;
import android.os.Bundle; import android.os.Bundle;
import android.text.format.Formatter;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceFragmentCompat;
...@@ -94,4 +95,12 @@ public class PageInfoCookiesPreference extends PreferenceFragmentCompat { ...@@ -94,4 +95,12 @@ public class PageInfoCookiesPreference extends PreferenceFragmentCompat {
mCookieInUse.setTitle(getContext().getResources().getQuantityString( mCookieInUse.setTitle(getContext().getResources().getQuantityString(
R.plurals.page_info_cookies_in_use, allowedCookies, allowedCookies)); R.plurals.page_info_cookies_in_use, allowedCookies, allowedCookies));
} }
public void setStorageUsage(long storageUsage) {
mCookieInUse.setSummary(
storageUsage > 0 ? String.format(
getContext().getString(R.string.origin_settings_storage_usage_brief),
Formatter.formatShortFileSize(getContext(), storageUsage))
: null);
}
} }
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