2011年11月17日木曜日

git --numstat

gitのnumstatがとても便利です。numstatはソースコードの変更行数を出してくれるので、リポジトリの変更がどの程度行われたのか、また、どのファイルが特に変更されたのかなどをざっと見る時にとても便利です。

簡単な使い方としては、git logと組みわせる方法があります。

$ git log --numstat

以下のようなログが出ます。
(https://android.googlesource.com/platform/frameworks/base のログの一つです)

commit 2237e1e7b636651f0ed1efacefa8aaccb21433ca
Author: Eric Fischer
Date: Wed Nov 2 15:14:43 2011 -0700

Import revised translations. DO NOT MERGE
Change-Id: I2f073cc6d62d757ba4e6565a0c7974ca9cecba4c

1 1 core/res/res/values-en-rGB/strings.xml
1 1 core/res/res/values-ru/strings.xml
5 5 core/res/res/values-sw/strings.xml
24 24 core/res/res/values-uk/strings.xml
2 2 packages/BackupRestoreConfirmation/res/values-sw/strings.xml
2 2 packages/SystemUI/res/values-af/strings.xml
1 1 packages/SystemUI/res/values-ru/strings.xml
8 8 packages/SystemUI/res/values-sw/strings.xml
1 1 packages/SystemUI/res/values-uk/strings.xml

この場合だとリソースのみの変更であることが一目でわかります。

またdiffとの組み合わせも便利です。

$ git diff android-2.2_r1 android-2.3.1_r1 --numstat

99 64 Android.mk
21 1 CleanSpec.mk
418795 0 api/9.xml
24489 1485 api/current.xml
0 31 awt/Android.mk
0 1354 awt/com/android/internal/awt/AndroidGraphics2D.java
0 96 awt/com/android/internal/awt/AndroidGraphicsConfiguration.java
0 87 awt/com/android/internal/awt/AndroidGraphicsFactory.java
0 274 awt/com/android/internal/awt/AndroidImageDecoder.java
0 536 awt/com/android/internal/awt/AndroidJavaBlitter.java
0 75 awt/com/android/internal/awt/AndroidNativeEventQueue.java
0 88 awt/com/android/internal/awt/AndroidWTK.java
0 52 awt/com/android/internal/awt/AwtFactory.java
0 66 awt/com/android/internal/awt/ImageOutputStreamWrapper.java
0 681 awt/java/awt/AWTEvent.java
0 47 awt/java/awt/AWTException.java
0 712 awt/java/awt/AWTKeyStroke.java
0 47 awt/java/awt/AWTListenerList.java
0 61 awt/java/awt/AWTPermission.java
0 39 awt/java/awt/ActiveEvent.java
0 166 awt/java/awt/Adjustable.java
0 352 awt/java/awt/AlphaComposite.java
0 2443 awt/java/awt/BasicStroke.java
0 195 awt/java/awt/BufferCapabilities.java
0 990 awt/java/awt/Color.java



2011年10月25日火曜日

【Android】 KeyEventの発行

KeyEventの発行についてまとめておきます。

KeyEventですが、基本的にIWindowManagerにあるinjectKeyEventを呼び出すことで
可能なのですが、残念ながら公開されているインターフェースではなく、リフレクションを
使う方法でしか呼び出しができません。

そこでいろいろ調べていたのですが、Instrumentationクラスを用いることで可能なことが
分かりました。

http://developer.android.com/reference/android/app/Instrumentation.html

InstrumentationクラスにあるsendKeySyncイベントなどを発行することで可能となります。

ただ、上記のAPIは、UIスレッドでは呼び出し不可能なので、別スレッドを作成して、そこから
呼び出す必要があります。以下、適当なコードですけどサンプルを載せておきます。

以下の手順で動作確認できます。

1. Musicをならす
2. 以下のアプリを起動
3. Buttonを押すと、Musicが停止したり、再開したりさせれます。(Play-Pauseキーなので)

全面のActivityにまずKeyEventが発行され、その後、IntentでMusic側に流れている
ことが確認できます。
public class SandBoxActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

Button b = (Button) this.findViewById(R.id.button1);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
KeyEventSender sender = new KeyEventSender();
sender.execute(null);
}
});
}

public boolean onKeyDown(int keyCode, KeyEvent event) {
android.util.Log.d("TEMPORARY", "keyCode = " + keyCode);
return super.onKeyDown(keyCode, event);
}

private class KeyEventSender extends AsyncTask {
@Override
protected Object doInBackground(Object... params) {
Instrumentation ist = new Instrumentation();
ist.sendKeyDownUpSync(KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE);
return null;
}
}
}