mirror of
https://github.com/ArcaneChat/android.git
synced 2026-07-03 14:05:24 +02:00
179 lines
6.7 KiB
Java
179 lines
6.7 KiB
Java
/*******************************************************************************
|
|
*
|
|
* Delta Chat Android
|
|
* (C) 2017 Björn Petersen
|
|
* Contact: r10s@b44t.com, http://b44t.com
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify it under
|
|
* the terms of the GNU General Public License as published by the Free Software
|
|
* Foundation, either version 3 of the License, or (at your option) any later
|
|
* version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with
|
|
* this program. If not, see http://www.gnu.org/licenses/ .
|
|
*
|
|
******************************************************************************/
|
|
|
|
|
|
package com.b44t.messenger;
|
|
|
|
import android.content.res.Configuration;
|
|
import android.os.Build;
|
|
import android.text.format.DateFormat;
|
|
import android.view.View;
|
|
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.Calendar;
|
|
import java.util.Date;
|
|
import java.util.Locale;
|
|
|
|
public class LocaleController {
|
|
|
|
public static boolean isRTL = false;
|
|
|
|
private SimpleDateFormat getFormatter(int resId)
|
|
{
|
|
// do not cache the instances as SimpleDateFormat is not thread safe
|
|
try {
|
|
return new SimpleDateFormat(ApplicationLoader.applicationContext.getString(resId), Locale.getDefault());
|
|
}
|
|
catch (Exception e) {
|
|
// a fallback if the translated resource contains bad data
|
|
return new SimpleDateFormat("dd/MM/yyyy HH:mm", Locale.US);
|
|
}
|
|
}
|
|
|
|
private SimpleDateFormat getFormatterChatDate()
|
|
{
|
|
return getFormatter(R.string.chatDate);
|
|
}
|
|
|
|
private SimpleDateFormat getFormatterChatFullDate()
|
|
{
|
|
return getFormatter(R.string.chatFullDate);
|
|
}
|
|
|
|
private SimpleDateFormat getFormatterWeek()
|
|
{
|
|
return getFormatter(R.string.formatterWeek);
|
|
}
|
|
|
|
private SimpleDateFormat getFormatterMonth()
|
|
{
|
|
return getFormatter(R.string.formatterMonth);
|
|
}
|
|
|
|
public SimpleDateFormat getFormatterYear()
|
|
{
|
|
return getFormatter(R.string.formatterYear);
|
|
}
|
|
|
|
public SimpleDateFormat getFormatterDay()
|
|
{
|
|
boolean is24HourFormat = DateFormat.is24HourFormat(ApplicationLoader.applicationContext);
|
|
return getFormatter(is24HourFormat? R.string.formatterDay24H : R.string.formatterDay12H);
|
|
}
|
|
|
|
private static volatile LocaleController Instance = null;
|
|
public static LocaleController getInstance() {
|
|
LocaleController localInstance = Instance;
|
|
if (localInstance == null) {
|
|
synchronized (LocaleController.class) {
|
|
localInstance = Instance;
|
|
if (localInstance == null) {
|
|
Instance = localInstance = new LocaleController();
|
|
}
|
|
}
|
|
}
|
|
return localInstance;
|
|
}
|
|
|
|
public LocaleController() {
|
|
checkRTL();
|
|
}
|
|
|
|
public void rebuildUiParts()
|
|
{
|
|
// While android makes sure, the activities are re-translated on locale changes, this is
|
|
// not done for the permanent notification "Connected to foo@bar - Waiting for messages ..."
|
|
// To re-translate this, it is needed to update the notification (which is a good idea as the
|
|
// notification is really permanent and would stuck in the wrong language for weeks otherwise ...)
|
|
KeepAliveService kas = KeepAliveService.getInstance();
|
|
if( kas != null ) {
|
|
kas.updateForegroundNotification();
|
|
}
|
|
}
|
|
|
|
public void onDeviceConfigurationChange(Configuration newConfig) {
|
|
// rebuild some UI parts after a language change:
|
|
// - the permanent notification (Waiting for messages ...) - notfifications are not re-translated after a locale change. This cannot be done without listening to the language-change-envent.
|
|
// - some formatters and other cached values, maybe this can be done in other ways, however, it's just working.
|
|
Locale newLocale = Locale.getDefault();
|
|
if( newLocale!=null ) { // onDeviceConfigurationChange() is also called on screen orientation changes; do not rebuild the locale stuff in these cases
|
|
checkRTL();
|
|
rebuildUiParts(); // this is really needed, see comment in rebuildUiParts()
|
|
}
|
|
}
|
|
|
|
public static String formatDateChat(long date) {
|
|
try {
|
|
Calendar rightNow = Calendar.getInstance();
|
|
int year = rightNow.get(Calendar.YEAR);
|
|
|
|
rightNow.setTimeInMillis(date * 1000);
|
|
int dateYear = rightNow.get(Calendar.YEAR);
|
|
|
|
if (year == dateYear) {
|
|
return getInstance().getFormatterChatDate().format(date * 1000);
|
|
}
|
|
return getInstance().getFormatterChatFullDate().format(date * 1000);
|
|
} catch (Exception e) {
|
|
|
|
}
|
|
return "LOC_ERR: formatDateChat";
|
|
}
|
|
|
|
private void checkRTL() {
|
|
isRTL = false;
|
|
if (Build.VERSION.SDK_INT >= 17) {
|
|
// ViewCompat.getLayoutDirection() can also be used, however, this function always returns LTR for SDK < 17, too, but requires a additinal view handle
|
|
Configuration config = ApplicationLoader.applicationContext.getResources().getConfiguration();
|
|
if(config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
|
|
isRTL = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static String dateForChatlist(long date) {
|
|
try {
|
|
Calendar rightNow = Calendar.getInstance();
|
|
int day = rightNow.get(Calendar.DAY_OF_YEAR);
|
|
int year = rightNow.get(Calendar.YEAR);
|
|
rightNow.setTimeInMillis(date * 1000);
|
|
int dateDay = rightNow.get(Calendar.DAY_OF_YEAR);
|
|
int dateYear = rightNow.get(Calendar.YEAR);
|
|
|
|
if (year != dateYear) {
|
|
return getInstance().getFormatterYear().format(new Date(date * 1000));
|
|
} else {
|
|
int dayDiff = dateDay - day;
|
|
if(dayDiff == 0 || dayDiff == -1 && (int)(System.currentTimeMillis() / 1000) - date < 60 * 60 * 8) {
|
|
return getInstance().getFormatterDay().format(new Date(date * 1000));
|
|
} else if(dayDiff > -7 && dayDiff <= -1) {
|
|
return getInstance().getFormatterWeek().format(new Date(date * 1000));
|
|
} else {
|
|
return getInstance().getFormatterMonth().format(new Date(date * 1000));
|
|
}
|
|
}
|
|
} catch (Exception e) {
|
|
|
|
}
|
|
return "LOC_ERR";
|
|
}
|
|
}
|