Refactored code, added log and emulator skins
|
@ -99,11 +99,16 @@ EXPOSE 6080
|
||||||
#==================
|
#==================
|
||||||
# Add Browser APKs
|
# Add Browser APKs
|
||||||
#==================
|
#==================
|
||||||
COPY example/browser_apk /root/browser_apk
|
COPY browser_apk /root/browser_apk
|
||||||
|
|
||||||
|
#====================
|
||||||
|
# Add Emulator Skins
|
||||||
|
#====================
|
||||||
|
COPY skins /root/skins
|
||||||
|
|
||||||
#===================
|
#===================
|
||||||
# Run docker-appium
|
# Run docker-appium
|
||||||
#===================
|
#===================
|
||||||
COPY supervisord.conf /root/
|
COPY supervisord.conf /root/
|
||||||
COPY service /root/service
|
COPY src /root/src
|
||||||
CMD /usr/bin/supervisord --configuration supervisord.conf
|
CMD /usr/bin/supervisord --configuration supervisord.conf
|
||||||
|
|
161
service/start.py
|
@ -1,161 +0,0 @@
|
||||||
import logging
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
import appium
|
|
||||||
|
|
||||||
from service import CONFIG_FILE
|
|
||||||
|
|
||||||
logging.basicConfig()
|
|
||||||
logger = logging.getLogger('main')
|
|
||||||
|
|
||||||
# not using enum because need to install pip that will make docker image size bigger
|
|
||||||
TYPE_ARMEABI = 'armeabi'
|
|
||||||
TYPE_X86 = 'x86'
|
|
||||||
|
|
||||||
|
|
||||||
def run():
|
|
||||||
"""
|
|
||||||
Start noVNC, installation of needed android SDK packages and Appium server.
|
|
||||||
|
|
||||||
"""
|
|
||||||
# Get android version package
|
|
||||||
android_version = os.getenv('ANDROID_VERSION', '4.2.2')
|
|
||||||
emulator_name = 'emulator_{version}'.format(version=android_version)
|
|
||||||
os.environ['EMULATOR_NAME'] = emulator_name
|
|
||||||
|
|
||||||
# Get emulator type
|
|
||||||
types = [TYPE_ARMEABI, TYPE_X86]
|
|
||||||
emulator_type = os.getenv('EMULATOR_TYPE', TYPE_ARMEABI).lower()
|
|
||||||
emulator_type = TYPE_ARMEABI if emulator_type not in types else emulator_type
|
|
||||||
|
|
||||||
# Link emulator shortcut
|
|
||||||
subprocess.check_call('ln -s $ANDROID_HOME/tools/{shortcut_file} $ANDROID_HOME/tools/emulator'.format(
|
|
||||||
shortcut_file='emulator64-x86' if emulator_type == TYPE_X86 else 'emulator64-arm'), shell=True)
|
|
||||||
|
|
||||||
# Option to connect with selenium server
|
|
||||||
connect_to_grid = str_to_bool(str(os.getenv('CONNECT_TO_GRID', False)))
|
|
||||||
logger.info('Connect with selenium grid? {input}'.format(input=connect_to_grid))
|
|
||||||
appium_cmd = 'appium'
|
|
||||||
if connect_to_grid:
|
|
||||||
try:
|
|
||||||
appium_host = os.getenv('APPIUM_HOST', '127.0.0.1')
|
|
||||||
appium_port = int(os.getenv('APPIUM_PORT', 4723))
|
|
||||||
selenium_host = os.getenv('SELENIUM_HOST', '172.17.0.1')
|
|
||||||
selenium_port = int(os.getenv('SELENIUM_PORT', 4444))
|
|
||||||
appium.create_node_config(CONFIG_FILE, emulator_name, android_version,
|
|
||||||
appium_host, appium_port, selenium_host, selenium_port)
|
|
||||||
appium_cmd += ' --nodeconfig {file}'.format(file=CONFIG_FILE)
|
|
||||||
except ValueError as v_err:
|
|
||||||
logger.error(v_err)
|
|
||||||
|
|
||||||
# Start installation of android packages, emulator creation and appium in a terminal
|
|
||||||
android_cmd = get_android_bash_commands(android_version, emulator_type)
|
|
||||||
if android_cmd:
|
|
||||||
cmd = 'xterm -T "Android-Appium" -n "Android-Appium" -e \"{android} && ' \
|
|
||||||
'/bin/echo $EMULATOR_NAME && {appium}\"'.format(android=android_cmd, appium=appium_cmd)
|
|
||||||
else:
|
|
||||||
logger.warning('There is no android packages installed!')
|
|
||||||
cmd = 'xterm -e \"{appium}\"'.format(appium=appium_cmd)
|
|
||||||
subprocess.check_call(cmd, shell=True)
|
|
||||||
|
|
||||||
|
|
||||||
def get_available_sdk_packages():
|
|
||||||
"""
|
|
||||||
Get list of available sdk packages.
|
|
||||||
|
|
||||||
:return: List of available packages.
|
|
||||||
:rtype: bytearray
|
|
||||||
"""
|
|
||||||
cmd = ['android', 'list', 'sdk']
|
|
||||||
output_str = subprocess.check_output(cmd)
|
|
||||||
logger.info('List of Android SDK: ')
|
|
||||||
logger.info(output_str)
|
|
||||||
return [output.strip() for output in output_str.split('\n')] if output_str else None
|
|
||||||
|
|
||||||
|
|
||||||
def get_item_position(keyword, items):
|
|
||||||
"""
|
|
||||||
Get position of item in array by given keyword.
|
|
||||||
|
|
||||||
:return: item position
|
|
||||||
:rtype: int
|
|
||||||
"""
|
|
||||||
pos = 0
|
|
||||||
for p, v in enumerate(items):
|
|
||||||
if keyword in v:
|
|
||||||
pos = p
|
|
||||||
break # Get the first item that match with keyword
|
|
||||||
return pos
|
|
||||||
|
|
||||||
|
|
||||||
def get_android_bash_commands(android_version, emulator_type):
|
|
||||||
"""
|
|
||||||
Get bash commands to install given android version and to create android emulator based on given type.
|
|
||||||
|
|
||||||
To see list of available targets: android list targets
|
|
||||||
To see list to avd: android list avd
|
|
||||||
|
|
||||||
:param android_version: android version
|
|
||||||
:type android_version: str
|
|
||||||
:param emulator_type: emulator type
|
|
||||||
:type emulator_type: str
|
|
||||||
:return: bash commands
|
|
||||||
:rtype: bytearray
|
|
||||||
"""
|
|
||||||
bash_command = None
|
|
||||||
|
|
||||||
try:
|
|
||||||
packages = get_available_sdk_packages()
|
|
||||||
|
|
||||||
if packages:
|
|
||||||
item_pos = get_item_position(android_version, packages)
|
|
||||||
logger.info('item position: {pos}'.format(pos=item_pos))
|
|
||||||
item = packages[item_pos]
|
|
||||||
|
|
||||||
item_info = item.split('-')
|
|
||||||
package_number = item_info[0]
|
|
||||||
api_version = re.search('%s(.*)%s' % ('API', ','), item_info[1]).group(1).strip()
|
|
||||||
logger.info(
|
|
||||||
'Package number: {number}, API version: {version}'.format(number=package_number, version=api_version))
|
|
||||||
|
|
||||||
commands = []
|
|
||||||
|
|
||||||
# Command to install SDK package
|
|
||||||
commands.append('echo y | android update sdk --no-ui --filter {number}'.format(number=package_number))
|
|
||||||
|
|
||||||
# Command to install system image and create android emulator
|
|
||||||
sys_img = 'x86' if emulator_type == TYPE_X86 else 'armeabi-v7a'
|
|
||||||
commands.append('echo y | android update sdk --no-ui -a --filter sys-img-{sys_img}-android-{api}'.format(
|
|
||||||
sys_img=sys_img, api=api_version))
|
|
||||||
commands.append(
|
|
||||||
'echo no | android create avd -f -n emulator_{version} -t android-{api} --abi {sys_img}'.format(
|
|
||||||
version=android_version, api=api_version, sys_img=sys_img))
|
|
||||||
|
|
||||||
# Join all commands in one str for xterm
|
|
||||||
bash_command = ' && '.join(commands)
|
|
||||||
else:
|
|
||||||
raise RuntimeError('Packages is empty!')
|
|
||||||
|
|
||||||
except IndexError as i_err:
|
|
||||||
logger.error(i_err)
|
|
||||||
|
|
||||||
return bash_command
|
|
||||||
|
|
||||||
|
|
||||||
def str_to_bool(str):
|
|
||||||
"""
|
|
||||||
Convert string to boolean.
|
|
||||||
|
|
||||||
:param str: given string
|
|
||||||
:type str: str
|
|
||||||
:return: converted string
|
|
||||||
:rtype: bool
|
|
||||||
"""
|
|
||||||
return str.lower() in ('yes', 'true', 't', '1')
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
logger.setLevel(logging.INFO)
|
|
||||||
run()
|
|
|
@ -1,73 +0,0 @@
|
||||||
"""Unit test for start.py."""
|
|
||||||
import os
|
|
||||||
|
|
||||||
from unittest import TestCase
|
|
||||||
|
|
||||||
import mock
|
|
||||||
|
|
||||||
from service import start
|
|
||||||
|
|
||||||
|
|
||||||
class TestService(TestCase):
|
|
||||||
"""Unit test class to test method run."""
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
os.environ['ANDROID_VERSION'] = '4.2.2'
|
|
||||||
os.environ['EMULATOR_TYPE'] = start.TYPE_X86
|
|
||||||
os.environ['CONNECT_TO_GRID'] = str(False)
|
|
||||||
|
|
||||||
@mock.patch('subprocess.check_call')
|
|
||||||
@mock.patch('service.start.get_android_bash_commands')
|
|
||||||
def test_without_selenium_server(self, mocked_subprocess, mocked_bash_cmd):
|
|
||||||
self.assertFalse(mocked_subprocess.called)
|
|
||||||
self.assertFalse(mocked_bash_cmd.called)
|
|
||||||
start.run()
|
|
||||||
self.assertTrue(mocked_subprocess.called)
|
|
||||||
self.assertTrue(mocked_bash_cmd.called)
|
|
||||||
|
|
||||||
@mock.patch('subprocess.check_call')
|
|
||||||
@mock.patch('service.appium.create_node_config')
|
|
||||||
@mock.patch('service.start.get_android_bash_commands')
|
|
||||||
def test_with_selenium_server(self, mocked_subprocess, mocked_config, mocked_bash_cmd):
|
|
||||||
os.environ['CONNECT_TO_GRID'] = str(True)
|
|
||||||
self.assertFalse(mocked_subprocess.called)
|
|
||||||
self.assertFalse(mocked_config.called)
|
|
||||||
self.assertFalse(mocked_bash_cmd.called)
|
|
||||||
start.run()
|
|
||||||
self.assertTrue(mocked_subprocess.called)
|
|
||||||
self.assertTrue(mocked_config.called)
|
|
||||||
self.assertTrue(mocked_bash_cmd.called)
|
|
||||||
|
|
||||||
@mock.patch('subprocess.check_call')
|
|
||||||
@mock.patch('service.appium.create_node_config')
|
|
||||||
@mock.patch('service.start.get_android_bash_commands')
|
|
||||||
def test_invalid_integer(self, mocked_subprocess, mocked_config, mocked_bash_cmd):
|
|
||||||
os.environ['CONNECT_TO_GRID'] = str(True)
|
|
||||||
os.environ['APPIUM_PORT'] = 'test'
|
|
||||||
self.assertFalse(mocked_subprocess.called)
|
|
||||||
self.assertFalse(mocked_config.called)
|
|
||||||
self.assertFalse(mocked_bash_cmd.called)
|
|
||||||
start.run()
|
|
||||||
self.assertTrue(mocked_subprocess.called)
|
|
||||||
self.assertFalse(mocked_config.called)
|
|
||||||
self.assertTrue(mocked_bash_cmd.called)
|
|
||||||
self.assertRaises(ValueError)
|
|
||||||
|
|
||||||
@mock.patch('service.start.get_android_bash_commands')
|
|
||||||
@mock.patch('subprocess.check_call')
|
|
||||||
@mock.patch('service.start.logger.warning')
|
|
||||||
def test_empty_android_cmd(self, mocked_bash_cmd, mocked_subprocess, mocked_logger_warning):
|
|
||||||
mocked_bash_cmd.return_value = None
|
|
||||||
self.assertFalse(mocked_subprocess.called)
|
|
||||||
self.assertFalse(mocked_logger_warning.called)
|
|
||||||
start.run()
|
|
||||||
self.assertTrue(mocked_subprocess.called)
|
|
||||||
self.assertTrue(mocked_logger_warning.called)
|
|
||||||
|
|
||||||
def tearDown(self):
|
|
||||||
del os.environ['ANDROID_VERSION']
|
|
||||||
del os.environ['EMULATOR_TYPE']
|
|
||||||
if os.getenv('CONNECT_TO_GRID') == str(True):
|
|
||||||
del os.environ['CONNECT_TO_GRID']
|
|
||||||
if os.getenv('APPIUM_PORT'):
|
|
||||||
del os.environ['APPIUM_PORT']
|
|
|
@ -2,7 +2,7 @@
|
||||||
cover-xml=true
|
cover-xml=true
|
||||||
cover-xml-file=coverage.xml
|
cover-xml-file=coverage.xml
|
||||||
with-coverage=true
|
with-coverage=true
|
||||||
cover-package=service
|
cover-package=src
|
||||||
cover-erase=true
|
cover-erase=true
|
||||||
with-xunit=true
|
with-xunit=true
|
||||||
xunit-file=xunit.xml
|
xunit-file=xunit.xml
|
||||||
|
|
BIN
skins/galaxy_nexus/land_back.png
Normal file
After Width: | Height: | Size: 112 KiB |
BIN
skins/galaxy_nexus/land_fore.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
skins/galaxy_nexus/land_shadow.png
Normal file
After Width: | Height: | Size: 53 KiB |
59
skins/galaxy_nexus/layout
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
parts {
|
||||||
|
device {
|
||||||
|
display {
|
||||||
|
width 720
|
||||||
|
height 1280
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
portrait {
|
||||||
|
background {
|
||||||
|
image port_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image port_fore.png
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
background {
|
||||||
|
image land_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image land_fore.png
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
layouts {
|
||||||
|
portrait {
|
||||||
|
width 1101
|
||||||
|
height 1709
|
||||||
|
event EV_SW:0:1
|
||||||
|
part1 {
|
||||||
|
name portrait
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 192
|
||||||
|
y 213
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
width 1847
|
||||||
|
height 886
|
||||||
|
event EV_SW:0:0
|
||||||
|
part1 {
|
||||||
|
name landscape
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 304
|
||||||
|
y 788
|
||||||
|
rotation 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
skins/galaxy_nexus/port_back.png
Normal file
After Width: | Height: | Size: 81 KiB |
BIN
skins/galaxy_nexus/port_fore.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
skins/galaxy_nexus/port_shadow.png
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
skins/galaxy_nexus/thumb.png
Normal file
After Width: | Height: | Size: 7.6 KiB |
BIN
skins/nexus_10/land_back.png
Normal file
After Width: | Height: | Size: 557 KiB |
BIN
skins/nexus_10/land_fore.png
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
skins/nexus_10/land_shadow.png
Normal file
After Width: | Height: | Size: 72 KiB |
59
skins/nexus_10/layout
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
parts {
|
||||||
|
device {
|
||||||
|
display {
|
||||||
|
width 1600
|
||||||
|
height 2560
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
portrait {
|
||||||
|
background {
|
||||||
|
image port_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image port_fore.png
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
background {
|
||||||
|
image land_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image land_fore.png
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
layouts {
|
||||||
|
portrait {
|
||||||
|
width 2330
|
||||||
|
height 3136
|
||||||
|
event EV_SW:0:1
|
||||||
|
part1 {
|
||||||
|
name portrait
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 366
|
||||||
|
y 266
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
width 3340
|
||||||
|
height 2176
|
||||||
|
event EV_SW:0:0
|
||||||
|
part1 {
|
||||||
|
name landscape
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 388
|
||||||
|
y 1866
|
||||||
|
rotation 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
skins/nexus_10/port_back.png
Normal file
After Width: | Height: | Size: 511 KiB |
BIN
skins/nexus_10/port_fore.png
Normal file
After Width: | Height: | Size: 65 KiB |
BIN
skins/nexus_10/port_shadow.png
Normal file
After Width: | Height: | Size: 86 KiB |
BIN
skins/nexus_10/thumb.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
skins/nexus_4/land_back.png
Normal file
After Width: | Height: | Size: 899 KiB |
BIN
skins/nexus_4/land_fore.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
skins/nexus_4/land_shadow.png
Normal file
After Width: | Height: | Size: 33 KiB |
59
skins/nexus_4/layout
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
parts {
|
||||||
|
device {
|
||||||
|
display {
|
||||||
|
width 768
|
||||||
|
height 1280
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
portrait {
|
||||||
|
background {
|
||||||
|
image port_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image port_fore.png
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
background {
|
||||||
|
image land_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image land_fore.png
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
layouts {
|
||||||
|
portrait {
|
||||||
|
width 958
|
||||||
|
height 1678
|
||||||
|
event EV_SW:0:1
|
||||||
|
part1 {
|
||||||
|
name portrait
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 94
|
||||||
|
y 187
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
width 1799
|
||||||
|
height 885
|
||||||
|
event EV_SW:0:0
|
||||||
|
part1 {
|
||||||
|
name landscape
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 257
|
||||||
|
y 813
|
||||||
|
rotation 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
skins/nexus_4/port_back.png
Normal file
After Width: | Height: | Size: 966 KiB |
BIN
skins/nexus_4/port_fore.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
skins/nexus_4/port_shadow.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
skins/nexus_4/thumb.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
skins/nexus_5/land_back.png
Normal file
After Width: | Height: | Size: 1.7 MiB |
BIN
skins/nexus_5/land_fore.png
Normal file
After Width: | Height: | Size: 46 KiB |
BIN
skins/nexus_5/land_shadow.png
Normal file
After Width: | Height: | Size: 39 KiB |
59
skins/nexus_5/layout
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
parts {
|
||||||
|
device {
|
||||||
|
display {
|
||||||
|
width 1080
|
||||||
|
height 1920
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
portrait {
|
||||||
|
background {
|
||||||
|
image port_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image port_fore.png
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
background {
|
||||||
|
image land_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image land_fore.png
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
layouts {
|
||||||
|
portrait {
|
||||||
|
width 1370
|
||||||
|
height 2405
|
||||||
|
event EV_SW:0:1
|
||||||
|
part1 {
|
||||||
|
name portrait
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 144
|
||||||
|
y 195
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
width 2497
|
||||||
|
height 1235
|
||||||
|
event EV_SW:0:0
|
||||||
|
part1 {
|
||||||
|
name landscape
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 261
|
||||||
|
y 1145
|
||||||
|
rotation 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
skins/nexus_5/port_back.png
Normal file
After Width: | Height: | Size: 1.8 MiB |
BIN
skins/nexus_5/port_fore.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
skins/nexus_5/port_shadow.png
Normal file
After Width: | Height: | Size: 61 KiB |
BIN
skins/nexus_5x/land_back.png
Normal file
After Width: | Height: | Size: 806 KiB |
BIN
skins/nexus_5x/land_fore.png
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
skins/nexus_5x/land_shadow.png
Normal file
After Width: | Height: | Size: 39 KiB |
59
skins/nexus_5x/layout
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
parts {
|
||||||
|
device {
|
||||||
|
display {
|
||||||
|
width 1080
|
||||||
|
height 1920
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
portrait {
|
||||||
|
background {
|
||||||
|
image port_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image port_fore.png
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
background {
|
||||||
|
image land_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image land_fore.png
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
layouts {
|
||||||
|
portrait {
|
||||||
|
width 1370
|
||||||
|
height 2446
|
||||||
|
event EV_SW:0:1
|
||||||
|
part1 {
|
||||||
|
name portrait
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 147
|
||||||
|
y 233
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
width 2497
|
||||||
|
height 1234
|
||||||
|
event EV_SW:0:0
|
||||||
|
part1 {
|
||||||
|
name landscape
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 278
|
||||||
|
y 1143
|
||||||
|
rotation 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
skins/nexus_5x/port_back.png
Normal file
After Width: | Height: | Size: 820 KiB |
BIN
skins/nexus_5x/port_fore.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
skins/nexus_5x/port_shadow.png
Normal file
After Width: | Height: | Size: 62 KiB |
BIN
skins/nexus_6/land_back.png
Normal file
After Width: | Height: | Size: 690 KiB |
BIN
skins/nexus_6/land_fore.png
Normal file
After Width: | Height: | Size: 221 KiB |
BIN
skins/nexus_6/land_shadow.png
Normal file
After Width: | Height: | Size: 60 KiB |
59
skins/nexus_6/layout
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
parts {
|
||||||
|
device {
|
||||||
|
display {
|
||||||
|
width 1440
|
||||||
|
height 2560
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
portrait {
|
||||||
|
background {
|
||||||
|
image port_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image port_fore.png
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
background {
|
||||||
|
image land_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image land_fore.png
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
layouts {
|
||||||
|
portrait {
|
||||||
|
width 1896
|
||||||
|
height 3054
|
||||||
|
event EV_SW:0:1
|
||||||
|
part1 {
|
||||||
|
name portrait
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 229
|
||||||
|
y 239
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
width 3142
|
||||||
|
height 1639
|
||||||
|
event EV_SW:0:0
|
||||||
|
part1 {
|
||||||
|
name landscape
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 318
|
||||||
|
y 1516
|
||||||
|
rotation 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
skins/nexus_6/port_back.png
Normal file
After Width: | Height: | Size: 779 KiB |
BIN
skins/nexus_6/port_fore.png
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
skins/nexus_6/port_shadow.png
Normal file
After Width: | Height: | Size: 92 KiB |
BIN
skins/nexus_6p/land_back.png
Normal file
After Width: | Height: | Size: 959 KiB |
BIN
skins/nexus_6p/land_fore.png
Normal file
After Width: | Height: | Size: 72 KiB |
BIN
skins/nexus_6p/land_shadow.png
Normal file
After Width: | Height: | Size: 63 KiB |
59
skins/nexus_6p/layout
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
parts {
|
||||||
|
device {
|
||||||
|
display {
|
||||||
|
width 1440
|
||||||
|
height 2560
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
portrait {
|
||||||
|
background {
|
||||||
|
image port_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image port_fore.png
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
background {
|
||||||
|
image land_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image land_fore.png
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
layouts {
|
||||||
|
portrait {
|
||||||
|
width 1840
|
||||||
|
height 3251
|
||||||
|
event EV_SW:0:1
|
||||||
|
part1 {
|
||||||
|
name portrait
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 195
|
||||||
|
y 329
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
width 3427
|
||||||
|
height 1620
|
||||||
|
event EV_SW:0:0
|
||||||
|
part1 {
|
||||||
|
name landscape
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 442
|
||||||
|
y 1511
|
||||||
|
rotation 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
skins/nexus_6p/port_back.png
Normal file
After Width: | Height: | Size: 1,001 KiB |
BIN
skins/nexus_6p/port_fore.png
Normal file
After Width: | Height: | Size: 54 KiB |
BIN
skins/nexus_6p/port_shadow.png
Normal file
After Width: | Height: | Size: 94 KiB |
BIN
skins/nexus_7/land_back.png
Normal file
After Width: | Height: | Size: 168 KiB |
BIN
skins/nexus_7/land_fore.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
skins/nexus_7/land_shadow.png
Normal file
After Width: | Height: | Size: 33 KiB |
59
skins/nexus_7/layout
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
parts {
|
||||||
|
device {
|
||||||
|
display {
|
||||||
|
width 800
|
||||||
|
height 1280
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
portrait {
|
||||||
|
background {
|
||||||
|
image port_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image port_fore.png
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
background {
|
||||||
|
image land_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image land_fore.png
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
layouts {
|
||||||
|
portrait {
|
||||||
|
width 1094
|
||||||
|
height 1689
|
||||||
|
event EV_SW:0:1
|
||||||
|
part1 {
|
||||||
|
name portrait
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 142
|
||||||
|
y 190
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
width 1803
|
||||||
|
height 1045
|
||||||
|
event EV_SW:0:0
|
||||||
|
part1 {
|
||||||
|
name landscape
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 260
|
||||||
|
y 905
|
||||||
|
rotation 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
skins/nexus_7/port_back.png
Normal file
After Width: | Height: | Size: 193 KiB |
BIN
skins/nexus_7/port_fore.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
skins/nexus_7/port_shadow.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
skins/nexus_7/thumb.png
Normal file
After Width: | Height: | Size: 7.6 KiB |
BIN
skins/nexus_7_2013/land_back.png
Normal file
After Width: | Height: | Size: 326 KiB |
BIN
skins/nexus_7_2013/land_fore.png
Normal file
After Width: | Height: | Size: 69 KiB |
BIN
skins/nexus_7_2013/land_shadow.png
Normal file
After Width: | Height: | Size: 48 KiB |
59
skins/nexus_7_2013/layout
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
parts {
|
||||||
|
device {
|
||||||
|
display {
|
||||||
|
width 1200
|
||||||
|
height 1920
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
portrait {
|
||||||
|
background {
|
||||||
|
image port_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image port_fore.png
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
background {
|
||||||
|
image land_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image land_fore.png
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
layouts {
|
||||||
|
portrait {
|
||||||
|
width 1596
|
||||||
|
height 2571
|
||||||
|
event EV_SW:0:1
|
||||||
|
part1 {
|
||||||
|
name portrait
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 195
|
||||||
|
y 301
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
width 2772
|
||||||
|
height 1479
|
||||||
|
event EV_SW:0:0
|
||||||
|
part1 {
|
||||||
|
name landscape
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 423
|
||||||
|
y 1320
|
||||||
|
rotation 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
skins/nexus_7_2013/port_back.png
Normal file
After Width: | Height: | Size: 358 KiB |
BIN
skins/nexus_7_2013/port_fore.png
Normal file
After Width: | Height: | Size: 56 KiB |
BIN
skins/nexus_7_2013/port_shadow.png
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
skins/nexus_9/land_back.png
Normal file
After Width: | Height: | Size: 1.5 MiB |
BIN
skins/nexus_9/land_fore.png
Normal file
After Width: | Height: | Size: 64 KiB |
BIN
skins/nexus_9/land_shadow.png
Normal file
After Width: | Height: | Size: 67 KiB |
59
skins/nexus_9/layout
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
parts {
|
||||||
|
device {
|
||||||
|
display {
|
||||||
|
width 1536
|
||||||
|
height 2048
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
portrait {
|
||||||
|
background {
|
||||||
|
image port_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image port_fore.png
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
background {
|
||||||
|
image land_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image land_fore.png
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
layouts {
|
||||||
|
portrait {
|
||||||
|
width 1978
|
||||||
|
height 2631
|
||||||
|
event EV_SW:0:1
|
||||||
|
part1 {
|
||||||
|
name portrait
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 219
|
||||||
|
y 264
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
width 2854
|
||||||
|
height 1785
|
||||||
|
event EV_SW:0:0
|
||||||
|
part1 {
|
||||||
|
name landscape
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 401
|
||||||
|
y 1635
|
||||||
|
rotation 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
skins/nexus_9/port_back.png
Normal file
After Width: | Height: | Size: 1.7 MiB |
BIN
skins/nexus_9/port_fore.png
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
skins/nexus_9/port_shadow.png
Normal file
After Width: | Height: | Size: 67 KiB |
BIN
skins/nexus_one/button.png
Normal file
After Width: | Height: | Size: 3.5 KiB |
BIN
skins/nexus_one/land_back.png
Normal file
After Width: | Height: | Size: 281 KiB |
BIN
skins/nexus_one/land_shadow.png
Normal file
After Width: | Height: | Size: 29 KiB |
134
skins/nexus_one/layout
Normal file
|
@ -0,0 +1,134 @@
|
||||||
|
parts {
|
||||||
|
device {
|
||||||
|
display {
|
||||||
|
width 480
|
||||||
|
height 800
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
portrait {
|
||||||
|
background {
|
||||||
|
image port_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image port_fore.png
|
||||||
|
}
|
||||||
|
buttons {
|
||||||
|
back {
|
||||||
|
image button.png
|
||||||
|
x 161
|
||||||
|
y 945
|
||||||
|
}
|
||||||
|
soft-left {
|
||||||
|
image button.png
|
||||||
|
x 282
|
||||||
|
y 945
|
||||||
|
}
|
||||||
|
home {
|
||||||
|
image button.png
|
||||||
|
x 402
|
||||||
|
y 945
|
||||||
|
}
|
||||||
|
search {
|
||||||
|
image button.png
|
||||||
|
x 524
|
||||||
|
y 945
|
||||||
|
}
|
||||||
|
volume-up {
|
||||||
|
image volume_up.png
|
||||||
|
x 23
|
||||||
|
y 196
|
||||||
|
}
|
||||||
|
volume-down {
|
||||||
|
image volume_down.png
|
||||||
|
x 23
|
||||||
|
y 258
|
||||||
|
}
|
||||||
|
power {
|
||||||
|
image power.png
|
||||||
|
x 147
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
background {
|
||||||
|
image land_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image land_fore.png
|
||||||
|
}
|
||||||
|
buttons {
|
||||||
|
back {
|
||||||
|
image button.png
|
||||||
|
x 1015
|
||||||
|
y 449
|
||||||
|
}
|
||||||
|
soft-left {
|
||||||
|
image button.png
|
||||||
|
x 1015
|
||||||
|
y 327
|
||||||
|
}
|
||||||
|
home {
|
||||||
|
image button.png
|
||||||
|
x 1015
|
||||||
|
y 207
|
||||||
|
}
|
||||||
|
search {
|
||||||
|
image button.png
|
||||||
|
x 1014
|
||||||
|
y 86
|
||||||
|
}
|
||||||
|
volume-up {
|
||||||
|
image volume_up_land.png
|
||||||
|
x 262
|
||||||
|
y 534
|
||||||
|
}
|
||||||
|
volume-down {
|
||||||
|
image volume_down_land.png
|
||||||
|
x 323
|
||||||
|
y 534
|
||||||
|
}
|
||||||
|
power {
|
||||||
|
image power_land.png
|
||||||
|
x 38
|
||||||
|
y 422
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
layouts {
|
||||||
|
portrait {
|
||||||
|
width 732
|
||||||
|
height 1178
|
||||||
|
event EV_SW:0:1
|
||||||
|
part1 {
|
||||||
|
name portrait
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 125
|
||||||
|
y 131
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
width 1300
|
||||||
|
height 612
|
||||||
|
event EV_SW:0:0
|
||||||
|
part1 {
|
||||||
|
name landscape
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 200
|
||||||
|
y 532
|
||||||
|
rotation 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
skins/nexus_one/port_back.png
Normal file
After Width: | Height: | Size: 262 KiB |
BIN
skins/nexus_one/port_shadow.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
skins/nexus_one/power.png
Normal file
After Width: | Height: | Size: 3.3 KiB |
BIN
skins/nexus_one/power_land.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
BIN
skins/nexus_one/thumb.png
Normal file
After Width: | Height: | Size: 9.8 KiB |
BIN
skins/nexus_one/volume_down.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
BIN
skins/nexus_one/volume_down_land.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
BIN
skins/nexus_one/volume_up.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
BIN
skins/nexus_one/volume_up_land.png
Normal file
After Width: | Height: | Size: 4 KiB |
BIN
skins/nexus_s/button.png
Normal file
After Width: | Height: | Size: 3.5 KiB |
BIN
skins/nexus_s/land_back.png
Normal file
After Width: | Height: | Size: 117 KiB |
BIN
skins/nexus_s/land_fore.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
skins/nexus_s/land_shadow.png
Normal file
After Width: | Height: | Size: 28 KiB |
133
skins/nexus_s/layout
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
parts {
|
||||||
|
device {
|
||||||
|
display {
|
||||||
|
width 480
|
||||||
|
height 800
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
portrait {
|
||||||
|
background {
|
||||||
|
image port_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image port_fore.png
|
||||||
|
}
|
||||||
|
buttons {
|
||||||
|
back {
|
||||||
|
image button.png
|
||||||
|
x 165
|
||||||
|
y 991
|
||||||
|
}
|
||||||
|
soft-left {
|
||||||
|
image button.png
|
||||||
|
x 279
|
||||||
|
y 991
|
||||||
|
}
|
||||||
|
search {
|
||||||
|
image button.png
|
||||||
|
x 390
|
||||||
|
y 991
|
||||||
|
}
|
||||||
|
home {
|
||||||
|
image button.png
|
||||||
|
x 502
|
||||||
|
y 993
|
||||||
|
}
|
||||||
|
volume-up {
|
||||||
|
image volume_up.png
|
||||||
|
x 23
|
||||||
|
y 305
|
||||||
|
}
|
||||||
|
volume-down {
|
||||||
|
image volume_down.png
|
||||||
|
x 23
|
||||||
|
y 412
|
||||||
|
}
|
||||||
|
power {
|
||||||
|
image power.png
|
||||||
|
x 627
|
||||||
|
y 215
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
background {
|
||||||
|
image land_back.png
|
||||||
|
}
|
||||||
|
onion {
|
||||||
|
image land_fore.png
|
||||||
|
}
|
||||||
|
buttons {
|
||||||
|
back {
|
||||||
|
image button.png
|
||||||
|
x 1039
|
||||||
|
y 430
|
||||||
|
}
|
||||||
|
soft-left {
|
||||||
|
image button.png
|
||||||
|
x 1039
|
||||||
|
y 318
|
||||||
|
}
|
||||||
|
search {
|
||||||
|
image button.png
|
||||||
|
x 1039
|
||||||
|
y 206
|
||||||
|
}
|
||||||
|
home {
|
||||||
|
image button.png
|
||||||
|
x 1039
|
||||||
|
y 94
|
||||||
|
}
|
||||||
|
volume-up {
|
||||||
|
image volume_up_land.png
|
||||||
|
x 361
|
||||||
|
y 519
|
||||||
|
}
|
||||||
|
volume-down {
|
||||||
|
image volume_down_land.png
|
||||||
|
x 459
|
||||||
|
y 519
|
||||||
|
}
|
||||||
|
power {
|
||||||
|
image power_land.png
|
||||||
|
x 266
|
||||||
|
y -11
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
layouts {
|
||||||
|
portrait {
|
||||||
|
width 719
|
||||||
|
height 1139
|
||||||
|
event EV_SW:0:1
|
||||||
|
part1 {
|
||||||
|
name portrait
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 119
|
||||||
|
y 160
|
||||||
|
}
|
||||||
|
}
|
||||||
|
landscape {
|
||||||
|
width 1210
|
||||||
|
height 586
|
||||||
|
event EV_SW:0:0
|
||||||
|
part1 {
|
||||||
|
name landscape
|
||||||
|
x 0
|
||||||
|
y 0
|
||||||
|
}
|
||||||
|
part2 {
|
||||||
|
name device
|
||||||
|
x 208
|
||||||
|
y 524
|
||||||
|
rotation 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
skins/nexus_s/port_back.png
Normal file
After Width: | Height: | Size: 117 KiB |
BIN
skins/nexus_s/port_fore.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
skins/nexus_s/port_shadow.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
skins/nexus_s/power.png
Normal file
After Width: | Height: | Size: 3.4 KiB |