2014年1月7日火曜日

KitKatのフルスクリーンモード

Immersive full-screen mode

SYSTEM_UI_FLAG_IMMERSIVE
API Level 19で追加されたSYSTEM_UI_FLAG_IMMERSIVEを使うと、NavigationBarを消した状態でタッチイベントをハンドリングできます。
画面下部をSwapすることでNavigationBar非表示を解除できます。
ただし、Action barのメニューを開いたり、オフスクリーン→オンスクリーンで解除されてしまうので制御が必要です。

http://developer.android.com/reference/android/view/View.html#SYSTEM_UI_FLAG_IMMERSIVE

SYSTEM_UI_FLAG_HIDE_NAVIGATIONと同時にセットする必要があります。
(SYSTEM_UI_FLAG_HIDE_NAVIGATIONを拡張したフラグ)

Viewに対して、フラグをセット。
        View view = findViewById(R.id.layout);
        view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_IMMERSIVE
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);


初回表示の際、次のような注意画面が表示されます。

NavigationBar非表示の画面。



SYSTEM_UI_FLAG_IMMERSIVE_STICKY
SYSTEM_UI_FLAG_IMMERSIVEとことなり、画面下部をSwapすることでNavigationBarを一時的に表示できます。
NavigationBar表示後、一定時間が経過すると、再度、非表示モードに戻ります。

http://developer.android.com/reference/android/view/View.html#SYSTEM_UI_FLAG_IMMERSIVE_STICKY

Viewに対して、フラグをセット。
        View view = findViewById(R.id.layout);
        view.setSystemUiVisibility(View. SYSTEM_UI_FLAG_IMMERSIVE_STICKY 
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
NavigationBar非表示の画面。

画面下部をSwapするとNavigationBarを表示します。

2013年12月26日木曜日

ステップディテクタ「Sensor.TYPE_STEP_COUNTER」を使ってみる

歩数計"TYPE_STEP_COUNTER"に続き、"TYPE_STEP_DETECTOR"です。 こちらは歩数ではなく、Stepと判定したタイミングで通知を受けます。
http://developer.android.com/reference/android/hardware/Sensor.html#TYPE_STEP_DETECTOR


Initialize Sensor

SensorManagerを使い、Sensorオブジェクトを取得します。
public class StepCounterActivity extends Activity {
    private SensorManager mSensorManager;
    private Sensor mStepSensor;
    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextView = (TextView) findViewById(R.id.text_step);

        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        mStepSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);

    }

    protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(mSensorEventListener, mStepSensor,
                SensorManager.SENSOR_DELAY_NORMAL);
    }

    protected void onPause() {
        super.onPause();
        mSensorManager.unregisterListener(mSensorEventListener);
    }


Create a SensorListener

トリガーはonSensorChangedのコールバックメソッドで取得します。
Stepが発生したタイムスタンプとevent.values[0]に1.0fが格納されています。

    private SensorEventListener mSensorEventListener = new SensorEventListener() {
        private int mStep;

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }

        @Override
        public void onSensorChanged(SensorEvent event) {
            if (event.values[0] == 1.0f) {
                mStep++;
            }
            mTextView.setText(Integer.toString(mStep));
        }
    };

2013年12月25日水曜日

歩数計「Sensor.TYPE_STEP_COUNTER」を使ってみる

API 19でSensorに歩数計"TYPE_STEP_COUNTER"が追加されました。

http://developer.android.com/reference/android/hardware/Sensor.html#TYPE_STEP_COUNTER


Initialize Sensor

SensorManagerを使い、Sensorオブジェクトを取得します。
public class StepCounterActivity extends Activity {
    private SensorManager mSensorManager;
    private Sensor mStepSensor;
    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextView = (TextView) findViewById(R.id.text_step);

        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        mStepSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);

    }

    protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(mSensorEventListener, mStepSensor,
                SensorManager.SENSOR_DELAY_NORMAL);
    }

    protected void onPause() {
        super.onPause();
        mSensorManager.unregisterListener(mSensorEventListener);
    }


Create a SensorListener

歩数はonSensorChangedのコールバックメソッドで取得します。
値はevent.values[0]に格納されています。
端末機起動後から計測した歩数の値を返します。0に戻るときは端末再起動時だけです。

    private SensorEventListener mSensorEventListener = new SensorEventListener() {
        private float mStepOffset;

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }

        @Override
        public void onSensorChanged(SensorEvent event) {
            if (mStepOffset == 0) {
                mStepOffset = event.values[0];
            }
            mTextView.setText(Float.toString(event.values[0] - mStepOffset));
        }
    };

2013年11月17日日曜日

何気なく使っているFramework PrintManager

Android 4.4 KitKatoから追加されたPrint機能。

※調査する時間が取れず、中途半端ですが一旦公開します。


確認しておいた方がいいソース

Print機能を構成するパッケージが4つに分かれています。
すべて重要なので、確認しておきましょう。

\frameworks\base\core\java\android\print
PrintManager.java
IPrintSpooler.aidl

