module Flavours

Constants

VERSION

Public Class Methods

assets_file_path(directory, m, flavour_name) click to toggle source
# File lib/flavours/assets.rb, line 8
def self.assets_file_path directory, m, flavour_name
  return "#{directory}/#{m}/src/#{flavour_name.gsub(/[^0-9a-z ]/i, '')}/res"
end
base_json_file_string() click to toggle source
# File lib/flavours/json.rb, line 51
  def self.base_json_file_string
    return '{
    "flavours": [
        {
            "flavourName": "YourFlavor",
            "packageName": "somePackageName",
            "buildConfig": {
                "API_KEY": "someApiKey"
            },
            "iconUrl": "https://someurl.com/image.png",
            "colorsXML": {
                "primaryColor": "#E51919"
            },
            "stringsXML": {
                "someString": "someValue"
            }
        },
        {
            "flavourName": "YourFlavor2",
            "packageName": "somePackageName2",
            "buildConfig": {
                "API_KEY": "someApiKey"
            },
            "iconUrl": "https://someurl.com/image.png",
            "colorsXML": {
                "primaryColor": "#E51919"
            },
            "stringsXML": {
                "someString": "someValue"
            }
        }
    ]
}'
  end
blue(text) click to toggle source
# File lib/flavours/colors.rb, line 16
def self.blue(text)
  colorize(text, 36)
end
build_config_string_for_flavour(flavour) click to toggle source
# File lib/flavours/gradle.rb, line 44
def self.build_config_string_for_flavour flavour
  if flavour['buildConfig']
    @buildconfig = ''
    flavour['buildConfig'].each_pair do |k, v|
      @buildconfig += "            buildConfigField \"String\" , \"#{k}\" ,  \"\\\"#{v}\\\"\"\n"
    end
    return @buildconfig
  end

  return ''
end
check_for_newer_version() click to toggle source
# File lib/flavours/version.rb, line 4
def self.check_for_newer_version
  unless Gem.latest_version_for('flavours').to_s == VERSION
    Flavours::purple "\n  A newer version of flavours is available. Run '[sudo] gem update flavours'."
  end
end
colorize(text, color_code) click to toggle source

Main Colorize Functions

# File lib/flavours/colors.rb, line 3
def self.colorize(text, color_code)
  puts "\e[#{color_code}m#{text}\e[0m"
end
create(flavours, directory, m) click to toggle source
# File lib/flavours/gradle.rb, line 9
def self.create flavours, directory, m
  @flavour_string = ''
  flavours.each do |f|
    @flavour_string += gradle_string_for_flavour f
    Flavours::green "  #{f['flavourName'].gsub(/[^0-9a-z ]/i, '')}" unless $nolog
    Flavours::create_images directory, m, f
    Flavours::create_xml_resources directory, m, f
    puts
  end

  set_and_save_flavours_text @flavour_string, directory, m
end
create_images(directory, m, flavour_hash) click to toggle source

Images

# File lib/flavours/images.rb, line 12
def self.create_images directory, m, flavour_hash
  # Bad Params
  if !directory || !flavour_hash || !m
    return false
  end

  # Resize Icons
  resize_icons directory, m, flavour_hash

  # Move Drawables
  move_drawables directory, m, flavour_hash if flavour_hash['drawables']
end
create_xml_for_hash(directory, m, xml_hash, res_folder_name, res_file_name, res_key_name, flavour_name) click to toggle source

Main Method

# File lib/flavours/xmlres.rb, line 25
def self.create_xml_for_hash directory, m, xml_hash, res_folder_name, res_file_name, res_key_name, flavour_name
  # Create Directory
  Flavours::make_asset_directory directory, m, flavour_name, res_folder_name
  # Set Up
  res_path = Flavours::file_path_with_folder_name(directory, res_folder_name, m, flavour_name) + "/#{res_file_name}.xml"
  xmlString = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n    <resources>\n"
  # Create Strings
  if xml_hash.kind_of?(Array)
    xml_hash.each do |hash|
      xmlString += res_string res_key_name, hash['name'], hash['value'], hash['type']
    end
  else
    xml_hash.each_pair do |k, v|
      xmlString += res_string res_key_name, k, v, nil
    end
  end
  # Finish Her Off
  xmlString += '    </resources>'
  File.open(res_path, 'w') do |f|
    f.write(xmlString)
  end
