NextcloudTalkApplication.java 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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 android.content.Context;
  23. import android.os.Build;
  24. import android.util.Log;
  25. import com.nextcloud.talk.dagger.modules.BusModule;
  26. import com.nextcloud.talk.dagger.modules.ContextModule;
  27. import com.nextcloud.talk.dagger.modules.DatabaseModule;
  28. import com.nextcloud.talk.dagger.modules.RestModule;
  29. import com.nextcloud.talk.jobs.AccountRemovalWorker;
  30. import com.nextcloud.talk.jobs.CapabilitiesWorker;
  31. import com.nextcloud.talk.jobs.PushRegistrationWorker;
  32. import com.nextcloud.talk.jobs.SignalingSettingsJob;
  33. import com.nextcloud.talk.utils.ClosedInterfaceImpl;
  34. import com.nextcloud.talk.utils.DeviceUtils;
  35. import com.nextcloud.talk.utils.DisplayUtils;
  36. import com.nextcloud.talk.utils.database.user.UserModule;
  37. import com.nextcloud.talk.webrtc.MagicWebRTCUtils;
  38. import org.webrtc.PeerConnectionFactory;
  39. import org.webrtc.voiceengine.WebRtcAudioManager;
  40. import org.webrtc.voiceengine.WebRtcAudioUtils;
  41. import java.util.concurrent.TimeUnit;
  42. import javax.inject.Singleton;
  43. import androidx.lifecycle.LifecycleObserver;
  44. import androidx.multidex.MultiDex;
  45. import androidx.multidex.MultiDexApplication;
  46. import androidx.work.Configuration;
  47. import androidx.work.OneTimeWorkRequest;
  48. import androidx.work.PeriodicWorkRequest;
  49. import androidx.work.WorkManager;
  50. import autodagger.AutoComponent;
  51. import autodagger.AutoInjector;
  52. import uk.co.chrisjenx.calligraphy.CalligraphyConfig;
  53. @AutoComponent(
  54. modules = {
  55. BusModule.class,
  56. ContextModule.class,
  57. DatabaseModule.class,
  58. RestModule.class,
  59. UserModule.class,
  60. }
  61. )
  62. @Singleton
  63. @AutoInjector(NextcloudTalkApplication.class)
  64. public class NextcloudTalkApplication extends MultiDexApplication implements LifecycleObserver {
  65. private static final String TAG = NextcloudTalkApplication.class.getSimpleName();
  66. //region Singleton
  67. protected static NextcloudTalkApplication sharedApplication;
  68. //region Fields (components)
  69. protected NextcloudTalkApplicationComponent componentApplication;
  70. //endregion
  71. public static NextcloudTalkApplication getSharedApplication() {
  72. return sharedApplication;
  73. }
  74. //endregion
  75. //region private methods
  76. private void initializeWebRtc() {
  77. try {
  78. if (MagicWebRTCUtils.HARDWARE_AEC_BLACKLIST.contains(Build.MODEL)) {
  79. WebRtcAudioUtils.setWebRtcBasedAcousticEchoCanceler(true);
  80. }
  81. if (!MagicWebRTCUtils.OPEN_SL_ES_WHITELIST.contains(Build.MODEL)) {
  82. WebRtcAudioManager.setBlacklistDeviceForOpenSLESUsage(true);
  83. }
  84. PeerConnectionFactory.initialize(PeerConnectionFactory.InitializationOptions.builder(this)
  85. .setEnableVideoHwAcceleration(MagicWebRTCUtils.shouldEnableVideoHardwareAcceleration())
  86. .createInitializationOptions());
  87. } catch (UnsatisfiedLinkError e) {
  88. Log.w(TAG, e);
  89. }
  90. }
  91. //endregion
  92. //region Overridden methods
  93. @Override
  94. public void onCreate() {
  95. super.onCreate();
  96. CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
  97. .setDefaultFontPath("fonts/Nunito-Regular.ttf")
  98. .build()
  99. );
  100. sharedApplication = this;
  101. initializeWebRtc();
  102. DisplayUtils.useCompatVectorIfNeeded();
  103. buildComponent();
  104. componentApplication.inject(this);
  105. new ClosedInterfaceImpl().providerInstallerInstallIfNeededAsync();
  106. DeviceUtils.ignoreSpecialBatteryFeatures();
  107. OneTimeWorkRequest pushRegistrationWork = new OneTimeWorkRequest.Builder(PushRegistrationWorker.class).build();
  108. OneTimeWorkRequest accountRemovalWork = new OneTimeWorkRequest.Builder(AccountRemovalWorker.class).build();
  109. PeriodicWorkRequest periodicCapabilitiesUpdateWork = new PeriodicWorkRequest.Builder(CapabilitiesWorker.class,
  110. 1, TimeUnit.DAYS).build();
  111. OneTimeWorkRequest capabilitiesUpdateWork = new OneTimeWorkRequest.Builder(CapabilitiesWorker.class).build();
  112. OneTimeWorkRequest signalingSettingsWork = new OneTimeWorkRequest.Builder(SignalingSettingsJob.class).build();
  113. WorkManager.initialize(getApplicationContext(), new Configuration.Builder().build());
  114. WorkManager.getInstance().enqueue(pushRegistrationWork);
  115. WorkManager.getInstance().enqueue(accountRemovalWork);
  116. WorkManager.getInstance().enqueue(capabilitiesUpdateWork);
  117. WorkManager.getInstance().enqueue(signalingSettingsWork);
  118. // There is a bug with periodic work so we ignore this for now
  119. //WorkManager.getInstance().enqueueUniquePeriodicWork("DailyCapabilitiesUpdateWork",
  120. // ExistingPeriodicWorkPolicy.REPLACE, periodicCapabilitiesUpdateWork);
  121. WorkManager.getInstance().cancelUniqueWork("DailyCapabilitiesUpdateWork");
  122. }
  123. @Override
  124. public void onTerminate() {
  125. super.onTerminate();
  126. sharedApplication = null;
  127. }
  128. //endregion
  129. //region Getters
  130. public NextcloudTalkApplicationComponent getComponentApplication() {
  131. return componentApplication;
  132. }
  133. //endregion
  134. //region Protected methods
  135. protected void buildComponent() {
  136. componentApplication = DaggerNextcloudTalkApplicationComponent.builder()
  137. .busModule(new BusModule())
  138. .contextModule(new ContextModule(getApplicationContext()))
  139. .databaseModule(new DatabaseModule())
  140. .restModule(new RestModule())
  141. .userModule(new UserModule())
  142. .build();
  143. }
  144. @Override
  145. protected void attachBaseContext(Context base) {
  146. super.attachBaseContext(base);
  147. MultiDex.install(this);
  148. }
  149. //endregion
  150. }