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