1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00
JUCE/examples/PushNotificationsDemo/Source/MainComponent.h
2017-11-22 12:59:53 +01:00

383 lines
15 KiB
C++

/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2017 - ROLI Ltd.
JUCE is an open source library subject to commercial or open-source
licensing.
By using JUCE, you agree to the terms of both the JUCE 5 End-User License
Agreement and JUCE 5 Privacy Policy (both updated and effective as of the
27th April 2017).
End User License Agreement: www.juce.com/juce-5-licence
Privacy Policy: www.juce.com/juce-5-privacy-policy
Or: You may also use this code under the terms of the GPL v3 (see
www.gnu.org/licenses).
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
#pragma once
#include "../JuceLibraryCode/JuceHeader.h"
//==============================================================================
class MainContentComponent : public Component,
private Button::Listener,
private ComboBox::Listener,
private ChangeListener,
private ComponentListener,
private PushNotifications::Listener
{
public:
//==============================================================================
MainContentComponent();
~MainContentComponent();
void paint (Graphics&) override;
void resized() override;
private:
void buttonClicked (Button*) override;
void comboBoxChanged (ComboBox* comboBoxThatHasChanged) override;
void sendLocalNotification();
void fillRequiredParams (PushNotifications::Notification& n);
void fillOptionalParamsOne (PushNotifications::Notification& n);
void fillOptionalParamsTwo (PushNotifications::Notification& n);
void fillOptionalParamsThree (PushNotifications::Notification& n);
void setupAccentColour();
void setupLedColour();
void getDeliveredNotifications();
void changeListenerCallback (ChangeBroadcaster* source) override;
void componentBeingDeleted (Component& component) override;
void handleNotification (bool isLocalNotification, const PushNotifications::Notification& n) override;
void handleNotificationAction (bool isLocalNotification,
const PushNotifications::Notification& n,
const juce::String& actionIdentifier,
const juce::String& optionalResponse) override;
void localNotificationDismissedByUser (const PushNotifications::Notification& n) override;
void deliveredNotificationsListReceived (const Array<PushNotifications::Notification>&) override;
void pendingLocalNotificationsListReceived (const Array<PushNotifications::Notification>&) override;
void deviceTokenRefreshed (const String& token) override;
#if JUCE_ANDROID
void remoteNotificationsDeleted() override;
void upstreamMessageSent (const String& messageId) override;
void upstreamMessageSendingError (const String& messageId, const String& error) override;
static Array<PushNotifications::Channel> getAndroidChannels();
#elif JUCE_IOS || JUCE_MAC
static PushNotifications::Settings getNotificationSettings();
#endif
struct RowComponent : public Component
{
RowComponent (Label& l, Component& c, int u = 1)
: label (l),
editor (c),
rowUnits (u)
{
addAndMakeVisible (label);
addAndMakeVisible (editor);
}
void resized() override
{
auto bounds = getLocalBounds();
label .setBounds (bounds.removeFromLeft (getWidth() / 3));
editor.setBounds (bounds);
}
Label& label;
Component& editor;
int rowUnits;
};
struct ParamControls
{
Label identifierLabel { "identifierLabel", "Identifier" };
TextEditor identifierEditor;
Label titleLabel { "titleLabel", "Title" };
TextEditor titleEditor;
Label bodyLabel { "bodyLabel", "Body" };
TextEditor bodyEditor;
Label categoryLabel { "categoryLabel", "Category" };
ComboBox categoryComboBox;
Label channelIdLabel { "channelIdLabel", "Channel ID" };
ComboBox channelIdComboBox;
Label iconLabel { "iconLabel", "Icon" };
ComboBox iconComboBox;
Label subtitleLabel { "subtitleLabel", "Subtitle" };
TextEditor subtitleEditor;
Label badgeNumberLabel { "badgeNumberLabel", "BadgeNumber" };
ComboBox badgeNumberComboBox;
Label soundToPlayLabel { "soundToPlayLabel", "SoundToPlay" };
ComboBox soundToPlayComboBox;
Label propertiesLabel { "propertiesLabel", "Properties" };
TextEditor propertiesEditor;
Label fireInLabel { "fireInLabel", "Fire in" };
ComboBox fireInComboBox;
Label repeatLabel { "repeatLabel", "Repeat" };
ToggleButton repeatButton;
Label largeIconLabel { "largeIconLabel", "Large Icon" };
ComboBox largeIconComboBox;
Label badgeIconLabel { "badgeIconLabel", "Badge Icon" };
ComboBox badgeIconComboBox;
Label tickerTextLabel { "tickerTextLabel", "Ticker Text" };
TextEditor tickerTextEditor;
Label autoCancelLabel { "autoCancelLabel", "AutoCancel" };
ToggleButton autoCancelButton;
Label alertOnlyOnceLabel { "alertOnlyOnceLabel", "AlertOnlyOnce" };
ToggleButton alertOnlyOnceButton;
Label actionsLabel { "actionsLabel", "Actions" };
ComboBox actionsComboBox;
Label progressMaxLabel { "progressMaxLabel", "ProgressMax" };
ComboBox progressMaxComboBox;
Label progressCurrentLabel { "progressCurrentLabel", "ProgressCurrent" };
ComboBox progressCurrentComboBox;
Label progressIndeterminateLabel { "progressIndeterminateLabel", "ProgressIndeterminate" };
ToggleButton progressIndeterminateButton;
Label notifCategoryLabel { "notifCategoryLabel", "Category" };
ComboBox notifCategoryComboBox;
Label priorityLabel { "priorityLabel", "Priority" };
ComboBox priorityComboBox;
Label personLabel { "personLabel", "Person" };
TextEditor personEditor;
Label lockScreenVisibilityLabel { "lockScreenVisibilityLabel", "LockScreenVisibility" };
ComboBox lockScreenVisibilityComboBox;
Label groupIdLabel { "groupIdLabel", "GroupID" };
TextEditor groupIdEditor;
Label sortKeyLabel { "sortKeyLabel", "SortKey" };
TextEditor sortKeyEditor;
Label groupSummaryLabel { "groupSummaryLabel", "GroupSummary" };
ToggleButton groupSummaryButton;
Label groupAlertBehaviourLabel { "groupAlertBehaviourLabel", "GroupAlertBehaviour" };
ComboBox groupAlertBehaviourComboBox;
Label accentColourLabel { "accentColourLabel", "AccentColour" };
TextButton accentColourButton;
Label ledColourLabel { "ledColourLabel", "LedColour" };
TextButton ledColourButton;
Label ledMsToBeOnLabel { "ledMsToBeOnLabel", "LedMsToBeOn" };
ComboBox ledMsToBeOnComboBox;
Label ledMsToBeOffLabel { "ledMsToBeOffLabel", "LedMsToBeOff" };
ComboBox ledMsToBeOffComboBox;
Label vibratorMsToBeOnLabel { "vibratorMsToBeOnLabel", "VibrationMsToBeOn" };
ComboBox vibratorMsToBeOnComboBox;
Label vibratorMsToBeOffLabel { "vibratorMsToBeOffLabel", "VibrationMsToBeOff" };
ComboBox vibratorMsToBeOffComboBox;
Label localOnlyLabel { "localOnlyLabel", "LocalOnly" };
ToggleButton localOnlyButton;
Label ongoingLabel { "ongoingLabel", "Ongoing" };
ToggleButton ongoingButton;
Label timestampVisibilityLabel { "timestampVisibilityLabel", "TimestampMode" };
ComboBox timestampVisibilityComboBox;
Label timeoutAfterLabel { "timeoutAfterLabel", "Timeout After Ms" };
ComboBox timeoutAfterComboBox;
ColourSelector* accentColourSelector = nullptr;
ColourSelector* ledColourSelector = nullptr;
};
void setupControls();
void distributeControls();
struct ParamsView : public Component
{
ParamsView()
{
// For now, to be able to dismiss mobile keyboard.
setWantsKeyboardFocus (true);
}
void addRowComponent (RowComponent *rc)
{
rowComponents.add (rc);
addAndMakeVisible (rc);
}
void resized() override
{
int totalRowUnits = 0;
for (const auto &rc : rowComponents)
totalRowUnits += rc->rowUnits;
const int rowHeight = getHeight() / totalRowUnits;
auto bounds = getLocalBounds();
for (auto &rc : rowComponents)
rc->setBounds (bounds.removeFromTop (rc->rowUnits * rowHeight));
auto* last = rowComponents[rowComponents.size() - 1];
last->setBounds (last->getBounds().withHeight (getHeight() - last->getY()));
}
private:
OwnedArray<RowComponent> rowComponents;
};
struct AuxActionsView : public Component
{
AuxActionsView()
{
addAndMakeVisible (getDeliveredNotificationsButton);
addAndMakeVisible (removeDeliveredNotifWithIdButton);
addAndMakeVisible (deliveredNotifIdentifier);
addAndMakeVisible (removeAllDeliveredNotifsButton);
#if JUCE_IOS || JUCE_MAC
addAndMakeVisible (getPendingNotificationsButton);
addAndMakeVisible (removePendingNotifWithIdButton);
addAndMakeVisible (pendingNotifIdentifier);
addAndMakeVisible (removeAllPendingNotifsButton);
#endif
// For now, to be able to dismiss mobile keyboard.
setWantsKeyboardFocus (true);
}
void resized() override
{
const int columnWidth = getWidth();
const int rowHeight = getHeight() / 6;
auto bounds = getLocalBounds();
getDeliveredNotificationsButton .setBounds (bounds.removeFromTop (rowHeight));
auto rowBounds = bounds.removeFromTop (rowHeight);
removeDeliveredNotifWithIdButton.setBounds (rowBounds.removeFromLeft (columnWidth / 2));
deliveredNotifIdentifier .setBounds (rowBounds);
removeAllDeliveredNotifsButton .setBounds (bounds.removeFromTop (rowHeight));
#if JUCE_IOS || JUCE_MAC
getPendingNotificationsButton .setBounds (bounds.removeFromTop (rowHeight));
rowBounds = bounds.removeFromTop (rowHeight);
removePendingNotifWithIdButton.setBounds (rowBounds.removeFromLeft (columnWidth / 2));
pendingNotifIdentifier .setBounds (rowBounds);
removeAllPendingNotifsButton .setBounds (bounds.removeFromTop (rowHeight));
#endif
}
TextButton getDeliveredNotificationsButton { "Get Delivered Notifications" };
TextButton removeDeliveredNotifWithIdButton { "Remove Delivered Notif With ID:" };
TextEditor deliveredNotifIdentifier;
TextButton removeAllDeliveredNotifsButton { "Remove All Delivered Notifs" };
TextButton getPendingNotificationsButton { "Get Pending Notifications" };
TextButton removePendingNotifWithIdButton { "Remove Pending Notif With ID:" };
TextEditor pendingNotifIdentifier;
TextButton removeAllPendingNotifsButton { "Remove All Pending Notifs" };
};
struct RemoteView : public Component
{
RemoteView()
{
addAndMakeVisible (getDeviceTokenButton);
#if JUCE_ANDROID
addAndMakeVisible (sendRemoteMessageButton);
addAndMakeVisible (subscribeToSportsButton);
addAndMakeVisible (unsubscribeFromSportsButton);
#endif
}
void resized()
{
const int rowSize = getHeight () / 10;
auto bounds = getLocalBounds().reduced (getWidth() / 10, getHeight() / 10);
bounds.removeFromTop (2 * rowSize);
getDeviceTokenButton .setBounds (bounds.removeFromTop (rowSize));
sendRemoteMessageButton .setBounds (bounds.removeFromTop (rowSize));
subscribeToSportsButton .setBounds (bounds.removeFromTop (rowSize));
unsubscribeFromSportsButton.setBounds (bounds.removeFromTop (rowSize));
}
TextButton getDeviceTokenButton { "GetDeviceToken" };
TextButton sendRemoteMessageButton { "SendRemoteMessage" };
TextButton subscribeToSportsButton { "SubscribeToSports" };
TextButton unsubscribeFromSportsButton { "UnsubscribeFromSports" };
};
struct DemoTabbedComponent : public TabbedComponent
{
explicit DemoTabbedComponent (TabbedButtonBar::Orientation orientation)
: TabbedComponent (orientation)
{
}
void currentTabChanged (int, const String& newCurrentTabName) override
{
if (! showedRemoteInstructions && newCurrentTabName == "Remote")
{
MainContentComponent::showRemoteInstructions();
showedRemoteInstructions = true;
}
}
private:
bool showedRemoteInstructions = false;
};
static void showRemoteInstructions()
{
#if JUCE_IOS || JUCE_MAC
NativeMessageBox::showMessageBoxAsync (AlertWindow::InfoIcon,
"Remote Notifications instructions",
"In order to be able to test remote notifications "
"ensure that the app is signed and that you register "
"the bundle ID for remote notifications in "
"Apple Developer Center.");
#endif
}
Label headerLabel { "headerLabel", "Push Notifications Demo" };
ParamControls paramControls;
ParamsView paramsOneView;
ParamsView paramsTwoView;
ParamsView paramsThreeView;
ParamsView paramsFourView;
AuxActionsView auxActionsView;
TabbedComponent localNotificationsTabs { TabbedButtonBar::TabsAtTop };
RemoteView remoteView;
DemoTabbedComponent mainTabs { TabbedButtonBar::TabsAtTop };
TextButton sendButton { "Send!" };
Label notAvailableYetLabel { "notAvailableYetLabel", "Push Notifications feature is not available on this platform yet!" };
//==============================================================================
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent)
};