Path: blob/v3_openjdk/app_pojavlauncher/src/main/java/com/kdt/LoggerView.java
2129 views
package com.kdt;12import android.content.Context;3import android.graphics.Typeface;4import android.util.AttributeSet;5import android.view.View;6import android.widget.ImageButton;7import android.widget.TextView;8import android.widget.ToggleButton;910import androidx.annotation.NonNull;11import androidx.annotation.Nullable;12import androidx.constraintlayout.widget.ConstraintLayout;1314import net.kdt.pojavlaunch.Logger;15import net.kdt.pojavlaunch.R;1617/**18* A class able to display logs to the user.19* It has support for the Logger class20*/21public class LoggerView extends ConstraintLayout {22private Logger.eventLogListener mLogListener;23private ToggleButton mLogToggle;24private DefocusableScrollView mScrollView;25private TextView mLogTextView;262728public LoggerView(@NonNull Context context) {29this(context, null);30}3132public LoggerView(@NonNull Context context, @Nullable AttributeSet attrs) {33super(context, attrs);34init();35}3637@Override38public void setVisibility(int visibility) {39super.setVisibility(visibility);40// Triggers the log view shown state by default when viewing it41mLogToggle.setChecked(visibility == VISIBLE);42}4344/**45* Inflate the layout, and add component behaviors46*/47private void init(){48inflate(getContext(), R.layout.view_logger, this);49mLogTextView = findViewById(R.id.content_log_view);50mLogTextView.setTypeface(Typeface.MONOSPACE);51//TODO clamp the max text so it doesn't go oob52mLogTextView.setMaxLines(Integer.MAX_VALUE);53mLogTextView.setEllipsize(null);54mLogTextView.setVisibility(GONE);5556// Toggle log visibility57mLogToggle = findViewById(R.id.content_log_toggle_log);58mLogToggle.setOnCheckedChangeListener(59(compoundButton, isChecked) -> {60mLogTextView.setVisibility(isChecked ? VISIBLE : GONE);61if(isChecked) {62Logger.setLogListener(mLogListener);63}else{64mLogTextView.setText("");65Logger.setLogListener(null); // Makes the JNI code be able to skip expensive logger callbacks66// NOTE: was tested by rapidly smashing the log on/off button, no sync issues found :)67}68});69mLogToggle.setChecked(false);7071// Remove the loggerView from the user View72ImageButton cancelButton = findViewById(R.id.log_view_cancel);73cancelButton.setOnClickListener(view -> LoggerView.this.setVisibility(GONE));7475// Set the scroll view76mScrollView = findViewById(R.id.content_log_scroll);77mScrollView.setKeepFocusing(true);7879//Set up the autoscroll switch80ToggleButton autoscrollToggle = findViewById(R.id.content_log_toggle_autoscroll);81autoscrollToggle.setOnCheckedChangeListener(82(compoundButton, isChecked) -> {83if(isChecked) mScrollView.fullScroll(View.FOCUS_DOWN);84mScrollView.setKeepFocusing(isChecked);85}86);87autoscrollToggle.setChecked(true);8889// Listen to logs90mLogListener = text -> {91if(mLogTextView.getVisibility() != VISIBLE) return;92post(() -> {93mLogTextView.append(text + '\n');94if(mScrollView.isKeepFocusing()) mScrollView.fullScroll(View.FOCUS_DOWN);95});9697};98}99100}101102103