[Flashlight] Added On-Screen Flashlight support

Added support for an on-screen flashlight, which is basically
a fragment showing a pre-defined color on a full screen canvas
with the option to adjust the brightness of the screen.
This commit is contained in:
Alexander Dörflinger
2025-04-08 12:36:59 +02:00
parent 017b2b7379
commit 0d0a3f3883
10 changed files with 582 additions and 9 deletions

View File

@@ -72,6 +72,8 @@
android:exported="true"> android:exported="true">
<intent-filter> <intent-filter>
<action android:name="androidx.car.app.action.SERVICE" /> <action android:name="androidx.car.app.action.SERVICE" />
<action android:name="androidx.car.app.CarAppService"/>
<category android:name="androidx.car.app.category.MESSAGING"/>
</intent-filter> </intent-filter>
</service> </service>

View File

@@ -1,7 +1,13 @@
package com.aldo.apps.familyhelpers; package com.aldo.apps.familyhelpers;
import androidx.annotation.ColorRes;
import androidx.annotation.IdRes;
import androidx.annotation.LayoutRes;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.WindowCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.core.view.WindowInsetsControllerCompat;
import android.graphics.PorterDuff; import android.graphics.PorterDuff;
import android.os.Build; import android.os.Build;
@@ -11,6 +17,7 @@ import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import com.aldo.apps.familyhelpers.ui.FlashLightLevelShifter; import com.aldo.apps.familyhelpers.ui.FlashLightLevelShifter;
import com.aldo.apps.familyhelpers.utils.DisplayBrightnessController;
import com.aldo.apps.familyhelpers.utils.FlashlightHelper; import com.aldo.apps.familyhelpers.utils.FlashlightHelper;
import com.google.android.material.button.MaterialButton; import com.google.android.material.button.MaterialButton;
@@ -40,13 +47,34 @@ public class FlashlightActivity extends AppCompatActivity {
*/ */
private FlashlightHelper mFlashlightHelper; private FlashlightHelper mFlashlightHelper;
/**
* The fullscreen view that acts as the on-screen flashlight.
*/
private View mOnScreenFlashlight;
/**
* The {@link WindowInsetsControllerCompat} to control fullscreen mode.
*/
private WindowInsetsControllerCompat mFullscreenController;
private DisplayBrightnessController mBrightnessController;
@RequiresApi(api = Build.VERSION_CODES.TIRAMISU) @RequiresApi(api = Build.VERSION_CODES.TIRAMISU)
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_flashlight); setContentView(R.layout.activity_flashlight);
mFullscreenController = WindowCompat.getInsetsController(getWindow(),
getWindow().getDecorView());
mBrightnessController = new DisplayBrightnessController(findViewById(R.id.tv_current_brightness), this);
initButtons(); initButtons();
mOnScreenFlashlight = findViewById(R.id.on_screen_flashlight_view);
mOnScreenFlashlight.setOnClickListener(v -> {
mOnScreenFlashlight.setVisibility(View.GONE);
mFullscreenController.hide(WindowInsetsCompat.Type.systemBars());
});
mBrightnessController.setupSwipeGesture(mOnScreenFlashlight);
mLightOnIndicator = findViewById(R.id.flashlight_status_indicator); mLightOnIndicator = findViewById(R.id.flashlight_status_indicator);
mFlashlightLevelShifter = findViewById(R.id.flashlight_level_shifter); mFlashlightLevelShifter = findViewById(R.id.flashlight_level_shifter);
mFlashlightHelper = new FlashlightHelper(this); mFlashlightHelper = new FlashlightHelper(this);
@@ -81,6 +109,13 @@ public class FlashlightActivity extends AppCompatActivity {
mFlashlightLevelShifter.setProgress(maxBrightness); mFlashlightLevelShifter.setProgress(maxBrightness);
mFlashlightHelper.setFlashlightBrightness(maxBrightness); mFlashlightHelper.setFlashlightBrightness(maxBrightness);
}); });
initializeColorButton(R.id.btn_onscreen_flashlight_red, R.color.flashlight_onscreen_red, false);
initializeColorButton(R.id.btn_onscreen_flashlight_orange, R.color.flashlight_onscreen_orange, false);
initializeColorButton(R.id.btn_onscreen_flashlight_blue, R.color.flashlight_onscreen_blue, false);
initializeColorButton(R.id.btn_onscreen_flashlight_green, R.color.flashlight_onscreen_green, false);
initializeColorButton(R.id.btn_onscreen_flashlight_gray, R.color.flashlight_onscreen_gray, false);
initializeColorButton(R.id.btn_onscreen_flashlight_white, R.color.flashlight_onscreen_white, true);
initializeColorButton(R.id.btn_onscreen_flashlight_yellow, R.color.flashlight_onscreen_yellow, true);
} }
@Override @Override
@@ -106,6 +141,25 @@ public class FlashlightActivity extends AppCompatActivity {
} }
} }
/**
* Helper method to initialize a color button by applying the proper color to the surface and
* the textview.
*
* @param btnId The ID of the button to initialize.
* @param colorId The id of the color top apply.
* @param isLight True if it is a light color, false otherwise.
*/
private void initializeColorButton(@IdRes final int btnId,
@ColorRes final int colorId,
final boolean isLight) {
findViewById(btnId).setOnClickListener(v -> {
mOnScreenFlashlight.setBackgroundColor(getColor(colorId));
mOnScreenFlashlight.setVisibility(View.VISIBLE);
mFullscreenController.hide(WindowInsetsCompat.Type.systemBars());
mBrightnessController.setLightModeColor(isLight);
});
}
/** /**
* Helper method to print any potential errors while subscribing to the current status observable. * Helper method to print any potential errors while subscribing to the current status observable.
* *

View File

@@ -0,0 +1,277 @@
package com.aldo.apps.familyhelpers.utils;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView;
import androidx.annotation.ColorRes;
import androidx.annotation.IntegerRes;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import androidx.preference.PreferenceManager;
import com.aldo.apps.familyhelpers.R;
import java.lang.ref.WeakReference;
/**
* Utility class to control the display brightness of an Android activity using swipe gestures.
* <p>
* This class allows users to adjust the screen brightness by swiping up or down on a specified view.
* It also displays the current brightness level in a TextView. The brightness adjustment
* is controlled by user preferences for sensitivity and step size.
*/
public class DisplayBrightnessController {
/**
* Tag for debugging purposes.
*/
private static final String TAG = "DisplayBrightnessController";
/**
* Maximum allowed display brightness value.
*/
private static final int DISPLAY_BRIGHTNESS_MAX_VALUE = 255;
/**
* Minimum allowed display brightness value.
*/
private static final int DISPLAY_BRIGHTNESS_MIN_VALUE = 1;
/**
* Base value for swipe sensitivity calculation.
*/
private static final int SWIPE_SENSITIVITY_BASE = 10;
/**
* TextView to display the current brightness level.
*/
private final TextView mCurrentBrightnessText;
/**
* {@link WeakReference} to the {@link Context} of the application.
*/
private final WeakReference<Context> mContextRef;
/**
* {@link WeakReference} to the {@link Activity} whose screen brightness is being controlled.
*/
private final WeakReference<Activity> mActivityRef;
/**
* SharedPreferences instance for accessing user preferences.
*/
private final SharedPreferences mPreferences;
/**
* Current brightness level.
*/
private int mCurrentBrightness = 125;
/**
* Initial Y coordinate of the touch event for swipe detection.
*/
private float mInitialY;
/**
* Constructor for DisplayBrightnessController.
*
* @param textView The TextView used to display the current brightness level.
* @param activity The Activity whose screen brightness will be controlled.
* The Activity's application context is used for SharedPreferences.
*/
public DisplayBrightnessController(final TextView textView, final Activity activity) {
mCurrentBrightnessText = textView;
mActivityRef = new WeakReference<>(activity);
mContextRef = new WeakReference<>(activity.getApplicationContext());
mPreferences = PreferenceManager.getDefaultSharedPreferences(activity.getApplicationContext());
}
/**
* Sets up a swipe gesture listener on the provided view to control screen brightness.
* <p>
* The gesture listener detects vertical swipes. Swiping up increases brightness, and swiping
* down decreases it. The sensitivity of the swipe and the amount of brightness change
* per swipe are determined by user preferences. A single tap hides or shows the brightness text.
*
* @param view The view on which the swipe gesture should be detected.
*/
public void setupSwipeGesture(final View view) {
final Context context = mContextRef.get();
if (context == null) {
Log.e(TAG, "setupSwipeGesture: Context null, cannot continue");
return;
}
final GestureDetector gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDown(@NonNull final MotionEvent e) {
mInitialY = e.getY();
return true;
}
@Override
public boolean onScroll(final MotionEvent e1,
@NonNull final MotionEvent e2,
final float distanceX,
final float distanceY) {
final float diffY = e2.getY() - mInitialY;
mInitialY = e2.getY();
// Get sensitivity from preferences. Fall back to default if not found.
final float sensitivityValue = (float) SWIPE_SENSITIVITY_BASE / mPreferences.getInt(
getString(R.string.pref_key_on_screen_flashlight_sensitivity),
getInt(R.integer.pref_on_screen_flashlight_sensitivity_def));
Log.d(TAG, "onScroll: Started with Sensitivity = [" + sensitivityValue + "]");
if (Math.abs(diffY) > sensitivityValue) {
Log.d(TAG, "onScroll: Relevant swipe detected");
mCurrentBrightnessText.setVisibility(View.VISIBLE);
adjustBrightness(diffY < 0);
}
return true;
}
@Override
public boolean onSingleTapUp(@NonNull final MotionEvent e) {
Log.d(TAG, "onSingleTapUp: Tap detected, set visibility to GONE");
// Toggle visibility of the brightness text on single tap
if (View.VISIBLE == mCurrentBrightnessText.getVisibility()) {
mCurrentBrightnessText.setVisibility(View.GONE);
} else {
view.setVisibility(View.GONE); // added to hide view.
}
return true; // Indicate that this tap is handled
}
});
// Set the touch listener on the view to use the gesture detector
view.setOnTouchListener((v, event) -> gestureDetector.onTouchEvent(event));
}
/**
* Adjusts the screen brightness based on the swipe direction.
* <p>
* This method reads the brightness step size from preferences and changes the brightness
* by that amount. It also updates the brightness TextView.
*
* @param increase True to increase brightness, false to decrease.
*/
private void adjustBrightness(final boolean increase) {
Log.d(TAG, "adjustBrightness() called with: increase = [" + increase + "]");
// Get step size from preferences. Fall back to default if not found.
final int stepSize = mPreferences.getInt(
getString(R.string.pref_key_on_screen_flashlight_step_size),
getInt(R.integer.pref_on_screen_flashlight_step_size_def));
Log.d(TAG, "adjustBrightness: Called with StepSize = [" + stepSize
+ "] and current brightness = [" + mCurrentBrightness + "]");
// Check if current brightness is within valid bounds
if (DISPLAY_BRIGHTNESS_MIN_VALUE <= mCurrentBrightness
&& mCurrentBrightness <= DISPLAY_BRIGHTNESS_MAX_VALUE) {
Log.d(TAG, "adjustBrightness: Called within valid range");
final int newBrightness;
if (increase) {
newBrightness = Math.min(DISPLAY_BRIGHTNESS_MAX_VALUE, mCurrentBrightness + stepSize);
} else {
newBrightness = Math.max(DISPLAY_BRIGHTNESS_MIN_VALUE, mCurrentBrightness - stepSize);
}
setBrightness(newBrightness);
updateBrightnessText(newBrightness);
mCurrentBrightness = newBrightness;
}
}
/**
* Sets the screen brightness of the activity.
*
* @param brightness The new brightness value (0-255).
*/
private void setBrightness(final int brightness) {
final Activity activity = mActivityRef.get();
if (activity == null) {
Log.e(TAG, "setBrightness: Activity is null, cannot continue");
return;
}
Log.d(TAG, "setBrightness: Setting the screen brightness to [" + brightness + "]");
final WindowManager.LayoutParams layout = activity.getWindow().getAttributes();
layout.screenBrightness = brightness / (float) DISPLAY_BRIGHTNESS_MAX_VALUE;
activity.getWindow().setAttributes(layout);
}
/**
* Updates the brightness TextView with the current brightness value.
*
* @param brightnessValue The current brightness value.
*/
private void updateBrightnessText(final int brightnessValue) {
Log.d(TAG, "updateBrightnessText() called with: brightnessValue = [" + brightnessValue + "]");
mCurrentBrightnessText.setText(String.format(
getString(R.string.flashlight_on_screen_brightness_base_text) ,brightnessValue));
}
/**
* Helper method to set the text color adjustable to either light of dark colors to be visible
* on either surface.
*
* @param isLightModeColor true if the color is a light color, false otherwise.
*/
public void setLightModeColor(final boolean isLightModeColor) {
Log.d(TAG, "setLightModeColor() called with: isLightModeColor = [" + isLightModeColor + "]");
if (isLightModeColor) {
mCurrentBrightnessText.setTextColor(getColor(R.color.black));
} else {
mCurrentBrightnessText.setTextColor(getColor(R.color.white));
}
}
/**
* Helper method to get a string resource from the activity.
*
* @param textId The resource ID of the string.
* @return The string value.
*/
private String getString(@StringRes final int textId) {
final Activity activity = mActivityRef.get();
if (activity == null) {
Log.e(TAG, "getString: Activity is null, cannot continue");
return "";
}
return activity.getString(textId);
}
/**
* Helper method to get a color resource from the activity.
*
* @param colorId The resource ID of the color.
* @return The color value.
*/
private int getColor(@ColorRes final int colorId) {
final Activity activity = mActivityRef.get();
if (activity == null) {
Log.e(TAG, "getInt: Activity is null, cannot continue");
return 0;
}
return activity.getColor(colorId);
}
/**
* Helper method to get an integer resource from the activity.
*
* @param intId The resource ID of the integer.
* @return The integer value.
*/
private int getInt(@IntegerRes final int intId) {
final Activity activity = mActivityRef.get();
if (activity == null) {
Log.e(TAG, "getInt: Activity is null, cannot continue");
return 0;
}
return activity.getResources().getInteger(intId);
}
}

