X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=src%2Forg%2Fpileus%2Fspades%2FMain.java;h=502d5ae9b735e8da076d26461fe84be0c66cc0fd;hb=65de4b5e7e794a58727dac5eff40e484a5380285;hp=d8d79b4da2f36351b7e3b86f5a7c9413e49a352d;hpb=6273d89ab9dea6b849bbebe97526870d41a8879e;p=~andy%2Fspades diff --git a/src/org/pileus/spades/Main.java b/src/org/pileus/spades/Main.java index d8d79b4..502d5ae 100644 --- a/src/org/pileus/spades/Main.java +++ b/src/org/pileus/spades/Main.java @@ -1,14 +1,376 @@ package org.pileus.spades; import android.app.Activity; +import android.content.Intent; import android.os.Bundle; +import android.os.Handler; +import android.os.Messenger; +import android.text.Html; +import android.text.method.ScrollingMovementMethod; +import android.text.format.DateFormat; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.ScrollView; +import android.widget.TabHost; +import android.widget.TabWidget; +import android.widget.TextView; +import android.widget.Toast; public class Main extends Activity { + /* Private data */ + private Handler handler; + private Messenger messenger; + private Task task; + private Toast toast; + private boolean running; + private String topic; + private String names; + private Cards cards; + + /* Widgets */ + private TabHost window; + private TabWidget tabs; + private LinearLayout chat; + private TextView log; + private EditText input; + private Button send; + private LinearLayout spades; + private TextView debug; + + private ScrollView lscroll; + private ScrollView dscroll; + + /* Private helper methods */ + private void notice(String text) + { + this.log.append(Html.fromHtml("*** " + text + "
")); + } + + private void display(Message msg) + { + String when = DateFormat.format("hh:mm:ss", msg.time).toString(); + String from = String.format("%s", msg.from); + String text = msg.msg; + String fmt = null; + + // Do IRC Colors - only partly works + String fg = "\">"; + text = text + .replaceAll("&", "&") + .replaceAll("<", "<") + .replaceAll(">", ">"); + text = text + .replaceAll("\\002", "") // bold + .replaceAll("\\011", "") // italic + .replaceAll("\\025", ""); // underline + text = text + .replaceAll("\\003(\\d+)(,\\d+)?", fg) // color + .replaceAll("\\013(\\d+)(,\\d+)?", fg); // color + text = text + .replaceAll("<0?0>", "#000000") // White + .replaceAll("<0?1>", "#000000") // Black + .replaceAll("<0?2>", "#000080") // Navy Blue + .replaceAll("<0?3>", "#008000") // Green + .replaceAll("<0?4>", "#FF0000") // Red + .replaceAll("<0?5>", "#804040") // Brown + .replaceAll("<0?6>", "#8000FF") // Purple + .replaceAll("<0?7>", "#808000") // Olive + .replaceAll("<0?8>", "#FFFF00") // Yellow + .replaceAll("<0?9>", "#00FF00") // Lime Green + .replaceAll("<10>", "#008080") // Teal + .replaceAll("<11>", "#00FFFF") // Aqua Light + .replaceAll("<12>", "#0000FF") // Royal Blue + .replaceAll("<13>", "#FF00FF") // Hot Pink + .replaceAll("<14>", "#808080") // Dark Gray + .replaceAll("<15>", "#C0C0C0"); // Light Gray + + // Message formatting + switch (msg.how) { + case DIRECT: + case MENTION: + case PRIVMSG: + fmt = "(%s) %s: %s"; + break; + case SENT: + fmt = "(%s) %s: %s"; + break; + default: + fmt = "(%s) %s: %s"; + break; + } + + String html = String.format(fmt, when, from, text); + this.log.append(Html.fromHtml(html + "
")); + } + + /* Private handler methods */ + private void onRegister(Task task) + { + Os.debug("Main: onRegister"); + this.task = task; + this.running = this.task.isRunning(); + for (Object obj : this.task.getLog()) { + if (String.class.isInstance(obj)) + this.notice((String)obj); + if (Message.class.isInstance(obj)) + this.onMessage((Message)obj); + } + } + + private void onMessage(Message msg) + { + // Debug + this.debug.append("> " + msg.line + "\n"); + this.dscroll.smoothScrollTo(0, this.debug.getBottom()); + + // Chat + switch (msg.type) { + case PRIVMSG: + this.display(msg); + break; + case TOPIC: + if (!msg.txt.equals(this.topic)) + this.notice("Topic for " + msg.arg + ": " + msg.txt); + this.topic = msg.txt; + break; + case NAMES: + if (!msg.txt.equals(this.names)) + this.notice("Users in " + msg.arg + ": " + msg.txt); + this.names = msg.txt; + break; + case ERROR: + this.notice("Error: " + msg.txt); + break; + case AUTHOK: + this.notice("Authentication succeeded: " + msg.txt); + break; + case AUTHFAIL: + this.notice("Authentication failed: " + msg.txt); + break; + } + this.lscroll.smoothScrollTo(0, this.log.getBottom()); + } + + private void onNotify(String text) + { + Os.debug("Main: onNotify - " + text); + this.notice(text); + this.toast.setText(text); + this.toast.show(); + } + + /* Private service methods */ + private void register() + { + Os.debug("Main: register"); + startService(new Intent(this, Task.class) + .putExtra("Command", Task.REGISTER) + .putExtra("Messenger", this.messenger)); + } + + private void connect() + { + Os.debug("Main: connect"); + startService(new Intent(this, Task.class) + .putExtra("Command", Task.CONNECT)); + this.running = true; + } + + private void disconnect() + { + Os.debug("Main: disconnect"); + startService(new Intent(this, Task.class) + .putExtra("Command", Task.DISCONNECT)); + } + + private void exit() + { + stopService(new Intent(this, Task.class)); + } + + /* Widget callback functions */ + public void onSend(View btn) + { + if (this.task == null) + return; + String txt = this.input.getText().toString(); + Message msg = this.task.send(txt); + if (msg == null) + return; + this.input.setText(""); + } + + /* Activity Methods */ @Override public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.main); + try { + super.onCreate(savedInstanceState); + Os.debug("Main: onCreate"); + + // Setup main layout + this.setContentView(R.layout.main); + + // Setup toast + this.toast = Toast.makeText(this, "", Toast.LENGTH_SHORT); + + // Setup communication + this.handler = new MainHandler(); + this.messenger = new Messenger(this.handler); + + // Find widgets + this.window = (TabHost) findViewById(android.R.id.tabhost); + this.tabs = (TabWidget) findViewById(android.R.id.tabs); + this.chat = (LinearLayout) findViewById(R.id.chat); + this.log = (TextView) findViewById(R.id.log); + this.input = (EditText) findViewById(R.id.input); + this.send = (Button) findViewById(R.id.send); + this.spades = (LinearLayout) findViewById(R.id.spades); + this.debug = (TextView) findViewById(R.id.debug); + + this.lscroll = (ScrollView) findViewById(R.id.log_scroll); + this.dscroll = (ScrollView) findViewById(R.id.debug_scroll); + + // Add window tabs + this.window.setup(); + + this.window.addTab(this.window + .newTabSpec("chat") + .setIndicator("Chat") + .setContent(R.id.chat)); + this.window.addTab(this.window + .newTabSpec("spades") + .setIndicator("Spades") + .setContent(R.id.spades)); + this.window.addTab(this.window + .newTabSpec("debug") + .setIndicator("Debug") + .setContent(R.id.debug)); + + // Setup OpenGL view + this.cards = new Cards(this); + this.spades.addView(cards); + + // Attach to background service + this.register(); + + } catch (Exception e) { + Os.debug("Error setting content view", e); + return; + } + } + + @Override + public void onStart() + { + super.onStart(); + Os.debug("Main: onStart"); + } + + @Override + public void onResume() + { + super.onResume(); + Os.debug("Main: onResume"); + } + + @Override + public void onPause() + { + super.onPause(); + Os.debug("Main: onPause"); + } + + @Override + public void onStop() + { + super.onStop(); + Os.debug("Main: onStop"); + } + + @Override + public void onRestart() + { + super.onRestart(); + Os.debug("Main: onRestart"); + } + + @Override + public void onDestroy() + { + super.onDestroy(); + Os.debug("Main: onDestroy"); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) + { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.main, menu); + return true; + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) + { + menu.findItem(R.id.connect).setVisible(!this.running); + menu.findItem(R.id.disconnect).setVisible(this.running); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) + { + switch (item.getItemId()) { + case R.id.connect: + this.connect(); + return true; + case R.id.disconnect: + this.disconnect(); + return true; + case R.id.settings: + this.startActivity(new Intent(this, Prefs.class)); + return true; + case R.id.exit: + this.exit(); + this.finish(); + return true; + default: + return false; + } + } + + /* Handler class */ + class MainHandler extends Handler + { + public void handleMessage(android.os.Message msg) + { + switch (msg.what) { + case Task.REGISTER: + Main.this.onRegister((Task)msg.obj); + break; + case Task.MESSAGE: + Main.this.onMessage((Message)msg.obj); + break; + case Task.CONNECT: + Main.this.running = true; + break; + case Task.DISCONNECT: + Main.this.running = false; + break; + case Task.NOTIFY: + Main.this.onNotify((String)msg.obj); + break; + default: + Os.debug("Main: unknown message - " + msg.what); + break; + } + } } }