Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a1f9cd0e authored by Selim Cinek's avatar Selim Cinek Committed by android-build-merger
Browse files

Merge "Share one receiver for CurrentUserTracker" am: 06d619cc am: a84c7ea3

am: 61e2ff57

Change-Id: I0d10e5142705810274e4677115bb4e249ad806f4
parents a2ecf784 61e2ff57
Loading
Loading
Loading
Loading
+74 −20
Original line number Original line Diff line number Diff line
@@ -22,39 +22,93 @@ import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentFilter;


public abstract class CurrentUserTracker extends BroadcastReceiver {
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;


    private Context mContext;
public abstract class CurrentUserTracker {
    private int mCurrentUserId;
    private final UserReceiver mUserReceiver;

    private Consumer<Integer> mCallback = this::onUserSwitched;


    public CurrentUserTracker(Context context) {
    public CurrentUserTracker(Context context) {
        mContext = context;
        mUserReceiver = UserReceiver.getInstance(context);
    }
    }


    public int getCurrentUserId() {
    public int getCurrentUserId() {
        return mCurrentUserId;
        return mUserReceiver.getCurrentUserId();
    }

    public void startTracking() {
        mUserReceiver.addTracker(mCallback);
    }

    public void stopTracking() {
        mUserReceiver.removeTracker(mCallback);
    }

    public abstract void onUserSwitched(int newUserId);

    private static class UserReceiver extends BroadcastReceiver {
        private static UserReceiver sInstance;

        private Context mAppContext;
        private boolean mReceiverRegistered;
        private int mCurrentUserId;

        private List<Consumer<Integer>> mCallbacks = new ArrayList<>();

        private UserReceiver(Context context) {
            mAppContext = context.getApplicationContext();
        }

        static UserReceiver getInstance(Context context) {
            if (sInstance == null) {
                sInstance = new UserReceiver(context);
            }
            return sInstance;
        }
        }


        @Override
        @Override
        public void onReceive(Context context, Intent intent) {
        public void onReceive(Context context, Intent intent) {
            if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) {
            if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) {
            int oldUserId = mCurrentUserId;
                notifyUserSwitched(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0));
            mCurrentUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
            if (oldUserId != mCurrentUserId) {
                onUserSwitched(mCurrentUserId);
            }
            }
        }
        }

        public int getCurrentUserId() {
            return mCurrentUserId;
        }
        }


    public void startTracking() {
        private void addTracker(Consumer<Integer> callback) {
            if (!mCallbacks.contains(callback)) {
                mCallbacks.add(callback);
            }
            if (!mReceiverRegistered) {
                mCurrentUserId = ActivityManager.getCurrentUser();
                mCurrentUserId = ActivityManager.getCurrentUser();
                IntentFilter filter = new IntentFilter(Intent.ACTION_USER_SWITCHED);
                IntentFilter filter = new IntentFilter(Intent.ACTION_USER_SWITCHED);
        mContext.registerReceiver(this, filter);
                mAppContext.registerReceiver(this, filter);
                mReceiverRegistered = true;
            }
        }
        }


    public void stopTracking() {
        private void removeTracker(Consumer<Integer> callback) {
        mContext.unregisterReceiver(this);
            if (mCallbacks.contains(callback)) {
                mCallbacks.remove(callback);
                if (mCallbacks.size() == 0 && mReceiverRegistered) {
                    mAppContext.unregisterReceiver(this);
                    mReceiverRegistered = false;
                }
            }
        }
        }


    public abstract void onUserSwitched(int newUserId);
        private void notifyUserSwitched(int newUserId) {
            if (mCurrentUserId != newUserId) {
                mCurrentUserId = newUserId;
                for (Consumer<Integer> consumer : mCallbacks) {
                    consumer.accept(newUserId);
                }
            }
        }
    }
}
}