1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.example.android.midisynth; 18 19 import android.content.pm.PackageManager; 20 import android.media.midi.MidiDevice.MidiConnection; 21 import android.media.midi.MidiDeviceInfo; 22 import android.media.midi.MidiManager; 23 import android.os.Bundle; 24 import android.support.v7.app.ActionBar; 25 import android.support.v7.app.AppCompatActivity; 26 import android.support.v7.widget.Toolbar; 27 import android.view.Menu; 28 import android.view.MenuItem; 29 import android.view.WindowManager; 30 import android.widget.Toast; 31 32 import com.example.android.common.midi.MidiOutputPortConnectionSelector; 33 import com.example.android.common.midi.MidiPortConnector; 34 import com.example.android.common.midi.MidiTools; 35 36 /** 37 * Simple synthesizer as a MIDI Device. 38 */ 39 public class MainActivity extends AppCompatActivity { 40 41 private MidiOutputPortConnectionSelector mPortSelector; 42 43 @Override 44 public void onCreate(Bundle savedInstanceState) { 45 super.onCreate(savedInstanceState); 46 setContentView(R.layout.main); 47 setSupportActionBar((Toolbar) findViewById(R.id.toolbar)); 48 ActionBar actionBar = getSupportActionBar(); 49 if (actionBar != null) { 50 actionBar.setDisplayShowTitleEnabled(false); 51 } 52 53 if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI)) { 54 setupMidi(); 55 } 56 } 57 58 @Override 59 public boolean onCreateOptionsMenu(Menu menu) { 60 getMenuInflater().inflate(R.menu.main, menu); 61 setKeepScreenOn(menu.findItem(R.id.action_keep_screen_on).isChecked()); 62 return true; 63 } 64 65 @Override 66 public boolean onOptionsItemSelected(MenuItem item) { 67 switch (item.getItemId()) { 68 case R.id.action_keep_screen_on: 69 boolean checked = !item.isChecked(); 70 setKeepScreenOn(checked); 71 item.setChecked(checked); 72 break; 73 } 74 return super.onOptionsItemSelected(item); 75 } 76 77 private void setKeepScreenOn(boolean keepScreenOn) { 78 if (keepScreenOn) { 79 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 80 } else { 81 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 82 } 83 } 84 85 private void setupMidi() { 86 // Setup MIDI 87 MidiManager midiManager = (MidiManager) getSystemService(MIDI_SERVICE); 88 89 MidiDeviceInfo synthInfo = MidiTools.findDevice(midiManager, "AndroidTest", 90 "SynthExample"); 91 int portIndex = 0; 92 mPortSelector = new MidiOutputPortConnectionSelector(midiManager, this, 93 R.id.spinner_synth_sender, synthInfo, portIndex); 94 mPortSelector.setConnectedListener(new MyPortsConnectedListener()); 95 } 96 97 private void closeSynthResources() { 98 if (mPortSelector != null) { 99 mPortSelector.close(); 100 } 101 } 102 103 // TODO A better way would be to listen to the synth server 104 // for open/close events and then disable/enable the spinner. 105 private class MyPortsConnectedListener 106 implements MidiPortConnector.OnPortsConnectedListener { 107 @Override 108 public void onPortsConnected(final MidiConnection connection) { 109 runOnUiThread(new Runnable() { 110 @Override 111 public void run() { 112 if (connection == null) { 113 Toast.makeText(MainActivity.this, 114 R.string.error_port_busy, Toast.LENGTH_SHORT) 115 .show(); 116 mPortSelector.clearSelection(); 117 } else { 118 Toast.makeText(MainActivity.this, 119 R.string.port_open_ok, Toast.LENGTH_SHORT) 120 .show(); 121 } 122 } 123 }); 124 } 125 } 126 127 @Override 128 public void onDestroy() { 129 closeSynthResources(); 130 super.onDestroy(); 131 } 132 133 } 134