diff options
author | kaiyiz <kaiyiz@codeaurora.org> | 2014-04-18 16:13:11 +0800 |
---|---|---|
committer | Xiaojing Zhang <zhangx@codeaurora.org> | 2014-11-04 20:38:57 -0800 |
commit | df2a284b84ac35837d2b1c5c466b3eef6b7f08e7 (patch) | |
tree | 5cdb6d38fcfa44c9a63a34af94118a605201489b /src/org | |
parent | 9ce50184148460dbae952258e3bf72bab52e3c39 (diff) | |
download | android_packages_apps_Gallery2-df2a284b84ac35837d2b1c5c466b3eef6b7f08e7.tar.gz android_packages_apps_Gallery2-df2a284b84ac35837d2b1c5c466b3eef6b7f08e7.tar.bz2 android_packages_apps_Gallery2-df2a284b84ac35837d2b1c5c466b3eef6b7f08e7.zip |
Gallery2: Add audio output switcher between headset/speaker
There is no audio output switcher between headset/speaker.
Add the audio output switcher button to menu list in order to
let user use this function.
CRs-Fixed: 650867
Change-Id: I16f5fdc74a76ee55557ba87b0145e51165f0408a
Diffstat (limited to 'src/org')
-rwxr-xr-x | src/org/codeaurora/gallery3d/video/ExtensionHelper.java | 32 | ||||
-rw-r--r-- | src/org/codeaurora/gallery3d/video/SpeakerHooker.java | 210 |
2 files changed, 242 insertions, 0 deletions
diff --git a/src/org/codeaurora/gallery3d/video/ExtensionHelper.java b/src/org/codeaurora/gallery3d/video/ExtensionHelper.java index 2ff61a4e5..b5156100b 100755 --- a/src/org/codeaurora/gallery3d/video/ExtensionHelper.java +++ b/src/org/codeaurora/gallery3d/video/ExtensionHelper.java @@ -1,3 +1,31 @@ +/* +Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of The Linux Foundation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ package org.codeaurora.gallery3d.video; import android.content.Context; @@ -20,6 +48,7 @@ public class ExtensionHelper { boolean stereo = context.getResources().getBoolean(R.bool.stereo); boolean streaming = context.getResources().getBoolean(R.bool.streaming); boolean playlist = context.getResources().getBoolean(R.bool.playlist); + boolean speaker = context.getResources().getBoolean(R.bool.speaker); if (loop == true) { group.addHooker(new LoopVideoHooker()); // add it for common feature. @@ -35,6 +64,9 @@ public class ExtensionHelper { group.addHooker(new MovieListHooker()); // add it for common feature. group.addHooker(new StepOptionSettingsHooker()); } + if (speaker == true) { + group.addHooker(new SpeakerHooker()); + } return group; } } diff --git a/src/org/codeaurora/gallery3d/video/SpeakerHooker.java b/src/org/codeaurora/gallery3d/video/SpeakerHooker.java new file mode 100644 index 000000000..9bf534872 --- /dev/null +++ b/src/org/codeaurora/gallery3d/video/SpeakerHooker.java @@ -0,0 +1,210 @@ +/* +Copyright (c) 2014, The Linux Foundation. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of The Linux Foundation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +package org.codeaurora.gallery3d.video; + +import android.view.Menu; +import android.view.MenuItem; +import android.widget.Toast; + +import android.bluetooth.BluetoothClass; +import android.bluetooth.BluetoothDevice; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.media.AudioManager; +import android.media.AudioSystem; +import android.os.Bundle; + +import com.android.gallery3d.R; + +public class SpeakerHooker extends MovieHooker { + + private static final int MENU_SPEAKER = 1; + + private AudioManager mAudioManager; + + private MenuItem mMenuSpeakerButton; + + private boolean mIsHeadsetOn = false; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + initAudioManager(); + } + + private void initAudioManager() { + if (mAudioManager == null) { + mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE); + } + } + + @Override + public void onDestroy() { + turnSpeakerOff(); + super.onDestroy(); + } + + @Override + public void onResume() { + super.onResume(); + registerHeadSetReceiver(); + } + + private void registerHeadSetReceiver() { + final IntentFilter intentFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG); + intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); + intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); + intentFilter.addAction(AudioManager.ACTION_AUDIO_BECOMING_NOISY); + getContext().registerReceiver(mHeadSetReceiver, intentFilter); + } + + @Override + public void onPause() { + unregisterHeadSetReceiver(); + super.onPause(); + } + + private void unregisterHeadSetReceiver() { + try { + getContext().unregisterReceiver(mHeadSetReceiver); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private final BroadcastReceiver mHeadSetReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + final String action = intent.getAction(); + if (mAudioManager == null) { + initAudioManager(); + } + if (action.equals(Intent.ACTION_HEADSET_PLUG)) { + mIsHeadsetOn = (intent.getIntExtra("state", 0) == 1) + || mAudioManager.isBluetoothA2dpOn(); + } else if (action.equals(BluetoothDevice.ACTION_ACL_CONNECTED) + || action.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED)) { + final int deviceClass = ((BluetoothDevice) + intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)) + .getBluetoothClass().getDeviceClass(); + if ((deviceClass == BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES) + || (deviceClass == BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET)) { + mIsHeadsetOn = action.equals(BluetoothDevice.ACTION_ACL_CONNECTED) + || mAudioManager.isWiredHeadsetOn(); + } + } else if (action.equals(AudioManager.ACTION_AUDIO_BECOMING_NOISY)) { + mIsHeadsetOn = false; + } + updateSpeakerButton(); + if (!mIsHeadsetOn) { + turnSpeakerOff(); + } + } + }; + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + super.onCreateOptionsMenu(menu); + mMenuSpeakerButton = menu.add(0, getMenuActivityId(MENU_SPEAKER), 0, R.string.speaker_on); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + super.onOptionsItemSelected(item); + switch (getMenuOriginalId(item.getItemId())) { + case MENU_SPEAKER: + changeSpeakerState(); + return true; + default: + return false; + } + } + + private void changeSpeakerState() { + if (isSpeakerOn()) { + turnSpeakerOff(); + } else { + if (mIsHeadsetOn) { + turnSpeakerOn(); + } else { + Toast.makeText(getContext(), getContext().getString(R.string.speaker_need_headset), + Toast.LENGTH_SHORT).show(); + } + } + updateSpeakerButton(); + } + + private void turnSpeakerOn() { + if (mAudioManager == null) { + initAudioManager(); + } + mAudioManager.setSpeakerphoneOn(true); + AudioSystem.setForceUse(AudioSystem.FOR_MEDIA, + AudioSystem.FORCE_SPEAKER); + } + + private void turnSpeakerOff() { + if (mAudioManager == null) { + initAudioManager(); + } + AudioSystem.setForceUse(AudioSystem.FOR_MEDIA, + AudioSystem.FORCE_NONE); + mAudioManager.setSpeakerphoneOn(false); + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + super.onPrepareOptionsMenu(menu); + updateSpeakerButton(); + return true; + } + + private void updateSpeakerButton() { + if (mMenuSpeakerButton != null) { + if (isSpeakerOn()) { + mMenuSpeakerButton.setTitle(R.string.speaker_off); + } else { + mMenuSpeakerButton.setTitle(R.string.speaker_on); + } + } + } + + private boolean isSpeakerOn() { + boolean isSpeakerOn = false; + if (mAudioManager == null) { + initAudioManager(); + } + isSpeakerOn = mAudioManager.isSpeakerphoneOn(); + return isSpeakerOn; + } + +} |