Thursday, November 23, 2017

Android - System settings observers

Observe auto-rotation changes



    /**
     * Observer to watch for changes to the Auto Rotation setting
     */
    private static class RotationObserver extends ContentObserver {

        private Context mContext;

        RotationObserver(Handler handler, Context context) {
            super(handler);
            mContext = context;
        }

        void startObserving() {
            ContentResolver resolver = mContext.getContentResolver();
            // Listen to accelerometer
            resolver.registerContentObserver(Settings.System.getUriFor
                            (Settings.System.ACCELEROMETER_ROTATION),
                    true, this);
        }

        void stopObserving() {
            mContext.getContentResolver().unregisterContentObserver(this);
        }

        @Override
        public void onChange(boolean selfChange) {
            Intent intent = new Intent(AUTO_ROTATE_CHANGED);
            mContext.sendBroadcast(intent); // receive in custom receiver
        }
    }

Observe brightness changes



    /**
     * Observer to watch for changes to the BRIGHTNESS setting
     */
    private static class BrightnessObserver extends ContentObserver {

        private Context mContext;

        BrightnessObserver(Handler handler, Context context) {
            super(handler);
            mContext = context;
        }

        void startObserving() {
            ContentResolver resolver = mContext.getContentResolver();
            // Listen to brightness and brightness mode
            resolver.registerContentObserver(Settings.System
                    .getUriFor(Settings.System.SCREEN_BRIGHTNESS), false, this);
            resolver.registerContentObserver(Settings.System
                    .getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE), false, this);
        }

        void stopObserving() {
            mContext.getContentResolver().unregisterContentObserver(this);
        }

        @Override
        public void onChange(boolean selfChange) {
            Intent intent = new Intent(BRIGHTNESS_CHANGED);
            mContext.sendBroadcast(intent); // receive in custom receiver
        }
    }

Use in Service


public class CustomService extends Service {
    ...
    private BrightnessObserver mBrightnessObserver ;
    private RotationObserver mRotationObserver;
    ...

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

        ...

        if (mSettingsObserver == null) {
            mSettingsObserver = new BrightnessObserver(new Handler(), this);
            mSettingsObserver.startObserving();
        }

        if (mRotationObserver == null) {
            mRotationObserver = new RotationObserver(new Handler(), this);
            mRotationObserver.startObserving();
        }
    }

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

        ...

        try {
            if (mSettingsObserver != null) {
                mSettingsObserver.stopObserving();
                mSettingsObserver = null;
            }

            if (mRotationObserver != null) {
                mRotationObserver.stopObserving();
                mRotationObserver = null;
            }

        } catch (Exception e) {
            Log.e(LOG_TAG, "", e);
        }
    }
}

No comments: