package com.antest1.kcanotify.h5; import android.app.Service; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.graphics.PixelFormat; import android.graphics.Point; import android.os.Build; import android.os.Handler; import android.os.IBinder; import android.provider.Settings; import android.support.annotation.Nullable; import android.util.Log; import android.view.Display; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.widget.TextView; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import static com.antest1.kcanotify.h5.KcaUtils.adjustAlpha; import static com.antest1.kcanotify.h5.KcaUtils.getWindowLayoutType; public class KcaCustomToastService extends Service { public static final String TOAST_SHOW_ACTION = "toast_show_action"; public static final int CUSTOM_LENGTH_SHORT = 2000; public static final int CUSTOM_LENGTH_LONG = 3500; public static final int CUSTOM_FADE_DURATION = 500; private View mView; private WindowManager mManager; private int screenWidth, screenHeight; private int popupWidth, popupHeight; WindowManager.LayoutParams mParams; private Handler mHandler; TextView toast_view; public static boolean active = false; public static boolean isActive() { return active; } public String getStringWithLocale(int id) { return KcaUtils.getStringWithLocale(getApplicationContext(), getBaseContext(), id); } @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); active = true; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(getApplicationContext())) { // Can not draw overlays: pass stopSelf(); } else { mHandler = new Handler(); LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); mView = mInflater.inflate(R.layout.toast_layout, null); mView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); toast_view = mView.findViewById(R.id.toast_text); mView.setVisibility(View.GONE); //mView.setOnClickListener(mViewClickListener); mView.setOnTouchListener(mViewTouchListener); // Button (Fairy) Settings mParams = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, getWindowLayoutType(), WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, PixelFormat.TRANSLUCENT); mParams.gravity = Gravity.TOP | Gravity.START; Display display = ((WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); Point size = new Point(); display.getSize(size); screenWidth = size.x; screenHeight = size.y; Log.e("KCA", "w/h: " + String.valueOf(screenWidth) + " " + String.valueOf(screenHeight)); mManager = (WindowManager) getSystemService(WINDOW_SERVICE); mManager.addView(mView, mParams); } } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.e("KCA-CPS", "onStartCommand"); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(getApplicationContext())) { // Can not draw overlays: pass stopSelf(); } else if (intent != null && intent.getAction() != null) { if(intent.getAction().equals(TOAST_SHOW_ACTION)) { JsonObject data = new JsonParser().parse(intent.getExtras().getString("data")).getAsJsonObject(); String body = data.get("text").getAsString(); int color = data.get("color").getAsInt(); int duration = data.get("duration").getAsInt(); toast_view.setText(body); toast_view.setBackgroundColor(adjustAlpha(color, 0.8f)); mView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); popupWidth = mView.getMeasuredWidth(); popupHeight = mView.getMeasuredHeight(); mParams.x = (screenWidth - popupWidth) / 2; mParams.y = (int)((screenHeight - popupHeight) * 0.8); mManager.updateViewLayout(mView, mParams); mView.setVisibility(View.VISIBLE); if (duration == 1) duration = CUSTOM_LENGTH_LONG; else duration = CUSTOM_LENGTH_SHORT; mHandler.postDelayed(mRunnable, duration); } } return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { if (mManager != null) mManager.removeView(mView); super.onDestroy(); } private View.OnTouchListener mViewTouchListener = new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { mView.postDelayed(new Runnable() { @Override public void run() { mView.setVisibility(View.GONE); } }, CUSTOM_FADE_DURATION); mHandler.removeCallbacks(mRunnable); return false; } }; private Runnable mRunnable = new Runnable() { @Override public void run() { mView.setVisibility(View.GONE); } }; @Override public void onConfigurationChanged(Configuration newConfig) { Display display = ((WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); Point size = new Point(); display.getSize(size); screenWidth = size.x; screenHeight = size.y; Log.e("KCA", "w/h: " + String.valueOf(screenWidth) + " " + String.valueOf(screenHeight)); if (mParams != null) { mParams.x = (screenWidth - popupWidth) / 2; mParams.y = (int)((screenHeight - popupHeight) * 0.8); } super.onConfigurationChanged(newConfig); } }