1ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi/* 2ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Copyright (C) 2009 The Android Open Source Project 3ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 4ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Licensed under the Apache License, Version 2.0 (the "License"); 5ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * you may not use this file except in compliance with the License. 6ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * You may obtain a copy of the License at 7ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 8ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * http://www.apache.org/licenses/LICENSE-2.0 9ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 10ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Unless required by applicable law or agreed to in writing, software 11ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * distributed under the License is distributed on an "AS IS" BASIS, 12ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * See the License for the specific language governing permissions and 14ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * limitations under the License. 15ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 16ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1781393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschipackage com.android.videoeditor.util; 18ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 19ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport java.util.Random; 20ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2181393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.R; 22ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 23ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.content.Context; 24ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.graphics.Paint; 25ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 26ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi/** 27ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * String utilities 28ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 29ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschipublic class StringUtils { 30ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 31ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Pseudo-random number generator object for use with randomString(). The 32ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Random class is not considered to be cryptographically secure, so only 33ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * use these random Strings for low to medium security applications. 34ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 35ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private static Random sRandGen = new Random(); 36ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 37ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 38ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Array of numbers and letters. Numbers appear in the list 39ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * twice so that there is a more equal chance that a number will be picked. 40ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * We can use the array to get a random number or letter by picking a random 41ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * array index. 42ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 43ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private static char[] sNumbersAndLetters = 44ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ("0123456789abcdefghijklmnopqrstuvwxyz0123456789").toCharArray(); 45ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 46ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 47ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Array of numbers. 48ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 49ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private static char[] sNumbers = ("0123456789").toCharArray(); 50ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 51ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 52ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * This class cannot be instantiated 53ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 54ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private StringUtils() { 55ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 56ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 57ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 58ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Returns a random String of numbers and letters (lower and upper case) of 59ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * the specified length. The method uses the Random class that is built-in 60ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * to Java which is suitable for low to medium grade security uses. This 61ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * means that the output is only pseudo random, i.e., each number is 62ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * mathematically generated so is not truly random. 63ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * <p> 64ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * The specified length must be at least one. If not, the method will return null. 65ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 66ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param length the desired length of the random String to return. 67ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @return a random String of numbers and letters of the specified length. 68ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 69ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public static String randomString(int length) { 70ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (length < 1) { 71ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return null; 72ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 73ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Create a char buffer to put random letters and numbers in. 74ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final char[] randBuffer = new char[length]; 75ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi for (int i = 0; i < randBuffer.length; i++) { 76ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi randBuffer[i] = sNumbersAndLetters[sRandGen.nextInt(sNumbersAndLetters.length - 1)]; 77ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 78ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 79ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return new String(randBuffer); 80ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 81ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 82ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 83ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Returns a random String of numbers of the specified length. 84ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * This means that the output is only pseudo random, i.e., each number is 85ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * mathematically generated so is not truly random. 86ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * <p> 87ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * The specified length must be at least one. If not, the method will return null. 88ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 89ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param length the desired length of the random String to return. 90ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @return a random String of numbers of the specified length. 91ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 92ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public static String randomStringOfNumbers(int length) { 93ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (length < 1) { 94ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return null; 95ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 96ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Create a char buffer to put random letters and numbers in. 97ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final char[] randBuffer = new char[length]; 98ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi for (int i = 0; i < randBuffer.length; i++) { 99ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi randBuffer[i] = sNumbers[sRandGen.nextInt(sNumbers.length - 1)]; 100ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 101ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return new String(randBuffer); 102ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 103ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 104ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 105ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Get a readable string displaying the time 106ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 107ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param context The context (needed only for relative time) 108ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param time The time 109ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 110ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @return The time string 111ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 112ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public static String getTimestampAsString(Context context, long time) { 113ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final long hours = time / 3600000; 114ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi time %= 3600000; 115ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final long mins = time / 60000; 116ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi time %= 60000; 117ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final long sec = time / 1000; 118ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi time %= 1000; 119ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi time /= 100; 120ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return String.format("%02d:%02d:%02d.%01d", hours, mins, sec, time); 121ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 122ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 123ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 124ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Get a readable string displaying the time 125ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 126ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param context The context (needed only for relative time) 127ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param time The time 128ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 129ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @return The time string 130ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 131ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public static String getSimpleTimestampAsString(Context context, long time) { 132ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final long hours = time / 3600000; 133ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi time %= 3600000; 134ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final long mins = time / 60000; 135ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi time %= 60000; 136ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final long sec = time / 1000; 137ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return String.format("%02d:%02d:%02d", hours, mins, sec); 138ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 139ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 140ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 141ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Get a readable string displaying the time 142ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 143ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param context The context (needed only for relative time) 144ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param time The time 145ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 146ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @return The time string 147ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 148ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public static String getDurationAsString(Context context, long time) { 149ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final long hours = time / 3600000; 150ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi time %= 3600000; 151ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final long mins = time / 60000; 152ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi time %= 60000; 153ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final long sec = time / 1000; 154ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 155ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (hours == 0) { 156ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mins == 0) { 157ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return String.format(context.getString(R.string.seconds), sec); 158ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else if (mins == 1) { 159ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return String.format(context.getString(R.string.minute_and_seconds), sec); 160ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else { 161ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return String.format(context.getString(R.string.minutes), mins); 162ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 163ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else if (hours == 1) { 164ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return String.format(context.getString(R.string.hour_and_minutes), mins); 165ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else { 166ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return String.format(context.getString(R.string.hours_and_minutes), hours, mins); 167ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 168ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 169ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 170ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 171ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Trim text to a maximum size 172ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 173ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param text The text 174ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param p The paint 175ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param maxSize The maximum size 176ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 177ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @return The text 178ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 179ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public static String trimText(String text, Paint p, int maxSize) { 180ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final int textSize = (int)p.measureText(text); 181ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (textSize > maxSize) { 182ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final int chars = p.breakText(text, true, maxSize - 12, null); 183ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi text = text.substring(0, chars); 184ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi text += "..."; 185ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 186ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 187ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return text; 188ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 189ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi} 190