add internal logger, so user is able to provide logs on issues

This commit is contained in:
Helium314 2023-12-15 10:51:46 +01:00
parent 0739eca2ff
commit ad9282ea25
82 changed files with 287 additions and 171 deletions

View file

@ -7,7 +7,7 @@
package com.android.inputmethod.keyboard;
import android.graphics.Rect;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import androidx.annotation.NonNull;

View file

@ -7,7 +7,7 @@
package com.android.inputmethod.latin;
import android.text.TextUtils;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.util.SparseArray;
import androidx.annotation.NonNull;

View file

@ -6,7 +6,7 @@
package com.android.inputmethod.latin.utils;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import org.dslul.openboard.inputmethod.annotations.UsedForTesting;
import org.dslul.openboard.inputmethod.latin.NgramContext;

View file

@ -12,7 +12,7 @@ import android.os.Build
import android.os.SystemClock
import android.provider.Settings
import android.text.TextUtils
import android.util.Log
import org.dslul.openboard.inputmethod.latin.utils.Log
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup

View file

@ -8,7 +8,7 @@ package org.dslul.openboard.inputmethod.accessibility
import android.content.Context
import android.text.TextUtils
import android.util.Log
import org.dslul.openboard.inputmethod.latin.utils.Log
import android.util.SparseIntArray
import android.view.inputmethod.EditorInfo
import org.dslul.openboard.inputmethod.keyboard.Key

View file

@ -7,7 +7,7 @@
package org.dslul.openboard.inputmethod.accessibility
import android.os.SystemClock
import android.util.Log
import org.dslul.openboard.inputmethod.latin.utils.Log
import android.view.MotionEvent
import android.view.View
import android.view.accessibility.AccessibilityEvent

View file

@ -8,7 +8,7 @@ package org.dslul.openboard.inputmethod.accessibility
import android.graphics.Rect
import android.os.Bundle
import android.util.Log
import org.dslul.openboard.inputmethod.latin.utils.Log
import android.view.View
import android.view.accessibility.AccessibilityEvent
import android.view.accessibility.AccessibilityRecord

View file

@ -8,7 +8,7 @@ package org.dslul.openboard.inputmethod.accessibility
import android.graphics.Rect
import android.os.SystemClock
import android.util.Log
import org.dslul.openboard.inputmethod.latin.utils.Log
import android.util.SparseIntArray
import android.view.MotionEvent
import org.dslul.openboard.inputmethod.accessibility.AccessibilityLongPressTimer.LongPressTimerCallback

View file

@ -7,7 +7,7 @@
package org.dslul.openboard.inputmethod.accessibility
import android.graphics.Rect
import android.util.Log
import org.dslul.openboard.inputmethod.latin.utils.Log
import android.view.MotionEvent
import org.dslul.openboard.inputmethod.keyboard.KeyDetector
import org.dslul.openboard.inputmethod.keyboard.MoreKeysKeyboardView

View file

@ -7,7 +7,7 @@
package org.dslul.openboard.inputmethod.compat
import android.text.TextUtils
import android.util.Log
import org.dslul.openboard.inputmethod.latin.utils.Log
import java.lang.reflect.Constructor
import java.lang.reflect.Field
import java.lang.reflect.InvocationTargetException

View file

@ -13,7 +13,7 @@ import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
import android.os.Build;
import android.text.InputType;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.util.SparseArray;
import android.util.Xml;
import android.view.inputmethod.EditorInfo;

View file

@ -9,7 +9,7 @@ package org.dslul.openboard.inputmethod.keyboard;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.View;

View file

@ -18,7 +18,7 @@ import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;

View file

@ -11,7 +11,7 @@ import static java.lang.Math.abs;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.os.SystemClock;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.view.MotionEvent;
import android.view.inputmethod.InputMethodSubtype;

View file

@ -10,7 +10,7 @@ import static org.dslul.openboard.inputmethod.keyboard.internal.keyboard_parser.
import android.content.SharedPreferences;
import android.text.TextUtils;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

View file

