NextcloudTalkApplication.java 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /*
  2. *
  3. * Nextcloud Talk application
  4. *
  5. * @author Mario Danic
  6. * Copyright (C) 2017 Mario Danic (mario@lovelyhq.com)
  7. *
  8. * This program is free software: you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation, either version 3 of the License, or
  11. * at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  20. */
  21. package com.nextcloud.talk.application;
  22. import androidx.lifecycle.Lifecycle;
  23. import androidx.lifecycle.LifecycleObserver;
  24. import androidx.lifecycle.OnLifecycleEvent;
  25. import androidx.lifecycle.ProcessLifecycleOwner;
  26. import android.content.Context;
  27. import android.os.Build;
  28. import androidx.multidex.MultiDex;
  29. import androidx.multidex.MultiDexApplication;
  30. import android.util.Log;
  31. import com.nextcloud.talk.dagger.modules.BusModule;
  32. import com.nextcloud.talk.dagger.modules.ContextModule;
  33. import com.nextcloud.talk.dagger.modules.DatabaseModule;
  34. import com.nextcloud.talk.dagger.modules.RestModule;
  35. import com.nextcloud.talk.jobs.AccountRemovalWorker;
  36. import com.nextcloud.talk.jobs.CapabilitiesWorker;
  37. import com.nextcloud.talk.jobs.PushRegistrationWorker;
  38. import com.nextcloud.talk.utils.ClosedInterfaceImpl;
  39. import com.nextcloud.talk.utils.DeviceUtils;
  40. import com.nextcloud.talk.utils.DisplayUtils;
  41. import com.nextcloud.talk.utils.database.user.UserModule;
  42. import com.nextcloud.talk.utils.singletons.ApplicationWideStateHolder;
  43. import com.nextcloud.talk.webrtc.MagicWebRTCUtils;
  44. import com.squareup.leakcanary.LeakCanary;
  45. import com.squareup.leakcanary.RefWatcher;
  46. import org.webrtc.PeerConnectionFactory;
  47. import org.webrtc.voiceengine.WebRtcAudioManager;
  48. import org.webrtc.voiceengine.WebRtcAudioUtils;
  49. import java.util.concurrent.TimeUnit;
  50. import javax.inject.Singleton;
  51. import androidx.work.Configuration;
  52. import androidx.work.ExistingPeriodicWorkPolicy;
  53. import androidx.work.OneTimeWorkRequest;
  54. import androidx.work.PeriodicWorkRequest;
  55. import androidx.work.WorkManager;
  56. import autodagger.AutoComponent;
  57. import autodagger.AutoInjector;
  58. @AutoComponent(
  59. modules = {
  60. BusModule.class,
  61. ContextModule.class,
  62. DatabaseModule.class,
  63. RestModule.class,
  64. UserModule.class,
  65. }
  66. )
  67. @Singleton
  68. @AutoInjector(NextcloudTalkApplication.class)
  69. public class NextcloudTalkApplication extends MultiDexApplication implements LifecycleObserver {
  70. private static final String TAG = NextcloudTalkApplication.class.getSimpleName();
  71. //region Public variables
  72. public static RefWatcher refWatcher;
  73. //endregion
  74. //region Singleton
  75. protected static NextcloudTalkApplication sharedApplication;
  76. //region Fields (components)
  77. protected NextcloudTalkApplicationComponent componentApplication;
  78. //endregion
  79. public static NextcloudTalkApplication getSharedApplication() {
  80. return sharedApplication;
  81. }
  82. //endregion
  83. //region private methods
  84. private void initializeWebRtc() {
  85. try {
  86. if (MagicWebRTCUtils.HARDWARE_AEC_BLACKLIST.contains(Build.MODEL)) {
  87. WebRtcAudioUtils.setWebRtcBasedAcousticEchoCanceler(true);
  88. }
  89. if (!MagicWebRTCUtils.OPEN_SL_ES_WHITELIST.contains(Build.MODEL)) {
  90. WebRtcAudioManager.setBlacklistDeviceForOpenSLESUsage(true);
  91. }
  92. PeerConnectionFactory.initialize(PeerConnectionFactory.InitializationOptions.builder(this)
  93. .createInitializationOptions());
  94. } catch (UnsatisfiedLinkError e) {
  95. Log.w(TAG, e);
  96. }
  97. }
  98. //endregion
  99. //region Overridden methods
  100. @Override
  101. public void onCreate() {
  102. super.onCreate();
  103. ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
  104. sharedApplication = this;
  105. initializeWebRtc();
  106. DisplayUtils.useCompatVectorIfNeeded();
  107. buildComponent();
  108. componentApplication.inject(this);
  109. refWatcher = LeakCanary.install(this);
  110. new ClosedInterfaceImpl().providerInstallerInstallIfNeededAsync();
  111. DeviceUtils.ignoreSpecialBatteryFeatures();
  112. OneTimeWorkRequest pushRegistrationWork = new OneTimeWorkRequest.Builder(PushRegistrationWorker.class).build();
  113. OneTimeWorkRequest accountRemovalWork = new OneTimeWorkRequest.Builder(AccountRemovalWorker.class).build();
  114. PeriodicWorkRequest periodicCapabilitiesUpdateWork = new PeriodicWorkRequest.Builder(CapabilitiesWorker.class,
  115. 1, TimeUnit.DAYS).build();
  116. WorkManager.initialize(getApplicationContext(), new Configuration.Builder().build());
  117. WorkManager.getInstance().enqueue(pushRegistrationWork);
  118. WorkManager.getInstance().enqueue(accountRemovalWork);
  119. WorkManager.getInstance().enqueueUniquePeriodicWork("DailyCapabilitiesUpdateWork",
  120. ExistingPeriodicWorkPolicy.REPLACE, periodicCapabilitiesUpdateWork);
  121. }
  122. @Override
  123. public void onTerminate() {
  124. super.onTerminate();
  125. sharedApplication = null;
  126. }
  127. //endregion
  128. //region Getters
  129. public NextcloudTalkApplicationComponent getComponentApplication() {
  130. return componentApplication;
  131. }
  132. //endregion
  133. //region Protected methods
  134. protected void buildComponent() {
  135. componentApplication = DaggerNextcloudTalkApplicationComponent.builder()
  136. .busModule(new BusModule())
  137. .contextModule(new ContextModule(getApplicationContext()))
  138. .databaseModule(new DatabaseModule())
  139. .restModule(new RestModule())
  140. .userModule(new UserModule())
  141. .build();
  142. }
  143. @Override
  144. protected void attachBaseContext(Context base) {
  145. super.attachBaseContext(base);
  146. MultiDex.install(this);
  147. }
  148. //endregion
  149. @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
  150. private void onAppBackgrounded() {
  151. ApplicationWideStateHolder.getInstance().setInForeground(false);
  152. }
  153. @OnLifecycleEvent(Lifecycle.Event.ON_START)
  154. private void onAppForegrounded() {
  155. ApplicationWideStateHolder.getInstance().setInForeground(true);
  156. }
  157. }