海月玲二

カテゴリ別リスト:マイカテゴリ-リリース情報(104件):新しい順

検索結果:104件中 1件-25件


すいません、Android13以降を使ってる人はAndroid 3.6.1にアップデートしないほうがよいと思われます。候補表示が出なくなるはずです。

これはもともと3.5で修正した問題だったのですが、そのときに「ときどきバックボタンを2回押さなきゃいけなくなる」という副作用が発生していました。
去年の経緯をすっかり忘れていて、バックボタン2回問題を解決するため、3.5での修正を元に戻してしまっていました。

いずれ、Android13以降でも候補表示が出るようにしつつ、バックボタン2回問題も改善するように修正する予定です。

なお、Android12以下の端末であれば、3.6.1でも問題は起きないと思います。

なんか「ときどきバックボタンが効かなくて2回押すはめになる」というやつを直した。と思う。
あと、変換エントリに [ ] が入ってるやつが個人辞書に学習されちゃうと落ちる、というバグにも気付いたので直した。というか発生条件がレアすぎるだろとか思っていたら、3000強はあるっぽいな。俺はめったに専門用語や固有名詞を変換しないから今まで気付かなかったんだろうか。
まあ、そもそも同じ記号を別の意味に使うのはやめてほしかった。

それだけだったら別にすぐ直ったんだけど、それからKeyboardViewに無駄が多い気がしてきたので、あれこれいじってたら時間がたってしまった。バックボタンの件を指摘してもらってから半年近くたってるので、さすがにバグ修正はさっさと公開したほうがよかった気がする。
なんかKeyboardViewは元のやつをjavaからkotlinに変換しただけなので、kotlin的には無駄な書きかたのところがあったのだ。あと、俺が使わない機能を消したりとかもしている。文字のドロップシャドウとか、キーを押したとき複数の候補を出すとか。
どういう主旨か知らないが、キーのpressed状態を管理する処理を「ポップアップを出したり消したりする関数」の中に入れてあるのはわかりにくくない?

ユーザーから見える違いとしては、qwertyキーボードとか押したときにポップアップが表示されるようになったとか、押したときいちおう色が変わるようになったとか程度である。わりとどうでもいい。

これはつまり、AndroidのいわゆるStorage Access Frameworkに対応しようと思ったのだ。Androidのファイル選択画面を通して許可を得て、それからSAFのAPIだけで操作すれば特にPermissionの設定とか要らなくなるわけなので。

わりとめんどうだったけど、いちおう動いてると思う。でもDocumentsContractのcopyDocument()とかmoveDocument()とかってちゃんと使えるの? どうやっても期待どおりに動作しなかったので、結局、Streamを取得して普通にコピーした。よくわからん。deleteDocument()は動いたんだけど。stackoverflowとか見ても「うまく動かねえよ」みたいな話ばっかりだ。

あと、猫写真とか日常の写真とかが増えてきたので、てきとうにディレクトリを分けたりする必要がでてきて、しょうがないから「サブディレクトリの画像もぜんぶ読みこむ」というモードを作った。

さらに、一覧画面にいちいちファイル名が出ないほうが情報量が多い気がしてきたので、ファイル名とかサイズとかは長押ししたときに出るようにしてみた。
もうこのへんでけっこう大手術になってきたので、メジャーバージョンを上げることにしたのだった。

かんけいないけど、AndroidSKKを使っているとバックボタンを2回押さないといけない場合がある、とコメントをくれた人がいた。なんとなくこれSKKのせいじゃねえかなと思ってはいたのだが、やっぱりそうか。そのうち直さないとなあ。

いわゆるダークモードをつけてみた。たぶん本体の設定に対応して色が変わると思うが、どっちかに固定したかったら設定もできる。あと、ついでにキーの間にちょっと間隔をあけるオプションもつけてみた。
やろうと思えば、背景に画像とか貼る機能もできなくはない気がするが、需要あるんだろうか。何しろ俺はまず使わないと思う。

そういや、どこかで「シフトキーが左側にあるから片手で操作できなくて大変」みたいな意見を見たような気がするけど、これも例えばシフトとEnterを入れ替えるオプションをつけられなくはない。でもそれこそ需要があるかわからん。