end
create_xml_resources(directory, m, flavour_hash) click to toggle source

Create XML

# File lib/flavours/xmlres.rb, line 8
def self.create_xml_resources directory, m, flavour_hash
  flavour_name = flavour_hash['flavourName']
  flavour_hash.each_pair do |k, v|
    if k == 'colorsXML'
      create_xml_for_hash directory, m, v, 'values', 'colors', 'color', flavour_name
      puts "  - Created colors.xml for #{flavour_name}"
    elsif k == 'stringsXML'
      create_xml_for_hash directory, m, v, 'values', 'strings', 'string', flavour_name
      puts "  - Created strings.xml for #{flavour_name}"
    elsif k == 'settingsXML'
      create_xml_for_hash directory, m, v, 'values', 'settings', 'item', flavour_name
      puts "  - Created settings.xml for #{flavour_name}"
    end
  end
end
file_path_with_folder_name(directory, folder, m, flavour_name) click to toggle source
# File lib/flavours/assets.rb, line 12
def self.file_path_with_folder_name directory, folder, m, flavour_name
  return "#{assets_file_path directory, m, flavour_name}/#{folder}"
end
gradle_directory(directory, m) click to toggle source
# File lib/flavours/gradle.rb, line 22
def self.gradle_directory directory, m
  return directory + '/' + m + '/build.gradle'
end
gradle_string_for_flavour(flavour) click to toggle source
# File lib/flavours/gradle.rb, line 37
def self.gradle_string_for_flavour flavour
  package = flavour['packageName'] ? "            packageName \"#{flavour['packageName']}\"\n" : ''
  buildConfig = flavour['buildConfig'] ? build_config_string_for_flavour(flavour) : ''
  return "        #{flavour['flavourName'].gsub(/[^0-9a-z ]/i, '')} {\n#{package}#{buildConfig}        }\n"
end
gradle_text(directory, m) click to toggle source
# File lib/flavours/gradle.rb, line 27
def self.gradle_text directory, m
  path = gradle_directory directory, m
  if File.exists?(path)
    return File.open(path).read
  end

  return nil
end
green(text) click to toggle source
# File lib/flavours/colors.rb, line 12
def self.green(text)
  colorize(text, 32)
end
json_object_from_directory(directory) click to toggle source
# File lib/flavours/json.rb, line 8
def self.json_object_from_directory directory
  return nil unless directory

  # Check for longbow.json
  @json_path = directory + '/flavours.json'
  unless File.exists?(@json_path)
    Flavours::red "\n  Couldn't find flavours.json at #{@json_path}\n"
    puts "  Run this command to install the correct files:\n  longbow install\n"
    return nil
  end

  # Create hash from longbow.json
  json_contents = File.open(@json_path).read
  return json_object_from_string json_contents
end
json_object_from_string(contents) click to toggle source
# File lib/flavours/json.rb, line 33
def self.json_object_from_string contents
  begin
    !!JSON.parse(contents)
  rescue
    return nil
  end

  return JSON.parse(contents)
end
json_object_from_url(url) click to toggle source
# File lib/flavours/json.rb, line 25
def self.json_object_from_url url
  return nil unless url
  contents = ''
  open(url) {|io| contents = io.read}
  return json_object_from_string contents
end
lint_json_object(obj) click to toggle source
# File lib/flavours/json.rb, line 44
def self.lint_json_object obj
  return false unless obj
  return false unless obj['flavours']
  return true
end
make_asset_directory(directory, m, flavour_name, folder_name) click to toggle source
# File lib/flavours/assets.rb, line 4
def self.make_asset_directory directory, m, flavour_name, folder_name
  FileUtils::mkdir_p file_path_with_folder_name directory, folder_name, m, flavour_name
end
move_drawable(directory, m, flavour_hash, i) click to toggle source

Move Drawable

# File lib/flavours/images.rb, line 103
def self.move_drawable directory, m, flavour_hash, i
  # Set Up
  f_name = flavour_hash['flavourName']
  # Make Path
  Flavours::make_asset_directory directory, m, f_name, 'drawable'
  # Find Image
  image = Image.read("#{directory}/#{i['path']}").first
  if image
    image.write "#{Flavours::file_path_with_folder_name(directory, 'drawable', m, f_name)}/#{i['name']}"
  end
