package adonai.diary_browser; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.content.res.Resources; import android.util.DisplayMetrics; import com.afollestad.materialdialogs.AlertDialogWrapper; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringWriter; import adonai.diary_browser.pages.CommentsPage; import adonai.diary_browser.pages.DiaryLinkList; import adonai.diary_browser.pages.DiaryPage; import adonai.diary_browser.pages.DiaryProfilePage; import adonai.diary_browser.pages.DiscussionList; import adonai.diary_browser.pages.SearchPage; import adonai.diary_browser.pages.TagsPage; /** * Класс-свалка полезных функций и констант. * Один большой антипаттерн * * @author не кто иной как Адонай! * * //@TODO разгрести тут всё! */ public class Utils { public static final int FROM_MESSAGE_SENDER = 0; public static final String KEY_USERNAME = "diary.username.key"; public static final String KEY_PASSWORD = "diary.password.key"; public static final String KEY_KEEP_AUTH = "diary.keep.auth"; public static final String KEY_USERPASS_CACHE = "diary.password.cache"; public static final String mPrefsFile = "diary.shared.prefs"; public static final String CLOSING_PANE_BROADCAST = "CLOSING_PANE"; public static final String OPENING_PANE_BROADCAST = "OPENING_PANE"; // Команды хэндлерам static final int HANDLE_AUTHORIZATION_ERROR = 1; static final int HANDLE_AUTHORIZE = 2; static final int HANDLE_GET_LIST_PAGE_DATA = 3; static final int HANDLE_GET_WEB_PAGE_DATA = 4; static final int HANDLE_PICK_URL = 5; static final int HANDLE_GET_DISCUSSIONS_DATA = 6; static final int HANDLE_GET_DISCUSSION_LIST_DATA = 7; static final int HANDLE_JUST_DO_GET = 8; static final int HANDLE_DELETE_POST = 9; static final int HANDLE_EDIT_POST = 10; static final int HANDLE_DELETE_COMMENT = 11; static final int HANDLE_EDIT_COMMENT = 12; static final int HANDLE_UPLOAD_FILE = 13; static final int HANDLE_UPLOAD_MUSIC = 14; static final int HANDLE_UPLOAD_GIF = 15; static final int HANDLE_PRELOAD_THEMES = 16; static final int HANDLE_REPOST = 17; static final int HANDLE_QUERY_ONLINE = 18; static final int HANDLE_DELETE_POST_DRAFT = 19; static final int HANDLE_DELETE_TAG = 20; static final int HANDLE_REQUEST_DIARY = 21; // Команды хэндлеру вида static final int HANDLE_IMAGE_CLICK = 101; static final int HANDLE_UPDATE_HEADERS = 102; static final int HANDLE_NAME_CLICK = 103; // команды U-mail static final int HANDLE_OPEN_FOLDER = 301; static final int HANDLE_OPEN_MAIL = 302; static final int HANDLE_DELETE_UMAILS = 303; static final int HANDLE_PRELOAD_UMAIL = 304; static final int HANDLE_START = 401; static final int HANDLE_SERVICE_UPDATE = 402; static final int HANDLE_PROGRESS = 403; static final int HANDLE_PROGRESS_2 = 404; static final int HANDLE_CONNECTIVITY_ERROR = 405; static final int HANDLE_SERVICE_ERROR = 406; static final int HANDLE_NOTFOUND_ERROR = 407; static final int HACKING_CLOUDFLARE = 408; static final int HANDLE_STEP_SEQUENCE = 409; static final int UMAIL_REPLY = 0; static final int UMAIL_FORWARD = 1; static final int ACTIVITY_ACTION_REQUEST_IMAGE = 0; static final int ACTIVITY_ACTION_REQUEST_MUSIC = 1; static final int ACTIVITY_ACTION_REQUEST_GIF = 2; public static final String MAIN_PAGE = "http://www.diary.ru"; public static final String LOGIN_PAGE = "http://www.diary.ru/login.php"; public static final String REGISTER_PAGE = "http://www.diary.ru/registration/"; public static final String DISCUSSIONS_PAGE = "http://www.diary.ru/discussion/"; public static final String FAVORITES_PAGE = "http://www.diary.ru/list/?act=show&fgroup_id=0"; public static final String SUBSCRIBERS_PAGE = "http://www.diary.ru/list/?act=show&fgroup_id=-1"; static String javascriptContent = "<script type=\"text/javascript\" src=\"file:///android_asset/javascript/journal.js\"> </script>" + "<script type=\"text/javascript\" src=\"file:///android_asset/javascript/diary_client.js\"> </script>" + "<script type=\"text/javascript\" src=\"file:///android_asset/javascript/from_pages.js\"> </script>" + "<script type=\"text/javascript\" src=\"file:///android_asset/javascript/functions.js\"> </script>" + "<script type=\"text/javascript\" src=\"file:///android_asset/javascript/journal2.js\"> </script>"; static final String IMGUR_CLIENT_AUTH = "Client-ID 860dc14aa7caf25"; static final String IMGUR_API_ENDPOINT = "https://api.imgur.com/3/"; static Class<?> checkDiaryUrl(String response) { if (response.contains("class=\"tags_ul_all\"")) return TagsPage.class; if (response.contains("id=\"addCommentArea\"") || response.contains("id=\"commentsArea\"")) return CommentsPage.class; if (response.contains("id=\"postsArea\"")) return DiaryPage.class; if (response.contains("class=\"table r\"")) return DiaryLinkList.class; if (response.contains("name=\"membershiplist\"") || response.contains("Профиль пользователя")) return DiaryProfilePage.class; if (response.contains("id=\"all_bits\"")) return DiscussionList.class; if (response.contains("Поиск по дневникам") && response.contains("Что искать:")) return SearchPage.class; return null; // not found } static void showDevelSorry(Context ctx) { AlertDialogWrapper.Builder dlg = new AlertDialogWrapper.Builder(ctx); dlg.setTitle("Sorry :("); dlg.setMessage("This object is under development now, please, have a patience! ^_^"); dlg.create().show(); } /** * This method converts dp unit to equivalent pixels, depending on device density. * * @param dp A value in dp (density independent pixels) unit. Which we need to convert into pixels * @param context Context to get resources and device specific display metrics * @return A float value to represent px equivalent to dp depending on device density */ public static float convertDpToPixel(float dp, Context context) { final Resources resources = context.getResources(); final DisplayMetrics metrics = resources.getDisplayMetrics(); return dp * (metrics.densityDpi / 160f); } /** * This method converts device specific pixels to density independent pixels. * * @param px A value in px (pixels) unit. Which we need to convert into db * @param context Context to get resources and device specific display metrics * @return A float value to represent dp equivalent to px value */ public static float convertPixelsToDp(float px, Context context) { final Resources resources = context.getResources(); final DisplayMetrics metrics = resources.getDisplayMetrics(); return px / (metrics.densityDpi / 160f); } public static void setupTheme(Activity activity) { // ставим тему до инстанцирования любых View SharedPreferences prefs = activity.getSharedPreferences(Utils.mPrefsFile, Context.MODE_PRIVATE); final String theme = prefs.getString("app.theme", "red"); switch (theme) { case "red": activity.setTheme(R.style.DiaryThemeRed); break; case "light": activity.setTheme(R.style.DiaryThemeLight); break; case "dark": activity.setTheme(R.style.DiaryThemeDark); break; case "lilac": activity.setTheme(R.style.DiaryThemeLilac); break; case "dark_lilac": activity.setTheme(R.style.DiaryThemeDarkLilac); break; case "green": activity.setTheme(R.style.DiaryThemeGreen); break; case "pink": activity.setTheme(R.style.DiaryThemePink); break; case "greeny_brown": activity.setTheme(R.style.DiaryThemeGreenyBrown); break; } } public static String getStringFromInputStream(InputStream stream) throws IOException { int n = 0; char[] buffer = new char[1024 * 4]; InputStreamReader reader = new InputStreamReader(stream, "UTF-8"); StringWriter writer = new StringWriter(); while ((n = reader.read(buffer)) != -1) { writer.write(buffer, 0, n); } return writer.toString(); } }