@ -11,7 +11,7 @@ import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import androidx.core.graphics.PaintCompat;
import org.dslul.openboard.inputmethod.keyboard.Key;

View file

@ -13,7 +13,7 @@ import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;

View file

@ -6,7 +6,7 @@
package org.dslul.openboard.inputmethod.keyboard.emoji;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;

View file

@ -6,7 +6,7 @@
package org.dslul.openboard.inputmethod.keyboard.internal;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import androidx.annotation.NonNull;

View file

@ -8,7 +8,7 @@ package org.dslul.openboard.inputmethod.keyboard.internal;
import android.content.res.Resources;
import android.util.DisplayMetrics;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.common.Constants;

View file

@ -6,7 +6,7 @@
package org.dslul.openboard.inputmethod.keyboard.internal;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import org.dslul.openboard.inputmethod.latin.common.Constants;
import org.dslul.openboard.inputmethod.latin.common.InputPointers;

View file

@ -7,7 +7,7 @@
package org.dslul.openboard.inputmethod.keyboard.internal;
import android.content.res.TypedArray;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.util.SparseArray;
import androidx.annotation.NonNull;

View file

@ -7,7 +7,7 @@ package org.dslul.openboard.inputmethod.keyboard.internal
import android.content.Context
import android.content.res.Resources
import android.util.Log
import org.dslul.openboard.inputmethod.latin.utils.Log
import android.util.Xml
import android.widget.Toast
import androidx.annotation.XmlRes

View file

@ -9,7 +9,7 @@ package org.dslul.openboard.inputmethod.keyboard.internal;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.util.SparseIntArray;
import androidx.annotation.NonNull;

View file

@ -7,7 +7,7 @@
package org.dslul.openboard.inputmethod.keyboard.internal;
import android.text.TextUtils;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import androidx.annotation.NonNull;

View file

@ -9,7 +9,7 @@ package org.dslul.openboard.inputmethod.keyboard.internal;
import android.content.Context;
import android.content.res.Resources;
import android.text.TextUtils;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import org.dslul.openboard.inputmethod.annotations.UsedForTesting;
import org.dslul.openboard.inputmethod.latin.RichInputMethodManager;

View file

@ -6,7 +6,7 @@
package org.dslul.openboard.inputmethod.keyboard.internal;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import org.dslul.openboard.inputmethod.annotations.UsedForTesting;

View file

@ -6,7 +6,7 @@
package org.dslul.openboard.inputmethod.keyboard.internal;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import androidx.annotation.NonNull;

View file

@ -6,7 +6,7 @@
package org.dslul.openboard.inputmethod.keyboard.internal;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.view.MotionEvent;
import org.dslul.openboard.inputmethod.keyboard.Key;

View file

@ -6,7 +6,7 @@
package org.dslul.openboard.inputmethod.keyboard.internal;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import androidx.annotation.NonNull;

View file

@ -6,7 +6,7 @@
package org.dslul.openboard.inputmethod.keyboard.internal;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import androidx.annotation.NonNull;

View file

@ -6,7 +6,7 @@
package org.dslul.openboard.inputmethod.keyboard.internal;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import org.dslul.openboard.inputmethod.annotations.UsedForTesting;
import org.dslul.openboard.inputmethod.keyboard.internal.MatrixUtils.MatrixOperationFailedException;

View file

@ -3,7 +3,7 @@ package org.dslul.openboard.inputmethod.keyboard.internal.keyboard_parser
import android.content.Context
import android.content.res.Configuration
import android.content.res.Resources
import android.util.Log
import org.dslul.openboard.inputmethod.latin.utils.Log
import android.view.inputmethod.EditorInfo
import android.widget.Toast
import androidx.annotation.StringRes

View file

@ -2,7 +2,7 @@
package org.dslul.openboard.inputmethod.keyboard.internal.keyboard_parser
import android.content.Context
import android.util.Log
import org.dslul.openboard.inputmethod.latin.utils.Log
import org.dslul.openboard.inputmethod.keyboard.internal.KeyboardParams
import org.dslul.openboard.inputmethod.keyboard.internal.keyboard_parser.floris.KeyData
import org.dslul.openboard.inputmethod.keyboard.internal.keyboard_parser.floris.toTextKey

