unit UMeng;

//https://developer.umeng.com/docs/66632/detail/66889
//delphi ��֧��Android 64�����Բ�������64λ so��arm64-v8a

interface

uses
  System.Sysutils, System.Generics.Collections;

type
  TUMeng = class
  private
    class var FLastViewName: string;
    class function DeviceType(IsPhone: Boolean): Integer;
    class procedure Debug;
  public
    //ע��: ��ʹ���Ѿ���AndroidManifest.xml�����ù�appkey��channelֵ��
    //Ҳ��Ҫ��App�����е��ó�ʼ���ӿڣ�����Ҫʹ��AndroidManifest.xml�����úõ�appkey��channelֵ��
    //UMConfigure.init������appkey��channel��������Ϊnull����
    class procedure Init(appkey, channel: string; pushSecret: string = ''; IsPhone: Boolean = True); overload;
    //ע�⣺������Ѿ���AndroidManifest.xml�����ù�appkey��channelֵ�����Ե��ô˰汾��ʼ��������
    class procedure Init(pushSecret: string = ''; IsPhone: Boolean = True); overload;
    class procedure onResume;
    class procedure onPause;
    class procedure onPageStart(ViewName: string);
    class procedure onPageEnd(ViewName: string);
    class procedure onPageAutoChange(ViewName: string = ''; NeedPauseAndResume: Boolean = False);
    //��ͨ�¼�
    class procedure onEvent(AID: string; ALabel: string = #0); overload;
    //������(K-V)�¼�
    class procedure onEvent(AID: string; AProperties: TArray<TPair<string, string>>); overload;
    //��ֵ��
    class procedure onEventValue(AID: string; AProperties: TArray<TPair<string, string>>; ADuration: Integer = 0);
    //�ϴη��ʵ�ҳ����
    class property LastViewName: string read FLastViewName;
  end;

implementation

uses
{$IFDEF ANDROID}
  Androidapi.JNI.Os, Androidapi.JNI.Provider,
  Androidapi.JNIBridge, Androidapi.Helpers,
  Androidapi.JNI.JavaTypes, Androidapi.JNI.App,
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNI.umeng.common, Androidapi.JNI.umeng.analytics,
{$ENDIF}
  FMX.Types;

{ TUMeng }

class procedure TUMeng.Debug;
{$IF DEFINED(ANDROID) && DEFINED(DEBUG)}
var
  I: Integer;
  sDeviceInfo: string;
  arrInfo: TJavaObjectArray<JString>;
{$ENDIF}
begin
{$IF DEFINED(ANDROID) && DEFINED(DEBUG)}
  (**
  * �����������Log����
  * ����: boolean Ĭ��Ϊfalse������鿴LOG����Ϊtrue
  *)
  TJUMConfigure.JavaClass.setLogEnabled(True);
  TJMobclickAgent.JavaClass.setDebugMode(True);

  sDeviceInfo := '';
  arrInfo := TJUMConfigure.JavaClass.getTestDeviceInfo(
    {$IF CompilerVersion > 27}
    TAndroidHelper.Context
    {$ELSE}
    SharedActivityContext
    {$ENDIF}
  );

  for I := 0 to arrInfo.Length - 1 do
    sDeviceInfo := Format('%s %s', [sDeviceInfo, JStringToString(arrInfo.Items[I])]);

  Log.d('TUMeng-DeviceInfo:' + sDeviceInfo);

  //setCatchUncaughtExceptions can not be called in child process
  //TJMobclickAgent.JavaClass.setCatchUncaughtExceptions(True);
{$ENDIF}
end;

class procedure TUMeng.onEvent(AID: string; ALabel: string = #0);
begin
{$IFDEF ANDROID}
  TJMobclickAgent.JavaClass.onEvent(
    {$IF CompilerVersion > 27}
    TAndroidHelper.Context
    {$ELSE}
    SharedActivityContext
    {$ENDIF},
    StringToJString(AID),
    StringToJString(ALabel)
  );
{$ENDIF}
end;

class function TUMeng.DeviceType(IsPhone: Boolean): Integer;
begin
{$IFDEF ANDROID}
  if IsPhone then
    Result := TJUMConfigure.JavaClass.DEVICE_TYPE_PHONE
  else
    Result := TJUMConfigure.JavaClass.DEVICE_TYPE_BOX;
{$ENDIF}
end;

(**
* ��ʼ��common��
* ����1:�����ģ�����Ϊ��
* ����2:�豸���ͣ�UMConfigure.DEVICE_TYPE_PHONEΪ�ֻ���UMConfigure.DEVICE_TYPE_BOXΪ���ӣ�Ĭ��Ϊ�ֻ�
* ����3:Push����ҵ���secret
*)
class procedure TUMeng.Init(pushSecret: string; IsPhone: Boolean);
begin
{$IFDEF DEBUG}
  Debug;
{$ENDIF}

  FLastViewName := '';

{$IFDEF ANDROID}
  TJUMConfigure.TU2Fixinit(
    {$IF CompilerVersion > 27}
    TAndroidHelper.Context
    {$ELSE}
    SharedActivityContext
    {$ENDIF},
    DeviceType(IsPhone),
    StringToJString(pushSecret));
{$ENDIF}
end;

(**
* ��ʼ��common��
* ����1:�����ģ�����Ϊ��
* ����2:������+�� AppKey
* ����3:������+�� Channel
* ����4:�豸���ͣ�UMConfigure.DEVICE_TYPE_PHONEΪ�ֻ���UMConfigure.DEVICE_TYPE_BOXΪ���ӣ�Ĭ��Ϊ�ֻ�
* ����5:Push����ҵ���secret
*)
class procedure TUMeng.Init(appkey, channel, pushSecret: string;
  IsPhone: Boolean);
begin
{$IFDEF DEBUG}
  Debug;
{$ENDIF}

  FLastViewName := '';

{$IFDEF ANDROID}
  TJUMConfigure.TU2Fixinit(
    {$IF CompilerVersion > 27}
    TAndroidHelper.Context
    {$ELSE}
    SharedActivityContext
    {$ENDIF},
    StringToJString(appkey),
    StringToJString(channel),
    DeviceType(IsPhone),
    StringToJString(pushSecret));

  // ҳ��ɼ�ģʽ
  TJMobclickAgent.JavaClass.setPageCollectionMode(TJMobclickAgent_PageMode.JavaClass.AUTO);
{$ENDIF}
end;

class procedure TUMeng.onEvent(AID: string;
  AProperties: TArray<TPair<string, string>>);
begin
  onEventValue(AID, AProperties);
end;

class procedure TUMeng.onEventValue(AID: string;
  AProperties: TArray<TPair<string, string>>; ADuration: Integer);
{$IFDEF ANDROID}
var
  FJMap: JHashMap;
  I: Integer;
  LProperty: TPair<string, string>;
{$ENDIF}
begin
{$IFDEF ANDROID}
  FJMap := TJHashMap.JavaClass.init;
  for I := 0 to Length(AProperties) - 1 do
    FJMap.put(StringToJString(AProperties[I].Key), StringToJString(AProperties[I].Value));

  if ADuration > 0 then
    TJMobclickAgent.JavaClass.onEventValue(
      {$IF CompilerVersion > 27}
      TAndroidHelper.Context
      {$ELSE}
      SharedActivityContext
      {$ENDIF},
      StringToJString(AID),
      Jmap(FJMap),
      ADuration
    )
  else
    TJMobclickAgent.JavaClass.onEvent(
      {$IF CompilerVersion > 27}
      TAndroidHelper.Context
      {$ELSE}
      SharedActivityContext
      {$ENDIF},
      StringToJString(AID),
      Jmap(FJMap)
    );
{$ENDIF}
end;

class procedure TUMeng.onPageAutoChange(ViewName: string; NeedPauseAndResume: Boolean);
begin
  {$IFDEF DEBUG}
  Log.d('---onPageAutoChange:' + FLastViewName + '/' + ViewName);
  {$ENDIF}

  if FLastViewName <> '' then begin
    onPageEnd(FLastViewName);
    if NeedPauseAndResume then
      onPause;
  end;

  if ViewName <> '' then begin
    onPageStart(ViewName);
    if NeedPauseAndResume then
      onResume;
  end;

  FLastViewName := ViewName;
end;

class procedure TUMeng.onPageEnd(ViewName: string);
begin
{$IFDEF DEBUG}
  Log.d('---onPageEnd:' + ViewName);
{$ENDIF}
{$IFDEF ANDROID}
  TJMobclickAgent.JavaClass.onPageEnd(StringToJString(ViewName));
{$ENDIF}
end;

class procedure TUMeng.onPageStart(ViewName: string);
begin
{$IFDEF DEBUG}
  Log.d('---onPageStart:' + ViewName);
{$ENDIF}
{$IFDEF ANDROID}
  TJMobclickAgent.JavaClass.onPageStart(StringToJString(ViewName));
{$ENDIF}
end;

class procedure TUMeng.onPause;
begin
{$IFDEF DEBUG}
  Log.d('---onPause');
{$ENDIF}
{$IFDEF ANDROID}
  TJMobclickAgent.JavaClass.onPause(
    {$IF CompilerVersion > 27}
    TAndroidHelper.Context
    {$ELSE}
    SharedActivityContext
    {$ENDIF}
  );
{$ENDIF}
end;

class procedure TUMeng.onResume;
begin
{$IFDEF DEBUG}
  Log.d('---onResume');
{$ENDIF}
{$IFDEF ANDROID}
  TJMobclickAgent.JavaClass.onResume(
    {$IF CompilerVersion > 27}
    TAndroidHelper.Context
    {$ELSE}
    SharedActivityContext
    {$ENDIF}
  );
{$ENDIF}
end;

end.