View File

@@ -6,6 +6,115 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".FlashlightActivity"> tools:context=".FlashlightActivity">
<TextView
android:id="@+id/tv_onscreen_flashlight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:text="@string/flashlight_on_screen_title"
android:textSize="@dimen/flashlight_category_header_text_size"
android:layout_marginStart="@dimen/flashlight_category_header_margin_start"
android:layout_marginTop="@dimen/flashlight_category_header_margin_top"
android:layout_marginBottom="@dimen/flashlight_category_header_margin_bottom"/>
<Button
android:id="@+id/btn_onscreen_flashlight_red"
android:layout_width="0dp"
android:layout_height="@dimen/flashlight_onscreen_button_layout_height"
app:layout_constrainedWidth="true"
app:layout_constraintStart_toStartOf="parent"
android:backgroundTint="@color/flashlight_onscreen_red"
android:textColor="@color/white"
android:text="@string/flashlight_on_screen_color_red"
android:layout_marginHorizontal="@dimen/flashlight_onscreen_button_margin_horizontal"
app:layout_constraintEnd_toStartOf="@id/flashlight_level_shifter"
app:layout_constraintTop_toBottomOf="@id/tv_onscreen_flashlight"/>
<Button
android:id="@+id/btn_onscreen_flashlight_blue"
android:layout_width="0dp"
android:layout_height="@dimen/flashlight_onscreen_button_layout_height"
app:layout_constrainedWidth="true"
app:layout_constraintStart_toStartOf="parent"
android:text="@string/flashlight_on_screen_color_blue"
android:backgroundTint="@color/flashlight_onscreen_blue"
android:textColor="@color/white"
android:layout_marginHorizontal="@dimen/flashlight_onscreen_button_margin_horizontal"
android:layout_marginTop="@dimen/flashlight_onscreen_button_margin_top"
app:layout_constraintEnd_toStartOf="@id/flashlight_level_shifter"
app:layout_constraintTop_toBottomOf="@id/btn_onscreen_flashlight_red"/>
<Button
android:id="@+id/btn_onscreen_flashlight_green"
android:layout_width="0dp"
android:layout_height="@dimen/flashlight_onscreen_button_layout_height"
app:layout_constrainedWidth="true"
app:layout_constraintStart_toStartOf="parent"
android:text="@string/flashlight_on_screen_color_green"
android:backgroundTint="@color/flashlight_onscreen_green"
android:textColor="@color/white"
android:layout_marginHorizontal="@dimen/flashlight_onscreen_button_margin_horizontal"
android:layout_marginTop="@dimen/flashlight_onscreen_button_margin_top"
app:layout_constraintEnd_toStartOf="@id/flashlight_level_shifter"
app:layout_constraintTop_toBottomOf="@id/btn_onscreen_flashlight_blue"/>
<Button
android:id="@+id/btn_onscreen_flashlight_orange"
android:layout_width="0dp"
android:layout_height="@dimen/flashlight_onscreen_button_layout_height"
app:layout_constrainedWidth="true"
app:layout_constraintStart_toStartOf="parent"
android:backgroundTint="@color/flashlight_onscreen_orange"
android:textColor="@color/white"
android:text="@string/flashlight_on_screen_color_orange"
android:layout_marginHorizontal="@dimen/flashlight_onscreen_button_margin_horizontal"
android:layout_marginTop="@dimen/flashlight_onscreen_button_margin_top"
app:layout_constraintEnd_toStartOf="@id/flashlight_level_shifter"
app:layout_constraintTop_toBottomOf="@id/btn_onscreen_flashlight_green"/>
<Button
android:id="@+id/btn_onscreen_flashlight_yellow"
android:layout_width="0dp"
android:layout_height="@dimen/flashlight_onscreen_button_layout_height"
app:layout_constrainedWidth="true"
app:layout_constraintStart_toStartOf="parent"
android:backgroundTint="@color/flashlight_onscreen_yellow"
android:textColor="@color/black"
android:text="@string/flashlight_on_screen_color_yellow"
android:layout_marginHorizontal="@dimen/flashlight_onscreen_button_margin_horizontal"
android:layout_marginTop="@dimen/flashlight_onscreen_button_margin_top"
app:layout_constraintEnd_toStartOf="@id/flashlight_level_shifter"
app:layout_constraintTop_toBottomOf="@id/btn_onscreen_flashlight_orange"/>
<Button
android:id="@+id/btn_onscreen_flashlight_gray"
android:layout_width="0dp"
android:layout_height="@dimen/flashlight_onscreen_button_layout_height"
app:layout_constrainedWidth="true"
app:layout_constraintStart_toStartOf="parent"
android:backgroundTint="@color/flashlight_onscreen_gray"
android:textColor="@color/white"
android:text="@string/flashlight_on_screen_color_gray"
android:layout_marginHorizontal="@dimen/flashlight_onscreen_button_margin_horizontal"
android:layout_marginTop="@dimen/flashlight_onscreen_button_margin_top"
app:layout_constraintEnd_toStartOf="@id/flashlight_level_shifter"
app:layout_constraintTop_toBottomOf="@id/btn_onscreen_flashlight_yellow"/>
<Button
android:id="@+id/btn_onscreen_flashlight_white"
android:layout_width="0dp"
android:layout_height="@dimen/flashlight_onscreen_button_layout_height"
app:layout_constrainedWidth="true"
app:layout_constraintStart_toStartOf="parent"
android:backgroundTint="@color/flashlight_onscreen_white"
android:textColor="@color/black"
android:text="@string/flashlight_on_screen_color_white"
android:layout_marginHorizontal="@dimen/flashlight_onscreen_button_margin_horizontal"
android:layout_marginTop="@dimen/flashlight_onscreen_button_margin_top"
app:layout_constraintEnd_toStartOf="@id/flashlight_level_shifter"
app:layout_constraintTop_toBottomOf="@id/btn_onscreen_flashlight_gray"/>
<ImageView <ImageView
android:id="@+id/flashlight_status_indicator" android:id="@+id/flashlight_status_indicator"
android:src="@drawable/ic_flashlight_off" android:src="@drawable/ic_flashlight_off"
@@ -71,4 +180,30 @@
app:layout_constraintEnd_toStartOf="@id/flashlight_level_shifter" app:layout_constraintEnd_toStartOf="@id/flashlight_level_shifter"
android:text="@string/flashlight_set_max_level"/> android:text="@string/flashlight_set_max_level"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/flashlight_camera_title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toTopOf="@id/btn_flashlight_maximum"
android:textSize="@dimen/flashlight_category_header_text_size"
android:layout_marginStart="@dimen/flashlight_category_header_margin_start"
android:layout_marginTop="@dimen/flashlight_category_header_margin_top"
android:layout_marginBottom="@dimen/flashlight_category_header_margin_bottom"/>
<View
android:id="@+id/on_screen_flashlight_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"/>
<TextView
android:id="@+id/tv_current_brightness"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_margin="45dp"
android:textSize="45sp"/>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -24,10 +24,19 @@
<string name="share_location_background_permission_rationale">Um deinen Standort auch zu teilen, während die App im Hintergrund ist, bitte wähle die \"Immer\" Option.</string> <string name="share_location_background_permission_rationale">Um deinen Standort auch zu teilen, während die App im Hintergrund ist, bitte wähle die \"Immer\" Option.</string>
<string name="title_activity_settings">Einstellungen</string> <string name="title_activity_settings">Einstellungen</string>
<string name="title_flashlight">Taschenlampe</string> <string name="title_flashlight">Taschenlampe</string>
<string name="flashlight_camera_title">Taschenlampe Rückseite</string>
<string name="flashlight_camera_rationale">Um auf die Taschenlampe zugreifen zu können, wird die Kamera Berechtigung gebraucht.</string> <string name="flashlight_camera_rationale">Um auf die Taschenlampe zugreifen zu können, wird die Kamera Berechtigung gebraucht.</string>
<string name="flashlight_set_min_level">Aktiviere die Taschenlampe auf minimaler Helligkeit</string> <string name="flashlight_set_min_level">Aktiviere die Taschenlampe auf minimaler Helligkeit</string>
<string name="flashlight_set_med_level">Aktiviere die Taschenlampe auf mittlerer Helligkeit</string> <string name="flashlight_set_med_level">Aktiviere die Taschenlampe auf mittlerer Helligkeit</string>
<string name="flashlight_set_max_level">Aktiviere die Taschenlampe auf maximaler Helligkeit</string> <string name="flashlight_set_max_level">Aktiviere die Taschenlampe auf maximaler Helligkeit</string>
<string name="flashlight_on_screen_color_red">Roter Bildschirm</string>
<string name="flashlight_on_screen_color_blue">Blauer Bildschirm</string>
<string name="flashlight_on_screen_color_green">Grüner Bildschirm</string>
<string name="flashlight_on_screen_color_orange">Orangener Bildschirm</string>
<string name="flashlight_on_screen_color_yellow">Gelber Bildschirm</string>
<string name="flashlight_on_screen_color_white">Weißer Bildschirm</string>
<string name="flashlight_on_screen_color_gray">Grauer Bildschirm</string>
<string name="flashlight_on_screen_brightness_base_text">Helligkeit: %d</string>
<string name="title_settings">Einstellungen</string> <string name="title_settings">Einstellungen</string>
<string name="pref_share_location_header">Standort teilen</string> <string name="pref_share_location_header">Standort teilen</string>
<string name="pref_share_location_freq_title">Standort Update Frequenz</string> <string name="pref_share_location_freq_title">Standort Update Frequenz</string>
@@ -43,4 +52,16 @@
<string name="pref_flashlight_store_brightness_title">Helligkeit speichern</string> <string name="pref_flashlight_store_brightness_title">Helligkeit speichern</string>
<string name="pref_flashlight_store_brightness_summary_off">Wenn die Taschenlampe gestartet wird, wird die unten gesetzte Standard Helligkeit genommen.</string> <string name="pref_flashlight_store_brightness_summary_off">Wenn die Taschenlampe gestartet wird, wird die unten gesetzte Standard Helligkeit genommen.</string>
<string name="pref_flashlight_store_brightness_summary_on">Die zuletzt gewählte Helligkeit wird gespeichert und beim neustart angewandt</string> <string name="pref_flashlight_store_brightness_summary_on">Die zuletzt gewählte Helligkeit wird gespeichert und beim neustart angewandt</string>
<string name="pref_on_screen_flashlight_sensitivity_title">Empfindlichkeit Swipe</string>
<string name="pref_on_screen_flashlight_sensitivity_summary">Die Empfindlichkeit mit der auf Swipe Gesten reagiert wird</string>
<string name="pref_on_screen_flashlight_step_size_title">Schrittgröße</string>
<string name="pref_on_screen_flashlight_step_size_summary">Die Größe der Schritte mit der die Helligkeit verändert werden soll</string>
<string name="android_auto_message_currently_sharing">Du teilst bereits deinen Standort mit der Familie, willst du aufhören?</string>
<string name="android_auto_message_not_sharing">Android Auto wurde gestartet, willst du deinen Standort teilen?</string>
<string name="android_auto_actions_start_sharing">Ja, fang an zu teilen</string>
<string name="android_auto_actions_stop_sharing">Ja, hör auf zu teilen</string>
<string name="android_auto_share_location_start">Start</string>
<string name="android_auto_share_location_start_desc">Anfangen den Standort zu teilen</string>
<string name="android_auto_share_location_stop">Stop</string>
<string name="android_auto_share_location_stop_desc">Aufhören den Standort zu teilen</string>
</resources> </resources>

