Loading core/java/android/provider/Settings.java +3 −0 Original line number Diff line number Diff line Loading @@ -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 Loading core/res/res/drawable-hdpi/stat_sleep.png 0 → 100644 +1.47 KiB Loading image diff... core/res/res/drawable-mdpi/stat_sleep.png 0 → 100644 +1.83 KiB Loading image diff... services/java/com/android/server/status/StatusBarService.java +17 −1 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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(); } Loading Loading @@ -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() { Loading @@ -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); Loading @@ -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); Loading @@ -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() { Loading services/java/com/android/server/status/widget/FlashlightButton.java 0 → 100644 +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
core/java/android/provider/Settings.java +3 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
services/java/com/android/server/status/StatusBarService.java +17 −1 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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(); } Loading Loading @@ -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() { Loading @@ -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); Loading @@ -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); Loading @@ -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() { Loading
services/java/com/android/server/status/widget/FlashlightButton.java 0 → 100644 +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) { } }