mirror of
https://gitlab.com/neothefox/LayTray
synced 2026-03-23 21:54:54 +03:00
Compare commits
No commits in common. "master" and "1.1" have entirely different histories.
9
.gitignore
vendored
9
.gitignore
vendored
@ -1,9 +0,0 @@
|
||||
.gradle
|
||||
.idea
|
||||
build
|
||||
LayTray.iml
|
||||
local.properties
|
||||
|
||||
app/app.iml
|
||||
app/release
|
||||
app/build
|
||||
12
README.md
12
README.md
@ -1,12 +0,0 @@
|
||||
# LayTray
|
||||
|
||||
## About
|
||||
|
||||
This app keeps a small text icon in the notification area to let you know what Layout you are using. Developed for Blackberry KeyOne and possibly other QWERTY phones. This is based on the Toast notification that keyboard produces upon switching layouts.
|
||||
|
||||
An icon can help users with short-term memory problems or vision problems interact with their device.
|
||||
|
||||
## Get it
|
||||
[Play Store](https://play.google.com/store/apps/details?id=space.neothefox.laytray)
|
||||
[F-Droid](https://f-droid.org/en/packages/space.neothefox.laytray/)
|
||||
|
||||
@ -1,13 +1,13 @@
|
||||
apply plugin: 'com.android.application'
|
||||
|
||||
android {
|
||||
compileSdkVersion 27
|
||||
compileSdkVersion 26
|
||||
defaultConfig {
|
||||
applicationId "space.neothefox.laytray"
|
||||
minSdkVersion 23
|
||||
targetSdkVersion 27
|
||||
versionCode 11
|
||||
versionName "1.10"
|
||||
minSdkVersion 25
|
||||
targetSdkVersion 26
|
||||
versionCode 2
|
||||
versionName "1.1"
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
buildTypes {
|
||||
@ -21,10 +21,11 @@ android {
|
||||
|
||||
dependencies {
|
||||
implementation fileTree(include: ['*.jar'], dir: 'libs')
|
||||
implementation 'com.android.support:appcompat-v7:27.1.1'
|
||||
implementation 'com.android.support:appcompat-v7:26.1.0'
|
||||
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
|
||||
implementation 'com.android.support:support-v4:27.1.1'
|
||||
testImplementation 'junit:junit:4.12'
|
||||
androidTestImplementation 'com.android.support.test:runner:1.0.2'
|
||||
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
|
||||
implementation 'com.android.support:design:27.1.1'
|
||||
implementation 'com.android.support:design:26.1.0'
|
||||
implementation 'com.github.javadev:underscore:1.34'
|
||||
}
|
||||
|
||||
21
app/proguard-rules.pro
vendored
Normal file
21
app/proguard-rules.pro
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
# Add project specific ProGuard rules here.
|
||||
# You can control the set of applied configuration files using the
|
||||
# proguardFiles setting in build.gradle.
|
||||
#
|
||||
# For more details, see
|
||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||
|
||||
# If your project uses WebView with JS, uncomment the following
|
||||
# and specify the fully qualified class name to the JavaScript interface
|
||||
# class:
|
||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||
# public *;
|
||||
#}
|
||||
|
||||
# Uncomment this to preserve the line number information for
|
||||
# debugging stack traces.
|
||||
#-keepattributes SourceFile,LineNumberTable
|
||||
|
||||
# If you keep the line number information, uncomment this to
|
||||
# hide the original source file name.
|
||||
#-renamesourcefileattribute SourceFile
|
||||
@ -10,40 +10,25 @@
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme">
|
||||
<activity android:name=".MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<service
|
||||
android:name=".IconService"
|
||||
android:enabled="true"
|
||||
android:exported="true"
|
||||
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" >
|
||||
<meta-data
|
||||
android:name="android.accessibilityservice"
|
||||
android:resource="@xml/accessibility_service_config" />
|
||||
android:summary="A simple keyboard layout indicator for physical keyboards"
|
||||
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.accessibilityservice.AccessibilityService" />
|
||||
<action android:name="android.accessibilityservice.AccessibilityService"></action>
|
||||
</intent-filter>
|
||||
|
||||
</service>
|
||||
|
||||
<activity
|
||||
android:name=".SettingsActivity"
|
||||
android:label="@string/title_activity_settings"
|
||||
android:parentActivityName=".MainActivity">
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value="space.neothefox.laytray.MainActivity" />
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".AboutActivity"
|
||||
android:parentActivityName=".MainActivity">
|
||||
</activity>
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
BIN
app/src/main/LayKey-feature-graphic.png
Normal file
BIN
app/src/main/LayKey-feature-graphic.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 55 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 42 KiB |
@ -1,15 +0,0 @@
|
||||
package space.neothefox.laytray;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
|
||||
public class AboutActivity extends Activity
|
||||
{
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_about);
|
||||
}
|
||||
}
|
||||
@ -1,125 +0,0 @@
|
||||
package space.neothefox.laytray;
|
||||
|
||||
import android.content.res.Configuration;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceActivity;
|
||||
import android.support.annotation.LayoutRes;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v7.app.ActionBar;
|
||||
import android.support.v7.app.AppCompatDelegate;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
/**
|
||||
* A {@link android.preference.PreferenceActivity} which implements and proxies the necessary calls
|
||||
* to be used with AppCompat.
|
||||
*/
|
||||
public abstract class AppCompatPreferenceActivity extends PreferenceActivity
|
||||
{
|
||||
|
||||
private AppCompatDelegate mDelegate;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
getDelegate().installViewFactory();
|
||||
getDelegate().onCreate(savedInstanceState);
|
||||
super.onCreate(savedInstanceState);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onPostCreate(savedInstanceState);
|
||||
getDelegate().onPostCreate(savedInstanceState);
|
||||
}
|
||||
|
||||
public ActionBar getSupportActionBar() {
|
||||
return getDelegate().getSupportActionBar();
|
||||
}
|
||||
|
||||
public void setSupportActionBar(@Nullable Toolbar toolbar)
|
||||
{
|
||||
getDelegate().setSupportActionBar(toolbar);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MenuInflater getMenuInflater()
|
||||
{
|
||||
return getDelegate().getMenuInflater();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setContentView(@LayoutRes int layoutResID)
|
||||
{
|
||||
getDelegate().setContentView(layoutResID);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setContentView(View view) {
|
||||
getDelegate().setContentView(view);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setContentView(View view, ViewGroup.LayoutParams params)
|
||||
{
|
||||
getDelegate().setContentView(view, params);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addContentView(View view, ViewGroup.LayoutParams params)
|
||||
{
|
||||
getDelegate().addContentView(view, params);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostResume()
|
||||
{
|
||||
super.onPostResume();
|
||||
getDelegate().onPostResume();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onTitleChanged(CharSequence title, int color)
|
||||
{
|
||||
super.onTitleChanged(title, color);
|
||||
getDelegate().setTitle(title);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigurationChanged(Configuration newConfig)
|
||||
{
|
||||
super.onConfigurationChanged(newConfig);
|
||||
getDelegate().onConfigurationChanged(newConfig);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop()
|
||||
{
|
||||
super.onStop();
|
||||
getDelegate().onStop();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy()
|
||||
{
|
||||
super.onDestroy();
|
||||
getDelegate().onDestroy();
|
||||
}
|
||||
|
||||
public void invalidateOptionsMenu()
|
||||
{
|
||||
getDelegate().invalidateOptionsMenu();
|
||||
}
|
||||
|
||||
private AppCompatDelegate getDelegate()
|
||||
{
|
||||
if (mDelegate == null)
|
||||
{
|
||||
mDelegate = AppCompatDelegate.create(this, null);
|
||||
}
|
||||
return mDelegate;
|
||||
}
|
||||
}
|
||||
@ -1,149 +0,0 @@
|
||||
package space.neothefox.laytray;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.graphics.PorterDuffXfermode;
|
||||
import android.graphics.RectF;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
import static android.graphics.Paint.ANTI_ALIAS_FLAG;
|
||||
|
||||
public class IconBuilderPreview extends View
|
||||
{
|
||||
|
||||
private int mode;
|
||||
private int textSize;
|
||||
private boolean fakeBold;
|
||||
private int textColor;
|
||||
|
||||
public IconBuilderPreview(Context context)
|
||||
{
|
||||
super(context);
|
||||
initValues();
|
||||
}
|
||||
|
||||
public IconBuilderPreview(Context context, @Nullable AttributeSet attrs)
|
||||
{
|
||||
super(context, attrs);
|
||||
initValues();
|
||||
}
|
||||
|
||||
public IconBuilderPreview(Context context, @Nullable AttributeSet attrs, int defStyleAttr)
|
||||
{
|
||||
super(context, attrs, defStyleAttr);
|
||||
initValues();
|
||||
}
|
||||
|
||||
public IconBuilderPreview(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes)
|
||||
{
|
||||
super(context, attrs, defStyleAttr, defStyleRes);
|
||||
initValues();
|
||||
}
|
||||
|
||||
private void initValues()
|
||||
{
|
||||
textSize = 48 * 10;
|
||||
fakeBold = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDraw(Canvas canvas)
|
||||
{
|
||||
super.onDraw(canvas);
|
||||
mode = 2;
|
||||
fakeBold = true;
|
||||
int width = 48 * 10;
|
||||
int height = 48 * 10;
|
||||
textColor = Color.WHITE;
|
||||
String text = "EN";
|
||||
|
||||
this.setLayoutParams(new LinearLayout.LayoutParams(height, width));
|
||||
|
||||
Paint paint = new Paint(ANTI_ALIAS_FLAG);
|
||||
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));
|
||||
paint.setTextSize(textSize);
|
||||
paint.setFakeBoldText(fakeBold);
|
||||
paint.setColor(textColor);
|
||||
switch (mode)
|
||||
{
|
||||
case 1: {
|
||||
|
||||
canvas.drawCircle(width / 2f, height / 2f, width / 2f, paint);
|
||||
//paint.setAlpha(255);
|
||||
paint.setColor(Color.BLACK);
|
||||
paint.setTextSize(textSize);
|
||||
paint.setTextAlign(Paint.Align.CENTER);
|
||||
canvas.drawText(text, width / 2f, height / 2f + textSize / 2f, paint);
|
||||
return;
|
||||
}
|
||||
|
||||
case 2: {
|
||||
|
||||
canvas.drawRoundRect(new RectF(0, 0, height, width), 5, 5, paint);
|
||||
//paint.setAlpha(255);
|
||||
paint.setColor(Color.BLACK);
|
||||
paint.setTextSize(textSize);
|
||||
paint.setTextAlign(Paint.Align.CENTER);
|
||||
canvas.drawText(text, width / 2f, height / 2f + textSize / 2f, paint);
|
||||
return ;
|
||||
}
|
||||
|
||||
case 0:
|
||||
default:
|
||||
paint.setTextAlign(Paint.Align.LEFT);
|
||||
float baseline = -paint.ascent(); // ascent() is negative
|
||||
width = (int) (paint.measureText(text) + 0.5f); // round
|
||||
height = (int) (baseline + paint.descent() + 0.5f);
|
||||
Bitmap image = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
||||
canvas.drawText(text, 0, baseline, paint);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
public int getMode()
|
||||
{
|
||||
return mode;
|
||||
}
|
||||
|
||||
public int getTextSize()
|
||||
{
|
||||
return textSize;
|
||||
}
|
||||
|
||||
public boolean isFakeBold()
|
||||
{
|
||||
return fakeBold;
|
||||
}
|
||||
|
||||
public int getTextColor()
|
||||
{
|
||||
return textColor;
|
||||
}
|
||||
|
||||
public void setMode(int mode)
|
||||
{
|
||||
this.mode = mode;
|
||||
}
|
||||
|
||||
public void setTextSize(int textSize)
|
||||
{
|
||||
this.textSize = textSize * 10;
|
||||
}
|
||||
|
||||
public void setFakeBold(boolean fakeBold)
|
||||
{
|
||||
this.fakeBold = fakeBold;
|
||||
}
|
||||
|
||||
public void setTextColor(int textColor)
|
||||
{
|
||||
this.textColor = textColor;
|
||||
}
|
||||
}
|
||||
@ -3,47 +3,33 @@ package space.neothefox.laytray;
|
||||
import android.accessibilityservice.AccessibilityService;
|
||||
import android.accessibilityservice.AccessibilityServiceInfo;
|
||||
import android.app.Notification;
|
||||
import android.app.NotificationChannel;
|
||||
import android.app.NotificationManager;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.BitmapFactory;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.graphics.PorterDuffXfermode;
|
||||
import android.graphics.RectF;
|
||||
import android.graphics.drawable.Icon;
|
||||
import android.os.Build;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.util.Log;
|
||||
import android.view.accessibility.AccessibilityEvent;
|
||||
|
||||
import static android.graphics.Paint.ANTI_ALIAS_FLAG;
|
||||
|
||||
|
||||
@SuppressWarnings("SuspiciousNameCombination")
|
||||
public class IconService extends AccessibilityService
|
||||
implements SharedPreferences.OnSharedPreferenceChangeListener
|
||||
{
|
||||
implements SharedPreferences.OnSharedPreferenceChangeListener{
|
||||
|
||||
public static final String TAG = "layicon";
|
||||
public static final String channelId = "space.neothefox.laytray.IC";
|
||||
public String TAG = "layicon";
|
||||
private final AccessibilityServiceInfo serviceInfo = new AccessibilityServiceInfo();
|
||||
//Map<CharSequence, String> layoutText = new HashMap<>();
|
||||
|
||||
private SharedPreferences layouts;
|
||||
private SharedPreferences iconsPrefs;
|
||||
private SharedPreferences options;
|
||||
private String lastToast;
|
||||
SharedPreferences layouts;
|
||||
|
||||
private NotificationManager iconManager;
|
||||
private NotificationChannel iconChannel;
|
||||
NotificationManager iconManager;
|
||||
|
||||
@Override
|
||||
protected void onServiceConnected()
|
||||
{
|
||||
protected void onServiceConnected() {
|
||||
super.onServiceConnected();
|
||||
Log.d(TAG, "Icon service started");
|
||||
serviceInfo.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
|
||||
@ -52,181 +38,78 @@ implements SharedPreferences.OnSharedPreferenceChangeListener
|
||||
serviceInfo.notificationTimeout = 100;
|
||||
this.setServiceInfo(serviceInfo);
|
||||
layouts = getSharedPreferences("layouts", 0);
|
||||
iconsPrefs = getSharedPreferences("icons", 0);
|
||||
options = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
|
||||
lastToast = "EMPT";
|
||||
options.registerOnSharedPreferenceChangeListener(this);
|
||||
|
||||
iconManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
|
||||
{
|
||||
try
|
||||
{
|
||||
iconChannel = iconManager.getNotificationChannel(channelId);
|
||||
}
|
||||
catch (NullPointerException e)
|
||||
{
|
||||
Log.d(TAG, "No NotificationChannel found");
|
||||
}
|
||||
if(iconChannel == null) {
|
||||
iconChannel = new NotificationChannel(
|
||||
channelId,
|
||||
getString(R.string.title_icon_channel),
|
||||
NotificationManager.IMPORTANCE_LOW);
|
||||
iconChannel.setShowBadge(false);
|
||||
iconChannel.enableLights(false);
|
||||
iconChannel.enableVibration(false);
|
||||
iconChannel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
|
||||
iconManager.createNotificationChannel(iconChannel);
|
||||
}
|
||||
}
|
||||
|
||||
//layoutText.put("Русский", "RU");
|
||||
//layoutText.put("Буквы (АБВ)", "EN");
|
||||
}
|
||||
|
||||
private void updateNotification(String toast)
|
||||
protected void updateNotification(String toast)
|
||||
{
|
||||
Notification indicator;
|
||||
String textIcon = layouts.getString(toast,"EMPT");
|
||||
if(textIcon.equals("EMPT"))
|
||||
if(textIcon == "EMPT")
|
||||
{
|
||||
SharedPreferences.Editor layoutsEditor = layouts.edit();
|
||||
layoutsEditor.putString(toast, "??");
|
||||
layoutsEditor.apply();
|
||||
layoutsEditor.commit();
|
||||
textIcon = "??";
|
||||
}
|
||||
Icon smallIcon = Icon.createWithBitmap(textAsBitmap(textIcon, 48, Color.WHITE));
|
||||
|
||||
Icon smallIcon;
|
||||
|
||||
if (Integer.parseInt(options.getString("textMode", "0")) == 4) {
|
||||
// Icon selected
|
||||
smallIcon = Icon.createWithResource(this, iconsPrefs.getInt(toast, R.drawable.ic_language_default));
|
||||
} else {
|
||||
// Text variations
|
||||
smallIcon = Icon.createWithBitmap(textAsBitmap(textIcon,
|
||||
Integer.parseInt(options.getString("textSize", "48")),
|
||||
options.getBoolean("textFakeBold", true),
|
||||
Integer.parseInt(options.getString("textMode", "0")),
|
||||
Color.WHITE));
|
||||
}
|
||||
|
||||
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
|
||||
{
|
||||
indicator = new Notification.Builder(this, channelId)
|
||||
.setSmallIcon(smallIcon)
|
||||
.setContentTitle(toast)
|
||||
.setOngoing(true)
|
||||
.setVisibility(Notification.VISIBILITY_SECRET)
|
||||
.build();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
indicator = new Notification.Builder(this)
|
||||
.setSmallIcon(smallIcon)
|
||||
.setContentTitle(toast)
|
||||
.setOngoing(true)
|
||||
.setPriority(Integer.parseInt(options.getString("notificationImportance", "0")))
|
||||
.setVisibility(Notification.VISIBILITY_SECRET)
|
||||
.build();
|
||||
}
|
||||
indicator = new Notification.Builder(this)
|
||||
.setSmallIcon(smallIcon)
|
||||
.setContentTitle(toast)
|
||||
.setOngoing(true)
|
||||
.build();
|
||||
iconManager.notify(0, indicator);
|
||||
return;
|
||||
}
|
||||
|
||||
//Borrowed from Ted Hopp from StackOverflow
|
||||
public static Bitmap textAsBitmap(String text, float textSize, boolean fakeBold, int mode, int textColor)
|
||||
{
|
||||
public Bitmap textAsBitmap(String text, float textSize, int textColor) {
|
||||
Paint paint = new Paint(ANTI_ALIAS_FLAG);
|
||||
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));
|
||||
paint.setTextSize(textSize);
|
||||
paint.setFakeBoldText(fakeBold);
|
||||
paint.setFakeBoldText(true);
|
||||
paint.setColor(textColor);
|
||||
switch (mode)
|
||||
{
|
||||
case 1: {
|
||||
int width = 48;
|
||||
int height = 48;
|
||||
Bitmap image = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
||||
Canvas canvas = new Canvas(image);
|
||||
canvas.drawCircle(width / 2f, height / 2f, width / 2f, paint);
|
||||
paint.setAlpha(255);
|
||||
paint.setColor(Color.TRANSPARENT);
|
||||
paint.setTextSize(textSize);
|
||||
paint.setTextAlign(Paint.Align.CENTER);
|
||||
canvas.drawText(text, width/2f, ((height/2f) - (paint.descent()+paint.ascent())/2f), paint);
|
||||
return image;
|
||||
}
|
||||
|
||||
case 2: {
|
||||
int width = 48;
|
||||
int height = 48;
|
||||
Bitmap image = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
||||
Canvas canvas = new Canvas(image);
|
||||
canvas.drawRoundRect(new RectF(0, 0, height, width), 5, 5, paint);
|
||||
paint.setAlpha(255);
|
||||
paint.setColor(Color.TRANSPARENT);
|
||||
paint.setTextSize(textSize);
|
||||
paint.setTextAlign(Paint.Align.CENTER);
|
||||
canvas.drawText(text, width / 2f, ((height/2f) - (paint.descent()+paint.ascent())/2f), paint);
|
||||
return image;
|
||||
}
|
||||
|
||||
case 3: {
|
||||
int width = 48;
|
||||
int height = 48;
|
||||
Bitmap image = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
||||
Canvas canvas = new Canvas(image);
|
||||
canvas.drawRoundRect(new RectF(0, 0, height, width), 5, 5, paint);
|
||||
paint.setAlpha(255);
|
||||
paint.setColor(Color.TRANSPARENT);
|
||||
canvas.drawRoundRect(new RectF(2,2,height-2,width-2), 5, 5, paint);
|
||||
paint.setColor(textColor);
|
||||
paint.setTextSize(textSize);
|
||||
paint.setTextAlign(Paint.Align.CENTER);
|
||||
canvas.drawText(text, width / 2f, ((height/2f) - (paint.descent()+paint.ascent())/2f), paint);
|
||||
return image;
|
||||
}
|
||||
|
||||
case 0:
|
||||
default:
|
||||
paint.setTextAlign(Paint.Align.LEFT);
|
||||
float baseline = -paint.ascent(); // ascent() is negative
|
||||
int width = (int) (paint.measureText(text) + 0.5f); // round
|
||||
int height = (int) (baseline + paint.descent() + 0.5f);
|
||||
Bitmap image = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
||||
Canvas canvas = new Canvas(image);
|
||||
canvas.drawText(text, 0, baseline, paint);
|
||||
return image;
|
||||
}
|
||||
paint.setTextAlign(Paint.Align.LEFT);
|
||||
float baseline = -paint.ascent(); // ascent() is negative
|
||||
int width = (int) (paint.measureText(text) + 0.5f); // round
|
||||
int height = (int) (baseline + paint.descent() + 0.5f);
|
||||
Bitmap image = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
||||
Canvas canvas = new Canvas(image);
|
||||
canvas.drawText(text, 0, baseline, paint);
|
||||
return image;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAccessibilityEvent(AccessibilityEvent event)
|
||||
{
|
||||
public void onAccessibilityEvent(AccessibilityEvent event) {
|
||||
|
||||
Log.d(TAG, event.toString());
|
||||
if(event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED)
|
||||
{
|
||||
Log.d(TAG, "Caught a Toast: ");
|
||||
Log.d(TAG, (String)event.getPackageName());
|
||||
lastToast = (String)event.getText().get(0);
|
||||
Log.d(TAG, lastToast);
|
||||
String toast = (String)event.getText().get(0);
|
||||
Log.d(TAG, toast);
|
||||
|
||||
updateNotification(lastToast);
|
||||
updateNotification(toast);
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.d(TAG, "Caution! This service had been tampered with!");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInterrupt()
|
||||
{
|
||||
public void onInterrupt() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
|
||||
{
|
||||
options = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
|
||||
updateNotification(lastToast);
|
||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
||||
layouts = getSharedPreferences("layouts", 0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,56 +0,0 @@
|
||||
package space.neothefox.laytray;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.Spinner;
|
||||
|
||||
public class IconsAdapter extends BaseAdapter {
|
||||
private Context context;
|
||||
private int flags[];
|
||||
private LayoutInflater inflter;
|
||||
|
||||
public IconsAdapter(Context applicationContext, int[] flags) {
|
||||
this.context = applicationContext;
|
||||
this.flags = flags;
|
||||
inflter = (LayoutInflater.from(applicationContext));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return flags.length;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getItem(int i) {
|
||||
return flags[i];
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getItemId(int i) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public int getPosition(int value) {
|
||||
int position = -1;
|
||||
for (int i = 0; i < flags.length; i++) {
|
||||
if (value == flags[i]) {
|
||||
position = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return position;
|
||||
}
|
||||
|
||||
@Override
|
||||
public View getView(int i, View convertView, ViewGroup parent) {
|
||||
convertView = inflter.inflate(R.layout.spinner_item, null);
|
||||
ImageView icon = (ImageView) convertView.findViewById(R.id.imageView);
|
||||
icon.setImageResource(flags[i]);
|
||||
|
||||
return convertView;
|
||||
}
|
||||
}
|
||||
@ -1,338 +1,149 @@
|
||||
package space.neothefox.laytray;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.graphics.Color;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.provider.Settings;
|
||||
import android.support.design.widget.FloatingActionButton;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.Space;
|
||||
import android.widget.Spinner;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
import android.util.Log;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class MainActivity extends AppCompatActivity
|
||||
implements View.OnClickListener, DialogInterface.OnClickListener, SharedPreferences.OnSharedPreferenceChangeListener {
|
||||
implements View.OnClickListener, SharedPreferences.OnSharedPreferenceChangeListener {
|
||||
|
||||
public final String TAG = "layiconActivity";
|
||||
|
||||
private LinearLayout layoutLister;
|
||||
private SharedPreferences layouts;
|
||||
private SharedPreferences iconsPrefs;
|
||||
private boolean shouldRefresh = true;
|
||||
LinearLayout layoutLister;
|
||||
SharedPreferences layouts;
|
||||
public String TAG = "layiconActivity";
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_main);
|
||||
layoutLister = findViewById(R.id.scrollLinearLayout);
|
||||
layouts = getSharedPreferences("layouts", 0);
|
||||
iconsPrefs = getSharedPreferences("icons", 0);
|
||||
updateLayouts();
|
||||
|
||||
FloatingActionButton addButton = findViewById(R.id.floatingActionButton);
|
||||
Button saveButton = findViewById(R.id.saveButton);
|
||||
addButton.setOnClickListener(this);
|
||||
saveButton.setOnClickListener(this);
|
||||
layouts.registerOnSharedPreferenceChangeListener(this);
|
||||
|
||||
if (!isAccessibilitySettingsOn(getApplicationContext()))
|
||||
{
|
||||
Toast.makeText(this, R.string.toast_enableme,
|
||||
Toast.LENGTH_LONG).show();
|
||||
startActivity(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS));
|
||||
}
|
||||
|
||||
if(!isPackageInstalled("com.blackberry.keyboard", getApplicationContext().getPackageManager()) && !BuildConfig.DEBUG)
|
||||
{
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
builder.setTitle(R.string.unsupported_device)
|
||||
.setMessage(R.string.unsupported_device_description)
|
||||
.setNeutralButton(R.string.close, this)
|
||||
.show();
|
||||
}
|
||||
}
|
||||
|
||||
private void updateLayouts()
|
||||
protected void updateLayouts()
|
||||
{
|
||||
layoutLister.removeAllViewsInLayout();
|
||||
|
||||
Log.d(TAG, "Updating Layouts:");
|
||||
Log.d(TAG, "Updateing Layouts:");
|
||||
Map<String,?> keys = layouts.getAll();
|
||||
if(keys != null)
|
||||
{
|
||||
Log.d(TAG, "listing map:");
|
||||
int i = 0;
|
||||
for(Map.Entry<String,?> entry : keys.entrySet())
|
||||
{
|
||||
for(Map.Entry<String,?> entry : keys.entrySet()){
|
||||
Log.d("map values",entry.getKey() + ": " +
|
||||
entry.getValue().toString());
|
||||
i++;
|
||||
|
||||
if(!entry.getKey().equals("EMPT")) {
|
||||
addLine(
|
||||
layoutLister, entry.getKey(),
|
||||
entry.getValue().toString(),
|
||||
iconsPrefs.getInt(entry.getKey(), R.drawable.ic_language_default)
|
||||
);
|
||||
}
|
||||
addLine(layoutLister, entry.getKey(), entry.getValue().toString());
|
||||
}
|
||||
if(i == 0)
|
||||
{
|
||||
populateLayouts();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
populateLayouts();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void populateLayouts()
|
||||
protected void populateLayouts()
|
||||
{
|
||||
Log.d("map values", "Shared Prefs are empty");
|
||||
SharedPreferences.Editor layoutsEditor = layouts.edit();
|
||||
SharedPreferences.Editor iconsEditor = iconsPrefs.edit();
|
||||
iconsEditor.clear();
|
||||
layoutsEditor.clear();
|
||||
layoutsEditor.putString("Русский", "RU");
|
||||
layoutsEditor.putString("Буквы (АБВ)", "EN");
|
||||
layoutsEditor.putString("EMPT", "??");
|
||||
|
||||
shouldRefresh = false;
|
||||
iconsEditor.apply();
|
||||
shouldRefresh = true;
|
||||
layoutsEditor.apply();
|
||||
layoutsEditor.commit();
|
||||
}
|
||||
|
||||
private void addLine(LinearLayout parent, String name, String icon, int iconDrawableId)
|
||||
protected void addLine(LinearLayout parent)
|
||||
{
|
||||
final LinearLayout layoutLine = new LinearLayout(getApplicationContext());
|
||||
layoutLine.setOrientation(LinearLayout.HORIZONTAL);
|
||||
layoutLine.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT));
|
||||
addLine(parent, "Name", "ICO");
|
||||
}
|
||||
|
||||
TextView layoutName = new TextView(getApplicationContext());
|
||||
protected void addLine(LinearLayout parent, String name, String icon)
|
||||
{
|
||||
LinearLayout layoutLine = new LinearLayout(getApplicationContext());
|
||||
layoutLine.setOrientation(LinearLayout.HORIZONTAL);
|
||||
|
||||
EditText layoutName = new EditText(getApplicationContext());
|
||||
layoutName.setText(name);
|
||||
//workaround for Priv
|
||||
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M) layoutName.setTextColor(Color.BLACK);
|
||||
layoutLine.addView(layoutName);
|
||||
|
||||
EditText layoutIcon = new EditText(getApplicationContext());
|
||||
//workaround for Priv
|
||||
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M) layoutIcon.setTextColor(Color.BLACK);
|
||||
layoutIcon.setText(icon);
|
||||
layoutLine.addView(layoutIcon);
|
||||
|
||||
|
||||
// Icons Dropdown
|
||||
final int[] iconFlags = {
|
||||
R.drawable.ic_language_default,
|
||||
R.drawable.ic_flag_russia,
|
||||
R.drawable.ic_flag_gb,
|
||||
R.drawable.ic_flag_belarus,
|
||||
R.drawable.ic_flag_ukr
|
||||
};
|
||||
IconsAdapter arrayAdapter = new IconsAdapter(this, iconFlags);
|
||||
final Spinner iconSpinner = new Spinner(this);
|
||||
iconSpinner.setAdapter(arrayAdapter);
|
||||
iconSpinner.setSelection(arrayAdapter.getPosition(iconDrawableId));
|
||||
layoutLine.addView(iconSpinner);
|
||||
iconSpinner.setSelection(arrayAdapter.getPosition(iconDrawableId));
|
||||
|
||||
|
||||
Space space = new Space(getApplicationContext());
|
||||
space.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.MATCH_PARENT, 2));
|
||||
layoutLine.addView(space);
|
||||
|
||||
|
||||
final Button removeButton = new Button(getApplicationContext());
|
||||
removeButton.setText("➖");
|
||||
removeButton.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT));
|
||||
removeButton.setOnClickListener(new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
LinearLayout daddy = (LinearLayout)removeButton.getParent();
|
||||
LinearLayout grandpa = (LinearLayout)daddy.getParent();
|
||||
daddy.removeAllViewsInLayout();
|
||||
grandpa.removeView(daddy);
|
||||
}
|
||||
});
|
||||
layoutLine.addView(removeButton);
|
||||
|
||||
parent.addView(layoutLine);
|
||||
}
|
||||
|
||||
private void saveLayouts(LinearLayout parent)
|
||||
protected void saveLayouts(LinearLayout parent)
|
||||
{
|
||||
int count = parent.getChildCount();
|
||||
Log.d(TAG, String.format("%d layouts to save", count));
|
||||
if (count != 0)
|
||||
{
|
||||
SharedPreferences.Editor layoutsEditor = layouts.edit();
|
||||
SharedPreferences.Editor iconsEditor = iconsPrefs.edit();
|
||||
layoutsEditor.clear();
|
||||
iconsEditor.clear();
|
||||
for (int i=0; i < count; i++)
|
||||
{
|
||||
LinearLayout layoutLine = (LinearLayout)parent.getChildAt(i);
|
||||
TextView layoutName = (TextView)layoutLine.getChildAt(0);
|
||||
EditText layoutName = (EditText)layoutLine.getChildAt(0);
|
||||
EditText layoutIcon = (EditText)layoutLine.getChildAt(1);
|
||||
Spinner layoutDropdown = (Spinner)layoutLine.getChildAt(2);
|
||||
String layoutNameValue = layoutName.getText().toString();
|
||||
String layoutIconValue = layoutIcon.getText().toString();
|
||||
int layoutDropdownValue = (int)layoutDropdown.getSelectedItem();
|
||||
if(!layoutNameValue.equals(""))
|
||||
if(layoutNameValue != "")
|
||||
{
|
||||
if(!layoutIconValue.equals("")) {
|
||||
layoutsEditor.putString(layoutNameValue, layoutIconValue);
|
||||
iconsEditor.putInt(layoutNameValue, layoutDropdownValue);
|
||||
} else {
|
||||
layoutsEditor.putString(layoutNameValue, "??");
|
||||
iconsEditor.putInt(layoutNameValue, layoutDropdownValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
shouldRefresh = false;
|
||||
iconsEditor.apply();
|
||||
shouldRefresh = true;
|
||||
layoutsEditor.apply();
|
||||
} else {
|
||||
populateLayouts();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//Accessibility check by Antoine Bolvy
|
||||
private boolean isAccessibilitySettingsOn(Context mContext)
|
||||
{
|
||||
int accessibilityEnabled = 0;
|
||||
final String service = getPackageName() + "/" + IconService.class.getCanonicalName();
|
||||
try
|
||||
{
|
||||
accessibilityEnabled = Settings.Secure.getInt(
|
||||
mContext.getApplicationContext().getContentResolver(),
|
||||
android.provider.Settings.Secure.ACCESSIBILITY_ENABLED);
|
||||
Log.v(TAG, "accessibilityEnabled = " + accessibilityEnabled);
|
||||
}
|
||||
catch (Settings.SettingNotFoundException e)
|
||||
{
|
||||
Log.e(TAG, "Error finding setting, default accessibility to not found: "
|
||||
+ e.getMessage());
|
||||
}
|
||||
TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':');
|
||||
|
||||
if (accessibilityEnabled == 1)
|
||||
{
|
||||
Log.v(TAG, "Accessibility service enabled");
|
||||
String settingValue = Settings.Secure.getString(
|
||||
mContext.getApplicationContext().getContentResolver(),
|
||||
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
|
||||
if (settingValue != null)
|
||||
{
|
||||
mStringColonSplitter.setString(settingValue);
|
||||
while (mStringColonSplitter.hasNext())
|
||||
{
|
||||
String accessibilityService = mStringColonSplitter.next();
|
||||
|
||||
Log.v(TAG, "-------------- > accessibilityService :: " + accessibilityService + " " + service);
|
||||
if (accessibilityService.equalsIgnoreCase(service))
|
||||
if(layoutIconValue != "")
|
||||
{
|
||||
Log.v(TAG, "We've found the correct setting - accessibility is switched on!");
|
||||
return true;
|
||||
layoutsEditor.putString(layoutNameValue, layoutIconValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
layoutsEditor.putString(layoutNameValue, "??");
|
||||
}
|
||||
}
|
||||
}
|
||||
layoutsEditor.commit();
|
||||
}
|
||||
else
|
||||
Log.v(TAG, "Accessibility is disabled");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
public void onClick(View v) {
|
||||
switch(v.getId())
|
||||
{
|
||||
case R.id.floatingActionButton:
|
||||
saveLayouts(layoutLister);
|
||||
Toast.makeText(this, R.string.toast_saved,
|
||||
Toast.LENGTH_SHORT).show();
|
||||
addLine(layoutLister);
|
||||
break;
|
||||
case R.id.saveButton:
|
||||
saveLayouts(layoutLister);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu)
|
||||
{
|
||||
MenuInflater inflater = getMenuInflater();
|
||||
inflater.inflate(R.menu.menu, menu);
|
||||
return true;
|
||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
||||
layouts = getSharedPreferences("layouts", 0);
|
||||
updateLayouts();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item)
|
||||
{
|
||||
switch(item.getItemId())
|
||||
{
|
||||
case R.id.settings:
|
||||
startActivity(new Intent(this, SettingsActivity.class));
|
||||
return true;
|
||||
case R.id.about:
|
||||
startActivity(new Intent(this, AboutActivity.class));
|
||||
return true;
|
||||
default:
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
|
||||
{
|
||||
if (shouldRefresh) {
|
||||
layouts = getSharedPreferences("layouts", 0);
|
||||
iconsPrefs = getSharedPreferences("icons", 0);
|
||||
updateLayouts();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isPackageInstalled(String packageName, PackageManager packageManager)
|
||||
{
|
||||
try
|
||||
{
|
||||
packageManager.getPackageInfo(packageName, 0);
|
||||
return true;
|
||||
}
|
||||
catch (PackageManager.NameNotFoundException e)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i)
|
||||
{
|
||||
//There is only one potential dialog
|
||||
this.finish();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,337 +0,0 @@
|
||||
package space.neothefox.laytray;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.DialogFragment;
|
||||
import android.app.FragmentManager;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Configuration;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.preference.ListPreference;
|
||||
import android.preference.Preference;
|
||||
import android.preference.PreferenceActivity;
|
||||
import android.preference.PreferenceFragment;
|
||||
import android.preference.PreferenceGroup;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.provider.Settings;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v4.app.NavUtils;
|
||||
import android.support.v7.app.ActionBar;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.SeekBar;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* A {@link PreferenceActivity} that presents a set of application settings. On
|
||||
* handset devices, settings are presented as a single list. On tablets,
|
||||
* settings are split by category, with category headers shown to the left of
|
||||
* the list of settings.
|
||||
* <p>
|
||||
* See <a href="http://developer.android.com/design/patterns/settings.html">
|
||||
* Android Design: Settings</a> for design guidelines and the <a
|
||||
* href="http://developer.android.com/guide/topics/ui/settings.html">Settings
|
||||
* API Guide</a> for more information on developing a Settings UI.
|
||||
*/
|
||||
public class SettingsActivity extends AppCompatPreferenceActivity
|
||||
{
|
||||
|
||||
/**
|
||||
* A preference value change listener that updates the preference's summary
|
||||
* to reflect its new value.
|
||||
*/
|
||||
private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object value)
|
||||
{
|
||||
String stringValue = value.toString();
|
||||
|
||||
if (preference instanceof ListPreference)
|
||||
{
|
||||
// For list preferences, look up the correct display value in
|
||||
// the preference's 'entries' list.
|
||||
ListPreference listPreference = (ListPreference) preference;
|
||||
int index = listPreference.findIndexOfValue(stringValue);
|
||||
|
||||
// Set the summary to reflect the new value.
|
||||
preference.setSummary(
|
||||
index >= 0
|
||||
? listPreference.getEntries()[index]
|
||||
: null);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
// For all other preferences, set the summary to the value's
|
||||
// simple string representation.
|
||||
preference.setSummary(stringValue);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Helper method to determine if the device has an extra-large screen. For
|
||||
* example, 10" tablets are extra-large.
|
||||
*/
|
||||
private static boolean isXLargeTablet(Context context)
|
||||
{
|
||||
return (context.getResources().getConfiguration().screenLayout
|
||||
& Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Binds a preference's summary to its value. More specifically, when the
|
||||
* preference's value is changed, its summary (line of text below the
|
||||
* preference title) is updated to reflect the value. The summary is also
|
||||
* immediately updated upon calling this method. The exact display format is
|
||||
* dependent on the type of preference.
|
||||
*
|
||||
* @see #sBindPreferenceSummaryToValueListener
|
||||
*/
|
||||
private static void bindPreferenceSummaryToValue(Preference preference)
|
||||
{
|
||||
// Set the listener to watch for value changes.
|
||||
preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);
|
||||
|
||||
// Trigger the listener immediately with the preference's
|
||||
// current value.
|
||||
sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
|
||||
PreferenceManager
|
||||
.getDefaultSharedPreferences(preference.getContext())
|
||||
.getString(preference.getKey(), ""));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
setupActionBar();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set up the {@link android.app.ActionBar}, if the API is available.
|
||||
*/
|
||||
private void setupActionBar()
|
||||
{
|
||||
ActionBar actionBar = getSupportActionBar();
|
||||
if (actionBar != null)
|
||||
{
|
||||
// Show the Up button in the action bar.
|
||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onMenuItemSelected(int featureId, MenuItem item)
|
||||
{
|
||||
int id = item.getItemId();
|
||||
if (id == android.R.id.home)
|
||||
{
|
||||
if (!super.onMenuItemSelected(featureId, item))
|
||||
{
|
||||
NavUtils.navigateUpFromSameTask(this);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return super.onMenuItemSelected(featureId, item);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public boolean onIsMultiPane()
|
||||
{
|
||||
return isXLargeTablet(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
||||
public void onBuildHeaders(List<Header> target)
|
||||
{
|
||||
loadHeadersFromResource(R.xml.pref_headers, target);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method stops fragment injection in malicious applications.
|
||||
* Make sure to deny any unknown fragments here.
|
||||
*/
|
||||
protected boolean isValidFragment(String fragmentName)
|
||||
{
|
||||
return PreferenceFragment.class.getName().equals(fragmentName)
|
||||
|| GeneralPreferenceFragment.class.getName().equals(fragmentName)
|
||||
|| NotificationPreferenceFragment.class.getName().equals(fragmentName);
|
||||
}
|
||||
|
||||
/**
|
||||
* This fragment shows general preferences only. It is used when the
|
||||
* activity is showing a two-pane settings UI.
|
||||
*/
|
||||
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
||||
public static class GeneralPreferenceFragment extends PreferenceFragment
|
||||
{
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
addPreferencesFromResource(R.xml.pref_general);
|
||||
setHasOptionsMenu(true);
|
||||
|
||||
// Bind the summaries of EditText/List/Dialog/Ringtone preferences
|
||||
// to their values. When their values change, their summaries are
|
||||
// updated to reflect the new value, per the Android Design
|
||||
// guidelines.
|
||||
bindPreferenceSummaryToValue(findPreference("default_app_name"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item)
|
||||
{
|
||||
int id = item.getItemId();
|
||||
if (id == android.R.id.home)
|
||||
{
|
||||
startActivity(new Intent(getActivity(), SettingsActivity.class));
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This fragment shows notification preferences only. It is used when the
|
||||
* activity is showing a two-pane settings UI.
|
||||
*/
|
||||
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
||||
public static class NotificationPreferenceFragment extends PreferenceFragment
|
||||
{
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
addPreferencesFromResource(R.xml.pref_notification);
|
||||
setHasOptionsMenu(true);
|
||||
|
||||
// Bind the summaries of EditText/List/Dialog/Ringtone preferences
|
||||
// to their values. When their values change, their summaries are
|
||||
// updated to reflect the new value, per the Android Design
|
||||
// guidelines.
|
||||
|
||||
//With Oreo this setting should be set by the system dialog
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
|
||||
{
|
||||
Preference notificationImportance = getPreferenceScreen().findPreference("notificationImportance");
|
||||
PreferenceGroup parent = notificationImportance.getParent();
|
||||
parent.removePreference(notificationImportance);
|
||||
Preference notificationImportanceOreo = new Preference(parent.getContext());
|
||||
notificationImportanceOreo.setTitle(R.string.pref_title_notification_importance);
|
||||
notificationImportanceOreo.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener()
|
||||
{
|
||||
@Override
|
||||
public boolean onPreferenceClick(Preference preference)
|
||||
{
|
||||
Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
|
||||
intent.putExtra(Settings.EXTRA_APP_PACKAGE, "space.neothefox.laytray");
|
||||
intent.putExtra(Settings.EXTRA_CHANNEL_ID, IconService.channelId);
|
||||
startActivity(intent);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
parent.addPreference(notificationImportanceOreo);
|
||||
}
|
||||
else
|
||||
bindPreferenceSummaryToValue(findPreference("notificationImportance"));
|
||||
|
||||
bindPreferenceSummaryToValue(findPreference("textMode"));
|
||||
bindPreferenceSummaryToValue(findPreference("textSize"));
|
||||
|
||||
Preference iconBuilderPreference = getPreferenceScreen().findPreference("iconBuilderPreference");
|
||||
iconBuilderPreference.setEnabled(false);
|
||||
iconBuilderPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
|
||||
@Override
|
||||
public boolean onPreferenceClick(Preference preference) {
|
||||
FragmentManager fragmentManager = getFragmentManager();
|
||||
IconBuilderPreferenceFragment iconBuilderPreferenceFragment = new IconBuilderPreferenceFragment();
|
||||
iconBuilderPreferenceFragment.show(fragmentManager, "Icon Builder");
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
||||
public static class IconBuilderPreferenceFragment extends DialogFragment implements View.OnClickListener
|
||||
{
|
||||
|
||||
SeekBar xBar;
|
||||
VerticalSeekBar yBar;
|
||||
Button saveButton;
|
||||
Button cancelButton;
|
||||
IconBuilderPreview iconBuilderPreview;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState)
|
||||
{
|
||||
return inflater.inflate(R.layout.fragment_icon_builder, container);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(View view, @Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
|
||||
xBar = getView().findViewById(R.id.horSeekBar);
|
||||
xBar.setMinimumHeight(10);
|
||||
xBar.setMinimumWidth(100);
|
||||
yBar = getView().findViewById(R.id.verSeekBar);
|
||||
yBar.setMinimumHeight(100);
|
||||
yBar.setMinimumWidth(10);
|
||||
saveButton = getView().findViewById(R.id.saveButton);
|
||||
saveButton.setOnClickListener(this);
|
||||
cancelButton = getView().findViewById(R.id.closeButton);
|
||||
cancelButton.setOnClickListener(this);
|
||||
iconBuilderPreview = getView().findViewById(R.id.textureView);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
switch (v.getId())
|
||||
{
|
||||
case R.id.saveButton:
|
||||
return;
|
||||
case R.id.closeButton:
|
||||
this.dismiss();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item)
|
||||
{
|
||||
int id = item.getItemId();
|
||||
if (id == android.R.id.home)
|
||||
{
|
||||
startActivity(new Intent(getActivity(), SettingsActivity.class));
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,69 +0,0 @@
|
||||
package space.neothefox.laytray;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.graphics.Canvas;
|
||||
import android.support.v7.widget.AppCompatSeekBar;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.MotionEvent;
|
||||
|
||||
public class VerticalSeekBar extends AppCompatSeekBar
|
||||
{
|
||||
|
||||
public VerticalSeekBar(Context context)
|
||||
{
|
||||
super(context);
|
||||
}
|
||||
|
||||
public VerticalSeekBar(Context context, AttributeSet attrs, int defStyle)
|
||||
{
|
||||
super(context, attrs, defStyle);
|
||||
}
|
||||
|
||||
public VerticalSeekBar(Context context, AttributeSet attrs)
|
||||
{
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
protected void onSizeChanged(int w, int h, int oldw, int oldh)
|
||||
{
|
||||
super.onSizeChanged(h, w, oldh, oldw);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
|
||||
{
|
||||
super.onMeasure(heightMeasureSpec, widthMeasureSpec);
|
||||
setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
|
||||
}
|
||||
|
||||
protected void onDraw(Canvas c)
|
||||
{
|
||||
c.rotate(-90);
|
||||
c.translate(-getHeight(), 0);
|
||||
|
||||
super.onDraw(c);
|
||||
}
|
||||
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent event)
|
||||
{
|
||||
if (!isEnabled())
|
||||
return false;
|
||||
|
||||
switch (event.getAction())
|
||||
{
|
||||
case MotionEvent.ACTION_DOWN:
|
||||
case MotionEvent.ACTION_MOVE:
|
||||
case MotionEvent.ACTION_UP:
|
||||
setProgress(getMax() - (int) (getMax() * event.getY() / getHeight()));
|
||||
onSizeChanged(getWidth(), getHeight(), 0, 0);
|
||||
break;
|
||||
|
||||
case MotionEvent.ACTION_CANCEL:
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -1,6 +0,0 @@
|
||||
<vector android:height="24dp" android:viewportHeight="2"
|
||||
android:viewportWidth="3" android:width="32dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="#66000000" android:pathData="M0,1h3v0.75h-3z"/>
|
||||
<path android:fillColor="#99000000" android:pathData="M0,0h3v1h-3z"/>
|
||||
<path android:fillColor="#FF000000" android:pathData="M0,0h0.5v1.75h-3z"/>
|
||||
</vector>
|
||||
@ -1,5 +0,0 @@
|
||||
<vector android:height="32dp" android:viewportHeight="25.1"
|
||||
android:viewportWidth="40.9" android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="#FF000000" android:pathData="M18,0h5v10h18v5H23.1a3,3 0,0 0,-0.3 0,0.6 0.6,0 0,0 0,0.2v9.9H18V15H0v-5h18a1,1 0,0 0,0 -0.1z"/>
|
||||
<path android:fillColor="#99000000" android:pathData="M15.6,0v7a1.4,1.4 0,0 1,-0.3 -0.1L4.3,0.2 4.2,0zM36.7,0a2.8,2.8 0,0 1,-0.3 0.2L25.7,6.8l-0.4,0.3L25.3,0zM4.2,25a2,2 0,0 1,0.3 -0.1l10.8,-6.7 0.3,-0.2v7zM25.3,25v-6.9l0.3,0.1 10.9,6.7a1.6,1.6 0,0 1,0.2 0.2zM0,2.2l0.3,0.1 8.3,5.1v0.2L0,7.6zM41,7.6h-8.8l0.3,-0.2 8,-5a4,4 0,0 1,0.4 -0.2zM0,17.5h8.7a2.6,2.6 0,0 1,-0.2 0.2l-8.1,5a2.3,2.3 0,0 1,-0.4 0.2zM41,22.9a1.4,1.4 0,0 1,-0.3 -0.1l-8.3,-5.1 -0.1,-0.2h8.6z"/>
|
||||
</vector>
|
||||
@ -1,6 +0,0 @@
|
||||
<vector android:height="24dp" android:viewportHeight="512.001"
|
||||
android:viewportWidth="512.001" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="#FF000000" android:pathData="M512,200.093H0V97.104c0,-4.875 3.953,-8.828 8.828,-8.828h494.345c4.875,0 8.828,3.953 8.828,8.828L512,200.093L512,200.093z"/>
|
||||
<path android:fillColor="#88000000" android:pathData="M503.172,423.725H8.828c-4.875,0 -8.828,-3.953 -8.828,-8.828V311.909h512v102.988C512,419.773 508.047,423.725 503.172,423.725z"/>
|
||||
<path android:fillColor="#22000000" android:pathData="M0,200.091h512v111.81h-512z"/>
|
||||
</vector>
|
||||
@ -1,5 +0,0 @@
|
||||
<vector android:height="24dp" android:viewportHeight="2"
|
||||
android:viewportWidth="3" android:width="32dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="#88000000" android:pathData="M0,1h3v1h-3z"/>
|
||||
<path android:fillColor="#FF000000" android:pathData="M0,0h3v1h-3z"/>
|
||||
</vector>
|
||||
@ -1,9 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportHeight="24.0"
|
||||
android:viewportWidth="24.0">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zm1,15h-2v-6h2v6zm0,-8h-2V7h2v2z" />
|
||||
</vector>
|
||||
@ -1,9 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24.0"
|
||||
android:viewportHeight="24.0">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM18.92,8h-2.95c-0.32,-1.25 -0.78,-2.45 -1.38,-3.56 1.84,0.63 3.37,1.91 4.33,3.56zM12,4.04c0.83,1.2 1.48,2.53 1.91,3.96h-3.82c0.43,-1.43 1.08,-2.76 1.91,-3.96zM4.26,14C4.1,13.36 4,12.69 4,12s0.1,-1.36 0.26,-2h3.38c-0.08,0.66 -0.14,1.32 -0.14,2 0,0.68 0.06,1.34 0.14,2L4.26,14zM5.08,16h2.95c0.32,1.25 0.78,2.45 1.38,3.56 -1.84,-0.63 -3.37,-1.9 -4.33,-3.56zM8.03,8L5.08,8c0.96,-1.66 2.49,-2.93 4.33,-3.56C8.81,5.55 8.35,6.75 8.03,8zM12,19.96c-0.83,-1.2 -1.48,-2.53 -1.91,-3.96h3.82c-0.43,1.43 -1.08,2.76 -1.91,3.96zM14.34,14L9.66,14c-0.09,-0.66 -0.16,-1.32 -0.16,-2 0,-0.68 0.07,-1.35 0.16,-2h4.68c0.09,0.65 0.16,1.32 0.16,2 0,0.68 -0.07,1.34 -0.16,2zM14.59,19.56c0.6,-1.11 1.06,-2.31 1.38,-3.56h2.95c-0.96,1.65 -2.49,2.93 -4.33,3.56zM16.36,14c0.08,-0.66 0.14,-1.32 0.14,-2 0,-0.68 -0.06,-1.34 -0.14,-2h3.38c0.16,0.64 0.26,1.31 0.26,2s-0.1,1.36 -0.26,2h-3.38z"/>
|
||||
</vector>
|
||||
@ -1,9 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportHeight="24.0"
|
||||
android:viewportWidth="24.0">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M11.5,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.9,2 2,2zm6.5,-6v-5.5c0,-3.07 -2.13,-5.64 -5,-6.32V3.5c0,-0.83 -0.67,-1.5 -1.5,-1.5S10,2.67 10,3.5v0.68c-2.87,0.68 -5,3.25 -5,6.32V16l-2,2v1h17v-1l-2,-2z" />
|
||||
</vector>
|
||||
@ -1,9 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportHeight="24.0"
|
||||
android:viewportWidth="24.0">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01,-.25 1.97,-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0,-4.42,-3.58,-8,-8,-8zm0 14c-3.31 0,-6,-2.69,-6,-6 0,-1.01.25,-1.97.7,-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4,-4,-4,-4v3z" />
|
||||
</vector>
|
||||
@ -1,48 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".AboutActivity">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/imageView"
|
||||
android:contentDescription="@string/title_icon_channel"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="138dp"
|
||||
android:layout_marginStart="138dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:src="@mipmap/ic_launcher_foreground"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView3"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="163dp"
|
||||
android:layout_marginStart="163dp"
|
||||
android:layout_marginTop="68dp"
|
||||
android:text="@string/about_text"
|
||||
android:textAlignment="center"
|
||||
android:textSize="14sp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/imageView" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView4"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="168dp"
|
||||
android:layout_marginStart="168dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:text="@string/app_name"
|
||||
android:textAppearance="@android:style/TextAppearance.Holo.Large"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/imageView" />
|
||||
</android.support.constraint.ConstraintLayout>
|
||||
@ -43,10 +43,27 @@
|
||||
android:layout_marginBottom="24dp"
|
||||
android:layout_marginEnd="24dp"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
app:backgroundTint="?attr/colorPrimary"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:srcCompat="@android:drawable/ic_menu_save" />
|
||||
app:srcCompat="@android:drawable/ic_input_add" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/saveButton"
|
||||
android:layout_width="81dp"
|
||||
android:layout_height="41dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:text="Save"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
tools:layout_editor_absoluteY="16dp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:layout_marginStart="8dp"
|
||||
android:text="by NeoTheFox"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
</android.support.constraint.ConstraintLayout>
|
||||
@ -1,57 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="2"
|
||||
android:gravity="center"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<space.neothefox.laytray.IconBuilderPreview
|
||||
android:id="@+id/textureView"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<space.neothefox.laytray.VerticalSeekBar
|
||||
android:id="@+id/verSeekBar"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<SeekBar
|
||||
android:id="@+id/horSeekBar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="2" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:gravity="fill_horizontal"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<Button
|
||||
android:id="@+id/saveButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:text="Save" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/closeButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:text="Close" />
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
@ -1,24 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/imageView"
|
||||
android:layout_width="40dp"
|
||||
android:layout_height="40dp"
|
||||
android:padding="5dp"
|
||||
android:src="@drawable/ic_info_black_24dp" />
|
||||
|
||||
<!--
|
||||
<TextView
|
||||
android:id="@+id/textView"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="0dp"
|
||||
android:text="Icon"
|
||||
android:textColor="#000" />
|
||||
-->
|
||||
|
||||
</LinearLayout>
|
||||
@ -1,6 +0,0 @@
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:id="@+id/settings"
|
||||
android:title="@string/title_activity_settings" />
|
||||
<item android:id="@+id/about"
|
||||
android:title="@string/title_about" />
|
||||
</menu>
|
||||
@ -1,63 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="service_description">Простая іконка раскладкі</string>
|
||||
<string name="accessibility_summary">LayTray патрабуе доступ да спецыяльных магчымасцяў каб праглядаць паведамленні ад клавіятуры. LayTray не адсочвае набіранне тэкста і не адпраўляе аніякай інфармацыі аб Вашай дзейнасці ў Інтэрнэт.</string>
|
||||
<string name="activity_info">Дадайце скарочаныя назвы для раскладак</string>
|
||||
<string name="title_activity_settings">Налады</string>
|
||||
<string name="toast_enableme">Вы мусіце ўключыць сэрвіс!</string>
|
||||
<string name="toast_saved">Захаваны</string>
|
||||
|
||||
<string name="pref_header_general">Агульныя</string>
|
||||
|
||||
<string name="pref_title_default_app_name">Прыкладанне для назірання</string>
|
||||
<string-array name="pref_default_app_name_list_titles">
|
||||
<item>Blackberry Keyboard</item>
|
||||
</string-array>
|
||||
<string-array name="pref_default_app_name_list_values">
|
||||
<item>com.blackberry.keyboard</item>
|
||||
</string-array>
|
||||
|
||||
<string name="pref_title_notification_importance">Важнасць паведамлення</string>
|
||||
<string-array name="pref_notification_importance_list_titles">
|
||||
<item>Default</item>
|
||||
<item>High</item>
|
||||
<item>Low</item>
|
||||
<item>Min</item>
|
||||
</string-array>
|
||||
<string-array name="pref_notification_importance_list_values">
|
||||
<item>0</item>
|
||||
<item>1</item>
|
||||
<item>-1</item>
|
||||
<item>-2</item>
|
||||
</string-array>
|
||||
|
||||
<string name="pref_title_notification_mode">Форма іконкі</string>
|
||||
<string-array name="pref_notification_mode_list_titles">
|
||||
<item>Звычайны тэкст</item>
|
||||
<item>Тэкст у крузе</item>
|
||||
<item>Тэкст у квадраце</item>
|
||||
<item>Тэкст у квадраце з абрысам</item>
|
||||
<item>Іконка</item>
|
||||
</string-array>
|
||||
<string-array name="pref_notification_mode_list_values">
|
||||
<item>0</item>
|
||||
<item>1</item>
|
||||
<item>2</item>
|
||||
<item>3</item>
|
||||
<item>4</item>
|
||||
</string-array>
|
||||
|
||||
<string name="pref_title_icon_builder">Рэдактар іконак</string>
|
||||
|
||||
<!-- Example settings for Notifications -->
|
||||
<string name="pref_header_notifications">Іконка</string>
|
||||
|
||||
<string name="pref_title_text_fake_bold">Тоўсты шрыфт</string>
|
||||
<string name="pref_title_text_size">Памер тэксту</string>
|
||||
|
||||
<string name="title_about">Аб праграме</string>
|
||||
<string name="close">Зачыніць</string>
|
||||
<string name="unsupported_device">Тэлефон не падтрымліваецца</string>
|
||||
<string name="title_icon_channel">Iконкa раскладкі</string>
|
||||
<string name="unsupported_device_description">Гэты тэлефон не хапае клавіятуры BlackBerry. LayTray не будзе працаваць без яго.</string>
|
||||
</resources>
|
||||
@ -1,64 +0,0 @@
|
||||
<resources>
|
||||
<string name="service_description">Jednoduchá ikona rozvržení klávesnice</string>
|
||||
<string name="accessibility_summary">LayTray je třeba zapnout v aplikaci zpřístupnění, protože jediný způsob, jak na Android zjistit rozvržení, je sledovat oznámení Toast. LayTray nemůže vidět co píšete a neodesílá žádná data o vaší aktivitě třetím stranám</string>
|
||||
<string name="activity_info">Přiřadit název k ikoně rozvržení</string>
|
||||
<string name="title_activity_settings">Nastavení</string>
|
||||
<string name="toast_enableme">Je třeba službu zapnout!</string>
|
||||
<string name="unsupported_device">Nepodporovaný telefon</string>
|
||||
<string name="unsupported_device_description">Tento telefon postrádá BlackBerry klávesnici. LayTray bez ní nefunguje.</string>
|
||||
<string name="close">Zavřít</string>
|
||||
<string name="toast_saved">Uloženo</string>
|
||||
<string name="title_icon_channel">Ikona rozvržení klávesnice</string>
|
||||
<!-- Strings related to Settings -->
|
||||
|
||||
<!-- Example General settings -->
|
||||
<string name="pref_header_general">Obecné</string>
|
||||
|
||||
<string name="pref_title_default_app_name">Aplikace pro dohlížení</string>
|
||||
<string-array name="pref_default_app_name_list_titles">
|
||||
<item>klávesnice Blackberry</item>
|
||||
</string-array>
|
||||
<string-array name="pref_default_app_name_list_values">
|
||||
<item>com.blackberry.keyboard</item>
|
||||
</string-array>
|
||||
|
||||
<string name="pref_title_notification_importance">Důležitost oznámení</string>
|
||||
<string-array name="pref_notification_importance_list_titles">
|
||||
<item>Výchozí</item>
|
||||
<item>Vysoká</item>
|
||||
<item>Nízká</item>
|
||||
<item>Min</item>
|
||||
</string-array>
|
||||
<string-array name="pref_notification_importance_list_values">
|
||||
<item>0</item>
|
||||
<item>1</item>
|
||||
<item>-1</item>
|
||||
<item>-2</item>
|
||||
</string-array>
|
||||
|
||||
<string name="pref_title_notification_mode">Notification shape</string>
|
||||
<string-array name="pref_notification_mode_list_titles">
|
||||
<item>Samotný text</item>
|
||||
<item>Text v kruhu</item>
|
||||
<item>Text ve čtverci</item>
|
||||
<item>Text v obrysu čtverce</item>
|
||||
<item>Ikona</item>
|
||||
</string-array>
|
||||
<string-array name="pref_notification_mode_list_values">
|
||||
<item>0</item>
|
||||
<item>1</item>
|
||||
<item>2</item>
|
||||
<item>3</item>
|
||||
<item>4</item>
|
||||
</string-array>
|
||||
|
||||
<string name="pref_title_icon_builder">Vytváření ikony</string>
|
||||
|
||||
<!-- Example settings for Notifications -->
|
||||
<string name="pref_header_notifications">Oznamování</string>
|
||||
|
||||
<string name="pref_title_text_fake_bold">Tučně</string>
|
||||
<string name="pref_title_text_size">Velikost textu</string>
|
||||
|
||||
<string name="title_about">O aplikaci</string>
|
||||
</resources>
|
||||
@ -1,63 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="service_description">Простая иконка раскладки</string>
|
||||
<string name="accessibility_summary">LayTray требуется доступ к специальным возможностям для того чтобы прослушивать уведомления от клавиатуры. LayTray не видит что вы печатаете и не отправляет никаких данных о вашей активности в интернет.</string>
|
||||
<string name="activity_info">Введите краткие названия для раскладок</string>
|
||||
<string name="title_activity_settings">Настройки</string>
|
||||
<string name="toast_enableme">Необходимо включить сервис!</string>
|
||||
<string name="toast_saved">Сохранено</string>
|
||||
|
||||
<string name="pref_header_general">Общие</string>
|
||||
|
||||
<string name="pref_title_default_app_name">Приложения для наблюдения</string>
|
||||
<string-array name="pref_default_app_name_list_titles">
|
||||
<item>Blackberry Keyboard</item>
|
||||
</string-array>
|
||||
<string-array name="pref_default_app_name_list_values">
|
||||
<item>com.blackberry.keyboard</item>
|
||||
</string-array>
|
||||
|
||||
<string name="pref_title_notification_importance">Важность уведомления</string>
|
||||
<string-array name="pref_notification_importance_list_titles">
|
||||
<item>Default</item>
|
||||
<item>High</item>
|
||||
<item>Low</item>
|
||||
<item>Min</item>
|
||||
</string-array>
|
||||
<string-array name="pref_notification_importance_list_values">
|
||||
<item>0</item>
|
||||
<item>1</item>
|
||||
<item>-1</item>
|
||||
<item>-2</item>
|
||||
</string-array>
|
||||
|
||||
<string name="pref_title_notification_mode">Форма иконки</string>
|
||||
<string-array name="pref_notification_mode_list_titles">
|
||||
<item>Текст</item>
|
||||
<item>Текст в круге</item>
|
||||
<item>Текст в квадрате</item>
|
||||
<item>Текст в квадрате с обводкой</item>
|
||||
<item>Иконка</item>
|
||||
</string-array>
|
||||
<string-array name="pref_notification_mode_list_values">
|
||||
<item>0</item>
|
||||
<item>1</item>
|
||||
<item>2</item>
|
||||
<item>3</item>
|
||||
<item>4</item>
|
||||
</string-array>
|
||||
|
||||
<string name="pref_title_icon_builder">Редактор иконок</string>
|
||||
|
||||
<!-- Example settings for Notifications -->
|
||||
<string name="pref_header_notifications">Иконка</string>
|
||||
|
||||
<string name="pref_title_text_fake_bold">Жирность</string>
|
||||
<string name="pref_title_text_size">Размер текста</string>
|
||||
|
||||
<string name="title_about">О программе</string>
|
||||
<string name="close">Закрыть</string>
|
||||
<string name="unsupported_device">Телефон не поддерживается</string>
|
||||
<string name="title_icon_channel">Иконка раскладки</string>
|
||||
<string name="unsupported_device_description">На этом телефоне отсутствует клавиатура BlackBerry. LayTray не будет работать без него.</string>
|
||||
</resources>
|
||||
@ -1,71 +1,6 @@
|
||||
<resources>
|
||||
<string name="app_name" translatable="false">LayTray</string>
|
||||
<string name="app_name">LayTray</string>
|
||||
<string name="service_description">A simple layout icon</string>
|
||||
<string name="accessibility_summary">LayTray needs to be enabled as an accessibility app, because the only way to get layout info on Android is by monitoring the Toast notification. LayTray can not see what you are typing and doesn\'t send any data about you or your activity to the third parties</string>
|
||||
<string name="accessibility_summary">LayTray needs to be enabled as an accessibility app, because the only way to get layout info on Android is by monitoring the Toast notification. Right now it monitors Blackberry Keyboard exclusively.</string>
|
||||
<string name="activity_info">Associate layout name with layout icon</string>
|
||||
<string name="title_activity_settings">Settings</string>
|
||||
<string name="toast_enableme">You have to enable the service!</string>
|
||||
<string name="unsupported_device">Unsupported phone</string>
|
||||
<string name="unsupported_device_description">This phone is missing the BlackBerry Keyboard. LayTray will not work without it.</string>
|
||||
<string name="close">Close</string>
|
||||
<string name="toast_saved">Saved</string>
|
||||
<string name="title_icon_channel">Layout icon</string>
|
||||
<!-- Strings related to Settings -->
|
||||
|
||||
<!-- Example General settings -->
|
||||
<string name="pref_header_general">General</string>
|
||||
|
||||
<string name="pref_title_default_app_name">App to monitor</string>
|
||||
<string-array name="pref_default_app_name_list_titles">
|
||||
<item>Blackberry Keyboard</item>
|
||||
</string-array>
|
||||
<string-array name="pref_default_app_name_list_values">
|
||||
<item>com.blackberry.keyboard</item>
|
||||
</string-array>
|
||||
|
||||
<string name="pref_title_notification_importance">Notification importance</string>
|
||||
<string-array name="pref_notification_importance_list_titles">
|
||||
<item>Default</item>
|
||||
<item>High</item>
|
||||
<item>Low</item>
|
||||
<item>Min</item>
|
||||
</string-array>
|
||||
<string-array name="pref_notification_importance_list_values">
|
||||
<item>0</item>
|
||||
<item>1</item>
|
||||
<item>-1</item>
|
||||
<item>-2</item>
|
||||
</string-array>
|
||||
|
||||
<string name="pref_title_notification_mode">Notification shape</string>
|
||||
<string-array name="pref_notification_mode_list_titles">
|
||||
<item>Plain Text</item>
|
||||
<item>Text in circle</item>
|
||||
<item>Text in a square</item>
|
||||
<item>Text in a square outline</item>
|
||||
<item>Icon</item>
|
||||
</string-array>
|
||||
<string-array name="pref_notification_mode_list_values">
|
||||
<item>0</item>
|
||||
<item>1</item>
|
||||
<item>2</item>
|
||||
<item>3</item>
|
||||
<item>4</item>
|
||||
</string-array>
|
||||
|
||||
<string name="pref_title_icon_builder">Icon builder</string>
|
||||
|
||||
<!-- Example settings for Notifications -->
|
||||
<string name="pref_header_notifications">Notifications</string>
|
||||
|
||||
<string name="pref_title_text_fake_bold">Bold</string>
|
||||
<string name="pref_title_text_size">Text size</string>
|
||||
|
||||
<string name="title_about">About</string>
|
||||
<string name="about_text" translatable="false">A layout icon by NeoTheFox \n
|
||||
Distributed on the terms of GNU GPLv3 licence \n
|
||||
\n
|
||||
Translated by:\n
|
||||
Belarusian - Edward Asviacinski\n
|
||||
Czech - Pavel Borecki</string>
|
||||
</resources>
|
||||
|
||||
@ -1,4 +0,0 @@
|
||||
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:description="@string/accessibility_summary"
|
||||
android:settingsActivity="space.neothefox.laytray.MainActivity"
|
||||
/>
|
||||
@ -1,9 +0,0 @@
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<ListPreference
|
||||
android:key="default_app_name"
|
||||
android:entryValues="@array/pref_default_app_name_list_values"
|
||||
android:entries="@array/pref_default_app_name_list_titles"
|
||||
android:title="@string/pref_title_default_app_name" />
|
||||
|
||||
</PreferenceScreen>
|
||||
@ -1,15 +0,0 @@
|
||||
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<!-- These settings headers are only used on tablets. -->
|
||||
|
||||
<header
|
||||
android:fragment="space.neothefox.laytray.SettingsActivity$GeneralPreferenceFragment"
|
||||
android:icon="@drawable/ic_info_black_24dp"
|
||||
android:title="@string/pref_header_general" />
|
||||
|
||||
<header
|
||||
android:fragment="space.neothefox.laytray.SettingsActivity$NotificationPreferenceFragment"
|
||||
android:icon="@drawable/ic_notifications_black_24dp"
|
||||
android:title="@string/pref_header_notifications" />
|
||||
|
||||
</preference-headers>
|
||||
@ -1,38 +0,0 @@
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<!-- A 'parent' preference, which enables/disables child preferences (below)
|
||||
when checked/unchecked. -->
|
||||
<ListPreference
|
||||
android:defaultValue="0"
|
||||
android:entries="@array/pref_notification_importance_list_titles"
|
||||
android:entryValues="@array/pref_notification_importance_list_values"
|
||||
android:key="notificationImportance"
|
||||
android:negativeButtonText="@null"
|
||||
android:positiveButtonText="@null"
|
||||
android:title="@string/pref_title_notification_importance" />
|
||||
|
||||
<ListPreference
|
||||
android:defaultValue="0"
|
||||
android:entries="@array/pref_notification_mode_list_titles"
|
||||
android:entryValues="@array/pref_notification_mode_list_values"
|
||||
android:key="textMode"
|
||||
android:title="@string/pref_title_notification_mode" />
|
||||
|
||||
<SwitchPreference
|
||||
android:defaultValue="true"
|
||||
android:key="textFakeBold"
|
||||
android:title="@string/pref_title_text_fake_bold" />
|
||||
|
||||
<!-- NOTE: This preference will be enabled only when the checkbox above is checked. -->
|
||||
<EditTextPreference
|
||||
android:defaultValue="48"
|
||||
android:key="textSize"
|
||||
android:singleLine="true"
|
||||
android:inputType="number"
|
||||
android:title="@string/pref_title_text_size" />
|
||||
|
||||
<Preference
|
||||
android:key="iconBuilderPreference"
|
||||
android:title="@string/pref_title_icon_builder" />
|
||||
|
||||
</PreferenceScreen>
|
||||
@ -7,7 +7,7 @@ buildscript {
|
||||
jcenter()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:3.1.4'
|
||||
classpath 'com.android.tools.build:gradle:3.1.3'
|
||||
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user