ruboto 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +6 -6
- data/RELEASE_CANDICATE_DOC.md +7 -4
- data/RELEASE_DOC.md +25 -19
- data/assets/rakelib/ruboto.rake +61 -15
- data/assets/rakelib/stdlib.rake +266 -0
- data/assets/rakelib/stdlib.yml +5618 -0
- data/assets/rakelib/stdlib_dependencies.rb +136 -0
- data/assets/ruboto.yml +62 -0
- data/assets/src/org/ruboto/JRubyAdapter.java +10 -3
- data/assets/src/org/ruboto/SplashActivity.java +11 -10
- data/assets/src/ruboto/activity/reload.rb +4 -4
- data/assets/src/ruboto/widget.rb +4 -1
- data/lib/ruboto/commands/base.rb +15 -1
- data/lib/ruboto/sdk_versions.rb +10 -7
- data/lib/ruboto/util/emulator.rb +24 -27
- data/lib/ruboto/util/setup.rb +5 -0
- data/lib/ruboto/util/update.rb +9 -125
- data/lib/ruboto/util/verify.rb +1 -1
- data/lib/ruboto/version.rb +1 -1
- data/test/activity/dir_and_file_activity.rb +1 -1
- data/test/minimal_app_test.rb +7 -2
- data/test/rake_test.rb +12 -6
- data/test/ruboto_gen_test.rb +8 -2
- data/test/test_helper.rb +8 -7
- metadata +7 -3
@@ -0,0 +1,136 @@
|
|
1
|
+
############################################################################
|
2
|
+
#
|
3
|
+
# Use to build dependencies within stdlib.
|
4
|
+
#
|
5
|
+
|
6
|
+
class StdlibDependencies
|
7
|
+
attr_reader :dependencies, :version
|
8
|
+
|
9
|
+
REQUIRE = %r{^\s*require[ (]['"]([a-zA-Z0-9/-_]+)["'][)]?\s*$}
|
10
|
+
REQUIRE_RELATIVE = %r{^\s*require_relative[ (]['"]([a-zA-Z0-9/-_]+)["'][)]?\s*$}
|
11
|
+
|
12
|
+
def self.[](key)
|
13
|
+
versions[key]
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.versions
|
17
|
+
@@versions ||= {}
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.collect(dir=".")
|
21
|
+
local = new("app")
|
22
|
+
Dir.chdir(dir) do
|
23
|
+
local.check_dir(["ruboto"])
|
24
|
+
end
|
25
|
+
local
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.generate(dir=".")
|
29
|
+
versions
|
30
|
+
|
31
|
+
Dir.chdir(dir) do
|
32
|
+
raise("Can't find shared directory") unless File.directory?("shared")
|
33
|
+
Dir["*"].select{|d| File.directory?(d) && d != "shared"}.each do |d|
|
34
|
+
@@versions[d] = new(d).generate
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
versions
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.dump(file)
|
42
|
+
require 'yaml'
|
43
|
+
|
44
|
+
all_dependencies = {}
|
45
|
+
versions.each{|k, v| all_dependencies[k] = v.dependencies}
|
46
|
+
|
47
|
+
File.open( file, 'w' ) do |out|
|
48
|
+
YAML.dump( all_dependencies, out )
|
49
|
+
end
|
50
|
+
|
51
|
+
versions
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.load(file)
|
55
|
+
require 'yaml'
|
56
|
+
|
57
|
+
@@versions = {}
|
58
|
+
raise("Can't find #{file}") unless File.exists?(file)
|
59
|
+
|
60
|
+
File.open(file) do |versions|
|
61
|
+
YAML.load(versions).each{|k,v| @@versions[k] = new(k, v)}
|
62
|
+
end
|
63
|
+
|
64
|
+
versions
|
65
|
+
end
|
66
|
+
|
67
|
+
def initialize(version, dependencies={})
|
68
|
+
@version = version
|
69
|
+
@dependencies = dependencies
|
70
|
+
end
|
71
|
+
|
72
|
+
def [](key)
|
73
|
+
@dependencies[key]
|
74
|
+
end
|
75
|
+
|
76
|
+
def generate
|
77
|
+
raise("Can't find shared directory") unless File.directory?("shared")
|
78
|
+
raise("Can't find #{@version} directory") unless File.directory?(@version)
|
79
|
+
|
80
|
+
Dir.chdir("shared"){check_dir}
|
81
|
+
Dir.chdir(@version){check_dir}
|
82
|
+
|
83
|
+
# Clean up dependencies
|
84
|
+
@dependencies.keys.sort.each do |i|
|
85
|
+
# remove duplicates
|
86
|
+
@dependencies[i] = @dependencies[i].uniq
|
87
|
+
|
88
|
+
# remove references to self
|
89
|
+
@dependencies[i] = @dependencies[i] - [i]
|
90
|
+
|
91
|
+
# sort
|
92
|
+
@dependencies[i] = @dependencies[i].sort
|
93
|
+
end
|
94
|
+
|
95
|
+
self
|
96
|
+
end
|
97
|
+
|
98
|
+
def depends_on(name, on=nil)
|
99
|
+
base = name[0..-4]
|
100
|
+
@dependencies[base] = (@dependencies[base] || [])
|
101
|
+
@dependencies[base] << on
|
102
|
+
end
|
103
|
+
|
104
|
+
def gather_dependencies(file)
|
105
|
+
f = IO.read(file)
|
106
|
+
|
107
|
+
##################################
|
108
|
+
#
|
109
|
+
# Handle encoding problems under different rubies
|
110
|
+
#
|
111
|
+
if String.method_defined?(:encode)
|
112
|
+
f.encode!('UTF-8', 'UTF-8', :invalid => :replace)
|
113
|
+
else
|
114
|
+
require 'iconv'
|
115
|
+
f = Iconv.new('UTF-8', 'UTF-8//IGNORE').iconv(f)
|
116
|
+
end
|
117
|
+
#
|
118
|
+
#################################
|
119
|
+
|
120
|
+
f.scan(REQUIRE) do |j|
|
121
|
+
depends_on(file, j[0])
|
122
|
+
end
|
123
|
+
|
124
|
+
f.scan(REQUIRE_RELATIVE) do |j|
|
125
|
+
on = file.split('/')[0..-2] << j[0]
|
126
|
+
depends_on(file, on.join('/'))
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def check_dir(exclude=[])
|
131
|
+
Dir["**/*.rb"].select{|rb| not exclude.include?(rb.split('/')[0])}.each do |i|
|
132
|
+
gather_dependencies(i)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
data/assets/ruboto.yml
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
###################################
|
2
|
+
#
|
3
|
+
# heap_alloc
|
4
|
+
#
|
5
|
+
# Forces the heap to grow by a number of megabytes.
|
6
|
+
# Can result in improved start-up performance because
|
7
|
+
# it prevents the heap from growing through smaller
|
8
|
+
# increments.
|
9
|
+
#
|
10
|
+
# heap_alloc: 13
|
11
|
+
|
12
|
+
###################################
|
13
|
+
#
|
14
|
+
# ruby_version
|
15
|
+
#
|
16
|
+
# Sets the jruby.compat.version property of JRuby
|
17
|
+
# If you include the jruby jars, this is used to
|
18
|
+
# trim away unused versions of the stdlib.
|
19
|
+
#
|
20
|
+
#ruby_version: 1.9
|
21
|
+
|
22
|
+
###################################
|
23
|
+
#
|
24
|
+
# included_stdlibs
|
25
|
+
#
|
26
|
+
# Specify parts of the stdlib that are needed.
|
27
|
+
# If you specify a list, all other components
|
28
|
+
# will be removed. If you specify "auto,"
|
29
|
+
# dependencies will be determined from
|
30
|
+
# auto_dependencies.yml. Running
|
31
|
+
# "rake libs:check_dependencies' will build
|
32
|
+
# auto_dependencies.yml.
|
33
|
+
#
|
34
|
+
# included_stdlibs: auto
|
35
|
+
#
|
36
|
+
# included_stdlibs:
|
37
|
+
# - fileutils
|
38
|
+
|
39
|
+
###################################
|
40
|
+
#
|
41
|
+
# excluded_stdlibs
|
42
|
+
#
|
43
|
+
# Remove unneeded files from stdlib.
|
44
|
+
# Note: If you specify included_stdlibs above,
|
45
|
+
# this information will be ingnored.
|
46
|
+
#
|
47
|
+
#excluded_stdlibs:
|
48
|
+
#- ant
|
49
|
+
#- cgi
|
50
|
+
#- drb
|
51
|
+
#- erb
|
52
|
+
#- gauntlet_rdoc
|
53
|
+
#- minitest
|
54
|
+
#- profiler
|
55
|
+
#- rake
|
56
|
+
#- rdoc
|
57
|
+
#- shell
|
58
|
+
#- test
|
59
|
+
#- webrick
|
60
|
+
#- win32
|
61
|
+
#- Win32API
|
62
|
+
|
@@ -134,7 +134,9 @@ public class JRubyAdapter {
|
|
134
134
|
Log.d("Setting up JRuby runtime (" + (isDebugBuild ? "DEBUG" : "RELEASE") + ")");
|
135
135
|
System.setProperty("jruby.backtrace.style", "normal"); // normal raw full mri
|
136
136
|
System.setProperty("jruby.bytecode.version", "1.6");
|
137
|
-
//
|
137
|
+
// BEGIN Ruboto RubyVersion
|
138
|
+
// System.setProperty("jruby.compat.version", "RUBY1_9"); // RUBY1_9 is the default in JRuby 1.7
|
139
|
+
// END Ruboto RubyVersion
|
138
140
|
// System.setProperty("jruby.compile.backend", "DALVIK");
|
139
141
|
System.setProperty("jruby.compile.mode", "OFF"); // OFF OFFIR JITIR? FORCE FORCEIR
|
140
142
|
System.setProperty("jruby.interfaces.useProxy", "true");
|
@@ -377,14 +379,19 @@ public class JRubyAdapter {
|
|
377
379
|
File storageDir = null;
|
378
380
|
if (isDebugBuild()) {
|
379
381
|
storageDir = context.getExternalFilesDir(null);
|
380
|
-
if (storageDir == null
|
382
|
+
if (storageDir == null) {
|
381
383
|
Log.e("Development mode active, but sdcard is not available. Make sure you have added\n<uses-permission android:name='android.permission.WRITE_EXTERNAL_STORAGE' />\nto your AndroidManifest.xml file.");
|
382
384
|
storageDir = context.getFilesDir();
|
383
385
|
}
|
384
386
|
} else {
|
385
387
|
storageDir = context.getFilesDir();
|
386
388
|
}
|
387
|
-
|
389
|
+
File scriptsDir = new File(storageDir, "scripts");
|
390
|
+
if ((!scriptsDir.exists() && !scriptsDir.mkdirs())) {
|
391
|
+
Log.e("Unable to create the scripts dir.");
|
392
|
+
scriptsDir = new File(context.getFilesDir(), "scripts");
|
393
|
+
}
|
394
|
+
return scriptsDir.getAbsolutePath();
|
388
395
|
}
|
389
396
|
|
390
397
|
private static void setDebugBuild(Context context) {
|
@@ -140,13 +140,21 @@ public class SplashActivity extends Activity {
|
|
140
140
|
}).start();
|
141
141
|
}
|
142
142
|
return;
|
143
|
+
} else {
|
144
|
+
Log.e("Permission missing for direct download: Internet: " +
|
145
|
+
hasInternetPermission() + ", non-market install: " +
|
146
|
+
canInstallFromUnknownSources());
|
143
147
|
}
|
144
148
|
} catch (Exception e) {
|
145
149
|
Log.e("Exception in direct RubotoCore download: " + e);
|
150
|
+
e.printStackTrace();
|
146
151
|
}
|
147
152
|
try {
|
153
|
+
Log.i("Download RubotoCore using the market");
|
148
154
|
startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("market://details?id=org.ruboto.core")));
|
149
155
|
} catch (android.content.ActivityNotFoundException anfe) {
|
156
|
+
Log.e("Exception in market RubotoCore download: " + anfe);
|
157
|
+
Log.i("Download RubotoCore using the download manager");
|
150
158
|
Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(RUBOTO_URL));
|
151
159
|
startActivity(intent);
|
152
160
|
}
|
@@ -347,18 +355,11 @@ public class SplashActivity extends Activity {
|
|
347
355
|
}
|
348
356
|
|
349
357
|
private boolean canInstallFromUnknownSources() {
|
350
|
-
|
351
|
-
|
352
|
-
String selection = Settings.Secure.NAME + " = ? AND " + Settings.Secure.VALUE + " = ?";
|
353
|
-
|
354
|
-
// FIXME(uwe): Use android.provider.Settings.Global.INSTALL_NON_MARKET_APPS
|
355
|
-
// when we stop supporting Android api level < 17
|
356
|
-
String[] selectionArgs = {Settings.Secure.INSTALL_NON_MARKET_APPS, String.valueOf(1)};
|
358
|
+
// FIXME(uwe): Use Settings.Global when we stop supporting Android api level < 17
|
359
|
+
// return Settings.Global.getInt(getContentResolver(), Settings.Global.INSTALL_NON_MARKET_APPS, 0) == 1;
|
357
360
|
// EMXIF
|
358
361
|
|
359
|
-
|
360
|
-
selection, selectionArgs, null);
|
361
|
-
return query.getCount() == 1;
|
362
|
+
return Settings.Secure.getInt(getContentResolver(), Settings.Secure.INSTALL_NON_MARKET_APPS, 0) == 1;
|
362
363
|
}
|
363
364
|
|
364
365
|
// Get the downloaded percent
|
@@ -42,10 +42,10 @@ module Ruboto::Activity::Reload
|
|
42
42
|
Log.d "Got reload intent: #{reload_intent.inspect}"
|
43
43
|
file_string = reload_intent.get_string_extra('reload')
|
44
44
|
if file_string
|
45
|
-
|
45
|
+
scripts_dir = @activity.getExternalFilesDir(nil).absolute_path + '/scripts'
|
46
46
|
files.each do |file|
|
47
|
-
Log.d "load file: #{file
|
48
|
-
load file
|
47
|
+
Log.d "load file: #{scripts_dir}/#{file}"
|
48
|
+
load "#{scripts_dir}/#{file}"
|
49
49
|
end
|
50
50
|
Log.d 'restart activity'
|
51
51
|
if @activity.intent.action == android.content.Intent::ACTION_MAIN ||
|
@@ -55,8 +55,8 @@ module Ruboto::Activity::Reload
|
|
55
55
|
else
|
56
56
|
restart_intent = @activity.intent
|
57
57
|
end
|
58
|
-
@activity.startActivity(restart_intent)
|
59
58
|
@activity.finish
|
59
|
+
@activity.startActivity(restart_intent)
|
60
60
|
Log.d 'activity restarted'
|
61
61
|
end
|
62
62
|
Log.d 'reload complete.'
|
data/assets/src/ruboto/widget.rb
CHANGED
@@ -76,7 +76,10 @@ View.class_eval do
|
|
76
76
|
end
|
77
77
|
|
78
78
|
params.each do |k, v|
|
79
|
-
|
79
|
+
setter_method = "set#{k.to_s.gsub(/(^|_)([a-z])/) { $2.upcase }}"
|
80
|
+
assign_method = "#{k}="
|
81
|
+
method_name = self.respond_to?(assign_method) ? assign_method :
|
82
|
+
(self.respond_to?(setter_method) ? setter_method : k)
|
80
83
|
invoke_with_converted_arguments(self, method_name, v)
|
81
84
|
end
|
82
85
|
end
|
data/lib/ruboto/commands/base.rb
CHANGED
@@ -61,6 +61,12 @@ module Ruboto
|
|
61
61
|
description 'Generate the JRuby jars jar'
|
62
62
|
cast :boolean
|
63
63
|
}
|
64
|
+
option('ruby-version') {
|
65
|
+
description 'Using what version of Ruby? (e.g., 1.8, 1.9, 2.0)'
|
66
|
+
argument :required
|
67
|
+
cast :float
|
68
|
+
validate {|rv| [1.8, 1.9, 2.0].include?(rv)}
|
69
|
+
}
|
64
70
|
option('force') {
|
65
71
|
description 'Force creation of project even if the path exists'
|
66
72
|
cast :boolean
|
@@ -75,6 +81,7 @@ module Ruboto
|
|
75
81
|
target = params['target'].value
|
76
82
|
min_sdk = params['min-sdk'].value || target
|
77
83
|
with_jruby = params['with-jruby'].value
|
84
|
+
ruby_version = params['ruby-version'].value
|
78
85
|
force = params['force'].value
|
79
86
|
|
80
87
|
abort "Path (#{path}) must be to a directory that does not yet exist. It will be created." if !force && File.exists?(path)
|
@@ -103,6 +110,13 @@ module Ruboto
|
|
103
110
|
update_manifest min_sdk[/\d+/], target[/\d+/], true
|
104
111
|
update_test true
|
105
112
|
update_assets
|
113
|
+
|
114
|
+
if ruby_version
|
115
|
+
source = File.read('ruboto.yml')
|
116
|
+
pattern = %r{^#? ?ruby_version: 1.9$}
|
117
|
+
File.open('ruboto.yml', 'w') { |f| f << source.sub(pattern, "ruby_version: #{ruby_version}") }
|
118
|
+
end
|
119
|
+
|
106
120
|
update_ruboto true
|
107
121
|
update_icons true
|
108
122
|
update_classes nil, 'exclude'
|
@@ -394,7 +408,7 @@ module Ruboto
|
|
394
408
|
option('target', 't') {
|
395
409
|
extend Ruboto::Util::Emulator
|
396
410
|
description 'sets the target Android API level for the emulator'
|
397
|
-
examples Ruboto::
|
411
|
+
examples Ruboto::SdkVersions::API_LEVEL_TO_VERSION.keys.join(', ')
|
398
412
|
required unless api_level
|
399
413
|
argument :required
|
400
414
|
default(api_level) if api_level
|
data/lib/ruboto/sdk_versions.rb
CHANGED
@@ -3,16 +3,19 @@ require 'pathname'
|
|
3
3
|
module Ruboto
|
4
4
|
module SdkVersions
|
5
5
|
VERSION_TO_API_LEVEL = {
|
6
|
-
'2.3' =>
|
7
|
-
'
|
8
|
-
'
|
9
|
-
'4.
|
10
|
-
'4.1' => 'android-16', '4.1.1' => 'android-16', '4.1.2' => 'android-16',
|
11
|
-
'4.2' => 'android-17', '4.2.2' => 'android-17',
|
6
|
+
'2.3' => 9, '2.3.1' => 9, '2.3.2' => 9, '2.3.3' => 10, '2.3.4' => 10,
|
7
|
+
'3.0' => 11, '3.1' => 12, '3.2' => 13, '4.0.1' => 14, '4.0.3' => 15,
|
8
|
+
'4.0.4' => 15, '4.1' => 16, '4.1.1' => 16, '4.1.2' => 16, '4.2' => 17,
|
9
|
+
'4.2.2' => 17, '4.3' => 18, '4.4.2' => 19,
|
12
10
|
}
|
11
|
+
API_LEVEL_TO_VERSION = {
|
12
|
+
10 => '2.3.3', 11 => '3.0', 12 => '3.1', 13 => '3.2', 14 => '4.0',
|
13
|
+
15 => '4.0.3', 16 => '4.1.2', 17 => '4.2.2', 18 => '4.3', 19 => '4.4.2',
|
14
|
+
}
|
15
|
+
|
13
16
|
MINIMUM_SUPPORTED_SDK_LEVEL = 10
|
14
17
|
MINIMUM_SUPPORTED_SDK = "android-#{MINIMUM_SUPPORTED_SDK_LEVEL}"
|
15
|
-
DEFAULT_TARGET_SDK_LEVEL =
|
18
|
+
DEFAULT_TARGET_SDK_LEVEL = 15
|
16
19
|
DEFAULT_TARGET_SDK = "android-#{DEFAULT_TARGET_SDK_LEVEL}"
|
17
20
|
end
|
18
21
|
end
|
data/lib/ruboto/util/emulator.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'net/telnet'
|
2
|
+
require 'ruboto/sdk_versions'
|
2
3
|
|
3
4
|
module Ruboto
|
4
5
|
module Util
|
@@ -6,13 +7,8 @@ module Ruboto
|
|
6
7
|
ON_WINDOWS = (RbConfig::CONFIG['host_os'] =~ /mswin|mingw/i)
|
7
8
|
ON_MAC_OS_X = RbConfig::CONFIG['host_os'] =~ /^darwin(.*)/
|
8
9
|
|
9
|
-
API_LEVEL_TO_VERSION = {
|
10
|
-
10 => '2.3.3', 11 => '3.0', 12 => '3.1', 13 => '3.2', 14 => '4.0',
|
11
|
-
15 => '4.0.3', 16 => '4.1.2', 17 => '4.2.2', 18 => '4.3', 19 => '4.4',
|
12
|
-
}
|
13
|
-
|
14
10
|
def sdk_level_name(sdk_level)
|
15
|
-
API_LEVEL_TO_VERSION[sdk_level] || "api_#{sdk_level}"
|
11
|
+
Ruboto::SdkVersions::API_LEVEL_TO_VERSION[sdk_level] || "api_#{sdk_level}"
|
16
12
|
end
|
17
13
|
|
18
14
|
def start_emulator(sdk_level)
|
@@ -123,21 +119,10 @@ module Ruboto
|
|
123
119
|
manifest_file = 'AndroidManifest.xml'
|
124
120
|
heap_size = (File.exists?(manifest_file) && File.read(manifest_file) =~ /largeHeap/) ? 256 : 48
|
125
121
|
new_avd_config = old_avd_config.gsub(/vm.heapSize=([0-9]*)/) { |m| $1.to_i < heap_size ? "vm.heapSize=#{heap_size}" : m }
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
end
|
131
|
-
unless new_avd_config =~ /^hw.device.name=/
|
132
|
-
device_name_prop = 'hw.device.name=3.2in HVGA slider (ADP1)'
|
133
|
-
new_avd_config << "#{device_name_prop}\n"
|
134
|
-
puts "Added #{device_name_prop} property"
|
135
|
-
end
|
136
|
-
unless new_avd_config =~ /^hw.mainKeys=/
|
137
|
-
main_keys_prop = 'hw.mainKeys=yes'
|
138
|
-
new_avd_config << "#{main_keys_prop}\n"
|
139
|
-
puts "Added #{main_keys_prop} property"
|
140
|
-
end
|
122
|
+
add_property(new_avd_config, 'hw.device.manufacturer', 'Generic')
|
123
|
+
add_property(new_avd_config, 'hw.device.name', '3.2" HVGA slider (ADP1)')
|
124
|
+
add_property(new_avd_config, 'hw.mainKeys', 'yes')
|
125
|
+
add_property(new_avd_config, 'hw.sdCard', 'yes')
|
141
126
|
|
142
127
|
File.write(avd_config_file_name, new_avd_config) if new_avd_config != old_avd_config
|
143
128
|
new_snapshot = true
|
@@ -183,16 +168,12 @@ module Ruboto
|
|
183
168
|
if $? == 0
|
184
169
|
print 'Emulator started: '
|
185
170
|
50.times do
|
186
|
-
if
|
187
|
-
break
|
188
|
-
end
|
171
|
+
break if device_ready?
|
189
172
|
print '.'
|
190
173
|
sleep 1
|
191
174
|
end
|
192
175
|
puts
|
193
|
-
if
|
194
|
-
break
|
195
|
-
end
|
176
|
+
break if device_ready?
|
196
177
|
end
|
197
178
|
puts 'Unable to start the emulator.'
|
198
179
|
end
|
@@ -224,6 +205,22 @@ EOF
|
|
224
205
|
|
225
206
|
puts "Emulator #{avd_name} started OK."
|
226
207
|
end
|
208
|
+
|
209
|
+
def device_ready?
|
210
|
+
`adb get-state`.gsub(/^WARNING:.*$/, '').chomp == 'device'
|
211
|
+
end
|
212
|
+
|
213
|
+
def add_property(new_avd_config, property_name, value)
|
214
|
+
pattern = /^#{property_name}=.*$/
|
215
|
+
property = "#{property_name}=#{value}"
|
216
|
+
if new_avd_config =~ pattern
|
217
|
+
new_avd_config.gsub! pattern, property
|
218
|
+
puts "Changed property: #{property}"
|
219
|
+
else
|
220
|
+
new_avd_config << "#{property}\n"
|
221
|
+
puts "Added property: #{property}"
|
222
|
+
end
|
223
|
+
end
|
227
224
|
end
|
228
225
|
end
|
229
226
|
end
|