View file

@ -7,7 +7,7 @@ import android.content.res.XmlResourceParser;
import android.os.Build;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.util.TypedValue;
import android.util.Xml;

View file

@ -11,7 +11,7 @@ import static org.dslul.openboard.inputmethod.latin.settings.LanguageSettingsFra
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.AssetFileDescriptor;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import org.dslul.openboard.inputmethod.latin.common.FileUtils;
import org.dslul.openboard.inputmethod.latin.common.LocaleUtils;

View file

@ -11,7 +11,7 @@ import android.content.Context;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import androidx.annotation.Nullable;

View file

@ -12,7 +12,7 @@ import android.content.Context;
import android.database.ContentObserver;
import android.os.SystemClock;
import android.provider.ContactsContract.Contacts;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import org.dslul.openboard.inputmethod.latin.ContactsManager.ContactsChangedListener;
import org.dslul.openboard.inputmethod.latin.define.DebugFlags;

View file

@ -12,7 +12,7 @@ import android.database.sqlite.SQLiteException;
import android.net.Uri;
import android.provider.ContactsContract.Contacts;
import android.text.TextUtils;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import org.dslul.openboard.inputmethod.latin.common.Constants;

View file

@ -6,7 +6,7 @@
package org.dslul.openboard.inputmethod.latin;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import org.dslul.openboard.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import org.dslul.openboard.inputmethod.latin.common.ComposedData;

View file

@ -9,7 +9,7 @@ package org.dslul.openboard.inputmethod.latin;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
public class DictionaryDumpBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = DictionaryDumpBroadcastReceiver.class.getSimpleName();

View file

@ -10,7 +10,7 @@ import android.Manifest;
import android.content.Context;
import android.provider.UserDictionary;
import android.text.TextUtils;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.util.LruCache;
import androidx.annotation.NonNull;

View file

@ -7,7 +7,7 @@
package org.dslul.openboard.inputmethod.latin;
import android.content.Context;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import java.util.Locale;
import java.util.concurrent.TimeUnit;

View file

@ -10,7 +10,7 @@ import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.widget.Toast;
import org.dslul.openboard.inputmethod.latin.makedict.DictionaryHeader;

View file

@ -13,7 +13,7 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ProviderInfo;
import android.net.Uri;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import org.dslul.openboard.inputmethod.dictionarypack.DictionaryPackConstants;
import org.dslul.openboard.inputmethod.latin.utils.TargetPackageInfoGetterTask;

View file

@ -7,7 +7,7 @@
package org.dslul.openboard.inputmethod.latin;
import android.content.res.Resources;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.util.Pair;
import android.view.KeyEvent;

View file

@ -7,7 +7,7 @@
package org.dslul.openboard.inputmethod.latin;
import android.content.Context;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

View file

@ -8,7 +8,7 @@ package org.dslul.openboard.inputmethod.latin;
import android.os.Build;
import android.text.InputType;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.view.inputmethod.EditorInfo;
import org.dslul.openboard.inputmethod.latin.common.StringUtils;

View file

@ -21,7 +21,7 @@ import android.os.IBinder;
import android.os.Message;
import android.os.Process;
import android.text.InputType;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.util.PrintWriterPrinter;
import android.util.Printer;
import android.util.SparseArray;

View file

@ -15,7 +15,7 @@ import android.os.SystemClock;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.text.style.CharacterStyle;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.view.KeyEvent;
import android.view.inputmethod.CompletionInfo;
import android.view.inputmethod.CorrectionInfo;

View file

@ -11,7 +11,7 @@ import android.content.SharedPreferences;
import android.inputmethodservice.InputMethodService;
import android.os.AsyncTask;
import android.os.IBinder;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.InputMethodSubtype;

View file

@ -7,7 +7,7 @@
package org.dslul.openboard.inputmethod.latin;
import android.os.Build;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.view.inputmethod.InputMethodSubtype;
import org.dslul.openboard.inputmethod.compat.InputMethodSubtypeCompatUtils;

