Java程序  |  203行  |  6.61 KB

/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.googlecode.android_scripting;

import android.app.AlertDialog;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.widget.Toast;

public class Log {
  private static final String CHANNEL_ID = "log_channel";
  private Log() {
    // Utility class.
  }

  private static String getTag() {
    StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
    String fullClassName = stackTraceElements[4].getClassName();
    String className = fullClassName.substring(fullClassName.lastIndexOf(".") + 1);
    int lineNumber = stackTraceElements[4].getLineNumber();
    return "sl4a." + className + ":" + lineNumber;
  }

  private static void toast(Context context, String message) {
    Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
  }

  private static int getStringId(String identifier, Context context) {
    String packageName = context.getPackageName();
    return context.getResources().getIdentifier(identifier, "string", packageName);
  }

  private static void createNotificationChannel(Context context, NotificationManager notificationManager) {
    CharSequence name = context.getString(getStringId("notification_channel_name", context));
    String description = context.getString(getStringId("notification_channel_description", context));
    int importance = NotificationManager.IMPORTANCE_DEFAULT;
    NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
    channel.setDescription(description);
    channel.enableLights(false);
    channel.enableVibration(false);
    notificationManager.createNotificationChannel(channel);
  }

  public static void notify(Context context, String title, String contentTitle, String message) {
    android.util.Log.v(getTag(), String.format("%s %s", contentTitle, message));

    NotificationManager notificationManager =
        (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    createNotificationChannel(context, notificationManager);

    String packageName = context.getPackageName();
    int iconId = context.getResources().getIdentifier("stat_sys_warning", "drawable", packageName);
    Notification.Builder builder = new Notification.Builder(context, CHANNEL_ID);
    builder.setSmallIcon(iconId > 0 ? iconId : -1)
           .setTicker(title)
           .setWhen(0)
           .setContentTitle(contentTitle)
           .setContentText(message)
           .setContentIntent(PendingIntent.getService(context, 0, null, 0));
    Notification note = builder.build();
    note.contentView.getLayoutId();
    notificationManager.notify(NotificationIdFactory.create(), note);
  }

  public static void showDialog(final Context context, final String title, final String message) {
    android.util.Log.v(getTag(), String.format("%s %s", title, message));

    MainThread.run(context, new Runnable() {
      @Override
      public void run() {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle(title);
        builder.setMessage(message);

        DialogInterface.OnClickListener buttonListener = new DialogInterface.OnClickListener() {
          @Override
          public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
          }
        };
        builder.setPositiveButton("Ok", buttonListener);
        builder.show();
      }
    });
  }

  public static void v(String message) {
    android.util.Log.v(getTag(), message);
  }

  public static void v(String message, Throwable e) {
    android.util.Log.v(getTag(), message, e);
  }

  public static void v(Context context, String message) {
    toast(context, message);
    android.util.Log.v(getTag(), message);
  }

  public static void v(Context context, String message, Throwable e) {
    toast(context, message);
    android.util.Log.v(getTag(), message, e);
  }

  public static void e(Throwable e) {
    android.util.Log.e(getTag(), "Error", e);
  }

  public static void e(String message) {
    android.util.Log.e(getTag(), message);
  }

  public static void e(String message, Throwable e) {
    android.util.Log.e(getTag(), message, e);
  }

  public static void e(Context context, String message) {
    toast(context, message);
    android.util.Log.e(getTag(), message);
  }

  public static void e(Context context, String message, Throwable e) {
    toast(context, message);
    android.util.Log.e(getTag(), message, e);
  }

  public static void w(Throwable e) {
    android.util.Log.w(getTag(), "Warning", e);
  }

  public static void w(String message) {
    android.util.Log.w(getTag(), message);
  }

  public static void w(String message, Throwable e) {
    android.util.Log.w(getTag(), message, e);
  }

  public static void w(Context context, String message) {
    toast(context, message);
    android.util.Log.w(getTag(), message);
  }

  public static void w(Context context, String message, Throwable e) {
    toast(context, message);
    android.util.Log.w(getTag(), message, e);
  }

  public static void d(String message) {
    android.util.Log.d(getTag(), message);
  }

  public static void d(String message, Throwable e) {
    android.util.Log.d(getTag(), message, e);
  }

  public static void d(Context context, String message) {
    toast(context, message);
    android.util.Log.d(getTag(), message);
  }

  public static void d(Context context, String message, Throwable e) {
    toast(context, message);
    android.util.Log.d(getTag(), message, e);
  }

  public static void i(String message) {
    android.util.Log.i(getTag(), message);
  }

  public static void i(String message, Throwable e) {
    android.util.Log.i(getTag(), message, e);
  }

  public static void i(Context context, String message) {
    toast(context, message);
    android.util.Log.i(getTag(), message);
  }

  public static void i(Context context, String message, Throwable e) {
    toast(context, message);
    android.util.Log.i(getTag(), message, e);
  }
}