あと、なんか最近音声入力が止まってSKKを再起動するまで動かなくなったりするので、それもちょっと調べてみた。どうも、要するに「最近のAndroidではSpeechRecognizer#stopListening()とかcancel()とかがまともに動いていない」ということなのか? しょうがないので、音声入力中はキー操作を受けつけなくして強制中断が起こらないようにした。あと「何も音声入力されなかったときはonResults()が呼ばれない」というのは、前からこうだったっけ?

というか明らかに動作がおかしいところがそのまんまなのは困るね。DialogPreferenceを設定画面から呼び出すときはどうやってもsetTargetFragment()が必要になるままなのに、setTargetFragment()がdeprecatedにされてるのもずっと直ってない気がする。

これもまあメンテナンスリリースというか、最近の環境に合わせて直した感じである。作ってから4年も経つし。

使ってる側から見ると、アイコンの表示が若干速くなったかもしれない。いいかげん真面目にGlideを使って読みこむようにして、結果的にシンプルになったしな。

というか、どうやっても各アプリのアイコンを読みこむとき一瞬時間がかかってしまうのに、普通のランチャーはどうして表示ラグが起きないのかと前々から疑問だった。ちょっと調べてみた感じだと、Androidでホームアプリとして振る舞うやつらはそもそも「終了しない」というのが前提なのかな。それならメモリにずっと持っておけばいいだけなので、何も不思議なことはなさそうだ。LinearLauncherでも、メモリから消えてない間はラグが起きないし。

「アプリのインストールとか削除とかのBroadcastに対するレシーバーをAndroidManifestで設定するのはAndroid8からご禁制になった」問題についても(つまりアプリが変わっても自動でリストを直す方法がない)、「ずっと起動している」という前提であれば、コードでレシーバーを登録すればいい(というかこの方法なら禁止されてないというのも知らなかった)ので、別に問題は起きないのだ。

正直LinearLauncherはホームアプリにするほどの機能はないので、これ以上は基本的にどうしようもない気がする。

最近更新したばっかりなのでアレだがもう一回更新した。
いや、なんか以前から送りがなの学習が変だなと思ってはいたのだ。いいかげんちゃんと直すことにした。

一般的にSKKでは、「おおk /大/多/」みたいなときに「大く」とか「多きい」とかが候補に出てきてウザいという問題に対して、実際に使った送りがなパターンを「/[く/多/]/[き/大/]/」みたいな感じで学習しておくことで、あり得ない候補を出にくくする方法がある。のだが、見なおしてみたところAndroidSKKではやっぱりこの学習部分が間違ってた。
いつから間違ってたのかよくわからないが、少なくとも5年以上は放置されてたようだ。テキトウすぎる。というか発生頻度が微妙なんだよな。送りがながある単語を意図的に単語登録することもほとんどないし。

まあとにかく直したので、多少は楽になったと思う。

そうそう、あと前回修正した音声入力について。最近のAndroidアプリでは、なにか権限が必要な場合にダイアログを出して許可を求めるようなつくりにするのが普通だ。しかしAndroidSKKで音声入力をしたい場合、そんな丁寧なものは出てこないので(単なる手抜きだ)、手動で設定画面からマイクの権限をオンにする必要がある。
公開ページの説明文を読み落とすとわかんないままかも、ということにコメントをもらって気がついた。

旅行中テキストエディタとして毎日使っていたので、なんか微妙にイラっとする動作がいくつか気になってきた。高速スクロール用のつまみが無意味に出たり消えたりしすぎる(スクロール操作してなくて入力中に次の行に入っただけでも出たりする)とか、名前をつけて保存しても画面のタイトルが変わらないとか、一旦アプリを閉じて再開したときにカーソル位置が戻らないとか、そういう細かいところである。
というわけで、そのへんとか、あとAndroid Studioで警告が出たところとかを修正した版だ。

これで俺用としてはほぼ問題なさそう。
しいて言えば置換機能はあってもいい気もするな。あと構文ハイライト機能もあったらおもしろいけど、めったに使わないわりに作るの大変そうだ。

