ラベル アプリ の投稿を表示しています。 すべての投稿を表示
ラベル アプリ の投稿を表示しています。 すべての投稿を表示

2012年4月3日火曜日

[リリース]簡単帳簿[作った]




今回リリースしたアプリの機能は非常にシンプルなもの。

買い物をしたら、商品名と値段を入力し表示する。ただそれだけ。

コード的にも、そんなだいそれたことを行なっているわけではない。あえて言うなら、DatePickerを日にち部分のみ表示しないように手を加えたレベル。







こだわりポイントは、ActionBarを採用したこと。今まではLinerLayoutを使ってそれっぽいものを実装していただけだったけど今回はAndroid3.0以降でもちゃんとActionBarとして認識されるActionBarを利用した。

とは言え、サンプルコードで与えられているActionbarCompatを流用しただけなんだけどね・・・。

あと、開発のプロセスとして継続的インテグレーションっぽいことを取り入れた。JenkinsとGitを使ってビルドとテストが通るまで眠らないあの日々・・・。

結論としては、一人継続的インテグレーションのメリットって・・・?な感じだけど、とは言え将来的に利用する日が訪れた時にいい事があるかなぁって感じ。

あと、珍しくCPUを回す作業なので今まで半分寝ていたサーバーを上手く活用できたかな、と。

という訳で、GooglePlayで公開中なのでぜひともダウンロードしていただきたいものです。

ダウンロードはこちらから

2012年3月2日金曜日

[JUnit]DatePickerをテストケースから操作する[Android]

Androidのテストでは、ウィジェットの操作はUIのスレッドで動作させる必用があるとのこと。

今回は、DatePickerを操作する。ソースは以下。

  activity = getActivity();

  fromDate = (DatePicker) activity.findViewById(R.id.from_data);
  toDate = (DatePicker) activity.findViewById(R.id.to_data);
  activity.runOnUiThread(new Runnable() {

   @Override
   public void run() {
    // TODO Auto-generated method stub
    fromDate.init(fromY, fromM, fromD, null);
    toDate.init(toY, toM, toD, null);
   }
  });
アクティビティのインスタンスから、runOnUiThreadを使ってUIのスレッドでの動作を行わせるとのこと。

今夜はリファクタリング的なことをやって、無駄に増えていった処理用のクラスを纏めていました。


リファクタリングとは、外部から見た時の挙動が変わってはいけない、とのこと。この本に書かれていた。

多分、クラスを分ける必用があるんだろうなぁとは思うけれど、どう分ければいいのかがよく分かっていなくて、後から見返すとかなりアレなことになっていることが多い。

2012年2月26日日曜日

【JUnit】データベースを操作するテスト【試してみた?】



先日作ったByte配列に変換したりその逆にしたりするメソッドを利用して、データベース周りを実装する。

割りと、参考サイトを見ていると実装の方法は同じなので今回つまった部分とか。

Blob型で保存をするので、PupSQLiteなどのビューアを利用してもデータの内容の確認ができない。そこで、正しくデータが保存できているのか等を確認するために、JUnitを利用することにする。

Byte配列とは出るけど、内容確認は無理




1:データベース操作クラスのテスト
  • データを挿入するinput
  • 削除するdelete
  • 全てのデータを得るfindAll
  • 任意のデータを得るfindById

それぞれのテストの実装は次の通り。
public class PartyDaoTest extends AndroidTestCase {
 DbHelper helper;
 PartyDao dao;

 Party party; //保存対象のデータ

 public PartyDaoTest() {
 }

 protected void setUp() throws Exception {
  super.setUp();

  helper = new DbHelper(getContext());
  dao = new PartyDao(helper.getReadableDatabase());

  setData();
 }


 protected void tearDown() throws Exception {
  super.tearDown();
 }

 public void testInsert() {
  assertNotNull("Should be not null if save data", dao.insert(party));
 }

 public void testFindAll() {
  dao.insert(party);
  
  assertTrue("Should be returned bigger than one.",
    dao.findAll().size() > 1);
 }

 public void testDelete() {
  assertNotNull("Shoudl be not null", dao.delete((int) dao.insert(party)));
 }

 public void testFindById() {
  int id = (int) dao.insert(party);
  Party p = dao.findById(id);
  
  assertEquals(party.getDate(), p.getDate());
 }
}

問題なくテストも成功するから多分、大丈夫。

2:利用するActivityのテスト

