Android で よくある正規表現を使えるやつ

そもそもは Linkify のWEBリンクがなんだかな, と思い.

device-2011-08-23-153643

使えそうなよくある正規表現がいくつか用意されていたのですな.

public static final Pattern WEB_URL = Pattern.compile(
    "((?:(http|https|Http|Https|rtsp|Rtsp):\\/\\/(?:(?:[a-zA-Z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)"
  + "\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,64}(?:\\:(?:[a-zA-Z0-9\\$\\-\\_"
  + "\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,25})?\\@)?)?"
  + "(?:" + DOMAIN_NAME + ")"
  + "(?:\\:\\d{1,5})?)"
  + "(\\/(?:(?:[" + GOOD_IRI_CHAR + "\\;\\/\\?\\:\\@\\&\\=\\#\\~"
  + "\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])|(?:\\%[a-fA-F0-9]{2}))*)?"
  + "(?:\\b|$)");
public static final Pattern PHONE
  = Pattern.compile(                
      "(\\+[0-9]+[\\- \\.]*)?"      
    + "(\\([0-9]+\\)[\\- \\.]*)?"   
    + "([0-9][0-9\\- \\.]+[0-9])"); 
public static final Pattern EMAIL_ADDRESS
  = Pattern.compile(
    "[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}" +
    "\\@" +
    "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}" +
    "(" +
        "\\." +
        "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" +
     ")+"
  );

platform_frameworks_base/Patterns.java

すぐにそのまま使おう.


if (Patterns.WEB_URL.matcher(text).find()) {
  // do something
}

「厳格なのか?」でフィルターをつける場合.

// A match filter that only accepts odd numbers.
MatchFilter oddFilter = new MatchFilter() {
    public final boolean acceptMatch(CharSequence s, int start, int end) {
        int n = Character.digit(s.charAt(end-1), 10);
        return (n & 1) == 1;
    }
};

// Match all digits in the pattern but restrict links to only odd
// numbers using the filter.
Pattern pattern = Pattern.compile("[0-9]+");
Linkify.addLinks(text, pattern, "http://...", oddFilter, null);

Android Text Links Using Linkify


Retrofit 2.0-beta で ログを吐かせる

Retrofit

Okhttp 2.6.0+ では HTTPリクエスト/レスポンスのログ出力が可能なのだが,

New Logging Interceptor. The logging-interceptor subproject offers simple request and response logging. It may be configured to log headers and bodies for debugging. It requires this Maven dependency:

HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(Level.BASIC);
client.networkInterceptors().add(logging);

okhttp/CHANGELOG.md at master · square/okhttp

残念なことに retrofit 2.0.0-beta2 での同梱は 2.5.0 .

<!-- Dependencies -->
<android.version>4.1.1.4</android.version>
<android.platform>16</android.platform>
<okhttp.version>2.5.0</okhttp.version>
<animal.sniffer.version>1.14</animal.sniffer.version>

retrofit/pom.xml at master · square/retrofit

なので logging-interceptor 2.6.0 で.

    <dependency>
      <groupId>com.squareup.okhttp</groupId>
      <artifactId>okhttp</artifactId>
      <version>${project.version}</version>
    </dependency>

okhttp/okhttp-logging-interceptor at master · square/okhttp

compile 'com.squareup.okhttp:logging-interceptor:2.6.0' 
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();  
logging.setLevel(Level.BASIC);
OkHttpClient client = new OkHttpClient();  
httpClient.interceptors().add(logging);
Retrofit retrofit = new Retrofit.Builder()  
   .baseUrl(API_BASE_URL)
   .addConverterFactory(GsonConverterFactory.create())
   .client(httpClient)
   .build();

出力.

...
11:33:04.547 17090-17108 D/OkHttp: <-- HTTP/1.1 200 OK (469ms, 259-byte body)
11:33:04.550 17090-17296 D/OkHttp: --> GET /v5/item/1072964 HTTP/1.1
11:33:04.563 17090-17263 D/OkHttp: <-- HTTP/1.1 200 OK (250ms, 244-byte body)
11:33:04.566 17090-17108 D/OkHttp: --> GET /v5/item/1073510 HTTP/1.1
11:33:04.606 17090-17265 D/OkHttp: <-- HTTP/1.1 200 OK (252ms, 228-byte body)
11:33:04.609 17090-17263 D/OkHttp: --> GET /v5/item/1072585 HTTP/1.1
11:33:04.794 17090-17296 D/OkHttp: <-- HTTP/1.1 200 OK (244ms, 183-byte body)
11:33:04.796 17090-17265 D/OkHttp: --> GET /v5/item/1073275 HTTP/1.1

stable で対応するのかな.



消してしまった不要な通知を2度とこないように「通知履歴」から非表示設定する

朝起きたら

ふと気がついたら

どうでもいい通知が通知バーに満載.

screenshot-1445071325811

通知バーを開いてこれらを削除.

「通知をさせないように設定できる」ことはなんとなく知っているけど, なんだか面倒くさい.

などと思いつつ今日も何回も通知たちを削除する.

screenshot-1445071325811

なんだろうな, この毎度の無駄な動作.

通知の設定画面はいくつもある

設定が複雑な雰囲気がしてなんとなく設定することがおっくうになる.

例えば Twitter アプリからの通知表示を設定する場合, 以下の3つの画面から設定非表示にできる.

1. アプリの設定画面

通知を表示しているアプリを開いてそのアプリ内の詳細な設定画面で非表示にする.

20151017-100353

2. 設定の「アプリの通知」

Android(OS)自体の「設定」から.

「設定」-「通知」-「アプリの通知」-(通知しているアプリを選択)

20151017-100546

3. アプリ情報の画面

これも Android(OS)自体の「設定」.

「設定」-「アプリ」- (通知しているアプリを選択)

20151017-100635

それぞれの画面を見比べてみると, 「通知の設定」内の項目はいくつもあって, 画面によって項目が違う.

どのアプリが通知を表示していたのかわからない

通知のメッセージやアイコンを見てもどのアプリか分からないことがある.

タップするとPlayストアの見たこともないアプリのインストール画面が開くというインストールの勧誘. ブラウザが開いてサイトへの誘導もあったり.

普通にタップすると通知は消えてしまう.

通知を表示しているアプリ の特定ができないと通知の非表示設定はできない.

表示されている通知を長押しすると

表示されている通知を長押しで表示される i ボタンをタップでも 2.設定の「アプリの通知画面」を表示できる.

20151017-101731 3

ベルマークをタップすると 「通知のフィルタリング」画面へ記録されてアプリ名と通知の内容は残すことができる.

「設定」-「通知」-「通知のフィルタリング」

20151017-101731 2

が, めんどくさいのか, イラッとしてなのか, すぐに通知を消してしまう.

そして, また表示されることになる.

設定ウィジェットの「通知ログ」を使う

アプリをインストールする必要はありません.

設定項目別の「通知ログウィジェット」をホームに置いておきます.

20151017-100000

20151017-100027

20151017-100055

20151017-100109

タップすると, 通知を表示したアプリの履歴を最近順に見ることができます.

20151017-103438

消したい通知を見つけてタップすれば 3.アプリ情報の画面 が表示されるので「通知を表示」のチェックボックスをOFFにします.

20151017-100635

これなら通知を消したあとでも, かんたんに「アプリの特定」と「通知をOFF」を行うことができます.

通知が表示されない とかどうせブロックの設定だろ! → 原因「フィルター」