• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 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 org.chromium.latency.walt;
18 
19 import android.content.BroadcastReceiver;
20 import android.content.Context;
21 import android.content.Intent;
22 import android.os.Bundle;
23 import android.text.method.ScrollingMovementMethod;
24 import android.view.LayoutInflater;
25 import android.view.View;
26 import android.view.ViewGroup;
27 import android.widget.TextView;
28 
29 import androidx.fragment.app.Fragment;
30 
31 import java.util.Locale;
32 
33 public class MidiFragment extends Fragment
34         implements View.OnClickListener, BaseTest.TestStateListener {
35 
36     private SimpleLogger logger;
37     private TextView textView;
38     private View startMidiInButton;
39     private View startMidiOutButton;
40     private HistogramChart latencyChart;
41     private MidiTest midiTest;
42 
MidiFragment()43     public MidiFragment() {
44         // Required empty public constructor
45     }
46 
47     @Override
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)48     public View onCreateView(LayoutInflater inflater, ViewGroup container,
49                              Bundle savedInstanceState) {
50         logger = SimpleLogger.getInstance(getContext());
51         midiTest = new MidiTest(getActivity());
52         midiTest.setTestStateListener(this);
53 
54         final View view = inflater.inflate(R.layout.fragment_midi, container, false);
55         textView = (TextView) view.findViewById(R.id.txt_box_midi);
56         startMidiInButton = view.findViewById(R.id.button_start_midi_in);
57         startMidiOutButton = view.findViewById(R.id.button_start_midi_out);
58         latencyChart = (HistogramChart) view.findViewById(R.id.latency_chart);
59         textView.setMovementMethod(new ScrollingMovementMethod());
60         return view;
61     }
62 
63     @Override
onResume()64     public void onResume() {
65         super.onResume();
66 
67         // Register this fragment class as the listener for some button clicks
68         startMidiInButton.setOnClickListener(this);
69         startMidiOutButton.setOnClickListener(this);
70 
71         textView.setText(logger.getLogText());
72         logger.registerReceiver(logReceiver);
73     }
74 
75     @Override
onPause()76     public void onPause() {
77         logger.unregisterReceiver(logReceiver);
78         super.onPause();
79     }
80 
81     @Override
onClick(View v)82     public void onClick(View v) {
83         switch (v.getId()) {
84             case R.id.button_start_midi_in:
85                 disableButtons();
86                 latencyChart.setVisibility(View.VISIBLE);
87                 latencyChart.clearData();
88                 latencyChart.setLegendEnabled(false);
89                 latencyChart.getBarChart().getDescription().setText("MIDI Input Latency [ms]");
90                 midiTest.testMidiIn();
91                 break;
92             case R.id.button_start_midi_out:
93                 disableButtons();
94                 latencyChart.setVisibility(View.VISIBLE);
95                 latencyChart.clearData();
96                 latencyChart.setLegendEnabled(false);
97                 latencyChart.getBarChart().getDescription().setText("MIDI Output Latency [ms]");
98                 midiTest.testMidiOut();
99                 break;
100         }
101     }
102 
disableButtons()103     private void disableButtons() {
104         startMidiInButton.setEnabled(false);
105         startMidiOutButton.setEnabled(false);
106     }
107 
108     private BroadcastReceiver logReceiver = new BroadcastReceiver() {
109         @Override
110         public void onReceive(Context context, Intent intent) {
111             String msg = intent.getStringExtra("message");
112             textView.append(msg + "\n");
113         }
114     };
115 
116     @Override
onTestStopped()117     public void onTestStopped() {
118         if (!midiTest.deltasOutputTotal.isEmpty()) {
119             latencyChart.setLegendEnabled(true);
120             latencyChart.setLabel(String.format(
121                     Locale.US, "Median=%.1f ms", Utils.median(midiTest.deltasOutputTotal)));
122         } else if (!midiTest.deltasInputTotal.isEmpty()) {
123             latencyChart.setLegendEnabled(true);
124             latencyChart.setLabel(String.format(
125                     Locale.US, "Median=%.1f ms", Utils.median(midiTest.deltasInputTotal)));
126         }
127         LogUploader.uploadIfAutoEnabled(getContext());
128         startMidiInButton.setEnabled(true);
129         startMidiOutButton.setEnabled(true);
130     }
131 
132     @Override
onTestStoppedWithError()133     public void onTestStoppedWithError() {
134         onTestStopped();
135         latencyChart.setVisibility(View.GONE);
136     }
137 
138     @Override
onTestPartialResult(double value)139     public void onTestPartialResult(double value) {
140         latencyChart.addEntry(value);
141     }
142 
hasMidi(Context context)143     public static boolean hasMidi(Context context) {
144         return context.getPackageManager().
145                 hasSystemFeature("android.software.midi");
146     }
147 }
148