保存対象のデータ'Party'を新たに作ったIntentにputし,setActiviyIntentでActivityに渡す。

testSaveData()で、実際のテストを行なっている。ちなみに、テスト対象のsaveData()メソッドは、データを保存すると返り値としてデータのIDを返すと言う物。
public class SelectMemberActivityTest extends
  ActivityInstrumentationTestCase2<テスト対象のActivity> {

 Party party; //保存対象のデータ
 SelectMemberActivity mActivity;

 public SelectMemberActivityTest() {
  super("パッケージ名", テスト対象のActivity.class);

 }

 protected void setUp() throws Exception {
  super.setUp();
  Intent intent = new Intent(getInstrumentation().getContext(),
    テスト対象のActivity.class);
  party = setData();
  intent.putExtra("store_data", party);

  setActivityIntent(intent);
 }

 protected void tearDown() throws Exception {
  super.tearDown();
 }

 public void testSaveData() {
  assertNotNull("データを保存する.返り値がNull以外で成功とする", getActivity().saveData());
 }
}

さて、この簡単な実装だけど最初コンストラクタになぜか引数がついていてRuntimeExceptionが発生してた。気づいて修正するのにほぼ1日かかったって言うね・・・。ココみて直した。

さて、興味があるのでJUnitとか使ってますけど、決して今の開発スタイルはTDDとは言えないと思います。

そもそも、今回書いたテストも正しいテストと言えるのか分からない。その辺りは勉強なんだけど。

今風のソフトウェア開発の本を読めば多分書いてあるんだろうね。まあ、実践も一緒にやっていきたい所ではあるけれど。

多分今回書いたのはこのスライドで言うところの学習テストに当たるのかな。初めて使う機能だもんね、しっかりと抑えておきたい所ではある。

2012年2月5日日曜日

【Android】複数のメールアドレスに対して送信するIntentを作りたい

Intentから、メールを送信するのはやり方としては様々なサイトに書かれていましたが、複数のメールアドレスに対して送る方法が無かったのでメモ。

具体的には、extra data を EXTRA_EMAILに、そしてToアドレスをStringの配列にする必用があったとのこと。

参考にしたサイトはこちら

今作っているアプリは、ListViewで選択をしたメールアドレスに対してメールを送信するので

1.ArrayListにToアドレスを保存

2.配列に変換

3.putExtra

な感じ。

コードは以下。
ArrayList toList = new ArrayList();
    Intent intent = new Intent(Intent.ACTION_SEND);
    for (Member member : memberList) {
     if (member.isJoin()) {
      toList.add(member.getMail());
     }
    }
    intent.putExtra(Intent.EXTRA_EMAIL,
      (String[]) toList.toArray(new String[0]));
    intent.putExtra(Intent.EXTRA_TEXT, "メール本文");
    intent.putExtra(Intent.EXTRA_SUBJECT, "メールタイトル");
    intent.setType("message/rfc822");
    startActivity(Intent.createChooser(intent,
      "choose email client"));


当然だけど、putExtraはArrayList型を引数にしてあげても動く。お陰で詰まってた。ArrayListでも大丈夫だろう、と勘違い。

2012年1月15日日曜日

【アップデート】タイムキーパー ドラ娘



ドラ娘には会ったことがない。

会ったことがないなら、作ればいいじゃないかってことで、かつてリリースしたこのアプリ。

アイコン
もともと、機能なんかも少なくてリリースして放置していた。

だが、10月くらいにアンドロイダーさんで記事にしていただいていた。全く気づかなかったけど。

という訳で、モチベーションが上がったのでアップデート。

まずは、インターフェースの変更。

実は、画面のドラ娘をタップすることで任意のタイミングでドラを鳴らすことができた。

しかし、アンドロイダーさんでもその点に触れられていなかったことから、この機能に気づかなかった人が多かったのでは、と想像。

スクショ
そこで、Doraボタンを追加。これで大丈夫でしょう。

次に、音量関連の問題。端末の音量や、調整ができないことは割りと不便かなと。

そこで、画面上に現在の音量を表示。端末のボリュームボタンを使って調整を行えるように変更。

目立った更新はこの辺ですかね。あとは、タイトルバーを消して、アクションバーのようなものを追加したり。

という訳で、今後は
・バックグラウンドに回っても音がなるようにする

・設定を保存できるようにする。

とかを考えてはいます。

アプリのDLはこちらからどうぞ。