View File

@@ -24,10 +24,19 @@
<string name="share_location_background_permission_rationale">In order to share your position also while in the background, please grant the always permission</string> <string name="share_location_background_permission_rationale">In order to share your position also while in the background, please grant the always permission</string>
<string name="title_activity_settings">Settings</string> <string name="title_activity_settings">Settings</string>
<string name="title_flashlight">Flashlight</string> <string name="title_flashlight">Flashlight</string>
<string name="flashlight_camera_title">Camera Flashlight</string>
<string name="flashlight_camera_rationale">In order to have access to the flashlight, you need to grant the Camera permission.</string> <string name="flashlight_camera_rationale">In order to have access to the flashlight, you need to grant the Camera permission.</string>
<string name="flashlight_set_min_level">Activate flashlight on minimum brightness</string> <string name="flashlight_set_min_level">Activate flashlight on minimum brightness</string>
<string name="flashlight_set_med_level">Activate flashlight on medium brightness</string> <string name="flashlight_set_med_level">Activate flashlight on medium brightness</string>
<string name="flashlight_set_max_level">Activate flashlight on maximum brightness</string> <string name="flashlight_set_max_level">Activate flashlight on maximum brightness</string>
<string name="flashlight_on_screen_color_red">Red On-Screen</string>
<string name="flashlight_on_screen_color_blue">Blue On-Screen</string>
<string name="flashlight_on_screen_color_green">Green On-Screen</string>
<string name="flashlight_on_screen_color_orange">Orange On-Screen</string>
<string name="flashlight_on_screen_color_yellow">Yellow On-Screen</string>
<string name="flashlight_on_screen_color_white">White On-Screen</string>
<string name="flashlight_on_screen_color_gray">Gray On-Screen</string>
<string name="flashlight_on_screen_brightness_base_text">Brightness: %d</string>
<string name="title_settings">Settings</string> <string name="title_settings">Settings</string>
<string name="pref_share_location_header">Share Location</string> <string name="pref_share_location_header">Share Location</string>
<string name="pref_share_location_freq_title">Location Update frequency</string> <string name="pref_share_location_freq_title">Location Update frequency</string>
@@ -43,4 +52,16 @@
<string name="pref_flashlight_store_brightness_title">Remember Brightness</string> <string name="pref_flashlight_store_brightness_title">Remember Brightness</string>
<string name="pref_flashlight_store_brightness_summary_off">The default brightness selected below, will be selected every time you start the flashlight</string> <string name="pref_flashlight_store_brightness_summary_off">The default brightness selected below, will be selected every time you start the flashlight</string>
<string name="pref_flashlight_store_brightness_summary_on">The last selected brightness will be remembered when starting the flashlight again</string> <string name="pref_flashlight_store_brightness_summary_on">The last selected brightness will be remembered when starting the flashlight again</string>
<string name="pref_on_screen_flashlight_sensitivity_title">Swipe Sensitivity</string>
<string name="pref_on_screen_flashlight_sensitivity_summary">The sensitivity of the swipe gesture on the on-screen flashlight</string>
<string name="pref_on_screen_flashlight_step_size_title">Swipe Step Size</string>
<string name="pref_on_screen_flashlight_step_size_summary">The change step size of the on-screen swipe gesture</string>
<string name="android_auto_message_currently_sharing">You are already sharing your location with your family, do you wanna stop?</string>
<string name="android_auto_message_not_sharing">Android Auto start has been detected, do you wanna share your location?</string>
<string name="android_auto_actions_start_sharing">Yes, start to share</string>
<string name="android_auto_actions_stop_sharing">Yes, stop sharing</string>
<string name="android_auto_share_location_start">Start</string>
<string name="android_auto_share_location_start_desc">Start to share location</string>
<string name="android_auto_share_location_stop">Stop</string>
<string name="android_auto_share_location_stop_desc">Stop to share the location</string>
</resources> </resources>

