gametel 0.1 → 0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. data/.gitignore +4 -3
  2. data/ApiDemos/res/layout/buttons_1.xml +6 -0
  3. data/ApiDemos/res/layout/controls_1.xml +1 -0
  4. data/ApiDemos/res/values/strings.xml +1 -0
  5. data/ApiDemos/src/com/example/android/apis/accessibility/ClockBackActivity.java +0 -1
  6. data/ApiDemos/src/com/example/android/apis/accessibility/TaskBackService.java +0 -1
  7. data/ApiDemos/src/com/example/android/apis/accessibility/TaskListActivity.java +0 -1
  8. data/ApiDemos/src/com/example/android/apis/accessibility/TaskListView.java +0 -4
  9. data/ApiDemos/src/com/example/android/apis/app/ActionBarSettingsActionProviderActivity.java +0 -1
  10. data/ApiDemos/src/com/example/android/apis/app/DeviceAdminSample.java +0 -4
  11. data/ApiDemos/src/com/example/android/apis/app/LoaderCursor.java +1 -1
  12. data/ApiDemos/src/com/example/android/apis/app/LoaderCustom.java +5 -6
  13. data/ApiDemos/src/com/example/android/apis/app/VoiceRecognition.java +0 -4
  14. data/ApiDemos/src/com/example/android/apis/content/FileProvider.java +0 -1
  15. data/ApiDemos/src/com/example/android/apis/view/GameControllerInput.java +4 -11
  16. data/ApiDemos/src/com/example/android/apis/view/Hover.java +1 -11
  17. data/ApiDemos/src/com/example/android/apis/view/Switches.java +0 -1
  18. data/ChangeLog +10 -0
  19. data/README.md +14 -1
  20. data/cucumber.yml +10 -2
  21. data/features/button.feature +5 -0
  22. data/features/checkbox.feature +4 -0
  23. data/features/is_enabled.feature +9 -0
  24. data/features/list_item.feature +4 -0
  25. data/features/main_screen.feature +5 -0
  26. data/features/radio_button.feature +3 -0
  27. data/features/step_definitions/button_steps.rb +4 -0
  28. data/features/step_definitions/controls_steps.rb +12 -3
  29. data/features/step_definitions/is_enabled_steps.rb +7 -0
  30. data/features/step_definitions/list_item_steps.rb +4 -0
  31. data/features/step_definitions/main_screen_steps.rb +6 -0
  32. data/features/step_definitions/view_steps.rb +20 -0
  33. data/features/support/app_installation_hooks.rb +9 -17
  34. data/features/support/app_life_cycle_hooks.rb +4 -21
  35. data/features/support/screens/alert_dialogs_screen.rb +5 -0
  36. data/features/support/screens/app_menu_screen.rb +6 -0
  37. data/features/support/screens/auto_complete_menu_screen.rb +11 -0
  38. data/features/support/screens/auto_complete_screen_top_screen.rb +7 -0
  39. data/features/support/screens/buttons_screen.rb +1 -0
  40. data/features/support/screens/controls_screen.rb +5 -2
  41. data/features/support/screens/custom_views_screen.rb +7 -0
  42. data/features/support/screens/main_menu_screen.rb +1 -0
  43. data/features/text.feature +33 -3
  44. data/features/view.feature +11 -0
  45. data/gametel.gemspec +2 -2
  46. data/lib/gametel.rb +14 -0
  47. data/lib/gametel/accessors.rb +40 -3
  48. data/lib/gametel/platforms/calabash.rb +42 -3
  49. data/lib/gametel/version.rb +1 -1
  50. data/spec/lib/gametel/accessors_spec.rb +102 -32
  51. data/spec/lib/gametel_spec.rb +10 -0
  52. metadata +23 -13
  53. data/ApiDemos/bin/ApiDemos.apk +0 -0
  54. data/ApiDemos/local.properties +0 -10
data/.gitignore CHANGED
@@ -2,6 +2,8 @@
2
2
  *.rbc
3
3
  *.swp
4
4
  *.class
5
+ *.cache
6
+ *.d
5
7
  .bundle
6
8
  .config
7
9
  .yardoc
@@ -20,6 +22,5 @@ tmp
20
22
  Test.apk
21
23
  results
22
24
  ApiDemos/gen
23
- ApiDemos/bin/classes
24
- ApiDemos/bin/res
25
- ApiDemos/bin/classes.dex
25
+ ApiDemos/bin
26
+ test_servers
@@ -41,6 +41,12 @@
41
41
  android:text="@string/buttons_1_toggle"
42
42
  android:layout_width="wrap_content"
43
43
  android:layout_height="wrap_content" />
