chromium/ios/chrome/browser/ui/settings/clear_browsing_data/quick_delete_util.mm

// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "ios/chrome/browser/ui/settings/clear_browsing_data/quick_delete_util.h"

#import "base/apple/foundation_util.h"
#import "base/strings/sys_string_conversions.h"
#import "components/browsing_data/core/browsing_data_utils.h"
#import "components/browsing_data/core/pref_names.h"
#import "components/strings/grit/components_strings.h"
#import "ios/chrome/browser/browsing_data/model/tabs_counter.h"
#import "ui/base/l10n/l10n_util.h"
#import "ui/base/l10n/l10n_util_mac.h"

namespace {

constexpr int kBytesInAMegabyte = 1 << 20;

}  // namespace

namespace quick_delete_util {

NSString* GetCounterTextFromResult(
    const browsing_data::BrowsingDataCounter::Result& result,
    browsing_data::TimePeriod time_range) {
  if (!result.Finished()) {
    // The counter is still counting.
    return l10n_util::GetNSString(IDS_CLEAR_BROWSING_DATA_CALCULATING);
  }

  std::string_view prefName = result.source()->GetPrefName();
  if (prefName == browsing_data::prefs::kDeleteCache) {
    browsing_data::BrowsingDataCounter::ResultInt cacheSizeBytes =
        static_cast<const browsing_data::BrowsingDataCounter::FinishedResult*>(
            &result)
            ->Value();

    // Three cases: Nonzero result for the entire cache, nonzero result for
    // a subset of cache (i.e. a finite time interval), and almost zero (less
    // than 1 MB). There is no exact information that the cache is empty so that
    // falls into the almost zero case, which is displayed as less than 1 MB.
    // Because of this, the lowest unit that can be used is MB.
    if (cacheSizeBytes < kBytesInAMegabyte) {
      return l10n_util::GetNSString(IDS_DEL_CACHE_COUNTER_ALMOST_EMPTY);
    }

    NSByteCountFormatter* formatter = [[NSByteCountFormatter alloc] init];
    formatter.allowedUnits = NSByteCountFormatterUseAll &
                             (~NSByteCountFormatterUseBytes) &
                             (~NSByteCountFormatterUseKB);
    formatter.countStyle = NSByteCountFormatterCountStyleMemory;
    NSString* formattedSize = [formatter stringFromByteCount:cacheSizeBytes];

    return time_range == browsing_data::TimePeriod::ALL_TIME
               ? formattedSize
               : l10n_util::GetNSStringF(
                     IDS_DEL_CACHE_COUNTER_UPPER_ESTIMATE,
                     base::SysNSStringToUTF16(formattedSize));
  }

  if (prefName == browsing_data::prefs::kCloseTabs) {
    const TabsCounter::TabsResult* tabsResult =
        static_cast<const TabsCounter::TabsResult*>(&result);
    browsing_data::BrowsingDataCounter::ResultInt tabsCount =
        tabsResult->Value();
    int windowsCount = tabsResult->window_count();
    if (tabsCount > 0 && windowsCount > 1) {
      std::u16string tabs_counter_string =
          l10n_util::GetPluralStringFUTF16(IDS_TABS_COUNT, tabsCount);
      std::u16string windows_counter_string =
          l10n_util::GetPluralStringFUTF16(IDS_WINDOWS_COUNT, windowsCount);
      return l10n_util::GetNSStringF(IDS_DEL_TABS_MULTIWINDOW_COUNTER,
                                     tabs_counter_string,
                                     windows_counter_string);
    } else {
      return l10n_util::GetPluralNSStringF(IDS_DEL_TABS_COUNTER, tabsCount);
    }
  }

  return base::SysUTF16ToNSString(
      browsing_data::GetCounterTextFromResult(&result));
}

}  // namespace quick_delete_util