今回は、「マテリアルデザイン的見た目になった」というように見えないこともないが、これは結果的にそうなっただけである。もともと、ソフトウェアキーボードの状態を管理するKeyboardとKeyboardViewというクラスがなぜか廃止になったので、しょうがないから自前で用意しようと思ったのだ。このとき、ボタン背景のDrawableも自前で用意する必要があった(Android内部のリソースはそのまま使えないっぽい)のであるが、このときいまさら昔ふうの9-patch画像を用意するのもめんどうだったので簡単に単色の背景を作った次第。

というわけで今回のバージョンアップにおける真の違いは「Keyboard.ktとKeyboardView.ktを作った」なのだが、ユーザー的には見た目が変わったように見えるのである。あとは、最近なんだか動かなくなってた機能の修正ぐらいだな。音声入力とか、マッシュルーム対応とか、辞書ファイルの読み書きなんかがAndroid13とかでもたぶん動くようになったはず。

それから、Android13では候補表示が出なくなってると教えてもらったので、これも直した。調べてみてわかったんだけど、「本来意図しない挙動だった点をgoogleがいまさら直した」というのが原因らしい。そういうことはちゃんとどこかで説明しておいてくれ。

なんかいつのまにかホーム画面ウィジェットが更新されなくなってたので修正。

とりあえずアプリを開いたとき更新されないのは、要するにoreo以降での暗黙Broadcast禁止のせいだったと思う。でも、一定時間ごとに更新されないのはなんでかイマイチわからん。どうもEnvironment.getExternalStorageState()でちゃんと判定されてなかったっぽいのだが、そんな規制があっただろうか?

まあそもそも、最近のAndroidではストレージを直接操作するな感はある。やっぱりディレクトリ指定を廃止して、ストレージ権限自体を無くしてしまうほうがいいかもしれない。

あとPreferenceのどうでもいいようなところでdeprecatedが出てたのでそれも直した。googleさんちょっとdeprecated出しすぎじゃないですかねえ。

ひさしぶりに車輪の再発明のコーナーです。Android用のテキストエディタを作りました。広告とかも全然ないフリーなのと、ハードウェアキーにわりとしっかり対応しているのが特徴です。

なんかアレね、「豪華な機能がない単純なアプリがほしいんだけど、ないから自分で作る」みたいのが増えてくような気がする。DumbGalleryもそうだし、AndroidSKKもそうかもしれない。やはり「気軽に野良アプリが作れる」というその一点においてAndroidは圧倒的に優れている。これが覆らないかぎりiPhoneを使うことはないと思う。

このエディタは、要するにAndroidのEditTextにちょっと機能を足しただけのものである。「ちょっと機能を足す」の中では、行番号とか改行マークとかを表示させるのには意外に苦労した。いや、検索すれば「onDraw()をオーバーライドする」ということはすぐわかる。でも、そのまま何も考えずにやると、文章が長くなるにつれてすぐ重くなって大変なのだ。いろいろ試行錯誤した結果、画面に表示されてない部分は処理しないとか、事前に行頭のy座標を計算しておくとか、せこい工夫をしたらだいぶマシになった。

えーと、ユーザーから見た違いは、

  • データのエクスポート・インポート機能
  • メモの内容を表示中に画面がオフになったりしても、表示が引っこまなくなった

という点である。本来、2つめの点を直そうとして手をつけたものである。つまり、「料理中にレシピなどを表示して、野菜を切ったりしてるうちに画面が消えると、表示してたポップアップが引っこんでしまう」というのがウザくなったからだ。

しかしこれを直すのは微妙にめんどうだった。そもそも、Androidでは「スクリーンオフになる」というのは、別の画面に遷移したとかバックキーを押したときとかと同様の「表示中の画面が見えなくなる」の一種にすぎないので、区別しづらい。「画面が遷移するときはポップアップも消えてほしいけど、スクリーンオフのときは消えないでほしい」というのは、なんというか手動で判定するかんじになる。ちゃんとできてるかイマイチ自信がない。

あとついでにエクスポート・インポートをつけてみた。なにしろ最近のAndroidは「よそのファイルを直接触らせないぞ」感が超すごいので、バックアップとか別端末へのデータ移行とかがめんどうなのである。もはやデータディレクトリを指定する設定はなくしたほうがいいのかもしれない。