44
+
45
+ <Button android:id="@+id/button_disabled"
46
+ android:text="Disabled"
47
+ android:enabled="false"
48
+ android:layout_width="wrap_content"
49
+ android:layout_height="wrap_content" />
44
50
 
45
51
  </LinearLayout>
46
52
 
@@ -47,6 +47,7 @@
47
47
  android:layout_height="wrap_content">
48
48
 
49
49
  <EditText android:id="@+id/edit"
50
+ android:contentDescription="@string/controls_1_edit_desc"
50
51
  android:layout_width="match_parent"
51
52
  android:layout_height="wrap_content"/>
52
53
 
@@ -968,6 +968,7 @@
968
968
  <string name="baseline_7_lean">Slim and slick.</string>
969
969
  <string name="baseline_nested_1_label">label</string>
970
970
  <string name="controls_1_save">Save</string>
971
+ <string name="controls_1_edit_desc">Edit Description</string>
971
972
  <string name="controls_1_checkbox_1">Checkbox 1</string>
972
973
  <string name="controls_1_checkbox_2">Checkbox 2</string>
973
974
  <string name="controls_1_radiobutton_1">RadioButton 1</string>
@@ -46,7 +46,6 @@ public class ClockBackActivity extends Activity {
46
46
  // Add a shortcut to the accessibility settings.
47
47
  ImageButton button = (ImageButton) findViewById(R.id.button);
48
48
  button.setOnClickListener(new View.OnClickListener() {
49
- @Override
50
49
  public void onClick(View v) {
51
50
  startActivity(sSettingsIntent);
52
51
  }
@@ -168,7 +168,6 @@ public class TaskBackService extends AccessibilityService implements OnInitListe
168
168
  /**
169
169
  * {@inheritDoc}
170
170
  */
171
- @Override
172
171
  public void onInit(int status) {
173
172
  // Set a flag so that the TaskBackService knows that the Text-To-Speech
174
173
  // engine has been initialized, and can now handle speaking requests.
@@ -50,7 +50,6 @@ public class TaskListActivity extends ListActivity {
50
50
  // Add a shortcut to the accessibility settings.
51
51
  ImageButton button = (ImageButton) findViewById(R.id.button);
52
52
  button.setOnClickListener(new View.OnClickListener() {
53
- @Override
54
53
  public void onClick(View v) {
55
54
  startActivity(sSettingsIntent);
56
55
  }
@@ -75,7 +75,6 @@ final class TaskAdapter extends BaseAdapter{
75
75
  mCheckboxes = checkboxes;
76
76
  }
77
77
 
78
- @Override
79
78
  public int getCount() {
80
79
  return mLabels.length;
81
80
  }
@@ -83,7 +82,6 @@ final class TaskAdapter extends BaseAdapter{
83
82
  /** Expands the views for individual list entries, and sets content descriptions for use by the
84
83
  * TaskBackAccessibilityService.
85
84
  */
86
- @Override
87
85
  public View getView(int position, View convertView, ViewGroup parent) {
88
86
  if(convertView == null) {
89
87
  LayoutInflater inflater = LayoutInflater.from(mContext);
@@ -107,12 +105,10 @@ final class TaskAdapter extends BaseAdapter{
107
105
  return convertView;
108
106
  }
109
107
 
110
- @Override
111
108
  public Object getItem(int position) {
112
109
  return mLabels[position];
113
110
  }
114
111
 
115
- @Override
116
112
  public long getItemId(int position) {
117
113
  return position;
118
114
  }
@@ -90,7 +90,6 @@ public class ActionBarSettingsActionProviderActivity extends Activity {
90
90
  ImageButton button = (ImageButton) view.findViewById(R.id.button);
91
91
  // Attach a click listener for launching the system settings.
92
92
  button.setOnClickListener(new View.OnClickListener() {
93
- @Override
94
93
  public void onClick(View v) {
95
94
  mContext.startActivity(sSettingsIntent);
96
95
  }
@@ -194,7 +194,6 @@ public class DeviceAdminSample extends PreferenceActivity {
194
194
  }
195
195
  }
196
196
 
197
- @Override
198
197
  public boolean onPreferenceClick(Preference preference) {
199
198
  if (mSetPassword != null && preference == mSetPassword) {
200
199
  Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
@@ -204,7 +203,6 @@ public class DeviceAdminSample extends PreferenceActivity {
204
203
  return false;
205
204
  }
206
205
 
207
- @Override
208
206
  public boolean onPreferenceChange(Preference preference, Object newValue) {
209
207
  if (mResetPassword != null && preference == mResetPassword) {
210
208
  doResetPassword((String)newValue);
@@ -717,7 +715,6 @@ public class DeviceAdminSample extends PreferenceActivity {
717
715
  builder.setMessage(R.string.wipe_warning_first);
718
716
  builder.setPositiveButton(R.string.wipe_warning_first_ok,
719
717
  new DialogInterface.OnClickListener() {
720
- @Override
721
718
  public void onClick(DialogInterface dialog, int which) {
722
719
  AlertDialog.Builder builder = new AlertDialog.Builder(activity);
723
720
  if (wipeAllData) {
@@ -727,7 +724,6 @@ public class DeviceAdminSample extends PreferenceActivity {
727
724
  }
728
725
  builder.setPositiveButton(R.string.wipe_warning_second_ok,
729
726
  new DialogInterface.OnClickListener() {
730
- @Override
731
727
  public void onClick(DialogInterface dialog, int which) {
732
728
  boolean stillActive = mActivity.isActiveAdmin();
733
729
  if (stillActive) {
@@ -110,7 +110,7 @@ public class LoaderCursor extends Activity {
110
110
  return true;
111
111
  }
112
112
 
113
- @Override public boolean onQueryTextSubmit(String query) {
113
+ public boolean onQueryTextSubmit(String query) {
114
114
  // Don't care about this.
115
115
  return true;
116
116
  }
@@ -148,7 +148,6 @@ public class LoaderCustom extends Activity {
148
148
  */
149
149
  public static final Comparator<AppEntry> ALPHA_COMPARATOR = new Comparator<AppEntry>() {
150
150
  private final Collator sCollator = Collator.getInstance();
151
- @Override
152
151
  public int compare(AppEntry object1, AppEntry object2) {
153
152
  return sCollator.compare(object1.getLabel(), object2.getLabel());
154
153
  }
@@ -437,7 +436,7 @@ public class LoaderCustom extends Activity {
437
436
  item.setActionView(sv);
438
437
  }
439
438
 
440
- @Override public boolean onQueryTextChange(String newText) {
439
+ public boolean onQueryTextChange(String newText) {
441
440
  // Called when the action bar search text has changed. Since this
442
441
  // is a simple array adapter, we can just have it do the filtering.
443
442
  mCurFilter = !TextUtils.isEmpty(newText) ? newText : null;
@@ -445,7 +444,7 @@ public class LoaderCustom extends Activity {
445
444
  return true;
446
445
  }
447
446
 
448
- @Override public boolean onQueryTextSubmit(String query) {
447
+ public boolean onQueryTextSubmit(String query) {
449
448
  // Don't care about this.
450
449
  return true;
451
450
  }
@@ -455,13 +454,13 @@ public class LoaderCustom extends Activity {
455
454
  Log.i("LoaderCustom", "Item clicked: " + id);
456
455
  }
457
456
 
458
- @Override public Loader<List<AppEntry>> onCreateLoader(int id, Bundle args) {
457
+ public Loader<List<AppEntry>> onCreateLoader(int id, Bundle args) {
459
458
  // This is called when a new Loader needs to be created. This
460
459
  // sample only has one Loader with no arguments, so it is simple.
461
460
  return new AppListLoader(getActivity());
462
461
  }
463
462
 
464
- @Override public void onLoadFinished(Loader<List<AppEntry>> loader, List<AppEntry> data) {
463
+ public void onLoadFinished(Loader<List<AppEntry>> loader, List<AppEntry> data) {
465
464
  // Set the new data in the adapter.
466
465
  mAdapter.setData(data);
467
466
 
@@ -473,7 +472,7 @@ public class LoaderCustom extends Activity {
473
472
  }
474
473
  }
475
474
 
476
- @Override public void onLoaderReset(Loader<List<AppEntry>> loader) {
475
+ public void onLoaderReset(Loader<List<AppEntry>> loader) {
477
476
  // Clear the data in the adapter.
478
477
  mAdapter.setData(null);
479
478
  }
@@ -184,7 +184,6 @@ public class VoiceRecognition extends Activity implements OnClickListener {
184
184
 
185
185
  if (getResultCode() != Activity.RESULT_OK) {
186
186
  mHandler.post(new Runnable() {
187
- @Override
188
187
  public void run() {
189
188
  showToast("Error code:" + getResultCode());
190
189
  }
@@ -193,7 +192,6 @@ public class VoiceRecognition extends Activity implements OnClickListener {
193
192
 
194
193
  if (extra == null) {
195
194
  mHandler.post(new Runnable() {
196
- @Override
197
195
  public void run() {
198
196
  showToast("No extra");
199
197
  }
@@ -203,7 +201,6 @@ public class VoiceRecognition extends Activity implements OnClickListener {
203
201
  if (extra.containsKey(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES)) {
204
202
  mHandler.post(new Runnable() {
205
203
 
206
- @Override
207
204
  public void run() {
208
205
  updateSupportedLanguages(extra.getStringArrayList(
209
206
  RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES));
@@ -214,7 +211,6 @@ public class VoiceRecognition extends Activity implements OnClickListener {
214
211
  if (extra.containsKey(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE)) {
215
212
  mHandler.post(new Runnable() {
216
213
 
217
- @Override
218
214
  public void run() {
219
215
  updateLanguagePreference(
220
216
  extra.getString(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE));
@@ -88,7 +88,6 @@ public class FileProvider extends ContentProvider
88
88
  }
89
89
  }
90
90
 
91
- @Override
92
91
  public void writeDataToPipe(ParcelFileDescriptor output, Uri uri, String mimeType,
93
92
  Bundle opts, InputStream args) {
94
93
  // Transfer data from the asset to the pipe the client is reading.
@@ -16,33 +16,31 @@
16
16
 
17
17
  package com.example.android.apis.view;
18
18
 
19
- import com.example.android.apis.R;
19
+ import java.util.ArrayList;
20
+ import java.util.List;
20
21
 
21
22
  import android.app.Activity;
22
23
  import android.content.Context;
23
24
  import android.content.res.Resources;
24
25
  import android.os.Bundle;
25
- import android.util.AttributeSet;
26
26
  import android.util.Log;
27
27
  import android.util.SparseArray;
28
28
  import android.util.SparseIntArray;
29
29
  import android.view.InputDevice;
30
+ import android.view.InputDevice.MotionRange;
30
31
  import android.view.InputEvent;
31
32
  import android.view.KeyEvent;
32
33
  import android.view.LayoutInflater;
33
34
  import android.view.MotionEvent;
34
35
  import android.view.View;
35
36
  import android.view.ViewGroup;
36
- import android.view.InputDevice.MotionRange;
37
37
  import android.widget.AdapterView;
38
38
  import android.widget.BaseAdapter;
39
39
  import android.widget.ListView;
40
40
  import android.widget.TextView;
41
41
  import android.widget.Toast;
42
42
 
43
- import java.util.ArrayList;
44
- import java.util.List;
45
- import java.util.concurrent.atomic.AtomicLong;
43
+ import com.example.android.apis.R;
46
44
 
47
45
 
48
46
  /**
@@ -76,7 +74,6 @@ public class GameControllerInput extends Activity {
76
74
  mSummaryList = (ListView) findViewById(R.id.summary);
77
75
  mSummaryList.setAdapter(mSummaryAdapter);
78
76
  mSummaryList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
79
- @Override
80
77
  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
81
78
  mSummaryAdapter.onItemClick(position);
82
79
  }
@@ -368,22 +365,18 @@ public class GameControllerInput extends Activity {
368
365
  return true;
369
366
  }
370
367
 
371
- @Override
372
368
  public int getCount() {
373
369
  return mVisibleItems.size();
374
370
  }
375
371
 
376
- @Override
377
372
  public Item getItem(int position) {
378
373
  return mVisibleItems.get(position);
379
374
  }
380
375
 
381
- @Override
382
376
  public long getItemId(int position) {
383
377
  return getItem(position).getItemId();
384
378
  }
385
379
 
386
- @Override
387
380
  public View getView(int position, View convertView, ViewGroup parent) {
388
381
  return getItem(position).getView(convertView, parent);
389
382
  }
@@ -16,24 +16,16 @@
16
16
 
17
17
  package com.example.android.apis.view;
18
18
 
19
- import com.example.android.apis.R;
20
-
21
19
  import android.app.Activity;
22
- import android.content.Context;
23
- import android.content.res.Resources;
24
20
  import android.os.Bundle;
25
- import android.util.AttributeSet;
26
- import android.util.Log;
27
- import android.view.LayoutInflater;
28
21
  import android.view.MotionEvent;
29
22
  import android.view.View;
30
23
  import android.view.ViewGroup;
31
24
  import android.widget.CheckBox;
32
25
  import android.widget.CompoundButton;
33
- import android.widget.LinearLayout;
34
26
  import android.widget.TextView;
35
27
 
36
- import java.util.ArrayList;
28
+ import com.example.android.apis.R;
37
29
 
38
30
 
39
31
  /**
@@ -73,7 +65,6 @@ public class Hover extends Activity {
73
65
 
74
66
  View container = findViewById(R.id.container);
75
67
  container.setOnHoverListener(new View.OnHoverListener() {
76
- @Override
77
68
  public boolean onHover(View v, MotionEvent event) {
78
69
  switch (event.getAction()) {
79
70
  case MotionEvent.ACTION_HOVER_ENTER:
@@ -97,7 +88,6 @@ public class Hover extends Activity {
97
88
  });
98
89
 
99
90
  mInterceptCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
100
- @Override
101
91
  public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
102
92
  mInterceptor.setInterceptHover(isChecked);
103
93
  }
@@ -40,7 +40,6 @@ public class Switches extends Activity implements CompoundButton.OnCheckedChange
40
40
  }
41
41
  }
42
42
 
43
- @Override
44
43
  public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
45
44
  Toast.makeText(this, "Monitored switch is " + (isChecked ? "on" : "off"),
46
45
  Toast.LENGTH_SHORT).show();
data/ChangeLog CHANGED
@@ -1,2 +1,12 @@
1
+ === Version 0.2 / 2012-8-14
2
+ * Enhancements
3
+ * Added the enter method to Gametel module to press the enter key on the device
4
+ * Added generated method to clear a text view
5
+ * Added generated method to click a view, button, checkbox or radio by id
6
+ * Added ability to enter and clear text from a text view identified by id
7
+ * Added :list locator that can be used with :index locator to select the target list
8
+ * Renamed the :name locator to :content_description for text so it more accurately reflects what it is doing
9
+ * Added support for determining if a view is enabled / disabled
10
+
1
11
  === Version 0.1 / 2012-7-17
2
12
  Initial release with very basic support for a few controls
data/README.md CHANGED
@@ -22,7 +22,7 @@ Or install it yourself as:
22
22
 
23
23
  ### Defining your screen object
24
24
  ````ruby
25
- class LoginScreen
25
+ class LoginPage
26
26
  include Gametel
27
27
  end
28
28
  ````
@@ -49,6 +49,19 @@ on(LoginPage) do |screen|
49
49
  end
50
50
  ````
51
51
 
52
+ ## Supported Drivers
53
+
54
+ ### Calabash Android
55
+
56
+ Sample `features/support/env.rb` file.
57
+
58
+ ````ruby
59
+ require 'calabash-android/cucumber'
60
+ require 'gametel'
61
+ require 'gametel/navigation'
62
+
63
+ World(Gametel::Navigation)
64
+ ````
52
65
 
53
66
  ## Contributing
54
67
 
data/cucumber.yml CHANGED
@@ -1,6 +1,14 @@
1
1
  <%
2
- std_opts = "PACKAGE_NAME=com.example.android.apis TEST_PACKAGE_NAME=com.example.android.apis.test APP_PATH=/Users/cheezy/dev/gametel/ApiDemos/bin/ApiDemos.apk TEST_APP_PATH=features/support/Test.apk TEST_SERVER_PORT=34777 --no-source --color --format pretty"
2
+ begin
3
+ puts 'Building the calabash test server...'
4
+ last_test_apk = 'test_servers/' << Dir.entries("test_servers").last
5
+ rescue
6
+ `calabash-android build ApiDemos/bin/ApiDemos.apk`
7
+ retry
8
+ end
9
+
10
+ std_opts = "PACKAGE_NAME=com.example.android.apis TEST_PACKAGE_NAME=com.example.android.apis.test APP_PATH=./ApiDemos/bin/ApiDemos.apk TEST_APP_PATH=#{last_test_apk} TEST_SERVER_PORT=34777 --no-source --color --format pretty"
3
11
  %>
4
12
 
5
- default: <%= std_opts %>
13
+ default: <%= std_opts %> --tags ~@ignore
6
14
  focus: <%= std_opts %> --tags @focus
@@ -8,6 +8,11 @@ Feature: Interacting with buttons
8
8
  Given I'm on the buttons screen
9
9
  Then I should be able to click the button by "index"
10
10
 
11
+ Scenario: Should be able to click a button by id
12
+ Given I'm on the buttons screen
13
+ When I click the on/off button by "id"
14
+ Then I should see the text "ON" on the screen
15
+
11
16
  Scenario: Should be able to click a toggle button
12
17
  Given I'm on the buttons screen
13
18
  When I click the on/off button
@@ -7,3 +7,7 @@ Feature: Interacting with checkboxes
7
7
  Scenario: Clicking on a checkbox by text
8
8
  Given I'm on the controls screen
9
9
  Then I should be able to click a checkbox by "text"
10
+
11
+ Scenario: Clicking a checkbox by id
12
+ Given I'm on the controls screen
13
+ Then I should be able to click a checkbox by "id"