| /* |
| * Copyright (C) 2017 The Android Open Source Project |
| * Copyright (C) 2023 The LineageOS Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.dialer.calllogutils; |
| |
| import android.content.Context; |
| import android.content.res.Resources; |
| import android.text.format.Formatter; |
| |
| import com.android.dialer.util.DialerUtils; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.concurrent.TimeUnit; |
| |
| /** Utility class for formatting duration and data usage in call log entries. */ |
| public class CallLogDurations { |
| |
| private static CharSequence formatDuration(Context context, long elapsedSeconds) { |
| // Getting this method into a good state took a bunch of work between eng, i18n team and |
| // translators. If at all possible, the strings should not be changed or updated. |
| long minutes = TimeUnit.SECONDS.toMinutes(elapsedSeconds); |
| long seconds = elapsedSeconds - TimeUnit.MINUTES.toSeconds(minutes); |
| Resources res = context.getResources(); |
| String formatPattern; |
| if (elapsedSeconds >= 60) { |
| String minutesString = res.getString(R.string.call_details_minutes_abbreviation); |
| String secondsString = res.getString(R.string.call_details_seconds_abbreviation); |
| // example output: "1m 1s" |
| formatPattern = |
| context.getString( |
| R.string.call_duration_format_pattern, |
| Long.toString(minutes), |
| minutesString, |
| Long.toString(seconds), |
| secondsString); |
| } else { |
| String secondsString = res.getString(R.string.call_details_seconds_abbreviation); |
| // example output: "1s" |
| formatPattern = |
| context.getString( |
| R.string.call_duration_short_format_pattern, Long.toString(seconds), secondsString); |
| } |
| |
| // Since we don't want to update the strings.xml, we need to remove the quotations from the |
| // previous implementation. |
| return formatPattern.replace("\'", ""); |
| } |
| |
| private static CharSequence formatDurationA11y(Context context, long elapsedSeconds) { |
| Resources res = context.getResources(); |
| if (elapsedSeconds >= 60) { |
| int minutes = (int) (elapsedSeconds / 60); |
| int seconds = (int) elapsedSeconds - minutes * 60; |
| String minutesString = res.getQuantityString(R.plurals.a11y_minutes, minutes); |
| String secondsString = res.getQuantityString(R.plurals.a11y_seconds, seconds); |
| // example output: "1 minute 1 second", "2 minutes 2 seconds", ect. |
| return context.getString( |
| R.string.a11y_call_duration_format, minutes, minutesString, seconds, secondsString); |
| } else { |
| String secondsString = res.getQuantityString(R.plurals.a11y_seconds, (int) elapsedSeconds); |
| // example output: "1 second", "2 seconds" |
| return context.getString( |
| R.string.a11y_call_duration_short_format, elapsedSeconds, secondsString); |
| } |
| } |
| |
| /** |
| * Formats a string containing the call duration and the data usage (if specified). |
| * |
| * @param elapsedSeconds Total elapsed seconds. |
| * @param dataUsage Data usage in bytes, or null if not specified. |
| * @return String containing call duration and data usage. |
| */ |
| public static CharSequence formatDurationAndDataUsage( |
| Context context, long elapsedSeconds, long dataUsage) { |
| return formatDurationAndDataUsageInternal( |
| context, formatDuration(context, elapsedSeconds), dataUsage); |
| } |
| |
| /** |
| * Formats a string containing the call duration and the data usage (if specified) for TalkBack. |
| * |
| * @param elapsedSeconds Total elapsed seconds. |
| * @param dataUsage Data usage in bytes, or null if not specified. |
| * @return String containing call duration and data usage. |
| */ |
| public static CharSequence formatDurationAndDataUsageA11y( |
| Context context, long elapsedSeconds, long dataUsage) { |
| return formatDurationAndDataUsageInternal( |
| context, formatDurationA11y(context, elapsedSeconds), dataUsage); |
| } |
| |
| private static CharSequence formatDurationAndDataUsageInternal( |
| Context context, CharSequence duration, long dataUsage) { |
| List<CharSequence> durationItems = new ArrayList<>(); |
| if (dataUsage > 0) { |
| durationItems.add(duration); |
| durationItems.add(Formatter.formatShortFileSize(context, dataUsage)); |
| return DialerUtils.join(durationItems); |
| } else { |
| return duration; |
| } |
| } |
| } |