いやまあね、携帯電話などというものをサポートする側としては、結局安全側に倒すしかないんだろう、ということはわからんでもないけどね。しかし窮屈なものだよなあ。「一切の保証が無効になります」とか警告してrootモードをつけてほしいなあ。

実に3年ぶりのバージョンアップだが、下と同様、たいした話ではない。これも本質的には最近の開発環境に対応させただけである。まあ、それだけではなんなので、多少はユーザーから見える違いもある。

  • 設定画面を整理した
  • 変換辞書は初回起動時に自動で解凍されるようにした

辞書の自動解凍は、初リリースからなんと11年たって実装された。驚くべき引き伸ばし。いや、思ったより手間はかかったんだよ。

ところで、最近の開発環境に合わせて修正していて今回いちばん驚いたのは、なんかKeyboardViewとかKeyboardとかのクラスが軒並みdeprecatedにされていたことである。しかもその理由が「このクラスは単なる既存のクラスの組み合わせにすぎないし、要るなら自分で実装したらいいよね」みたいな感じだった。ふざけた話と言わざるをえない。そりゃまあ単なる便利クラスかもしれないが、消す理由はないだろ。実装しなおすのめんどくさいし。

まあ俺は別にGoogle playに出してるわけじゃないから、これは気にせず残してるけどね。そのうち自前のものに直すかもしれないけど。気がむいたら。

というかね、前から思ってるんだけど、Google的にはIMEなんぞあんまり作ってほしいわけじゃないんだろうか? サポートが適当すぎる。APIドキュメントもたいへん説明不足だし。

実を言うとSKKServiceに「設定を読みなおせ」とか「個人辞書をcommit()しろ」とか通知するつもりでsendAppPrivateCommand()とかいうのを使ってたんだけど、どうもこれはそういう使いかたをするためのものじゃないようだ、というのに今さら気付いた。よくわからないが、Broadcastを使って通知するようにしたら、いちおう期待通りに動いているようである。

そういえば、辞書の追加機能をテストするためにSKK用の絵文字辞書なるものを入れてみたら、ふつうに絵文字が入力されてちょっとおもしろかった。もともとutf-8なので変換の手間もないし、もうこれは絵文字変換をサポートしていると言っても過言ではないのでは。いや実際使うわけじゃないけど。

画像を見ているときに、ソート順を覚えていなかったりとか最後と最初の間をスワイプで行き来できなかったりとかが微妙に不便に思えたので、ちょっと直した。

しかし2年ぶりぐらいに触ったので、ほんとちょっと直したいだけなのにいろいろと修正点が増えてて大変だった。Android Studioやらgradleやらのバージョン、ライブラリのバージョンなんかがことごとく上がってるし、前は問題なかった書きかたがいくつもdeprecated扱いになってて「直せよな」マークがいっぱい出てきた。

いやまあ、別に文句を言いたいわけではない。むしろ、ソフトウェアというのはこういうものなのだ。ユーザーとしては同じことをしたいだけでも、時代が変わるとあれこれ修正しなければならない点が必ず出てくる。この点については、Googleが特に邪悪だというほどのことはない(その他の点については知らん)。

この話をいつものように大学に対する文句につなげておくと、大学でソフトウェアシステムを発注するときに、「一定の金額を払って完成品を納品してもらっておしまい」という形態の契約になっているのはおかしいのだ。ソフトウェアシステムを発注するというのは、すなわちサービスを契約するということとほぼ同義だ。定常的に予算が必要なんだよ。どうでもいいが普通の企業でもこういう間抜けなことは起きてるんだろうか。

しかしRMSの人はずいぶん先見の明があったことだと思う。俺は90年代でもソフトウェアというのは完成品を入手して終わりだと思っていた。

ノートを書こうとすると落ちる問題を修正したので,よければお試しください.

一箇所間違えてただけの実にまぬけなミスでした……

先日もらったコメントをもとに,あれこれ修正してみた.

画面回転対応,「ファイルを開く」に履歴とブックマークを追加,検索インターフェースの改善,ショートカットキー設定できる機能を追加,編集中ファイル名表示,あたりが主な改善点だ.

