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

Commit 820a20b9 authored by Pedlar's avatar Pedlar
Browse files

Added Flashlight button for devices with an LED. And a Sleep button

parent 3be6795f
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -2265,6 +2265,9 @@ public final class Settings {
        /** @hide */
        public static final String EXPANDED_RING_MODE = "expanded_ring_mode";

        /** @hide */
        public static final String EXPANDED_FLASH_MODE = "expanded_flash_mode";

        /**
         * Whether to keep the home app at a higher OOM adjustement
         * @hide
+1.47 KiB
Loading image diff...
+1.83 KiB
Loading image diff...
+17 −1
Original line number Diff line number Diff line
@@ -99,6 +99,8 @@ import com.android.server.status.widget.NetworkModeButton;
import com.android.server.status.widget.LockScreenButton;
import com.android.server.status.widget.AutoRotateButton;
import com.android.server.status.widget.AirplaneButton;
import com.android.server.status.widget.FlashlightButton;
import com.android.server.status.widget.SleepButton;

/**
 * The public (ok, semi-public) service for the status bar.
@@ -1933,6 +1935,10 @@ public class StatusBarService extends IStatusBar.Stub
                AutoRotateButton.getInstance().toggleState(mContext);
            } else if(PowerButton.TOGGLE_AIRPLANE.equals(type)) {
                AirplaneButton.getInstance().toggleState(mContext);
            } else if(PowerButton.TOGGLE_FLASHLIGHT.equals(type)) {
                FlashlightButton.getInstance().toggleState(mContext);
            } else if(PowerButton.TOGGLE_SLEEPMODE.equals(type)) {
                SleepButton.getInstance().toggleState(mContext);
            }
            updateWidget();
        }
@@ -1989,8 +1995,11 @@ public class StatusBarService extends IStatusBar.Stub
            AutoRotateButton.getInstance().setupButton(position);
        } else if(PowerButton.TOGGLE_AIRPLANE.equals(buttonType)) {
            AirplaneButton.getInstance().setupButton(position);
        } else if(PowerButton.TOGGLE_FLASHLIGHT.equals(buttonType)) {
            FlashlightButton.getInstance().setupButton(position);
        } else if(PowerButton.TOGGLE_SLEEPMODE.equals(buttonType)) {
            SleepButton.getInstance().setupButton(position);
        }

    }

    private void clearWidget() {
@@ -2012,8 +2021,11 @@ public class StatusBarService extends IStatusBar.Stub
        NetworkModeButton.getInstance().setupButton(0);
        AutoRotateButton.getInstance().setupButton(0);
        AirplaneButton.getInstance().setupButton(0);
        FlashlightButton.getInstance().setupButton(0);
        SleepButton.getInstance().setupButton(0);
    }


    private void updateStates() {
        GPSButton.getInstance().updateState(mContext);
        WifiButton.getInstance().updateState(mContext);
@@ -2028,6 +2040,8 @@ public class StatusBarService extends IStatusBar.Stub
        NetworkModeButton.getInstance().updateState(mContext);
        AutoRotateButton.getInstance().updateState(mContext);
        AirplaneButton.getInstance().updateState(mContext);
        FlashlightButton.getInstance().updateState(mContext);
        SleepButton.getInstance().updateState(mContext);
    }
    private void updateViews() {
        GPSButton.getInstance().updateView(mContext, mExpandedView);
@@ -2043,6 +2057,8 @@ public class StatusBarService extends IStatusBar.Stub
        NetworkModeButton.getInstance().updateView(mContext, mExpandedView);
        AutoRotateButton.getInstance().updateView(mContext, mExpandedView);
        AirplaneButton.getInstance().updateView(mContext, mExpandedView);
        FlashlightButton.getInstance().updateView(mContext, mExpandedView);
        SleepButton.getInstance().updateView(mContext, mExpandedView);
    }

    private void updateWidget() {
+136 −0
Original line number Diff line number Diff line
package com.android.server.status.widget;

import com.android.internal.R;
import com.android.server.status.widget.PowerButton;

import android.content.ContentResolver;
import android.content.Context;
import android.provider.Settings;
import android.util.Log;
import android.os.Build;

import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.lang.Thread;
import java.lang.Runnable;
import java.io.File;
import java.io.FileWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class FlashlightButton extends PowerButton {
    static FlashlightButton ownButton;
    private static final String TAG = "FlashlightButton";
    private static int currentMode;

    private static FileWriter mWriter;

    private static ExecutorService threadExecutor;
    private static boolean runTimer = false;

    private static final int MODE_DEFAULT = 0;
    private static final int MODE_HIGH = 1;
    private static boolean useDeathRay = !Build.DEVICE.equals("supersonic");;

    private static final String FLASHLIGHT_FILE;
    private static final String FLASHLIGHT_FILE_SPOTLIGHT = "/sys/class/leds/spotlight/brightness";
    static {
        File ff = new File(FLASHLIGHT_FILE_SPOTLIGHT);
        if (ff.exists()) {
            FLASHLIGHT_FILE = FLASHLIGHT_FILE_SPOTLIGHT;
        } else {
            FLASHLIGHT_FILE = "/sys/class/leds/flashlight/brightness";
        }
    }

    public void updateState(Context context) {
        if(getFlashlightEnabled()) {
            currentIcon = com.android.internal.R.drawable.stat_flashlight_on;
            currentState = STATE_ENABLED;
        } else {
            currentIcon = com.android.internal.R.drawable.stat_flashlight_off;
            currentState = STATE_DISABLED;
        }
    }

    public void toggleState(Context context) {
        currentMode = Settings.System.getInt(context.getContentResolver(), Settings.System.EXPANDED_FLASH_MODE,
                    MODE_DEFAULT);
        boolean enabled = getFlashlightEnabled();
        runTimer = !enabled;
        setFlashlightEnabled(!enabled);
    }

    public static FlashlightButton getInstance() {
        if (ownButton==null) ownButton = new FlashlightButton();

        return ownButton;
    }


    public boolean getFlashlightEnabled() {
        try {
            FileInputStream fis = new FileInputStream(FLASHLIGHT_FILE);
            int result = fis.read();
            fis.close();
            return (result != '0');
        } catch (Exception e) {
            Log.e(TAG, "getFlashlightEnabled failed", e);
            return false;
        }
    }

    public void setFlashlightEnabled(boolean on) {
        try {
            if (mWriter == null) {
                mWriter = new FileWriter(FLASHLIGHT_FILE);
            }
            int value = 0;
            if (on) {
                switch (currentMode) {
                    case MODE_HIGH:
                        value = useDeathRay ? 3 : 128;
                        break;
                    default:
                        value = 1;
                        break;
                }
            }
            mWriter.write(String.valueOf(value));
            mWriter.flush();
            if (!on) {
                mWriter.close();
                mWriter = null;
            }
        } catch (Exception e) {
            Log.e(TAG, "setFlashlightEnabled failed", e);
        }
        startTimer(on);
    }

    private void startTimer(boolean on) {
        if (!on) return;
        if (threadExecutor == null) threadExecutor = Executors.newSingleThreadExecutor();

        flashTimer timerRun = new flashTimer();
        threadExecutor.execute(timerRun);
    }

    public class flashTimer implements Runnable {
        public flashTimer() {
        }
        public void run() {
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
            }
            setFlashlightEnabled(runTimer);
        }
    }


    @Override
    void initButton(int position) {
    }

}
Loading