19f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li/*
2f04335f899f2cce69f843692a3cb9cec229683c2tturney * Copyright (C) 2017 The Android Open Source Project
39f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li *
4f04335f899f2cce69f843692a3cb9cec229683c2tturney * Licensed under the Apache License, Version 2.0 (the "License");
5f04335f899f2cce69f843692a3cb9cec229683c2tturney * you may not use this file except in compliance with the License.
6f04335f899f2cce69f843692a3cb9cec229683c2tturney * You may obtain a copy of the License at
79f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li *
8f04335f899f2cce69f843692a3cb9cec229683c2tturney *      http://www.apache.org/licenses/LICENSE-2.0
99f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li *
109f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * Unless required by applicable law or agreed to in writing, software
11f04335f899f2cce69f843692a3cb9cec229683c2tturney * distributed under the License is distributed on an "AS IS" BASIS,
12f04335f899f2cce69f843692a3cb9cec229683c2tturney * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f04335f899f2cce69f843692a3cb9cec229683c2tturney * See the License for the specific language governing permissions and
14f04335f899f2cce69f843692a3cb9cec229683c2tturney * limitations under the License.
159f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li */
169f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
179f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Lipackage com.googlecode.android_scripting;
189f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
199f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.app.AlertDialog;
209f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.app.Notification;
21b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdrimport android.app.NotificationChannel;
229f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.app.NotificationManager;
239f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.app.PendingIntent;
249f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.content.Context;
259f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.content.DialogInterface;
269f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.widget.Toast;
279f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
289f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Lipublic class Log {
29b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdr  private static final String CHANNEL_ID = "log_channel";
309f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  private Log() {
319f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    // Utility class.
329f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
339f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
349f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  private static String getTag() {
359f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
369f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    String fullClassName = stackTraceElements[4].getClassName();
379f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    String className = fullClassName.substring(fullClassName.lastIndexOf(".") + 1);
389f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    int lineNumber = stackTraceElements[4].getLineNumber();
399f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    return "sl4a." + className + ":" + lineNumber;
409f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
419f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
429f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  private static void toast(Context context, String message) {
439f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
449f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
459f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
46b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdr  private static int getStringId(String identifier, Context context) {
47b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdr    String packageName = context.getPackageName();
48b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdr    return context.getResources().getIdentifier(identifier, "string", packageName);
49b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdr  }
50b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdr
51b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdr  private static void createNotificationChannel(Context context, NotificationManager notificationManager) {
52b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdr    CharSequence name = context.getString(getStringId("notification_channel_name", context));
53b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdr    String description = context.getString(getStringId("notification_channel_description", context));
54b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdr    int importance = NotificationManager.IMPORTANCE_DEFAULT;
55b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdr    NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
56b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdr    channel.setDescription(description);
57b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdr    channel.enableLights(false);
58b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdr    channel.enableVibration(false);
59b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdr    notificationManager.createNotificationChannel(channel);
60b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdr  }
61b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdr
629f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void notify(Context context, String title, String contentTitle, String message) {
639f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.v(getTag(), String.format("%s %s", contentTitle, message));
649f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
659f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    NotificationManager notificationManager =
669f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
67b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdr    createNotificationChannel(context, notificationManager);
68b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdr
69b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdr    String packageName = context.getPackageName();
70b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdr    int iconId = context.getResources().getIdentifier("stat_sys_warning", "drawable", packageName);
71b3f8e1d6263717fa6e058cbc50deeaddadd9c3f7markdr    Notification.Builder builder = new Notification.Builder(context, CHANNEL_ID);
729f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    builder.setSmallIcon(iconId > 0 ? iconId : -1)
739f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li           .setTicker(title)
749f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li           .setWhen(0)
759f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li           .setContentTitle(contentTitle)
769f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li           .setContentText(message)
779f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li           .setContentIntent(PendingIntent.getService(context, 0, null, 0));
789f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    Notification note = builder.build();
799f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    note.contentView.getLayoutId();
809f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    notificationManager.notify(NotificationIdFactory.create(), note);
819f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
829f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
839f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void showDialog(final Context context, final String title, final String message) {
849f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.v(getTag(), String.format("%s %s", title, message));
859f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
869f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    MainThread.run(context, new Runnable() {
879f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      @Override
889f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      public void run() {
899f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        AlertDialog.Builder builder = new AlertDialog.Builder(context);
909f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        builder.setTitle(title);
919f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        builder.setMessage(message);
929f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
939f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        DialogInterface.OnClickListener buttonListener = new DialogInterface.OnClickListener() {
949f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li          @Override
959f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li          public void onClick(DialogInterface dialog, int which) {
969f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li            dialog.dismiss();
979f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li          }
989f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        };
999f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        builder.setPositiveButton("Ok", buttonListener);
1009f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        builder.show();
1019f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      }
1029f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    });
1039f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1049f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1059f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void v(String message) {
1069f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.v(getTag(), message);
1079f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1089f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1099f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void v(String message, Throwable e) {
1109f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.v(getTag(), message, e);
1119f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1129f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1139f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void v(Context context, String message) {
1149f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    toast(context, message);
1159f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.v(getTag(), message);
1169f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1179f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1189f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void v(Context context, String message, Throwable e) {
1199f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    toast(context, message);
1209f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.v(getTag(), message, e);
1219f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1229f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1239f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void e(Throwable e) {
1249f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.e(getTag(), "Error", e);
1259f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1269f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1279f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void e(String message) {
1289f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.e(getTag(), message);
1299f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1309f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1319f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void e(String message, Throwable e) {
1329f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.e(getTag(), message, e);
1339f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1349f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1359f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void e(Context context, String message) {
1369f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    toast(context, message);
1379f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.e(getTag(), message);
1389f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1399f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1409f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void e(Context context, String message, Throwable e) {
1419f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    toast(context, message);
1429f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.e(getTag(), message, e);
1439f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1449f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1459f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void w(Throwable e) {
1469f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.w(getTag(), "Warning", e);
1479f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1489f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1499f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void w(String message) {
1509f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.w(getTag(), message);
1519f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1529f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1539f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void w(String message, Throwable e) {
1549f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.w(getTag(), message, e);
1559f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1569f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1579f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void w(Context context, String message) {
1589f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    toast(context, message);
1599f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.w(getTag(), message);
1609f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1619f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1629f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void w(Context context, String message, Throwable e) {
1639f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    toast(context, message);
1649f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.w(getTag(), message, e);
1659f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1669f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1679f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void d(String message) {
1689f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.d(getTag(), message);
1699f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1709f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1719f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void d(String message, Throwable e) {
1729f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.d(getTag(), message, e);
1739f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1749f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1759f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void d(Context context, String message) {
1769f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    toast(context, message);
1779f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.d(getTag(), message);
1789f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1799f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1809f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void d(Context context, String message, Throwable e) {
1819f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    toast(context, message);
1829f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.d(getTag(), message, e);
1839f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1849f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1859f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void i(String message) {
1869f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.i(getTag(), message);
1879f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1889f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1899f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void i(String message, Throwable e) {
1909f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.i(getTag(), message, e);
1919f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1929f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1939f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void i(Context context, String message) {
1949f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    toast(context, message);
1959f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.i(getTag(), message);
1969f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1979f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1989f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static void i(Context context, String message, Throwable e) {
1999f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    toast(context, message);
2009f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    android.util.Log.i(getTag(), message, e);
2019f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
2029f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li}
203