正直なところ,**画面回転の対応がちゃんとできているか自信がない**ので,試してみる人はこまめなセーブをおすすめする.編集中の状態を保存できるように中身を整備しなおす必要があって,わりと大手術だったのだ.

あとショートカットキー設定をやっと「消せる」ようになった.いやあ手抜きもいいところだったな.

今さら気付いた話.同じ日の予定を複数書くとき,時間的に前のやつを後に書いてしまうと,その順番で表示されてしまう.つまり,リマインダーの優先度は日付を単位として計算されてるので,同じ日のリマインダーは全部同じ優先度になってしまい,あとは登場順に表示されるわけだ.

何しろ俺は同じ日に複数予定が入ることなんか少ないので,今まで全然気づかなかった.さすが誰も使ってなさそうなアプリだけある.まあ,とりあえずこれを修正した.つまり,優先度が同じリマインダーはテキスト順にソートして,結果的に時刻の早いほうが先に出るようにした.

あとデフォルトの保存ディレクトリをgetExternalFilesDir()で決めるようにして,Android Q以降でも最低限動作するようにしてみた.でもtargetSDKを28のままにしてるからあんまり関係ないのか?

ところで,kotlinで「リストを複数の基準でソートする」みたいなことが超簡単でびっくりした.調べてたときのページによれば他の言語でもできるらしいし,最近はずいぶん便利になったものだ.

しばらく使ってて,面倒な気がしてきたあたりを機能追加.

  • ディレクトリ開く画面に,履歴とブックマークの機能をつけた
  • 一覧画面でもファイルを選択できるようにした

毎回ディレクトリ指定するのが思ったより面倒だったし,一覧を見ながら一部のファイルをよけたりする場面もある気がしてきた次第.

あと,ちゃんと実行時にストレージアクセスを要求して,拒否されたらメッセージとか出して終了するようにしてみた.

実は,これはいきなりWRITE_EXTERNAL_STORAGEの権限のほうを要求している.WRITEが必要なのは「削除」機能のときだけなので,理屈から言えば,最初はREADを要求して,「削除」を実行しようとしたときだけWRITEをあらためて要求するべきのように思う.でも,何故かうまくいかなったのだ.READだけ要求してみても,allowを押したあとはどういうわけかWRITEのパーミッションチェックも通ってしまう.よくわからない.

というか,READでもWRITEでも,パーミッション要求をしたときのメッセージって一緒だよね.区別されてないんだろうか?

あいかわらずAndroidのシステムはよくわからないことが多いな.そういや,一覧画面でファイルを選択できるようにするのも結構苦労した.最初はいわゆるActionModeを使ってやろうとしたのだが,これのCHOICE_MODE_MULTIPLE_MODALってつまり「一時的に複数選択して,選択対象に何かの処理をして,選択は解除される」という動作のためのものだよね.こういうアプリの場合は選択状態はずっと維持されてほしいので,「CHOICE_MODE_MULTIPLE_MODALが発動したときに,選択状態をクリアしない(あるいはそれまでの選択状態に戻す)」という方法を探したけど,どうしても見つからなかった.

しょうがないので,アクションバーのアイコンを変えたり選択モード中はタッチの動作を変えたりとかを全手動でやっている.あほかと思うが,この方針に変えたらすぐ完成した.

前のエントリで書いた設定画面のリファクタリングであるが,本当にリファクタリングだけなのもアレなので,編集画面のショートカットキーを自由に設定できるやつにしてみた.最近のAndroidSKKとかKLOAで使ってる,モディファイヤキーと合わせて設定できるやつなのだが,Fragment版の設定画面に対応したやつがなんとか完成した.ほかのやつもいずれこれに変えよう.あとフォントサイズ設定はSeekBarにした.長大なリストから数字を選ぶよりはずっとマシだろう.

もうひとつの大きな更新点は,検索するときに複数スレッドで動作するようにしたことだ.けっこう速くなったように思う.まあ,タイトル一覧とかリマインダ一覧とかはテキストファイルにキャッシュしてるので,トップ画面とかの出る速さは別に一緒だ.でも,何かキーワードやハッシュタグで検索するときとか,リロードするときとかは違うはず.

