From 45d92e9fa5a8f5f0be9eddb81d1bdc4ada1ba1df Mon Sep 17 00:00:00 2001 From: James Power Date: Tue, 10 Mar 2026 16:49:39 -0400 Subject: [PATCH 1/8] Migrate 7 dialog editors from Java/XML to Kotlin/Compose. --- .../bt/launcher/NewConnectionDialog.java | 128 ---- .../bt/launcher/NewConnectionDialog.kt | 118 ++++ .../bt/responder/ack/AckResponderEditor.java | 73 --- .../bt/responder/ack/AckResponderEditor.kt | 82 +++ .../responder/gag/GagActionEditorDialog.java | 92 --- .../bt/responder/gag/GagActionEditorDialog.kt | 108 ++++ .../NotificationResponderEditor.java | 594 ------------------ .../NotificationResponderEditor.kt | 372 +++++++++++ .../replace/ReplaceActionEditorDialog.java | 79 --- .../replace/ReplaceActionEditorDialog.kt | 87 +++ .../script/ScriptResponderEditor.java | 74 --- .../responder/script/ScriptResponderEditor.kt | 82 +++ .../responder/toast/ToastResponderEditor.java | 98 --- .../responder/toast/ToastResponderEditor.kt | 100 +++ .../offsetnull/bt/ui/EditorDialogScaffold.kt | 53 ++ 15 files changed, 1002 insertions(+), 1138 deletions(-) delete mode 100644 BTLib/src/com/offsetnull/bt/launcher/NewConnectionDialog.java create mode 100644 BTLib/src/com/offsetnull/bt/launcher/NewConnectionDialog.kt delete mode 100644 BTLib/src/com/offsetnull/bt/responder/ack/AckResponderEditor.java create mode 100644 BTLib/src/com/offsetnull/bt/responder/ack/AckResponderEditor.kt delete mode 100644 BTLib/src/com/offsetnull/bt/responder/gag/GagActionEditorDialog.java create mode 100644 BTLib/src/com/offsetnull/bt/responder/gag/GagActionEditorDialog.kt delete mode 100644 BTLib/src/com/offsetnull/bt/responder/notification/NotificationResponderEditor.java create mode 100644 BTLib/src/com/offsetnull/bt/responder/notification/NotificationResponderEditor.kt delete mode 100644 BTLib/src/com/offsetnull/bt/responder/replace/ReplaceActionEditorDialog.java create mode 100644 BTLib/src/com/offsetnull/bt/responder/replace/ReplaceActionEditorDialog.kt delete mode 100644 BTLib/src/com/offsetnull/bt/responder/script/ScriptResponderEditor.java create mode 100644 BTLib/src/com/offsetnull/bt/responder/script/ScriptResponderEditor.kt delete mode 100644 BTLib/src/com/offsetnull/bt/responder/toast/ToastResponderEditor.java create mode 100644 BTLib/src/com/offsetnull/bt/responder/toast/ToastResponderEditor.kt create mode 100644 BTLib/src/com/offsetnull/bt/ui/EditorDialogScaffold.kt diff --git a/BTLib/src/com/offsetnull/bt/launcher/NewConnectionDialog.java b/BTLib/src/com/offsetnull/bt/launcher/NewConnectionDialog.java deleted file mode 100644 index f28284f7..00000000 --- a/BTLib/src/com/offsetnull/bt/launcher/NewConnectionDialog.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.offsetnull.bt.launcher; - -import android.annotation.SuppressLint; -import android.app.Dialog; - -import android.content.Context; -import android.os.Bundle; -import android.view.View; -import android.view.Window; -import android.widget.Button; -import android.widget.EditText; - -import com.offsetnull.bt.R; -import com.offsetnull.bt.validator.Validator; - - -public class NewConnectionDialog extends Dialog { - - ReadyListener reportto = null; - - String m_display; - String m_host; - int m_port; - - MudConnection m_prev; - - boolean isEditor = false; - - public NewConnectionDialog(Context context,ReadyListener useme) { - super(context); - - reportto = useme; - isEditor = false; - } - - public NewConnectionDialog(Context context,ReadyListener useme,MudConnection old) { - super(context); - - reportto = useme; - m_display = old.getDisplayName(); - m_host = old.getHostName(); - m_port = Integer.parseInt(old.getPortString()); - - - - isEditor = true; - m_prev = old; - } - - @SuppressLint("SetTextI18n") - @Override - public void onCreate(Bundle settings) { - - this.getWindow().requestFeature(Window.FEATURE_NO_TITLE); - this.getWindow().setBackgroundDrawableResource(R.drawable.dialog_window_crawler1); - super.onCreate(settings); - - setContentView(R.layout.newconnectiondialog); - - this.setTitle("Connection Properties:"); - - Button ok = (Button)findViewById(R.id.acceptbutton); - Button cancel = (Button)findViewById(R.id.cancelbutton); - - ok.setOnClickListener(new OKListener()); - cancel.setOnClickListener(new CANCELListener()); - - if(isEditor) { - EditText disp_input = (EditText)findViewById(R.id.dispinput); - EditText host_input = (EditText)findViewById(R.id.hostinput); - EditText port_input = (EditText)findViewById(R.id.portinput); - - disp_input.setText(m_display); - host_input.setText(m_host); - port_input.setText(Integer.toString(m_port)); - } - } - - private class OKListener implements View.OnClickListener { - public void onClick(View v) { - - EditText disp = (EditText)findViewById(R.id.dispinput); - EditText host = (EditText)findViewById(R.id.hostinput); - EditText port = (EditText)findViewById(R.id.portinput); - - - Validator checker = new Validator(); - checker.add(disp, Validator.VALIDATE_NOT_BLANK, "Display Name"); - checker.add(host, Validator.VALIDATE_NOT_BLANK, "Host name"); - checker.add(host, Validator.VALIDATE_HOSTNAME, "Host name"); - checker.add(port, Validator.VALIDATE_NOT_BLANK, "Port number"); - checker.add(port, Validator.VALIDATE_NUMBER, "Port number"); - checker.add(port, Validator.VALIDATE_PORT_NUMBER, "Port number"); - - String result = checker.validate(); - if(result != null) { - checker.showMessage(NewConnectionDialog.this.getContext(), result); - - return; - } - //String dispstr = disp.getText().toStri; - - if(isEditor) { - MudConnection m = m_prev.copy(); - m.setDisplayName(disp.getText().toString()); - m.setHostName(host.getText().toString()); - m.setPortString(port.getText().toString()); - - reportto.modify(m_prev,m); - } else { - MudConnection m = new MudConnection(); - m.setDisplayName(disp.getText().toString()); - m.setHostName(host.getText().toString()); - m.setPortString(port.getText().toString()); - reportto.ready(m); - } - - NewConnectionDialog.this.dismiss(); - } - } - - private class CANCELListener implements View.OnClickListener { - public void onClick(View v) { - NewConnectionDialog.this.dismiss(); - } - } - -} diff --git a/BTLib/src/com/offsetnull/bt/launcher/NewConnectionDialog.kt b/BTLib/src/com/offsetnull/bt/launcher/NewConnectionDialog.kt new file mode 100644 index 00000000..204abd65 --- /dev/null +++ b/BTLib/src/com/offsetnull/bt/launcher/NewConnectionDialog.kt @@ -0,0 +1,118 @@ +package com.offsetnull.bt.launcher + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import android.view.ViewGroup +import android.view.Window +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.text.input.KeyboardType +import com.offsetnull.bt.R +import com.offsetnull.bt.ui.EditorDialogScaffold + +class NewConnectionDialog : Dialog { + + private val reportTo: ReadyListener + private val prev: MudConnection? + + constructor(context: Context, useme: ReadyListener) : super(context) { + reportTo = useme + prev = null + } + + constructor(context: Context, useme: ReadyListener, old: MudConnection) : super(context) { + reportTo = useme + prev = old + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + window?.requestFeature(Window.FEATURE_NO_TITLE) + window?.setBackgroundDrawableResource(R.drawable.dialog_window_crawler1) + + val composeView = ComposeView(context).apply { + setContent { + NewConnectionContent( + initialDisplay = prev?.displayName ?: "", + initialHost = prev?.hostName ?: "", + initialPort = if (prev != null) prev.portString else "", + onSave = { display, host, port -> doSave(display, host, port) }, + onCancel = { dismiss() } + ) + } + } + setContentView(composeView, ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + )) + } + + private fun doSave(display: String, host: String, port: String) { + if (display.isBlank() || host.isBlank() || port.isBlank()) return + port.toIntOrNull() ?: return + + if (prev != null) { + val m = prev.copy() + m.displayName = display + m.hostName = host + m.portString = port + reportTo.modify(prev, m) + } else { + val m = MudConnection() + m.displayName = display + m.hostName = host + m.portString = port + reportTo.ready(m) + } + dismiss() + } +} + +@Composable +private fun NewConnectionContent( + initialDisplay: String, + initialHost: String, + initialPort: String, + onSave: (String, String, String) -> Unit, + onCancel: () -> Unit +) { + var display by remember { mutableStateOf(initialDisplay) } + var host by remember { mutableStateOf(initialHost) } + var port by remember { mutableStateOf(initialPort) } + + EditorDialogScaffold( + title = "Connection Properties", + onSave = { onSave(display, host, port) }, + onCancel = onCancel + ) { + OutlinedTextField( + value = display, + onValueChange = { display = it }, + label = { Text("Display Name") }, + modifier = Modifier.fillMaxWidth() + ) + OutlinedTextField( + value = host, + onValueChange = { host = it }, + label = { Text("Host") }, + modifier = Modifier.fillMaxWidth() + ) + OutlinedTextField( + value = port, + onValueChange = { port = it }, + label = { Text("Port") }, + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), + modifier = Modifier.fillMaxWidth() + ) + } +} diff --git a/BTLib/src/com/offsetnull/bt/responder/ack/AckResponderEditor.java b/BTLib/src/com/offsetnull/bt/responder/ack/AckResponderEditor.java deleted file mode 100644 index d2307170..00000000 --- a/BTLib/src/com/offsetnull/bt/responder/ack/AckResponderEditor.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.offsetnull.bt.responder.ack; - -import com.offsetnull.bt.R; -import com.offsetnull.bt.responder.TriggerResponderEditorDoneListener; - -import android.app.Dialog; -import android.content.Context; -import android.os.Bundle; -import android.view.View; -import android.view.Window; -import android.widget.Button; -import android.widget.EditText; - -public class AckResponderEditor extends Dialog { - - private AckResponder the_responder; - private AckResponder original; - - private TriggerResponderEditorDoneListener finish_with; - - private boolean isEditor = false; - - public AckResponderEditor(Context context,AckResponder input,TriggerResponderEditorDoneListener listener) { - super(context); - finish_with = listener; - if(input == null) { - the_responder = new AckResponder(); - } else { - the_responder = input.copy(); - original = input.copy(); - isEditor = true; - } - - } - - public void onCreate(Bundle b) { - this.getWindow().requestFeature(Window.FEATURE_NO_TITLE); - this.getWindow().setBackgroundDrawableResource(R.drawable.dialog_window_crawler1); - setContentView(R.layout.responder_ack_dialog); - - EditText ackwith = (EditText)findViewById(R.id.responder_ack_ackwith); - ackwith.setText(the_responder.getAckWith()); - - Button done = (Button)findViewById(R.id.responder_ack_done_button); - done.setOnClickListener(new DoneListener()); - - Button cancel = (Button)findViewById(R.id.responder_ack_cancel); - cancel.setOnClickListener(new View.OnClickListener() { - - public void onClick(View arg0) { - AckResponderEditor.this.dismiss(); - } - }); - - } - - private class DoneListener implements View.OnClickListener { - - public void onClick(View arg0) { - EditText ackwith = (EditText)findViewById(R.id.responder_ack_ackwith); - //ackwith.setText(the_responder.getAckWith()); - the_responder.setAckWith(ackwith.getText().toString()); - if(isEditor) { - finish_with.editTriggerResponder(the_responder, original); - } else { - finish_with.newTriggerResponder(the_responder); - } - AckResponderEditor.this.dismiss(); - } - - }; - -} diff --git a/BTLib/src/com/offsetnull/bt/responder/ack/AckResponderEditor.kt b/BTLib/src/com/offsetnull/bt/responder/ack/AckResponderEditor.kt new file mode 100644 index 00000000..2de034e9 --- /dev/null +++ b/BTLib/src/com/offsetnull/bt/responder/ack/AckResponderEditor.kt @@ -0,0 +1,82 @@ +package com.offsetnull.bt.responder.ack + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import android.view.ViewGroup +import android.view.Window +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.ComposeView +import com.offsetnull.bt.R +import com.offsetnull.bt.responder.TriggerResponderEditorDoneListener +import com.offsetnull.bt.ui.EditorDialogScaffold + +class AckResponderEditor( + context: Context, + input: AckResponder?, + private val finishWith: TriggerResponderEditorDoneListener +) : Dialog(context) { + + private val original: AckResponder? = input?.copy() + private val responder: AckResponder = input?.copy() ?: AckResponder() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + window?.requestFeature(Window.FEATURE_NO_TITLE) + window?.setBackgroundDrawableResource(R.drawable.dialog_window_crawler1) + + val composeView = ComposeView(context).apply { + setContent { + AckEditorContent( + initialAckWith = responder.ackWith ?: "", + onDone = { ackWith -> doExit(ackWith) }, + onCancel = { dismiss() } + ) + } + } + setContentView(composeView, ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + )) + } + + private fun doExit(ackWith: String) { + responder.ackWith = ackWith + if (original != null) { + finishWith.editTriggerResponder(responder, original) + } else { + finishWith.newTriggerResponder(responder) + } + dismiss() + } +} + +@Composable +private fun AckEditorContent( + initialAckWith: String, + onDone: (String) -> Unit, + onCancel: () -> Unit +) { + var ackWith by remember { mutableStateOf(initialAckWith) } + + EditorDialogScaffold( + title = "Ack With Responder", + onSave = { onDone(ackWith) }, + onCancel = onCancel + ) { + OutlinedTextField( + value = ackWith, + onValueChange = { ackWith = it }, + label = { Text("Send this command") }, + modifier = Modifier.fillMaxWidth() + ) + } +} diff --git a/BTLib/src/com/offsetnull/bt/responder/gag/GagActionEditorDialog.java b/BTLib/src/com/offsetnull/bt/responder/gag/GagActionEditorDialog.java deleted file mode 100644 index f44e89bb..00000000 --- a/BTLib/src/com/offsetnull/bt/responder/gag/GagActionEditorDialog.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.offsetnull.bt.responder.gag; - -import com.offsetnull.bt.R; -import com.offsetnull.bt.responder.TriggerResponder; -import com.offsetnull.bt.responder.TriggerResponderEditorDoneListener; - -import android.app.Dialog; -import android.content.Context; -import android.os.Bundle; -import android.view.View; -import android.view.Window; -import android.widget.CheckBox; -import android.widget.TextView; - -public class GagActionEditorDialog extends Dialog { - TriggerResponder original; - private TriggerResponderEditorDoneListener finish_with; - - int startVal; - - CheckBox output; - CheckBox log; - - TextView retarget; - - public GagActionEditorDialog(Context context,TriggerResponder original,TriggerResponderEditorDoneListener listener) { - super(context); - - this.original = original; - finish_with = listener; - - //if(original != null) { - // startVal - //} - // TODO Auto-generated constructor stub - } - - @Override - public void onCreate(Bundle b) { - - this.getWindow().requestFeature(Window.FEATURE_NO_TITLE); - this.getWindow().setBackgroundDrawableResource(R.drawable.dialog_window_crawler1); - - this.setContentView(R.layout.responder_gag_dialog); - - output = (CheckBox) this.findViewById(R.id.gag_output); - log = (CheckBox)this.findViewById(R.id.gag_log); - - retarget = (TextView)this.findViewById(R.id.retarget_text); - - if(original != null) { - output.setChecked(((GagAction)original).isGagOutput()); - log.setChecked(((GagAction)original).isGagLog()); - retarget.setText(((GagAction)original).getRetarget()); - - } else { - output.setChecked(true); - log.setChecked(true); - } - - findViewById(R.id.done).setOnClickListener(new View.OnClickListener() { - - @Override - public void onClick(View v) { - if(original != null) { - GagAction edited = new GagAction(); - edited.setGagLog(log.isChecked()); - edited.setGagOutput(output.isChecked()); - edited.setRetarget(retarget.getText().toString()); - finish_with.editTriggerResponder(edited, original); - } else { - GagAction tmp = new GagAction(); - tmp.setGagLog(log.isChecked()); - tmp.setGagOutput(output.isChecked()); - tmp.setRetarget(retarget.getText().toString()); - finish_with.newTriggerResponder(tmp); - } - - GagActionEditorDialog.this.dismiss(); - } - }); - - findViewById(R.id.cancel).setOnClickListener(new View.OnClickListener() { - - @Override - public void onClick(View v) { - GagActionEditorDialog.this.dismiss(); - } - }); - } - -} diff --git a/BTLib/src/com/offsetnull/bt/responder/gag/GagActionEditorDialog.kt b/BTLib/src/com/offsetnull/bt/responder/gag/GagActionEditorDialog.kt new file mode 100644 index 00000000..5109e7d0 --- /dev/null +++ b/BTLib/src/com/offsetnull/bt/responder/gag/GagActionEditorDialog.kt @@ -0,0 +1,108 @@ +package com.offsetnull.bt.responder.gag + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import android.view.ViewGroup +import android.view.Window +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.Checkbox +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.ComposeView +import com.offsetnull.bt.R +import com.offsetnull.bt.responder.TriggerResponder +import com.offsetnull.bt.responder.TriggerResponderEditorDoneListener +import com.offsetnull.bt.ui.EditorDialogScaffold + +class GagActionEditorDialog( + context: Context, + private val original: TriggerResponder?, + private val finishWith: TriggerResponderEditorDoneListener +) : Dialog(context) { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + window?.requestFeature(Window.FEATURE_NO_TITLE) + window?.setBackgroundDrawableResource(R.drawable.dialog_window_crawler1) + + val gagOriginal = original as? GagAction + val initialOutput = gagOriginal?.isGagOutput ?: true + val initialLog = gagOriginal?.isGagLog ?: true + val initialRetarget = gagOriginal?.retarget ?: "" + + val composeView = ComposeView(context).apply { + setContent { + GagEditorContent( + initialGagOutput = initialOutput, + initialGagLog = initialLog, + initialRetarget = initialRetarget, + onDone = { gagOutput, gagLog, retarget -> + doExit(gagOutput, gagLog, retarget) + }, + onCancel = { dismiss() } + ) + } + } + setContentView(composeView, ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + )) + } + + private fun doExit(gagOutput: Boolean, gagLog: Boolean, retarget: String) { + val action = GagAction().apply { + isGagOutput = gagOutput + isGagLog = gagLog + this.retarget = retarget + } + if (original != null) { + finishWith.editTriggerResponder(action, original) + } else { + finishWith.newTriggerResponder(action) + } + dismiss() + } +} + +@Composable +private fun GagEditorContent( + initialGagOutput: Boolean, + initialGagLog: Boolean, + initialRetarget: String, + onDone: (Boolean, Boolean, String) -> Unit, + onCancel: () -> Unit +) { + var gagOutput by remember { mutableStateOf(initialGagOutput) } + var gagLog by remember { mutableStateOf(initialGagLog) } + var retarget by remember { mutableStateOf(initialRetarget) } + + EditorDialogScaffold( + title = "Gag Responder", + onSave = { onDone(gagOutput, gagLog, retarget) }, + onCancel = onCancel + ) { + Row(verticalAlignment = Alignment.CenterVertically) { + Checkbox(checked = gagOutput, onCheckedChange = { gagOutput = it }) + Text("Gag from output") + } + Row(verticalAlignment = Alignment.CenterVertically) { + Checkbox(checked = gagLog, onCheckedChange = { gagLog = it }) + Text("Gag from log") + } + OutlinedTextField( + value = retarget, + onValueChange = { retarget = it }, + label = { Text("Retarget to window") }, + modifier = Modifier.fillMaxWidth() + ) + } +} diff --git a/BTLib/src/com/offsetnull/bt/responder/notification/NotificationResponderEditor.java b/BTLib/src/com/offsetnull/bt/responder/notification/NotificationResponderEditor.java deleted file mode 100644 index 280c3400..00000000 --- a/BTLib/src/com/offsetnull/bt/responder/notification/NotificationResponderEditor.java +++ /dev/null @@ -1,594 +0,0 @@ -package com.offsetnull.bt.responder.notification; - -import android.annotation.SuppressLint; -import java.io.File; -import java.io.FilenameFilter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; - -import com.offsetnull.bt.R; -import com.offsetnull.bt.responder.TriggerResponderEditorDoneListener; -import com.offsetnull.bt.responder.TriggerResponder.FIRE_WHEN; - -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.Context; -import android.content.DialogInterface; -import android.media.MediaPlayer; -import android.os.Bundle; -import android.os.Environment; -import android.view.View; -import android.view.Window; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.EditText; -import android.widget.ScrollView; -import android.widget.TextView; - -public class NotificationResponderEditor extends Dialog { - - CheckBox lights; - CheckBox vibrate; - CheckBox sound; - CheckBox spawnnew; - CheckBox useongoing; - - TextView lights_extra; - TextView vibrate_extra; - TextView sound_extra; - - EditText title; - EditText message; - - - - NotificationResponder the_responder; - NotificationResponder original; - TriggerResponderEditorDoneListener finish_with; - boolean isEditor = false; - - public NotificationResponderEditor(Context context,NotificationResponder input,TriggerResponderEditorDoneListener listener) { - super(context); - finish_with = listener; - if(input == null) { - the_responder = new NotificationResponder(); - the_responder.setFireType(FIRE_WHEN.WINDOW_BOTH); - //new_data = input; - } else { - the_responder = input; - original = input.copy(); - isEditor = true; - } - } - - @SuppressLint("SetTextI18n") - public void onCreate(Bundle b) { - this.getWindow().requestFeature(Window.FEATURE_NO_TITLE); - this.getWindow().setBackgroundDrawableResource(R.drawable.dialog_window_crawler1); - setContentView(R.layout.responder_notification_dialog); - - ScrollView sv = (ScrollView)findViewById(R.id.trigger_notification_responder_scroll_container); - sv.setScrollbarFadingEnabled(false); - - title = (EditText)findViewById(R.id.responder_notification_title); - message = (EditText)findViewById(R.id.responder_notification_extra); - - lights = (CheckBox)findViewById(R.id.responder_notification_lights_check); - vibrate = (CheckBox)findViewById(R.id.responder_notification_vibrate_check); - sound = (CheckBox)findViewById(R.id.responder_notification_sound_check); - spawnnew = (CheckBox)findViewById(R.id.responder_notification_spawnnew_check); - //useongoing = (CheckBox)findViewById(R.id.responder_notification_useongoing_check); - - lights_extra = (TextView)findViewById(R.id.responder_notification_lights_extra); - sound_extra = (TextView)findViewById(R.id.responder_notification_sound_extra); - vibrate_extra = (TextView)findViewById(R.id.responder_notification_vibrate_extra); - - sound_extra.setMaxWidth((int) (50*this.getContext().getResources().getDisplayMetrics().density)); - sound_extra.setSingleLine(true); - //if(isEditor) { - //we have so much work to do. - title.setText(the_responder.getTitle()); - message.setText(the_responder.getMessage()); - - if(the_responder.isUseDefaultSound()) { - sound.setChecked(true); - if(the_responder.getSoundPath().equals("")) { - - sound_extra.setText(R.string.msg_using_default_sound); - - } else { - sound_extra.setText(the_responder.getSoundPath()); - //should be "", if useDefaultSounds is true; - } - //the_responder.setSoundPath(""); - } else { - sound.setChecked(false); - if(the_responder.getSoundPath().equals("")) { - sound_extra.setText(R.string.msg_currently_disabled); - } else { - sound_extra.setText(getContext().getString(R.string.fmt_sound_path_error, the_responder.getSoundPath())); - } - //the_responder.setSoundPath(""); - } - - if(the_responder.isUseDefaultLight()) { - lights.setChecked(true); - if(the_responder.getColorToUse() != 0) { - lights_extra.setText(getContext().getString(R.string.fmt_currently_using_cap, lookupRawColor(the_responder.getColorToUse()))); - } else { - lights_extra.setText(R.string.label_currently_default); - } - } else { - lights.setChecked(false); - lights_extra.setText(R.string.msg_currently_disabled); - } - - if(the_responder.isUseDefaultVibrate()) { - - vibrate.setChecked(true); - if(the_responder.getVibrateLength() != 0) { - //vibrate_extra.setText("Currently using: " + the_responder.getVibrateLength()); - vibrate_extra.setText(getContext().getString(R.string.fmt_currently_using, lookupVibrateLength(the_responder.getVibrateLength()))); - } else { - vibrate_extra.setText(R.string.msg_currently_using_default_lower); - } - } else { - vibrate.setChecked(false); - vibrate.setText(R.string.msg_currently_disabled); - } - - //use of the on-going notification is not supported at this time. - /*if(the_responder.isUseOnGoingNotification()) { - useongoing.setChecked(true); - } else { - useongoing.setChecked(false); - }*/ - - if(the_responder.isSpawnNewNotification()) { - spawnnew.setChecked(true); - } else { - spawnnew.setChecked(false); - } - - //} - - lights_extra = (TextView)findViewById(R.id.responder_notification_lights_extra); - vibrate_extra = (TextView)findViewById(R.id.responder_notification_vibrate_extra); - sound_extra = (TextView)findViewById(R.id.responder_notification_sound_extra); - - lights.setOnCheckedChangeListener(new CheckChangedListener(CHECK_TYPE.LIGHTS)); - vibrate.setOnCheckedChangeListener(new CheckChangedListener(CHECK_TYPE.VIBRATE)); - sound.setOnCheckedChangeListener(new CheckChangedListener(CHECK_TYPE.SOUND)); - spawnnew.setOnCheckedChangeListener(new CheckChangedListener(CHECK_TYPE.SPAWNNEW)); - //useongoing.setOnCheckedChangeListener(new CheckChangedListener(CHECK_TYPE.USEONGOING)); - - Button done = (Button)findViewById(R.id.responder_notification_done_button); - done.setOnClickListener(new View.OnClickListener() { - - public void onClick(View arg0) { - doFinish(); - } - }); - - Button cancel = (Button)findViewById(R.id.responder_notification_cancel); - cancel.setOnClickListener(new View.OnClickListener() { - - public void onClick(View arg0) { - NotificationResponderEditor.this.dismiss(); - } - }); - - - } - - private void doFinish() { - EditText title = (EditText)findViewById(R.id.responder_notification_title); - EditText extra = (EditText)findViewById(R.id.responder_notification_extra); - - the_responder.setTitle(title.getText().toString()); - the_responder.setMessage(extra.getText().toString()); - - if(isEditor) { - finish_with.editTriggerResponder(the_responder, original); - } else { - finish_with.newTriggerResponder(the_responder); - } - this.dismiss(); - } - - public static enum CHECK_TYPE { - LIGHTS, - VIBRATE, - SOUND, - SPAWNNEW, - USEONGOING; - } - - protected ArrayList sound_files = new ArrayList(); - protected HashMap paths = new HashMap(); - - private String lookupColor(int input) { - switch(input) { - case 0: - return "default"; - case 1: - return "Blue"; - case 2: - return "Green"; - case 3: - return "Red"; - case 4: - return "Magenta"; - case 5: - return "Cyan"; - case 6: - return "White"; - default: - return "default"; - } - } - - private String lookupRawColor(int rawColor) { - switch(rawColor) { - case 0x00000000: - return "default"; - case 0xFF0000FF: - return "Blue"; - case 0xFF00FF00: - return "Green"; - case 0xFFFF0000: - return "Red"; - case 0xFFFF00FF: - return "Magenta"; - case 0xFF00FFFF: - return "Cyan"; - case 0xFFFFFFFF: - return "White"; - default: - return "default"; - } - } - - private String lookupVibrateLength(int i) { - switch(i) { - case 0: return "default"; - case 1: return "Very Short"; - case 2: return "Short"; - case 3: return "Long"; - case 4: return "Suuper Long"; - default: return "default"; - } - } - - private static final String DISABLED_MSG = "Currently disabled."; - private static final String DEFAULT_MSG = "Currently using: default"; - private class CheckChangedListener implements CompoundButton.OnCheckedChangeListener { - - private CHECK_TYPE type; - - public CheckChangedListener(CHECK_TYPE iType) { - type = iType; - } - - public void onCheckedChanged(CompoundButton arg0, boolean arg1) { - switch(type) { - case LIGHTS: - if(arg1) { - AlertDialog.Builder light_builder = new AlertDialog.Builder(NotificationResponderEditor.this.getContext()); - CharSequence[] light_types = {"Default","Blue","Green","Red","Magenta","Cyan","White"}; - light_builder.setTitle("Select Color"); - light_builder.setItems(light_types, new LightListReturnListener()); - AlertDialog light_picker = light_builder.create(); - light_picker.setOnCancelListener(new DialogInterface.OnCancelListener() { - - public void onCancel(DialogInterface dialog) { - lights.setChecked(false); - the_responder.setUseDefaultLight(false); - the_responder.setColorToUse(0); - lights_extra.setText(DISABLED_MSG); - } - - }); - light_picker.show(); - } else { - //just reset - the_responder.setUseDefaultLight(false); - the_responder.setColorToUse(0); - lights_extra.setText(DISABLED_MSG); - } - break; - case VIBRATE: - if(arg1) { - AlertDialog.Builder vibrate_builder = new AlertDialog.Builder(NotificationResponderEditor.this.getContext()); - CharSequence[] vibrate_types = {"Default","Very Short","Short","Long","Suuuper Long"}; - vibrate_builder.setTitle("Select Sequence:"); - vibrate_builder.setItems(vibrate_types, new VibrateListReturnListener()); - AlertDialog vibrate_dialog = vibrate_builder.create(); - vibrate_dialog.setOnCancelListener(new DialogInterface.OnCancelListener() { - - public void onCancel(DialogInterface dialog) { - vibrate.setChecked(false); - the_responder.setUseDefaultVibrate(false); - the_responder.setVibrateLength(0); - vibrate_extra.setText(DISABLED_MSG); - } - }); - vibrate_dialog.show(); - } else { - //turn option off. - the_responder.setUseDefaultVibrate(false); - the_responder.setVibrateLength(0); - vibrate_extra.setText(DISABLED_MSG); - } - break; - case SOUND: - if(arg1) { - String state = Environment.getExternalStorageState(); - if(state.equals(Environment.MEDIA_MOUNTED_READ_ONLY) || state.equals(Environment.MEDIA_MOUNTED)) { - File sdcardroot = Environment.getExternalStorageDirectory(); - - String[] system_paths = {"/system/media/audio/ringtones/", - "/system/media/audio/alarms/", - "/system/media/audio/notificiation/"}; - paths.clear(); - //paths.put("Disabled", ""); - //paths.put("Default",""); - for(String path : system_paths) { - //Log.e("RESPONDER","TESTING PATH:"+path); - File tmp = new File(path); - //Log.e("RESPONDER","FILE IS DIR: " + tmp.isDirectory() + ", " + tmp.getPath() + "@" + tmp.getName()); - if(tmp != null && tmp.isDirectory()) { - //Log.e("RESPONDER","PATH EXISTS @" + tmp.getPath() + "|" + tmp.getName()); - for(File file : tmp.listFiles()) { - //Log.e("RESPONDER","FOUND FILE:" + file.getName() + "@" + file.getPath()); - paths.put(file.getName(), file.getPath()); - } - } - } - - FilenameFilter mp3_only = new FilenameFilter() { - - public boolean accept(File arg0, String arg1) { - return arg1.endsWith(".mp3"); - } - - }; - - File btermdir = new File(sdcardroot,"/BlowTorch/"); - for(File path : btermdir.listFiles(mp3_only)) { - paths.put(path.getName(), path.getPath()); - } - - sound_files.clear(); - for(String name : paths.keySet()) { - sound_files.add(name); - } - - AlertDialog.Builder sound_list = new AlertDialog.Builder(NotificationResponderEditor.this.getContext()); - sound_list.setTitle("Pick Sound: (Back to Exit)"); - String[] items = new String[sound_files.size() + 2]; - items[0] = "Disabled"; - items[1] = "Default"; - int i = 2; - int position = 0; - if(the_responder.isUseDefaultSound()) { - if(!the_responder.getSoundPath().equals("")) { - position = 1; - } - } - for(String file : sound_files) { - if(paths.get(file).equals(the_responder.getSoundPath())) { - position = i; - } - //if(file.equals("Disabled") || file.equals("Default")) { - - //} else { - items[i] = file; - i++; - //} - } - - sound_list.setSingleChoiceItems(items, position ,new SoundListReturnListener()); - AlertDialog sound_picker = sound_list.create(); - sound_picker.setOnCancelListener(new DialogInterface.OnCancelListener() { - - public void onCancel(DialogInterface dialog) { - //if we got here then we need to uncheck the box. - //sound.setChecked(false); - //the_responder.setUseDefaultSound(false); - //the_responder.setSoundPath(""); - //sound_extra.setText(DISABLED_MSG); - mp.stop(); - } - }); - // - sound_picker.show(); - - } else { - //can't really do antying because the sdcard isn't mounted. - //set to "dont use" - - } - } else { - the_responder.setUseDefaultSound(false); - the_responder.setSoundPath(""); - sound_extra.setText(DISABLED_MSG); - } - break; - case SPAWNNEW: - if(arg1) { - //set the value - the_responder.setSpawnNewNotification(true); - } else { - //set the value - the_responder.setSpawnNewNotification(false); - } - break; - case USEONGOING: - if(arg1) { - //set the value - the_responder.setUseOnGoingNotification(true); - } else { - //set the value - the_responder.setUseOnGoingNotification(false); - } - break; - default: - break; - } - - } - - - - private class LightListReturnListener implements DialogInterface.OnClickListener { - - public void onClick(DialogInterface arg0, int arg1) { - //CharSequence[] light_types = {"Default","Blue","Green","Red","Magenta","Cyan","White"}; - switch(arg1) { - case 0: - //default; - the_responder.setUseDefaultLight(true); - break; - case 1: - //blue - the_responder.setUseDefaultLight(true); - the_responder.setColorToUse(0xFF0000FF); - break; - case 2: - //green - the_responder.setUseDefaultLight(true); - the_responder.setColorToUse(0xFF00FF00); - break; - case 3: - //red - the_responder.setUseDefaultLight(true); - the_responder.setColorToUse(0xFFFF0000); - break; - case 4: - //magenta - the_responder.setUseDefaultLight(true); - the_responder.setColorToUse(0xFFFF00FF); - break; - case 5: - //cyan - the_responder.setUseDefaultLight(true); - the_responder.setColorToUse(0xFF00FFFF); - break; - case 6: - //white - the_responder.setUseDefaultLight(true); - the_responder.setColorToUse(0xFFFFFFFF); - break; - default: - break; - } - if(arg1 != 0) { - lights_extra.setText(getContext().getString(R.string.fmt_currently_using, lookupColor(arg1))); - } else { - lights_extra.setText(DEFAULT_MSG); - } - - } - - } - - - - private class VibrateListReturnListener implements DialogInterface.OnClickListener { - public void onClick(DialogInterface arg0, int arg1) { - //CharSequence[] vibrate_types = {"Default","Very Short","Short","Long","Suuuper Long"}; - //CharSequence type = vibrate_types[arg1]; - switch(arg1) { - case 0: - //default - the_responder.setUseDefaultVibrate(true); - the_responder.setVibrateLength(0); - break; - case 1: - //very short - the_responder.setUseDefaultVibrate(true); - the_responder.setVibrateLength(1); - break; - case 2: - //short - the_responder.setUseDefaultVibrate(true); - the_responder.setVibrateLength(2); - break; - case 3: - //Long - the_responder.setUseDefaultVibrate(true); - the_responder.setVibrateLength(3); - break; - case 4: - //Suuper Long - the_responder.setUseDefaultVibrate(true); - the_responder.setVibrateLength(4); - break; - default: - break; - } - if(arg1 != 0){ - vibrate_extra.setText(getContext().getString(R.string.fmt_currently_using, lookupVibrateLength(arg1))); - } else { - vibrate_extra.setText(DEFAULT_MSG); - } - } - } - - MediaPlayer mp = new MediaPlayer(); - private class SoundListReturnListener implements DialogInterface.OnClickListener { - public void onClick(DialogInterface arg0, int arg1) { - - if(arg1 == 0) { - //none selected - the_responder.setUseDefaultSound(false); - the_responder.setSoundPath(""); - sound.setChecked(false); - sound_extra.setText(DISABLED_MSG); - } else if(arg1 == 1) { - the_responder.setUseDefaultSound(true); - the_responder.setSoundPath(""); - sound.setChecked(true); - sound_extra.setText(DEFAULT_MSG); - } else { - int position = arg1 - 2; - String name = sound_files.get(position); - //String path = - String path = paths.get(name); - the_responder.setUseDefaultSound(true); - the_responder.setSoundPath(path); - if(path.equals("")) { - sound_extra.setText(DEFAULT_MSG); - } else { - sound_extra.setText(getContext().getString(R.string.fmt_currently_using, path)); - } - - //so we have a path now, we should just play it and be cool. - - try { - mp.stop(); - mp = new MediaPlayer(); - - //mp. - mp.setDataSource(path); - mp.prepare(); - mp.start(); - } catch (IllegalArgumentException e) { - throw new RuntimeException(e); - } catch (IllegalStateException e) { - throw new RuntimeException(e); - } catch (IOException e) { - throw new RuntimeException(e); - } - - } - } - } - - - } - -} diff --git a/BTLib/src/com/offsetnull/bt/responder/notification/NotificationResponderEditor.kt b/BTLib/src/com/offsetnull/bt/responder/notification/NotificationResponderEditor.kt new file mode 100644 index 00000000..85d7fca1 --- /dev/null +++ b/BTLib/src/com/offsetnull/bt/responder/notification/NotificationResponderEditor.kt @@ -0,0 +1,372 @@ +package com.offsetnull.bt.responder.notification + +import android.app.AlertDialog +import android.app.Dialog +import android.content.Context +import android.media.MediaPlayer +import android.os.Bundle +import android.os.Environment +import android.view.ViewGroup +import android.view.Window +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.material3.Checkbox +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.unit.dp +import com.offsetnull.bt.R +import com.offsetnull.bt.responder.TriggerResponder.FIRE_WHEN +import com.offsetnull.bt.responder.TriggerResponderEditorDoneListener +import com.offsetnull.bt.ui.EditorDialogScaffold +import java.io.File + +class NotificationResponderEditor( + context: Context, + input: NotificationResponder?, + private val finishWith: TriggerResponderEditorDoneListener +) : Dialog(context) { + + private val responder: NotificationResponder + private val original: NotificationResponder? + private val isEditor: Boolean + private var mp = MediaPlayer() + + init { + if (input == null) { + responder = NotificationResponder() + responder.fireType = FIRE_WHEN.WINDOW_BOTH + original = null + isEditor = false + } else { + responder = input + original = input.copy() + isEditor = true + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + window?.requestFeature(Window.FEATURE_NO_TITLE) + window?.setBackgroundDrawableResource(R.drawable.dialog_window_crawler1) + + val composeView = ComposeView(context).apply { + setContent { + NotificationEditorContent( + initialTitle = responder.title ?: "", + initialMessage = responder.message ?: "", + initialUseLights = responder.isUseDefaultLight, + initialLightColor = responder.colorToUse, + initialUseVibrate = responder.isUseDefaultVibrate, + initialVibrateLength = responder.vibrateLength, + initialUseSound = responder.isUseDefaultSound, + initialSoundPath = responder.soundPath ?: "", + initialSpawnNew = responder.isSpawnNewNotification, + onPickLightColor = { onChecked, callback -> pickLightColor(onChecked, callback) }, + onPickVibrate = { onChecked, callback -> pickVibrate(onChecked, callback) }, + onPickSound = { onChecked, callback -> pickSound(onChecked, callback) }, + onDone = { title, message, useLights, lightColor, useVibrate, vibrateLen, + useSound, soundPath, spawnNew -> + doFinish(title, message, useLights, lightColor, useVibrate, vibrateLen, + useSound, soundPath, spawnNew) + }, + onCancel = { dismiss() } + ) + } + } + setContentView(composeView, ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + )) + } + + private fun doFinish( + title: String, message: String, + useLights: Boolean, lightColor: Int, + useVibrate: Boolean, vibrateLength: Int, + useSound: Boolean, soundPath: String, + spawnNew: Boolean + ) { + responder.title = title + responder.message = message + responder.isUseDefaultLight = useLights + responder.colorToUse = lightColor + responder.isUseDefaultVibrate = useVibrate + responder.vibrateLength = vibrateLength + responder.isUseDefaultSound = useSound + responder.soundPath = soundPath + responder.isSpawnNewNotification = spawnNew + + if (isEditor) { + finishWith.editTriggerResponder(responder, original) + } else { + finishWith.newTriggerResponder(responder) + } + dismiss() + } + + private val lightColors = arrayOf("Default", "Blue", "Green", "Red", "Magenta", "Cyan", "White") + private val lightColorValues = intArrayOf( + 0x00000000, 0xFF0000FF.toInt(), 0xFF00FF00.toInt(), 0xFFFF0000.toInt(), + 0xFFFF00FF.toInt(), 0xFF00FFFF.toInt(), 0xFFFFFFFF.toInt() + ) + + private fun pickLightColor(onChecked: Boolean, callback: (Boolean, Int, String) -> Unit) { + if (!onChecked) { + callback(false, 0, "Currently disabled.") + return + } + val builder = AlertDialog.Builder(context) + builder.setTitle("Select Color") + builder.setItems(lightColors) { _, which -> + val color = lightColorValues[which] + val label = if (which == 0) "Currently using: default" + else context.getString(R.string.fmt_currently_using, lightColors[which]) + callback(true, color, label) + } + builder.setOnCancelListener { + callback(false, 0, "Currently disabled.") + } + builder.show() + } + + private val vibrateLabels = arrayOf("Default", "Very Short", "Short", "Long", "Suuuper Long") + + private fun pickVibrate(onChecked: Boolean, callback: (Boolean, Int, String) -> Unit) { + if (!onChecked) { + callback(false, 0, "Currently disabled.") + return + } + val builder = AlertDialog.Builder(context) + builder.setTitle("Select Sequence:") + builder.setItems(vibrateLabels) { _, which -> + val label = if (which == 0) "Currently using: default" + else context.getString(R.string.fmt_currently_using, vibrateLabels[which]) + callback(true, which, label) + } + builder.setOnCancelListener { + callback(false, 0, "Currently disabled.") + } + builder.show() + } + + @Suppress("DEPRECATION") + private fun pickSound(onChecked: Boolean, callback: (Boolean, String, String) -> Unit) { + if (!onChecked) { + callback(false, "", "Currently disabled.") + return + } + + val state = Environment.getExternalStorageState() + if (state != Environment.MEDIA_MOUNTED_READ_ONLY && state != Environment.MEDIA_MOUNTED) { + callback(false, "", "Currently disabled.") + return + } + + val paths = mutableMapOf() + val systemPaths = arrayOf( + "/system/media/audio/ringtones/", + "/system/media/audio/alarms/", + "/system/media/audio/notificiation/" + ) + for (path in systemPaths) { + val dir = File(path) + if (dir.isDirectory) { + dir.listFiles()?.forEach { paths[it.name] = it.path } + } + } + + val btDir = File(Environment.getExternalStorageDirectory(), "/BlowTorch/") + btDir.listFiles { _, name -> name.endsWith(".mp3") }?.forEach { + paths[it.name] = it.path + } + + val soundNames = paths.keys.toList() + val items = Array(soundNames.size + 2) { i -> + when (i) { + 0 -> "Disabled" + 1 -> "Default" + else -> soundNames[i - 2] + } + } + + var currentPosition = 0 + if (responder.isUseDefaultSound && responder.soundPath.isNullOrEmpty()) { + currentPosition = 1 + } else { + soundNames.forEachIndexed { idx, name -> + if (paths[name] == responder.soundPath) currentPosition = idx + 2 + } + } + + val builder = AlertDialog.Builder(context) + builder.setTitle("Pick Sound: (Back to Exit)") + builder.setSingleChoiceItems(items, currentPosition) { _, which -> + when (which) { + 0 -> { + callback(false, "", "Currently disabled.") + } + 1 -> { + callback(true, "", "Currently using: default") + } + else -> { + val name = soundNames[which - 2] + val path = paths[name] ?: "" + val label = if (path.isEmpty()) "Currently using: default" + else context.getString(R.string.fmt_currently_using, path) + callback(true, path, label) + try { + mp.stop() + mp = MediaPlayer() + mp.setDataSource(path) + mp.prepare() + mp.start() + } catch (e: Exception) { + throw RuntimeException(e) + } + } + } + } + builder.setOnCancelListener { mp.stop() } + builder.show() + } +} + +@Suppress("LongParameterList") +@Composable +private fun NotificationEditorContent( + initialTitle: String, + initialMessage: String, + initialUseLights: Boolean, + initialLightColor: Int, + initialUseVibrate: Boolean, + initialVibrateLength: Int, + initialUseSound: Boolean, + initialSoundPath: String, + initialSpawnNew: Boolean, + onPickLightColor: (Boolean, (Boolean, Int, String) -> Unit) -> Unit, + onPickVibrate: (Boolean, (Boolean, Int, String) -> Unit) -> Unit, + onPickSound: (Boolean, (Boolean, String, String) -> Unit) -> Unit, + onDone: (String, String, Boolean, Int, Boolean, Int, Boolean, String, Boolean) -> Unit, + onCancel: () -> Unit +) { + var title by remember { mutableStateOf(initialTitle) } + var message by remember { mutableStateOf(initialMessage) } + var useLights by remember { mutableStateOf(initialUseLights) } + var lightColor by remember { mutableIntStateOf(initialLightColor) } + var lightsLabel by remember { mutableStateOf(formatLightLabel(initialUseLights, initialLightColor)) } + var useVibrate by remember { mutableStateOf(initialUseVibrate) } + var vibrateLength by remember { mutableIntStateOf(initialVibrateLength) } + var vibrateLabel by remember { mutableStateOf(formatVibrateLabel(initialUseVibrate, initialVibrateLength)) } + var useSound by remember { mutableStateOf(initialUseSound) } + var soundPath by remember { mutableStateOf(initialSoundPath) } + var soundLabel by remember { mutableStateOf(formatSoundLabel(initialUseSound, initialSoundPath)) } + var spawnNew by remember { mutableStateOf(initialSpawnNew) } + + EditorDialogScaffold( + title = "Notification Responder", + onSave = { + onDone(title, message, useLights, lightColor, useVibrate, vibrateLength, + useSound, soundPath, spawnNew) + }, + onCancel = onCancel + ) { + OutlinedTextField( + value = title, + onValueChange = { title = it }, + label = { Text("Title") }, + modifier = Modifier.fillMaxWidth() + ) + OutlinedTextField( + value = message, + onValueChange = { message = it }, + label = { Text("Message") }, + modifier = Modifier.fillMaxWidth() + ) + Spacer(modifier = Modifier.height(8.dp)) + Row(verticalAlignment = Alignment.CenterVertically) { + Checkbox( + checked = useLights, + onCheckedChange = { checked -> + onPickLightColor(checked) { enabled, color, label -> + useLights = enabled + lightColor = color + lightsLabel = label + } + } + ) + Text("Lights: $lightsLabel") + } + Row(verticalAlignment = Alignment.CenterVertically) { + Checkbox( + checked = useVibrate, + onCheckedChange = { checked -> + onPickVibrate(checked) { enabled, length, label -> + useVibrate = enabled + vibrateLength = length + vibrateLabel = label + } + } + ) + Text("Vibrate: $vibrateLabel") + } + Row(verticalAlignment = Alignment.CenterVertically) { + Checkbox( + checked = useSound, + onCheckedChange = { checked -> + onPickSound(checked) { enabled, path, label -> + useSound = enabled + soundPath = path + soundLabel = label + } + } + ) + Text("Sound: $soundLabel") + } + Row(verticalAlignment = Alignment.CenterVertically) { + Checkbox(checked = spawnNew, onCheckedChange = { spawnNew = it }) + Text("Spawn new notification") + } + } +} + +private fun formatLightLabel(enabled: Boolean, color: Int): String { + if (!enabled) return "Currently disabled." + return when (color) { + 0 -> "Currently using: default" + 0xFF0000FF.toInt() -> "Currently using: Blue" + 0xFF00FF00.toInt() -> "Currently using: Green" + 0xFFFF0000.toInt() -> "Currently using: Red" + 0xFFFF00FF.toInt() -> "Currently using: Magenta" + 0xFF00FFFF.toInt() -> "Currently using: Cyan" + 0xFFFFFFFF.toInt() -> "Currently using: White" + else -> "Currently using: default" + } +} + +private fun formatVibrateLabel(enabled: Boolean, length: Int): String { + if (!enabled) return "Currently disabled." + return when (length) { + 0 -> "Currently using: default" + 1 -> "Currently using: Very Short" + 2 -> "Currently using: Short" + 3 -> "Currently using: Long" + 4 -> "Currently using: Suuper Long" + else -> "Currently using: default" + } +} + +private fun formatSoundLabel(enabled: Boolean, path: String): String { + if (!enabled) return "Currently disabled." + return if (path.isEmpty()) "Using default sound" else path +} diff --git a/BTLib/src/com/offsetnull/bt/responder/replace/ReplaceActionEditorDialog.java b/BTLib/src/com/offsetnull/bt/responder/replace/ReplaceActionEditorDialog.java deleted file mode 100644 index 873470b5..00000000 --- a/BTLib/src/com/offsetnull/bt/responder/replace/ReplaceActionEditorDialog.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.offsetnull.bt.responder.replace; - -import com.offsetnull.bt.R; -import com.offsetnull.bt.responder.TriggerResponder; -import com.offsetnull.bt.responder.TriggerResponderEditorDoneListener; - -import android.app.Dialog; -import android.content.Context; -import android.os.Bundle; -import android.view.View; -import android.view.Window; -import android.widget.TextView; - -public class ReplaceActionEditorDialog extends Dialog { - - TriggerResponder original; - private TriggerResponderEditorDoneListener finish_with; - - TextView with; - - TextView retarget; - - public ReplaceActionEditorDialog(Context context,TriggerResponder original,TriggerResponderEditorDoneListener listener) { - super(context); - - this.original = original; - finish_with = listener; - - //if(original != null) { - // startVal - //} - // TODO Auto-generated constructor stub - } - - - @Override - public void onCreate(Bundle b) { - this.getWindow().requestFeature(Window.FEATURE_NO_TITLE); - this.getWindow().setBackgroundDrawableResource(R.drawable.dialog_window_crawler1); - - this.setContentView(R.layout.responder_script_dialog); - - ((TextView)findViewById(R.id.titlebar)).setText(R.string.title_replace_responder); - ((TextView)findViewById(R.id.action_label)).setText(R.string.label_replace_triggered_text); - - with = (TextView)findViewById(R.id.function); - - findViewById(R.id.done).setOnClickListener(new View.OnClickListener() { - - @Override - public void onClick(View v) { - if(original != null) { - ReplaceResponder tmp = new ReplaceResponder(); - tmp.setWith(with.getText().toString()); - tmp.setFireType(original.getFireType()); - finish_with.editTriggerResponder(tmp, original); - } else { - ReplaceResponder tmp = new ReplaceResponder(); - tmp.setWith(with.getText().toString()); - finish_with.newTriggerResponder(tmp); - } - - ReplaceActionEditorDialog.this.dismiss(); - } - }); - - findViewById(R.id.cancel).setOnClickListener(new View.OnClickListener() { - - @Override - public void onClick(View v) { - ReplaceActionEditorDialog.this.dismiss(); - } - }); - - if(original != null) { - with.setText(((ReplaceResponder)original).getWith()); - } - } -} diff --git a/BTLib/src/com/offsetnull/bt/responder/replace/ReplaceActionEditorDialog.kt b/BTLib/src/com/offsetnull/bt/responder/replace/ReplaceActionEditorDialog.kt new file mode 100644 index 00000000..31d2a73b --- /dev/null +++ b/BTLib/src/com/offsetnull/bt/responder/replace/ReplaceActionEditorDialog.kt @@ -0,0 +1,87 @@ +package com.offsetnull.bt.responder.replace + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import android.view.ViewGroup +import android.view.Window +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.ComposeView +import com.offsetnull.bt.R +import com.offsetnull.bt.responder.TriggerResponder +import com.offsetnull.bt.responder.TriggerResponderEditorDoneListener +import com.offsetnull.bt.ui.EditorDialogScaffold + +class ReplaceActionEditorDialog( + context: Context, + private val original: TriggerResponder?, + private val finishWith: TriggerResponderEditorDoneListener +) : Dialog(context) { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + window?.requestFeature(Window.FEATURE_NO_TITLE) + window?.setBackgroundDrawableResource(R.drawable.dialog_window_crawler1) + + val initialWith = (original as? ReplaceResponder)?.with ?: "" + + val composeView = ComposeView(context).apply { + setContent { + ReplaceEditorContent( + initialWith = initialWith, + onDone = { replaceWith -> doExit(replaceWith) }, + onCancel = { dismiss() } + ) + } + } + setContentView(composeView, ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + )) + } + + private fun doExit(replaceWith: String) { + val action = ReplaceResponder().apply { + with = replaceWith + if (original != null) { + fireType = original.fireType + } + } + if (original != null) { + finishWith.editTriggerResponder(action, original) + } else { + finishWith.newTriggerResponder(action) + } + dismiss() + } +} + +@Composable +private fun ReplaceEditorContent( + initialWith: String, + onDone: (String) -> Unit, + onCancel: () -> Unit +) { + var replaceWith by remember { mutableStateOf(initialWith) } + + EditorDialogScaffold( + title = "Replace Responder", + onSave = { onDone(replaceWith) }, + onCancel = onCancel + ) { + OutlinedTextField( + value = replaceWith, + onValueChange = { replaceWith = it }, + label = { Text("Replace triggered text with") }, + modifier = Modifier.fillMaxWidth() + ) + } +} diff --git a/BTLib/src/com/offsetnull/bt/responder/script/ScriptResponderEditor.java b/BTLib/src/com/offsetnull/bt/responder/script/ScriptResponderEditor.java deleted file mode 100644 index 31031cb9..00000000 --- a/BTLib/src/com/offsetnull/bt/responder/script/ScriptResponderEditor.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.offsetnull.bt.responder.script; - -import com.offsetnull.bt.R; -import com.offsetnull.bt.responder.TriggerResponderEditorDoneListener; - -import android.app.Dialog; -import android.content.Context; -import android.os.Bundle; -import android.view.View; -import android.view.Window; -import android.widget.Button; -import android.widget.EditText; - -public class ScriptResponderEditor extends Dialog { - - private ScriptResponder the_responder; - private ScriptResponder original; - - private TriggerResponderEditorDoneListener finish_with; - - private boolean isEditor = false; - - public ScriptResponderEditor(Context context,ScriptResponder input,TriggerResponderEditorDoneListener listener) { - super(context); - finish_with = listener; - if(input == null) { - the_responder = new ScriptResponder(); - } else { - the_responder = input.copy(); - original = input.copy(); - isEditor = true; - } - - } - - public void onCreate(Bundle b) { - this.getWindow().requestFeature(Window.FEATURE_NO_TITLE); - this.getWindow().setBackgroundDrawableResource(R.drawable.dialog_window_crawler1); - - setContentView(R.layout.responder_script_dialog); - - EditText function = (EditText)findViewById(R.id.function); - function.setText(the_responder.getFunction()); - - Button done = (Button)findViewById(R.id.done); - done.setOnClickListener(new DoneListener()); - - Button cancel = (Button)findViewById(R.id.cancel); - cancel.setOnClickListener(new View.OnClickListener() { - - public void onClick(View arg0) { - ScriptResponderEditor.this.dismiss(); - } - }); - - } - - private class DoneListener implements View.OnClickListener { - - public void onClick(View arg0) { - EditText function = (EditText)findViewById(R.id.function); - //ackwith.setText(the_responder.getAckWith()); - the_responder.setFunction(function.getText().toString()); - if(isEditor) { - finish_with.editTriggerResponder(the_responder, original); - } else { - finish_with.newTriggerResponder(the_responder); - } - ScriptResponderEditor.this.dismiss(); - } - - }; - -} diff --git a/BTLib/src/com/offsetnull/bt/responder/script/ScriptResponderEditor.kt b/BTLib/src/com/offsetnull/bt/responder/script/ScriptResponderEditor.kt new file mode 100644 index 00000000..a87979bc --- /dev/null +++ b/BTLib/src/com/offsetnull/bt/responder/script/ScriptResponderEditor.kt @@ -0,0 +1,82 @@ +package com.offsetnull.bt.responder.script + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import android.view.ViewGroup +import android.view.Window +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.ComposeView +import com.offsetnull.bt.R +import com.offsetnull.bt.responder.TriggerResponderEditorDoneListener +import com.offsetnull.bt.ui.EditorDialogScaffold + +class ScriptResponderEditor( + context: Context, + input: ScriptResponder?, + private val finishWith: TriggerResponderEditorDoneListener +) : Dialog(context) { + + private val original: ScriptResponder? = input?.copy() + private val responder: ScriptResponder = input?.copy() ?: ScriptResponder() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + window?.requestFeature(Window.FEATURE_NO_TITLE) + window?.setBackgroundDrawableResource(R.drawable.dialog_window_crawler1) + + val composeView = ComposeView(context).apply { + setContent { + ScriptEditorContent( + initialFunction = responder.function ?: "", + onDone = { function -> doExit(function) }, + onCancel = { dismiss() } + ) + } + } + setContentView(composeView, ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + )) + } + + private fun doExit(function: String) { + responder.function = function + if (original != null) { + finishWith.editTriggerResponder(responder, original) + } else { + finishWith.newTriggerResponder(responder) + } + dismiss() + } +} + +@Composable +private fun ScriptEditorContent( + initialFunction: String, + onDone: (String) -> Unit, + onCancel: () -> Unit +) { + var function by remember { mutableStateOf(initialFunction) } + + EditorDialogScaffold( + title = "Script Responder", + onSave = { onDone(function) }, + onCancel = onCancel + ) { + OutlinedTextField( + value = function, + onValueChange = { function = it }, + label = { Text("Execute Script Function") }, + modifier = Modifier.fillMaxWidth() + ) + } +} diff --git a/BTLib/src/com/offsetnull/bt/responder/toast/ToastResponderEditor.java b/BTLib/src/com/offsetnull/bt/responder/toast/ToastResponderEditor.java deleted file mode 100644 index 0f1c78a2..00000000 --- a/BTLib/src/com/offsetnull/bt/responder/toast/ToastResponderEditor.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.offsetnull.bt.responder.toast; - -import android.annotation.SuppressLint; -import com.offsetnull.bt.R; -import com.offsetnull.bt.responder.TriggerResponderEditorDoneListener; -import com.offsetnull.bt.validator.Validator; - -import android.app.Dialog; -import android.content.Context; -import android.os.Bundle; -import android.view.View; -import android.view.Window; -import android.widget.Button; -import android.widget.EditText; - -public class ToastResponderEditor extends Dialog { - - private ToastResponder the_responder; - private ToastResponder original; - - boolean isEditor = false;; - - TriggerResponderEditorDoneListener finish_with; - - public ToastResponderEditor(Context context,ToastResponder input,TriggerResponderEditorDoneListener doneListener) { - super(context); - finish_with = doneListener; - if(input != null) { - original = input.copy(); - the_responder = input.copy(); - isEditor = true; - } else { - the_responder = new ToastResponder(); - } - } - - @SuppressLint("SetTextI18n") - public void onCreate(Bundle b) { - this.getWindow().requestFeature(Window.FEATURE_NO_TITLE); - this.getWindow().setBackgroundDrawableResource(R.drawable.dialog_window_crawler1); - setContentView(R.layout.responder_toast_dialog); - - Button done = (Button)findViewById(R.id.responder_toast_done_button); - done.setOnClickListener(new DoneListener()); - - EditText message = (EditText)findViewById(R.id.responder_toast_message); - EditText delay = (EditText)findViewById(R.id.responder_toast_delay); - - delay.setText(Integer.toString(the_responder.getDelay())); - message.setText(the_responder.getMessage()); - - Button cancel = (Button)findViewById(R.id.responder_toast_cancel); - cancel.setOnClickListener(new View.OnClickListener() { - - public void onClick(View arg0) { - ToastResponderEditor.this.dismiss(); - } - }); - } - - private class DoneListener implements View.OnClickListener { - - - - public void onClick(View arg0) { - - EditText message = (EditText)ToastResponderEditor.this.findViewById(R.id.responder_toast_message); - EditText delay = (EditText)ToastResponderEditor.this.findViewById(R.id.responder_toast_delay); - - Validator checker = new Validator(); - checker.add(message,Validator.VALIDATE_NOT_BLANK,"Message field"); - checker.add(delay, Validator.VALIDATE_NOT_BLANK|Validator.VALIDATE_NUMBER|Validator.VALIDATE_NUMBER_NOT_ZERO, "Delay field"); - - String result = checker.validate(); - if(result != null) { - checker.showMessage(ToastResponderEditor.this.getContext(), result); - return; - } else { - //Log.e("TOASTRESPONDER","VALID ENTRIES"); - } - - the_responder.setDelay(Integer.parseInt(delay.getText().toString())); - the_responder.setMessage(message.getText().toString()); - - if(isEditor) { - finish_with.editTriggerResponder(the_responder, original); - } else { - finish_with.newTriggerResponder(the_responder); - } - - ToastResponderEditor.this.dismiss(); - } - - }; - - - -} diff --git a/BTLib/src/com/offsetnull/bt/responder/toast/ToastResponderEditor.kt b/BTLib/src/com/offsetnull/bt/responder/toast/ToastResponderEditor.kt new file mode 100644 index 00000000..7f217039 --- /dev/null +++ b/BTLib/src/com/offsetnull/bt/responder/toast/ToastResponderEditor.kt @@ -0,0 +1,100 @@ +package com.offsetnull.bt.responder.toast + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import android.view.ViewGroup +import android.view.Window +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.text.input.KeyboardType +import com.offsetnull.bt.R +import com.offsetnull.bt.responder.TriggerResponderEditorDoneListener +import com.offsetnull.bt.ui.EditorDialogScaffold + +class ToastResponderEditor( + context: Context, + input: ToastResponder?, + private val finishWith: TriggerResponderEditorDoneListener +) : Dialog(context) { + + private val original: ToastResponder? = input?.copy() + private val responder: ToastResponder = input?.copy() ?: ToastResponder() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + window?.requestFeature(Window.FEATURE_NO_TITLE) + window?.setBackgroundDrawableResource(R.drawable.dialog_window_crawler1) + + val composeView = ComposeView(context).apply { + setContent { + ToastEditorContent( + initialMessage = responder.message ?: "", + initialDelay = responder.delay, + onDone = { message, delay -> doExit(message, delay) }, + onCancel = { dismiss() } + ) + } + } + setContentView(composeView, ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + )) + } + + private fun doExit(message: String, delay: Int) { + responder.message = message + responder.delay = delay + if (original != null) { + finishWith.editTriggerResponder(responder, original) + } else { + finishWith.newTriggerResponder(responder) + } + dismiss() + } +} + +@Composable +private fun ToastEditorContent( + initialMessage: String, + initialDelay: Int, + onDone: (String, Int) -> Unit, + onCancel: () -> Unit +) { + var message by remember { mutableStateOf(initialMessage) } + var delayText by remember { mutableStateOf(initialDelay.toString()) } + + EditorDialogScaffold( + title = "Toast Responder", + onSave = { + val delay = delayText.toIntOrNull() ?: 0 + if (message.isNotBlank() && delay > 0) { + onDone(message, delay) + } + }, + onCancel = onCancel + ) { + OutlinedTextField( + value = message, + onValueChange = { message = it }, + label = { Text("Message") }, + modifier = Modifier.fillMaxWidth() + ) + OutlinedTextField( + value = delayText, + onValueChange = { delayText = it }, + label = { Text("Show for (seconds)") }, + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), + modifier = Modifier.fillMaxWidth() + ) + } +} diff --git a/BTLib/src/com/offsetnull/bt/ui/EditorDialogScaffold.kt b/BTLib/src/com/offsetnull/bt/ui/EditorDialogScaffold.kt new file mode 100644 index 00000000..6730fdcf --- /dev/null +++ b/BTLib/src/com/offsetnull/bt/ui/EditorDialogScaffold.kt @@ -0,0 +1,53 @@ +package com.offsetnull.bt.ui + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp + +@Composable +fun EditorDialogScaffold( + title: String, + onSave: () -> Unit, + onCancel: () -> Unit, + saveLabel: String = "Done", + cancelLabel: String = "Cancel", + content: @Composable ColumnScope.() -> Unit +) { + Surface(color = MaterialTheme.colorScheme.surface) { + Column(modifier = Modifier.fillMaxWidth().padding(16.dp)) { + Text( + text = title, + style = MaterialTheme.typography.titleMedium, + color = MaterialTheme.colorScheme.onSurface, + modifier = Modifier.fillMaxWidth().padding(bottom = 16.dp) + ) + Column( + modifier = Modifier.fillMaxWidth().weight(1f, fill = false), + content = content + ) + Spacer(modifier = Modifier.height(16.dp)) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.End + ) { + TextButton(onClick = onCancel) { Text(cancelLabel) } + Spacer(modifier = Modifier.width(8.dp)) + Button(onClick = onSave) { Text(saveLabel) } + } + } + } +} From efbd9db8a79e5e64542f61f1d3518bee1221e80a Mon Sep 17 00:00:00 2001 From: James Power Date: Tue, 10 Mar 2026 16:49:43 -0400 Subject: [PATCH 2/8] Fix lint warnings and regenerate baseline. --- BTLib/AndroidManifest.xml | 5 +- BTLib/lint-baseline.xml | 5710 +---------------- .../drawable-hdpi/dialog_window_crawler.xml | 4 +- BTLib/res/drawable-ldpi/bell_alert.png | Bin 2475 -> 0 bytes BTLib/res/drawable-ldpi/button.png | Bin 607 -> 0 bytes BTLib/res/drawable-ldpi/button2.png | Bin 549 -> 0 bytes BTLib/res/drawable-mdpi/bell_alert.png | Bin 2475 -> 0 bytes BTLib/res/drawable-sw600dp/cancel_tiny.png | Bin 4709 -> 0 bytes BTLib/res/drawable-sw600dp/copy_tiny.png | Bin 5074 -> 0 bytes BTLib/res/drawable-sw600dp/down2d.png | Bin 788 -> 0 bytes BTLib/res/drawable-sw600dp/down2u.png | Bin 670 -> 0 bytes BTLib/res/drawable-sw600dp/homewidget.png | Bin 5025 -> 0 bytes BTLib/res/drawable-sw600dp/send2d.png | Bin 690 -> 0 bytes BTLib/res/drawable-sw600dp/send2u.png | Bin 630 -> 0 bytes .../res/drawable-sw600dp/sliderwidgetind.png | Bin 556 -> 0 bytes .../res/drawable-sw600dp/sliderwidgetinu.png | Bin 546 -> 0 bytes .../res/drawable-sw600dp/sliderwidgetoutd.png | Bin 572 -> 0 bytes .../res/drawable-sw600dp/sliderwidgetoutu.png | Bin 558 -> 0 bytes BTLib/res/drawable-sw600dp/swap.png | Bin 4668 -> 0 bytes BTLib/res/drawable-sw600dp/up2d.png | Bin 755 -> 0 bytes BTLib/res/drawable-sw600dp/up2u.png | Bin 617 -> 0 bytes BTLib/res/drawable-xlarge/cancel_tiny.png | Bin 4709 -> 0 bytes BTLib/res/drawable-xlarge/copy_tiny.png | Bin 5074 -> 0 bytes BTLib/res/drawable-xlarge/down2d.png | Bin 788 -> 0 bytes BTLib/res/drawable-xlarge/down2u.png | Bin 670 -> 0 bytes BTLib/res/drawable-xlarge/homewidget.png | Bin 5025 -> 0 bytes BTLib/res/drawable-xlarge/send2d.png | Bin 690 -> 0 bytes BTLib/res/drawable-xlarge/send2u.png | Bin 630 -> 0 bytes BTLib/res/drawable-xlarge/sliderwidgetind.png | Bin 556 -> 0 bytes BTLib/res/drawable-xlarge/sliderwidgetinu.png | Bin 546 -> 0 bytes .../res/drawable-xlarge/sliderwidgetoutd.png | Bin 572 -> 0 bytes .../res/drawable-xlarge/sliderwidgetoutu.png | Bin 558 -> 0 bytes BTLib/res/drawable-xlarge/swap.png | Bin 4668 -> 0 bytes BTLib/res/drawable-xlarge/up2d.png | Bin 755 -> 0 bytes BTLib/res/drawable-xlarge/up2u.png | Bin 617 -> 0 bytes BTLib/res/layout-land/bell_toast.xml | 1 + .../layout-land/button_properties_dialog.xml | 175 - .../button_properties_dialog_tabbed.xml | 277 - .../buttonset_settings_editor_dialog.xml | 68 +- BTLib/res/layout-land/connection_row.xml | 3 +- BTLib/res/layout-land/dialog_text_entry.xml | 7 +- BTLib/res/layout-land/input_controls.xml | 9 +- BTLib/res/layout-land/new_buttonset_entry.xml | 4 +- BTLib/res/layout-land/new_launcher_layout.xml | 23 +- BTLib/res/layout-land/newconnectiondialog.xml | 106 - .../plugin_info_dialog_content.xml | 7 +- .../plugin_info_dialog_list_row.xml | 3 +- .../plugin_infod_dialog_list_row.xml | 1 + .../res/layout-land/responder_ack_dialog.xml | 47 - .../responder_notification_dialog.xml | 109 - .../layout-land/responder_toast_dialog.xml | 53 - BTLib/res/layout-land/seekbar_widget.xml | 1 - BTLib/res/layout-land/timer_editor_dialog.xml | 34 +- .../layout-land/timer_selection_dialog.xml | 39 +- BTLib/res/layout-land/toast_override.xml | 2 +- .../res/layout-land/trigger_editor_dialog.xml | 23 +- BTLib/res/layout-land/tristate_widget.xml | 7 +- BTLib/res/layout-land/window_layout.xml | 2 +- BTLib/res/layout-sw600dp/input_controls.xml | 9 +- .../layout-sw600dp/responder_gag_dialog.xml | 101 - .../layout-sw600dp/timer_editor_dialog.xml | 34 +- .../layout-sw600dp/trigger_editor_dialog.xml | 23 +- BTLib/res/layout-sw600dp/window_layout.xml | 2 +- BTLib/res/layout-xlarge/input_controls.xml | 9 +- .../layout-xlarge/responder_gag_dialog.xml | 101 - .../res/layout-xlarge/timer_editor_dialog.xml | 34 +- .../layout-xlarge/trigger_editor_dialog.xml | 23 +- BTLib/res/layout-xlarge/window_layout.xml | 2 +- BTLib/res/layout/bell_toast.xml | 1 + BTLib/res/layout/better_list_row.xml | 14 +- BTLib/res/layout/button_properties_dialog.xml | 175 - .../button_properties_dialog_tabbed.xml | 277 - .../buttonset_settings_editor_dialog.xml | 66 +- BTLib/res/layout/connection_row.xml | 3 +- BTLib/res/layout/dialog_text_entry.xml | 7 +- .../editor_selection_filter_divider_row.xml | 3 +- .../res/layout/editor_selection_list_row.xml | 2 + .../editor_selection_list_row_toolbar.xml | 1 + BTLib/res/layout/input_controls.xml | 9 +- BTLib/res/layout/new_alias_dialog.xml | 13 +- BTLib/res/layout/new_buttonset_entry.xml | 4 +- BTLib/res/layout/new_launcher_layout.xml | 23 +- BTLib/res/layout/newconnectiondialog.xml | 106 - BTLib/res/layout/options_dialog_content.xml | 6 +- BTLib/res/layout/options_list_row.xml | 1 + .../res/layout/plugin_info_dialog_content.xml | 7 +- .../layout/plugin_info_dialog_list_row.xml | 3 +- .../layout/plugin_infod_dialog_list_row.xml | 77 + BTLib/res/layout/plugin_search_list_row.xml | 1 + BTLib/res/layout/plugins_dialog.xml | 2 +- .../preference_checkededitor_widget.xml | 7 +- BTLib/res/layout/responder_ack_dialog.xml | 47 - BTLib/res/layout/responder_color_dialog.xml | 354 - BTLib/res/layout/responder_gag_dialog.xml | 101 - .../layout/responder_notification_dialog.xml | 109 - BTLib/res/layout/responder_script_dialog.xml | 51 - BTLib/res/layout/responder_toast_dialog.xml | 53 - BTLib/res/layout/seekbar_widget.xml | 1 - .../layout/speedwalk_new_direction_dialog.xml | 12 +- BTLib/res/layout/speedwalk_row.xml | 57 +- BTLib/res/layout/timer_editor_dialog.xml | 34 +- BTLib/res/layout/timer_selection_dialog.xml | 39 +- BTLib/res/layout/toast_override.xml | 2 +- BTLib/res/layout/trigger_editor_dialog.xml | 23 +- BTLib/res/layout/tristate_widget.xml | 7 +- BTLib/res/layout/window_layout.xml | 2 +- BTLib/res/values/strings.xml | 19 +- .../bt/alias/AliasSelectionDialog.java | 1 + .../bt/button/ButtonSetSelectorDialog.java | 17 +- .../com/offsetnull/bt/launcher/Launcher.java | 4 +- .../plugin/settings/OptionsDialog.java | 4 +- .../bt/timer/TimerSelectionDialog.java | 3 +- .../bt/trigger/TriggerSelectionDialog.java | 3 +- .../bt/window/BaseSelectionDialog.java | 2 +- .../com/offsetnull/bt/window/MainWindow.java | 31 +- .../bt/window/PluginSelectorDialog.java | 2 +- BT_Free/AndroidManifest.xml | 1 + 117 files changed, 506 insertions(+), 8339 deletions(-) delete mode 100644 BTLib/res/drawable-ldpi/bell_alert.png delete mode 100644 BTLib/res/drawable-ldpi/button.png delete mode 100644 BTLib/res/drawable-ldpi/button2.png delete mode 100644 BTLib/res/drawable-mdpi/bell_alert.png delete mode 100644 BTLib/res/drawable-sw600dp/cancel_tiny.png delete mode 100644 BTLib/res/drawable-sw600dp/copy_tiny.png delete mode 100644 BTLib/res/drawable-sw600dp/down2d.png delete mode 100644 BTLib/res/drawable-sw600dp/down2u.png delete mode 100644 BTLib/res/drawable-sw600dp/homewidget.png delete mode 100644 BTLib/res/drawable-sw600dp/send2d.png delete mode 100644 BTLib/res/drawable-sw600dp/send2u.png delete mode 100644 BTLib/res/drawable-sw600dp/sliderwidgetind.png delete mode 100644 BTLib/res/drawable-sw600dp/sliderwidgetinu.png delete mode 100644 BTLib/res/drawable-sw600dp/sliderwidgetoutd.png delete mode 100644 BTLib/res/drawable-sw600dp/sliderwidgetoutu.png delete mode 100644 BTLib/res/drawable-sw600dp/swap.png delete mode 100644 BTLib/res/drawable-sw600dp/up2d.png delete mode 100644 BTLib/res/drawable-sw600dp/up2u.png delete mode 100644 BTLib/res/drawable-xlarge/cancel_tiny.png delete mode 100644 BTLib/res/drawable-xlarge/copy_tiny.png delete mode 100644 BTLib/res/drawable-xlarge/down2d.png delete mode 100644 BTLib/res/drawable-xlarge/down2u.png delete mode 100644 BTLib/res/drawable-xlarge/homewidget.png delete mode 100644 BTLib/res/drawable-xlarge/send2d.png delete mode 100644 BTLib/res/drawable-xlarge/send2u.png delete mode 100644 BTLib/res/drawable-xlarge/sliderwidgetind.png delete mode 100644 BTLib/res/drawable-xlarge/sliderwidgetinu.png delete mode 100644 BTLib/res/drawable-xlarge/sliderwidgetoutd.png delete mode 100644 BTLib/res/drawable-xlarge/sliderwidgetoutu.png delete mode 100644 BTLib/res/drawable-xlarge/swap.png delete mode 100644 BTLib/res/drawable-xlarge/up2d.png delete mode 100644 BTLib/res/drawable-xlarge/up2u.png delete mode 100644 BTLib/res/layout-land/button_properties_dialog.xml delete mode 100644 BTLib/res/layout-land/button_properties_dialog_tabbed.xml delete mode 100644 BTLib/res/layout-land/newconnectiondialog.xml delete mode 100644 BTLib/res/layout-land/responder_ack_dialog.xml delete mode 100644 BTLib/res/layout-land/responder_notification_dialog.xml delete mode 100644 BTLib/res/layout-land/responder_toast_dialog.xml delete mode 100644 BTLib/res/layout-sw600dp/responder_gag_dialog.xml delete mode 100644 BTLib/res/layout-xlarge/responder_gag_dialog.xml delete mode 100644 BTLib/res/layout/button_properties_dialog.xml delete mode 100644 BTLib/res/layout/button_properties_dialog_tabbed.xml delete mode 100644 BTLib/res/layout/newconnectiondialog.xml create mode 100644 BTLib/res/layout/plugin_infod_dialog_list_row.xml delete mode 100644 BTLib/res/layout/responder_ack_dialog.xml delete mode 100644 BTLib/res/layout/responder_color_dialog.xml delete mode 100644 BTLib/res/layout/responder_gag_dialog.xml delete mode 100644 BTLib/res/layout/responder_notification_dialog.xml delete mode 100644 BTLib/res/layout/responder_script_dialog.xml delete mode 100644 BTLib/res/layout/responder_toast_dialog.xml diff --git a/BTLib/AndroidManifest.xml b/BTLib/AndroidManifest.xml index 7c036b66..e2da3255 100644 --- a/BTLib/AndroidManifest.xml +++ b/BTLib/AndroidManifest.xml @@ -9,11 +9,10 @@ - + - diff --git a/BTLib/lint-baseline.xml b/BTLib/lint-baseline.xml index 0bb46f26..70de6c1c 100644 --- a/BTLib/lint-baseline.xml +++ b/BTLib/lint-baseline.xml @@ -1,176 +1,13 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -178,53 +15,26 @@ - - - - - - - - - @@ -235,7 +45,7 @@ errorLine1="agp = "8.13.2"" errorLine2=" ~~~~~~~~"> @@ -246,5518 +56,30 @@ errorLine1="agp = "8.13.2"" errorLine2=" ~~~~~~~~"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="IconDensities" + message="Missing the following drawables in `drawable-hdpi`: button.png, button2.png, hyperframe.9.png"> + file="res/drawable-hdpi"/> + id="IconDensities" + message="Missing the following drawables in `drawable-mdpi`: background.png, bell_alert.png, blowtorch_logo2.png, blue_frame_nomargin.xml, blue_frame_nomargin_nobackground.xml... (83 more)"> + file="res/drawable-mdpi"/> + id="IconMissingDensityFolder" + message="Missing density variation folders in `res`: drawable-xhdpi, drawable-xxhdpi"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + file="res"/> diff --git a/BTLib/res/drawable-hdpi/dialog_window_crawler.xml b/BTLib/res/drawable-hdpi/dialog_window_crawler.xml index 78a6746b..852837e2 100644 --- a/BTLib/res/drawable-hdpi/dialog_window_crawler.xml +++ b/BTLib/res/drawable-hdpi/dialog_window_crawler.xml @@ -3,6 +3,6 @@ - - + + \ No newline at end of file diff --git a/BTLib/res/drawable-ldpi/bell_alert.png b/BTLib/res/drawable-ldpi/bell_alert.png deleted file mode 100644 index efa48b06f0197159377de725fa1da54781429bd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2475 zcmV;c2~_rpP)002t}1^@s6I8J)%0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU*O-V#SRCwC#TwP2QR}>z0`QK&vk$=>} zN~ub>B8r0A7Aj5JH0`QslLl?ohtdbrRNmC~p(c&>4IASN4;5`B@xg*=YGb5g+E7re zLbpbuWI+S+|F^IU3(L0m%*@@+-kn)?XJ>Yq)sswypW$2Pn{&T=&Y5#BMZGYeEyACR z$5-d)qEiujDBU{YSk>RtCmC6Ypd@rUgpM!KksF2%1EhVANUINsEJV~EbUKfYq~~Ci zfrlMNq}>v_K;?xfAgS>=A&O#0O$)m3TE9FC{Xq*ll`n^`%5hNYoJGa3u{01xIR_$r zxwIa6*x_Z#Vm<1R5K7dxIV$FpDf%3d;8dLZ{5zwf7Jk!G3rz{s;+;5em!3p~eIrN~ zt5J=7f2m$?r!>dMsK}DJuo-ubjyP)eM20tStKe!_1TpLN@@Z7eo*63s_^2X1$rn$v z9L%AXx?^}nACZ;EN7hkvs^ud}b81-d!>l%~Nh!o=;%5ya2s@0!3NBf_WE=%UPj_L! z!=vWyvF3-5Uv2ogd2gGNyeKnmQ1kk>ma_c3M^#agiy0(gQNHQZ*xq0uaBPj5kkxBF%-NsufMcCI;{YOB)3+*kYKPDPu0RwA5{@RFs{xzB!c z^KoW5{?Q`S1AV@^FC&!L;9cZU1ij|7$WT1Z53l~RKYet}sB$_rbR-=aIsA9whT1>3 zZ#Bt*-Ck1sZKt77@PRKZ#Eg)kgkMz$x$MB@D>a$JBUNxS5Wm3@>2PEecbQIuH%N(1 zdjrDWarmw?iRZHteyDuOJn)n*V1`XG75H6<}KqQ*A&n$VQ*0f!|)Aq(q}P_Q?DF_Auxq`N1!zS!FS0lio3 zADLR_U}i?MBFM@f8m5PdD%&%ohte(--JB|wwRL-m-#3&pIi(l!D!_&z2-qFPo7xmX z78-&Yp}cGUBJ<=e3EH-?RVjW8aP0hiI-d1Nn>&|6pC^)&n#Ev;gsgbm9PiTy@x_|b zUb3Y@40iMalctcv5WE$?y}7%2lOz?Bpa!KL2|D}arxJC|J^I{XF_`M5B@Mq0CIyTg z8qY$}GpSkNRraO?`fGFUOQOX$W??~3&azx=u^t1~!AYXK;8t0K*ap!u~<8^vTtGlw3h4V44xPzVmVS#!Tj^83T{Ev-^ zlEY(zHVm=214&qXr3e&BkHy%5cx=eXN*f>7bHyD}8@MT`VE+1cML=ZXU>AF>y;0}F zmfEX=LRQqGL(3I+EWS_Htd?w+!kUFs8!54aN|wfI&BHeYqAq3np|i{|AxVydew&Q3 z1NGRDk)>X8YOx60*(X1emU>l+^uzTT$ZHo^VFzs4bXRV&V(oTXvz!){EB)v+6iV{s zaj?t9zO}2YNwH+%TGJw1vyv+P;KpxUY$-i9sATQ9eb>O%t3Xp5zW5FFN@{Gu>WR!l zP>bUqy1pdgl%8mr$zURO<`$sJDo3~wG|$3?Ic$TO>5_@B#%6PSW!9gQEqmjNtYqP^ z0h^dg=yG8L?OhUuA|WLU7v|&;-{{3f*ZW1WRn`?n7OpjcJ>d-IK*k_{7R^5A02E$p(91+UT*Efzi0-EHx4=4qYIELHkJVxwr?B;`X0 z8d>nPOFQm;%^e z#fH8r5*zv@NbGl-TdG$)S>P==p-nhD2w1A&c9`Ak^s# zPajt^alR-OHoOAEjsE^%ugI!HFf1ZrDJY*4Fj;8&rpFl6lXw;hG3m%alxxM+qkO&3 zvlebXb3Bak346sS(ombieO0#a()e%sbSiU3fuuia34{Yssi0q*@nFNxtzR)&54=!S z#BBIr!z*=knWQO!nmLq1*O#E(2hP*`)-bhqlw*f(h#4fm8+L#0HCvnRlzZfkygF7WwpGsYYpWtG@l- zPV;j5g^oHohJaky?^iaKkvb?enFwkYxn6jS;f|3CLo3jCyWJOV2KGjlM*}(T8Ndch zWXY$XbUU!`ypddFj^95Lc8g0^C;40E?Xi0!|E7)iYj*FtZU_gWK6<>px&54%qZY*PpI zBN&pnN~u)CeW$oxQ@~t1g?J-Na04H*My0fEp@1YuceK!+Gvw@7!SyO$vN-zHNQK8n zi2fQcQGyXXt6vr9IP;tl1sb)Pk0?RUBD}1eVs?_;6UHRfvqbfIyU6E#O4*?a#Jx#{ p#}=G0+`3pHpQ2uvwDz9>0{}z8&}ML(VtoJr002ovPDHLkV1kPawWI(5 diff --git a/BTLib/res/drawable-ldpi/button.png b/BTLib/res/drawable-ldpi/button.png deleted file mode 100644 index 656f0a0bccd962cf692d41fbe2c8c97355dbe83e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 607 zcmV-l0-*hgP)|!!Qul$C}AZ3ewRzWh!z5ZU84pZV*nu0k{E2$O%XXT}rxeg1Cdu9T`h9 zFT0Ur9NYO2CLWDP(yrd_zFnh=Y1O2_)GaIWy;399|qA7J5nZ6 zt}17NO!^(Al4``(j*WT7$g+n@9AtG%lu`?r2^{vz`$DAf1FV!03S>;G5og&%>sNLM zt~qzF^?S(8U|odK8%eS3g*h8bcrqH2-9AYD~Vs!6s%O!win5@~;dLH8IF5lq(Vu>TB`Whzs|Ly)=rZ zJ8n(MtseVvVy|v*wk>f;xjg!HI#e&3weWGuvsl{-&igbKy`_z6XdF@+$EC9lQ&n6$ td$>)=+h?(<37_jjr=(uAc`<(k7yu}6KV+b5Di{C&002ovPDHLkV1g!z2p|9e diff --git a/BTLib/res/drawable-ldpi/button2.png b/BTLib/res/drawable-ldpi/button2.png deleted file mode 100644 index 65e911b92bd53c135c9188578ff399395c10b832..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 549 zcmV+=0^0qFP)000vR0ssI2SMg^j00009a7bBm000*f z000*f0cW4mQUCw|8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0kTO% zK~#9!8?>!RaM|RWPIMvXI|~8m5Lp;@{pWlx9FOI0SK99%0HFSTwGwJI?=hzN008v>Tur+)8YNwS z0Pr^_da3K;QbSQ34!udop{v|(tJlEnm19JTL)LFVAMkf}z(D_P_*4y_f3uks?0qfeGAnNa{&08NfgpjecSpeBE5&^uFqOXYw#MM(^6+C1CuD&)7-RiEC zdI})TA%F3oPHhRfI$d*MCpm nE|oSLj_XkD;7q`E{0cAt7A=UEC-x<`00000NkvXXu0mjf9{c3m diff --git a/BTLib/res/drawable-mdpi/bell_alert.png b/BTLib/res/drawable-mdpi/bell_alert.png deleted file mode 100644 index efa48b06f0197159377de725fa1da54781429bd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2475 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 diff --git a/BTLib/res/drawable-sw600dp/cancel_tiny.png b/BTLib/res/drawable-sw600dp/cancel_tiny.png deleted file mode 100644 index ea255d940f33978fd34b01f3a6e72c53e0915914..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4709 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

cssQ)AAMM0FodS#!r@v~g!aBTnO# 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 S6#h;C000041^U zwiYlfRP7iz_y$ohynn)Q_b9{f?_?XmNJ+c%ucrGSZO{K~+yh+xe}2VsW*O7-s}!2U zNMRfNKabcSi)03Qvw;c-#`7zguWV-g^_2=nQKvs5uFYhf!^k5_*P`L&)&EDQFnoDU zwP2-U-;6~!lvT}(k&Wh^z5icd|2((w-;>i+PGZ#Ur!sPha2dq0OPSCvAiiB&`{VX@ zhTq?)pWSHDXJ-}B5Hw6<;i7WA`{T`x59eq7`}T%bMGx)9F9cKr_!V54SgBzCpYLzp zTwDJAviW#)vo8h*dK{Cv}k&sPSpU&AbltKL)ms$2j2g zBdkmu10D*{{_cRgV2}g^!|2%WXjqJf#b{U%4*&uT04G1E4QWXfOaK4?07*qoM6N<$ Eg7rl~pa1{> diff --git a/BTLib/res/drawable-sw600dp/homewidget.png b/BTLib/res/drawable-sw600dp/homewidget.png deleted file mode 100644 index a39c3cfc7aa83943c79809bd7701ddddb81264bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5025 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 QCjbBd07*qoM6N<$f;nm(xBvhE diff --git a/BTLib/res/drawable-sw600dp/sliderwidgetind.png b/BTLib/res/drawable-sw600dp/sliderwidgetind.png deleted file mode 100644 index 0410a14819b41d8c51e314ac1d4849b0fc419c9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 556 zcmV+{0@MA8P)c~B_i%H$ki+@^a&mLe%}u8cu2ZU+j%&Z*6wRJ0#O3

7=AGd1|E8G0Z_kfxVK5R8)vX|agC{@8Zz z^LXuzLu~3lXX~w^^~E8!%^rNL%x^LwO*vvIXlle_XoAE7Xqv=4XtKmiXv)M)=)BQK z!vK=3)wDF@qlaFTvC{&j{l9r^`#M@;Az5hXAvcgjEMy`w+)my-T7AXf^l6?|-jF<` z5D$hRk>y54D8`(o%+2#4%PqJ~lUw{Q2y#nJd}`dXtITM)!-rg?&nS28!w_;uGRX+( z^84u^90FAe4$BAJ=xbf0H0!f`f+B)tKC;}%2*rR7!kurl_&(qc&^ab7etaP%{}FZ8 uAFl$?N}Mo-kVEL;Nszr!JVxD00005PMw#s~_yCmBq^{Xn&Ma{&rw_q!c($Dt}m*NSY-fZtTFqxl0_#DQ~0&>)T)>v64# zoC{9#zB{foG!VyiTc*b&Ycm%PTIlEg<$uW)30pCAJl7oUb>PVQqih^NXWWpOv!mVi z&+=C3L|P&7*Uo8DUHG;ghB#VjMU6FDJ`j^2wIv7w*X0svg~Ws>0pxTJoM6ugwf%U)W+{aok+Fv!Wo`x-nQW)+&rW$Z%{laAq)(H`wQGsU~ zvzs-0pmlTRX`F8UiiprH^zMPpE&7%>87|m9&ff)1xTD2Yt~=Kxlt}!2It>Sb%wCte zd-Gg4Ms-_%d8FL~?%;2l&s}ar5*0va;W)ca&rRu!#$Ei_iKN^k8nhj+1ZXL~FlERw kI{k7ZOH*b10QoDx0KQ8U?x$>o&;S4c07*qoM6N<$f@E>>-~a#s diff --git a/BTLib/res/drawable-sw600dp/sliderwidgetoutd.png b/BTLib/res/drawable-sw600dp/sliderwidgetoutd.png deleted file mode 100644 index 6a71c764cf84e6742c51046856f1fca9749aebee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 572 zcmV-C0>k}@P)*zu5ZhRSW(7KyI=`lFnO}NM# zgzhG)oE~iMCbn`JRPH9BMm+a{14sg`RK?LG1lAO{!L2Syjz2(zRSi%9&{sf)k-!hK zEh5&@z<>b;56~cBPyquBtBZjF40IFFCZHN#)_<64fFTDAKOh4bmcS4t&mv+SJ*Zqv zl%ofmiwQe=5W1LvqX(yp@i}_Xx)`UU=iC=0Xi)hT3H&ZT_nw2Gi;1y_Kz9oc!eu_5 z`@mTM?4{#22q-(@j!37@3#={%mBfNSfOQS9JjUf>A}u1;(Li@hGkiv%Z_N9Ppc-Hu ziC+OR7Ex3q4$|H@a*uZiIC@BoFu@%Obu?t;W~czhp*R2u5MTh8dHDEpW z&(uk?vX70Jz)8eKJE_HPVz#|{K!odLbKS}5&&`uCH;yBYGrvx_If=OF*u%ATQ@{=p zE`EC&y}vTz6JhSiYklLJsuUh)LGS?jbkH@CTna{r+t zI{u#%yNTRkox-=8Z!g%w7H@ni>_nfcLnq>*Q5cj5fl#WzSP-MY=oDt-5p&G;`|mlZ z9O{Q1)DjgPE)f?kO3Xq_6RXhz#R{}cF@+W@4n=nswv~bGjU!s@%w&{eP9nwS*5GKh z>?AW*r9=e6tL^38_(eWY?5)JlHS`*+$6;b-A}$&ZuXWMik>B3PfgVXu;3WE2M-+NB w{_~1g1GE-*nEJ>b+P`z7%P@7k0r@S!0Mv#CdKSM&^Z)<=07*qoM6N<$f|PLmkN^Mx diff --git a/BTLib/res/drawable-sw600dp/swap.png b/BTLib/res/drawable-sw600dp/swap.png deleted file mode 100644 index 498872ebeebc92308095cd4334762e905927a32c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4668 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 diff --git a/BTLib/res/drawable-sw600dp/up2d.png b/BTLib/res/drawable-sw600dp/up2d.png deleted file mode 100644 index 198b1a9d3862ffe220f0c0a203f7c519fc99fda5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 755 zcmV%PumA=``RivRIV?IwrSv#BnMSh) z9E^s=pa~0gersEaSTRne!BTb(2oT{?(iis=V3z{2#RPO8d^&sS#m3+NevGWJU}5Ia zk_wO$Fa@%I!UQFS%|rxsZ@%31;LV|t5*9LI_R5l;tjwI)5&*A?T(Fp^`K>4GKYYG3 zoWp{TPgO}in1@^DF9XA0+{)P4j6uwZ89lvNHB6}Ldn6!?LF zl$D;C;nPQ3UOnA6e8NIV)|4w zf7eh73l0?z9*rO-RxT4B}W7?LS{y^5@OeOB9TtoN(u|Ut3`|VSkIoFD;Rk+6 z23C&$&#y9k|3r_lU}Rxq;uT?Jbp l1mI!88pAI%nl1nW3;@?xvez~3p)vpf002ovPDHLkV1oAGWjO!< diff --git a/BTLib/res/drawable-sw600dp/up2u.png b/BTLib/res/drawable-sw600dp/up2u.png deleted file mode 100644 index 134f4119625abcbeb30c2b0cac3a5f54310dc708..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 617 zcmV-v0+#)WP)JQ$Ux9PY$A-om{0`w zM${LAFb6{@h%<~?A7^J-AFN4j?m^hz4F*=%Caw2f$3Kd2}Q;Q1Ya6L1S| z!7XkWBuSEu%ZF-SXtje`lDWhQ+by77-;sJH_@rS}t!Vyp8BKqQoGn>2d%rA1_W9M7n zql<)?vRj`(_B3>NDUPF#m+@HvfB&5G8}0kDd_2}7#t|tp3f`;M?TQ6ADv}EwGq%W z1?9@({~fVk`|$G{c(!A|1!>gq^Ep-*wE3*9uSuWgVa~9}f+3lOUeZUs4mobaoGI+B z!lUhCTR`<8XnG8g?6?kukzhY|fSE3a1r%k$Qx7G#lUp*(NRZ0}V61=^5Q%~)gOUhi z6kjn)^J^yLQJ-K!Feu;fekZr!7TkhcaErU-T7UrnjzyvT=TbXA00000NkvXXu0mjf D7||8h diff --git a/BTLib/res/drawable-xlarge/cancel_tiny.png b/BTLib/res/drawable-xlarge/cancel_tiny.png deleted file mode 100644 index ea255d940f33978fd34b01f3a6e72c53e0915914..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4709 zcmbVQ2{csw|3(Peqm(d4C>ds~V;F@o$R3JNrkOD&W@%;^#*4@jO7E|1WlappT9(OD znxsNW#S}vJWD6ln{YKmSU*7Y3|L1?tx%Ym*_dL(@S?}kZd*huPti(iii}3L9h}l>p zj&ScLo2QT<_X=BoOX1#j(Jb9*E+k(X9Yw+Nm|;k#umBqZ3Wq&{MPWkDJjHSu0m?*jpN3>fFWRQu#PrF2Lv&M>FU71V8G7<$hAhn z_`;4LkUwp4cW|H|jYfuPYt!j;ExN82iGtIH7#SIDYUt>IxCjt6gh)dLgNRg>UkV5; z6-~jDX?PM5u&IbTMGBn{DmPn&=v5?49N71|Tq$TfiSsdlClk8}h%QTm%%RuX_Mu z@E4TZHy9KR^^af-8s`&7#I=> zF|ss5LJh!{h7gD)#9Rk#fz(GBA$1Lrh8AG6Ut9zU9k^M-UtG*zT%&*DI#Tf5*9R5w zcN$PjBM8#M(!x@os{(;QjKGHGMi3|%YJoHW>mwkW4f?%NVAgmlw+bOYTiykG=I1H^ z5BT02Fcf;Tec?d#X1%Z&;LpeSzlr)Et^VZF{jglY|4_ysmZ?8yj2Vubq5s??+FY-- zH{Y-y0ciiv*naF0SPDJ}i$PLI1gSn1SDp{+H44%XjX)*%x{|q3u)v(m@heB zp1|+yEK`&>wB7ZO>KYf^@#&Qs7vrv;&LF`*UT;m{lXaStC=DtZ-Ubq4=SJ;2CCRpk z`4dCG680{%aPw=snv&ee90V`T@N1^xGQyd|9ZOOj&RH+X|gbj z--}O+H|?x#lj@)}83*T6*kDJEXFsf~&H>7agx%^e)^ogBwxfAa2n^PEae!Y+dJI15 z8yQ=|R#$v&l`82OwO+rngY(%$BEI#oSKze15dS@R?1bL}xijA;_*2YI=c7lLF6ML| zYd?T6x+ol`dFClkFYG1^P)C;#N`8Cj$^5^(gfaQ%=WbOzaC_?LRekDQ@-~*xwugMZ zOS0iH=DZuLOAjxPwn@e#U>y%D-9=?(WzRnz4$Tqr=@mKF)zd9jEfspm9sy7s>%Z>k zmdlDS2|6%*rVC%3t3eUSJf7oLsP(+fI1Sc+1H||0{L6LwChRCSOX=m>{AmZ2Uxcj* z6tY83AF3vKe*0zJnq3>bEyd3|H5u+Qk%43z_TjYtAby}%smcQ1hHf6`X=!)Pi6_Bn zWpg95a&q4)CAt;+do3pCTv>DNxf>JBl=>r9^}qmd>zpbXkk1;|ujmnzv-IJ}@{du? za{s)s%<5cw8U6~G^aot^3dJ7@nfK^PT-GuNe zm2wa)|^`KPq);Dr`bdl!rI}X?H*=ppCBo_Q*#%I4d%)xZaQ^!SzOzG@^aFA zb)ugu&}aV}(XF@Ai!|$?02UM#PmF`Eq!Ty#w&mec+CExS6~gQv#q2r0AFL|PiaB}T zPC-2X)ps--S6=uSvw}ZLRW7kEsGC)Sw9=%-l3mI z-uU7in!a?X$Sxh+%|ucALJb?e9uvDQY{BrR&GhD%b?c#pwdh8 z3vP18L}0inV-GRB@WAA}84ZVNW`Xj&5RGp9I|I%8%BEDC8=prmf*X53FP{Azw>t`W z)Xu5zPP|A*@DkH9MQB+e{^?GK{C($jY&?R=OM93DrL2{TqnPwuR)&;>bwfQUD&v^j z`>HeJL&?r6yLhFOJ`OQ!Pp}70(+AasZnOHw-wA~ypJ(f-TpEU^EW_SCgaNMx ztGl?;YELa{**flJ7B%eM9dfsKpwzr%6=T_BP#CdX0inz1NIH!M$!z^-ru0fswEwK=SS#RD9kq#^q<&&<T$br>;yStgOVu7_Ex&Xd$24fhu&R)$ zrjPxgSFw0>oPR8T$qkFTvX@cOT}>KAAZDg-S3yAj3tw-wE&M26&*P^k!fY+0}oCc9u71B z?_604H5B1&|4LwHF0J~T_Y*T9tlzE@rGb*54H5aiT&F7hUVX(|zI5YI?UeSY$ z6(Xu(fg!UiY<2NLwM%(ZCe6`g0ox}e-O2ob@SJUE8}>E9i_6b{l`>c7tJUZ_^vp-E zQcum!(O*q@UAV>E)#(|kucl1iVONCWoin9xYwOwWa-X}tE}nYP6q&AbRn=eq(bH~d zUPJ7M;)JHL+@^(I8+eVCtxXqZ*Ng+dgGPyc{nt81j~5}8m*mgiPneT^eRH_u5ni36 zBR@{}MT-?n4ANqW5i8wCZ)+7oL&z?q_Fg%wXpVGWecfVk2~YNTM(p#uBF4$bN!QW% zx?#oGcDw9^>r@B^-@H7O2uuF z7|rGF>dAJ!&~N8u!u5T06*Io*b(gKRXYTwcX;87SPosM!FRwUptIbAOhm*$b#hC=n zX6B8XH-%p*h487Tls^(X=sy&iDv{OoShFei0{d|`C+K@98b5wqH>U#AfWLekN)KZahY-6cMQQ;D9el3tE_Z+FwwYKps@SCA& zz}wYml|vj)8L3tGvCF5K2GzoMa<0Y|D>h!g=bp3`DP=GPw7pwYP$V7%Vw$(JmoNCW zOt+afTj=^ihK-@h$T#Sh)`p(eg_>-3I$)}JM@&Ik!+~|Nt&3Sf=dD@_zG<}VWMR&#B0 zlRF&|B_CG}cqEcx*VCYOBW{dxp+yFKaQGg(RnKB-ykU7wvco`CBqHco0Ku)w zuV3%-1{R&quWIl7XcSj7n0XKHS|RlW9Pfdu&Vad26Iqdg>q+Qqay9K+FM2^^DK(Gc zK$2B|@{i^BtuhMAnAvGDTf|C~L~pSLZ)!0#NAEEd_^edZQ*@Cb9wlk5<3;0 zsZ4rJqWxI|(7ybSIkr3B2u{{zkK+POpHMq|@8%J&ag?X-Uu#sbg@-7jYWKW0mdI>c z(m#?E3K-R79T#+%dT9Qx=cwTV8$-SyQkyWH71iaSL z^0zK@SBOw`XEFj`Mt@pWYJXNW)ah8aYqHhq&P+s_ad*yR->GYpEQcffsHwzU(|wZ6 zO9Y94-MpN%#Hc2n!ito)D;G-wg4;gL6u$bV`0f&8t&!LN^WI%?Jxi%io`9FVt?sQy z4m&7hR+bqVV8m{spvP`6#h&|W6E9i6#kkqVMT?m4^MQBIBQ&_ zUP+CzzVXFzP<%^mb)#_P%2F`<8H_md1c%Dq3PAt#*|zG0nYm`bXrPHK!5w?PIkrml4?WnH}``d zBjl}{BD(K%ovOU5eVH*z=&ZEf=A5uJ%_+AS%v+Qg+WZ3eZyyA+ z+MAie(IkQbY7e8}NAP5@8Dctqo+z{jmI`#iy5WdgpvAh!ARrE-1+r5ygP3_Du3P~rU-?Bp=xj?7#sot{yaboYh;Wo z+*;4zr!B@#3*=6vdcqYIeSLiue3cYPWH&{qhK9zT1`GyfAixxVA{FHaCQ_t-Dd=G- zXfn=|iX#z$dx|I*k~dWg#PIY-2n5gHvP8qNpS?l0?G)Dww4^iAtillRSY48x^1(j))=o zQua*!L}T?(RIC<=Q92kH0t3TTk&MzQL*Ot~FhreEz#mXE5(ek$|G%LOgbG|mRUWGP zZz!X0FeobOAHf(j+?7Nopctvb?X|k1C(-S@H8V4~F_A(=5z$y;G4f?%N;6^wKqYC~%Tiyoi^>c;C z0l)VK9EIL%Uo8-NuU=RT=;veH-$eb7R)2DR-LVY8|5C;umMK4HjIJ9aL;t-;6d7JC z?!93@0#N+V*naHwuw z&@nc@M-FJ(rz5=TOzLpWv

cssQ)AAMM0FodS#!r@v~g!aBTnO# zaLcOz5dmfnu*g|gr@+7wQiH~NgQVxt;*+;4CsT@wO9N)+z+*LIn=h;D`Av>(X$H%L zywv6j69p&&E&%EQeoRZu<7`hvKcchOh4c2&m$pjzDd*&8c+!|s4j}wEj!h2PjwxmC zV{Z8x{p}&Z^U*F7y*$+q`(YcJv85KStclM&9%&~f!K)~GB-A_gqt8Y~XN70qnwMYqykQzDB3$`+-A-?;jIf1=`tQW_7^76(j z0-aX0H#_)Augech4Py^g-y?TdAJ@BeB0nemiAd_8?7Ou&JMh-47dN@)A9RJ_36nJH zTi#QKZ0{Ec8DY{-t5SNJbLRz?1MUNtHbF%wNcz(Wfg z?tpuT(*x)E2nuTYx*F`(6~@$TfoF@wGrqy?W6RFIK5ZkzNs7TiHe}H|pONEtC@k8% z@Gjn^ntGG3JzKQhojYF5%1~pqyXV_H<0+^amn1X zm*on(hc7&_Q(~^xQS^FKeHlFLM9zNee|k-#{pP{PqWxzaw(rp^Q5-23C$`tO%vJ+K zzhZ)MHRpk9z;Pi2o}Y(!{=Ky0SeTa!^Sp5v2dvlV$a`@E((rR-$R+sA|nB+FuagsF}iId6Y)ewpAxsgf>Vb7p=S!F1ymNS5Y*v(2h{yvu$+fyGr+tu*e$ z1Yeo?ov-zkr_>@9WX2PVXrO!pSptn4S#VykjRUG;O{P zan}f_j!vE;fSG7D%XV`rJoxmm>N^o9mlsYJ@phZOth7mD%dhW~KwarxT(rNX7Wr)k z;*9u&$knB=2(U$p&uteh4&;;(R{e2~tp{($4l6~?pWwP(!J>axvA^@=Jy#%4;=_^3 zhxCSzhpWoBMe{371(4w z(P?-!n|+Wgq#dHb?)=FQ+x!hr8+(?Xy1}RABclo=#&+N32Z_&!o9UW!RgOVox|5aH z)O|5mbBoPhHFTye+LkAonnbt_g{viRydPAKUoDEhG2`I46@M~$w6HN4F%g}bbCT;EMu|pOyYZw(a~9n_g$B_nq+n^>dT(?=Fn-{J-yVpRp`pE40>gIVSJ3&FJ`;8 zR`S+gH$-R|Rf-LBrH=_Gol0EfE;f8|z(G4%RV0^WFju~OIl{_O_TiyGyg*Q}?+NxR zxJ_$zd{ctSX=T5i2oA5l)?~K|Q$jG^$0%Q3lGz5f8tKT2pVhA_{KMWM9F1lQ(fs4> zqoLL*Fq>m(B+W@%@WnY%j{T`m1K*;aiqLC8(=G09j{8_Mx^aKTn^l zJj2X`8Ss=_4IvWm>+mM*yiwQO|G znsb;O+N#U#f%kXkgj$Ei2EHB8OmPbDO$DDSYLk#*V-oMH8K5*`n+sWo8`}m_=upe^ zA?FsQpL8SNX>xU}uy-(z_E#D$<4E3VkCInMg9FcRO?rvbU)!}kP^~n9Am6bdjJF88 z)_;t^u7a3wi3+&m1yQwqvCG|om;+Lh+3!ML=be6sz8SuYul9tIKt*#M=tbm9v&3rw zY32492`g*-p>Y@U*m>ro@6Zpzn?0MJXvtlcHx!CngVKBVPm$7uUnG1c_-(%cbu_Ae zNZof|Bg-=1SQ>YWvU@ayu#0lcI(Aq}MbfMRY-}1UzVYd~vgD`ECS#5fi&jMZpW}(v z-8YiG4fLuC!oI=ZU1#P_>k$+mO3VMuz7?#a_1Oj1;u4NDOJAaJV3d%qPYYjrPNbtK zu-leqJ?gnJn#H*}=;L*WfGF6&ipE!pYxZd*TrR^6L!a<{5kbNFy^$DULlUJBl z06B{fA68bj?(p7+bp_zBu*Jl?|M^#z9VS^r$)W0o z5P{RBpn)pZx>)Pc*LYrUP7k1@(3j1`b~pag`x8UFn~(hab+fv9MpykulQLT~3Z4=- zN=gfY&ou17=I{7qN#io#?U;-#3fu!VaEH*uAzBKVfb7#{tmn}Ox-4;U^Hk6CwaisX z{38}!GyG~o(gu`wh{l9=`kB58g~2YlsFcSworZ;XZ@nnBvVBC1bLf27E;|+)791X? zl68|eZER!K#AZWkBJY82LRSPmaVlu4qr&>Qf0LO)D)ZUQSPEEG7~?IK-R-sp41 zxoC(l_Cfr3GxE<5(YMuKy*}IB#QDG(>M-5U_MmkNIQq%U)}e%%TBu*ysFn@ zwSRDV|3{q88tm;r9Y@3deheGdlcP|o=#xN^L|18&uIYI#LtoQ~Gh9sVUCwf1yi93r zw>!%=T9IJ~)^n3nZx#s=9Z8$17hJaVXR~)x+%5rzw(ke=xeEd=QH(cTRuOD_iu%XIl{DQgAt5`#!M_>*R8`T-T|$5DCI z^|-nFD;wdP2dZY+)B_TWc!DQVmFoJ1WfqJ_pAj$hj|estSK3JowP^PyCCF%HP6W`V zZ>tr{$Lk%ptgUhO7BQ3mMo80A)vJ^I##(-Hc)2FIg1KlgVykJbZ}~_}oDQdE$Gp;F zjq-d*<@;$n$w#+8dX4bIZR#E3a^KIEOx5JkI0EYCChmQl1goyKwGGH8SmhR$_^n^t zDvHA5oHWF@bEDL7cFScU*WSmS9iZ5|wDnWB`#o%YBe+#oLSa{V{}3)cha24-&l-H+ zs}lKC@4%3AFX>S%VcYzwT*(J7QEXoj(&$a7bN!?x^90UE96eK)>s?h~cUW>36|o#7 z7j-?=L5F9i{+mu#!)3O%My}1NCa#bbzP>Y?8SN#s#vO^8qHk0iXzMF^L1hozx+OPYpj#4jpeFyAzCBx8gh#brPm{ODu)hznc7|(xo(d zHyOiOB^ov?mO4}L+%GAe$Ax5P>Q^LIO%hM*cqnytW%*^@L5^>i#+wPk@4vMbOvJ3~ za_g+yjPV*SMhZXNb@Ah!O75bzMy>ILWd?rKlO?Ce93YN%{pNfY_6FJ zTQZp4*7Mlt1vu??+OlX@N9{&cW0AgGwg_6=pO>BBL8=1*K{ECl%7P;D4_~mFJV%~V zAMtlM-!I*D?<~IYVbJw*S=#k3pyd?*E8fqtyd`Up1*^~9Pxoc)>k<}OAcLy-y18!f zz>}}(HKlYPEY6QWP)%PumA=``RivRIV?IwrSv#BnMSh) z9E^s=XjtGXJBb90j7&g0R6O?o|34t6RagK`XJTPzV&`UH9Mq}l|KC6VetaP{AV>=f zAo%zD=f8h{nFM7Rc|-U0A@c;Ku48TM|(>wwNz)*klfB_irs&)(QsE- z<<)=dGFfy(S=GE4*|=z4Q+$2>^W4J!Pfib5`+^|&b9wdOyZgBe;@G83XcrLQuC4uX zdppDLZv)xZA}Yqdz4>~q@0W;%pkW#d7nSSXA8&4aI6v#(w>Jad?j#=keskm1?jixz z0Dc8mCRQqBnLpp(yt%gg`^$5Kr43Fh_;7o}m&b?2)g$;s4Jk3_)xAycAMO74=Q{(9 z0Siq{|MTPR(~DC-2&lKHmD~<#84HU{L`ABdqtIZGZCOz~8^$8R!dG=xN!{ zU+=Eoo-N3uqAM54#U_NQ;O&ND`?t(!Q5DcSZzoTJ+ySxx*VTtAw9Lb>o3;}ppu*UEUjiw8L00RJ6Z~wh~ S6#h;C000041^U zwiYlfRP7iz_y$ohynn)Q_b9{f?_?XmNJ+c%ucrGSZO{K~+yh+xe}2VsW*O7-s}!2U zNMRfNKabcSi)03Qvw;c-#`7zguWV-g^_2=nQKvs5uFYhf!^k5_*P`L&)&EDQFnoDU zwP2-U-;6~!lvT}(k&Wh^z5icd|2((w-;>i+PGZ#Ur!sPha2dq0OPSCvAiiB&`{VX@ zhTq?)pWSHDXJ-}B5Hw6<;i7WA`{T`x59eq7`}T%bMGx)9F9cKr_!V54SgBzCpYLzp zTwDJAviW#)vo8h*dK{Cv}k&sPSpU&AbltKL)ms$2j2g zBdkmu10D*{{_cRgV2}g^!|2%WXjqJf#b{U%4*&uT04G1E4QWXfOaK4?07*qoM6N<$ Eg7rl~pa1{> diff --git a/BTLib/res/drawable-xlarge/homewidget.png b/BTLib/res/drawable-xlarge/homewidget.png deleted file mode 100644 index a39c3cfc7aa83943c79809bd7701ddddb81264bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5025 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 QCjbBd07*qoM6N<$f;nm(xBvhE diff --git a/BTLib/res/drawable-xlarge/sliderwidgetind.png b/BTLib/res/drawable-xlarge/sliderwidgetind.png deleted file mode 100644 index 0410a14819b41d8c51e314ac1d4849b0fc419c9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 556 zcmV+{0@MA8P)c~B_i%H$ki+@^a&mLe%}u8cu2ZU+j%&Z*6wRJ0#O3

7=AGd1|E8G0Z_kfxVK5R8)vX|agC{@8Zz z^LXuzLu~3lXX~w^^~E8!%^rNL%x^LwO*vvIXlle_XoAE7Xqv=4XtKmiXv)M)=)BQK z!vK=3)wDF@qlaFTvC{&j{l9r^`#M@;Az5hXAvcgjEMy`w+)my-T7AXf^l6?|-jF<` z5D$hRk>y54D8`(o%+2#4%PqJ~lUw{Q2y#nJd}`dXtITM)!-rg?&nS28!w_;uGRX+( z^84u^90FAe4$BAJ=xbf0H0!f`f+B)tKC;}%2*rR7!kurl_&(qc&^ab7etaP%{}FZ8 uAFl$?N}Mo-kVEL;Nszr!JVxD00005PMw#s~_yCmBq^{Xn&Ma{&rw_q!c($Dt}m*NSY-fZtTFqxl0_#DQ~0&>)T)>v64# zoC{9#zB{foG!VyiTc*b&Ycm%PTIlEg<$uW)30pCAJl7oUb>PVQqih^NXWWpOv!mVi z&+=C3L|P&7*Uo8DUHG;ghB#VjMU6FDJ`j^2wIv7w*X0svg~Ws>0pxTJoM6ugwf%U)W+{aok+Fv!Wo`x-nQW)+&rW$Z%{laAq)(H`wQGsU~ zvzs-0pmlTRX`F8UiiprH^zMPpE&7%>87|m9&ff)1xTD2Yt~=Kxlt}!2It>Sb%wCte zd-Gg4Ms-_%d8FL~?%;2l&s}ar5*0va;W)ca&rRu!#$Ei_iKN^k8nhj+1ZXL~FlERw kI{k7ZOH*b10QoDx0KQ8U?x$>o&;S4c07*qoM6N<$f@E>>-~a#s diff --git a/BTLib/res/drawable-xlarge/sliderwidgetoutd.png b/BTLib/res/drawable-xlarge/sliderwidgetoutd.png deleted file mode 100644 index 6a71c764cf84e6742c51046856f1fca9749aebee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 572 zcmV-C0>k}@P)*zu5ZhRSW(7KyI=`lFnO}NM# zgzhG)oE~iMCbn`JRPH9BMm+a{14sg`RK?LG1lAO{!L2Syjz2(zRSi%9&{sf)k-!hK zEh5&@z<>b;56~cBPyquBtBZjF40IFFCZHN#)_<64fFTDAKOh4bmcS4t&mv+SJ*Zqv zl%ofmiwQe=5W1LvqX(yp@i}_Xx)`UU=iC=0Xi)hT3H&ZT_nw2Gi;1y_Kz9oc!eu_5 z`@mTM?4{#22q-(@j!37@3#={%mBfNSfOQS9JjUf>A}u1;(Li@hGkiv%Z_N9Ppc-Hu ziC+OR7Ex3q4$|H@a*uZiIC@BoFu@%Obu?t;W~czhp*R2u5MTh8dHDEpW z&(uk?vX70Jz)8eKJE_HPVz#|{K!odLbKS}5&&`uCH;yBYGrvx_If=OF*u%ATQ@{=p zE`EC&y}vTz6JhSiYklLJsuUh)LGS?jbkH@CTna{r+t zI{u#%yNTRkox-=8Z!g%w7H@ni>_nfcLnq>*Q5cj5fl#WzSP-MY=oDt-5p&G;`|mlZ z9O{Q1)DjgPE)f?kO3Xq_6RXhz#R{}cF@+W@4n=nswv~bGjU!s@%w&{eP9nwS*5GKh z>?AW*r9=e6tL^38_(eWY?5)JlHS`*+$6;b-A}$&ZuXWMik>B3PfgVXu;3WE2M-+NB w{_~1g1GE-*nEJ>b+P`z7%P@7k0r@S!0Mv#CdKSM&^Z)<=07*qoM6N<$f|PLmkN^Mx diff --git a/BTLib/res/drawable-xlarge/swap.png b/BTLib/res/drawable-xlarge/swap.png deleted file mode 100644 index 498872ebeebc92308095cd4334762e905927a32c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4668 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 diff --git a/BTLib/res/drawable-xlarge/up2d.png b/BTLib/res/drawable-xlarge/up2d.png deleted file mode 100644 index 198b1a9d3862ffe220f0c0a203f7c519fc99fda5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 755 zcmV%PumA=``RivRIV?IwrSv#BnMSh) z9E^s=pa~0gersEaSTRne!BTb(2oT{?(iis=V3z{2#RPO8d^&sS#m3+NevGWJU}5Ia zk_wO$Fa@%I!UQFS%|rxsZ@%31;LV|t5*9LI_R5l;tjwI)5&*A?T(Fp^`K>4GKYYG3 zoWp{TPgO}in1@^DF9XA0+{)P4j6uwZ89lvNHB6}Ldn6!?LF zl$D;C;nPQ3UOnA6e8NIV)|4w zf7eh73l0?z9*rO-RxT4B}W7?LS{y^5@OeOB9TtoN(u|Ut3`|VSkIoFD;Rk+6 z23C&$&#y9k|3r_lU}Rxq;uT?Jbp l1mI!88pAI%nl1nW3;@?xvez~3p)vpf002ovPDHLkV1oAGWjO!< diff --git a/BTLib/res/drawable-xlarge/up2u.png b/BTLib/res/drawable-xlarge/up2u.png deleted file mode 100644 index 134f4119625abcbeb30c2b0cac3a5f54310dc708..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 617 zcmV-v0+#)WP)JQ$Ux9PY$A-om{0`w zM${LAFb6{@h%<~?A7^J-AFN4j?m^hz4F*=%Caw2f$3Kd2}Q;Q1Ya6L1S| z!7XkWBuSEu%ZF-SXtje`lDWhQ+by77-;sJH_@rS}t!Vyp8BKqQoGn>2d%rA1_W9M7n zql<)?vRj`(_B3>NDUPF#m+@HvfB&5G8}0kDd_2}7#t|tp3f`;M?TQ6ADv}EwGq%W z1?9@({~fVk`|$G{c(!A|1!>gq^Ep-*wE3*9uSuWgVa~9}f+3lOUeZUs4mobaoGI+B z!lUhCTR`<8XnG8g?6?kukzhY|fSE3a1r%k$Qx7G#lUp*(NRZ0}V61=^5Q%~)gOUhi z6kjn)^J^yLQJ-K!Feu;fekZr!7TkhcaErU-T7UrnjzyvT=TbXA00000NkvXXu0mjf D7||8h diff --git a/BTLib/res/layout-land/bell_toast.xml b/BTLib/res/layout-land/bell_toast.xml index 0c9e41cd..b315e16c 100644 --- a/BTLib/res/layout-land/bell_toast.xml +++ b/BTLib/res/layout-land/bell_toast.xml @@ -7,5 +7,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/bell_alert" + android:importantForAccessibility="no" /> diff --git a/BTLib/res/layout-land/button_properties_dialog.xml b/BTLib/res/layout-land/button_properties_dialog.xml deleted file mode 100644 index d187fc40..00000000 --- a/BTLib/res/layout-land/button_properties_dialog.xml +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -