/* * This is the source code of Telegram for Android v. 1.3.2. * 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. */ package org.telegram.ui; 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.PackageInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Handler; import android.os.PowerManager; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.gcm.GoogleCloudMessaging; import org.telegram.android.AndroidUtilities; import org.telegram.android.ContactsController; import org.telegram.android.MediaController; import org.telegram.android.NotificationsService; import org.telegram.android.SendMessagesHelper; import org.telegram.messenger.BuildVars; import org.telegram.messenger.ConnectionsManager; import org.telegram.messenger.FileLog; import org.telegram.android.LocaleController; import org.telegram.android.MessagesController; import org.telegram.android.NativeLoader; import org.telegram.android.ScreenReceiver; import org.telegram.messenger.UserConfig; import org.telegram.messenger.Utilities; import java.util.concurrent.atomic.AtomicInteger; public class ApplicationLoader extends Application { private GoogleCloudMessaging gcm; private AtomicInteger msgId = new AtomicInteger(); private String regid; public static final String EXTRA_MESSAGE = "message"; public static final String PROPERTY_REG_ID = "registration_id"; private static final String PROPERTY_APP_VERSION = "appVersion"; private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; public static Drawable cachedWallpaper = null; public static volatile Context applicationContext = null; public static volatile Handler applicationHandler = null; private static volatile boolean applicationInited = false; public static volatile boolean isScreenOn = false; public static volatile boolean mainInterfacePaused = true; public static void postInitApplication() { if (applicationInited) { return; } applicationInited = true; 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(); if (UserConfig.getCurrentUser() != null) { MessagesController.getInstance().putUser(UserConfig.getCurrentUser(), true); ConnectionsManager.getInstance().applyCountryPortNumber(UserConfig.getCurrentUser().phone); ConnectionsManager.getInstance().initPushConnection(); 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(); applicationContext = getApplicationContext(); NativeLoader.initNativeLibs(ApplicationLoader.applicationContext); applicationHandler = new Handler(applicationContext.getMainLooper()); java.lang.System.setProperty("java.net.preferIPv4Stack", "true"); java.lang.System.setProperty("java.net.preferIPv6Addresses", "false"); startPushService(); } public static void startPushService() { SharedPreferences preferences = applicationContext.getSharedPreferences("Notifications", MODE_PRIVATE); if (preferences.getBoolean("pushService", true)) { applicationContext.startService(new Intent(applicationContext, NotificationsService.class)); if (android.os.Build.VERSION.SDK_INT >= 19) { // Calendar cal = Calendar.getInstance(); // PendingIntent pintent = PendingIntent.getService(applicationContext, 0, new Intent(applicationContext, NotificationsService.class), 0); // AlarmManager alarm = (AlarmManager) applicationContext.getSystemService(Context.ALARM_SERVICE); // alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30000, pintent); PendingIntent pintent = PendingIntent.getService(applicationContext, 0, new Intent(applicationContext, NotificationsService.class), 0); AlarmManager alarm = (AlarmManager)applicationContext.getSystemService(Context.ALARM_SERVICE); alarm.cancel(pintent); } } else { stopPushService(); } } public static void stopPushService() { applicationContext.stopService(new Intent(applicationContext, NotificationsService.class)); PendingIntent pintent = PendingIntent.getService(applicationContext, 0, new Intent(applicationContext, NotificationsService.class), 0); AlarmManager alarm = (AlarmManager)applicationContext.getSystemService(Context.ALARM_SERVICE); alarm.cancel(pintent); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); try { LocaleController.getInstance().onDeviceConfigurationChange(newConfig); AndroidUtilities.checkDisplaySize(); } catch (Exception e) { e.printStackTrace(); } } private void initPlayServices() { if (checkPlayServices()) { gcm = GoogleCloudMessaging.getInstance(this); regid = getRegistrationId(); if (regid.length() == 0) { registerInBackground(); } else { sendRegistrationIdToBackend(false); } } else { FileLog.d("tmessages", "No valid Google Play Services APK found."); } } private boolean checkPlayServices() { int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); return resultCode == ConnectionResult.SUCCESS; /*if (resultCode != ConnectionResult.SUCCESS) { if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) { GooglePlayServicesUtil.getErrorDialog(resultCode, this, PLAY_SERVICES_RESOLUTION_REQUEST).show(); } else { Log.i("tmessages", "This device is not supported."); } return false; } return true;*/ } private String getRegistrationId() { final SharedPreferences prefs = getGCMPreferences(applicationContext); String registrationId = prefs.getString(PROPERTY_REG_ID, ""); if (registrationId.length() == 0) { FileLog.d("tmessages", "Registration not found."); return ""; } int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE); int currentVersion = getAppVersion(); if (registeredVersion != currentVersion) { FileLog.d("tmessages", "App version changed."); return ""; } return registrationId; } private SharedPreferences getGCMPreferences(Context context) { return getSharedPreferences(ApplicationLoader.class.getSimpleName(), Context.MODE_PRIVATE); } public static int getAppVersion() { try { PackageInfo packageInfo = applicationContext.getPackageManager().getPackageInfo(applicationContext.getPackageName(), 0); return packageInfo.versionCode; } catch (PackageManager.NameNotFoundException e) { throw new RuntimeException("Could not get package name: " + e); } } private void registerInBackground() { AsyncTask task = new AsyncTask() { @Override protected Boolean doInBackground(String... objects) { if (gcm == null) { gcm = GoogleCloudMessaging.getInstance(applicationContext); } int count = 0; while (count < 1000) { try { count++; regid = gcm.register(BuildVars.GCM_SENDER_ID); sendRegistrationIdToBackend(true); storeRegistrationId(applicationContext, regid); return true; } catch (Exception e) { FileLog.e("tmessages", e); } try { if (count % 20 == 0) { Thread.sleep(60000 * 30); } else { Thread.sleep(5000); } } catch (InterruptedException e) { FileLog.e("tmessages", e); } } return false; } }; if (android.os.Build.VERSION.SDK_INT >= 11) { task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null, null, null); } else { task.execute(null, null, null); } } private void sendRegistrationIdToBackend(final boolean isNew) { Utilities.stageQueue.postRunnable(new Runnable() { @Override public void run() { UserConfig.pushString = regid; UserConfig.registeredForPush = !isNew; UserConfig.saveConfig(false); if (UserConfig.getClientUserId() != 0) { AndroidUtilities.RunOnUIThread(new Runnable() { @Override public void run() { MessagesController.getInstance().registerForPush(regid); } }); } } }); } private void storeRegistrationId(Context context, String regId) { final SharedPreferences prefs = getGCMPreferences(context); int appVersion = getAppVersion(); FileLog.e("tmessages", "Saving regId on app version " + appVersion); SharedPreferences.Editor editor = prefs.edit(); editor.putString(PROPERTY_REG_ID, regId); editor.putInt(PROPERTY_APP_VERSION, appVersion); editor.commit(); } }