View File

@@ -9,9 +9,17 @@
<color name="helperGroupTileBorder_NightMode">#00796B</color> <color name="helperGroupTileBorder_NightMode">#00796B</color>
<color name="light_blue_400">#FF29B6F6</color> <color name="light_blue_400">#FF29B6F6</color>
<color name="light_blue_600">#FF039BE5</color> <color name="light_blue_600">#FF039BE5</color>
<color name="gray_400">#FFBDBDBD</color> <color name="gray_400">#EFE7E7</color>
<color name="gray_600">#FF757575</color> <color name="gray_600">#FF757575</color>
<color name="flashlight_onscreen_red">#C62828</color>
<color name="flashlight_onscreen_blue">#283593</color>
<color name="flashlight_onscreen_green">#00695C</color>
<color name="flashlight_onscreen_orange">#D84315</color>
<color name="flashlight_onscreen_yellow">#FF8F00</color>
<color name="flashlight_onscreen_white">#D3C5C5</color>
<color name="flashlight_onscreen_gray">#616161</color>
<!-- Auto-Generated Colors --> <!-- Auto-Generated Colors -->
<color name="md_theme_primary">#904A44</color> <color name="md_theme_primary">#904A44</color>
<color name="md_theme_onPrimary">#FFFFFF</color> <color name="md_theme_onPrimary">#FFFFFF</color>

