2012年5月28日月曜日

android-bindingのライセンスについて

android-bindingのライセンスは、サイトに書いてある通りLGPLです。
http://code.google.com/p/android-binding/

AndroidアプリにLGPLのライブラリを使うことは、ソース公開の必要になる場合があるようです。



LGPLは動的リンクであれば影響を受けないという認識です。
Androidの場合は、apk、dexにLGPLのライブラリ自体を含むことになるため、影響を受けるということになるという解釈のようです。
私としては妥当だと考えています。

というわけで、LGPLを商用利用する場合は(当たり前ですけど)ソース公開の必要性などに注意が必要となります。
別にAndroidアプリに限らずですね。
ちなみに、Android自体はApache Software License, 2.0で、なぜこのライセンスなのかについて以下で記載されており、LGPLが引き合いに出されています。
Licenses | Android Open Source


話は戻ってandroid-bindingです。
Androidのライブラリなわけですが、上記のとおりLPGLのライセンスとなっています。
商用利用しにくいということで、昨年の年末にライセンス変更について提起されていました。
https://groups.google.com/group/androidbinding/browse_thread/thread/1711f6f186b6a898

提起にされているスレッドでは、MITライセンスへの変更を行うつもりとの記載がありますが、今現在(2012/5/28)LGPLのままです。
折角のいいライブラリなので広く使えるように、ぜひライセンス変更がされるといいなと思います。
いいなと思うからには、やっぱりチケット切っておかないと・・・w
http://code.google.com/p/android-binding/issues/detail?id=25

とりあえず、今回調べて作ろうと思っていたのはソース公開するからいいんですがw

android-bindingを使ってみる その4

android-bindingを使ってみる、のとりあえず区切りです。
今回はGalleryを使います。
実装はこちら。
https://bitbucket.org/twopack/android-binding-sample/changeset/33c63d3b41e8

android-bindingのドキュメントに直接Galleryについての記載はありませんが、GalleryクラスはAdapterViewを継承していてこれについてはサポートしているのでListViewなどと同じように実装できます。
android-binding - Attributes that is (going) to be supported in Android Binding
Gallery | Android Developers


基本的に前回などにListViewで行ったのと同等の実装が可能です。
はまったところについて書いておきます。

項目のレイアウトが左寄せになる。

Galleryは選択されている項目はセンタリングされているものだと思っていたのに、なぜか左寄せに。。。
項目のレイアウトにLinerLayoutを含んでいたためでした。Galleryともandroid-bindingとも関係ないところでしたorz

selectedPositionが反映されない?

android-bindingでselectedPosition属性をバインドすると、選択されている項目の位置を取得できます。
onItemSelected属性のバインドを行って、選択項目が変わったときにその位置を表示するようなサンプルを作っていますが、selectedPositionをonItemSelected属性のInvoke()で確認すると値が更新されず、前の値のままでした。
このバインド自体はAdapterView.onItemSelected()へのバインドなので、Invoke()の引数で選択された位置を取得すればよかったようです。
bitbucketに登録したサンプルでは、この差が分かるように両方表示するようにしてあります。

2012年5月24日木曜日

android-bindingを使ってみる その3

今回はリストビューをバインドして使ってみました。
android-bindingのサンプルでも提供されていますが、以下を試してみました。
  • リストビューのアイテムとして複数のウィジェットを使用できること。
  • アイテムを随時読む込んで表示するような実装が可能なこと。

android-bindingのMarkupDemoのDynamic Listsのソースを参考にしています。
http://code.google.com/p/android-binding/source/browse/#svn%2Ftrunk%2FAndroidBindingMarkupDemo

実装した結果は以下にコミットしています。
https://bitbucket.org/twopack/android-binding-sample/changeset/3136f4d0742e

リストビューのアイテムとして複数のウィジェットを使用

BindingToCollection - android-bindingに書かれている ArrayListObservableを使用してリストビューに対してバインドします。
Tにはリストビューのアイテムのレイアウトに対してバインドする変数を定義したクラスを作って指定します。
ソースは以下のようなものになります。
public transient ArrayListObservable<ListViewSampleItem> listviewItems = 
new ArrayListObservable<ListViewSampleItem>(ListViewSampleItem.class);
対応するレイアウトのXMLは以下です。
<ListView android:layout_width="match_parent"
    android:layout_height="match_parent"
    binding:itemSource="listviewItems"
    binding:itemTemplate="@layout/listview_item" />

@layout/listview_itemでリストビューの項目レイアウトを定義して、それに対してのViewModelをListViewSampleItemクラスで定義しています。こちらは以前の投稿と同じ形です。


アイテムを随時読む込んで表示するような実装が可能なこと。