View file

@ -7,7 +7,7 @@
package org.dslul.openboard.inputmethod.latin;
import android.text.TextUtils;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import org.dslul.openboard.inputmethod.annotations.UsedForTesting;
import org.dslul.openboard.inputmethod.keyboard.Keyboard;

View file

@ -11,10 +11,9 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Process;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.view.inputmethod.InputMethodManager;
import org.dslul.openboard.inputmethod.keyboard.KeyboardLayoutSet;
@ -84,11 +83,6 @@ public final class SystemBroadcastReceiver extends BroadcastReceiver {
}
public static void toggleAppIcon(final Context context) {
final int appInfoFlags = context.getApplicationInfo().flags;
final boolean isSystemApp = (appInfoFlags & ApplicationInfo.FLAG_SYSTEM) > 0;
if (Log.isLoggable(TAG, Log.INFO)) {
Log.i(TAG, "toggleAppIcon() : FLAG_SYSTEM = " + isSystemApp);
}
final SharedPreferences prefs = DeviceProtectedUtils.getSharedPreferences(context);
context.getPackageManager().setComponentEnabledSetting(
new ComponentName(context, SetupActivity.class),

View file

@ -14,7 +14,7 @@ import android.database.sqlite.SQLiteException;
import android.net.Uri;
import android.provider.UserDictionary.Words;
import android.text.TextUtils;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import androidx.annotation.Nullable;

View file

@ -13,7 +13,7 @@ import android.text.Spanned;
import android.text.TextUtils;
import android.text.style.BackgroundColorSpan;
import android.text.style.SuggestionSpan;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.inputmethod.CorrectionInfo;

View file

@ -7,7 +7,7 @@
package org.dslul.openboard.inputmethod.latin.personalization;
import android.content.Context;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

View file

@ -1,84 +0,0 @@
/*
* Copyright (C) 2014 The Android Open Source Project
* modified
* SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only
*/
package org.dslul.openboard.inputmethod.latin.settings;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.preference.Preference;
import org.dslul.openboard.inputmethod.latin.BuildConfig;
import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.utils.SpannableStringUtils;
/**
* "About" sub screen.
*/
public final class AboutFragment extends SubScreenFragment {
@Override
public void onCreate(final Bundle icicle) {
super.onCreate(icicle);
addPreferencesFromResource(R.xml.prefs_screen_about);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
// need to set icon tint because old android versions don't use the vector drawables
for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) {
final Preference p = getPreferenceScreen().getPreference(0);
final Drawable icon = p.getIcon();
if (icon != null)
DrawableCompat.setTint(icon, Color.WHITE);
}
}
setupHiddenFeatures();
setupVersionPref();
}
private void setupHiddenFeatures() {
Preference hiddenFeaturesPreference = findPreference("hidden_features");
hiddenFeaturesPreference.setOnPreferenceClickListener(preference -> {
final String link = "<a href=\"https://developer.android.com/reference/android/content/Context#createDeviceProtectedStorageContext()\">"
+ getString(R.string.hidden_features_text) + "</a>";
final String message = requireContext().getString(R.string.hidden_features_message, link);
final Spanned dialogMessage = SpannableStringUtils.fromHtml(message);
final AlertDialog builder = new AlertDialog.Builder(requireContext())
.setIcon(R.drawable.ic_settings_about_hidden_features)
.setTitle(R.string.hidden_features_title)
.setMessage(dialogMessage)
.setPositiveButton(R.string.dialog_close, null)
.create();
builder.show();
((TextView) builder.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());
return true;
});
}
private void setupVersionPref() {
Preference versionPreference = findPreference("pref_key_version");
versionPreference.setSummary(BuildConfig.VERSION_NAME);
if (BuildConfig.DEBUG) return;
int[] count = new int[] {0};
versionPreference.setOnPreferenceClickListener((pref) -> {
if (getSharedPreferences().getBoolean(DebugSettings.PREF_SHOW_DEBUG_SETTINGS, false))
return true;
count[0]++;
if (count[0] < 5) return true;
getSharedPreferences().edit().putBoolean(DebugSettings.PREF_SHOW_DEBUG_SETTINGS, true).apply();
Toast.makeText(requireContext(), R.string.prefs_debug_settings_enabled, Toast.LENGTH_LONG).show();
return true;
});
}
}

