Jump to content

Dave Nottage

Members
  • Content Count

    1335
  • Joined

  • Last visited

  • Days Won

    29

Posts posted by Dave Nottage


  1. I may have a solution, however I'm having trouble verifying that it works. What are the steps to reproduce that the website will definitely show in dark mode? At present, all I'm doing is navigating to https://www.google.com, and TWebBrowser shows the site in light mode, despite the Chrome app showing it in dark mode (which is what my device is set to)


  2. 31 minutes ago, chenech said:

    Now with Patch 1 of 11.1 the save buttons are always active and the modified mark is not removed

    I'm not seeing that after applying Patch 1. What I mean by that is after saving, the buttons are not enabled, and the modified mark is removed. When opening a project, there's still the bug of the IDE thinking that the project has changed, even though no changes have been made.


  3. 50 minutes ago, msd said:

    // This is error line

    I don't see how that would have ever compiled in that form. Since it's a standalone function, there's no "Self" for it to refer to. Perhaps InternalGetHardwareID was once a method of an object?

    • Like 2

  4. The notification is (at least when I last checked) "received" before the app becomes active, so you could have a flag that is set when the BecameActive event fires (to indicate the app was launched), and another to indicate whether the app went into the background, and set that when the EnteredBackground event fires, e.g.:

     

    unit Unit1;
    
    interface
    
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.Messaging,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs;
    
    type
      TForm1 = class(TForm)
      private
        FIsLaunched: Boolean;
        FIsBackground: Boolean;
        procedure ApplicationEventMessageHandler(const Sender: TObject; const M: TMessage);
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.fmx}
    
    uses
      FMX.Platform;
    
    { TForm1 }
    
    constructor TForm1.Create(AOwner: TComponent);
    begin
      inherited;
      TMessageManager.DefaultManager.SubscribeToMessage(TApplicationEventMessage, ApplicationEventMessageHandler);
      FIsLaunched := False;
      FIsBackground := True;
    end;
    
    destructor TForm1.Destroy;
    begin
      TMessageManager.DefaultManager.Unsubscribe(TApplicationEventMessage, ApplicationEventMessageHandler);
      inherited;
    end;
    
    procedure TForm1.ApplicationEventMessageHandler(const Sender: TObject; const M: TMessage);
    begin
      case TApplicationEventMessage(M).Value.Event of
        TApplicationEvent.BecameActive:
        begin
          FIsLaunched := True;
          FIsBackground := False;
        end;
        TApplicationEvent.EnteredBackground:
          FIsBackground := True;
      end;
    end;
    
    end.

    When the app receives a notification: if the app was being launched from not running, FIsLaunched should be False (does not matter what FIsBackground is), if launched from the background, FIsLaunched and FIsBackground should be True.


  5. 30 minutes ago, andreag0 said:

    you can use your favorite Delphi libraries

    Last time I tried FGX (a few months ago), this was not true (at least not entirely). Anything that relies on FMX could not be used, and I actually changed part of Kastri to allow for this (i.e. so that particular part of Kastri could still be used in FGX).

     

    That said, I concur that FGX is a fantastic product 🙂

     


  6. 9 hours ago, dataol said:

    I tried to apply the suggested steps, but it doesn't return to 17,463 devices

    I've extracted the steps from the article into this:

     

    https://github.com/DelphiWorlds/HowTo/tree/main/Solutions/AndroidLowerVersions

     

    Can you confirm you've followed the steps exactly? Check that the generated AndroidManifest.xml has the correct value for minSdkVersion, and perhaps post a screenshot here of your NDK settings.

    • Thanks 1

  7. 14 minutes ago, qubits said:

    GStack,LocalAddress does not work on Android.

    You're welcome to use the code from here:

     

    https://github.com/DelphiWorlds/Multicaster/blob/master/MC.LocalAddresses.Android.pas

     

    Code repeated here in case that repo ever "disappears":
     

    unit MC.LocalAddresses.Android;
    
    interface
    
    uses
      IdStack;
    
    procedure GetLocalAddressList(const AAddresses: TIdStackLocalAddressList);
    
    implementation
    
    uses
      // RTL
      System.SysUtils,
      // Android
      Androidapi.JNI.Java.Net, Androidapi.JNI.JavaTypes, Androidapi.Helpers, Androidapi.JNIBridge,
      // Indy
      IdGlobal;
    
    procedure GetLocalAddressList(const AAddresses: TIdStackLocalAddressList);
    var
      LInterfaces, LAddresses: JEnumeration;
      LInterface: JNetworkInterface;
      LAddress: JInetAddress;
      LName, LHostAddress: string;
    begin
      AAddresses.Clear;
      LInterfaces := TJNetworkInterface.JavaClass.getNetworkInterfaces;
      while LInterfaces.hasMoreElements do
      begin
        LInterface := TJNetworkInterface.Wrap(JObjectToID(LInterfaces.nextElement));
        LAddresses := LInterface.getInetAddresses;
        while LAddresses.hasMoreElements do
        begin
          LAddress := TJInetAddress.Wrap(JObjectToID(LAddresses.nextElement));
          if LAddress.isLoopbackAddress then
            Continue;
          // Hack until I can find out how to check properly
          LName := JStringToString(LAddress.getClass.getName);
          LHostAddress := JStringToString(LAddress.getHostAddress);
          // Trim excess stuff
          if LHostAddress.IndexOf('%') > -1 then
            LHostAddress := LHostAddress.Substring(0, LHostAddress.IndexOf('%'));
          if LName.Contains('Inet4Address') then
            TIdStackLocalAddressIPv4.Create(AAddresses, LHostAddress, '')
          else if LName.Contains('Inet6Address') then
            TIdStackLocalAddressIPv6.Create(AAddresses, LHostAddress);
        end;
      end;
    end;
    
    end.

    Note: this code hasn't been changed in some time. The "hack" can probably be done another way, and I'm pretty sure Yaroslav has told me JObjectToID isn't necessary

    • Like 1

  8. 2 minutes ago, Ömer Gözlek said:

    Dave Nottage's articles

    Those articles relate to Firebase Cloud Messaging, but your question seems to be about Firebase AdMob?

    3 minutes ago, Ömer Gözlek said:

    Is there a solution or workaround to this problem?

    Can you provide a minimal test project that reproduces the problem?


  9. 1 minute ago, Michael Collier said:

    it has to go onto a MAC computer - correct

    Correct

    1 minute ago, Michael Collier said:

    I have a MacBook Air available, but it's not here at the moment, but I can have PAServer installed on it and connect remotely- correct?

    Define "remotely". On the same local network, it is straightforward. Across the internet you'd either need to expose the PAServer publicly via the router using port forwarding, or use a VPN.

     


  10. On 2/28/2022 at 3:00 AM, stewag64 said:

    Or what do you do to maintain device compatibility?

    Change the %minSdkVersion% value in AndroidManifest.template.xml to something lower than 23 but not lower than 19 (Android 4.4). You'll also need to ensure that the NDK settings are also changed, as per the "Important information about the NDK settings" section in this article: https://delphiworlds.com/2020/09/manual-android-sdk-ndk-install-delphi/. Note that if you target API level 19, projects containing any datasnap components (eg TClientDataset) will not compile.

     

    • Like 2

  11. 5 hours ago, Joe Sansalone said:

    I downloaded the zipped test project and it opens fine in Delphi IDE and builds.

    Yes, it opens fine, but it has a bunch of references to icon files (for example) that are missing, and I had problems with provisioning (sorry, I did not note down the error messages). Rather than attempt to resolve the issues, I recreated the project.


  12. Although this demo is related to being able to upload files: https://github.com/DelphiWorlds/Kastri/tree/master/Demos/WebBrowserFileChooser

     

    It also has code that should help you, based on this answer on SO: https://stackoverflow.com/a/47525818/3164070

     

    Please be aware that it requires a Java library (https://github.com/DelphiWorlds/Kastri/blob/master/Lib/dw-webchromeclient.jar, which has been added to the demo)

     

    Looking at it now, I figure there should be comments in the code explaining exactly what it is doing 🙂

     


  13. 1 hour ago, joaodanet2018 said:

    In the same way that the android:minSdkVersion="%minSdkVersion%" parameter indicates the API version that is minimally expected to be contained in the hardware operating system.

    That's one of the important factors determining the lowest version of Android that will run the app. In the case of native Android apps (such as built with Delphi), the other factor is the NDK settings, as mentioned in the "Important information about the NDK settings" section of this article: https://delphiworlds.com/2020/09/manual-android-sdk-ndk-install-delphi/


  14. 1 minute ago, Michael Collier said:

    I was wondering if this would be a suitable platform for testing RAD Studio 11?

    Assuming it's a first generation (which it probably is, given the price), then it should be suitable, since it can run iOS 15.3.1:

     

    https://en.wikipedia.org/wiki/IPhone_SE_(1st_generation)

     

    Given when support has "run out" on other devices, it looks like it should be good for around another year:

     

    https://en.wikipedia.org/wiki/List_of_iOS_and_iPadOS_devices#iPhone

×