diff options
Diffstat (limited to 'media/MidiScope/Application/src/main/java/com/example/android/midiscope/MainActivity.java')
-rw-r--r-- | media/MidiScope/Application/src/main/java/com/example/android/midiscope/MainActivity.java | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/media/MidiScope/Application/src/main/java/com/example/android/midiscope/MainActivity.java b/media/MidiScope/Application/src/main/java/com/example/android/midiscope/MainActivity.java new file mode 100644 index 00000000..41d74f03 --- /dev/null +++ b/media/MidiScope/Application/src/main/java/com/example/android/midiscope/MainActivity.java @@ -0,0 +1,162 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * 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.example.android.midiscope; + +import android.app.ActionBar; +import android.app.Activity; +import android.media.midi.MidiDeviceInfo; +import android.media.midi.MidiManager; +import android.media.midi.MidiReceiver; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.WindowManager; +import android.widget.ScrollView; +import android.widget.TextView; +import android.widget.Toolbar; + +import com.example.android.common.midi.MidiFramer; +import com.example.android.common.midi.MidiOutputPortSelector; +import com.example.android.common.midi.MidiPortWrapper; + +import java.util.LinkedList; + +/** + * App that provides a MIDI echo service. + */ +public class MainActivity extends Activity implements ScopeLogger { + + private static final int MAX_LINES = 100; + + private final LinkedList<String> mLogLines = new LinkedList<>(); + private TextView mLog; + private ScrollView mScroller; + private MidiOutputPortSelector mLogSenderSelector; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.main); + + setActionBar((Toolbar) findViewById(R.id.toolbar)); + ActionBar actionBar = getActionBar(); + if (actionBar != null) { + actionBar.setDisplayShowTitleEnabled(false); + } + + mLog = (TextView) findViewById(R.id.log); + mScroller = (ScrollView) findViewById(R.id.scroll); + + // Setup MIDI + MidiManager midiManager = (MidiManager) getSystemService(MIDI_SERVICE); + + // Receiver that prints the messages. + MidiReceiver loggingReceiver = new LoggingReceiver(this); + + // Receiver that parses raw data into complete messages. + MidiFramer connectFramer = new MidiFramer(loggingReceiver); + + // Setup a menu to select an input source. + mLogSenderSelector = new MidiOutputPortSelector(midiManager, this, R.id.spinner_senders) { + @Override + public void onPortSelected(final MidiPortWrapper wrapper) { + super.onPortSelected(wrapper); + if (wrapper != null) { + mLogLines.clear(); + MidiDeviceInfo deviceInfo = wrapper.getDeviceInfo(); + if (deviceInfo == null) { + log(getString(R.string.header_text)); + } else { + log(MidiPrinter.formatDeviceInfo(deviceInfo)); + } + } + } + }; + mLogSenderSelector.getSender().connect(connectFramer); + + // Tell the virtual device to log its messages here.. + MidiScope.setScopeLogger(this); + } + + @Override + public void onDestroy() { + mLogSenderSelector.onClose(); + // The scope will live on as a service so we need to tell it to stop + // writing log messages to this Activity. + MidiScope.setScopeLogger(null); + super.onDestroy(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.main, menu); + setKeepScreenOn(menu.findItem(R.id.action_keep_screen_on).isChecked()); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_clear_all: + mLogLines.clear(); + logOnUiThread(""); + break; + case R.id.action_keep_screen_on: + boolean checked = !item.isChecked(); + setKeepScreenOn(checked); + item.setChecked(checked); + break; + } + return super.onOptionsItemSelected(item); + } + + private void setKeepScreenOn(boolean keepScreenOn) { + if (keepScreenOn) { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } else { + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } + } + + @Override + public void log(final String string) { + runOnUiThread(new Runnable() { + @Override + public void run() { + logOnUiThread(string); + } + }); + } + + /** + * Logs a message to our TextView. This needs to be called from the UI thread. + */ + private void logOnUiThread(String s) { + mLogLines.add(s); + if (mLogLines.size() > MAX_LINES) { + mLogLines.removeFirst(); + } + // Render line buffer to one String. + StringBuilder sb = new StringBuilder(); + for (String line : mLogLines) { + sb.append(line).append('\n'); + } + mLog.setText(sb.toString()); + mScroller.fullScroll(View.FOCUS_DOWN); + } +} |