View File

@@ -33,6 +33,13 @@
<dimen name="flashlight_activity_margin_bottom">25dp</dimen> <dimen name="flashlight_activity_margin_bottom">25dp</dimen>
<dimen name="flashlight_material_button_margin_start">20dp</dimen> <dimen name="flashlight_material_button_margin_start">20dp</dimen>
<dimen name="flashlight_material_button_margin_end">30dp</dimen> <dimen name="flashlight_material_button_margin_end">30dp</dimen>
<dimen name="flashlight_onscreen_button_layout_height">50dp</dimen>
<dimen name="flashlight_onscreen_button_margin_top">10dp</dimen>
<dimen name="flashlight_onscreen_button_margin_horizontal">35dp</dimen>
<dimen name="flashlight_category_header_text_size">20sp</dimen>
<dimen name="flashlight_category_header_margin_start">10dp</dimen>
<dimen name="flashlight_category_header_margin_top">25dp</dimen>
<dimen name="flashlight_category_header_margin_bottom">15dp</dimen>
<integer name="flashlight_material_button_lines">3</integer> <integer name="flashlight_material_button_lines">3</integer>
<integer name="flashlight_material_button_max_lines">3</integer> <integer name="flashlight_material_button_max_lines">3</integer>
@@ -45,4 +52,12 @@
<integer name="pref_flashlight_def_brightness_max">100</integer> <integer name="pref_flashlight_def_brightness_max">100</integer>
<integer name="pref_flashlight_def_brightness_default">75</integer> <integer name="pref_flashlight_def_brightness_default">75</integer>
<integer name="pref_flashlight_def_brightness_increment">1</integer> <integer name="pref_flashlight_def_brightness_increment">1</integer>
<integer name="pref_on_screen_flashlight_sensitivity_min">1</integer>
<integer name="pref_on_screen_flashlight_sensitivity_max">100</integer>
<integer name="pref_on_screen_flashlight_sensitivity_def">50</integer>
<integer name="pref_on_screen_flashlight_sensitivity_increment">10</integer>
<integer name="pref_on_screen_flashlight_step_size_min">1</integer>
<integer name="pref_on_screen_flashlight_step_size_max">25</integer>
<integer name="pref_on_screen_flashlight_step_size_def">1</integer>
<integer name="pref_on_screen_flashlight_step_size_increment">1</integer>
</resources> </resources>

