kodi
XBMCApp.h
1 /*
2  * Copyright (C) 2012-2018 Team Kodi
3  * This file is part of Kodi - https://kodi.tv
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  * See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "IActivityHandler.h"
12 #include "IInputHandler.h"
13 #include "JNIMainActivity.h"
14 #include "JNIXBMCAudioManagerOnAudioFocusChangeListener.h"
15 #include "JNIXBMCDisplayManagerDisplayListener.h"
16 #include "JNIXBMCMainView.h"
17 #include "JNIXBMCMediaSession.h"
18 #include "interfaces/IAnnouncer.h"
19 #include "platform/xbmc.h"
20 #include "threads/Event.h"
21 #include "utils/Geometry.h"
22 
23 #include <atomic>
24 #include <map>
25 #include <memory>
26 #include <string>
27 #include <thread>
28 #include <vector>
29 
30 #include <android/native_activity.h>
31 #include <androidjni/Activity.h>
32 #include <androidjni/AudioManager.h>
33 #include <androidjni/BroadcastReceiver.h>
34 #include <androidjni/SurfaceHolder.h>
35 #include <androidjni/View.h>
36 
37 // forward declares
38 class CAESinkAUDIOTRACK;
39 class CVariant;
42 class CVideoSyncAndroid;
43 class CJNIActivityManager;
44 
45 typedef struct _JNIEnv JNIEnv;
46 
48 {
49  unsigned int width;
50  unsigned int height;
51  void *pixels;
52 };
53 
55 {
56  std::string packageName;
57  std::string packageLabel;
58  int icon;
59 };
60 
62 {
63  friend class CWinSystemAndroidGLESContext; // meh
64 
65 public:
66  static std::shared_ptr<CNativeWindow> CreateFromSurface(CJNISurfaceHolder holder);
67  ~CNativeWindow();
68 
69  bool SetBuffersGeometry(int width, int height, int format);
70  int32_t GetWidth() const;
71  int32_t GetHeight() const;
72 
73 private:
74  explicit CNativeWindow(ANativeWindow* window);
75 
76  CNativeWindow() = delete;
77  CNativeWindow(const CNativeWindow&) = delete;
78  CNativeWindow& operator=(const CNativeWindow&) = delete;
79 
80  ANativeWindow* m_window{nullptr};
81 };
82 
83 class CXBMCApp : public IActivityHandler,
84  public jni::CJNIMainActivity,
85  public CJNIBroadcastReceiver,
87  public CJNISurfaceHolderCallback
88 {
89 public:
90  static CXBMCApp& Create(ANativeActivity* nativeActivity, IInputHandler& inputhandler)
91  {
92  m_appinstance.reset(new CXBMCApp(nativeActivity, inputhandler));
93  return *m_appinstance;
94  }
95  static CXBMCApp& Get() { return *m_appinstance; }
96  static void Destroy() { m_appinstance.reset(); }
97 
98  CXBMCApp() = delete;
99  ~CXBMCApp() override;
100 
101  // IAnnouncer IF
102  void Announce(ANNOUNCEMENT::AnnouncementFlag flag,
103  const std::string& sender,
104  const std::string& message,
105  const CVariant& data) override;
106 
107  void onReceive(CJNIIntent intent) override;
108  void onNewIntent(CJNIIntent intent) override;
109  void onActivityResult(int requestCode, int resultCode, CJNIIntent resultData) override;
110  void onVolumeChanged(int volume) override;
111  virtual void onAudioFocusChange(int focusChange);
112  void doFrame(int64_t frameTimeNanos) override;
113  void onVisibleBehindCanceled() override;
114 
115  // implementation of CJNIInputManagerInputDeviceListener
116  void onInputDeviceAdded(int deviceId) override;
117  void onInputDeviceChanged(int deviceId) override;
118  void onInputDeviceRemoved(int deviceId) override;
119 
120  // implementation of DisplayManager::DisplayListener
121  void onDisplayAdded(int displayId) override;
122  void onDisplayChanged(int displayId) override;
123  void onDisplayRemoved(int displayId) override;
124  jni::jhobject getDisplayListener() { return m_displayListener.get_raw(); }
125 
126  bool isValid() { return m_activity != NULL; }
127 
128  void onStart() override;
129  void onResume() override;
130  void onPause() override;
131  void onStop() override;
132  void onDestroy() override;
133 
134  void onSaveState(void **data, size_t *size) override;
135  void onConfigurationChanged() override;
136  void onLowMemory() override;
137 
138  void onCreateWindow(ANativeWindow* window) override;
139  void onResizeWindow() override;
140  void onDestroyWindow() override;
141  void onGainFocus() override;
142  void onLostFocus() override;
143 
144  void Initialize();
145  void Deinitialize();
146 
147  bool Stop(int exitCode);
148  void Quit();
149 
150  std::shared_ptr<CNativeWindow> GetNativeWindow(int timeout) const;
151 
152  bool SetBuffersGeometry(int width, int height, int format);
153  static int android_printf(const char *format, ...);
154 
155  int GetBatteryLevel() const;
156  void KeepScreenOn(bool on);
157  bool HasFocus() const { return m_hasFocus; }
158 
159  static bool StartActivity(const std::string& package,
160  const std::string& intent = std::string(),
161  const std::string& dataType = std::string(),
162  const std::string& dataURI = std::string(),
163  const std::string& flags = std::string(),
164  const std::string& extras = std::string(),
165  const std::string& action = std::string(),
166  const std::string& category = std::string(),
167  const std::string& className = std::string());
168  std::vector<androidPackage> GetApplications() const;
169 
176  static bool GetExternalStorage(std::string &path, const std::string &type = "");
177  static bool GetStorageUsage(const std::string &path, std::string &usage);
178  static int GetMaxSystemVolume();
179  static float GetSystemVolume();
180  static void SetSystemVolume(float percent);
181 
182  void SetDisplayMode(int mode, float rate);
183  int GetDPI() const;
184 
185  CRect MapRenderToDroid(const CRect& srcRect);
186 
187  // Playback callbacks
188  void OnPlayBackStarted();
189  void OnPlayBackPaused();
190  void OnPlayBackStopped();
191 
192  // Info callback
193  void UpdateSessionMetadata();
194  void UpdateSessionState();
195 
196  // input device methods
197  void RegisterInputDeviceCallbacks(IInputDeviceCallbacks* handler);
198  void UnregisterInputDeviceCallbacks();
199  static const CJNIViewInputDevice GetInputDevice(int deviceId);
200  static std::vector<int> GetInputDeviceIds();
201 
202  void RegisterInputDeviceEventHandler(IInputDeviceEventHandler* handler);
203  void UnregisterInputDeviceEventHandler();
204  bool onInputDeviceEvent(const AInputEvent* event);
205 
206  void InitFrameCallback(CVideoSyncAndroid* syncImpl);
207  void DeinitFrameCallback();
208 
209  // Application slow ping
210  void ProcessSlow();
211 
212  bool WaitVSync(unsigned int milliSeconds);
213  int64_t GetNextFrameTime() const;
214  float GetFrameLatencyMs() const;
215 
216  bool getVideosurfaceInUse();
217  void setVideosurfaceInUse(bool videosurfaceInUse);
218 
219  bool GetMemoryInfo(long& availMem, long& totalMem);
220 
221 protected:
222  // limit who can access Volume
223  friend class CAESinkAUDIOTRACK;
224 
225  static int GetMaxSystemVolume(JNIEnv *env);
226  bool AcquireAudioFocus();
227  bool ReleaseAudioFocus();
228  void RequestVisibleBehind(bool requested);
229 
230 private:
231  static std::unique_ptr<CXBMCApp> m_appinstance;
232 
233  CXBMCApp(ANativeActivity* nativeActivity, IInputHandler& inputhandler);
234 
237  std::unique_ptr<jni::CJNIXBMCMainView> m_mainView;
238  std::unique_ptr<jni::CJNIXBMCMediaSession> m_mediaSession;
239  std::string GetFilenameFromIntent(const CJNIIntent &intent);
240 
241  void run();
242  void stop();
243  void SetupEnv();
244  static void SetDisplayModeCallback(void* modeVariant);
245  static void KeepScreenOnCallback(void* onVariant);
246 
247  static void RegisterDisplayListenerCallback(void*);
248  void UnregisterDisplayListener();
249 
250  ANativeActivity* m_activity{nullptr};
251  IInputHandler& m_inputHandler;
252  int m_batteryLevel{0};
253  bool m_hasFocus{false};
254  bool m_headsetPlugged{false};
255  bool m_hdmiSource{false};
256  bool m_wakeUp{false};
257  bool m_aeReset{false};
258  bool m_hdmiPlugged{true};
259  bool m_mediaSessionUpdated{false};
260  IInputDeviceCallbacks* m_inputDeviceCallbacks{nullptr};
261  IInputDeviceEventHandler* m_inputDeviceEventHandler{nullptr};
262  bool m_hasReqVisible{false};
263  bool m_firstrun{true};
264  std::atomic<bool> m_exiting{false};
265  int m_exitCode{0};
266  bool m_bResumePlayback{false};
267  std::thread m_thread;
268  mutable CCriticalSection m_applicationsMutex;
269  mutable std::vector<androidPackage> m_applications;
270 
271  std::shared_ptr<CNativeWindow> m_window;
272 
273  CVideoSyncAndroid* m_syncImpl{nullptr};
274  CEvent m_vsyncEvent;
275  CEvent m_displayChangeEvent;
276 
277  std::unique_ptr<CJNIActivityManager> m_activityManager;
278 
279  bool XBMC_DestroyDisplay();
280  bool XBMC_SetupDisplay();
281 
282  void OnSleep();
283  void OnWakeup();
284 
285  uint32_t m_playback_state{0};
286  int64_t m_frameTimeNanos{0};
287  float m_refreshRate{0.0f};
288 
289 public:
290  // CJNISurfaceHolderCallback interface
291  void surfaceChanged(CJNISurfaceHolder holder, int format, int width, int height) override;
292  void surfaceCreated(CJNISurfaceHolder holder) override;
293  void surfaceDestroyed(CJNISurfaceHolder holder) override;
294 };
This is an Event class built from a ConditionVariable.
Definition: Event.h:35
Definition: JNIMainActivity.h:18
Definition: IInputHandler.h:16
Definition: XBMCApp.h:47
Definition: XBMCApp.h:54
Definition: IAnnouncer.h:70
Definition: WinSystemAndroidGLESContext.h:19
Definition: IInputDeviceCallbacks.h:11
Definition: Variant.h:31
Definition: XBMCApp.h:61
Definition: VideoSyncAndroid.h:14
Definition: JNIXBMCAudioManagerOnAudioFocusChangeListener.h:17
Definition: JNIXBMCDisplayManagerDisplayListener.h:16
Definition: IActivityHandler.h:24
Definition: XBMCApp.h:83
Definition: IInputDeviceEventHandler.h:13
Definition: AESinkAUDIOTRACK.h:23