From 13191ccac2e136180c090e48ab999a81e572d60d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Alexis=20Laferri=C3=A8re?= Date: Tue, 12 May 2015 18:01:22 -0400 Subject: [PATCH] lib/android: revamp `android::ui` to implement `app::ui` MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Alexis Laferrière --- lib/android/ui/ui.nit | 169 +++++++++++++++++++++++-------------------------- 1 file changed, 78 insertions(+), 91 deletions(-) diff --git a/lib/android/ui/ui.nit b/lib/android/ui/ui.nit index a37e572..f534e77 100644 --- a/lib/android/ui/ui.nit +++ b/lib/android/ui/ui.nit @@ -1,7 +1,5 @@ # This file is part of NIT (http://www.nitlanguage.org). # -# Copyright 2014 Alexis Laferrière -# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -17,134 +15,123 @@ # Views and services to use the Android native user interface module ui +# Implementation note: +# +# We cannot rely on `Activity::on_restore_instance_state` to implement +# `on_restore_state` is it only invoked if there is a bundled state, +# and we don't use the Android bundled state. + import native_ui +import log +import nit_activity + +import app::ui +private import data_store + +redef class Control + # The Android element used to implement `self` + fun native: NATIVE is abstract -# An event from the `app.nit` framework -interface AppEvent - # Reaction to this event - fun react do end + # Type of `native` + type NATIVE: JavaObject end -# A control click event -class ClickEvent - super AppEvent +redef class Window + redef var native = app.native_activity - # Sender of this event - var sender: Button + redef type NATIVE: NativeActivity - redef fun react do sender.click self -end + redef fun add(item) + do + super -# Receiver of events not handled directly by the sender -interface EventCatcher - fun catch_event(event: AppEvent) do end + # FIXME abstract the Android restriction where `content_view` must be a layout + assert item isa Layout + native.content_view = item.native + end end -redef class App - super EventCatcher -end +redef class View + redef type NATIVE: NativeView -# An `Object` that raises events -abstract class Eventful - var event_catcher: EventCatcher = app is lazy, writable + redef fun enabled=(enabled) do native.enabled = enabled or else true + redef fun enabled do return native.enabled end -# -## Nity classes and services -# +redef class Layout + redef type NATIVE: NativeViewGroup -# An Android control with text -abstract class TextView - super Finalizable - super Eventful - - # Native Java variant to this Nity class - type NATIVE: NativeTextView + redef fun add(item) + do + super - # The native Java object encapsulated by `self` - var native: NATIVE is noinit + assert item isa View - # Get the text of this view - fun text: String - do - var jstr = native.text - var str = jstr.to_s - jstr.delete_local_ref - return str + # FIXME abstract the use either homogeneous or weight to balance views size in a layout + native.add_view_with_weight(item.native, 1.0) end +end - # Set the text of this view - fun text=(value: Text) - do - var jstr = value.to_s.to_java_string - native.text = jstr - jstr.delete_local_ref +redef class HorizontalLayout + redef var native do + var layout = new NativeLinearLayout(app.native_activity) + layout.set_horizontal + return layout end +end - # Get whether this view is enabled or not - fun enabled: Bool do return native.enabled - - # Set if this view is enabled - fun enabled=(val: Bool) do native.enabled = val - - # Set the size of the text in this view at `dpi` - fun text_size=(dpi: Numeric) do native.text_size = dpi.to_f - - private var finalized = false - redef fun finalize - do - if not finalized then - native.delete_global_ref - finalized = true - end +redef class VerticalLayout + redef var native do + var layout = new NativeLinearLayout(app.native_activity) + layout.set_vertical + return layout end end -# An Android button -class Button - super TextView +redef class TextView + redef type NATIVE: NativeTextView - redef type NATIVE: NativeButton - - init - do - var native = new NativeButton(app.native_activity, self) - self.native = native.new_global_ref + redef fun text do return native.text.to_s + redef fun text=(value) do + if value == null then value = "" + native.text = value.to_java_string end - # Click event - # - # By default, this method calls `app.catch_event`. It can be specialized - # with custom behavior or the receiver of `catch_event` can be changed - # with `event_catcher=`. - fun click(event: AppEvent) do event_catcher.catch_event(event) + # Size of the text + fun text_size: Float do return native.text_size - private fun click_from_native do click(new ClickEvent(self)) + # Size of the text + fun text_size=(text_size: nullable Float) do + if text_size != null then native.text_size = text_size + end end -# An Android editable text field -class EditText - super TextView - +redef class TextInput redef type NATIVE: NativeEditText + redef var native = (new NativeEditText(app.native_activity)).new_global_ref +end - init - do - var native = new NativeEditText(app.activities.first.native) - self.native = native.new_global_ref - end +redef class Button + super Finalizable + + redef type NATIVE: NativeButton + redef var native = (new NativeButton(app.native_activity, self)).new_global_ref + + private fun on_click do notify_observers new ButtonPressEvent(self) + + redef fun finalize do native.delete_global_ref end redef class NativeButton - new (context: NativeActivity, sender_object: Object) - import Button.click_from_native in "Java" `{ + private new (context: NativeActivity, sender_object: Button) + import Button.on_click in "Java" `{ final int final_sender_object = sender_object; return new android.widget.Button(context){ @Override public boolean onTouchEvent(android.view.MotionEvent event) { if(event.getAction() == android.view.MotionEvent.ACTION_DOWN) { - Button_click_from_native(final_sender_object); + Button_on_click(final_sender_object); return true; } return false; -- 1.7.9.5