[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:
@@ -72,6 +72,8 @@
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<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>
|
||||
</service>
|
||||
|
||||
|
||||
@@ -1,7 +1,13 @@
|
||||
package com.aldo.apps.familyhelpers;
|
||||
|
||||
import androidx.annotation.ColorRes;
|
||||
import androidx.annotation.IdRes;
|
||||
import androidx.annotation.LayoutRes;
|
||||
import androidx.annotation.RequiresApi;
|
||||
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.os.Build;
|
||||
@@ -11,6 +17,7 @@ import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import com.aldo.apps.familyhelpers.ui.FlashLightLevelShifter;
|
||||
import com.aldo.apps.familyhelpers.utils.DisplayBrightnessController;
|
||||
import com.aldo.apps.familyhelpers.utils.FlashlightHelper;
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
|
||||
@@ -40,13 +47,34 @@ public class FlashlightActivity extends AppCompatActivity {
|
||||
*/
|
||||
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)
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_flashlight);
|
||||
mFullscreenController = WindowCompat.getInsetsController(getWindow(),
|
||||
getWindow().getDecorView());
|
||||
mBrightnessController = new DisplayBrightnessController(findViewById(R.id.tv_current_brightness), this);
|
||||
|
||||
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);
|
||||
mFlashlightLevelShifter = findViewById(R.id.flashlight_level_shifter);
|
||||
mFlashlightHelper = new FlashlightHelper(this);
|
||||
@@ -81,6 +109,13 @@ public class FlashlightActivity extends AppCompatActivity {
|
||||
mFlashlightLevelShifter.setProgress(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
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,115 @@
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
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
|
||||
android:id="@+id/flashlight_status_indicator"
|
||||
android:src="@drawable/ic_flashlight_off"
|
||||
@@ -71,4 +180,30 @@
|
||||
app:layout_constraintEnd_toStartOf="@id/flashlight_level_shifter"
|
||||
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>
|
||||
@@ -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="title_activity_settings">Einstellungen</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_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_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="pref_share_location_header">Standort teilen</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_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_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>
|
||||
@@ -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="title_activity_settings">Settings</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_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_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="pref_share_location_header">Share Location</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_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_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>
|
||||
@@ -9,9 +9,17 @@
|
||||
<color name="helperGroupTileBorder_NightMode">#00796B</color>
|
||||
<color name="light_blue_400">#FF29B6F6</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="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 -->
|
||||
<color name="md_theme_primary">#904A44</color>
|
||||
<color name="md_theme_onPrimary">#FFFFFF</color>
|
||||
|
||||
@@ -33,6 +33,13 @@
|
||||
<dimen name="flashlight_activity_margin_bottom">25dp</dimen>
|
||||
<dimen name="flashlight_material_button_margin_start">20dp</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_max_lines">3</integer>
|
||||
|
||||
@@ -45,4 +52,12 @@
|
||||
<integer name="pref_flashlight_def_brightness_max">100</integer>
|
||||
<integer name="pref_flashlight_def_brightness_default">75</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>
|
||||
@@ -35,10 +35,20 @@
|
||||
|
||||
<!-- Flashlight Functionality Strings -->
|
||||
<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_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_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 -->
|
||||
<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_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_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 -->
|
||||
<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_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_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 -->
|
||||
<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_not_sharing" translatable="false">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_stop_sharing" translatable="false">Yes, stop sharing</string>
|
||||
<string name="android_auto_share_location_start" translatable="false">Start</string>
|
||||
<string name="android_auto_share_location_start_desc" translatable="false">Start to share location</string>
|
||||
<string name="android_auto_share_location_stop" translatable="false">Stop</string>
|
||||
<string name="android_auto_share_location_stop_desc" translatable="false">Stop to share the location</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>
|
||||
@@ -51,6 +51,30 @@
|
||||
app:seekBarIncrement="@integer/pref_flashlight_def_brightness_increment"
|
||||
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>
|
||||
|
||||
</PreferenceScreen>
|
||||
Reference in New Issue
Block a user