読書尚友の最近の改良について。
パスワードで保護されたPDFの表示
読書尚友ではPDFの表示にAndroidPDFViewを使用している。このライブラリはパスワード付PDFにも対応しているので、サポートしてみた。
github.com
パスワード付のPDFを開くときに下記のようにパスワードの入力を求める。
実現方法だが、最初にpassword(null)でload()を試み、パスワード付の場合はOnErrorで定義したハンドラに飛ぶので、その中でダイアログでパスワードを入力して再度パスワードを指定してload()を行う。
private String mFilePath;
private int pageNumber;
private PDFView pdfView;
pdfView = (PDFView)findViewById(R.id.pdfView);
DoOpenPDF(null); // パスワード無しでopenを試みる
private void DoOpenPDF(String _password) {
File file = new File(mFilePath);
if (file.exists()) {
pdfView.recycle();
pdfView.fromFile(file)
.enableSwipe(true) //スワイプオンオフ
.swipeHorizontal(swipeHorizontal) // T:横スクロール F:縦スクロール
.enableDoubletap(true) // ダブルタップでの拡大
.defaultPage(pageNumber)
.onPageChange(this)
.enableAnnotationRendering(false)
.onLoad(this)
.onError(this)
.scrollHandle(new DefaultScrollHandle(this))
.password(_password)
.pageFling(swipeHorizontal)
.load();
}
}
// loadが成功した後に呼ばれる
@Override
public void loadComplete(int nbPages) {
metaData = pdfView.getDocumentMeta();
if ( metaData != null ) {
String title = metaData.getTitle();
//
}
}
// load が失敗した場合に呼ばれる。
@Override
public void onError(Throwable t) {
if ( t.getMessage().equals("Password required or incorrect password.")) {
final EditText editText = new EditText(this);
editText.setSingleLine(); // 1行モード
editText.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD | InputType.TYPE_CLASS_TEXT);
// パスワードとして入力
new AlertDialog.Builder(this)
.setTitle( getString(R.string.str_incorrect_password) )
.setView(editText)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String value = editText.getText().toString();
DoOpenPDF(value);
}
})
.show();
}
}
作品リストの絞り込み検索、高速スクロール他
- 作品リストに表示される件数が多い場合に目的の作品を見つけるのが困難なので、作品リストの上部に絞り込み検索の窓をもうけた。
- ListViewにsetFastScrollEnabled(true)を適用して右端に高速スクロールのためのつまみが表示されるようにした。ただし項目の右側のボタン(縦の…)が押しにくくなるので、右端からボタンまでの距離を多めにとって調整した。
- これまでは、「ダウンロードした作品にダウンロード済みのマークを表示」していたが、本棚と表示方法を統一し、「未ダウンロードの作品に雲マークを表示する」ように変更した。
今後GooglePlayにアプリを提出するときにtargetSdkVersion=28以上が強制されるようになるので、今回からtargetSdkVersion=28にしたところ、Android 9(Pie)で実行するときにデフォルトではhttp:が許可されず、https:でないと通信ができないようになった。
本当はドメイン毎にhttpを許可する実装が望ましいが、安直な回避方法は、manifestに次の記述を加えるとhttp通信が許可できる。
android:usesCleartextTraffic="true"