View File

@@ -35,10 +35,20 @@
<!-- Flashlight Functionality Strings --> <!-- Flashlight Functionality Strings -->
<string name="title_flashlight">Flashlight</string> <string name="title_flashlight">Flashlight</string>
<string name="flashlight_camera_title">Camera Flashlight</string>
<string name="flashlight_camera_rationale">In order to have access to the flashlight, you need to grant the Camera permission.</string> <string name="flashlight_camera_rationale">In order to have access to the flashlight, you need to grant the Camera permission.</string>
<string name="flashlight_set_min_level">Activate flashlight on minimum brightness</string> <string name="flashlight_set_min_level">Activate flashlight on minimum brightness</string>
<string name="flashlight_set_med_level">Activate flashlight on medium brightness</string> <string name="flashlight_set_med_level">Activate flashlight on medium brightness</string>
<string name="flashlight_set_max_level">Activate flashlight on maximum brightness</string> <string name="flashlight_set_max_level">Activate flashlight on maximum brightness</string>
<string name="flashlight_on_screen_title">On-Screen Flashlight</string>
<string name="flashlight_on_screen_color_red">Red On-Screen</string>
<string name="flashlight_on_screen_color_blue">Blue On-Screen</string>
<string name="flashlight_on_screen_color_green">Green On-Screen</string>
<string name="flashlight_on_screen_color_orange">Orange On-Screen</string>
<string name="flashlight_on_screen_color_yellow">Yellow On-Screen</string>
<string name="flashlight_on_screen_color_white">White On-Screen</string>
<string name="flashlight_on_screen_color_gray">Gray On-Screen</string>
<string name="flashlight_on_screen_brightness_base_text">Brightness: %d</string>
<!-- Settings --> <!-- Settings -->
<string name="title_settings">Settings</string> <string name="title_settings">Settings</string>
@@ -60,6 +70,10 @@
<string name="pref_flashlight_store_brightness_summary_on">The last selected brightness will be remembered when starting the flashlight again</string> <string name="pref_flashlight_store_brightness_summary_on">The last selected brightness will be remembered when starting the flashlight again</string>
<string name="pref_flashlight_default_brightness_title">Default Brightness</string> <string name="pref_flashlight_default_brightness_title">Default Brightness</string>
<string name="pref_flashlight_default_brightness_summary">The default brightness to be set when starting the activity in \%</string> <string name="pref_flashlight_default_brightness_summary">The default brightness to be set when starting the activity in \%</string>
<string name="pref_on_screen_flashlight_sensitivity_title">Swipe Sensitivity</string>
<string name="pref_on_screen_flashlight_sensitivity_summary">The sensitivity of the swipe gesture on the on-screen flashlight</string>
<string name="pref_on_screen_flashlight_step_size_title">Swipe Step Size</string>
<string name="pref_on_screen_flashlight_step_size_summary">The change step size of the on-screen swipe gesture</string>
<!-- Preference Keys --> <!-- Preference Keys -->
<string name="pref_key_share_location_freq" translatable="false">location_update_freq</string> <string name="pref_key_share_location_freq" translatable="false">location_update_freq</string>
@@ -67,15 +81,17 @@
<string name="pref_key_share_location_man_acc" translatable="false">manual_accuracy</string> <string name="pref_key_share_location_man_acc" translatable="false">manual_accuracy</string>
<string name="pref_key_flashlight_store_brightness" translatable="false">store_last_brightness</string> <string name="pref_key_flashlight_store_brightness" translatable="false">store_last_brightness</string>
<string name="pref_key_flashlight_default_brightness" translatable="false">flashlight_default_brightness</string> <string name="pref_key_flashlight_default_brightness" translatable="false">flashlight_default_brightness</string>
<string name="pref_key_on_screen_flashlight_sensitivity" translatable="false">on_screen_flash_sensititvity</string>
<string name="pref_key_on_screen_flashlight_step_size" translatable="false">on_screen_flash_step_size</string>
<!-- Android Auto related Strings --> <!-- Android Auto related Strings -->
<string name="android_auto_message_currently_sharing" translatable="false">You are already sharing your location with your family, do you wanna stop?</string> <string name="android_auto_message_currently_sharing">You are already sharing your location with your family, do you wanna stop?</string>
<string name="android_auto_message_not_sharing" translatable="false">Android Auto start has been detected, do you wanna share your location?</string> <string name="android_auto_message_not_sharing">Android Auto start has been detected, do you wanna share your location?</string>
<string name="android_auto_actions_start_sharing" translatable="false">Yes, start to share</string> <string name="android_auto_actions_start_sharing">Yes, start to share</string>
<string name="android_auto_actions_stop_sharing" translatable="false">Yes, stop sharing</string> <string name="android_auto_actions_stop_sharing">Yes, stop sharing</string>
<string name="android_auto_share_location_start" translatable="false">Start</string> <string name="android_auto_share_location_start">Start</string>
<string name="android_auto_share_location_start_desc" translatable="false">Start to share location</string> <string name="android_auto_share_location_start_desc">Start to share location</string>
<string name="android_auto_share_location_stop" translatable="false">Stop</string> <string name="android_auto_share_location_stop">Stop</string>
<string name="android_auto_share_location_stop_desc" translatable="false">Stop to share the location</string> <string name="android_auto_share_location_stop_desc">Stop to share the location</string>
</resources> </resources>

