среда, 3 ноября 2010 г.

GWT: Обманываем Java

Вопрос на засыпку, что выведет эта программа:

  1. public class Inheritance {
  2.     private static class A {
  3.         public void tt() {
  4.             System.out.println("a");
  5.         }
  6.     }
  7.  
  8.     private static class B extends A {
  9.         public void tt() {
  10.             System.out.println("b");
  11.         }
  12.     }
  13.  
  14.     public static void main(String... args) {
  15.         A a = new A();
  16.         a.tt();
  17.         B b = (B) a;
  18.         b.tt();
  19.     }
  20. }

Она скомпилируется, но при запуске кинет эксепшн:

a
Exception in thread "main" java.lang.ClassCastException: Inheritance$A cannot be cast to Inheritance$B
at Inheritance.main(Inheritance.java:18)


Все верно... для Java.

Однако, в GWT можно так делать. Причем, даже нужно, потому что других способов создать иерархию объектов из JavaScriptObject невозможно, ведь инстанцирование их напрямую запрещено, что исключает использование фабрик. К примеру:


  1. import com.google.gwt.core.client.JavaScriptObject;
  2. import com.google.gwt.core.client.JsArray;
  3. import com.google.gwt.user.client.Window;
  4.  
  5. public class Test {
  6.     private static class A extends JavaScriptObject {
  7.         protected A() {
  8.         }
  9.  
  10.         public final void amethod() {
  11.             Window.alert("A");
  12.         }
  13.  
  14.         public final native boolean isB() /*-{
  15.             return this.is_b;
  16.         }-*/;
  17.     }
  18.  
  19.     private static class B extends A {
  20.         protected B() {
  21.         }
  22.  
  23.         public final void bmethod() {
  24.             Window.alert("B");
  25.         }
  26.     }
  27.  
  28.     public void test() {
  29.         JsArray<A> objects = getObjects();
  30.         for (int i = 0; i < objects.length(); i++) {
  31.             A a = objects.get(i);
  32.             if (a.isB()) {
  33.                 ((B) a).bmethod();
  34.             } else {
  35.                 a.amethod();
  36.             }
  37.         }
  38.     }
  39.  
  40.     private static final native JsArray<A> getObjects() /*-{
  41.         return [{is_b: false}, {is_b: true}];
  42.     }-*/;
  43. }

Это можно объяснить тем, что скомпилированный код - уже не Java, а Javascript. Конечно, нельзя использовать наследование по полной - перегружать методы например, т.к. они или класс должны быть "final", но это позволяет разнести логику наследуемых сущностей по классам, сделать код более читаемым и проще поддерживаемым.

суббота, 22 мая 2010 г.

Color Picker для Android

С обновлением рисовалки Sketcher до версии 1.0.3, появилась возможность выбирать цвет линий. В качестве диалога выбора цвета, я использовал и доработал стандартный диалог, который вытащил из примеров приложений. Доработал его дополнительным контролом, который позволяет выбрать оттенок цвета. Исходник лежит здесь: http://github.com/wargoth/Sketcher/blob/master/src/org/sketcher/ColorPickerDialog.java.

воскресенье, 18 апреля 2010 г.

Использование внешних приложений для отправки картинок или чего-нибудь еще

Для Sketcher понадобилось реализовать возможность отправки получившейся картинки через e-mail, MMS и прочих. Можно, конечно, реализовать свой отправщик почты/MMS/еще-чего-нибудь, но это - изобретение велосипеда. Лучше воспользоваться стандартным механизмом, который предоставляют т.н. Content Providers.



На примере отправки картинки, это реализуется очень просто:

1 File file; // допустим, есть некоторая картинка
2 Uri uri = Uri.fromFile(file);
3
4 Intent i = new Intent(Intent.ACTION_SEND);
5 i.setType("image/png");
6 i.putExtra(Intent.EXTRA_STREAM, uri);
7 // вот здесь создается новое окно со списком доступных приложений,
8 // которые могут обработать данный с типом "image/png"
9 startActivity(Intent.createChooser(i, "Send Image To:"));

Однако, есть некоторые нюансы. Во-первых, файл должен быть сохранен на диске, во-вторых, на нем должны стоять права, разрешающие чтение сторонними приложениями.

Есть и некоторые глюки. Например, у меня на телефоне картинка нормально отсылается через MMS, пикасой, т.е. всеми, кроме Gmail. Пока не знаю почему, но почему-то файл не доходит до него, а в логах logcat пишет что-то типа:

04-01 18:33:06.589: DEBUG/Gmail(4465): ComposeActivity added to
message:0 attachment:|asketch.png|image/png|0|image/png|LOCAL_FILE|file:///data/data/org.sketcher/files/asketch.png size:0
04-01 18:33:06.609: INFO/Gmail(4465): >>>>> Attachment uri:
file:///
data/data/org.sketcher/files/asketch.png
04-01 18:33:06.609: INFO/Gmail(4465): >>>>> type: image/png
04-01 18:33:06.609: INFO/Gmail(4465): >>>>> name: asketch.png
04-01 18:33:06.609: INFO/Gmail(4465): >>>>> size: 0


Думаю, что это только у меня такое, но буду думать почему так...

UPD: Оказалось, что нужно сохранять файлы на SD карте, чтобы сторонние приложения могли без проблем прочесть его (GMail в частности). Возможно, это глюк старых версий, т.к. на некоторых девайсах нет SD карты

понедельник, 12 апреля 2010 г.

Sketcher Фан-арт

Приходят письма от пользователей Sketcher, сообщающих о багах, предлагающих новые фичи. Вчера пришло письмо от пользователя, который прислал картинку, нарисованную в Sketcher. Не смог удержаться, чтобы не запостить :) Если еще будут присылать, буду выкладывать сюда.

John Eide - "Hirsute":

суббота, 3 апреля 2010 г.

Про мою игрушку под Android

Для интересующихся, выкладываю игрушку на раннем этапе разработки: http://narod.ru/disk/19356766000/Game.apk.html . Изначально, я решил написать движок для игр типа tower defence, чтобы можно было его использовать универсально, меняя лишь логику игры. На данном этапе пытаюсь сделать клон игры Robo Defence. Если есть идеи по игре или желающие продолжить разработку игры для участия в Android Developer Challenge 2010, стучитесь :)

Скрины:





PS. Ресурсы в этой демке выдраны из оригинального Robo Defence

вторник, 30 марта 2010 г.

Если умер в NetBeans автокомплит функций PHP

Было пару раз, что автокомплит в NetBeans функций PHP умерал. Лечиться это удалением папки ~/.netbeans/_version_/var/cache/index/ и перезапуском NetBeans.

воскресенье, 28 марта 2010 г.

Первая версия рисовалки под Android. Встречайте Sketcher!

Итак, плод 2-х дневной разработки, которые растянулись на 2 недели - Sketcher. Так же выложил исходники, они доступны по адресу: http://github.com/wargoth/Sketcher



Скрины:


Hello, World

Традиционное сообщение об открытии собственного блога. Начал пока что для того, чтобы выкладывать собственные разработки, идеи и прочий бред. А дальше - посмотрим.