Search code examples
androidimagebroadcastreceiverandroid-serviceandroid-broadcast

How to close chat head when it come in menu button in android?


I am working with chat head and successfully implemented everything but I am not able to close it when it's approximately near or on menu button.

Edit source codes:

   public class CustomService extends Service {

    private static WindowManager windowManager;
    private static ImageView chatHead,closeView;
    private static Context context;

    @Override
    public IBinder onBind(Intent intent) {
        // Not used
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

        chatHead = new ImageView(this);
        chatHead.setImageResource(R.drawable.ic_launcher);

        final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_PHONE,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT);

        params.gravity = Gravity.CENTER | Gravity.CENTER;
        params.x = 0;
        params.y = 100;

        closeView = new ImageView(this);
        closeView.setImageResource(R.drawable.blacklist);
        closeView.setVisibility(View.INVISIBLE);
        final WindowManager.LayoutParams params1 = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_PHONE,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT);

        // params.gravity = Gravity.TOP | Gravity.LEFT;
        params1.gravity = Gravity.CENTER | Gravity.BOTTOM;
        params1.x = 0;
        params1.y = 100;
        windowManager.addView(closeView, params1);

        windowManager.addView(chatHead, params);
        chatHead.setOnTouchListener(new View.OnTouchListener() {
            private int initialX;
            private int initialY;
            private float initialTouchX;
            private float initialTouchY;

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {

                case MotionEvent.ACTION_UP:
                    Rect rect1 = new Rect(v.getLeft(), v.getTop(),
                            v.getRight(), v.getBottom());
                    v.getHitRect(rect1);

                    Rect rect2 = new Rect(closeView.getLeft(), closeView.getTop(),
                            closeView.getRight(), closeView.getBottom());
                    closeView.getHitRect(rect2);

                    if (Rect.intersects(rect1, rect2)) {

              Toast.makeText(getApplicationContext(), "overlap", Toast.LENGTH_LONG).show();

                    } else {

                          Toast.makeText(getApplicationContext(), " not overlap", Toast.LENGTH_LONG).show();

                        // Here you can reset that view to it's initial position

                    }
                     return false;
                case MotionEvent.ACTION_MOVE:
                closeView.setVisibility(View.VISIBLE);
                    params.x = initialX
                            + (int) (event.getRawX() - initialTouchX);
                    params.y = initialY
                            + (int) (event.getRawY() - initialTouchY);

                    windowManager.updateViewLayout(chatHead, params);
                    return false;
                case MotionEvent.ACTION_DOWN:
                    initialX = params.x;
                    initialY = params.y;

                    initialTouchX = event.getRawX();
                    initialTouchY = event.getRawY();

                    return false;

                }
                return false;
            }
        });

        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

How to close chat heads when my chat head come in approximately near or on menu button.

enter image description here


enter image description here
How to implement it. Please help me. Thanks


Solution

  • First of all, add a view and set it's gravity like this:

     params.gravity = Gravity.BOTTOM | Gravity.CENTER;         
    

    and then add it to the windowManager after setting it's visibility to invisible:

    closeView.setVisibility(View.INVISIBLE);
    windowManager.addView(closeView, params);
    

    You can show that view in ACTION_MOVE:

    closeView.setVisibility(View.VISIBLE);
    

    After that, do this in ACTION_UP to check if the views intercept:

                    case MotionEvent.ACTION_UP:
    
                        Rect rect1 = new Rect(v.getLeft(), v.getTop(),
                                v.getRight(), v.getBottom());
                        v.getHitRect(rect1);
    
                        Rect rect2 = new Rect(closeView.getLeft(), closeView.getTop(),
                                closeView.getRight(), closeView.getBottom());
                        closeView.getHitRect(rect2);
    
                        if (Rect.intersects(rect1, rect2)) {
    
                            System.out.println("overlap");
                             // Here you can remove your view. 
    
                        } else {
    
                            System.out.println("no overlap");
                            // Here you can reset that view to it's initial position
    
                        }
    

    OR

    you can use another method:

    private boolean isViewOverlapping(View firstView, View secondView) {
        int[] firstPosition = new int[2];
        int[] secondPosition = new int[2];
    
        firstView.measure(View.MeasureSpec.EXACTLY,
                View.MeasureSpec.EXACTLY);
        firstView.getLocationOnScreen(firstPosition);
        secondView.getLocationOnScreen(secondPosition);
    
        int r = firstView.getMeasuredWidth() + firstPosition[1];
        int l = secondPosition[1];
    
        System.out.println(r + " : r + l : " + l);
    
        return r == l && (r != 0 && l != 0);
    }
    

    and call it in ACTION_UP like this:

             boolean show = isViewOverlapping(chatHead, closeView);
                    if (show == true) {
                        System.out.println("overlap");
                    } else {
                        System.out.println("not overlap");
    
                    }