じつは,キャッシュファイルを読みこんでデータを得るところも複数スレッド化してはみたのだが,何をどうやっても全然速くならなかったので中止した.よくわからないが,一行あたりの処理が小さすぎて,複数スレッドにするオーバーヘッドのほうが大きいのかもしれない.

やっと全kotlin化とコードのオーバーホールが完了した.ずっとほったらかしで,前々から気にはなっていたのだ.ややこしいAsynkTaskとか謎の機能つきEnumとかも一掃できて,だいぶすっきりした.

それだけではなんなので,KLOAと同じような画像を貼る機能とか,ホームスクリーンウィジェットをリサイズ可能にしたりとか,ちょっとだけ新機能もつけた.ウィジェット関係のAPIはなかなかへっぽこなので,サイズにあわせて表示件数を調整するのにはけっこう苦労した.もしかしたら画面によっては表示が切れるかもしれない.本来,表示しきれない場合は一番下に「...3 more」みたいに出るようにしたつもりである.

でももっとアレなのはLeadingMarginSpan関連ではないかと思う.Markdownのリストを実装するときに謎のずれが発生してわりと悩んだ.あれはどうももともとバグがあるような気がする.あと右側をあけるのには強引なworkaroundしか手がないし.

あとKLOAのときも思ったけど,自分のディレクトリ以外のファイルを扱うのがどんどん不便になっていて困る.実は,Nougat以降の端末だと,gotoリンクでファイルを開けないはずだ.どうやら,自分がストレージのパーミッションを持っていても,他のアプリにファイルを渡すにはセキュリティチェックがあるらしい.FileProviderを用意すれば渡せないこともないようなのだが,正直,そんなに頻繁に使う機能ではないので,そのためにわざわざ大掛かりなことをするかどうか悩む.

まあよそのアプリケーションが信用できないというのはいいとしても,そのための方策が「ファイルを原則的にそれぞれのアプリに帰属させる」というのはないと思う.ふつうにファイルごとのアクセス制御でいいじゃん.何を言ってもスマートフォンというのは結局小さいPCであり,データが特定のアプリケーションでしか処理できないというのは根本的におかしいのだ.

以前つけた,ノートに画像を入れられる簡単な機能で,なんと端末をリブートすると画像が見れなくなることに気付いて,とりあえず修正.

ついでに,Content Provider経由のURIではなく,普通にファイルパスを書いても表示されるようにしてみた.こっちのほうが便利なのだが,そうすると共通UIで画像ファイルを選択することができない.というか,共通UIで画像を選択すると,必ずContent Providerを通したURIが返ってくる,というべきか.まあファイルパスがわかってる場合は手で書けばいいのだ.

そもそもContent Provider経由のデータって,読み出しとかの許可はリブートしたら消えるというのも知らなかった.すなおにストレージにアクセスできないので,「インストールしたアプリは基本的に信用できない」という前提のシステムというのは実にめんどくさいね.わけのわからんアプリなぞ入れるほうが悪い,というわけにはいかんのだろうなあ.

カメラからそのまま転送したようなサイズの大きい画像を見ているとき,なんかページ切り替えに妙な間があるように思えたので修正した.

たいしたことじゃないだろうとタカをくくっていたら,意外と調べるのに手間取った.というか,ViewPagerの作りかたが適当なせいでちゃんと先読みできてないんだろうと思ってたけど,別にそういうことではなかったのだ.どうやら,画像の表示に使っているSubsampling Scale Image Viewというやつの特性に関係があったらしい.でかい画像をタイリングするときにタイルの最大サイズが指定されてない状態だと,実際に画面に表示されるまで画像読み込みタスクが起動しないようである.

あと画像表示中に出てるファイル名がずれてるのも直した.これも間抜けな話で,そもそもViewPagerは普通に作っても隣のページのgetItem()が動くことを知らなかったのである.

前から悩んでいた「候補表示が出るたびにぴょこぴょこ画面が上下する問題」であるが,「候補表示をいちいち消さない」という方向で解決してみた.どうだろうこれ.最下行をIMEがずっと確保しつづけるとかDOS時代かよ,という気もしないでもない.

