Home | History | Annotate | Download | only in user_image
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "components/user_manager/user_image/default_user_images.h"
      6 
      7 #include "base/basictypes.h"
      8 #include "base/logging.h"
      9 #include "base/strings/string_number_conversions.h"
     10 #include "base/strings/string_piece.h"
     11 #include "base/strings/string_util.h"
     12 #include "base/strings/stringprintf.h"
     13 #include "base/sys_info.h"
     14 #include "grit/ui_chromeos_resources.h"
     15 #include "grit/ui_chromeos_strings.h"
     16 #include "ui/base/l10n/l10n_util.h"
     17 #include "ui/base/resource/resource_bundle.h"
     18 #include "ui/gfx/image/image_skia.h"
     19 
     20 namespace user_manager {
     21 
     22 namespace {
     23 
     24 const char kDefaultUrlPrefix[] = "chrome://theme/IDR_LOGIN_DEFAULT_USER_";
     25 const char kZeroDefaultUrl[] = "chrome://theme/IDR_LOGIN_DEFAULT_USER";
     26 
     27 // IDs of default user image descriptions.
     28 const int kDefaultImageDescriptions[] = {
     29     0,  // No description for deprecated user image 0.
     30     0,  // No description for deprecated user image 1.
     31     0,  // No description for deprecated user image 2.
     32     0,  // No description for deprecated user image 3.
     33     0,  // No description for deprecated user image 4.
     34     0,  // No description for deprecated user image 5.
     35     0,  // No description for deprecated user image 6.
     36     0,  // No description for deprecated user image 7.
     37     0,  // No description for deprecated user image 8.
     38     0,  // No description for deprecated user image 9.
     39     0,  // No description for deprecated user image 10.
     40     0,  // No description for deprecated user image 11.
     41     0,  // No description for deprecated user image 12.
     42     0,  // No description for deprecated user image 13.
     43     0,  // No description for deprecated user image 14.
     44     0,  // No description for deprecated user image 15.
     45     0,  // No description for deprecated user image 16.
     46     0,  // No description for deprecated user image 17.
     47     0,  // No description for deprecated user image 18.
     48     IDS_LOGIN_DEFAULT_USER_DESC_19,
     49     IDS_LOGIN_DEFAULT_USER_DESC_20,
     50     IDS_LOGIN_DEFAULT_USER_DESC_21,
     51     IDS_LOGIN_DEFAULT_USER_DESC_22,
     52     IDS_LOGIN_DEFAULT_USER_DESC_23,
     53     IDS_LOGIN_DEFAULT_USER_DESC_24,
     54     IDS_LOGIN_DEFAULT_USER_DESC_25,
     55     IDS_LOGIN_DEFAULT_USER_DESC_26,
     56     IDS_LOGIN_DEFAULT_USER_DESC_27,
     57     IDS_LOGIN_DEFAULT_USER_DESC_28,
     58     IDS_LOGIN_DEFAULT_USER_DESC_29,
     59     IDS_LOGIN_DEFAULT_USER_DESC_30,
     60     IDS_LOGIN_DEFAULT_USER_DESC_31,
     61     IDS_LOGIN_DEFAULT_USER_DESC_32,
     62 };
     63 
     64 // Returns a string consisting of the prefix specified and the index of the
     65 // image if its valid.
     66 std::string GetDefaultImageString(int index, const std::string& prefix) {
     67   if (index < 0 || index >= kDefaultImagesCount) {
     68     DCHECK(!base::SysInfo::IsRunningOnChromeOS());
     69     return std::string();
     70   }
     71   return base::StringPrintf("%s%d", prefix.c_str(), index);
     72 }
     73 
     74 // Returns true if the string specified consists of the prefix and one of
     75 // the default images indices. Returns the index of the image in |image_id|
     76 // variable.
     77 bool IsDefaultImageString(const std::string& s,
     78                           const std::string& prefix,
     79                           int* image_id) {
     80   DCHECK(image_id);
     81   if (!StartsWithASCII(s, prefix, true))
     82     return false;
     83 
     84   int image_index = -1;
     85   if (base::StringToInt(base::StringPiece(s.begin() + prefix.length(), s.end()),
     86                         &image_index)) {
     87     if (image_index < 0 || image_index >= kDefaultImagesCount)
     88       return false;
     89     *image_id = image_index;
     90     return true;
     91   }
     92 
     93   return false;
     94 }
     95 }  // namespace
     96 
     97 std::string GetDefaultImageUrl(int index) {
     98   if (index == 0)
     99     return kZeroDefaultUrl;
    100   return GetDefaultImageString(index, kDefaultUrlPrefix);
    101 }
    102 
    103 bool IsDefaultImageUrl(const std::string& url, int* image_id) {
    104   if (url == kZeroDefaultUrl) {
    105     *image_id = 0;
    106     return true;
    107   }
    108   return IsDefaultImageString(url, kDefaultUrlPrefix, image_id);
    109 }
    110 
    111 const gfx::ImageSkia& GetDefaultImage(int index) {
    112   DCHECK(index >= 0 && index < kDefaultImagesCount);
    113   return *ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
    114       kDefaultImageResourceIDs[index]);
    115 }
    116 
    117 base::string16 GetDefaultImageDescription(int index) {
    118   DCHECK(index >= 0 && index < kDefaultImagesCount);
    119   int string_id = kDefaultImageDescriptions[index];
    120   if (string_id)
    121     return l10n_util::GetStringUTF16(string_id);
    122   else
    123     return base::string16();
    124 }
    125 
    126 // Resource IDs of default user images.
    127 const int kDefaultImageResourceIDs[] = {
    128     IDR_LOGIN_DEFAULT_USER,
    129     IDR_LOGIN_DEFAULT_USER_1,
    130     IDR_LOGIN_DEFAULT_USER_2,
    131     IDR_LOGIN_DEFAULT_USER_3,
    132     IDR_LOGIN_DEFAULT_USER_4,
    133     IDR_LOGIN_DEFAULT_USER_5,
    134     IDR_LOGIN_DEFAULT_USER_6,
    135     IDR_LOGIN_DEFAULT_USER_7,
    136     IDR_LOGIN_DEFAULT_USER_8,
    137     IDR_LOGIN_DEFAULT_USER_9,
    138     IDR_LOGIN_DEFAULT_USER_10,
    139     IDR_LOGIN_DEFAULT_USER_11,
    140     IDR_LOGIN_DEFAULT_USER_12,
    141     IDR_LOGIN_DEFAULT_USER_13,
    142     IDR_LOGIN_DEFAULT_USER_14,
    143     IDR_LOGIN_DEFAULT_USER_15,
    144     IDR_LOGIN_DEFAULT_USER_16,
    145     IDR_LOGIN_DEFAULT_USER_17,
    146     IDR_LOGIN_DEFAULT_USER_18,
    147     IDR_LOGIN_DEFAULT_USER_19,
    148     IDR_LOGIN_DEFAULT_USER_20,
    149     IDR_LOGIN_DEFAULT_USER_21,
    150     IDR_LOGIN_DEFAULT_USER_22,
    151     IDR_LOGIN_DEFAULT_USER_23,
    152     IDR_LOGIN_DEFAULT_USER_24,
    153     IDR_LOGIN_DEFAULT_USER_25,
    154     IDR_LOGIN_DEFAULT_USER_26,
    155     IDR_LOGIN_DEFAULT_USER_27,
    156     IDR_LOGIN_DEFAULT_USER_28,
    157     IDR_LOGIN_DEFAULT_USER_29,
    158     IDR_LOGIN_DEFAULT_USER_30,
    159     IDR_LOGIN_DEFAULT_USER_31,
    160     IDR_LOGIN_DEFAULT_USER_32,
    161 };
    162 
    163 const int kDefaultImageAuthorIDs[] = {
    164     IDS_LOGIN_DEFAULT_USER_AUTHOR,
    165     IDS_LOGIN_DEFAULT_USER_AUTHOR_1,
    166     IDS_LOGIN_DEFAULT_USER_AUTHOR_2,
    167     IDS_LOGIN_DEFAULT_USER_AUTHOR_3,
    168     IDS_LOGIN_DEFAULT_USER_AUTHOR_4,
    169     IDS_LOGIN_DEFAULT_USER_AUTHOR_5,
    170     IDS_LOGIN_DEFAULT_USER_AUTHOR_6,
    171     IDS_LOGIN_DEFAULT_USER_AUTHOR_7,
    172     IDS_LOGIN_DEFAULT_USER_AUTHOR_8,
    173     IDS_LOGIN_DEFAULT_USER_AUTHOR_9,
    174     IDS_LOGIN_DEFAULT_USER_AUTHOR_10,
    175     IDS_LOGIN_DEFAULT_USER_AUTHOR_11,
    176     IDS_LOGIN_DEFAULT_USER_AUTHOR_12,
    177     IDS_LOGIN_DEFAULT_USER_AUTHOR_13,
    178     IDS_LOGIN_DEFAULT_USER_AUTHOR_14,
    179     IDS_LOGIN_DEFAULT_USER_AUTHOR_15,
    180     IDS_LOGIN_DEFAULT_USER_AUTHOR_16,
    181     IDS_LOGIN_DEFAULT_USER_AUTHOR_17,
    182     IDS_LOGIN_DEFAULT_USER_AUTHOR_18,
    183     IDS_LOGIN_DEFAULT_USER_AUTHOR_19,
    184     IDS_LOGIN_DEFAULT_USER_AUTHOR_20,
    185     IDS_LOGIN_DEFAULT_USER_AUTHOR_21,
    186     IDS_LOGIN_DEFAULT_USER_AUTHOR_22,
    187     IDS_LOGIN_DEFAULT_USER_AUTHOR_23,
    188     IDS_LOGIN_DEFAULT_USER_AUTHOR_24,
    189     IDS_LOGIN_DEFAULT_USER_AUTHOR_25,
    190     IDS_LOGIN_DEFAULT_USER_AUTHOR_26,
    191     IDS_LOGIN_DEFAULT_USER_AUTHOR_27,
    192     IDS_LOGIN_DEFAULT_USER_AUTHOR_28,
    193     IDS_LOGIN_DEFAULT_USER_AUTHOR_29,
    194     IDS_LOGIN_DEFAULT_USER_AUTHOR_30,
    195     IDS_LOGIN_DEFAULT_USER_AUTHOR_31,
    196     IDS_LOGIN_DEFAULT_USER_AUTHOR_32,
    197 };
    198 
    199 const int kDefaultImageWebsiteIDs[] = {
    200     IDS_LOGIN_DEFAULT_USER_WEBSITE,
    201     IDS_LOGIN_DEFAULT_USER_WEBSITE_1,
    202     IDS_LOGIN_DEFAULT_USER_WEBSITE_2,
    203     IDS_LOGIN_DEFAULT_USER_WEBSITE_3,
    204     IDS_LOGIN_DEFAULT_USER_WEBSITE_4,
    205     IDS_LOGIN_DEFAULT_USER_WEBSITE_5,
    206     IDS_LOGIN_DEFAULT_USER_WEBSITE_6,
    207     IDS_LOGIN_DEFAULT_USER_WEBSITE_7,
    208     IDS_LOGIN_DEFAULT_USER_WEBSITE_8,
    209     IDS_LOGIN_DEFAULT_USER_WEBSITE_9,
    210     IDS_LOGIN_DEFAULT_USER_WEBSITE_10,
    211     IDS_LOGIN_DEFAULT_USER_WEBSITE_11,
    212     IDS_LOGIN_DEFAULT_USER_WEBSITE_12,
    213     IDS_LOGIN_DEFAULT_USER_WEBSITE_13,
    214     IDS_LOGIN_DEFAULT_USER_WEBSITE_14,
    215     IDS_LOGIN_DEFAULT_USER_WEBSITE_15,
    216     IDS_LOGIN_DEFAULT_USER_WEBSITE_16,
    217     IDS_LOGIN_DEFAULT_USER_WEBSITE_17,
    218     IDS_LOGIN_DEFAULT_USER_WEBSITE_18,
    219     IDS_LOGIN_DEFAULT_USER_WEBSITE_19,
    220     IDS_LOGIN_DEFAULT_USER_WEBSITE_20,
    221     IDS_LOGIN_DEFAULT_USER_WEBSITE_21,
    222     IDS_LOGIN_DEFAULT_USER_WEBSITE_22,
    223     IDS_LOGIN_DEFAULT_USER_WEBSITE_23,
    224     IDS_LOGIN_DEFAULT_USER_WEBSITE_24,
    225     IDS_LOGIN_DEFAULT_USER_WEBSITE_25,
    226     IDS_LOGIN_DEFAULT_USER_WEBSITE_26,
    227     IDS_LOGIN_DEFAULT_USER_WEBSITE_27,
    228     IDS_LOGIN_DEFAULT_USER_WEBSITE_28,
    229     IDS_LOGIN_DEFAULT_USER_WEBSITE_29,
    230     IDS_LOGIN_DEFAULT_USER_WEBSITE_30,
    231     IDS_LOGIN_DEFAULT_USER_WEBSITE_31,
    232     IDS_LOGIN_DEFAULT_USER_WEBSITE_32,
    233 };
    234 
    235 const int kDefaultImagesCount = arraysize(kDefaultImageResourceIDs);
    236 
    237 const int kFirstDefaultImageIndex = 19;
    238 
    239 // The order and the values of these constants are important for histograms
    240 // of different Chrome OS versions to be merged smoothly.
    241 const int kHistogramImageFromCamera = 19;
    242 const int kHistogramImageFromFile = 20;
    243 const int kHistogramImageOld = 21;
    244 const int kHistogramImageFromProfile = 22;
    245 const int kHistogramVideoFromCamera = 23;
    246 const int kHistogramVideoFromFile = 24;
    247 const int kHistogramImagesCount = kDefaultImagesCount + 6;
    248 
    249 int GetDefaultImageHistogramValue(int index) {
    250   DCHECK(index >= 0 && index < kDefaultImagesCount);
    251   // Create a gap in histogram values for
    252   // [kHistogramImageFromCamera..kHistogramImageFromProfile] block to fit.
    253   if (index < kHistogramImageFromCamera)
    254     return index;
    255   return index + 6;
    256 }
    257 
    258 }  // namespace user_manager
    259