View file

@ -0,0 +1,101 @@
/*
* Copyright (C) 2014 The Android Open Source Project
* modified
* SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only
*/
package org.dslul.openboard.inputmethod.latin.settings
import android.app.Activity
import android.content.Intent
import android.graphics.Color
import android.os.Build
import android.os.Bundle
import android.text.method.LinkMovementMethod
import android.view.View
import android.widget.TextView
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog
import androidx.core.graphics.drawable.DrawableCompat
import androidx.preference.Preference
import org.dslul.openboard.inputmethod.latin.BuildConfig
import org.dslul.openboard.inputmethod.latin.R
import org.dslul.openboard.inputmethod.latin.utils.Log
import org.dslul.openboard.inputmethod.latin.utils.SpannableStringUtils
/**
* "About" sub screen.
*/
class AboutFragment : SubScreenFragment() {
override fun onCreate(icicle: Bundle?) {
super.onCreate(icicle)
addPreferencesFromResource(R.xml.prefs_screen_about)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
// need to set icon tint because old android versions don't use the vector drawables
for (i in 0 until preferenceScreen.preferenceCount) {
val p = preferenceScreen.getPreference(0)
val icon = p.icon
if (icon != null) DrawableCompat.setTint(icon, Color.WHITE)
}
}
setupHiddenFeatures()
setupVersionPref()
findPreference<Preference>("log_reader")?.setOnPreferenceClickListener {
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT)
.addCategory(Intent.CATEGORY_OPENABLE)
.putExtra(Intent.EXTRA_TITLE,
requireContext().getString(R.string.english_ime_name)
.replace(" ", "_") + "_log_${System.currentTimeMillis()}.txt"
)
.setType("text/plain")
logFilePicker.launch(intent)
true
}
}
private val logFilePicker = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode != Activity.RESULT_OK) return@registerForActivityResult
val uri = result.data?.data ?: return@registerForActivityResult
activity?.contentResolver?.openOutputStream(uri)?.use { os ->
os.bufferedWriter().use { it.write(Log.getLog().joinToString("\n")) }
}
}
private fun setupHiddenFeatures() {
findPreference<Preference>("hidden_features")?.onPreferenceClickListener =
Preference.OnPreferenceClickListener {
val link = ("<a href=\"https://developer.android.com/reference/android/content/Context#createDeviceProtectedStorageContext()\">"
+ getString(R.string.hidden_features_text) + "</a>")
val message = requireContext().getString(R.string.hidden_features_message, link)
val dialogMessage = SpannableStringUtils.fromHtml(message)
val builder = AlertDialog.Builder(requireContext())
.setIcon(R.drawable.ic_settings_about_hidden_features)
.setTitle(R.string.hidden_features_title)
.setMessage(dialogMessage)
.setPositiveButton(R.string.dialog_close, null)
.create()
builder.show()
(builder.findViewById<View>(android.R.id.message) as TextView).movementMethod = LinkMovementMethod.getInstance()
true
}
}
private fun setupVersionPref() {
val versionPreference = findPreference<Preference>("pref_key_version") ?: return
versionPreference.summary = BuildConfig.VERSION_NAME
if (BuildConfig.DEBUG) return
var count = 0
versionPreference.onPreferenceClickListener =
Preference.OnPreferenceClickListener {
if (sharedPreferences.getBoolean(DebugSettings.PREF_SHOW_DEBUG_SETTINGS, false))
return@OnPreferenceClickListener true
count++
if (count < 5) return@OnPreferenceClickListener true
sharedPreferences.edit().putBoolean(DebugSettings.PREF_SHOW_DEBUG_SETTINGS, true).apply()
Toast.makeText(requireContext(), R.string.prefs_debug_settings_enabled, Toast.LENGTH_LONG).show()
true
}
}
}

View file

