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

Commit d0e82cec authored by Mike Lockwood's avatar Mike Lockwood
Browse files

Do not send dock state changed broadcasts until the system has finished booting.

parent 9e6842ca
Loading
Loading
Loading
Loading
+32 −30
Original line number Diff line number Diff line
@@ -36,17 +36,15 @@ class DockObserver extends UEventObserver {
    private static final String DOCK_UEVENT_MATCH = "DEVPATH=/devices/virtual/switch/dock";
    private static final String DOCK_STATE_PATH = "/sys/class/switch/dock/state";

    private int mDockState;
    private boolean mPendingIntent;
    private int mDockState = Intent.EXTRA_DOCK_STATE_UNDOCKED;
    private boolean mSystemReady;

    private final Context mContext;

    public DockObserver(Context context) {
        mContext = context;

        startObserving(DOCK_UEVENT_MATCH);

        init();  // set initial status
        startObserving(DOCK_UEVENT_MATCH);
    }

    @Override
@@ -55,56 +53,60 @@ class DockObserver extends UEventObserver {
            Log.v(TAG, "Dock UEVENT: " + event.toString());
        }

        synchronized (this) {
            try {
            update(Integer.parseInt(event.get("SWITCH_STATE")));
                int newState = Integer.parseInt(event.get("SWITCH_STATE"));
                if (newState != mDockState) {
                    mDockState = newState;
                    if (mSystemReady) {
                        update();
                    }
                }
            } catch (NumberFormatException e) {
                Log.e(TAG, "Could not parse switch state from event " + event);
            }
        }
    }

    private synchronized final void init() {
    private final void init() {
        char[] buffer = new char[1024];

        int newState = mDockState;
        try {
            FileReader file = new FileReader(DOCK_STATE_PATH);
            int len = file.read(buffer, 0, 1024);
            newState = Integer.valueOf((new String(buffer, 0, len)).trim());
            mDockState = Integer.valueOf((new String(buffer, 0, len)).trim());

        } catch (FileNotFoundException e) {
            Log.w(TAG, "This kernel does not have dock station support");
        } catch (Exception e) {
            Log.e(TAG, "" , e);
        }

        update(newState);
    }

    private synchronized final void update(int newState) {
        if (newState != mDockState) {
            mDockState = newState;
    void systemReady() {
        synchronized (this) {
            // don't bother broadcasting undocked here
            if (mDockState != Intent.EXTRA_DOCK_STATE_UNDOCKED) {
                update();
            }
            mSystemReady = true;
        }
    }

            mPendingIntent = true;
    private final void update() {
        mHandler.sendEmptyMessage(0);
    }
    }

    private synchronized final void sendIntent() {
    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            synchronized (this) {
                Log.d(TAG, "Broadcasting dock state " + mDockState);

                // Pack up the values and broadcast them to everyone
                Intent intent = new Intent(Intent.ACTION_DOCK_EVENT);
                intent.putExtra(Intent.EXTRA_DOCK_STATE, mDockState);
                mContext.sendStickyBroadcast(intent);
            }

    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (mPendingIntent) {
                sendIntent();
                mPendingIntent = false;
            }
        }
    };
}
+1 −0
Original line number Diff line number Diff line
@@ -392,6 +392,7 @@ class ServerThread extends Thread {
        if (wallpaper != null) wallpaper.systemReady();
        if (battery != null) battery.systemReady();
        if (connectivity != null) connectivity.systemReady();
        if (dock != null) dock.systemReady();
        Watchdog.getInstance().start();

        Looper.loop();