gt:         applicationContext = getApplicationContext();
context: /*
   * This is the source code of Telegram for Android v. 3.x.x.
   * It is licensed under GNU GPL v. 2 or later.
   * You should have received a copy of the license in this archive (see LICENSE).
   *
   * Copyright Nikolai Kudashov, 2013-2016.
   */
  
  package org.telegram.messenger;
  
  import android.app.Activity;
  import android.app.AlarmManager;
  import android.app.Application;
  import android.app.PendingIntent;
  import android.content.BroadcastReceiver;
  import android.content.Context;
  import android.content.Intent;
  import android.content.IntentFilter;
  import android.content.SharedPreferences;
  import android.content.pm.ApplicationInfo;
  import android.content.pm.PackageInfo;
  import android.content.res.Configuration;
  import android.graphics.Bitmap;
  import android.graphics.Color;
  import android.graphics.drawable.BitmapDrawable;
  import android.graphics.drawable.ColorDrawable;
  import android.graphics.drawable.Drawable;
  import android.os.Build;
  import android.os.Handler;
  import android.os.PowerManager;
  import android.util.Base64;
  
  import com.google.android.gms.common.ConnectionResult;
  import com.google.android.gms.common.GooglePlayServicesUtil;
  
  import org.telegram.tgnet.ConnectionsManager;
  import org.telegram.tgnet.SerializedData;
  import org.telegram.tgnet.TLRPC;
  import org.telegram.ui.Components.ForegroundDetector;
  
  import java.io.File;
  import java.io.RandomAccessFile;
  
  public class ApplicationLoader extends Application {
  
      private static Drawable cachedWallpaper;
      private static int selectedColor;
      private static boolean isCustomTheme;
      private static final Object sync = new Object();
  
      private static int serviceMessageColor;
      private static int serviceSelectedMessageColor;
  
      public static volatile Context applicationContext;
      public static volatile Handler applicationHandler;
      private static volatile boolean applicationInited = false;
  
      public static volatile boolean isScreenOn = false;
      public static volatile boolean mainInterfacePaused = true;
  
      public static boolean isCustomTheme() {
          return isCustomTheme;
      }
  
      public static int getSelectedColor() {
          return selectedColor;
      }
  
      public static void reloadWallpaper() {
          cachedWallpaper = null;
          serviceMessageColor = 0;
          ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE).edit().remove("serviceMessageColor").commit();
          loadWallpaper();
      }
  
      private static void calcBackgroundColor() {
          int result[] = AndroidUtilities.calcDrawableColor(cachedWallpaper);
          serviceMessageColor = result[0];
          serviceSelectedMessageColor = result[1];
          SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE);
          preferences.edit().putInt("serviceMessageColor", serviceMessageColor).putInt("serviceSelectedMessageColor", serviceSelectedMessageColor).commit();
      }
  
      public static int getServiceMessageColor() {
          return serviceMessageColor;
      }
  
      public static int getServiceSelectedMessageColor() {
          return serviceSelectedMessageColor;
      }
  
      public static void loadWallpaper() {
          if (cachedWallpaper != null) {
              return;
          }
          Utilities.searchQueue.postRunnable(new Runnable() {
              @Override
              public void run() {
                  synchronized (sync) {
                      int selectedColor = 0;
                      try {
                          SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE);
                          int selectedBackground = preferences.getInt("selectedBackground", 1000001);
                          selectedColor = preferences.getInt("selectedColor", 0);
                          serviceMessageColor = preferences.getInt("serviceMessageColor", 0);
                          serviceSelectedMessageColor = preferences.getInt("serviceSelectedMessageColor", 0);
                          if (selectedColor == 0) {
                              if (selectedBackground == 1000001) {
                                  cachedWallpaper = applicationContext.getResources().getDrawable(R.drawable.background_hd);
                                  isCustomTheme = false;
                              } else {
                                  File toFile = new File(getFilesDirFixed(), "wallpaper.jpg");
                                  if (toFile.exists()) {
                                      cachedWallpaper = Drawable.createFromPath(toFile.getAbsolutePath());
                                      isCustomTheme = true;
                                  } else {
                                      cachedWallpaper = applicationContext.getResources().getDrawable(R.drawable.background_hd);
                                      isCustomTheme = false;
                                  }
                              }
                          }
                      } catch (Throwable throwable) {
                          //ignore
                      }
                      if (cachedWallpaper == null) {
                          if (selectedColor == 0) {
                              selectedColor = -2693905;
                          }
                          cachedWallpaper = new ColorDrawable(selectedColor);
                      }
                      if (serviceMessageColor == 0) {
                          calcBackgroundColor();
                      }
                  }
              }
          });
      }
  
      public static Drawable getCachedWallpaper() {
          synchronized (sync) {
              return cachedWallpaper;
          }
      }
  
      private static void convertConfig() {
          SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("dataconfig", Context.MODE_PRIVATE);
          if (preferences.contains("currentDatacenterId")) {
              SerializedData buffer = new SerializedData(32 * 1024);
              buffer.writeInt32(2);
              buffer.writeBool(preferences.getInt("datacenterSetId", 0) != 0);
              buffer.writeBool(true);
              buffer.writeInt32(preferences.getInt("currentDatacenterId", 0));
              buffer.writeInt32(preferences.getInt("timeDifference", 0));
              buffer.writeInt32(preferences.getInt("lastDcUpdateTime", 0));
              buffer.writeInt64(preferences.getLong("pushSessionId", 0));
              buffer.writeBool(false);
              buffer.writeInt32(0);
              try {
                  String datacentersString = preferences.getString("datacenters", null);
                  if (datacentersString != null) {
                      byte[] datacentersBytes = Base64.decode(datacentersString, Base64.DEFAULT);
                      if (datacentersBytes != null) {
                          SerializedData data = new SerializedData(datacentersBytes);
                          buffer.writeInt32(data.readInt32(false));
                          buffer.writeBytes(datacentersBytes, 4, datacentersBytes.length - 4);
                          data.cleanup();
                      }
                  }
              } catch (Exception e) {
                  FileLog.e("tmessages", e);
              }
  
              try {
                  File file = new File(getFilesDirFixed(), "tgnet.dat");
                  RandomAccessFile fileOutputStream = new RandomAccessFile(file, "rws");
                  byte[] bytes = buffer.toByteArray();
                  fileOutputStream.writeInt(Integer.reverseBytes(bytes.length));
                  fileOutputStream.write(bytes);
                  fileOutputStream.close();
              } catch (Exception e) {
                  FileLog.e("tmessages", e);
              }
              buffer.cleanup();
              preferences.edit().clear().commit();
          }
      }
  
      public static File getFilesDirFixed() {
          for (int a = 0; a < 10; a++) {
              File path = ApplicationLoader.applicationContext.getFilesDir();
              if (path != null) {
                  return path;
              }
          }
          try {
              ApplicationInfo info = applicationContext.getApplicationInfo();
              File path = new File(info.dataDir, "files");
              path.mkdirs();
              return path;
          } catch (Exception e) {
              FileLog.e("tmessages", e);
          }
          return new File("/data/data/org.telegram.messenger/files");
      }
  
      public static void postInitApplication() {
          if (applicationInited) {
              return;
          }
  
          applicationInited = true;
          convertConfig();
  
          try {
              LocaleController.getInstance();
          } catch (Exception e) {
              e.printStackTrace();
          }
  
          try {
              final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
              filter.addAction(Intent.ACTION_SCREEN_OFF);
              final BroadcastReceiver mReceiver = new ScreenReceiver();
              applicationContext.registerReceiver(mReceiver, filter);
          } catch (Exception e) {
              e.printStackTrace();
          }
  
          try {
              PowerManager pm = (PowerManager)ApplicationLoader.applicationContext.getSystemService(Context.POWER_SERVICE);
              isScreenOn = pm.isScreenOn();
              FileLog.e("tmessages", "screen state = " + isScreenOn);
          } catch (Exception e) {
              FileLog.e("tmessages", e);
          }
  
          UserConfig.loadConfig();
          String deviceModel;
          String langCode;
          String appVersion;
          String systemVersion;
          String configPath = getFilesDirFixed().toString();
  
          try {
              langCode = LocaleController.getLocaleStringIso639();
              deviceModel = Build.MANUFACTURER + Build.MODEL;
              PackageInfo pInfo = ApplicationLoader.applicationContext.getPackageManager().getPackageInfo(ApplicationLoader.applicationContext.getPackageName(), 0);
              appVersion = pInfo.versionName + " (" + pInfo.versionCode + ")";
              systemVersion = "SDK " + Build.VERSION.SDK_INT;
          } catch (Exception e) {
              langCode = "en";
              deviceModel = "Android unknown";
              appVersion = "App version unknown";
              systemVersion = "SDK " + Build.VERSION.SDK_INT;
          }
          if (langCode.trim().length() == 0) {
              langCode = "en";
          }
          if (deviceModel.trim().length() == 0) {
              deviceModel = "Android unknown";
          }
          if (appVersion.trim().length() == 0) {
              appVersion = "App version unknown";
          }
          if (systemVersion.trim().length() == 0) {
              systemVersion = "SDK Unknown";
          }
  
          SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
          boolean enablePushConnection = preferences.getBoolean("pushConnection", true);
  
          MessagesController.getInstance();
          ConnectionsManager.getInstance().init(BuildVars.BUILD_VERSION, TLRPC.LAYER, BuildVars.APP_ID, deviceModel, systemVersion, appVersion, langCode, configPath, FileLog.getNetworkLogPath(), UserConfig.getClientUserId(), enablePushConnection);
          if (UserConfig.getCurrentUser() != null) {
              MessagesController.getInstance().putUser(UserConfig.getCurrentUser(), true);
              ConnectionsManager.getInstance().applyCountryPortNumber(UserConfig.getCurrentUser().phone);
              MessagesController.getInstance().getBlockedUsers(true);
              SendMessagesHelper.getInstance().checkUnsentMessages();
          }
  
          ApplicationLoader app = (ApplicationLoader)ApplicationLoader.applicationContext;
          app.initPlayServices();
          FileLog.e("tmessages", "app initied");
  
          ContactsController.getInstance().checkAppAccount();
          MediaController.getInstance();
      }
  
      @Override
      public void onCreate() {
          super.onCreate();
  
          if (Build.VERSION.SDK_INT < 11) {
              java.lang.System.setProperty("java.net.preferIPv4Stack", "true");
              java.lang.System.setProperty("java.net.preferIPv6Addresses", "false");
          }
  
  