NextcloudTalkApplication.java 6.5 KB

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