end
move_drawables(directory, m, flavour_hash) click to toggle source

Move Drawables

# File lib/flavours/images.rb, line 92
def self.move_drawables directory, m, flavour_hash
  imgs = flavour_hash['drawables']
  if imgs && imgs.kind_of?(Array)
    imgs.each do |i|
      move_drawable directory, m, flavour_hash, i
    end
  end
end
path_for_downloaded_image_from_url(directory, filename, url, folder) click to toggle source

Download Image from URL

# File lib/flavours/images.rb, line 79
def self.path_for_downloaded_image_from_url directory, filename, url, folder
  img_path = directory + '/resources/'+ folder + '/'
  img_file_name = filename + '.png'
  FileUtils::mkdir_p img_path
  File.open(img_path + img_file_name, 'wb') do |f|
    f.write open(url).read
  end

  return img_path + img_file_name
end
purple(text) click to toggle source
# File lib/flavours/colors.rb, line 20
def self.purple(text)
  colorize(text, 35)
end
red(text) click to toggle source

Specific Colors

# File lib/flavours/colors.rb, line 8
def self.red(text)
  colorize(text, 31)
end
res_string(res, name, value, type) click to toggle source

Resource String

# File lib/flavours/xmlres.rb, line 49
def self.res_string res, name, value, type
  type_string = type ? " type=\"#{type}\"" : ''
  return "        <#{res} name=\"#{name}\"#{type_string}>#{value.gsub("'", %q(\\\'))}</#{res}>\n"
end
resize_icons(directory, m, flavour_hash) click to toggle source

Create & Resize Icons

# File lib/flavours/images.rb, line 27
def self.resize_icons directory, m, flavour_hash
  # Set Up
  name = flavour_hash['flavourName']

  # Get Image Information
  img_path = ''
  if flavour_hash['iconUrl']
    img_path = self.path_for_downloaded_image_from_url directory, name, flavour_hash['iconUrl'], 'icons'
  elsif flavour_hash['iconPath']
    img_path = "#{directory}/#{flavour_hash['iconPath']}"
  else
    return
  end

  # Create Play Store Version (512x512)
  play_store_path = "#{directory}/resources/icons"
  img = Image.read(img_path).first
  resize_image_to_directory play_store_path, img, '512x512', "#{name}-512"

  # Make Assets Directory
  drawables = ['drawable-xxxhdpi','drawable-xxhdpi','drawable-xhdpi','drawable-hdpi','drawable-mdpi']
  drawables.each do |d|
    Flavours::make_asset_directory directory, m, name, d
  end

  # Resize
  image_sizes = ['192x192', '144x144', '96x96', '72x72', '48x48']
  image_sizes.each_index do |i|
    size = image_sizes[i]
    drawable = drawables[i]
    img_dir = file_path_with_folder_name directory, drawable, m, name
    image = Image.read(img_path).first
    next unless image
    resize_image_to_directory img_dir, image, size, 'ic_launcher'
  end

  puts '  - Created Icon images for ' + name unless $nolog
  return true
end
resize_image_to_directory(directory, image, size, tag) click to toggle source

Resize Image to Directory

# File lib/flavours/images.rb, line 69
def self.resize_image_to_directory directory, image, size, tag
  sizes = size.split('x')
  new_w = Integer(sizes[0])
  new_h = Integer(sizes[1])
  image.resize_to_fill! new_w, new_h
  image.write  directory + '/' + tag + '.png'
end
set_and_save_flavours_text(flavours_text, directory, m) click to toggle source
# File lib/flavours/gradle.rb, line 57
def self.set_and_save_flavours_text flavours_text, directory, m
  @gradle = gradle_text directory, m
  matches = @gradle.match /productFlavors \{(?>[^()]|(\g<0>))*\}\n\n/
  new_flavour_text = "    productFlavors {\n#{flavours_text}    }\n\n"
  if matches
    @gradle = @gradle.sub(matches[0], new_flavour_text)
  else
    @gradle = @gradle.sub('android {',"android {\n#{new_flavour_text}")
  end

  File.open(gradle_directory(directory, m), 'w') do |f|
    f.write(@gradle)
  end
end