\frameworks\base\core\java\android\printservice
PrintService.java
PrinterDiscoverySession.java
IPrintService.aidl

\frameworks\base\packages\PrintSpooler\src\com\android\printspooler
PrintSpoolerService.java

\frameworks\base\services\java\com\android\server\print
PrintManagerService.java
RemotePrintService.java
RemotePrintSpooler.java
UserState.java



簡易クラス図

2013年11月3日日曜日

Andoird 4.4 KitKat StatusBarの変更点(基本設計編)



システムよりの確認です。


SystemServerをみる

config.disable_systemuiの設定次第で、ステータスバーを非表示にできる。

https://android.googlesource.com/platform/frameworks/base/+/android-4.4_r1/services/java/com/android/server/SystemServer.java
 
        boolean disableSystemUI = SystemProperties.getBoolean("config.disable_systemui", false);

            if (!disableSystemUI) {
                try {
                    Slog.i(TAG, "Status Bar");
                    statusBar = new StatusBarManagerService(context, wm);
                    ServiceManager.addService(Context.STATUS_BAR_SERVICE, statusBar);
                } catch (Throwable e) {
                    reportWtf("starting StatusBarManagerService", e);
                }
            }


SystemUiをみる

そもそも、Tablet用のフォルダがなくなった。すでに、JBでは使われていなかった。(※Nexus系の端末)

https://android.googlesource.com/platform/frameworks/base/+/android-4.4_r1/packages/SystemUI/src/com/android/systemui/statusbar/

TV用は?

相変わらず、スケルトン。モジュールの定義のみ。

https://android.googlesource.com/platform/frameworks/base/+/android-4.4_r1/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java

2013年11月2日土曜日

4.4 KitKatの表示レイヤーについて


android-4.4_r1がAOSP上で公開されました。
毎度おなじみの表示レイヤーのチェックを行いました。

確認OSバージョン

android-4.4_r1 KitKat

表示レイヤー

OSのメジャーアップデートなので、表示レイヤーの変更点があるかどうか確認しました。
ソース
android-4.4_r1/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
(★ = 4.4_r1にて新規追加されたレイヤー)
レイヤー名用途
1TYPE_UNIVERSE_BACKGROUND
2TYPE_PRIVATE_PRESENTATION
2TYPE_WALLPAPER壁紙
3TYPE_PHONE着信などの電話用
4TYPE_SEARCH_BAR検索バー
5TYPE_RECENTS_OVERLAY履歴
5TYPE_SYSTEM_DIALOG電源OFFダイアログなどのシステムダイアログ
6TYPE_TOASTトースト表示
7TYPE_PRIORITY_PHONESIMエラー表示など
8TYPE_DREAMDream用レイヤー
9SYSTEM_ALERT_LAYERANRやLowバッテリー通知
10TYPE_INPUT_METHOD文字入力UI
11TYPE_INPUT_METHOD文字入力UIのダイアログ
12TYPE_KEYGUARD_SCRIM★keyguardが起動するまでの間、Keyguardの後ろに表示する
13TYPE_KEYGUARDキーガード表示
14TYPE_KEYGUARD_DIALOGシャットダウン中やSIMロック表示、キーガード表示中の電源OFFダイアログなど
15TYPE_STATUS_BAR_SUB_PANELPhone用expandしたパネル
16TYPE_STATUS_BARStatusBar
17TYPE_STATUS_BAR_PANELStatusBarをexpandしたパネル
18TYPE_VOLUME_OVERLAYボリューム変更
19TYPE_SYSTEM_OVERLAYキーガードより上位に表示するシステムオーバーレイ
20TYPE_NAVIGATION_BARナビゲーションBar
21TYPE_NAVIGATION_BAR_PANELナビゲーションBarの上に表示するために必要なパネル(searchなど)
22TYPE_SYSTEM_ERRORシステムエラー通知
23TYPE_MAGNIFICATION_OVERLAY拡大表示用
24TYPE_DISPLAY_OVERLAYSecondaryディスプレイ用
25TYPE_DRAGドラッグ&ドロップ操作用
26TYPE_SECURE_SYSTEM_OVERLAY
27TYPE_BOOT_PROGRESSBoot中のDialog表示
28TYPE_POINTERマウスポインター
29TYPE_HIDDEN_NAV_CONSUMERFakeWindow用


大きな変更点は
  1. TYPE_KEYGUARD_SCRIMの追加

アプリケーション開発者にはあまり関係ありませんが、Frameworksのカスタム作業がメインの方、WindowManagerServiceとKeyguard周りを調査しましょう。

2013年9月23日月曜日

IngressのComm風タブを作成してみた

IngressのComm風タブを作成してみました。


画面イメージ

デフェルトは画面下部にタブだけを表示し、タブを引っ張り上げることでViewを表示します。




引っ張り上げると、View内のコンテンツが表示されます。

ソース

以下、Githubにて公開中です。
ライセンスはMITライセンスです。
https://github.com/baroqueworksdev/MyApiDemo/blob/master/src/jp/baroqueworksdev/myapidemo/view/SlidePanelView.java