package com.hrupin.systemalertwindowsample;
import android.content.Context;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.Toast;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Created by Igor Khrupin www.hrupin.com on 4/29/16.
*/
public class OverlayButton implements View.OnClickListener {
private static final String TAG = "OverlayButton";
private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);
private final WindowManager mWindowManager;
private final WindowManager.LayoutParams mOverlayParams;
private Context mContext;
private Button button;
private Handler mHandler = new Handler(Looper.getMainLooper());
private boolean mIsVisible = false;
public OverlayButton(Context context) {
mContext = context;
remove();
button = new Button(mContext);
button.setId(generateViewId());
button.setText("Send Toast");
button.setTextColor(Color.RED);
button.setOnClickListener(this);
mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
mOverlayParams = new WindowManager.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, PixelFormat.TRANSLUCENT);
mOverlayParams.gravity = Gravity.CENTER;
}
public void attachToWindow() {
Log.d(TAG, "attachToWindow");
mHandler.post(new Runnable() {
@Override
public void run() {
if (!mIsVisible && mOverlayParams != null) {
mWindowManager.addView(button, mOverlayParams);
mIsVisible = true;
}
}
});
}
public void remove() {
Log.d(TAG, "remove");
mHandler.post(new Runnable() {
@Override
public void run() {
if (mIsVisible) {
mWindowManager.removeView(button);
mIsVisible = false;
}
}
});
}
@Override
public void onClick(View v) {
Toast.makeText(mContext, "Button removed", Toast.LENGTH_SHORT).show();
remove();
}
public static int generateViewId() {
for (; ; ) {
final int result = sNextGeneratedId.get();
// aapt-generated IDs have the high byte nonzero; clamp to the range under that.
int newValue = result + 1;
if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0.
if (sNextGeneratedId.compareAndSet(result, newValue)) {
return result;
}
}
}
}