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