Search code examples
androiddialognotificationsadtwhatsapp

lock screen dialog notification like whatsapp


i am working on a chat application like whatsapp, i am working on popup notification on lock screen. i developed the code but the problem is -- i used two buttons on the dialog like whatsapp as close and view, but the onclick listener on buttons is not working , because of the dialog not having focus, whenever i click on dialog anywhere the backgroud of click screen performs click. i need this type of dialog and functionality like --

like this dialog in whatsapp

but the dialog not getting focus or problem is something else, i cant get it clearly please help.

to achive this i am using the service like following -

public class PopupService extends Service{

    @Override
    public IBinder onBind(Intent intent) {
        Utils.printLog("on bind");
        return null;
    }

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

        Utils.printLog("on start command");
        PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
        WakeLock mWakeLock = pm.newWakeLock((PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "YourServie");
        mWakeLock.acquire();
        mWakeLock.release();

        ///////////////////////////////////

        final WindowManager mWindowManager = (WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE);
        LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
        final View mView = inflater.inflate(R.layout.dialog_popup_notification_received, null);

        Utils.printLog("view" + mView.isClickable());
        mView.setClickable(true);
        mView.setFocusable(true);
        mView.setFocusableInTouchMode(true);

        mView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                Utils.printLog("view" + mView.isClickable());
            }
        });

        TextView tvMessage = (TextView) mView.findViewById(R.id.TextViewMessageInPopupMessageReceived);
        tvMessage.setText(intent.getStringExtra("msg"));
        ImageButton ibSend = (ImageButton) mView.findViewById(R.id.imageButtonSendInPopupMessageReceived);
        TextView tvClose = (TextView) mView.findViewById(R.id.TextViewCloseInPopupMessageReceived);
        TextView tvView = (TextView) mView.findViewById(R.id.textviewViewInPopupMessageReceived);

        ibSend.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) 
            {
                Utils.printLog("send");
            }
        });
        tvClose.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) 
            {
                Utils.printLog("close");
            }
        });
        tvView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) 
            {
                Utils.printLog("view");
            }
        });

        WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
        ViewGroup.LayoutParams.WRAP_CONTENT,
        ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0,
        WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
        /* | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON */,
        PixelFormat.RGBA_8888);

        mWindowManager.addView(mView, mLayoutParams);
        mWindowManager.updateViewLayout(mView, mLayoutParams);

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

}

Solution

  • i got the solution today..

    here id my code...

    public class PopupService extends Service{
    
        private static final String TAG = PopupService.class.getSimpleName();
        WindowManager mWindowManager;
        View mView;
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
    
            showDialog(intent.getStringExtra("msg"));
            return super.onStartCommand(intent, flags, startId);
        }
    
        private void showDialog(String aTitle)
        {
            PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
            WakeLock mWakeLock = pm.newWakeLock((PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "YourServie");
            mWakeLock.acquire();
            mWakeLock.release();
    
            mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
            mView = View.inflate(getApplicationContext(), R.layout.dialog_popup_notification_received, null);
            mView.setTag(TAG);
    
            int top = getApplicationContext().getResources().getDisplayMetrics().heightPixels / 2;
    
            LinearLayout dialog = (LinearLayout) mView.findViewById(R.id.pop_exit);
    // if you want to set params
    //        android.widget.LinearLayout.LayoutParams lp = (android.widget.LinearLayout.LayoutParams) dialog.getLayoutParams();
    //        lp.topMargin = top;
    //        lp.bottomMargin = top;
    //        mView.setLayoutParams(lp);
    
            final EditText etMassage = (EditText) mView.findViewById(R.id.editTextInPopupMessageReceived);
    
            ImageButton imageButtonSend = (ImageButton) mView.findViewById(R.id.imageButtonSendInPopupMessageReceived);
    //        lp = (LayoutParams) imageButton.getLayoutParams();
    //        lp.topMargin = top - 58;
    //        imageButton.setLayoutParams(lp);
            imageButtonSend.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Utils.printLog("clicked");
    //                mView.setVisibility(View.INVISIBLE);
                    if(!etMassage.getText().toString().equals(""))
                    {
                        Utils.printLog("sent");
                        etMassage.setText("");
                    }
                }
            });
    
            TextView close = (TextView) mView.findViewById(R.id.TextViewCloseInPopupMessageReceived);
            close.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View arg0) {
                    hideDialog();   
                }
            });
    
            TextView view = (TextView) mView.findViewById(R.id.textviewViewInPopupMessageReceived);
            view.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View arg0) {
                    hideDialog();   
                }
            });
    
            TextView message = (TextView) mView.findViewById(R.id.TextViewMessageInPopupMessageReceived);
            message.setText(aTitle);
    
            final WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.MATCH_PARENT, 0, 0,
            WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON ,
            PixelFormat.RGBA_8888);
    
            mView.setVisibility(View.VISIBLE);
            mWindowManager.addView(mView, mLayoutParams);
            mWindowManager.updateViewLayout(mView, mLayoutParams);
    
        }
    
        private void hideDialog(){
            if(mView != null && mWindowManager != null){
                mWindowManager.removeView(mView);
                mView = null;
            }
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
        }
    }
    

    it is working for me.

    i got the solution at the link;