lowmarshall
lowmarshall

Reputation: 35

How to show popup window above call screen in Android 7.0 version

I'm developing a kind of contact provider for android users. The main function is when someone calls to the phone (locked or non locked) it appears a popup window with some info about who is calling. The issue is that with android's version below 7.0 it runs correctly but in android 7.0 and above when the mobile is locked and someone calls the POPUPWINDOW IS APPEARING BELOW THE CALL SCREEN LAYOUT and is only seen when I hang up. So if someone could help in how to make popup window appear above the call screen layout in android 7.0 i would be really grateful.

pd. remember that in versions below 7.0 is running so the problem is in the new version. Screenshot on how it runs in versions below 7.0 enter image description here

public class IncomingCallActivity extends Activity {
int mCurrentX = 0;
int mCurrentY = 500;

@Override
protected void onCreate(Bundle savedInstanceState) {
    final LinearLayout fondo;
    TextView text;
    try {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_empty);

        getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE |
                WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
                WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
                WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

        LayoutInflater layoutInflater = (LayoutInflater) getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);

        final View popupView = layoutInflater.inflate(R.layout.layout_incoming_call, null);

        Button button = (Button)popupView.findViewById(R.id.close_window);
        text = (TextView) popupView.findViewById(R.id.text);

        button.setText("CLOSE WINDOW");

        final PopupWindow popupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.MATCH_PARENT, 300);
        new Handler().postDelayed(new Runnable() {
            public void run() {
                popupWindow.showAtLocation(popupView, Gravity.NO_GRAVITY,mCurrentX,mCurrentY);
                popupView.bringToFront();
            }
        }, 100);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                popupWindow.dismiss();
                finish();
            }
        });

        popupView.setOnTouchListener(new View.OnTouchListener() {
            int orgX, orgY;
            int offsetX, offsetY;

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        orgX = (int) (mCurrentX - event.getRawX());
                        orgY = (int) (mCurrentY - event.getRawY());
                        break;
                    case MotionEvent.ACTION_MOVE:
                        mCurrentX = (int) event.getRawX() + orgX;
                        mCurrentY = (int) event.getRawY() + orgY;
                        popupWindow.update(mCurrentX, mCurrentY, -1, -1, true);
                        break;
                }
                return true;
            }
        });

        String number = getIntent().getStringExtra(
                TelephonyManager.EXTRA_INCOMING_NUMBER);
        text.setText("Incoming call from " + number);

    } catch (Exception e) {
        Log.d("Exception", e.toString());
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

Upvotes: 2

Views: 2701

Answers (1)

aleksandrbel
aleksandrbel

Reputation: 1490

I have found a solution for API > 23. I believe you can also activate it manually if you have android.permission.SYSTEM_ALERT_WINDOW in the manifest file by going to Settings > Apps > Your App > Advanced - Draw over other apps (if you scroll down)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {

    //If the draw over permission is not available open the settings screen
    //to grant the permission.
    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
    Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, PERMISSION_DRAW_OVER_OTHER_APP);
} 

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == PERMISSION_DRAW_OVER_OTHER_APP) {
        //Check if the permission is granted or not.
        if (resultCode == RESULT_OK) {
            // write your view here ...
        } else { //Permission is not available
            Toast.makeText(this,
                    "Draw over other app permission not available",
                    Toast.LENGTH_SHORT).show();
        }
    } else {
        super.onActivityResult(requestCode, resultCode, data);
    }
}

Upvotes: 1

Related Questions