@ -11,7 +11,7 @@ import android.content.SharedPreferences
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.util.Log
import org.dslul.openboard.inputmethod.latin.utils.Log
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog
import androidx.preference.Preference

View file

@ -14,7 +14,7 @@ import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.Build;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.util.TypedValue;
import android.view.ContextThemeWrapper;

View file

@ -11,7 +11,7 @@ import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodSubtype;

View file

@ -14,7 +14,7 @@ import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.content.res.Resources;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;

View file

@ -17,7 +17,7 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.Message;
import android.provider.Settings;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.ImageView;

View file

@ -9,7 +9,7 @@ package org.dslul.openboard.inputmethod.latin.spellcheck;
import android.content.res.Resources;
import android.os.Binder;
import android.text.TextUtils;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.view.textservice.SentenceSuggestionsInfo;
import android.view.textservice.SuggestionsInfo;
import android.view.textservice.TextInfo;

View file

@ -13,7 +13,7 @@ import android.os.Binder;
import android.provider.UserDictionary.Words;
import android.service.textservice.SpellCheckerService.Session;
import android.text.TextUtils;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.util.LruCache;
import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.InputMethodSubtype;

View file

@ -8,7 +8,7 @@ package org.dslul.openboard.inputmethod.latin.suggestions;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import androidx.annotation.NonNull;

View file

@ -8,7 +8,7 @@ package org.dslul.openboard.inputmethod.latin.utils;
import android.os.Build;
import android.text.TextUtils;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.view.inputmethod.InputMethodSubtype;
import org.dslul.openboard.inputmethod.annotations.UsedForTesting;

View file

@ -12,7 +12,7 @@ import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
public final class ApplicationUtils {
private static final String TAG = ApplicationUtils.class.getSimpleName();

View file

@ -6,7 +6,7 @@
package org.dslul.openboard.inputmethod.latin.utils;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

View file

@ -6,7 +6,7 @@
package org.dslul.openboard.inputmethod.latin.utils;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import com.android.inputmethod.latin.utils.BinaryDictionaryUtils;

View file

@ -6,7 +6,7 @@
package org.dslul.openboard.inputmethod.latin.utils;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import org.dslul.openboard.inputmethod.latin.define.DebugFlags;

View file

@ -10,7 +10,7 @@ import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.preference.PreferenceManager;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import androidx.annotation.RequiresApi;

View file

@ -11,7 +11,7 @@ import android.content.Context;
import android.content.res.AssetManager;
import android.content.res.Resources;
import android.text.TextUtils;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.view.inputmethod.InputMethodSubtype;
import androidx.annotation.NonNull;

View file

@ -6,7 +6,7 @@
package org.dslul.openboard.inputmethod.latin.utils;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import org.dslul.openboard.inputmethod.annotations.UsedForTesting;
@ -47,7 +47,7 @@ public class ExecutorUtils {
public Thread newThread(final Runnable runnable) {
Thread thread = new Thread(runnable, TAG);
thread.setUncaughtExceptionHandler((thread1, ex) ->
Log.w(mName + "-" + runnable.getClass().getSimpleName(), ex));
Log.w(mName, runnable.getClass().getSimpleName(), ex));
return thread;
}
}

View file

@ -7,7 +7,7 @@
package org.dslul.openboard.inputmethod.latin.utils;
import android.app.Application;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import org.dslul.openboard.inputmethod.latin.BuildConfig;
import org.dslul.openboard.inputmethod.latin.define.JniLibName;

View file

@ -8,7 +8,7 @@ package org.dslul.openboard.inputmethod.latin.utils;
import android.util.JsonReader;
import android.util.JsonWriter;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import java.io.Closeable;
import java.io.IOException;

View file