上記のリストビューの項目に対するViewModelのクラスであるListViewSampleItemクラスで、LazyLoadRowModelクラスを継承しています。
このクラスでdisplayメソッドとhideメソッドをインプリしています。
displayメソッドは項目を表示する必要がある場合に、hideメソッドは項目を表示する必要がなくなった場合に呼び出されます。
実装では、画面以上の項目を用意しておき、最後の項目を表示した際に、項目を追加するような処理にしています。
冒頭のサンプルや以下のページを参考にしています。
http://code.google.com/p/android-binding/wiki/BindingToCursors


テストについて

今回、リストビューの項目で使うアイコンとしてリソースを使用しています。
テストでアイコン用のDrawableがインスタンス化できなかったため、AndroidTestCaseを継承したテストとしました。結果として、エミュレータを使わない形でのテストにできませんでした。。。
エミュレータを使うとやはりテストの開始までに時間がかかります。ここは何かしらもう一工夫必要なので、引き続き考えてみないと駄目なようです。





2012年5月17日木曜日

android-bindingを使ってみる その2

android-bindingの続きです。
前回のソースにアクティビティの開始を追加しました。
ポイントは以下です。それぞれソースのリンクも併記します。
  1. ViewModelのJUnitでテストできる状態を維持する。
    https://bitbucket.org/twopack/android-binding-sample/changeset/6cf2bd843f36
  2. アクティビティの開始をテストする。
    https://bitbucket.org/twopack/android-binding-sample/changeset/c44ee14f5722

1. ViewModelのJUnitでテストできる状態を維持する。

android-bindingのサンプルであるMarkupDemoでは、リストビューの項目をクリックした際にインテントを発行してアクティビティを開始するコードがあります。
リストビューの項目をクリックした際の処理は、Commandクラスを使用したバインドによって行われます。

layoutの中でバインドできる属性については、以下のページで記載されています。
http://code.google.com/p/android-binding/wiki/BindingSyntax


// ”onClickItem”は、layoutのbinding:onItemClickedで定義したもの。
public final Command onClickItem = new Command() {

        @Override
        public void Invoke(final View view, final Object... args) {
            // ここにクリック時の処理
        };
};

ここで単純にインテントを発行すると、Androidの中のものを動かさないといけなくなるため、JUnitでの(エミュレータを使用しない)テストができません。
そこで、実際のインテント発行はアクティビティ側で実装し、アクティビティで実装したメソッドをViewModelに登録して呼び出すようにしました。
ViewModelとしては、登録されたメソッドの呼び出しまでは責務となるため、JUnitでテストが可能です。

2. アクティビティの開始をテストする。

ViewModelはメソッドの呼び出しまでを責務としたため、アクティビティ側の実装としてインテント発行のテストが必要になります。
こちらはエミュレータでテストすると割り切って実装することにしました。
以下を参考にしました。
AndroidのテストクラスはJUnit3をベースにしています。今回の実装でテストコードをJUnit4で書いていたので、プロジェクト自体を別としました。

やはり、エミュレータにインストールしてテストすることになるので時間がかかるのが難です。以下を使うなどしてもう一工夫したいところです。


2012年5月15日火曜日

android-bindingを使ってみる その1

Androidアプリ開発での自動テストをやってみようと言う流れで、android-bindingを使ってみました。
参考のサイトを参考にしました。

とりあえず使ってみた&テスト書いてみたというソースは以下です。Activityに記述するコード量が非常に少なくなっていると思います。
https://bitbucket.org/twopack/android-binding-sample/changeset/bb43ab2cba02

また、PojoViewModelを使うとMVVMのViewModelをPOJOにできるため、テストコードの実行時にAndroid環境へのインストールが不要になります。これはTDDを行う上でテストの実行にかかる時間が大分短くなるのでとてもいいです。

テストコードをエミュレータで動かさないと、NoClassDefFoundErrorが起きてしまいました。ここではまりましたが、エミュレータ外で動かす場合には、Eclipseで以下の設定を行いました。
  1. Debug ConfigurationsClasspathBootstrap EntryJREを追加。 User Entriesandroid.jarを追加。
  2. Debug ConfigurationsJREEnvironment executionJavaSE-1.6を選択。
  3. Debug ConfigurationsEnvironmentSelect othr...Eclipse JUnit Launcherを選択。

やってみたのはごく簡単なものなので、メリットを享受したままで実際にどこまで有効に使えるのか、引き続き試してみたいと思います。

2012年5月14日月曜日

Androidのコーディングルール

Androidのコーディングルールについて調べたので備忘録。

これにまつわるツール類。
  1. CheckStyle
    Googleが定義を公開してはいないようです。
    以下のページに参考にしました。
    memorandum / Android CheckStyle設定

    また、UnofficialながらMozillaのものもありました。
    https://github.com/mozilla-services/mozilla-style

    EclipseでのCheckStyleの設定方法はここを参考にしました(そこからかorz)
    http://www.atmarkit.co.jp/fjava/rensai3/eclipsetst02/eclipsetst02_2.html

  2. Formatter
    以下のページを参考にしました。
    ReDo / EclipseのJavaフォーマッター インポート用XML

また、以下にGoogleが各種ガイドラインを出してる。