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

Commit eebdd4c2 authored by Steve Kondik's avatar Steve Kondik Committed by Gerrit Code Review
Browse files

Merge "Added Flashlight button for devices with an LED. And a Sleep button" into froyo

parents fd4f1b63 820a20b9
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