aboutsummaryrefslogtreecommitdiffstats
path: root/Graphics/android-icon-copier/copy
diff options
context:
space:
mode:
Diffstat (limited to 'Graphics/android-icon-copier/copy')
-rwxr-xr-xGraphics/android-icon-copier/copy162
1 files changed, 162 insertions, 0 deletions
diff --git a/Graphics/android-icon-copier/copy b/Graphics/android-icon-copier/copy
new file mode 100755
index 000000000..995a8789e
--- /dev/null
+++ b/Graphics/android-icon-copier/copy
@@ -0,0 +1,162 @@
+#!/usr/bin/env python
+
+import os
+import sys
+import shutil
+import requests
+from os.path import expanduser
+import classic
+
+resolutions = {
+ 'material': ("m", "h", "xh", "xxh", "xxxh"),
+ 'fa': ("l", "m", "h", "xh", "xxh"),
+ 'classic': ("m", "h", "xh", "xxh"),
+}
+
+
+class AppError(Exception):
+ pass
+
+
+def make_filename(filename_format, cat, name, color, size):
+ args = {
+ 'cat': cat or '',
+ 'name': name,
+ 'color': color,
+ 'size': size,
+ }
+ bg = {'white': 'dark', 'grey': 'light', 'black': 'bright'}.get(color) or ''
+ bg_suffix = '_dark' if bg == 'dark' else ''
+ args['bgSuffix'] = bg_suffix
+ args['bg'] = bg
+ return filename_format.format(**args)
+
+
+def download_url(url, target_path):
+ print("Downloading {} to {} ...".format(url, target_path))
+ print("")
+ #r = requests.get(url, stream=True)
+ r = requests.get(url)
+ if r.status_code != 200:
+ raise AppError("url not found, perhaps invalid name, size or color")
+ with open(target_path, 'wb') as fd:
+ for chunk in r.iter_content(4096):
+ fd.write(chunk)
+
+
+def make_material_icon_url(cat, res, name, color, size):
+ if color == 'grey':
+ color = 'grey600'
+ elif color not in ('white', 'black'):
+ raise AppError('invalid color')
+ return ('https://raw.githubusercontent.com/google/material-design-icons/master/' +
+ '{}/drawable-{}dpi/ic_{}_{}_{}dp.png').format(cat, res, name, color, size)
+
+
+def make_fa_icon_url(res, name, color):
+ if color == 'white':
+ holo = 'dark'
+ elif color == 'grey':
+ holo = 'light'
+ else:
+ raise AppError('invalid color')
+ return ('https://raw.githubusercontent.com/svenkapudija/Android-Action-Bar-Icons/' +
+ 'master/Font Awesome/holo_{2}/ic_fa_{1}/drawable-{0}dpi/ic_fa_{1}.png').format(res, name, holo)
+
+
+def make_classic_icon_url(res, name, color):
+ dirname = classic.CLASSIC_MAP.get(name)
+ if not dirname:
+ raise AppError('invalid name')
+ if color == 'white':
+ holo = 'dark'
+ elif color == 'grey':
+ holo = 'light'
+ else:
+ raise AppError('invalid color')
+ return ('https://raw.githubusercontent.com/svenkapudija/Android-Action-Bar-Icons/' +
+ 'master/Android Stock/holo_{2}/{3}/drawable-{0}dpi/ic_action_{1}.png').format(res, name, holo, dirname)
+
+
+def make_target_path(base_path, proj, res, filename):
+ res_path1 = os.path.join(base_path, proj, 'src', 'main', 'res')
+ res_path2 = os.path.join(base_path, proj, 'res')
+ if os.path.isdir(res_path1):
+ res_path = res_path1
+ elif os.path.isdir(res_path2):
+ res_path = res_path2
+ else:
+ raise AppError('missing res dir')
+ res_specific_path = os.path.join(res_path, 'drawable-' + res + 'dpi')
+ try:
+ os.mkdir(res_specific_path)
+ except OSError:
+ pass
+ return os.path.join(res_specific_path, filename)
+
+
+def do_material(options, proj_path, cat, name, color, size):
+ base_path = expanduser(options['basePath'])
+ filename_map = options['filenameMap']
+
+ for res in resolutions['material']:
+ filename = make_filename(filename_map['material'], cat, name, color, size)
+ target_path = make_target_path(base_path, proj_path, res, filename)
+ url = make_material_icon_url(cat, res, name, color, size)
+ download_url(url, target_path)
+
+
+def do_classic_or_fa(options, proj_path, cat, name, color):
+ base_path = expanduser(options['basePath'])
+ filename_map = options['filenameMap']
+
+ for res in resolutions[cat]:
+ filename = make_filename(filename_map[cat], cat, name, color, size=32)
+ target_path = make_target_path(base_path, proj_path, res, filename)
+ url = globals()['make_' + cat + '_icon_url'](res, name, color)
+ download_url(url, target_path)
+
+
+def print_usage():
+ print("Usage:")
+ print("Material : ./copy <proj path> <category> <color> <icon name> [size]")
+ print("Classic & FA: ./copy <proj path> <fa/classic> <color> <icon name>")
+ print("")
+
+
+def main():
+ import json
+
+ if len(sys.argv) < 5:
+ print_usage()
+ return
+
+ option_filename = 'options.json'
+ if not os.path.exists(option_filename):
+ option_filename = 'options.templ.json'
+ print("WARNING: using the template options file")
+ print("You should create your own options.json")
+
+ with open(option_filename, 'r') as fd:
+ options = json.load(fd)
+
+ proj_path = sys.argv[1]
+ cat = sys.argv[2]
+ color = sys.argv[3]
+ name = sys.argv[4]
+
+ if cat == 'classic' or cat == 'fa':
+ do_classic_or_fa(options, proj_path, cat, name, color)
+ else:
+ size = sys.argv[5] if len(sys.argv) >= 6 else 0
+ size = int(size) or 24
+ do_material(options, proj_path, cat, name, color, size)
+
+
+if __name__ == "__main__":
+ try:
+ main()
+ except AppError as e:
+ print(e.message)
+
+