Skip to content

Instantly share code, notes, and snippets.

@bjoernQ
Created October 14, 2013 13:02
Show Gist options
  • Select an option

  • Save bjoernQ/6975256 to your computer and use it in GitHub Desktop.

Select an option

Save bjoernQ/6975256 to your computer and use it in GitHub Desktop.

Revisions

  1. bjoernQ created this gist Oct 14, 2013.
    27 changes: 27 additions & 0 deletions AndroidManifest.xml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,27 @@
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="de.mobilej.overlay"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="14" />

    <application android:label="SystemOverlay" >
    <activity
    android:name="de.mobilej.overlay.Main"
    android:exported="true" >
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>

    <service
    android:name="de.mobilej.overlay.OverlayShowingService"
    android:exported="false" />
    </application>

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

    </manifest>
    17 changes: 17 additions & 0 deletions Main.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,17 @@
    package de.mobilej.overlay;

    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;

    public class Main extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent svc = new Intent(this, OverlayShowingService.class);
    startService(svc);
    finish();
    }
    }


    132 changes: 132 additions & 0 deletions OverlayShowingService.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,132 @@
    package de.mobilej.overlay;

    import android.app.Service;
    import android.content.Context;
    import android.content.Intent;
    import android.graphics.PixelFormat;
    import android.os.IBinder;
    import android.view.Gravity;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.View.OnTouchListener;
    import android.view.WindowManager;
    import android.view.WindowManager.LayoutParams;
    import android.widget.Button;
    import android.widget.Toast;

    public class OverlayShowingService extends Service implements OnTouchListener, OnClickListener {

    private View topLeftView;

    private Button overlayedButton;
    private float offsetX;
    private float offsetY;
    private int originalXPos;
    private int originalYPos;
    private boolean moving;
    private WindowManager wm;

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

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

    wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);

    overlayedButton = new Button(this);
    overlayedButton.setText("Overlay button");
    overlayedButton.setOnTouchListener(this);
    overlayedButton.setAlpha(0.0f);
    overlayedButton.setBackgroundColor(0x55fe4444);
    overlayedButton.setOnClickListener(this);

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSLUCENT);
    params.gravity = Gravity.LEFT | Gravity.TOP;
    params.x = 0;
    params.y = 0;
    wm.addView(overlayedButton, params);

    topLeftView = new View(this);
    WindowManager.LayoutParams topLeftParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSLUCENT);
    topLeftParams.gravity = Gravity.LEFT | Gravity.TOP;
    topLeftParams.x = 0;
    topLeftParams.y = 0;
    topLeftParams.width = 0;
    topLeftParams.height = 0;
    wm.addView(topLeftView, topLeftParams);

    }

    @Override
    public void onDestroy() {
    super.onDestroy();
    if (overlayedButton != null) {
    wm.removeView(overlayedButton);
    wm.removeView(topLeftView);
    overlayedButton = null;
    topLeftView = null;
    }
    }

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

    if (event.getAction() == MotionEvent.ACTION_DOWN) {
    float x = event.getRawX();
    float y = event.getRawY();

    moving = false;

    int[] location = new int[2];
    overlayedButton.getLocationOnScreen(location);

    originalXPos = location[0];
    originalYPos = location[1];

    offsetX = originalXPos - x;
    offsetY = originalYPos - y;

    } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
    int[] topLeftLocationOnScreen = new int[2];
    topLeftView.getLocationOnScreen(topLeftLocationOnScreen);

    System.out.println("topLeftY="+topLeftLocationOnScreen[1]);
    System.out.println("originalY="+originalYPos);

    float x = event.getRawX();
    float y = event.getRawY();

    WindowManager.LayoutParams params = (LayoutParams) overlayedButton.getLayoutParams();

    int newX = (int) (offsetX + x);
    int newY = (int) (offsetY + y);

    if (Math.abs(newX - originalXPos) < 1 && Math.abs(newY - originalYPos) < 1 && !moving) {
    return false;
    }

    params.x = newX - (topLeftLocationOnScreen[0]);
    params.y = newY - (topLeftLocationOnScreen[1]);

    wm.updateViewLayout(overlayedButton, params);
    moving = true;
    } else if (event.getAction() == MotionEvent.ACTION_UP) {
    if (moving) {
    return true;
    }
    }

    return false;
    }

    @Override
    public void onClick(View v) {
    Toast.makeText(this, "Overlay button click event", Toast.LENGTH_SHORT).show();
    }

    }