diff options
author | David T.H. Kao <dthkao@gmail.com> | 2017-02-15 12:17:15 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-02-15 12:17:15 -0800 |
commit | 75c9e61de79b29ab2f38b1a04623a5b4b95cffce (patch) | |
tree | 12cd28fbf0560ce6141c74a727703bb4bf106e19 /src/main/java/com/google/android/mobly/snippet | |
parent | 99816155feec8667ec76edf15fbb3db1f4aa1401 (diff) | |
download | mobly-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')
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() {} +} |