View File

@@ -51,6 +51,30 @@
app:seekBarIncrement="@integer/pref_flashlight_def_brightness_increment" app:seekBarIncrement="@integer/pref_flashlight_def_brightness_increment"
app:showSeekBarValue="true"/> app:showSeekBarValue="true"/>
<PreferenceCategory app:title="On-Screen Flashlight">
<SeekBarPreference
app:key="@string/pref_key_on_screen_flashlight_sensitivity"
app:title="@string/pref_on_screen_flashlight_sensitivity_title"
app:min="@integer/pref_on_screen_flashlight_sensitivity_min"
android:max="@integer/pref_on_screen_flashlight_sensitivity_max"
app:seekBarIncrement="@integer/pref_on_screen_flashlight_sensitivity_increment"
app:showSeekBarValue="true"
app:defaultValue="@integer/pref_on_screen_flashlight_sensitivity_def"
app:summary="@string/pref_on_screen_flashlight_sensitivity_summary"/>
<SeekBarPreference
app:key="@string/pref_key_on_screen_flashlight_step_size"
app:title="@string/pref_on_screen_flashlight_step_size_title"
app:min="@integer/pref_on_screen_flashlight_step_size_min"
android:max="@integer/pref_on_screen_flashlight_step_size_max"
app:seekBarIncrement="@integer/pref_on_screen_flashlight_step_size_increment"
app:showSeekBarValue="true"
app:defaultValue="@integer/pref_on_screen_flashlight_step_size_def"
app:summary="@string/pref_on_screen_flashlight_step_size_summary"/>
</PreferenceCategory>
</PreferenceCategory> </PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>