2014-07-03 00:39:05 +02:00
|
|
|
/*
|
|
|
|
* This is the source code of Telegram for Android v. 1.4.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-2014.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package org.telegram.android;
|
|
|
|
|
|
|
|
import android.app.Activity;
|
|
|
|
import android.content.Context;
|
|
|
|
import android.content.pm.ActivityInfo;
|
|
|
|
import android.content.res.Configuration;
|
|
|
|
import android.graphics.Point;
|
|
|
|
import android.graphics.Typeface;
|
|
|
|
import android.os.Build;
|
|
|
|
import android.os.Environment;
|
|
|
|
import android.view.Display;
|
|
|
|
import android.view.Surface;
|
|
|
|
import android.view.View;
|
|
|
|
import android.view.WindowManager;
|
|
|
|
import android.view.inputmethod.InputMethodManager;
|
|
|
|
|
|
|
|
import org.telegram.messenger.FileLog;
|
2014-09-24 04:17:27 +02:00
|
|
|
import org.telegram.messenger.R;
|
|
|
|
import org.telegram.messenger.UserConfig;
|
2014-07-03 00:39:05 +02:00
|
|
|
import org.telegram.ui.ApplicationLoader;
|
|
|
|
|
|
|
|
import java.io.File;
|
|
|
|
import java.util.Hashtable;
|
2014-09-24 04:17:27 +02:00
|
|
|
import java.util.Locale;
|
2014-07-03 00:39:05 +02:00
|
|
|
|
|
|
|
public class AndroidUtilities {
|
|
|
|
private static final Hashtable<String, Typeface> typefaceCache = new Hashtable<String, Typeface>();
|
|
|
|
private static int prevOrientation = -10;
|
|
|
|
private static boolean waitingForSms = false;
|
|
|
|
private static final Integer smsLock = 2;
|
|
|
|
public static int externalCacheNotAvailableState = 0;
|
|
|
|
|
|
|
|
public static int statusBarHeight = 0;
|
|
|
|
public static float density = 1;
|
|
|
|
public static Point displaySize = new Point();
|
2014-09-24 17:08:25 +02:00
|
|
|
private static Boolean isTablet = null;
|
2014-09-25 05:54:35 +02:00
|
|
|
private static Boolean isSmallTablet = null;
|
2014-07-03 00:39:05 +02:00
|
|
|
|
2014-09-24 04:17:27 +02:00
|
|
|
public static int[] arrColors = {0xffee4928, 0xff41a903, 0xffe09602, 0xff0f94ed, 0xff8f3bf7, 0xfffc4380, 0xff00a1c4, 0xffeb7002};
|
|
|
|
public static int[] arrUsersAvatars = {
|
|
|
|
R.drawable.user_red,
|
|
|
|
R.drawable.user_green,
|
|
|
|
R.drawable.user_yellow,
|
|
|
|
R.drawable.user_blue,
|
|
|
|
R.drawable.user_violet,
|
|
|
|
R.drawable.user_pink,
|
|
|
|
R.drawable.user_aqua,
|
|
|
|
R.drawable.user_orange};
|
|
|
|
|
|
|
|
public static int[] arrGroupsAvatars = {
|
|
|
|
R.drawable.group_red,
|
|
|
|
R.drawable.group_green,
|
|
|
|
R.drawable.group_yellow,
|
|
|
|
R.drawable.group_blue,
|
|
|
|
R.drawable.group_violet,
|
|
|
|
R.drawable.group_pink,
|
|
|
|
R.drawable.group_aqua,
|
|
|
|
R.drawable.group_orange};
|
|
|
|
|
|
|
|
public static int[] arrBroadcastAvatars = {
|
|
|
|
R.drawable.broadcast_red,
|
|
|
|
R.drawable.broadcast_green,
|
|
|
|
R.drawable.broadcast_yellow,
|
|
|
|
R.drawable.broadcast_blue,
|
|
|
|
R.drawable.broadcast_violet,
|
|
|
|
R.drawable.broadcast_pink,
|
|
|
|
R.drawable.broadcast_aqua,
|
|
|
|
R.drawable.broadcast_orange};
|
|
|
|
|
2014-07-03 00:39:05 +02:00
|
|
|
static {
|
|
|
|
density = ApplicationLoader.applicationContext.getResources().getDisplayMetrics().density;
|
|
|
|
checkDisplaySize();
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void lockOrientation(Activity activity) {
|
2014-09-24 04:17:27 +02:00
|
|
|
if (activity == null || prevOrientation != -10) {
|
2014-07-03 00:39:05 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
prevOrientation = activity.getRequestedOrientation();
|
|
|
|
WindowManager manager = (WindowManager)activity.getSystemService(Activity.WINDOW_SERVICE);
|
|
|
|
if (manager != null && manager.getDefaultDisplay() != null) {
|
|
|
|
int rotation = manager.getDefaultDisplay().getRotation();
|
|
|
|
int orientation = activity.getResources().getConfiguration().orientation;
|
|
|
|
|
|
|
|
if (rotation == Surface.ROTATION_270) {
|
|
|
|
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
|
|
|
|
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
|
|
|
|
} else {
|
|
|
|
if (Build.VERSION.SDK_INT >= 9) {
|
|
|
|
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
|
|
|
|
} else {
|
|
|
|
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (rotation == Surface.ROTATION_90) {
|
|
|
|
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
|
|
|
|
if (Build.VERSION.SDK_INT >= 9) {
|
|
|
|
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
|
|
|
|
} else {
|
|
|
|
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
|
|
|
|
}
|
|
|
|
} else if (rotation == Surface.ROTATION_0) {
|
|
|
|
if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
|
|
|
|
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
|
|
|
|
} else {
|
|
|
|
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
|
|
|
|
if (Build.VERSION.SDK_INT >= 9) {
|
|
|
|
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
|
|
|
|
} else {
|
|
|
|
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (Build.VERSION.SDK_INT >= 9) {
|
|
|
|
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
|
|
|
|
} else {
|
|
|
|
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
FileLog.e("tmessages", e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void unlockOrientation(Activity activity) {
|
2014-09-24 04:17:27 +02:00
|
|
|
if (activity == null) {
|
|
|
|
return;
|
|
|
|
}
|
2014-07-03 00:39:05 +02:00
|
|
|
try {
|
|
|
|
if (prevOrientation != -10) {
|
|
|
|
activity.setRequestedOrientation(prevOrientation);
|
|
|
|
prevOrientation = -10;
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
FileLog.e("tmessages", e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static Typeface getTypeface(String assetPath) {
|
|
|
|
synchronized (typefaceCache) {
|
|
|
|
if (!typefaceCache.containsKey(assetPath)) {
|
|
|
|
try {
|
|
|
|
Typeface t = Typeface.createFromAsset(ApplicationLoader.applicationContext.getAssets(), assetPath);
|
|
|
|
typefaceCache.put(assetPath, t);
|
|
|
|
} catch (Exception e) {
|
|
|
|
FileLog.e("Typefaces", "Could not get typeface '" + assetPath + "' because " + e.getMessage());
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return typefaceCache.get(assetPath);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean isWaitingForSms() {
|
|
|
|
boolean value = false;
|
|
|
|
synchronized (smsLock) {
|
|
|
|
value = waitingForSms;
|
|
|
|
}
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void setWaitingForSms(boolean value) {
|
|
|
|
synchronized (smsLock) {
|
|
|
|
waitingForSms = value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void showKeyboard(View view) {
|
|
|
|
if (view == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
InputMethodManager inputManager = (InputMethodManager)view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
|
|
|
|
inputManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
|
|
|
|
|
|
|
|
((InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(view, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean isKeyboardShowed(View view) {
|
|
|
|
if (view == null) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
InputMethodManager inputManager = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
|
|
|
|
return inputManager.isActive(view);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void hideKeyboard(View view) {
|
|
|
|
if (view == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
|
|
|
|
if (!imm.isActive()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static File getCacheDir() {
|
|
|
|
if (externalCacheNotAvailableState == 1 || externalCacheNotAvailableState == 0 && Environment.getExternalStorageState().startsWith(Environment.MEDIA_MOUNTED)) {
|
|
|
|
externalCacheNotAvailableState = 1;
|
2014-07-20 01:31:49 +02:00
|
|
|
try {
|
|
|
|
File file = ApplicationLoader.applicationContext.getExternalCacheDir();
|
|
|
|
if (file != null) {
|
|
|
|
return file;
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
FileLog.e("tmessages", e);
|
2014-07-03 00:39:05 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
externalCacheNotAvailableState = 2;
|
2014-07-20 01:31:49 +02:00
|
|
|
try {
|
|
|
|
File file = ApplicationLoader.applicationContext.getCacheDir();
|
|
|
|
if (file != null) {
|
|
|
|
return file;
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
FileLog.e("tmessages", e);
|
2014-07-03 00:39:05 +02:00
|
|
|
}
|
|
|
|
return new File("");
|
|
|
|
}
|
|
|
|
|
|
|
|
public static int dp(int value) {
|
|
|
|
return (int)(Math.max(1, density * value));
|
|
|
|
}
|
|
|
|
|
|
|
|
public static int dpf(float value) {
|
|
|
|
return (int)Math.ceil(density * value);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void checkDisplaySize() {
|
|
|
|
try {
|
|
|
|
WindowManager manager = (WindowManager)ApplicationLoader.applicationContext.getSystemService(Context.WINDOW_SERVICE);
|
|
|
|
if (manager != null) {
|
|
|
|
Display display = manager.getDefaultDisplay();
|
|
|
|
if (display != null) {
|
|
|
|
if(android.os.Build.VERSION.SDK_INT < 13) {
|
|
|
|
displaySize.set(display.getWidth(), display.getHeight());
|
|
|
|
} else {
|
|
|
|
display.getSize(displaySize);
|
|
|
|
}
|
|
|
|
FileLog.e("tmessages", "display size = " + displaySize.x + " " + displaySize.y);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
FileLog.e("tmessages", e);
|
|
|
|
}
|
|
|
|
}
|
2014-07-27 12:53:00 +02:00
|
|
|
|
|
|
|
public static long makeBroadcastId(int id) {
|
|
|
|
return 0x0000000100000000L | ((long)id & 0x00000000FFFFFFFFL);
|
|
|
|
}
|
2014-08-22 16:24:33 +02:00
|
|
|
|
|
|
|
public static void RunOnUIThread(Runnable runnable) {
|
|
|
|
ApplicationLoader.applicationHandler.post(runnable);
|
|
|
|
}
|
2014-09-24 04:17:27 +02:00
|
|
|
|
|
|
|
public static boolean isTablet() {
|
2014-09-24 17:08:25 +02:00
|
|
|
if (isTablet == null) {
|
|
|
|
isTablet = ApplicationLoader.applicationContext.getResources().getBoolean(R.bool.isTablet);
|
|
|
|
}
|
|
|
|
return isTablet;
|
2014-09-24 04:17:27 +02:00
|
|
|
}
|
|
|
|
|
2014-09-25 05:54:35 +02:00
|
|
|
public static boolean isSmallTablet() {
|
|
|
|
if (isSmallTablet == null) {
|
|
|
|
float minSide = Math.min(displaySize.x, displaySize.y) / density;
|
|
|
|
isSmallTablet = minSide <= 700;
|
|
|
|
}
|
|
|
|
return isSmallTablet;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static int getMinTabletSide() {
|
|
|
|
if (!isSmallTablet()) {
|
|
|
|
int smallSide = Math.min(displaySize.x, displaySize.y);
|
|
|
|
int leftSide = smallSide * 35 / 100;
|
|
|
|
if (leftSide < dp(320)) {
|
|
|
|
leftSide = dp(320);
|
|
|
|
}
|
|
|
|
return smallSide - leftSide;
|
|
|
|
} else {
|
|
|
|
int smallSide = Math.min(displaySize.x, displaySize.y);
|
|
|
|
int maxSide = Math.max(displaySize.x, displaySize.y);
|
|
|
|
int leftSide = maxSide * 35 / 100;
|
|
|
|
if (leftSide < dp(320)) {
|
|
|
|
leftSide = dp(320);
|
|
|
|
}
|
|
|
|
return Math.min(smallSide, maxSide - leftSide);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-09-24 04:17:27 +02:00
|
|
|
public static int getColorIndex(int id) {
|
|
|
|
int[] arr;
|
|
|
|
if (id >= 0) {
|
|
|
|
arr = arrUsersAvatars;
|
|
|
|
} else {
|
|
|
|
arr = arrGroupsAvatars;
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
String str;
|
|
|
|
if (id >= 0) {
|
|
|
|
str = String.format(Locale.US, "%d%d", id, UserConfig.getClientUserId());
|
|
|
|
} else {
|
|
|
|
str = String.format(Locale.US, "%d", id);
|
|
|
|
}
|
|
|
|
if (str.length() > 15) {
|
|
|
|
str = str.substring(0, 15);
|
|
|
|
}
|
|
|
|
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
|
|
|
|
byte[] digest = md.digest(str.getBytes());
|
|
|
|
int b = digest[Math.abs(id % 16)];
|
|
|
|
if (b < 0) {
|
|
|
|
b += 256;
|
|
|
|
}
|
|
|
|
return Math.abs(b) % arr.length;
|
|
|
|
} catch (Exception e) {
|
|
|
|
FileLog.e("tmessages", e);
|
|
|
|
}
|
|
|
|
return id % arr.length;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static int getColorForId(int id) {
|
|
|
|
if (id / 1000 == 333) {
|
|
|
|
return 0xff0f94ed;
|
|
|
|
}
|
|
|
|
return arrColors[getColorIndex(id)];
|
|
|
|
}
|
|
|
|
|
|
|
|
public static int getUserAvatarForId(int id) {
|
|
|
|
if (id / 1000 == 333 || id / 1000 == 777) {
|
|
|
|
return R.drawable.telegram_avatar;
|
|
|
|
}
|
|
|
|
return arrUsersAvatars[getColorIndex(id)];
|
|
|
|
}
|
|
|
|
|
|
|
|
public static int getGroupAvatarForId(int id) {
|
|
|
|
return arrGroupsAvatars[getColorIndex(-Math.abs(id))];
|
|
|
|
}
|
|
|
|
|
|
|
|
public static int getBroadcastAvatarForId(int id) {
|
|
|
|
return arrBroadcastAvatars[getColorIndex(-Math.abs(id))];
|
|
|
|
}
|
2014-07-03 00:39:05 +02:00
|
|
|
}
|