-2

I am trying to provide a back function to the browser launched in my program.

My tablet doesn't have a bottom bar

So I implemented it this way.

import android.app.Activity;
import android.app.ActivityManager;
import android.app.Instrumentation;
import android.app.PendingIntent;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.graphics.PixelFormat;
import android.os.Build;
import android.os.IBinder;
import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.RelativeLayout;
import android.widget.Toast;

import java.util.List;

import kr.co.green_.ConfirmDialog;
import kr.co.green_.ExampleAccessService;
import kr.co.green_.R;

import static android.content.ContentValues.TAG;

public class CloseBtnServiceForGallery extends Service {

    private WindowManager manager;
    private RelativeLayout parentlayout;
    private View mViewClose;
    private ImageButton btnClose;
    private ImageButton btnBack;
    private ExampleAccessService exService;

    @Override
    public IBinder onBind(Intent paramIntent) {
        return null;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "CloseBtnServiceForGallery");
        LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
        this.mViewClose = inflater.inflate(R.layout.close_btn_gallery, null);
        this.exService = new ExampleAccessService();
        this.exService.onServiceConnected();

        btnClose = (ImageButton)this.mViewClose.findViewById(R.id.btnCloseGallery);
        btnBack = (ImageButton)this.mViewClose.findViewById(R.id.btnBack);
        btnClose.setOnClickListener(mCloseBtnClickListener);
        btnBack.setOnClickListener(mCloseBtnClickListener);

        this.manager = (WindowManager) getSystemService(WINDOW_SERVICE);
        WindowManager.LayoutParams params = null;

        if(Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            params = new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                    PixelFormat.TRANSLUCENT);
        } else {
            params = new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                    PixelFormat.TRANSLUCENT);
        }

        params.gravity = Gravity.LEFT | Gravity.BOTTOM ;
        params.verticalMargin = 0.1f ;
        this.manager.addView(mViewClose, params);
    }


    Button.OnClickListener mCloseBtnClickListener = new Button.OnClickListener() {
        public void onClick(View v) {
            try{
                Log.e("try close", "v? : " + v);
                switch (v.getId()) {
                    case R.id.btnCloseGallery:
                        // something
                        break;
                    case R.id.btnBack:
                        try{
                            //exService.onServiceConnected(); This accessibility function requires system privileges so it can't be used

                            ActivityManager activity_manager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
                            List<ActivityManager.RunningTaskInfo> task_info = activity_manager.getRunningTasks(9999);
                            ComponentName componentInfo = task_info.get(0).topActivity;
                            ActivityInfo activityInfo = tryGetActivity(componentInfo);

                            // What should I do?
                            // I want to tell the current topmost activity to go back when a button click is detected in my plotted icon service.
                        }
                        catch(Exception e){
                            Log.e("error", ":" + e);
                        }
                        break;

                    default:
                        break;
                }
            }catch(Exception e){
                Log.e("try close click","error :"  + e);
            }
      
        }
    };

    private ActivityInfo tryGetActivity(ComponentName componentName) {
        try {
            return getPackageManager().getActivityInfo(componentName, 0);
        } catch (PackageManager.NameNotFoundException e) {
            return null;
        }
    }

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

        if (this.manager != null) {
            if (this.mViewClose != null) {
                this.manager.removeView(this.mViewClose);
                this.mViewClose = null;
            }
            this.manager = null;
        }
    }
}


The picture below uses Instrumentation, but also requires system privileges.
mycode

mycode2

My program runs in the background Floats the icon on the top screen.
myapp

But this method requires system privileges.

I want to implement it as an app without system permission

This is the app I want

Thanks

Y Eng
  • 13
  • 3
  • You can't just call `onBackPressed()` ? – MSpeed Jul 21 '21 at 07:18
  • I don't know how to call onbackpressed() on another activity. – Y Eng Jul 21 '21 at 07:22
  • Please post your code within the post itself and not as separate links. Furthermore, you need to better describe your issue. From the app screenshots that you sent, it looks like you want to replace the system's back button with a custom layout, right? If so, your question is really lacking in describing it, you should consider explaining it further. – Stelios Papamichail Jul 21 '21 at 07:27
  • what you understand is correct, thanks I'll add the code to the question – Y Eng Jul 22 '21 at 00:24

1 Answers1

0

//Declare the Value private boolean Back = false;

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (Back) {
                setResult(RESULT_OK);
                finish();
            } else {
                setResult(RESULT_CANCELED);
                finish();
            }

        }
        return super.onKeyDown(keyCode, event);
    }

    
------------------ OR ------------------

@Override
public void onBackPressed() {
    super.onBackPressed();
    finish();
    startActivity(new Intent(SecActivity.this, FirstActivity.class));
}
  • What I want is... my program running in the background, I want to tell the topmost activity to go back. thank you @ – Y Eng Jul 22 '21 at 00:22