AndroidのIMEフレームワークでは,CandidatesViewを自由な場所に表示することは不可能のようなので,一般PCのIMEみたいな動作にするには,PopupWindowで自作するぐらいしか方法がないようだ.でも,現在カーソルがある場所を画面上の座標で得る方法が思いつかないので(これも無理かもしれない),これだと結局入力中の場所にかぶってしまう可能性があるんだよなあ.

あと,Honeycomb以下を切り捨てたので,ついでにエラーログだとか個人辞書エクスポートだとか,その程度のことで「ストレージ」権限を要求するのを止めた.4.4以降なら,プライベートディレクトリの読み書きは権限が要らないし.

……ICSとJellyBeanはどうなるんだ,と思った君は正しい.たぶんこの二つの機能は動かないはず(個人辞書のインポートや,外部辞書の読みこみは可能だと思う).もしICSやJellyBeanでSKKを使ってて,個人辞書のエクスポートとかできなくて困る,という人がいたら連絡してください.権限を復活させます(Marshmallow以降なら,オンにしなきゃすむ話だし).

おまけとして,音声入力で候補が複数ある場合はちゃんと選択できるようにした.じっさい使ってみてわかったけど,長文入力のときは音声入力ってすごい便利だな.あとは個人の発音の癖を学習してくれると最高なんだけど,残念ながらAPI的にそんなのがない.というか,学習するには,その場で訂正してフィードバックする仕組みが必要だろうけど,どういうインターフェースだったら使いやすいだろうか.いちいちEditTextのダイアログが出たらやっぱ面倒かなあ.

旅行に行けなくてツマランのでプログラムを書いたりしている.

まあこのアプリは,昔作った簡単ランチャーNoTouchLauncherを現代の環境で作り直したものなのだが,わりと別物のコードになってしまったので,もう別のアプリにした.しいて違うところを言うと,

  • マテリアルデザインっぽい見た目
  • キーボードショートカットを設定できるようになった
  • 長押しが「アプリ詳細画面を開く」固定になった(今は詳細画面からGoogle Playに飛べるので)
  • アプリの追加削除を自動で認識しない(手動でリロードする必要がある)

最後の制限はアレだ,なんか知らんけどOreoから「暗黙的Broadcastに対するReceiverを勝手に作っては駄目」という制限が増えたからどうしようもない.そもそも「重くなるから,よくあるBroadcastに対していちいち処理をするな」という話なので,アプリの追加削除ごとに自動で何かする,ということ自体がご禁制ということなんだろうしなあ.

あと,Kotlinで最近使えるようになったcoroutineというのは便利で驚いた.単に非同期にViewを更新したいとかなら,もう全部これでいいな.むかしAsyncTaskとかいう面倒なやつでboilerplateをいちいち書くはめになったのとは随分変わった.

なんか「下からふたつめのアイテムに向かって下向き移動をすると表示がくずれる」というピンポイントなバグに気付いたので修正.一番下に向かって移動するときだけを判定して別処理をしたかったわけなので,単純な数え間違いだ.

ついでに,権限が許可されてないときは起動時に要求するようにしてみた.いちいち設定を開ける手間が一回減るだけだけど.

というか,requestPermission()がなんか妙に面倒な奴なので,正直放置してもよかったかもしれない.要求ダイアログっぽいやつが表示されても,別スレッドで普通に処理が進み,なんとActivity#onPause()が実行されていて仰天した.どうも件のダイアログっぽいやつは実はActivityらしくて,だから元のActivityは裏に回ろうとしてonPause()に進むらしい.なんというフザけた動きだ.でもそのわりに裏で表示されている元Activityも普通の画面に進んでるっぽいんだけどなあ.

あとは内部的な整理である.ToolBarを自前で用意するのやめたりとか.あとAndroid Studioか何かのバージョンが上がったせいか,EditText#getText()がnullを返す可能性があるとかすげえ大量にエラー出してきて,いちいちチェックするのに手間がかかった.EditText生成中に呼ぶとnullを返すように最近修正されたらしいけど,何をやったらそうなるんだよ.