Refactored code, added log and emulator skins
|
@ -99,11 +99,16 @@ EXPOSE 6080
|
|||
#==================
|
||||
# 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
|
||||
#===================
|
||||
COPY supervisord.conf /root/
|
||||
COPY service /root/service
|
||||
COPY src /root/src
|
||||
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-file=coverage.xml
|
||||
with-coverage=true
|
||||
cover-package=service
|
||||
cover-package=src
|
||||
cover-erase=true
|
||||
with-xunit=true
|
||||
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 |