@ -0,0 +1,98 @@
package org.dslul.openboard.inputmethod.latin.utils
import android.os.Build
import java.time.LocalDateTime
import java.util.Date
/**
* Logger that does the android logging, but also allows reading the log in the app.
* It's only a little slower than the android logger, but since both are used we end up at
* half performance (still fast enough to not be noticeable, unless spamming thousands of log lines)
*/
object Log {
@JvmStatic
fun wtf(tag: String?, message: String) {
log(LogLine('F', tag, message))
android.util.Log.wtf(tag, message)
}
@JvmStatic
fun e(tag: String?, message: String, e: Throwable) {
log(LogLine('E', tag, "$message\n${e.stackTraceToString()}"))
android.util.Log.e(tag, message, e)
}
@JvmStatic
fun e(tag: String?, message: String) {
log(LogLine('E', tag, message))
android.util.Log.e(tag, message)
}
@JvmStatic
fun w(tag: String?, message: String, e: Throwable) {
log(LogLine('W', tag, "$message\n${e.stackTraceToString()}"))
android.util.Log.w(tag, message, e)
}
@JvmStatic
fun w(tag: String?, message: String) {
log(LogLine('W', tag, message))
android.util.Log.w(tag, message)
}
@JvmStatic
fun i(tag: String?, message: String, e: Throwable) {
log(LogLine('I', tag, "$message\n${e.stackTraceToString()}"))
android.util.Log.i(tag, message, e)
}
@JvmStatic
fun i(tag: String?, message: String) {
log(LogLine('I', tag, message))
android.util.Log.i(tag, message)
}
@JvmStatic
fun d(tag: String?, message: String, e: Throwable) {
log(LogLine('D', tag, "$message\n${e.stackTraceToString()}"))
android.util.Log.d(tag, message, e)
}
@JvmStatic
fun d(tag: String?, message: String) {
log(LogLine('D', tag, message))
android.util.Log.d(tag, message)
}
@JvmStatic
fun v(tag: String?, message: String) {
log(LogLine('V', tag, message))
android.util.Log.v(tag, message)
}
private fun log(line: LogLine) {
synchronized(logLines) {
if (logLines.size > 12000) // clear oldest entries if list gets too long
logLines.subList(0, 2000).clear()
logLines.add(line)
}
}
private val logLines: MutableList<LogLine> = ArrayList(2000)
/** returns a copy of [logLines] */
fun getLog() = synchronized(logLines) { logLines.toList() }
}
data class LogLine(val level: Char, val tag: String?, val message: String) {
// time can be Date or LocalDateTime, doesn't matter because but it's used for toString only
private val time = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
LocalDateTime.now()
} else {
Date(System.currentTimeMillis())
}
override fun toString(): String = // should look like a normal android log line, at least for api26+
"${time.toString().replace('T', ' ')} $level $tag: $message"
}

View file

@ -12,7 +12,7 @@ import android.content.res.TypedArray;
import android.os.Build;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.util.TypedValue;
import org.dslul.openboard.inputmethod.annotations.UsedForTesting;

View file

@ -8,7 +8,7 @@ package org.dslul.openboard.inputmethod.latin.utils;
import android.content.Context;
import android.content.res.Resources;
import android.util.Log;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.view.inputmethod.InputMethodSubtype;
import org.dslul.openboard.inputmethod.latin.R;

View file

@ -661,11 +661,13 @@ New dictionary:
<!-- version for about screen-->
<string name="version">Version</string>
<!-- github repo link for about screen-->
<string name="about_github_link" >View on GitHub</string>
<string name="about_github_link">View on GitHub</string>
<!-- preference title for saving the log to a file -->
<string name="save_log">Save log</string>
<!-- license for about screen-->
<string name="license" >Open-source license</string>
<string name="license">Open-source license</string>
<!-- license link for about screen-->
<string name="gnu_gpl" >GNU General Public License v3.0</string>
<string name="gnu_gpl">GNU General Public License v3.0</string>
<!-- Button to close a dialog where neither "ok" nor "cancel" are suitable -->
<string name="dialog_close">Close</string>
<!-- Preference for selecting system locales -->

View file

@ -41,4 +41,9 @@
android:action="android.intent.action.VIEW"
android:data="https://github.com/Helium314/openboard" />
</Preference>
<Preference
android:title="@string/save_log"
android:key="log_reader" > <!-- todo (low priority): add icon -->
</Preference>
</PreferenceScreen>