/* ============================================================================== 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&) override; void pendingLocalNotificationsListReceived (const Array&) 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 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 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) };