unable to access Clipboard Content from foreground service in Android 10+

I know that we can’t access clipboard content from background services in 10+ but there is an application that shows copied text on a floating widget in Android 10+ devices using foreground service here’s that app. I want to achieve that functionality somehow! please help me.

My app is working fine in android P and lower devices!

FloatingViewService.java

public class FloatingViewService extends Service implements View.OnClickListener {

private WindowManager wm;
private View floatv;
View collapsed;
View expanded;
CharSequence copiedText;
EditText editText;

public FloatingViewService(){

}

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


    // getting the widget layout from xml using layout inflater
    floatv  = LayoutInflater.from(this).inflate(R.layout.layout_floating_widget,null);


    // setting window manager layout parameters
    // set foucus able ,, wrap content, set on lock screen etc...
    final WindowManager.LayoutParams wrules = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT
    );


    // getting window service and adding floating view to it
    wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    wm.addView(floatv,wrules);



    //adding click listener to close button and expanded view
    collapsed =  floatv.findViewById(R.id.layoutCollapsed);
    expanded =  floatv.findViewById(R.id.layoutExpanded);
    editText = floatv.findViewById(R.id.pastehere);





    // adding an touch listener to make drag movement of the floating view
    floatv.findViewById(R.id.relativeLayoutParent).setOnTouchListener(new View.OnTouchListener() {
        private int initialX;
        private int initialY;
        private float touchX;
        private float touchY;

        @Override
        public boolean onTouch(View v, MotionEvent event) {
               switch (event.getAction()){
                   case MotionEvent.ACTION_DOWN:
                        initialX = wrules.x;
                        initialY = wrules.y;
                        touchX = event.getRawX();
                        touchY = event.getRawY();
                        return true;

                     /*as we implemented OnTouchListener() to the root view, OnClickListner() won’t work. So, to detect clicks we will detect clicks in MotionEvent.ACTION_MOVE in the OnTouchListener() using below code:*/
                   case MotionEvent.ACTION_UP:

                      int diffX = (int) (event.getRawX() - touchX);
                      int diffY = (int)  (event.getRawY() - touchY);

                      if(diffX < 10 && diffY < 10){

                          if (isViewCollapsed()){
                              collapsed.setVisibility(View.GONE);
                              expanded.setVisibility(View.VISIBLE);
                              wrules.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND;
                              wm.updateViewLayout(floatv,wrules);
                          }else {
                              collapsed.setVisibility(View.VISIBLE);
                              expanded.setVisibility(View.GONE);
                              wrules.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
                              wm.updateViewLayout(floatv,wrules);
                          }

                      }



                       return true;

                   case MotionEvent.ACTION_MOVE:
                       // moving the widget across the screen
                       wrules.x = initialX + (int) (event.getRawX() - touchX);
                       wrules.y = initialY +  (int) (event.getRawY() - touchY);
                       wm.updateViewLayout(floatv,wrules);


                       return true;


               }

            return false;
        }
    });


    ClipboardManager clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

    clipboardManager.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() {
        @Override
        public void onPrimaryClipChanged() {
            copiedText = clipboardManager.getPrimaryClip().getItemAt(0).getText();

            if(copiedText != null){
                editText.setText(String.valueOf(copiedText));
                wm.updateViewLayout(floatv,wrules);
            }
            Toast.makeText(getBaseContext(), copiedText, Toast.LENGTH_SHORT).show();
        }
    });

}

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

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

@Override
public void onClick(View v) {
      if(v.getId() == R.id.layoutExpanded){
          collapsed.setVisibility(View.VISIBLE);
          expanded.setVisibility(View.GONE);
      }else if(v.getId() == R.id.buttonClose){
          stopSelf();
    }
}

private boolean isViewCollapsed() {
    return floatv == null || floatv.findViewById(R.id.layoutCollapsed).getVisibility() == View.VISIBLE;
}

}

layout_floating_widget.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">


    <RelativeLayout
        android:id="@+id/relativeLayoutParent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <!-- this is the collapsed layout -->
        <RelativeLayout
            android:id="@+id/layoutCollapsed"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:visibility="visible">

            <ImageView
                android:id="@+id/collapsed_iv"
                android:layout_width="70dp"
                android:layout_height="70dp"
                android:layout_marginTop="8dp"
                android:src="https://stackoverflow.com/questions/73006372/@drawable/ic_baseline_menu_book_24" />

            <ImageView
                android:id="@+id/buttonClose"
                android:layout_width="25dp"
                android:layout_height="25dp"
                android:layout_marginLeft="50dp"
                android:src="@drawable/ic_baseline_close_24"
                android:background="@color/teal_200"/>
        </RelativeLayout>

        <!-- this is the expanded layout -->
        <LinearLayout
            android:id="@+id/layoutExpanded"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#a0c3d7"
            android:orientation="horizontal"
            android:padding="8dp"
            android:visibility="gone">

            <ImageView
                android:id="@+id/buttonSimplifiedCodingExpanded"
                android:layout_width="80dp"
                android:layout_height="80dp"
                android:src="@drawable/ic_baseline_markunread_24"
                tools:ignore="ContentDescription" />

            <LinearLayout
                android:id="@+id/buttonSimplifiedCoding"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:paddingLeft="15dp"
                    android:paddingRight="15dp"
                    android:paddingTop="15dp"
                    android:text="Dictionary"
                    android:textAlignment="center"
                    android:textAppearance="@style/Base.TextAppearance.AppCompat.Large"
                    android:textColor="#ffffff"
                    android:textStyle="bold" />

                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/pastehere"
                    android:textAlignment="center"
                    android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"
                    android:textColor="#ffffff"
                    android:textStyle="bold" />

            </LinearLayout>

        </LinearLayout>
    </RelativeLayout>
</FrameLayout>

see these images

text should appear in editText, working in android 9

Leave a Comment