Signal-Android/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphone.java

249 wiersze
7.5 KiB
Java

package org.thoughtcrime.securesms.megaphone;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RawRes;
import androidx.annotation.StringRes;
import org.thoughtcrime.securesms.megaphone.Megaphones.Event;
import org.thoughtcrime.securesms.mms.GlideRequest;
/**
* For guidance on creating megaphones, see {@link Megaphones}.
*/
public class Megaphone {
private final Event event;
private final Style style;
private final boolean canSnooze;
private final MegaphoneText titleText;
private final MegaphoneText bodyText;
private final int imageRes;
private final int lottieRes;
private final GlideRequest<Drawable> imageRequest;
private final MegaphoneText buttonText;
private final EventListener buttonListener;
private final EventListener snoozeListener;
private final MegaphoneText secondaryButtonText;
private final EventListener secondaryButtonListener;
private final EventListener onVisibleListener;
private Megaphone(@NonNull Builder builder) {
this.event = builder.event;
this.style = builder.style;
this.canSnooze = builder.canSnooze;
this.titleText = builder.titleText;
this.bodyText = builder.bodyText;
this.imageRes = builder.imageRes;
this.lottieRes = builder.lottieRes;
this.imageRequest = builder.imageRequest;
this.buttonText = builder.buttonText;
this.buttonListener = builder.buttonListener;
this.snoozeListener = builder.snoozeListener;
this.secondaryButtonText = builder.secondaryButtonText;
this.secondaryButtonListener = builder.secondaryButtonListener;
this.onVisibleListener = builder.onVisibleListener;
}
public @NonNull Event getEvent() {
return event;
}
public boolean canSnooze() {
return canSnooze;
}
public @NonNull Style getStyle() {
return style;
}
public @NonNull MegaphoneText getTitle() {
return titleText;
}
public @NonNull MegaphoneText getBody() {
return bodyText;
}
public @RawRes int getLottieRes() {
return lottieRes;
}
public @DrawableRes int getImageRes() {
return imageRes;
}
public @Nullable GlideRequest<Drawable> getImageRequest() {
return imageRequest;
}
public @Nullable MegaphoneText getButtonText() {
return buttonText;
}
public boolean hasButton() {
return buttonText != null && buttonText.hasText();
}
public @Nullable EventListener getButtonClickListener() {
return buttonListener;
}
public @Nullable EventListener getSnoozeListener() {
return snoozeListener;
}
public @Nullable MegaphoneText getSecondaryButtonText() {
return secondaryButtonText;
}
public boolean hasSecondaryButton() {
return secondaryButtonText != null && secondaryButtonText.hasText();
}
public @Nullable EventListener getSecondaryButtonClickListener() {
return secondaryButtonListener;
}
public @Nullable EventListener getOnVisibleListener() {
return onVisibleListener;
}
public static class Builder {
private final Event event;
private final Style style;
private boolean canSnooze;
private MegaphoneText titleText;
private MegaphoneText bodyText;
private int imageRes;
private int lottieRes;
private GlideRequest<Drawable> imageRequest;
private MegaphoneText buttonText;
private EventListener buttonListener;
private EventListener snoozeListener;
private MegaphoneText secondaryButtonText;
private EventListener secondaryButtonListener;
private EventListener onVisibleListener;
public Builder(@NonNull Event event, @NonNull Style style) {
this.event = event;
this.style = style;
}
public @NonNull Builder enableSnooze(@Nullable EventListener listener) {
this.canSnooze = true;
this.snoozeListener = listener;
return this;
}
public @NonNull Builder disableSnooze() {
this.canSnooze = false;
this.snoozeListener = null;
return this;
}
public @NonNull Builder setTitle(@StringRes int titleRes) {
this.titleText = MegaphoneText.from(titleRes);
return this;
}
public @NonNull Builder setTitle(@Nullable String title) {
this.titleText = MegaphoneText.from(title);
return this;
}
public @NonNull Builder setBody(@StringRes int bodyRes) {
this.bodyText = MegaphoneText.from(bodyRes);
return this;
}
public @NonNull Builder setBody(String body) {
this.bodyText = MegaphoneText.from(body);
return this;
}
public @NonNull Builder setImage(@DrawableRes int imageRes) {
this.imageRes = imageRes;
return this;
}
public @NonNull Builder setLottie(@RawRes int lottieRes) {
this.lottieRes = lottieRes;
return this;
}
public @NonNull Builder setImageRequest(@Nullable GlideRequest<Drawable> imageRequest) {
this.imageRequest = imageRequest;
return this;
}
public @NonNull Builder setActionButton(@StringRes int buttonTextRes, @NonNull EventListener listener) {
this.buttonText = MegaphoneText.from(buttonTextRes);
this.buttonListener = listener;
return this;
}
public @NonNull Builder setActionButton(@NonNull String buttonText, @NonNull EventListener listener) {
this.buttonText = MegaphoneText.from(buttonText);
this.buttonListener = listener;
return this;
}
public @NonNull Builder setSecondaryButton(@StringRes int secondaryButtonTextRes, @NonNull EventListener listener) {
this.secondaryButtonText = MegaphoneText.from(secondaryButtonTextRes);
this.secondaryButtonListener = listener;
return this;
}
public @NonNull Builder setSecondaryButton(@NonNull String secondaryButtonText, @NonNull EventListener listener) {
this.secondaryButtonText = MegaphoneText.from(secondaryButtonText);
this.secondaryButtonListener = listener;
return this;
}
public @NonNull Builder setOnVisibleListener(@Nullable EventListener listener) {
this.onVisibleListener = listener;
return this;
}
public @NonNull Megaphone build() {
return new Megaphone(this);
}
}
enum Style {
/**
* Specialized style for onboarding.
*/
ONBOARDING,
/**
* Basic bottom of the screen megaphone with optional snooze and action buttons.
*/
BASIC,
/**
* Indicates megaphone does not have a view but will call {@link MegaphoneActionController#onMegaphoneNavigationRequested(Intent)}
* or {@link MegaphoneActionController#onMegaphoneNavigationRequested(Intent, int)} on the controller passed in
* via the {@link #onVisibleListener}.
*/
FULLSCREEN,
/**
* Similar to {@link Style#BASIC} but only provides a close button that will call {@link #buttonListener} if set,
* otherwise, the event will be marked finished (it will not be shown again).
*/
POPUP
}
public interface EventListener {
void onEvent(@NonNull Megaphone megaphone, @NonNull MegaphoneActionController listener);
}
}