aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/google/android/mobly/snippet
diff options
context:
space:
mode:
authorDavid T.H. Kao <dthkao@gmail.com>2017-02-15 12:17:15 -0800
committerGitHub <noreply@github.com>2017-02-15 12:17:15 -0800
commit75c9e61de79b29ab2f38b1a04623a5b4b95cffce (patch)
tree12cd28fbf0560ce6141c74a727703bb4bf106e19 /src/main/java/com/google/android/mobly/snippet
parent99816155feec8667ec76edf15fbb3db1f4aa1401 (diff)
downloadmobly-bundled-snippets-75c9e61de79b29ab2f38b1a04623a5b4b95cffce.tar.gz
Add some simple telephony and audio controls to MBS. (#14)
* Add some simple telephony and audio controls to MBS.
Diffstat (limited to 'src/main/java/com/google/android/mobly/snippet')
-rw-r--r--src/main/java/com/google/android/mobly/snippet/bundled/AccountSnippet.java63
-rw-r--r--src/main/java/com/google/android/mobly/snippet/bundled/AudioSnippet.java98
-rw-r--r--src/main/java/com/google/android/mobly/snippet/bundled/TelephonySnippet.java56
3 files changed, 188 insertions, 29 deletions
diff --git a/src/main/java/com/google/android/mobly/snippet/bundled/AccountSnippet.java b/src/main/java/com/google/android/mobly/snippet/bundled/AccountSnippet.java
index 8e8d56b..375c774 100644
--- a/src/main/java/com/google/android/mobly/snippet/bundled/AccountSnippet.java
+++ b/src/main/java/com/google/android/mobly/snippet/bundled/AccountSnippet.java
@@ -42,7 +42,7 @@ import java.util.TreeSet;
*
* <p>Google (gmail) accounts are of type "com.google" and their handling is managed by the
* operating system. This class allows you to add and remove Google accounts from a device.
- * */
+ */
public class AccountSnippet implements Snippet {
private static final String GOOGLE_ACCOUNT_TYPE = "com.google";
private static final String AUTH_TOKEN_TYPE = "mail";
@@ -66,40 +66,43 @@ public class AccountSnippet implements Snippet {
* Adds a Google account to the device.
*
* <p>TODO(adorokhine): Support adding accounts of other types with an optional 'type' kwarg.
+ *
* <p>TODO(adorokhine): Allow users to choose whether to enable/disable sync with a kwarg.
*
* @param username Username of the account to add (including @gmail.com).
* @param password Password of the account to add.
*/
- @Rpc(description =
- "Add a Google (GMail) account to the device, with account data sync disabled.")
+ @Rpc(
+ description = "Add a Google (GMail) account to the device, with account data sync disabled."
+ )
public void addAccount(String username, String password)
- throws AccountSnippetException, AccountsException, IOException {
+ throws AccountSnippetException, AccountsException, IOException {
// Check for existing account. If we try to re-add an existing account, Android throws an
// exception that says "Account does not exist or not visible. Maybe change pwd?" which is
// a little hard to understand.
if (listAccounts().contains(username)) {
throw new AccountSnippetException(
- "Account " + username + " already exists on the device");
+ "Account " + username + " already exists on the device");
}
Bundle addAccountOptions = new Bundle();
addAccountOptions.putString("username", username);
addAccountOptions.putString("password", password);
AccountManagerFuture<Bundle> future =
- mAccountManager.addAccount(
- GOOGLE_ACCOUNT_TYPE,
- AUTH_TOKEN_TYPE,
- null /* requiredFeatures */,
- addAccountOptions,
- null /* activity */,
- null /* authCallback */,
- null /* handler */);
+ mAccountManager.addAccount(
+ GOOGLE_ACCOUNT_TYPE,
+ AUTH_TOKEN_TYPE,
+ null /* requiredFeatures */,
+ addAccountOptions,
+ null /* activity */,
+ null /* authCallback */,
+ null /* handler */);
Bundle result = future.getResult();
if (result.containsKey(AccountManager.KEY_ERROR_CODE)) {
throw new AccountSnippetException(
- String.format("Failed to add account due to code %d: %s",
- result.getInt(AccountManager.KEY_ERROR_CODE),
- result.getString(AccountManager.KEY_ERROR_MESSAGE)));
+ String.format(
+ "Failed to add account due to code %d: %s",
+ result.getInt(AccountManager.KEY_ERROR_CODE),
+ result.getString(AccountManager.KEY_ERROR_MESSAGE)));
}
// Disable sync to avoid test flakiness as accounts fetch additional data.
@@ -108,19 +111,21 @@ public class AccountSnippet implements Snippet {
// NOTE: this listener is NOT unregistered because several sync requests for the new account
// will come in over time.
Account account = new Account(username, GOOGLE_ACCOUNT_TYPE);
- Object handle = ContentResolver.addStatusChangeListener(
- ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE | ContentResolver.SYNC_OBSERVER_TYPE_PENDING,
- which -> {
- Log.i("Attempt to sync account " + username + " detected! Disabling.");
- for (SyncAdapterType adapter : ContentResolver.getSyncAdapterTypes()) {
- if (!adapter.accountType.equals(GOOGLE_ACCOUNT_TYPE)) {
- continue;
- }
- ContentResolver
- .setSyncAutomatically(account, adapter.authority, false /* sync */);
- ContentResolver.cancelSync(account, adapter.authority);
- }
- });
+ Object handle =
+ ContentResolver.addStatusChangeListener(
+ ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE
+ | ContentResolver.SYNC_OBSERVER_TYPE_PENDING,
+ which -> {
+ Log.i("Attempt to sync account " + username + " detected! Disabling.");
+ for (SyncAdapterType adapter : ContentResolver.getSyncAdapterTypes()) {
+ if (!adapter.accountType.equals(GOOGLE_ACCOUNT_TYPE)) {
+ continue;
+ }
+ ContentResolver.setSyncAutomatically(
+ account, adapter.authority, false /* sync */);
+ ContentResolver.cancelSync(account, adapter.authority);
+ }
+ });
mSyncStatusObserverHandles.add(handle);
}
diff --git a/src/main/java/com/google/android/mobly/snippet/bundled/AudioSnippet.java b/src/main/java/com/google/android/mobly/snippet/bundled/AudioSnippet.java
new file mode 100644
index 0000000..44f2d69
--- /dev/null
+++ b/src/main/java/com/google/android/mobly/snippet/bundled/AudioSnippet.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2017 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.google.android.mobly.snippet.bundled;
+
+import android.content.Context;
+import android.media.AudioManager;
+import android.support.test.InstrumentationRegistry;
+import com.google.android.mobly.snippet.Snippet;
+import com.google.android.mobly.snippet.rpc.Rpc;
+
+/* Snippet class to control audio */
+public class AudioSnippet implements Snippet {
+
+ private final AudioManager mAudioManager;
+
+ public AudioSnippet() {
+ Context context = InstrumentationRegistry.getContext();
+ mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
+ }
+
+ @Rpc(description = "Gets the music stream volume.")
+ public int getMusicVolume() {
+ return mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
+ }
+
+ @Rpc(description = "Gets the maximum music stream volume value.")
+ public int getMusicMaxVolume() {
+ return mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
+ }
+
+ @Rpc(
+ description =
+ "Sets the music stream volume. The minimum value is 0. Use getMusicMaxVolume"
+ + "to determine the maximum."
+ )
+ public void setMusicVolume(Integer value) {
+ mAudioManager.setStreamVolume(
+ AudioManager.STREAM_MUSIC, value, 0 /* flags, 0 = no flags */);
+ }
+
+ @Rpc(description = "Gets the ringer volume.")
+ public int getRingVolume() {
+ return mAudioManager.getStreamVolume(AudioManager.STREAM_RING);
+ }
+
+ @Rpc(description = "Gets the maximum ringer volume value.")
+ public int getRingMaxVolume() {
+ return mAudioManager.getStreamMaxVolume(AudioManager.STREAM_RING);
+ }
+
+ @Rpc(
+ description =
+ "Sets the ringer stream volume. The minimum value is 0. Use getRingMaxVolume"
+ + "to determine the maximum."
+ )
+ public void setRingVolume(Integer value) {
+ mAudioManager.setStreamVolume(AudioManager.STREAM_RING, value, 0 /* flags, 0 = no flags */);
+ }
+
+ @Rpc(description = "Silences all audio streams.")
+ public void muteAll() {
+ // TODO: NUM_STREAMS is deprecated. Find a different solution.
+ for (int i = 0; i < AudioManager.NUM_STREAMS; i++) {
+ mAudioManager.setStreamVolume(i /* audio stream */, 0 /* value */, 0 /* flags */);
+ }
+ }
+
+ @Rpc(
+ description =
+ "Puts the ringer volume at the lowest setting, but does not set it to "
+ + "DO NOT DISTURB; the phone will vibrate when receiving a call."
+ )
+ public void muteRing() {
+ setRingVolume(0);
+ }
+
+ @Rpc(description = "Mute music stream.")
+ public void muteMusic() {
+ setMusicVolume(0);
+ }
+
+ @Override
+ public void shutdown() {}
+}
diff --git a/src/main/java/com/google/android/mobly/snippet/bundled/TelephonySnippet.java b/src/main/java/com/google/android/mobly/snippet/bundled/TelephonySnippet.java
new file mode 100644
index 0000000..431456d
--- /dev/null
+++ b/src/main/java/com/google/android/mobly/snippet/bundled/TelephonySnippet.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2017 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.google.android.mobly.snippet.bundled;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.telephony.TelephonyManager;
+import com.google.android.mobly.snippet.Snippet;
+import com.google.android.mobly.snippet.rpc.Rpc;
+
+/** Snippet class for telephony RPCs. */
+public class TelephonySnippet implements Snippet {
+
+ private final TelephonyManager mTelephonyManager;
+
+ public TelephonySnippet() {
+ Context context = InstrumentationRegistry.getContext();
+ mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+ }
+
+ @Rpc(description = "Gets the line 1 phone number.")
+ public String getLine1Number() {
+ return mTelephonyManager.getLine1Number();
+ }
+
+ @Rpc(description = "Returns the unique subscriber ID, for example, the IMSI for a GSM phone.")
+ public String getSubscriberId() {
+ return mTelephonyManager.getSubscriberId();
+ }
+
+ @Rpc(
+ description =
+ "Gets the call state for the default subscription. Call state values are"
+ + "0: IDLE, 1: RINGING, 2: OFFHOOK"
+ )
+ public int getTelephonyCallState() {
+ return mTelephonyManager.getCallState();
+ }
+
+ @Override
+ public void shutdown() {}
+}