();
- private ContentHandler handler = null;
- private boolean raw = false;
- private boolean prematureEof = false;
-
- static {
- fieldChars = new BitSet();
- for (int i = 0x21; i <= 0x39; i++) {
- fieldChars.set(i);
- }
- for (int i = 0x3b; i <= 0x7e; i++) {
- fieldChars.set(i);
- }
- }
-
- /**
- * Creates a new MimeStreamParser
instance.
- */
- public MimeStreamParser() {
- }
-
- /**
- * Parses a stream of bytes containing a MIME message.
- *
- * @param is the stream to parse.
- * @throws IOException on I/O errors.
- */
- public void parse(InputStream is) throws IOException {
- rootStream = new RootInputStream(is);
- parseMessage(rootStream);
- }
-
- /**
- * Determines if this parser is currently in raw mode.
- *
- * @return true
if in raw mode, false
- * otherwise.
- * @see #setRaw(boolean)
- */
- public boolean isRaw() {
- return raw;
- }
-
- /**
- * Enables or disables raw mode. In raw mode all future entities
- * (messages or body parts) in the stream will be reported to the
- * {@link ContentHandler#raw(InputStream)} handler method only.
- * The stream will contain the entire unparsed entity contents
- * including header fields and whatever is in the body.
- *
- * @param raw true
enables raw mode, false
- * disables it.
- */
- public void setRaw(boolean raw) {
- this.raw = raw;
- }
-
- /**
- * Finishes the parsing and stops reading lines.
- * NOTE: No more lines will be parsed but the parser
- * will still call
- * {@link ContentHandler#endMultipart()},
- * {@link ContentHandler#endBodyPart()},
- * {@link ContentHandler#endMessage()}, etc to match previous calls
- * to
- * {@link ContentHandler#startMultipart(BodyDescriptor)},
- * {@link ContentHandler#startBodyPart()},
- * {@link ContentHandler#startMessage()}, etc.
- */
- public void stop() {
- rootStream.truncate();
- }
-
- /**
- * Parses an entity which consists of a header followed by a body containing
- * arbitrary data, body parts or an embedded message.
- *
- * @param is the stream to parse.
- * @throws IOException on I/O errors.
- */
- private void parseEntity(InputStream is) throws IOException {
- BodyDescriptor bd = parseHeader(is);
-
- if (bd.isMultipart()) {
- bodyDescriptors.addFirst(bd);
-
- handler.startMultipart(bd);
-
- MimeBoundaryInputStream tempIs =
- new MimeBoundaryInputStream(is, bd.getBoundary());
- handler.preamble(new CloseShieldInputStream(tempIs));
- tempIs.consume();
-
- while (tempIs.hasMoreParts()) {
- tempIs = new MimeBoundaryInputStream(is, bd.getBoundary());
- parseBodyPart(tempIs);
- tempIs.consume();
- if (tempIs.parentEOF()) {
- prematureEof = true;
-// if (log.isWarnEnabled()) {
-// log.warn("Line " + rootStream.getLineNumber()
-// + ": Body part ended prematurely. "
-// + "Higher level boundary detected or "
-// + "EOF reached.");
-// }
- break;
- }
- }
-
- handler.epilogue(new CloseShieldInputStream(is));
-
- handler.endMultipart();
-
- bodyDescriptors.removeFirst();
-
- } else if (bd.isMessage()) {
- if (bd.isBase64Encoded()) {
- log.warn("base64 encoded message/rfc822 detected");
- is = new EOLConvertingInputStream(
- new Base64InputStream(is));
- } else if (bd.isQuotedPrintableEncoded()) {
- log.warn("quoted-printable encoded message/rfc822 detected");
- is = new EOLConvertingInputStream(
- new QuotedPrintableInputStream(is));
- }
- bodyDescriptors.addFirst(bd);
- parseMessage(is);
- bodyDescriptors.removeFirst();
- } else {
- handler.body(bd, new CloseShieldInputStream(is));
- }
-
- /*
- * Make sure the stream has been consumed.
- */
- while (is.read() != -1) {
- }
- }
-
- private void parseMessage(InputStream is) throws IOException {
- if (raw) {
- handler.raw(new CloseShieldInputStream(is));
- } else {
- handler.startMessage();
- parseEntity(is);
- handler.endMessage();
- }
- }
-
- public boolean getPrematureEof() {
- return prematureEof;
- }
-
- private void parseBodyPart(InputStream is) throws IOException {
- if (raw) {
- handler.raw(new CloseShieldInputStream(is));
- } else {
- handler.startBodyPart();
- parseEntity(is);
- handler.endBodyPart();
- }
- }
-
- /**
- * Parses a header.
- *
- * @param is the stream to parse.
- * @return a BodyDescriptor
describing the body following
- * the header.
- */
- private BodyDescriptor parseHeader(InputStream is) throws IOException {
- BodyDescriptor bd = new BodyDescriptor(bodyDescriptors.isEmpty()
- ? null : (BodyDescriptor) bodyDescriptors.getFirst());
-
- handler.startHeader();
-
- int lineNumber = rootStream.getLineNumber();
-
- StringBuffer sb = new StringBuffer();
- int curr = 0;
- int prev = 0;
- while ((curr = is.read()) != -1) {
- if (curr == '\n' && (prev == '\n' || prev == 0)) {
- /*
- * [\r]\n[\r]\n or an immediate \r\n have been seen.
- */
- sb.deleteCharAt(sb.length() - 1);
- break;
- }
- sb.append((char) curr);
- prev = curr == '\r' ? prev : curr;
- }
-
-// if (curr == -1 && log.isWarnEnabled()) {
-// log.warn("Line " + rootStream.getLineNumber()
-// + ": Unexpected end of headers detected. "
-// + "Boundary detected in header or EOF reached.");
-// }
-
- int start = 0;
- int pos = 0;
- int startLineNumber = lineNumber;
- while (pos < sb.length()) {
- while (pos < sb.length() && sb.charAt(pos) != '\r') {
- pos++;
- }
- if (pos < sb.length() - 1 && sb.charAt(pos + 1) != '\n') {
- pos++;
- continue;
- }
-
- if (pos >= sb.length() - 2 || fieldChars.get(sb.charAt(pos + 2))) {
-
- /*
- * field should be the complete field data excluding the
- * trailing \r\n.
- */
- String field = sb.substring(start, pos);
- start = pos + 2;
-
- /*
- * Check for a valid field.
- */
- int index = field.indexOf(':');
- boolean valid = false;
- if (index != -1 && fieldChars.get(field.charAt(0))) {
- valid = true;
- String fieldName = field.substring(0, index).trim();
- for (int i = 0; i < fieldName.length(); i++) {
- if (!fieldChars.get(fieldName.charAt(i))) {
- valid = false;
- break;
- }
- }
-
- if (valid) {
- handler.field(field);
- bd.addField(fieldName, field.substring(index + 1));
- }
- }
-
- if (!valid && log.isWarnEnabled()) {
- log.warn("Line " + startLineNumber
- + ": Ignoring invalid field: '" + field.trim() + "'");
- }
-
- startLineNumber = lineNumber;
- }
-
- pos += 2;
- lineNumber++;
- }
-
- handler.endHeader();
-
- return bd;
- }
-
- /**
- * Sets the ContentHandler
to use when reporting
- * parsing events.
- *
- * @param h the ContentHandler
.
- */
- public void setContentHandler(ContentHandler h) {
- this.handler = h;
- }
-
-}
\ No newline at end of file
diff --git a/apache/org/apache/james/mime4j/RootInputStream.java b/apache/org/apache/james/mime4j/RootInputStream.java
deleted file mode 100644
index cc8b2411c..000000000
--- a/apache/org/apache/james/mime4j/RootInputStream.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * InputStream
used by the parser to wrap the original user
- * supplied stream. This stream keeps track of the current line number and
- * can also be truncated. When truncated the stream will appear to have
- * reached end of file. This is used by the parser's
- * {@link org.apache.james.mime4j.MimeStreamParser#stop()} method.
- *
- *
- * @version $Id: RootInputStream.java,v 1.2 2004/10/02 12:41:10 ntherning Exp $
- */
-class RootInputStream extends InputStream {
- private InputStream is = null;
- private int lineNumber = 1;
- private int prev = -1;
- private boolean truncated = false;
-
- /**
- * Creates a new RootInputStream
.
- *
- * @param in the stream to read from.
- */
- public RootInputStream(InputStream is) {
- this.is = is;
- }
-
- /**
- * Gets the current line number starting at 1
- * (the number of \r\n
read so far plus 1).
- *
- * @return the current line number.
- */
- public int getLineNumber() {
- return lineNumber;
- }
-
- /**
- * Truncates this InputStream
. After this call any
- * call to {@link #read()}, {@link #read(byte[]) or
- * {@link #read(byte[], int, int)} will return
- * -1 as if end-of-file had been reached.
- */
- public void truncate() {
- this.truncated = true;
- }
-
- /**
- * @see java.io.InputStream#read()
- */
- public int read() throws IOException {
- if (truncated) {
- return -1;
- }
-
- int b = is.read();
- if (prev == '\r' && b == '\n') {
- lineNumber++;
- }
- prev = b;
- return b;
- }
-
- /**
- *
- * @see java.io.InputStream#read(byte[], int, int)
- */
- public int read(byte[] b, int off, int len) throws IOException {
- if (truncated) {
- return -1;
- }
-
- int n = is.read(b, off, len);
- for (int i = off; i < off + n; i++) {
- if (prev == '\r' && b[i] == '\n') {
- lineNumber++;
- }
- prev = b[i];
- }
- return n;
- }
-
- /**
- * @see java.io.InputStream#read(byte[])
- */
- public int read(byte[] b) throws IOException {
- return read(b, 0, b.length);
- }
-}
\ No newline at end of file
diff --git a/apache/org/apache/james/mime4j/codec/EncoderUtil.java b/apache/org/apache/james/mime4j/codec/EncoderUtil.java
deleted file mode 100644
index 6841bc998..000000000
--- a/apache/org/apache/james/mime4j/codec/EncoderUtil.java
+++ /dev/null
@@ -1,630 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.codec;
-
-import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
-import java.util.BitSet;
-import java.util.Locale;
-
-import org.apache.james.mime4j.util.CharsetUtil;
-
-/**
- * ANDROID: THIS CLASS IS COPIED FROM A NEWER VERSION OF MIME4J
- */
-
-/**
- * Static methods for encoding header field values. This includes encoded-words
- * as defined in RFC 2047
- * or display-names of an e-mail address, for example.
- *
- */
-public class EncoderUtil {
-
- // This array is a lookup table that translates 6-bit positive integer index
- // values into their "Base64 Alphabet" equivalents as specified in Table 1
- // of RFC 2045.
- // ANDROID: THIS TABLE IS COPIED FROM BASE64OUTPUTSTREAM
- static final byte[] BASE64_TABLE = { 'A', 'B', 'C', 'D', 'E', 'F',
- 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
- 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
- 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
- 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5',
- '6', '7', '8', '9', '+', '/' };
-
- // Byte used to pad output.
- private static final byte BASE64_PAD = '=';
-
- private static final BitSet Q_REGULAR_CHARS = initChars("=_?");
-
- private static final BitSet Q_RESTRICTED_CHARS = initChars("=_?\"#$%&'(),.:;<>@[\\]^`{|}~");
-
- private static final int MAX_USED_CHARACTERS = 50;
-
- private static final String ENC_WORD_PREFIX = "=?";
- private static final String ENC_WORD_SUFFIX = "?=";
-
- private static final int ENCODED_WORD_MAX_LENGTH = 75; // RFC 2047
-
- private static final BitSet TOKEN_CHARS = initChars("()<>@,;:\\\"/[]?=");
-
- private static final BitSet ATEXT_CHARS = initChars("()<>@.,;:\\\"[]");
-
- private static BitSet initChars(String specials) {
- BitSet bs = new BitSet(128);
- for (char ch = 33; ch < 127; ch++) {
- if (specials.indexOf(ch) == -1) {
- bs.set(ch);
- }
- }
- return bs;
- }
-
- /**
- * Selects one of the two encodings specified in RFC 2047.
- */
- public enum Encoding {
- /** The B encoding (identical to base64 defined in RFC 2045). */
- B,
- /** The Q encoding (similar to quoted-printable defined in RFC 2045). */
- Q
- }
-
- /**
- * Indicates the intended usage of an encoded word.
- */
- public enum Usage {
- /**
- * Encoded word is used to replace a 'text' token in any Subject or
- * Comments header field.
- */
- TEXT_TOKEN,
- /**
- * Encoded word is used to replace a 'word' entity within a 'phrase',
- * for example, one that precedes an address in a From, To, or Cc
- * header.
- */
- WORD_ENTITY
- }
-
- private EncoderUtil() {
- }
-
- /**
- * Encodes the display-name portion of an address. See RFC 5322 section 3.4
- * and RFC 2047 section
- * 5.3. The specified string should not be folded.
- *
- * @param displayName
- * display-name to encode.
- * @return encoded display-name.
- */
- public static String encodeAddressDisplayName(String displayName) {
- // display-name = phrase
- // phrase = 1*( encoded-word / word )
- // word = atom / quoted-string
- // atom = [CFWS] 1*atext [CFWS]
- // CFWS = comment or folding white space
-
- if (isAtomPhrase(displayName)) {
- return displayName;
- } else if (hasToBeEncoded(displayName, 0)) {
- return encodeEncodedWord(displayName, Usage.WORD_ENTITY);
- } else {
- return quote(displayName);
- }
- }
-
- /**
- * Encodes the local part of an address specification as described in RFC
- * 5322 section 3.4.1. Leading and trailing CFWS should have been removed
- * before calling this method. The specified string should not contain any
- * illegal (control or non-ASCII) characters.
- *
- * @param localPart
- * the local part to encode
- * @return the encoded local part.
- */
- public static String encodeAddressLocalPart(String localPart) {
- // local-part = dot-atom / quoted-string
- // dot-atom = [CFWS] dot-atom-text [CFWS]
- // CFWS = comment or folding white space
-
- if (isDotAtomText(localPart)) {
- return localPart;
- } else {
- return quote(localPart);
- }
- }
-
- /**
- * Encodes the specified strings into a header parameter as described in RFC
- * 2045 section 5.1 and RFC 2183 section 2. The specified strings should not
- * contain any illegal (control or non-ASCII) characters.
- *
- * @param name
- * parameter name.
- * @param value
- * parameter value.
- * @return encoded result.
- */
- public static String encodeHeaderParameter(String name, String value) {
- name = name.toLowerCase(Locale.US);
-
- // value := token / quoted-string
- if (isToken(value)) {
- return name + "=" + value;
- } else {
- return name + "=" + quote(value);
- }
- }
-
- /**
- * Shortcut method that encodes the specified text into an encoded-word if
- * the text has to be encoded.
- *
- * @param text
- * text to encode.
- * @param usage
- * whether the encoded-word is to be used to replace a text token
- * or a word entity (see RFC 822).
- * @param usedCharacters
- * number of characters already used up (0 <= usedCharacters <= 50
).
- * @return the specified text if encoding is not necessary or an encoded
- * word or a sequence of encoded words otherwise.
- */
- public static String encodeIfNecessary(String text, Usage usage,
- int usedCharacters) {
- if (hasToBeEncoded(text, usedCharacters))
- return encodeEncodedWord(text, usage, usedCharacters);
- else
- return text;
- }
-
- /**
- * Determines if the specified string has to encoded into an encoded-word.
- * Returns true
if the text contains characters that don't
- * fall into the printable ASCII character set or if the text contains a
- * 'word' (sequence of non-whitespace characters) longer than 77 characters
- * (including characters already used up in the line).
- *
- * @param text
- * text to analyze.
- * @param usedCharacters
- * number of characters already used up (0 <= usedCharacters <= 50
).
- * @return true
if the specified text has to be encoded into
- * an encoded-word, false
otherwise.
- */
- public static boolean hasToBeEncoded(String text, int usedCharacters) {
- if (text == null)
- throw new IllegalArgumentException();
- if (usedCharacters < 0 || usedCharacters > MAX_USED_CHARACTERS)
- throw new IllegalArgumentException();
-
- int nonWhiteSpaceCount = usedCharacters;
-
- for (int idx = 0; idx < text.length(); idx++) {
- char ch = text.charAt(idx);
- if (ch == '\t' || ch == ' ') {
- nonWhiteSpaceCount = 0;
- } else {
- nonWhiteSpaceCount++;
- if (nonWhiteSpaceCount > 77) {
- // Line cannot be folded into multiple lines with no more
- // than 78 characters each. Encoding as encoded-words makes
- // that possible. One character has to be reserved for
- // folding white space; that leaves 77 characters.
- return true;
- }
-
- if (ch < 32 || ch >= 127) {
- // non-printable ascii character has to be encoded
- return true;
- }
- }
- }
-
- return false;
- }
-
- /**
- * Encodes the specified text into an encoded word or a sequence of encoded
- * words separated by space. The text is separated into a sequence of
- * encoded words if it does not fit in a single one.
- *
- * The charset to encode the specified text into a byte array and the
- * encoding to use for the encoded-word are detected automatically.
- *
- * This method assumes that zero characters have already been used up in the
- * current line.
- *
- * @param text
- * text to encode.
- * @param usage
- * whether the encoded-word is to be used to replace a text token
- * or a word entity (see RFC 822).
- * @return the encoded word (or sequence of encoded words if the given text
- * does not fit in a single encoded word).
- * @see #hasToBeEncoded(String, int)
- */
- public static String encodeEncodedWord(String text, Usage usage) {
- return encodeEncodedWord(text, usage, 0, null, null);
- }
-
- /**
- * Encodes the specified text into an encoded word or a sequence of encoded
- * words separated by space. The text is separated into a sequence of
- * encoded words if it does not fit in a single one.
- *
- * The charset to encode the specified text into a byte array and the
- * encoding to use for the encoded-word are detected automatically.
- *
- * @param text
- * text to encode.
- * @param usage
- * whether the encoded-word is to be used to replace a text token
- * or a word entity (see RFC 822).
- * @param usedCharacters
- * number of characters already used up (0 <= usedCharacters <= 50
).
- * @return the encoded word (or sequence of encoded words if the given text
- * does not fit in a single encoded word).
- * @see #hasToBeEncoded(String, int)
- */
- public static String encodeEncodedWord(String text, Usage usage,
- int usedCharacters) {
- return encodeEncodedWord(text, usage, usedCharacters, null, null);
- }
-
- /**
- * Encodes the specified text into an encoded word or a sequence of encoded
- * words separated by space. The text is separated into a sequence of
- * encoded words if it does not fit in a single one.
- *
- * @param text
- * text to encode.
- * @param usage
- * whether the encoded-word is to be used to replace a text token
- * or a word entity (see RFC 822).
- * @param usedCharacters
- * number of characters already used up (0 <= usedCharacters <= 50
).
- * @param charset
- * the Java charset that should be used to encode the specified
- * string into a byte array. A suitable charset is detected
- * automatically if this parameter is null
.
- * @param encoding
- * the encoding to use for the encoded-word (either B or Q). A
- * suitable encoding is automatically chosen if this parameter is
- * null
.
- * @return the encoded word (or sequence of encoded words if the given text
- * does not fit in a single encoded word).
- * @see #hasToBeEncoded(String, int)
- */
- public static String encodeEncodedWord(String text, Usage usage,
- int usedCharacters, Charset charset, Encoding encoding) {
- if (text == null)
- throw new IllegalArgumentException();
- if (usedCharacters < 0 || usedCharacters > MAX_USED_CHARACTERS)
- throw new IllegalArgumentException();
-
- if (charset == null)
- charset = determineCharset(text);
-
- String mimeCharset = CharsetUtil.toMimeCharset(charset.name());
- if (mimeCharset == null) {
- // cannot happen if charset was originally null
- throw new IllegalArgumentException("Unsupported charset");
- }
-
- byte[] bytes = encode(text, charset);
-
- if (encoding == null)
- encoding = determineEncoding(bytes, usage);
-
- if (encoding == Encoding.B) {
- String prefix = ENC_WORD_PREFIX + mimeCharset + "?B?";
- return encodeB(prefix, text, usedCharacters, charset, bytes);
- } else {
- String prefix = ENC_WORD_PREFIX + mimeCharset + "?Q?";
- return encodeQ(prefix, text, usage, usedCharacters, charset, bytes);
- }
- }
-
- /**
- * Encodes the specified byte array using the B encoding defined in RFC
- * 2047.
- *
- * @param bytes
- * byte array to encode.
- * @return encoded string.
- */
- public static String encodeB(byte[] bytes) {
- StringBuilder sb = new StringBuilder();
-
- int idx = 0;
- final int end = bytes.length;
- for (; idx < end - 2; idx += 3) {
- int data = (bytes[idx] & 0xff) << 16 | (bytes[idx + 1] & 0xff) << 8
- | bytes[idx + 2] & 0xff;
- sb.append((char) BASE64_TABLE[data >> 18 & 0x3f]);
- sb.append((char) BASE64_TABLE[data >> 12 & 0x3f]);
- sb.append((char) BASE64_TABLE[data >> 6 & 0x3f]);
- sb.append((char) BASE64_TABLE[data & 0x3f]);
- }
-
- if (idx == end - 2) {
- int data = (bytes[idx] & 0xff) << 16 | (bytes[idx + 1] & 0xff) << 8;
- sb.append((char) BASE64_TABLE[data >> 18 & 0x3f]);
- sb.append((char) BASE64_TABLE[data >> 12 & 0x3f]);
- sb.append((char) BASE64_TABLE[data >> 6 & 0x3f]);
- sb.append((char) BASE64_PAD);
-
- } else if (idx == end - 1) {
- int data = (bytes[idx] & 0xff) << 16;
- sb.append((char) BASE64_TABLE[data >> 18 & 0x3f]);
- sb.append((char) BASE64_TABLE[data >> 12 & 0x3f]);
- sb.append((char) BASE64_PAD);
- sb.append((char) BASE64_PAD);
- }
-
- return sb.toString();
- }
-
- /**
- * Encodes the specified byte array using the Q encoding defined in RFC
- * 2047.
- *
- * @param bytes
- * byte array to encode.
- * @param usage
- * whether the encoded-word is to be used to replace a text token
- * or a word entity (see RFC 822).
- * @return encoded string.
- */
- public static String encodeQ(byte[] bytes, Usage usage) {
- BitSet qChars = usage == Usage.TEXT_TOKEN ? Q_REGULAR_CHARS
- : Q_RESTRICTED_CHARS;
-
- StringBuilder sb = new StringBuilder();
-
- final int end = bytes.length;
- for (int idx = 0; idx < end; idx++) {
- int v = bytes[idx] & 0xff;
- if (v == 32) {
- sb.append('_');
- } else if (!qChars.get(v)) {
- sb.append('=');
- sb.append(hexDigit(v >>> 4));
- sb.append(hexDigit(v & 0xf));
- } else {
- sb.append((char) v);
- }
- }
-
- return sb.toString();
- }
-
- /**
- * Tests whether the specified string is a token as defined in RFC 2045
- * section 5.1.
- *
- * @param str
- * string to test.
- * @return true
if the specified string is a RFC 2045 token,
- * false
otherwise.
- */
- public static boolean isToken(String str) {
- // token := 1*
- // tspecials := "(" / ")" / "<" / ">" / "@" / "," / ";" / ":" / "\" /
- // <"> / "/" / "[" / "]" / "?" / "="
- // CTL := 0.- 31., 127.
-
- final int length = str.length();
- if (length == 0)
- return false;
-
- for (int idx = 0; idx < length; idx++) {
- char ch = str.charAt(idx);
- if (!TOKEN_CHARS.get(ch))
- return false;
- }
-
- return true;
- }
-
- private static boolean isAtomPhrase(String str) {
- // atom = [CFWS] 1*atext [CFWS]
-
- boolean containsAText = false;
-
- final int length = str.length();
- for (int idx = 0; idx < length; idx++) {
- char ch = str.charAt(idx);
- if (ATEXT_CHARS.get(ch)) {
- containsAText = true;
- } else if (!CharsetUtil.isWhitespace(ch)) {
- return false;
- }
- }
-
- return containsAText;
- }
-
- // RFC 5322 section 3.2.3
- private static boolean isDotAtomText(String str) {
- // dot-atom-text = 1*atext *("." 1*atext)
- // atext = ALPHA / DIGIT / "!" / "#" / "$" / "%" / "&" / "'" / "*" /
- // "+" / "-" / "/" / "=" / "?" / "^" / "_" / "`" / "{" / "|" / "}" / "~"
-
- char prev = '.';
-
- final int length = str.length();
- if (length == 0)
- return false;
-
- for (int idx = 0; idx < length; idx++) {
- char ch = str.charAt(idx);
-
- if (ch == '.') {
- if (prev == '.' || idx == length - 1)
- return false;
- } else {
- if (!ATEXT_CHARS.get(ch))
- return false;
- }
-
- prev = ch;
- }
-
- return true;
- }
-
- // RFC 5322 section 3.2.4
- private static String quote(String str) {
- // quoted-string = [CFWS] DQUOTE *([FWS] qcontent) [FWS] DQUOTE [CFWS]
- // qcontent = qtext / quoted-pair
- // qtext = %d33 / %d35-91 / %d93-126
- // quoted-pair = ("\" (VCHAR / WSP))
- // VCHAR = %x21-7E
- // DQUOTE = %x22
-
- String escaped = str.replaceAll("[\\\\\"]", "\\\\$0");
- return "\"" + escaped + "\"";
- }
-
- private static String encodeB(String prefix, String text,
- int usedCharacters, Charset charset, byte[] bytes) {
- int encodedLength = bEncodedLength(bytes);
-
- int totalLength = prefix.length() + encodedLength
- + ENC_WORD_SUFFIX.length();
- if (totalLength <= ENCODED_WORD_MAX_LENGTH - usedCharacters) {
- return prefix + encodeB(bytes) + ENC_WORD_SUFFIX;
- } else {
- int splitOffset = text.offsetByCodePoints(text.length() / 2, -1);
-
- String part1 = text.substring(0, splitOffset);
- byte[] bytes1 = encode(part1, charset);
- String word1 = encodeB(prefix, part1, usedCharacters, charset,
- bytes1);
-
- String part2 = text.substring(splitOffset);
- byte[] bytes2 = encode(part2, charset);
- String word2 = encodeB(prefix, part2, 0, charset, bytes2);
-
- return word1 + " " + word2;
- }
- }
-
- private static int bEncodedLength(byte[] bytes) {
- return (bytes.length + 2) / 3 * 4;
- }
-
- private static String encodeQ(String prefix, String text, Usage usage,
- int usedCharacters, Charset charset, byte[] bytes) {
- int encodedLength = qEncodedLength(bytes, usage);
-
- int totalLength = prefix.length() + encodedLength
- + ENC_WORD_SUFFIX.length();
- if (totalLength <= ENCODED_WORD_MAX_LENGTH - usedCharacters) {
- return prefix + encodeQ(bytes, usage) + ENC_WORD_SUFFIX;
- } else {
- int splitOffset = text.offsetByCodePoints(text.length() / 2, -1);
-
- String part1 = text.substring(0, splitOffset);
- byte[] bytes1 = encode(part1, charset);
- String word1 = encodeQ(prefix, part1, usage, usedCharacters,
- charset, bytes1);
-
- String part2 = text.substring(splitOffset);
- byte[] bytes2 = encode(part2, charset);
- String word2 = encodeQ(prefix, part2, usage, 0, charset, bytes2);
-
- return word1 + " " + word2;
- }
- }
-
- private static int qEncodedLength(byte[] bytes, Usage usage) {
- BitSet qChars = usage == Usage.TEXT_TOKEN ? Q_REGULAR_CHARS
- : Q_RESTRICTED_CHARS;
-
- int count = 0;
-
- for (int idx = 0; idx < bytes.length; idx++) {
- int v = bytes[idx] & 0xff;
- if (v == 32) {
- count++;
- } else if (!qChars.get(v)) {
- count += 3;
- } else {
- count++;
- }
- }
-
- return count;
- }
-
- private static byte[] encode(String text, Charset charset) {
- ByteBuffer buffer = charset.encode(text);
- byte[] bytes = new byte[buffer.limit()];
- buffer.get(bytes);
- return bytes;
- }
-
- private static Charset determineCharset(String text) {
- // it is an important property of iso-8859-1 that it directly maps
- // unicode code points 0000 to 00ff to byte values 00 to ff.
- boolean ascii = true;
- final int len = text.length();
- for (int index = 0; index < len; index++) {
- char ch = text.charAt(index);
- if (ch > 0xff) {
- return CharsetUtil.UTF_8;
- }
- if (ch > 0x7f) {
- ascii = false;
- }
- }
- return ascii ? CharsetUtil.US_ASCII : CharsetUtil.ISO_8859_1;
- }
-
- private static Encoding determineEncoding(byte[] bytes, Usage usage) {
- if (bytes.length == 0)
- return Encoding.Q;
-
- BitSet qChars = usage == Usage.TEXT_TOKEN ? Q_REGULAR_CHARS
- : Q_RESTRICTED_CHARS;
-
- int qEncoded = 0;
- for (int i = 0; i < bytes.length; i++) {
- int v = bytes[i] & 0xff;
- if (v != 32 && !qChars.get(v)) {
- qEncoded++;
- }
- }
-
- int percentage = qEncoded * 100 / bytes.length;
- return percentage > 30 ? Encoding.B : Encoding.Q;
- }
-
- private static char hexDigit(int i) {
- return i < 10 ? (char) (i + '0') : (char) (i - 10 + 'A');
- }
-}
diff --git a/apache/org/apache/james/mime4j/decoder/Base64InputStream.java b/apache/org/apache/james/mime4j/decoder/Base64InputStream.java
deleted file mode 100644
index 77f5d7d4a..000000000
--- a/apache/org/apache/james/mime4j/decoder/Base64InputStream.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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. *
- ****************************************************************/
-
-/**
- * Modified to improve efficiency by Android 21-Aug-2009
- */
-
-package org.apache.james.mime4j.decoder;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Performs Base-64 decoding on an underlying stream.
- *
- *
- * @version $Id: Base64InputStream.java,v 1.3 2004/11/29 13:15:47 ntherning Exp $
- */
-public class Base64InputStream extends InputStream {
- private final InputStream s;
- private int outCount = 0;
- private int outIndex = 0;
- private final int[] outputBuffer = new int[3];
- private final byte[] inputBuffer = new byte[4];
- private boolean done = false;
-
- public Base64InputStream(InputStream s) {
- this.s = s;
- }
-
- /**
- * Closes the underlying stream.
- *
- * @throws IOException on I/O errors.
- */
- @Override
- public void close() throws IOException {
- s.close();
- }
-
- @Override
- public int read() throws IOException {
- if (outIndex == outCount) {
- fillBuffer();
- if (outIndex == outCount) {
- return -1;
- }
- }
-
- return outputBuffer[outIndex++];
- }
-
- /**
- * Retrieve data from the underlying stream, decode it,
- * and put the results in the byteq.
- * @throws IOException
- */
- private void fillBuffer() throws IOException {
- outCount = 0;
- outIndex = 0;
- int inCount = 0;
-
- int i;
- // "done" is needed for the two successive '=' at the end
- while (!done) {
- switch (i = s.read()) {
- case -1:
- // No more input - just return, let outputBuffer drain out, and be done
- return;
- case '=':
- // once we meet the first '=', avoid reading the second '='
- done = true;
- decodeAndEnqueue(inCount);
- return;
- default:
- byte sX = TRANSLATION[i];
- if (sX < 0) continue;
- inputBuffer[inCount++] = sX;
- if (inCount == 4) {
- decodeAndEnqueue(inCount);
- return;
- }
- break;
- }
- }
- }
-
- private void decodeAndEnqueue(int len) {
- int accum = 0;
- accum |= inputBuffer[0] << 18;
- accum |= inputBuffer[1] << 12;
- accum |= inputBuffer[2] << 6;
- accum |= inputBuffer[3];
-
- // There's a bit of duplicated code here because we want to have straight-through operation
- // for the most common case of len==4
- if (len == 4) {
- outputBuffer[0] = (accum >> 16) & 0xFF;
- outputBuffer[1] = (accum >> 8) & 0xFF;
- outputBuffer[2] = (accum) & 0xFF;
- outCount = 3;
- return;
- } else if (len == 3) {
- outputBuffer[0] = (accum >> 16) & 0xFF;
- outputBuffer[1] = (accum >> 8) & 0xFF;
- outCount = 2;
- return;
- } else { // len == 2
- outputBuffer[0] = (accum >> 16) & 0xFF;
- outCount = 1;
- return;
- }
- }
-
- private static byte[] TRANSLATION = {
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x00 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x10 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, /* 0x20 */
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, /* 0x30 */
- -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 0x40 */
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, /* 0x50 */
- -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, /* 0x60 */
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, /* 0x70 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x80 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x90 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xA0 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xB0 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xC0 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xD0 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xE0 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 /* 0xF0 */
- };
-
-
-}
diff --git a/apache/org/apache/james/mime4j/decoder/ByteQueue.java b/apache/org/apache/james/mime4j/decoder/ByteQueue.java
deleted file mode 100644
index 6d7ccef52..000000000
--- a/apache/org/apache/james/mime4j/decoder/ByteQueue.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.decoder;
-
-import java.util.Iterator;
-
-public class ByteQueue {
-
- private UnboundedFifoByteBuffer buf;
- private int initialCapacity = -1;
-
- public ByteQueue() {
- buf = new UnboundedFifoByteBuffer();
- }
-
- public ByteQueue(int initialCapacity) {
- buf = new UnboundedFifoByteBuffer(initialCapacity);
- this.initialCapacity = initialCapacity;
- }
-
- public void enqueue(byte b) {
- buf.add(b);
- }
-
- public byte dequeue() {
- return buf.remove();
- }
-
- public int count() {
- return buf.size();
- }
-
- public void clear() {
- if (initialCapacity != -1)
- buf = new UnboundedFifoByteBuffer(initialCapacity);
- else
- buf = new UnboundedFifoByteBuffer();
- }
-
- public Iterator iterator() {
- return buf.iterator();
- }
-
-
-}
diff --git a/apache/org/apache/james/mime4j/decoder/DecoderUtil.java b/apache/org/apache/james/mime4j/decoder/DecoderUtil.java
deleted file mode 100644
index 48fe07dee..000000000
--- a/apache/org/apache/james/mime4j/decoder/DecoderUtil.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.decoder;
-
-//BEGIN android-changed: Stubbing out logging
-import org.apache.james.mime4j.Log;
-import org.apache.james.mime4j.LogFactory;
-//END android-changed
-import org.apache.james.mime4j.util.CharsetUtil;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-
-/**
- * Static methods for decoding strings, byte arrays and encoded words.
- *
- *
- * @version $Id: DecoderUtil.java,v 1.3 2005/02/07 15:33:59 ntherning Exp $
- */
-public class DecoderUtil {
- private static Log log = LogFactory.getLog(DecoderUtil.class);
-
- /**
- * Decodes a string containing quoted-printable encoded data.
- *
- * @param s the string to decode.
- * @return the decoded bytes.
- */
- public static byte[] decodeBaseQuotedPrintable(String s) {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
- try {
- byte[] bytes = s.getBytes("US-ASCII");
-
- QuotedPrintableInputStream is = new QuotedPrintableInputStream(
- new ByteArrayInputStream(bytes));
-
- int b = 0;
- while ((b = is.read()) != -1) {
- baos.write(b);
- }
- } catch (IOException e) {
- /*
- * This should never happen!
- */
- log.error(e);
- }
-
- return baos.toByteArray();
- }
-
- /**
- * Decodes a string containing base64 encoded data.
- *
- * @param s the string to decode.
- * @return the decoded bytes.
- */
- public static byte[] decodeBase64(String s) {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
- try {
- byte[] bytes = s.getBytes("US-ASCII");
-
- Base64InputStream is = new Base64InputStream(
- new ByteArrayInputStream(bytes));
-
- int b = 0;
- while ((b = is.read()) != -1) {
- baos.write(b);
- }
- } catch (IOException e) {
- /*
- * This should never happen!
- */
- log.error(e);
- }
-
- return baos.toByteArray();
- }
-
- /**
- * Decodes an encoded word encoded with the 'B' encoding (described in
- * RFC 2047) found in a header field body.
- *
- * @param encodedWord the encoded word to decode.
- * @param charset the Java charset to use.
- * @return the decoded string.
- * @throws UnsupportedEncodingException if the given Java charset isn't
- * supported.
- */
- public static String decodeB(String encodedWord, String charset)
- throws UnsupportedEncodingException {
-
- return new String(decodeBase64(encodedWord), charset);
- }
-
- /**
- * Decodes an encoded word encoded with the 'Q' encoding (described in
- * RFC 2047) found in a header field body.
- *
- * @param encodedWord the encoded word to decode.
- * @param charset the Java charset to use.
- * @return the decoded string.
- * @throws UnsupportedEncodingException if the given Java charset isn't
- * supported.
- */
- public static String decodeQ(String encodedWord, String charset)
- throws UnsupportedEncodingException {
-
- /*
- * Replace _ with =20
- */
- StringBuffer sb = new StringBuffer();
- for (int i = 0; i < encodedWord.length(); i++) {
- char c = encodedWord.charAt(i);
- if (c == '_') {
- sb.append("=20");
- } else {
- sb.append(c);
- }
- }
-
- return new String(decodeBaseQuotedPrintable(sb.toString()), charset);
- }
-
- /**
- * Decodes a string containing encoded words as defined by RFC 2047.
- * Encoded words in have the form
- * =?charset?enc?Encoded word?= where enc is either 'Q' or 'q' for
- * quoted-printable and 'B' or 'b' for Base64.
- *
- * ANDROID: COPIED FROM A NEWER VERSION OF MIME4J
- *
- * @param body the string to decode.
- * @return the decoded string.
- */
- public static String decodeEncodedWords(String body) {
-
- // ANDROID: Most strings will not include "=?" so a quick test can prevent unneeded
- // object creation. This could also be handled via lazy creation of the StringBuilder.
- if (body.indexOf("=?") == -1) {
- return body;
- }
-
- int previousEnd = 0;
- boolean previousWasEncoded = false;
-
- StringBuilder sb = new StringBuilder();
-
- while (true) {
- int begin = body.indexOf("=?", previousEnd);
-
- // ANDROID: The mime4j original version has an error here. It gets confused if
- // the encoded string begins with an '=' (just after "?Q?"). This patch seeks forward
- // to find the two '?' in the "header", before looking for the final "?=".
- if (begin == -1) {
- break;
- }
- int qm1 = body.indexOf('?', begin + 2);
- if (qm1 == -1) {
- break;
- }
- int qm2 = body.indexOf('?', qm1 + 1);
- if (qm2 == -1) {
- break;
- }
- int end = body.indexOf("?=", qm2 + 1);
- if (end == -1) {
- break;
- }
- end += 2;
-
- String sep = body.substring(previousEnd, begin);
-
- String decoded = decodeEncodedWord(body, begin, end);
- if (decoded == null) {
- sb.append(sep);
- sb.append(body.substring(begin, end));
- } else {
- if (!previousWasEncoded || !CharsetUtil.isWhitespace(sep)) {
- sb.append(sep);
- }
- sb.append(decoded);
- }
-
- previousEnd = end;
- previousWasEncoded = decoded != null;
- }
-
- if (previousEnd == 0)
- return body;
-
- sb.append(body.substring(previousEnd));
- return sb.toString();
- }
-
- // return null on error. Begin is index of '=?' in body.
- public static String decodeEncodedWord(String body, int begin, int end) {
- // Skip the '?=' chars in body and scan forward from there for next '?'
- int qm1 = body.indexOf('?', begin + 2);
- if (qm1 == -1 || qm1 == end - 2)
- return null;
-
- int qm2 = body.indexOf('?', qm1 + 1);
- if (qm2 == -1 || qm2 == end - 2)
- return null;
-
- String mimeCharset = body.substring(begin + 2, qm1);
- String encoding = body.substring(qm1 + 1, qm2);
- String encodedText = body.substring(qm2 + 1, end - 2);
-
- String charset = CharsetUtil.toJavaCharset(mimeCharset);
- if (charset == null) {
- if (log.isWarnEnabled()) {
- log.warn("MIME charset '" + mimeCharset + "' in encoded word '"
- + body.substring(begin, end) + "' doesn't have a "
- + "corresponding Java charset");
- }
- return null;
- } else if (!CharsetUtil.isDecodingSupported(charset)) {
- if (log.isWarnEnabled()) {
- log.warn("Current JDK doesn't support decoding of charset '"
- + charset + "' (MIME charset '" + mimeCharset
- + "' in encoded word '" + body.substring(begin, end)
- + "')");
- }
- return null;
- }
-
- if (encodedText.length() == 0) {
- if (log.isWarnEnabled()) {
- log.warn("Missing encoded text in encoded word: '"
- + body.substring(begin, end) + "'");
- }
- return null;
- }
-
- try {
- if (encoding.equalsIgnoreCase("Q")) {
- return DecoderUtil.decodeQ(encodedText, charset);
- } else if (encoding.equalsIgnoreCase("B")) {
- return DecoderUtil.decodeB(encodedText, charset);
- } else {
- if (log.isWarnEnabled()) {
- log.warn("Warning: Unknown encoding in encoded word '"
- + body.substring(begin, end) + "'");
- }
- return null;
- }
- } catch (UnsupportedEncodingException e) {
- // should not happen because of isDecodingSupported check above
- if (log.isWarnEnabled()) {
- log.warn("Unsupported encoding in encoded word '"
- + body.substring(begin, end) + "'", e);
- }
- return null;
- } catch (RuntimeException e) {
- if (log.isWarnEnabled()) {
- log.warn("Could not decode encoded word '"
- + body.substring(begin, end) + "'", e);
- }
- return null;
- }
- }
-}
diff --git a/apache/org/apache/james/mime4j/decoder/QuotedPrintableInputStream.java b/apache/org/apache/james/mime4j/decoder/QuotedPrintableInputStream.java
deleted file mode 100644
index e43f398f9..000000000
--- a/apache/org/apache/james/mime4j/decoder/QuotedPrintableInputStream.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.decoder;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-//BEGIN android-changed: Stubbing out logging
-import org.apache.james.mime4j.Log;
-import org.apache.james.mime4j.LogFactory;
-//END android-changed
-
-/**
- * Performs Quoted-Printable decoding on an underlying stream.
- *
- *
- *
- * @version $Id: QuotedPrintableInputStream.java,v 1.3 2004/11/29 13:15:47 ntherning Exp $
- */
-public class QuotedPrintableInputStream extends InputStream {
- private static Log log = LogFactory.getLog(QuotedPrintableInputStream.class);
-
- private InputStream stream;
- ByteQueue byteq = new ByteQueue();
- ByteQueue pushbackq = new ByteQueue();
- private byte state = 0;
-
- public QuotedPrintableInputStream(InputStream stream) {
- this.stream = stream;
- }
-
- /**
- * Closes the underlying stream.
- *
- * @throws IOException on I/O errors.
- */
- public void close() throws IOException {
- stream.close();
- }
-
- public int read() throws IOException {
- fillBuffer();
- if (byteq.count() == 0)
- return -1;
- else {
- byte val = byteq.dequeue();
- if (val >= 0)
- return val;
- else
- return val & 0xFF;
- }
- }
-
- /**
- * Pulls bytes out of the underlying stream and places them in the
- * pushback queue. This is necessary (vs. reading from the
- * underlying stream directly) to detect and filter out "transport
- * padding" whitespace, i.e., all whitespace that appears immediately
- * before a CRLF.
- *
- * @throws IOException Underlying stream threw IOException.
- */
- private void populatePushbackQueue() throws IOException {
- //Debug.verify(pushbackq.count() == 0, "PopulatePushbackQueue called when pushback queue was not empty!");
-
- if (pushbackq.count() != 0)
- return;
-
- while (true) {
- int i = stream.read();
- switch (i) {
- case -1:
- // stream is done
- pushbackq.clear(); // discard any whitespace preceding EOF
- return;
- case ' ':
- case '\t':
- pushbackq.enqueue((byte)i);
- break;
- case '\r':
- case '\n':
- pushbackq.clear(); // discard any whitespace preceding EOL
- pushbackq.enqueue((byte)i);
- return;
- default:
- pushbackq.enqueue((byte)i);
- return;
- }
- }
- }
-
- /**
- * Causes the pushback queue to get populated if it is empty, then
- * consumes and decodes bytes out of it until one or more bytes are
- * in the byte queue. This decoding step performs the actual QP
- * decoding.
- *
- * @throws IOException Underlying stream threw IOException.
- */
- private void fillBuffer() throws IOException {
- byte msdChar = 0; // first digit of escaped num
- while (byteq.count() == 0) {
- if (pushbackq.count() == 0) {
- populatePushbackQueue();
- if (pushbackq.count() == 0)
- return;
- }
-
- byte b = (byte)pushbackq.dequeue();
-
- switch (state) {
- case 0: // start state, no bytes pending
- if (b != '=') {
- byteq.enqueue(b);
- break; // state remains 0
- } else {
- state = 1;
- break;
- }
- case 1: // encountered "=" so far
- if (b == '\r') {
- state = 2;
- break;
- } else if ((b >= '0' && b <= '9') || (b >= 'A' && b <= 'F') || (b >= 'a' && b <= 'f')) {
- state = 3;
- msdChar = b; // save until next digit encountered
- break;
- } else if (b == '=') {
- /*
- * Special case when == is encountered.
- * Emit one = and stay in this state.
- */
- if (log.isWarnEnabled()) {
- log.warn("Malformed MIME; got ==");
- }
- byteq.enqueue((byte)'=');
- break;
- } else {
- if (log.isWarnEnabled()) {
- log.warn("Malformed MIME; expected \\r or "
- + "[0-9A-Z], got " + b);
- }
- state = 0;
- byteq.enqueue((byte)'=');
- byteq.enqueue(b);
- break;
- }
- case 2: // encountered "=\r" so far
- if (b == '\n') {
- state = 0;
- break;
- } else {
- if (log.isWarnEnabled()) {
- log.warn("Malformed MIME; expected "
- + (int)'\n' + ", got " + b);
- }
- state = 0;
- byteq.enqueue((byte)'=');
- byteq.enqueue((byte)'\r');
- byteq.enqueue(b);
- break;
- }
- case 3: // encountered = so far; expecting another to complete the octet
- if ((b >= '0' && b <= '9') || (b >= 'A' && b <= 'F') || (b >= 'a' && b <= 'f')) {
- byte msd = asciiCharToNumericValue(msdChar);
- byte low = asciiCharToNumericValue(b);
- state = 0;
- byteq.enqueue((byte)((msd << 4) | low));
- break;
- } else {
- if (log.isWarnEnabled()) {
- log.warn("Malformed MIME; expected "
- + "[0-9A-Z], got " + b);
- }
- state = 0;
- byteq.enqueue((byte)'=');
- byteq.enqueue(msdChar);
- byteq.enqueue(b);
- break;
- }
- default: // should never happen
- log.error("Illegal state: " + state);
- state = 0;
- byteq.enqueue(b);
- break;
- }
- }
- }
-
- /**
- * Converts '0' => 0, 'A' => 10, etc.
- * @param c ASCII character value.
- * @return Numeric value of hexadecimal character.
- */
- private byte asciiCharToNumericValue(byte c) {
- if (c >= '0' && c <= '9') {
- return (byte)(c - '0');
- } else if (c >= 'A' && c <= 'Z') {
- return (byte)(0xA + (c - 'A'));
- } else if (c >= 'a' && c <= 'z') {
- return (byte)(0xA + (c - 'a'));
- } else {
- /*
- * This should never happen since all calls to this method
- * are preceded by a check that c is in [0-9A-Za-z]
- */
- throw new IllegalArgumentException((char) c
- + " is not a hexadecimal digit");
- }
- }
-
-}
diff --git a/apache/org/apache/james/mime4j/decoder/UnboundedFifoByteBuffer.java b/apache/org/apache/james/mime4j/decoder/UnboundedFifoByteBuffer.java
deleted file mode 100644
index f01194fd1..000000000
--- a/apache/org/apache/james/mime4j/decoder/UnboundedFifoByteBuffer.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.decoder;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * UnboundedFifoByteBuffer is a very efficient buffer implementation.
- * According to performance testing, it exhibits a constant access time, but it
- * also outperforms ArrayList when used for the same purpose.
- *
- * The removal order of an UnboundedFifoByteBuffer
is based on the insertion
- * order; elements are removed in the same order in which they were added.
- * The iteration order is the same as the removal order.
- *
- * The {@link #remove()} and {@link #get()} operations perform in constant time.
- * The {@link #add(Object)} operation performs in amortized constant time. All
- * other operations perform in linear time or worse.
- *
- * Note that this implementation is not synchronized. The following can be
- * used to provide synchronized access to your UnboundedFifoByteBuffer
:
- *
- * Buffer fifo = BufferUtils.synchronizedBuffer(new UnboundedFifoByteBuffer());
- *
- *
- * This buffer prevents null objects from being added.
- *
- * @since Commons Collections 3.0 (previously in main package v2.1)
- * @version $Revision: 1.1 $ $Date: 2004/08/24 06:52:02 $
- *
- *
- *
- *
- *
- *
- */
-class UnboundedFifoByteBuffer {
-
- protected byte[] buffer;
- protected int head;
- protected int tail;
-
- /**
- * Constructs an UnboundedFifoByteBuffer with the default number of elements.
- * It is exactly the same as performing the following:
- *
- *
- * new UnboundedFifoByteBuffer(32);
- *
- */
- public UnboundedFifoByteBuffer() {
- this(32);
- }
-
- /**
- * Constructs an UnboundedFifoByteBuffer with the specified number of elements.
- * The integer must be a positive integer.
- *
- * @param initialSize the initial size of the buffer
- * @throws IllegalArgumentException if the size is less than 1
- */
- public UnboundedFifoByteBuffer(int initialSize) {
- if (initialSize <= 0) {
- throw new IllegalArgumentException("The size must be greater than 0");
- }
- buffer = new byte[initialSize + 1];
- head = 0;
- tail = 0;
- }
-
- /**
- * Returns the number of elements stored in the buffer.
- *
- * @return this buffer's size
- */
- public int size() {
- int size = 0;
-
- if (tail < head) {
- size = buffer.length - head + tail;
- } else {
- size = tail - head;
- }
-
- return size;
- }
-
- /**
- * Returns true if this buffer is empty; false otherwise.
- *
- * @return true if this buffer is empty
- */
- public boolean isEmpty() {
- return (size() == 0);
- }
-
- /**
- * Adds the given element to this buffer.
- *
- * @param b the byte to add
- * @return true, always
- */
- public boolean add(final byte b) {
-
- if (size() + 1 >= buffer.length) {
- byte[] tmp = new byte[((buffer.length - 1) * 2) + 1];
-
- int j = 0;
- for (int i = head; i != tail;) {
- tmp[j] = buffer[i];
- buffer[i] = 0;
-
- j++;
- i++;
- if (i == buffer.length) {
- i = 0;
- }
- }
-
- buffer = tmp;
- head = 0;
- tail = j;
- }
-
- buffer[tail] = b;
- tail++;
- if (tail >= buffer.length) {
- tail = 0;
- }
- return true;
- }
-
- /**
- * Returns the next object in the buffer.
- *
- * @return the next object in the buffer
- * @throws BufferUnderflowException if this buffer is empty
- */
- public byte get() {
- if (isEmpty()) {
- throw new IllegalStateException("The buffer is already empty");
- }
-
- return buffer[head];
- }
-
- /**
- * Removes the next object from the buffer
- *
- * @return the removed object
- * @throws BufferUnderflowException if this buffer is empty
- */
- public byte remove() {
- if (isEmpty()) {
- throw new IllegalStateException("The buffer is already empty");
- }
-
- byte element = buffer[head];
-
- head++;
- if (head >= buffer.length) {
- head = 0;
- }
-
- return element;
- }
-
- /**
- * Increments the internal index.
- *
- * @param index the index to increment
- * @return the updated index
- */
- private int increment(int index) {
- index++;
- if (index >= buffer.length) {
- index = 0;
- }
- return index;
- }
-
- /**
- * Decrements the internal index.
- *
- * @param index the index to decrement
- * @return the updated index
- */
- private int decrement(int index) {
- index--;
- if (index < 0) {
- index = buffer.length - 1;
- }
- return index;
- }
-
- /**
- * Returns an iterator over this buffer's elements.
- *
- * @return an iterator over this buffer's elements
- */
- public Iterator iterator() {
- return new Iterator() {
-
- private int index = head;
- private int lastReturnedIndex = -1;
-
- public boolean hasNext() {
- return index != tail;
-
- }
-
- public Object next() {
- if (!hasNext()) {
- throw new NoSuchElementException();
- }
- lastReturnedIndex = index;
- index = increment(index);
- return new Byte(buffer[lastReturnedIndex]);
- }
-
- public void remove() {
- if (lastReturnedIndex == -1) {
- throw new IllegalStateException();
- }
-
- // First element can be removed quickly
- if (lastReturnedIndex == head) {
- UnboundedFifoByteBuffer.this.remove();
- lastReturnedIndex = -1;
- return;
- }
-
- // Other elements require us to shift the subsequent elements
- int i = lastReturnedIndex + 1;
- while (i != tail) {
- if (i >= buffer.length) {
- buffer[i - 1] = buffer[0];
- i = 0;
- } else {
- buffer[i - 1] = buffer[i];
- i++;
- }
- }
-
- lastReturnedIndex = -1;
- tail = decrement(tail);
- buffer[tail] = 0;
- index = decrement(index);
- }
-
- };
- }
-
-}
\ No newline at end of file
diff --git a/apache/org/apache/james/mime4j/field/AddressListField.java b/apache/org/apache/james/mime4j/field/AddressListField.java
deleted file mode 100644
index df9f39835..000000000
--- a/apache/org/apache/james/mime4j/field/AddressListField.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.field;
-
-//BEGIN android-changed: Stubbing out logging
-import org.apache.james.mime4j.Log;
-import org.apache.james.mime4j.LogFactory;
-//END android-changed
-import org.apache.james.mime4j.field.address.AddressList;
-import org.apache.james.mime4j.field.address.parser.ParseException;
-
-public class AddressListField extends Field {
- private AddressList addressList;
- private ParseException parseException;
-
- protected AddressListField(String name, String body, String raw, AddressList addressList, ParseException parseException) {
- super(name, body, raw);
- this.addressList = addressList;
- this.parseException = parseException;
- }
-
- public AddressList getAddressList() {
- return addressList;
- }
-
- public ParseException getParseException() {
- return parseException;
- }
-
- public static class Parser implements FieldParser {
- private static Log log = LogFactory.getLog(Parser.class);
-
- public Field parse(final String name, final String body, final String raw) {
- AddressList addressList = null;
- ParseException parseException = null;
- try {
- addressList = AddressList.parse(body);
- }
- catch (ParseException e) {
- if (log.isDebugEnabled()) {
- log.debug("Parsing value '" + body + "': "+ e.getMessage());
- }
- parseException = e;
- }
- return new AddressListField(name, body, raw, addressList, parseException);
- }
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/ContentTransferEncodingField.java b/apache/org/apache/james/mime4j/field/ContentTransferEncodingField.java
deleted file mode 100644
index 73d8d2339..000000000
--- a/apache/org/apache/james/mime4j/field/ContentTransferEncodingField.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.field;
-
-
-
-/**
- * Represents a Content-Transfer-Encoding
field.
- *
- *
- * @version $Id: ContentTransferEncodingField.java,v 1.2 2004/10/02 12:41:11 ntherning Exp $
- */
-public class ContentTransferEncodingField extends Field {
- /**
- * The 7bit
encoding.
- */
- public static final String ENC_7BIT = "7bit";
- /**
- * The 8bit
encoding.
- */
- public static final String ENC_8BIT = "8bit";
- /**
- * The binary
encoding.
- */
- public static final String ENC_BINARY = "binary";
- /**
- * The quoted-printable
encoding.
- */
- public static final String ENC_QUOTED_PRINTABLE = "quoted-printable";
- /**
- * The base64
encoding.
- */
- public static final String ENC_BASE64 = "base64";
-
- private String encoding;
-
- protected ContentTransferEncodingField(String name, String body, String raw, String encoding) {
- super(name, body, raw);
- this.encoding = encoding;
- }
-
- /**
- * Gets the encoding defined in this field.
- *
- * @return the encoding or an empty string if not set.
- */
- public String getEncoding() {
- return encoding;
- }
-
- /**
- * Gets the encoding of the given field if. Returns the default
- * 7bit
if not set or if
- * f
is null
.
- *
- * @return the encoding.
- */
- public static String getEncoding(ContentTransferEncodingField f) {
- if (f != null && f.getEncoding().length() != 0) {
- return f.getEncoding();
- }
- return ENC_7BIT;
- }
-
- public static class Parser implements FieldParser {
- public Field parse(final String name, final String body, final String raw) {
- final String encoding = body.trim().toLowerCase();
- return new ContentTransferEncodingField(name, body, raw, encoding);
- }
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/ContentTypeField.java b/apache/org/apache/james/mime4j/field/ContentTypeField.java
deleted file mode 100644
index ad9f7f9ac..000000000
--- a/apache/org/apache/james/mime4j/field/ContentTypeField.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.field;
-
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-//BEGIN android-changed: Stubbing out logging
-import org.apache.james.mime4j.Log;
-import org.apache.james.mime4j.LogFactory;
-//END android-changed
-import org.apache.james.mime4j.field.contenttype.parser.ContentTypeParser;
-import org.apache.james.mime4j.field.contenttype.parser.ParseException;
-import org.apache.james.mime4j.field.contenttype.parser.TokenMgrError;
-
-/**
- * Represents a Content-Type
field.
- *
- * TODO: Remove dependency on Java 1.4 regexps
- *
- *
- * @version $Id: ContentTypeField.java,v 1.6 2005/01/27 14:16:31 ntherning Exp $
- */
-public class ContentTypeField extends Field {
-
- /**
- * The prefix of all multipart
MIME types.
- */
- public static final String TYPE_MULTIPART_PREFIX = "multipart/";
- /**
- * The multipart/digest
MIME type.
- */
- public static final String TYPE_MULTIPART_DIGEST = "multipart/digest";
- /**
- * The text/plain
MIME type.
- */
- public static final String TYPE_TEXT_PLAIN = "text/plain";
- /**
- * The message/rfc822
MIME type.
- */
- public static final String TYPE_MESSAGE_RFC822 = "message/rfc822";
- /**
- * The name of the boundary
parameter.
- */
- public static final String PARAM_BOUNDARY = "boundary";
- /**
- * The name of the charset
parameter.
- */
- public static final String PARAM_CHARSET = "charset";
-
- private String mimeType = "";
- private Map parameters = null;
- private ParseException parseException;
-
- protected ContentTypeField(String name, String body, String raw, String mimeType, Map parameters, ParseException parseException) {
- super(name, body, raw);
- this.mimeType = mimeType;
- this.parameters = parameters;
- this.parseException = parseException;
- }
-
- /**
- * Gets the exception that was raised during parsing of
- * the field value, if any; otherwise, null.
- */
- public ParseException getParseException() {
- return parseException;
- }
-
- /**
- * Gets the MIME type defined in this Content-Type field.
- *
- * @return the MIME type or an empty string if not set.
- */
- public String getMimeType() {
- return mimeType;
- }
-
- /**
- * Gets the MIME type defined in the child's
- * Content-Type field or derives a MIME type from the parent
- * if child is null
or hasn't got a MIME type value set.
- * If child's MIME type is multipart but no boundary
- * has been set the MIME type of child will be derived from
- * the parent.
- *
- * @param child the child.
- * @param parent the parent.
- * @return the MIME type.
- */
- public static String getMimeType(ContentTypeField child,
- ContentTypeField parent) {
-
- if (child == null || child.getMimeType().length() == 0
- || child.isMultipart() && child.getBoundary() == null) {
-
- if (parent != null && parent.isMimeType(TYPE_MULTIPART_DIGEST)) {
- return TYPE_MESSAGE_RFC822;
- } else {
- return TYPE_TEXT_PLAIN;
- }
- }
-
- return child.getMimeType();
- }
-
- /**
- * Gets the value of a parameter. Parameter names are case-insensitive.
- *
- * @param name the name of the parameter to get.
- * @return the parameter value or null
if not set.
- */
- public String getParameter(String name) {
- return parameters != null
- ? parameters.get(name.toLowerCase())
- : null;
- }
-
- /**
- * Gets all parameters.
- *
- * @return the parameters.
- */
- public Map getParameters() {
- if (parameters != null) {
- return Collections.unmodifiableMap(parameters);
- }
- return Collections.emptyMap();
- }
-
- /**
- * Gets the value of the boundary
parameter if set.
- *
- * @return the boundary
parameter value or null
- * if not set.
- */
- public String getBoundary() {
- return getParameter(PARAM_BOUNDARY);
- }
-
- /**
- * Gets the value of the charset
parameter if set.
- *
- * @return the charset
parameter value or null
- * if not set.
- */
- public String getCharset() {
- return getParameter(PARAM_CHARSET);
- }
-
- /**
- * Gets the value of the charset
parameter if set for the
- * given field. Returns the default us-ascii
if not set or if
- * f
is null
.
- *
- * @return the charset
parameter value.
- */
- public static String getCharset(ContentTypeField f) {
- if (f != null) {
- if (f.getCharset() != null && f.getCharset().length() > 0) {
- return f.getCharset();
- }
- }
- return "us-ascii";
- }
-
- /**
- * Determines if the MIME type of this field matches the given one.
- *
- * @param mimeType the MIME type to match against.
- * @return true
if the MIME type of this field matches,
- * false
otherwise.
- */
- public boolean isMimeType(String mimeType) {
- return this.mimeType.equalsIgnoreCase(mimeType);
- }
-
- /**
- * Determines if the MIME type of this field is multipart/*
.
- *
- * @return true
if this field is has a multipart/*
- * MIME type, false
otherwise.
- */
- public boolean isMultipart() {
- return mimeType.startsWith(TYPE_MULTIPART_PREFIX);
- }
-
- public static class Parser implements FieldParser {
- private static Log log = LogFactory.getLog(Parser.class);
-
- public Field parse(final String name, final String body, final String raw) {
- ParseException parseException = null;
- String mimeType = "";
- Map parameters = null;
-
- ContentTypeParser parser = new ContentTypeParser(new StringReader(body));
- try {
- parser.parseAll();
- }
- catch (ParseException e) {
- if (log.isDebugEnabled()) {
- log.debug("Parsing value '" + body + "': "+ e.getMessage());
- }
- parseException = e;
- }
- catch (TokenMgrError e) {
- if (log.isDebugEnabled()) {
- log.debug("Parsing value '" + body + "': "+ e.getMessage());
- }
- parseException = new ParseException(e.getMessage());
- }
-
- try {
- final String type = parser.getType();
- final String subType = parser.getSubType();
-
- if (type != null && subType != null) {
- mimeType = (type + "/" + parser.getSubType()).toLowerCase();
-
- ArrayList paramNames = parser.getParamNames();
- ArrayList paramValues = parser.getParamValues();
-
- if (paramNames != null && paramValues != null) {
- for (int i = 0; i < paramNames.size() && i < paramValues.size(); i++) {
- if (parameters == null)
- parameters = new HashMap((int)(paramNames.size() * 1.3 + 1));
- String paramName = paramNames.get(i).toLowerCase();
- String paramValue = paramValues.get(i);
- parameters.put(paramName, paramValue);
- }
- }
- }
- }
- catch (NullPointerException npe) {
- }
- return new ContentTypeField(name, body, raw, mimeType, parameters, parseException);
- }
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/DateTimeField.java b/apache/org/apache/james/mime4j/field/DateTimeField.java
deleted file mode 100644
index 2336d99db..000000000
--- a/apache/org/apache/james/mime4j/field/DateTimeField.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.field;
-
-//BEGIN android-changed: Stubbing out logging
-
-import android.text.TextUtils;
-import java.util.regex.Pattern;
-import org.apache.james.mime4j.Log;
-import org.apache.james.mime4j.LogFactory;
-
-//END
-import org.apache.james.mime4j.field.datetime.DateTime;
-import org.apache.james.mime4j.field.datetime.parser.ParseException;
-
-import java.util.Date;
-
-public class DateTimeField extends Field {
- private Date date;
- private ParseException parseException;
-
- //BEGIN android-changed
- // "GMT" + "+" or "-" + 4 digits
- private static final Pattern DATE_CLEANUP_PATTERN_WRONG_TIMEZONE =
- Pattern.compile("GMT([-+]\\d{4})$");
- //END android-changed
-
- protected DateTimeField(String name, String body, String raw, Date date, ParseException parseException) {
- super(name, body, raw);
- this.date = date;
- this.parseException = parseException;
- }
-
- public Date getDate() {
- return date;
- }
-
- public ParseException getParseException() {
- return parseException;
- }
-
- public static class Parser implements FieldParser {
- private static Log log = LogFactory.getLog(Parser.class);
-
- public Field parse(final String name, String body, final String raw) {
- Date date = null;
- ParseException parseException = null;
- //BEGIN android-changed
- body = cleanUpMimeDate(body);
- //END android-changed
- try {
- date = DateTime.parse(body).getDate();
- }
- catch (ParseException e) {
- if (log.isDebugEnabled()) {
- log.debug("Parsing value '" + body + "': "+ e.getMessage());
- }
- parseException = e;
- }
- return new DateTimeField(name, body, raw, date, parseException);
- }
- }
-
- //BEGIN android-changed
- /**
- * Try to make a date MIME(RFC 2822/5322)-compliant.
- *
- * It fixes: - "Thu, 10 Dec 09 15:08:08 GMT-0700" to "Thu, 10 Dec 09 15:08:08 -0700" (4 digit
- * zone value can't be preceded by "GMT") We got a report saying eBay sends a date in this format
- */
- private static String cleanUpMimeDate(String date) {
- if (TextUtils.isEmpty(date)) {
- return date;
- }
- date = DATE_CLEANUP_PATTERN_WRONG_TIMEZONE.matcher(date).replaceFirst("$1");
- return date;
- }
- //END android-changed
-}
diff --git a/apache/org/apache/james/mime4j/field/DefaultFieldParser.java b/apache/org/apache/james/mime4j/field/DefaultFieldParser.java
deleted file mode 100644
index 3695afe3e..000000000
--- a/apache/org/apache/james/mime4j/field/DefaultFieldParser.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2006 the mime4j 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 org.apache.james.mime4j.field;
-
-public class DefaultFieldParser extends DelegatingFieldParser {
-
- public DefaultFieldParser() {
- setFieldParser(Field.CONTENT_TRANSFER_ENCODING, new ContentTransferEncodingField.Parser());
- setFieldParser(Field.CONTENT_TYPE, new ContentTypeField.Parser());
-
- final DateTimeField.Parser dateTimeParser = new DateTimeField.Parser();
- setFieldParser(Field.DATE, dateTimeParser);
- setFieldParser(Field.RESENT_DATE, dateTimeParser);
-
- final MailboxListField.Parser mailboxListParser = new MailboxListField.Parser();
- setFieldParser(Field.FROM, mailboxListParser);
- setFieldParser(Field.RESENT_FROM, mailboxListParser);
-
- final MailboxField.Parser mailboxParser = new MailboxField.Parser();
- setFieldParser(Field.SENDER, mailboxParser);
- setFieldParser(Field.RESENT_SENDER, mailboxParser);
-
- final AddressListField.Parser addressListParser = new AddressListField.Parser();
- setFieldParser(Field.TO, addressListParser);
- setFieldParser(Field.RESENT_TO, addressListParser);
- setFieldParser(Field.CC, addressListParser);
- setFieldParser(Field.RESENT_CC, addressListParser);
- setFieldParser(Field.BCC, addressListParser);
- setFieldParser(Field.RESENT_BCC, addressListParser);
- setFieldParser(Field.REPLY_TO, addressListParser);
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/DelegatingFieldParser.java b/apache/org/apache/james/mime4j/field/DelegatingFieldParser.java
deleted file mode 100644
index 32b69ec13..000000000
--- a/apache/org/apache/james/mime4j/field/DelegatingFieldParser.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2006 the mime4j 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 org.apache.james.mime4j.field;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class DelegatingFieldParser implements FieldParser {
-
- private Map parsers = new HashMap();
- private FieldParser defaultParser = new UnstructuredField.Parser();
-
- /**
- * Sets the parser used for the field named name
.
- * @param name the name of the field
- * @param parser the parser for fields named name
- */
- public void setFieldParser(final String name, final FieldParser parser) {
- parsers.put(name.toLowerCase(), parser);
- }
-
- public FieldParser getParser(final String name) {
- final FieldParser field = parsers.get(name.toLowerCase());
- if(field==null) {
- return defaultParser;
- }
- return field;
- }
-
- public Field parse(final String name, final String body, final String raw) {
- final FieldParser parser = getParser(name);
- return parser.parse(name, body, raw);
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/Field.java b/apache/org/apache/james/mime4j/field/Field.java
deleted file mode 100644
index 4dea5c5cf..000000000
--- a/apache/org/apache/james/mime4j/field/Field.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.field;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * The base class of all field classes.
- *
- *
- * @version $Id: Field.java,v 1.6 2004/10/25 07:26:46 ntherning Exp $
- */
-public abstract class Field {
- public static final String SENDER = "Sender";
- public static final String FROM = "From";
- public static final String TO = "To";
- public static final String CC = "Cc";
- public static final String BCC = "Bcc";
- public static final String REPLY_TO = "Reply-To";
- public static final String RESENT_SENDER = "Resent-Sender";
- public static final String RESENT_FROM = "Resent-From";
- public static final String RESENT_TO = "Resent-To";
- public static final String RESENT_CC = "Resent-Cc";
- public static final String RESENT_BCC = "Resent-Bcc";
-
- public static final String DATE = "Date";
- public static final String RESENT_DATE = "Resent-Date";
-
- public static final String SUBJECT = "Subject";
- public static final String CONTENT_TYPE = "Content-Type";
- public static final String CONTENT_TRANSFER_ENCODING =
- "Content-Transfer-Encoding";
-
- private static final String FIELD_NAME_PATTERN =
- "^([\\x21-\\x39\\x3b-\\x7e]+)[ \t]*:";
- private static final Pattern fieldNamePattern =
- Pattern.compile(FIELD_NAME_PATTERN);
-
- private static final DefaultFieldParser parser = new DefaultFieldParser();
-
- private final String name;
- private final String body;
- private final String raw;
-
- protected Field(final String name, final String body, final String raw) {
- this.name = name;
- this.body = body;
- this.raw = raw;
- }
-
- /**
- * Parses the given string and returns an instance of the
- * Field
class. The type of the class returned depends on
- * the field name:
- *
- *
- * Field name | Class returned |
- * Content-Type | org.apache.james.mime4j.field.ContentTypeField |
- * other | org.apache.james.mime4j.field.UnstructuredField |
- *
- *
- *
- * @param s the string to parse.
- * @return a Field
instance.
- * @throws IllegalArgumentException on parse errors.
- */
- public static Field parse(final String raw) {
-
- /*
- * Unfold the field.
- */
- final String unfolded = raw.replaceAll("\r|\n", "");
-
- /*
- * Split into name and value.
- */
- final Matcher fieldMatcher = fieldNamePattern.matcher(unfolded);
- if (!fieldMatcher.find()) {
- throw new IllegalArgumentException("Invalid field in string");
- }
- final String name = fieldMatcher.group(1);
-
- String body = unfolded.substring(fieldMatcher.end());
- if (body.length() > 0 && body.charAt(0) == ' ') {
- body = body.substring(1);
- }
-
- return parser.parse(name, body, raw);
- }
-
- /**
- * Gets the default parser used to parse fields.
- * @return the default field parser
- */
- public static DefaultFieldParser getParser() {
- return parser;
- }
-
- /**
- * Gets the name of the field (Subject
,
- * From
, etc).
- *
- * @return the field name.
- */
- public String getName() {
- return name;
- }
-
- /**
- * Gets the original raw field string.
- *
- * @return the original raw field string.
- */
- public String getRaw() {
- return raw;
- }
-
- /**
- * Gets the unfolded, unparsed and possibly encoded (see RFC 2047) field
- * body string.
- *
- * @return the unfolded unparsed field body string.
- */
- public String getBody() {
- return body;
- }
-
- /**
- * Determines if this is a Content-Type
field.
- *
- * @return true
if this is a Content-Type
field,
- * false
otherwise.
- */
- public boolean isContentType() {
- return CONTENT_TYPE.equalsIgnoreCase(name);
- }
-
- /**
- * Determines if this is a Subject
field.
- *
- * @return true
if this is a Subject
field,
- * false
otherwise.
- */
- public boolean isSubject() {
- return SUBJECT.equalsIgnoreCase(name);
- }
-
- /**
- * Determines if this is a From
field.
- *
- * @return true
if this is a From
field,
- * false
otherwise.
- */
- public boolean isFrom() {
- return FROM.equalsIgnoreCase(name);
- }
-
- /**
- * Determines if this is a To
field.
- *
- * @return true
if this is a To
field,
- * false
otherwise.
- */
- public boolean isTo() {
- return TO.equalsIgnoreCase(name);
- }
-
- /**
- * @see #getRaw()
- */
- public String toString() {
- return raw;
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/FieldParser.java b/apache/org/apache/james/mime4j/field/FieldParser.java
deleted file mode 100644
index 78aaf1334..000000000
--- a/apache/org/apache/james/mime4j/field/FieldParser.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright 2006 the mime4j 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 org.apache.james.mime4j.field;
-
-public interface FieldParser {
-
- Field parse(final String name, final String body, final String raw);
-}
diff --git a/apache/org/apache/james/mime4j/field/MailboxField.java b/apache/org/apache/james/mime4j/field/MailboxField.java
deleted file mode 100644
index f15980055..000000000
--- a/apache/org/apache/james/mime4j/field/MailboxField.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.field;
-
-//BEGIN android-changed: Stubbing out logging
-import org.apache.james.mime4j.Log;
-import org.apache.james.mime4j.LogFactory;
-//END android-changed
-import org.apache.james.mime4j.field.address.AddressList;
-import org.apache.james.mime4j.field.address.Mailbox;
-import org.apache.james.mime4j.field.address.MailboxList;
-import org.apache.james.mime4j.field.address.parser.ParseException;
-
-public class MailboxField extends Field {
- private final Mailbox mailbox;
- private final ParseException parseException;
-
- protected MailboxField(final String name, final String body, final String raw, final Mailbox mailbox, final ParseException parseException) {
- super(name, body, raw);
- this.mailbox = mailbox;
- this.parseException = parseException;
- }
-
- public Mailbox getMailbox() {
- return mailbox;
- }
-
- public ParseException getParseException() {
- return parseException;
- }
-
- public static class Parser implements FieldParser {
- private static Log log = LogFactory.getLog(Parser.class);
-
- public Field parse(final String name, final String body, final String raw) {
- Mailbox mailbox = null;
- ParseException parseException = null;
- try {
- MailboxList mailboxList = AddressList.parse(body).flatten();
- if (mailboxList.size() > 0) {
- mailbox = mailboxList.get(0);
- }
- }
- catch (ParseException e) {
- if (log.isDebugEnabled()) {
- log.debug("Parsing value '" + body + "': "+ e.getMessage());
- }
- parseException = e;
- }
- return new MailboxField(name, body, raw, mailbox, parseException);
- }
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/MailboxListField.java b/apache/org/apache/james/mime4j/field/MailboxListField.java
deleted file mode 100644
index 23378d4fa..000000000
--- a/apache/org/apache/james/mime4j/field/MailboxListField.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.field;
-
-//BEGIN android-changed: Stubbing out logging
-import org.apache.james.mime4j.Log;
-import org.apache.james.mime4j.LogFactory;
-//END android-changed
-import org.apache.james.mime4j.field.address.AddressList;
-import org.apache.james.mime4j.field.address.MailboxList;
-import org.apache.james.mime4j.field.address.parser.ParseException;
-
-public class MailboxListField extends Field {
-
- private MailboxList mailboxList;
- private ParseException parseException;
-
- protected MailboxListField(final String name, final String body, final String raw, final MailboxList mailboxList, final ParseException parseException) {
- super(name, body, raw);
- this.mailboxList = mailboxList;
- this.parseException = parseException;
- }
-
- public MailboxList getMailboxList() {
- return mailboxList;
- }
-
- public ParseException getParseException() {
- return parseException;
- }
-
- public static class Parser implements FieldParser {
- private static Log log = LogFactory.getLog(Parser.class);
-
- public Field parse(final String name, final String body, final String raw) {
- MailboxList mailboxList = null;
- ParseException parseException = null;
- try {
- mailboxList = AddressList.parse(body).flatten();
- }
- catch (ParseException e) {
- if (log.isDebugEnabled()) {
- log.debug("Parsing value '" + body + "': "+ e.getMessage());
- }
- parseException = e;
- }
- return new MailboxListField(name, body, raw, mailboxList, parseException);
- }
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/UnstructuredField.java b/apache/org/apache/james/mime4j/field/UnstructuredField.java
deleted file mode 100644
index 6084e4435..000000000
--- a/apache/org/apache/james/mime4j/field/UnstructuredField.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.field;
-
-import org.apache.james.mime4j.decoder.DecoderUtil;
-
-
-/**
- * Simple unstructured field such as Subject
.
- *
- *
- * @version $Id: UnstructuredField.java,v 1.3 2004/10/25 07:26:46 ntherning Exp $
- */
-public class UnstructuredField extends Field {
- private String value;
-
- protected UnstructuredField(String name, String body, String raw, String value) {
- super(name, body, raw);
- this.value = value;
- }
-
- public String getValue() {
- return value;
- }
-
- public static class Parser implements FieldParser {
- public Field parse(final String name, final String body, final String raw) {
- final String value = DecoderUtil.decodeEncodedWords(body);
- return new UnstructuredField(name, body, raw, value);
- }
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/address/Address.java b/apache/org/apache/james/mime4j/field/address/Address.java
deleted file mode 100644
index 3e24e91aa..000000000
--- a/apache/org/apache/james/mime4j/field/address/Address.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.field.address;
-
-import java.util.ArrayList;
-
-/**
- * The abstract base for classes that represent RFC2822 addresses.
- * This includes groups and mailboxes.
- *
- * Currently, no public methods are introduced on this class.
- *
- *
- */
-public abstract class Address {
-
- /**
- * Adds any mailboxes represented by this address
- * into the given ArrayList. Note that this method
- * has default (package) access, so a doAddMailboxesTo
- * method is needed to allow the behavior to be
- * overridden by subclasses.
- */
- final void addMailboxesTo(ArrayList results) {
- doAddMailboxesTo(results);
- }
-
- /**
- * Adds any mailboxes represented by this address
- * into the given ArrayList. Must be overridden by
- * concrete subclasses.
- */
- protected abstract void doAddMailboxesTo(ArrayList results);
-
-}
diff --git a/apache/org/apache/james/mime4j/field/address/AddressList.java b/apache/org/apache/james/mime4j/field/address/AddressList.java
deleted file mode 100644
index 1829e79aa..000000000
--- a/apache/org/apache/james/mime4j/field/address/AddressList.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.field.address;
-
-import org.apache.james.mime4j.field.address.parser.AddressListParser;
-import org.apache.james.mime4j.field.address.parser.ParseException;
-
-import java.io.StringReader;
-import java.util.ArrayList;
-
-/**
- * An immutable, random-access list of Address objects.
- *
- *
- */
-public class AddressList {
-
- private ArrayList addresses;
-
- /**
- * @param addresses An ArrayList that contains only Address objects.
- * @param dontCopy true iff it is not possible for the addresses ArrayList to be modified by someone else.
- */
- public AddressList(ArrayList addresses, boolean dontCopy) {
- if (addresses != null)
- this.addresses = (dontCopy ? addresses : new ArrayList(addresses));
- else
- this.addresses = new ArrayList(0);
- }
-
- /**
- * The number of elements in this list.
- */
- public int size() {
- return addresses.size();
- }
-
- /**
- * Gets an address.
- */
- public Address get(int index) {
- if (0 > index || size() <= index)
- throw new IndexOutOfBoundsException();
- return addresses.get(index);
- }
-
- /**
- * Returns a flat list of all mailboxes represented
- * in this address list. Use this if you don't care
- * about grouping.
- */
- public MailboxList flatten() {
- // in the common case, all addresses are mailboxes
- boolean groupDetected = false;
- for (int i = 0; i < size(); i++) {
- if (!(get(i) instanceof Mailbox)) {
- groupDetected = true;
- break;
- }
- }
-
- if (!groupDetected)
- return new MailboxList(addresses, true);
-
- ArrayList results = new ArrayList();
- for (int i = 0; i < size(); i++) {
- Address addr = get(i);
- addr.addMailboxesTo(results);
- }
-
- // copy-on-construct this time, because subclasses
- // could have held onto a reference to the results
- return new MailboxList(results, false);
- }
-
- /**
- * Dumps a representation of this address list to
- * stdout, for debugging purposes.
- */
- public void print() {
- for (int i = 0; i < size(); i++) {
- Address addr = get(i);
- System.out.println(addr.toString());
- }
- }
-
- /**
- * Parse the address list string, such as the value
- * of a From, To, Cc, Bcc, Sender, or Reply-To
- * header.
- *
- * The string MUST be unfolded already.
- */
- public static AddressList parse(String rawAddressList) throws ParseException {
- AddressListParser parser = new AddressListParser(new StringReader(rawAddressList));
- return Builder.getInstance().buildAddressList(parser.parse());
- }
-
- /**
- * Test console.
- */
- public static void main(String[] args) throws Exception {
- java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
- while (true) {
- try {
- System.out.print("> ");
- String line = reader.readLine();
- if (line.length() == 0 || line.toLowerCase().equals("exit") || line.toLowerCase().equals("quit")) {
- System.out.println("Goodbye.");
- return;
- }
- AddressList list = parse(line);
- list.print();
- }
- catch(Exception e) {
- e.printStackTrace();
- Thread.sleep(300);
- }
- }
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/address/Builder.java b/apache/org/apache/james/mime4j/field/address/Builder.java
deleted file mode 100644
index 3bcd15b6f..000000000
--- a/apache/org/apache/james/mime4j/field/address/Builder.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.field.address;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.apache.james.mime4j.decoder.DecoderUtil;
-import org.apache.james.mime4j.field.address.parser.ASTaddr_spec;
-import org.apache.james.mime4j.field.address.parser.ASTaddress;
-import org.apache.james.mime4j.field.address.parser.ASTaddress_list;
-import org.apache.james.mime4j.field.address.parser.ASTangle_addr;
-import org.apache.james.mime4j.field.address.parser.ASTdomain;
-import org.apache.james.mime4j.field.address.parser.ASTgroup_body;
-import org.apache.james.mime4j.field.address.parser.ASTlocal_part;
-import org.apache.james.mime4j.field.address.parser.ASTmailbox;
-import org.apache.james.mime4j.field.address.parser.ASTname_addr;
-import org.apache.james.mime4j.field.address.parser.ASTphrase;
-import org.apache.james.mime4j.field.address.parser.ASTroute;
-import org.apache.james.mime4j.field.address.parser.Node;
-import org.apache.james.mime4j.field.address.parser.SimpleNode;
-import org.apache.james.mime4j.field.address.parser.Token;
-
-/**
- * Transforms the JJTree-generated abstract syntax tree
- * into a graph of org.apache.james.mime4j.field.address objects.
- *
- *
- */
-class Builder {
-
- private static Builder singleton = new Builder();
-
- public static Builder getInstance() {
- return singleton;
- }
-
-
-
- public AddressList buildAddressList(ASTaddress_list node) {
- ArrayList list = new ArrayList();
- for (int i = 0; i < node.jjtGetNumChildren(); i++) {
- ASTaddress childNode = (ASTaddress) node.jjtGetChild(i);
- Address address = buildAddress(childNode);
- list.add(address);
- }
- return new AddressList(list, true);
- }
-
- private Address buildAddress(ASTaddress node) {
- ChildNodeIterator it = new ChildNodeIterator(node);
- Node n = it.nextNode();
- if (n instanceof ASTaddr_spec) {
- return buildAddrSpec((ASTaddr_spec)n);
- }
- else if (n instanceof ASTangle_addr) {
- return buildAngleAddr((ASTangle_addr)n);
- }
- else if (n instanceof ASTphrase) {
- String name = buildString((ASTphrase)n, false);
- Node n2 = it.nextNode();
- if (n2 instanceof ASTgroup_body) {
- return new Group(name, buildGroupBody((ASTgroup_body)n2));
- }
- else if (n2 instanceof ASTangle_addr) {
- name = DecoderUtil.decodeEncodedWords(name);
- return new NamedMailbox(name, buildAngleAddr((ASTangle_addr)n2));
- }
- else {
- throw new IllegalStateException();
- }
- }
- else {
- throw new IllegalStateException();
- }
- }
-
-
-
- private MailboxList buildGroupBody(ASTgroup_body node) {
- ArrayList results = new ArrayList();
- ChildNodeIterator it = new ChildNodeIterator(node);
- while (it.hasNext()) {
- Node n = it.nextNode();
- if (n instanceof ASTmailbox)
- results.add(buildMailbox((ASTmailbox)n));
- else
- throw new IllegalStateException();
- }
- return new MailboxList(results, true);
- }
-
- private Mailbox buildMailbox(ASTmailbox node) {
- ChildNodeIterator it = new ChildNodeIterator(node);
- Node n = it.nextNode();
- if (n instanceof ASTaddr_spec) {
- return buildAddrSpec((ASTaddr_spec)n);
- }
- else if (n instanceof ASTangle_addr) {
- return buildAngleAddr((ASTangle_addr)n);
- }
- else if (n instanceof ASTname_addr) {
- return buildNameAddr((ASTname_addr)n);
- }
- else {
- throw new IllegalStateException();
- }
- }
-
- private NamedMailbox buildNameAddr(ASTname_addr node) {
- ChildNodeIterator it = new ChildNodeIterator(node);
- Node n = it.nextNode();
- String name;
- if (n instanceof ASTphrase) {
- name = buildString((ASTphrase)n, false);
- }
- else {
- throw new IllegalStateException();
- }
-
- n = it.nextNode();
- if (n instanceof ASTangle_addr) {
- name = DecoderUtil.decodeEncodedWords(name);
- return new NamedMailbox(name, buildAngleAddr((ASTangle_addr) n));
- }
- else {
- throw new IllegalStateException();
- }
- }
-
- private Mailbox buildAngleAddr(ASTangle_addr node) {
- ChildNodeIterator it = new ChildNodeIterator(node);
- DomainList route = null;
- Node n = it.nextNode();
- if (n instanceof ASTroute) {
- route = buildRoute((ASTroute)n);
- n = it.nextNode();
- }
- else if (n instanceof ASTaddr_spec)
- ; // do nothing
- else
- throw new IllegalStateException();
-
- if (n instanceof ASTaddr_spec)
- return buildAddrSpec(route, (ASTaddr_spec)n);
- else
- throw new IllegalStateException();
- }
-
- private DomainList buildRoute(ASTroute node) {
- ArrayList results = new ArrayList(node.jjtGetNumChildren());
- ChildNodeIterator it = new ChildNodeIterator(node);
- while (it.hasNext()) {
- Node n = it.nextNode();
- if (n instanceof ASTdomain)
- results.add(buildString((ASTdomain)n, true));
- else
- throw new IllegalStateException();
- }
- return new DomainList(results, true);
- }
-
- private Mailbox buildAddrSpec(ASTaddr_spec node) {
- return buildAddrSpec(null, node);
- }
- private Mailbox buildAddrSpec(DomainList route, ASTaddr_spec node) {
- ChildNodeIterator it = new ChildNodeIterator(node);
- String localPart = buildString((ASTlocal_part)it.nextNode(), true);
- String domain = buildString((ASTdomain)it.nextNode(), true);
- return new Mailbox(route, localPart, domain);
- }
-
-
- private String buildString(SimpleNode node, boolean stripSpaces) {
- Token head = node.firstToken;
- Token tail = node.lastToken;
- StringBuffer out = new StringBuffer();
-
- while (head != tail) {
- out.append(head.image);
- head = head.next;
- if (!stripSpaces)
- addSpecials(out, head.specialToken);
- }
- out.append(tail.image);
-
- return out.toString();
- }
-
- private void addSpecials(StringBuffer out, Token specialToken) {
- if (specialToken != null) {
- addSpecials(out, specialToken.specialToken);
- out.append(specialToken.image);
- }
- }
-
- private static class ChildNodeIterator implements Iterator {
-
- private SimpleNode simpleNode;
- private int index;
- private int len;
-
- public ChildNodeIterator(SimpleNode simpleNode) {
- this.simpleNode = simpleNode;
- this.len = simpleNode.jjtGetNumChildren();
- this.index = 0;
- }
-
- public void remove() {
- throw new UnsupportedOperationException();
- }
-
- public boolean hasNext() {
- return index < len;
- }
-
- public Node next() {
- return nextNode();
- }
-
- public Node nextNode() {
- return simpleNode.jjtGetChild(index++);
- }
-
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/address/DomainList.java b/apache/org/apache/james/mime4j/field/address/DomainList.java
deleted file mode 100644
index 49b0f3be5..000000000
--- a/apache/org/apache/james/mime4j/field/address/DomainList.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.field.address;
-
-import java.util.ArrayList;
-
-/**
- * An immutable, random-access list of Strings (that
- * are supposedly domain names or domain literals).
- *
- *
- */
-public class DomainList {
- private ArrayList domains;
-
- /**
- * @param domains An ArrayList that contains only String objects.
- * @param dontCopy true iff it is not possible for the domains ArrayList to be modified by someone else.
- */
- public DomainList(ArrayList domains, boolean dontCopy) {
- if (domains != null)
- this.domains = (dontCopy ? domains : new ArrayList(domains));
- else
- this.domains = new ArrayList(0);
- }
-
- /**
- * The number of elements in this list.
- */
- public int size() {
- return domains.size();
- }
-
- /**
- * Gets the domain name or domain literal at the
- * specified index.
- * @throws IndexOutOfBoundsException If index is < 0 or >= size().
- */
- public String get(int index) {
- if (0 > index || size() <= index)
- throw new IndexOutOfBoundsException();
- return domains.get(index);
- }
-
- /**
- * Returns the list of domains formatted as a route
- * string (not including the trailing ':').
- */
- public String toRouteString() {
- StringBuffer out = new StringBuffer();
- for (int i = 0; i < domains.size(); i++) {
- out.append("@");
- out.append(get(i));
- if (i + 1 < domains.size())
- out.append(",");
- }
- return out.toString();
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/address/Group.java b/apache/org/apache/james/mime4j/field/address/Group.java
deleted file mode 100644
index c0ab7f724..000000000
--- a/apache/org/apache/james/mime4j/field/address/Group.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.field.address;
-
-import java.util.ArrayList;
-
-/**
- * A named group of zero or more mailboxes.
- *
- *
- */
-public class Group extends Address {
- private String name;
- private MailboxList mailboxList;
-
- /**
- * @param name The group name.
- * @param mailboxes The mailboxes in this group.
- */
- public Group(String name, MailboxList mailboxes) {
- this.name = name;
- this.mailboxList = mailboxes;
- }
-
- /**
- * Returns the group name.
- */
- public String getName() {
- return name;
- }
-
- /**
- * Returns the mailboxes in this group.
- */
- public MailboxList getMailboxes() {
- return mailboxList;
- }
-
- @Override
- public String toString() {
- StringBuffer buf = new StringBuffer();
- buf.append(name);
- buf.append(":");
- for (int i = 0; i < mailboxList.size(); i++) {
- buf.append(mailboxList.get(i).toString());
- if (i + 1 < mailboxList.size())
- buf.append(",");
- }
- buf.append(";");
- return buf.toString();
- }
-
- @Override
- protected void doAddMailboxesTo(ArrayList results) {
- for (int i = 0; i < mailboxList.size(); i++)
- results.add(mailboxList.get(i));
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/address/Mailbox.java b/apache/org/apache/james/mime4j/field/address/Mailbox.java
deleted file mode 100644
index 25f2548d4..000000000
--- a/apache/org/apache/james/mime4j/field/address/Mailbox.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.field.address;
-
-import java.util.ArrayList;
-
-/**
- * Represents a single e-mail address.
- *
- *
- */
-public class Mailbox extends Address {
- private DomainList route;
- private String localPart;
- private String domain;
-
- /**
- * Creates a mailbox without a route. Routes are obsolete.
- * @param localPart The part of the e-mail address to the left of the "@".
- * @param domain The part of the e-mail address to the right of the "@".
- */
- public Mailbox(String localPart, String domain) {
- this(null, localPart, domain);
- }
-
- /**
- * Creates a mailbox with a route. Routes are obsolete.
- * @param route The zero or more domains that make up the route. Can be null.
- * @param localPart The part of the e-mail address to the left of the "@".
- * @param domain The part of the e-mail address to the right of the "@".
- */
- public Mailbox(DomainList route, String localPart, String domain) {
- this.route = route;
- this.localPart = localPart;
- this.domain = domain;
- }
-
- /**
- * Returns the route list.
- */
- public DomainList getRoute() {
- return route;
- }
-
- /**
- * Returns the left part of the e-mail address
- * (before "@").
- */
- public String getLocalPart() {
- return localPart;
- }
-
- /**
- * Returns the right part of the e-mail address
- * (after "@").
- */
- public String getDomain() {
- return domain;
- }
-
- /**
- * Formats the address as a string, not including
- * the route.
- *
- * @see #getAddressString(boolean)
- */
- public String getAddressString() {
- return getAddressString(false);
- }
-
- /**
- * Note that this value may not be usable
- * for transport purposes, only display purposes.
- *
- * For example, if the unparsed address was
- *
- * <"Joe Cheng"@joecheng.com>
- *
- * this method would return
- *
- *
- *
- * which is not valid for transport; the local part
- * would need to be re-quoted.
- *
- * @param includeRoute true if the route should be included if it exists.
- */
- public String getAddressString(boolean includeRoute) {
- return "<" + (!includeRoute || route == null ? "" : route.toRouteString() + ":")
- + localPart
- + (domain == null ? "" : "@")
- + domain + ">";
- }
-
- @Override
- protected final void doAddMailboxesTo(ArrayList results) {
- results.add(this);
- }
-
- @Override
- public String toString() {
- return getAddressString();
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/address/MailboxList.java b/apache/org/apache/james/mime4j/field/address/MailboxList.java
deleted file mode 100644
index 2c9efb37f..000000000
--- a/apache/org/apache/james/mime4j/field/address/MailboxList.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.field.address;
-
-import java.util.ArrayList;
-
-/**
- * An immutable, random-access list of Mailbox objects.
- *
- *
- */
-public class MailboxList {
-
- private ArrayList mailboxes;
-
- /**
- * @param mailboxes An ArrayList that contains only Mailbox objects.
- * @param dontCopy true iff it is not possible for the mailboxes ArrayList to be modified by someone else.
- */
- public MailboxList(ArrayList mailboxes, boolean dontCopy) {
- if (mailboxes != null)
- this.mailboxes = (dontCopy ? mailboxes : new ArrayList(mailboxes));
- else
- this.mailboxes = new ArrayList(0);
- }
-
- /**
- * The number of elements in this list.
- */
- public int size() {
- return mailboxes.size();
- }
-
- /**
- * Gets an address.
- */
- public Mailbox get(int index) {
- if (0 > index || size() <= index)
- throw new IndexOutOfBoundsException();
- return (Mailbox)mailboxes.get(index);
- }
-
- /**
- * Dumps a representation of this mailbox list to
- * stdout, for debugging purposes.
- */
- public void print() {
- for (int i = 0; i < size(); i++) {
- Mailbox mailbox = get(i);
- System.out.println(mailbox.toString());
- }
- }
-
-}
diff --git a/apache/org/apache/james/mime4j/field/address/NamedMailbox.java b/apache/org/apache/james/mime4j/field/address/NamedMailbox.java
deleted file mode 100644
index 4b8306037..000000000
--- a/apache/org/apache/james/mime4j/field/address/NamedMailbox.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.field.address;
-
-/**
- * A Mailbox that has a name/description.
- *
- *
- */
-public class NamedMailbox extends Mailbox {
- private String name;
-
- /**
- * @see Mailbox#Mailbox(String, String)
- */
- public NamedMailbox(String name, String localPart, String domain) {
- super(localPart, domain);
- this.name = name;
- }
-
- /**
- * @see Mailbox#Mailbox(DomainList, String, String)
- */
- public NamedMailbox(String name, DomainList route, String localPart, String domain) {
- super(route, localPart, domain);
- this.name = name;
- }
-
- /**
- * Creates a named mailbox based on an unnamed mailbox.
- */
- public NamedMailbox(String name, Mailbox baseMailbox) {
- super(baseMailbox.getRoute(), baseMailbox.getLocalPart(), baseMailbox.getDomain());
- this.name = name;
- }
-
- /**
- * Returns the name of the mailbox.
- */
- public String getName() {
- return this.name;
- }
-
- /**
- * Same features (or problems) as Mailbox.getAddressString(boolean),
- * only more so.
- *
- * @see Mailbox#getAddressString(boolean)
- */
- @Override
- public String getAddressString(boolean includeRoute) {
- return (name == null ? "" : name + " ") + super.getAddressString(includeRoute);
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/address/parser/ASTaddr_spec.java b/apache/org/apache/james/mime4j/field/address/parser/ASTaddr_spec.java
deleted file mode 100644
index 4d56d000b..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/ASTaddr_spec.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. ASTaddr_spec.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class ASTaddr_spec extends SimpleNode {
- public ASTaddr_spec(int id) {
- super(id);
- }
-
- public ASTaddr_spec(AddressListParser p, int id) {
- super(p, id);
- }
-
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/address/parser/ASTaddress.java b/apache/org/apache/james/mime4j/field/address/parser/ASTaddress.java
deleted file mode 100644
index 47bdeda8e..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/ASTaddress.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. ASTaddress.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class ASTaddress extends SimpleNode {
- public ASTaddress(int id) {
- super(id);
- }
-
- public ASTaddress(AddressListParser p, int id) {
- super(p, id);
- }
-
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/address/parser/ASTaddress_list.java b/apache/org/apache/james/mime4j/field/address/parser/ASTaddress_list.java
deleted file mode 100644
index 737840e38..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/ASTaddress_list.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. ASTaddress_list.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class ASTaddress_list extends SimpleNode {
- public ASTaddress_list(int id) {
- super(id);
- }
-
- public ASTaddress_list(AddressListParser p, int id) {
- super(p, id);
- }
-
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/address/parser/ASTangle_addr.java b/apache/org/apache/james/mime4j/field/address/parser/ASTangle_addr.java
deleted file mode 100644
index 8cb8f421f..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/ASTangle_addr.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. ASTangle_addr.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class ASTangle_addr extends SimpleNode {
- public ASTangle_addr(int id) {
- super(id);
- }
-
- public ASTangle_addr(AddressListParser p, int id) {
- super(p, id);
- }
-
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/address/parser/ASTdomain.java b/apache/org/apache/james/mime4j/field/address/parser/ASTdomain.java
deleted file mode 100644
index b52664386..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/ASTdomain.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. ASTdomain.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class ASTdomain extends SimpleNode {
- public ASTdomain(int id) {
- super(id);
- }
-
- public ASTdomain(AddressListParser p, int id) {
- super(p, id);
- }
-
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/address/parser/ASTgroup_body.java b/apache/org/apache/james/mime4j/field/address/parser/ASTgroup_body.java
deleted file mode 100644
index f6017b9fc..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/ASTgroup_body.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. ASTgroup_body.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class ASTgroup_body extends SimpleNode {
- public ASTgroup_body(int id) {
- super(id);
- }
-
- public ASTgroup_body(AddressListParser p, int id) {
- super(p, id);
- }
-
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/address/parser/ASTlocal_part.java b/apache/org/apache/james/mime4j/field/address/parser/ASTlocal_part.java
deleted file mode 100644
index 5c244fa3e..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/ASTlocal_part.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. ASTlocal_part.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class ASTlocal_part extends SimpleNode {
- public ASTlocal_part(int id) {
- super(id);
- }
-
- public ASTlocal_part(AddressListParser p, int id) {
- super(p, id);
- }
-
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/address/parser/ASTmailbox.java b/apache/org/apache/james/mime4j/field/address/parser/ASTmailbox.java
deleted file mode 100644
index aeb469da1..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/ASTmailbox.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. ASTmailbox.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class ASTmailbox extends SimpleNode {
- public ASTmailbox(int id) {
- super(id);
- }
-
- public ASTmailbox(AddressListParser p, int id) {
- super(p, id);
- }
-
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/address/parser/ASTname_addr.java b/apache/org/apache/james/mime4j/field/address/parser/ASTname_addr.java
deleted file mode 100644
index 846c73167..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/ASTname_addr.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. ASTname_addr.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class ASTname_addr extends SimpleNode {
- public ASTname_addr(int id) {
- super(id);
- }
-
- public ASTname_addr(AddressListParser p, int id) {
- super(p, id);
- }
-
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/address/parser/ASTphrase.java b/apache/org/apache/james/mime4j/field/address/parser/ASTphrase.java
deleted file mode 100644
index 7d711c529..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/ASTphrase.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. ASTphrase.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class ASTphrase extends SimpleNode {
- public ASTphrase(int id) {
- super(id);
- }
-
- public ASTphrase(AddressListParser p, int id) {
- super(p, id);
- }
-
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/address/parser/ASTroute.java b/apache/org/apache/james/mime4j/field/address/parser/ASTroute.java
deleted file mode 100644
index 54ea11523..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/ASTroute.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. ASTroute.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class ASTroute extends SimpleNode {
- public ASTroute(int id) {
- super(id);
- }
-
- public ASTroute(AddressListParser p, int id) {
- super(p, id);
- }
-
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/address/parser/AddressListParser.java b/apache/org/apache/james/mime4j/field/address/parser/AddressListParser.java
deleted file mode 100644
index 8094df0ad..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/AddressListParser.java
+++ /dev/null
@@ -1,977 +0,0 @@
-/* Generated By:JJTree&JavaCC: Do not edit this line. AddressListParser.java */
-/*
- * Copyright 2004 the mime4j 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 org.apache.james.mime4j.field.address.parser;
-
-public class AddressListParser/*@bgen(jjtree)*/implements AddressListParserTreeConstants, AddressListParserConstants {/*@bgen(jjtree)*/
- protected JJTAddressListParserState jjtree = new JJTAddressListParserState();public static void main(String args[]) throws ParseException {
- while (true) {
- try {
- AddressListParser parser = new AddressListParser(System.in);
- parser.parseLine();
- ((SimpleNode)parser.jjtree.rootNode()).dump("> ");
- } catch (Exception x) {
- x.printStackTrace();
- return;
- }
- }
- }
-
- private static void log(String msg) {
- System.out.print(msg);
- }
-
- public ASTaddress_list parse() throws ParseException {
- try {
- parseAll();
- return (ASTaddress_list)jjtree.rootNode();
- } catch (TokenMgrError tme) {
- throw new ParseException(tme.getMessage());
- }
- }
-
-
- void jjtreeOpenNodeScope(Node n) {
- ((SimpleNode)n).firstToken = getToken(1);
- }
-
- void jjtreeCloseNodeScope(Node n) {
- ((SimpleNode)n).lastToken = getToken(0);
- }
-
- final public void parseLine() throws ParseException {
- address_list();
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 1:
- jj_consume_token(1);
- break;
- default:
- jj_la1[0] = jj_gen;
- ;
- }
- jj_consume_token(2);
- }
-
- final public void parseAll() throws ParseException {
- address_list();
- jj_consume_token(0);
- }
-
- final public void address_list() throws ParseException {
- /*@bgen(jjtree) address_list */
- ASTaddress_list jjtn000 = new ASTaddress_list(JJTADDRESS_LIST);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
- try {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 6:
- case DOTATOM:
- case QUOTEDSTRING:
- address();
- break;
- default:
- jj_la1[1] = jj_gen;
- ;
- }
- label_1:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 3:
- ;
- break;
- default:
- jj_la1[2] = jj_gen;
- break label_1;
- }
- jj_consume_token(3);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 6:
- case DOTATOM:
- case QUOTEDSTRING:
- address();
- break;
- default:
- jj_la1[3] = jj_gen;
- ;
- }
- }
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- {if (true) throw (RuntimeException)jjte000;}
- }
- if (jjte000 instanceof ParseException) {
- {if (true) throw (ParseException)jjte000;}
- }
- {if (true) throw (Error)jjte000;}
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
- }
-
- final public void address() throws ParseException {
- /*@bgen(jjtree) address */
- ASTaddress jjtn000 = new ASTaddress(JJTADDRESS);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
- try {
- if (jj_2_1(2147483647)) {
- addr_spec();
- } else {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 6:
- angle_addr();
- break;
- case DOTATOM:
- case QUOTEDSTRING:
- phrase();
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 4:
- group_body();
- break;
- case 6:
- angle_addr();
- break;
- default:
- jj_la1[4] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- break;
- default:
- jj_la1[5] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- {if (true) throw (RuntimeException)jjte000;}
- }
- if (jjte000 instanceof ParseException) {
- {if (true) throw (ParseException)jjte000;}
- }
- {if (true) throw (Error)jjte000;}
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
- }
-
- final public void mailbox() throws ParseException {
- /*@bgen(jjtree) mailbox */
- ASTmailbox jjtn000 = new ASTmailbox(JJTMAILBOX);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
- try {
- if (jj_2_2(2147483647)) {
- addr_spec();
- } else {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 6:
- angle_addr();
- break;
- case DOTATOM:
- case QUOTEDSTRING:
- name_addr();
- break;
- default:
- jj_la1[6] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- {if (true) throw (RuntimeException)jjte000;}
- }
- if (jjte000 instanceof ParseException) {
- {if (true) throw (ParseException)jjte000;}
- }
- {if (true) throw (Error)jjte000;}
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
- }
-
- final public void name_addr() throws ParseException {
- /*@bgen(jjtree) name_addr */
- ASTname_addr jjtn000 = new ASTname_addr(JJTNAME_ADDR);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
- try {
- phrase();
- angle_addr();
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- {if (true) throw (RuntimeException)jjte000;}
- }
- if (jjte000 instanceof ParseException) {
- {if (true) throw (ParseException)jjte000;}
- }
- {if (true) throw (Error)jjte000;}
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
- }
-
- final public void group_body() throws ParseException {
- /*@bgen(jjtree) group_body */
- ASTgroup_body jjtn000 = new ASTgroup_body(JJTGROUP_BODY);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
- try {
- jj_consume_token(4);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 6:
- case DOTATOM:
- case QUOTEDSTRING:
- mailbox();
- break;
- default:
- jj_la1[7] = jj_gen;
- ;
- }
- label_2:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 3:
- ;
- break;
- default:
- jj_la1[8] = jj_gen;
- break label_2;
- }
- jj_consume_token(3);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 6:
- case DOTATOM:
- case QUOTEDSTRING:
- mailbox();
- break;
- default:
- jj_la1[9] = jj_gen;
- ;
- }
- }
- jj_consume_token(5);
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- {if (true) throw (RuntimeException)jjte000;}
- }
- if (jjte000 instanceof ParseException) {
- {if (true) throw (ParseException)jjte000;}
- }
- {if (true) throw (Error)jjte000;}
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
- }
-
- final public void angle_addr() throws ParseException {
- /*@bgen(jjtree) angle_addr */
- ASTangle_addr jjtn000 = new ASTangle_addr(JJTANGLE_ADDR);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
- try {
- jj_consume_token(6);
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 8:
- route();
- break;
- default:
- jj_la1[10] = jj_gen;
- ;
- }
- addr_spec();
- jj_consume_token(7);
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- {if (true) throw (RuntimeException)jjte000;}
- }
- if (jjte000 instanceof ParseException) {
- {if (true) throw (ParseException)jjte000;}
- }
- {if (true) throw (Error)jjte000;}
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
- }
-
- final public void route() throws ParseException {
- /*@bgen(jjtree) route */
- ASTroute jjtn000 = new ASTroute(JJTROUTE);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
- try {
- jj_consume_token(8);
- domain();
- label_3:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 3:
- case 8:
- ;
- break;
- default:
- jj_la1[11] = jj_gen;
- break label_3;
- }
- label_4:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 3:
- ;
- break;
- default:
- jj_la1[12] = jj_gen;
- break label_4;
- }
- jj_consume_token(3);
- }
- jj_consume_token(8);
- domain();
- }
- jj_consume_token(4);
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- {if (true) throw (RuntimeException)jjte000;}
- }
- if (jjte000 instanceof ParseException) {
- {if (true) throw (ParseException)jjte000;}
- }
- {if (true) throw (Error)jjte000;}
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
- }
-
- final public void phrase() throws ParseException {
- /*@bgen(jjtree) phrase */
- ASTphrase jjtn000 = new ASTphrase(JJTPHRASE);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
- try {
- label_5:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case DOTATOM:
- jj_consume_token(DOTATOM);
- break;
- case QUOTEDSTRING:
- jj_consume_token(QUOTEDSTRING);
- break;
- default:
- jj_la1[13] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case DOTATOM:
- case QUOTEDSTRING:
- ;
- break;
- default:
- jj_la1[14] = jj_gen;
- break label_5;
- }
- }
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
- }
-
- final public void addr_spec() throws ParseException {
- /*@bgen(jjtree) addr_spec */
- ASTaddr_spec jjtn000 = new ASTaddr_spec(JJTADDR_SPEC);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
- try {
- local_part();
- jj_consume_token(8);
- domain();
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- {if (true) throw (RuntimeException)jjte000;}
- }
- if (jjte000 instanceof ParseException) {
- {if (true) throw (ParseException)jjte000;}
- }
- {if (true) throw (Error)jjte000;}
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
- }
-
- final public void local_part() throws ParseException {
- /*@bgen(jjtree) local_part */
- ASTlocal_part jjtn000 = new ASTlocal_part(JJTLOCAL_PART);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);Token t;
- try {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case DOTATOM:
- t = jj_consume_token(DOTATOM);
- break;
- case QUOTEDSTRING:
- t = jj_consume_token(QUOTEDSTRING);
- break;
- default:
- jj_la1[15] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- label_6:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 9:
- case DOTATOM:
- case QUOTEDSTRING:
- ;
- break;
- default:
- jj_la1[16] = jj_gen;
- break label_6;
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 9:
- t = jj_consume_token(9);
- break;
- default:
- jj_la1[17] = jj_gen;
- ;
- }
- if (t.image.charAt(t.image.length() - 1) != '.' || t.kind == AddressListParserConstants.QUOTEDSTRING)
- {if (true) throw new ParseException("Words in local part must be separated by '.'");}
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case DOTATOM:
- t = jj_consume_token(DOTATOM);
- break;
- case QUOTEDSTRING:
- t = jj_consume_token(QUOTEDSTRING);
- break;
- default:
- jj_la1[18] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- }
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
- }
-
- final public void domain() throws ParseException {
- /*@bgen(jjtree) domain */
- ASTdomain jjtn000 = new ASTdomain(JJTDOMAIN);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);Token t;
- try {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case DOTATOM:
- t = jj_consume_token(DOTATOM);
- label_7:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 9:
- case DOTATOM:
- ;
- break;
- default:
- jj_la1[19] = jj_gen;
- break label_7;
- }
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 9:
- t = jj_consume_token(9);
- break;
- default:
- jj_la1[20] = jj_gen;
- ;
- }
- if (t.image.charAt(t.image.length() - 1) != '.')
- {if (true) throw new ParseException("Atoms in domain names must be separated by '.'");}
- t = jj_consume_token(DOTATOM);
- }
- break;
- case DOMAINLITERAL:
- jj_consume_token(DOMAINLITERAL);
- break;
- default:
- jj_la1[21] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
- }
-
- final private boolean jj_2_1(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_1(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(0, xla); }
- }
-
- final private boolean jj_2_2(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_2(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(1, xla); }
- }
-
- final private boolean jj_3R_11() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_scan_token(9)) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_scan_token(14)) {
- jj_scanpos = xsp;
- if (jj_scan_token(31)) return true;
- }
- return false;
- }
-
- final private boolean jj_3R_13() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_scan_token(9)) jj_scanpos = xsp;
- if (jj_scan_token(DOTATOM)) return true;
- return false;
- }
-
- final private boolean jj_3R_8() {
- if (jj_3R_9()) return true;
- if (jj_scan_token(8)) return true;
- if (jj_3R_10()) return true;
- return false;
- }
-
- final private boolean jj_3_1() {
- if (jj_3R_8()) return true;
- return false;
- }
-
- final private boolean jj_3R_12() {
- if (jj_scan_token(DOTATOM)) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_13()) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- final private boolean jj_3R_10() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_12()) {
- jj_scanpos = xsp;
- if (jj_scan_token(18)) return true;
- }
- return false;
- }
-
- final private boolean jj_3_2() {
- if (jj_3R_8()) return true;
- return false;
- }
-
- final private boolean jj_3R_9() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_scan_token(14)) {
- jj_scanpos = xsp;
- if (jj_scan_token(31)) return true;
- }
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_11()) { jj_scanpos = xsp; break; }
- }
- return false;
- }
-
- public AddressListParserTokenManager token_source;
- SimpleCharStream jj_input_stream;
- public Token token, jj_nt;
- private int jj_ntk;
- private Token jj_scanpos, jj_lastpos;
- private int jj_la;
- public boolean lookingAhead = false;
- private boolean jj_semLA;
- private int jj_gen;
- final private int[] jj_la1 = new int[22];
- static private int[] jj_la1_0;
- static private int[] jj_la1_1;
- static {
- jj_la1_0();
- jj_la1_1();
- }
- private static void jj_la1_0() {
- jj_la1_0 = new int[] {0x2,0x80004040,0x8,0x80004040,0x50,0x80004040,0x80004040,0x80004040,0x8,0x80004040,0x100,0x108,0x8,0x80004000,0x80004000,0x80004000,0x80004200,0x200,0x80004000,0x4200,0x200,0x44000,};
- }
- private static void jj_la1_1() {
- jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
- }
- final private JJCalls[] jj_2_rtns = new JJCalls[2];
- private boolean jj_rescan = false;
- private int jj_gc = 0;
-
- public AddressListParser(java.io.InputStream stream) {
- this(stream, null);
- }
- public AddressListParser(java.io.InputStream stream, String encoding) {
- try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
- token_source = new AddressListParserTokenManager(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 22; i++) jj_la1[i] = -1;
- for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
- }
-
- public void ReInit(java.io.InputStream stream) {
- ReInit(stream, null);
- }
- public void ReInit(java.io.InputStream stream, String encoding) {
- try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
- token_source.ReInit(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jjtree.reset();
- jj_gen = 0;
- for (int i = 0; i < 22; i++) jj_la1[i] = -1;
- for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
- }
-
- public AddressListParser(java.io.Reader stream) {
- jj_input_stream = new SimpleCharStream(stream, 1, 1);
- token_source = new AddressListParserTokenManager(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 22; i++) jj_la1[i] = -1;
- for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
- }
-
- public void ReInit(java.io.Reader stream) {
- jj_input_stream.ReInit(stream, 1, 1);
- token_source.ReInit(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jjtree.reset();
- jj_gen = 0;
- for (int i = 0; i < 22; i++) jj_la1[i] = -1;
- for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
- }
-
- public AddressListParser(AddressListParserTokenManager tm) {
- token_source = tm;
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 22; i++) jj_la1[i] = -1;
- for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
- }
-
- public void ReInit(AddressListParserTokenManager tm) {
- token_source = tm;
- token = new Token();
- jj_ntk = -1;
- jjtree.reset();
- jj_gen = 0;
- for (int i = 0; i < 22; i++) jj_la1[i] = -1;
- for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
- }
-
- final private Token jj_consume_token(int kind) throws ParseException {
- Token oldToken;
- if ((oldToken = token).next != null) token = token.next;
- else token = token.next = token_source.getNextToken();
- jj_ntk = -1;
- if (token.kind == kind) {
- jj_gen++;
- if (++jj_gc > 100) {
- jj_gc = 0;
- for (int i = 0; i < jj_2_rtns.length; i++) {
- JJCalls c = jj_2_rtns[i];
- while (c != null) {
- if (c.gen < jj_gen) c.first = null;
- c = c.next;
- }
- }
- }
- return token;
- }
- token = oldToken;
- jj_kind = kind;
- throw generateParseException();
- }
-
- static private final class LookaheadSuccess extends java.lang.Error { }
- final private LookaheadSuccess jj_ls = new LookaheadSuccess();
- final private boolean jj_scan_token(int kind) {
- if (jj_scanpos == jj_lastpos) {
- jj_la--;
- if (jj_scanpos.next == null) {
- jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
- } else {
- jj_lastpos = jj_scanpos = jj_scanpos.next;
- }
- } else {
- jj_scanpos = jj_scanpos.next;
- }
- if (jj_rescan) {
- int i = 0; Token tok = token;
- while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }
- if (tok != null) jj_add_error_token(kind, i);
- }
- if (jj_scanpos.kind != kind) return true;
- if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
- return false;
- }
-
- final public Token getNextToken() {
- if (token.next != null) token = token.next;
- else token = token.next = token_source.getNextToken();
- jj_ntk = -1;
- jj_gen++;
- return token;
- }
-
- final public Token getToken(int index) {
- Token t = lookingAhead ? jj_scanpos : token;
- for (int i = 0; i < index; i++) {
- if (t.next != null) t = t.next;
- else t = t.next = token_source.getNextToken();
- }
- return t;
- }
-
- final private int jj_ntk() {
- if ((jj_nt=token.next) == null)
- return (jj_ntk = (token.next=token_source.getNextToken()).kind);
- else
- return (jj_ntk = jj_nt.kind);
- }
-
- private java.util.Vector jj_expentries = new java.util.Vector();
- private int[] jj_expentry;
- private int jj_kind = -1;
- private int[] jj_lasttokens = new int[100];
- private int jj_endpos;
-
- private void jj_add_error_token(int kind, int pos) {
- if (pos >= 100) return;
- if (pos == jj_endpos + 1) {
- jj_lasttokens[jj_endpos++] = kind;
- } else if (jj_endpos != 0) {
- jj_expentry = new int[jj_endpos];
- for (int i = 0; i < jj_endpos; i++) {
- jj_expentry[i] = jj_lasttokens[i];
- }
- boolean exists = false;
- for (java.util.Enumeration e = jj_expentries.elements(); e.hasMoreElements();) {
- int[] oldentry = e.nextElement();
- if (oldentry.length == jj_expentry.length) {
- exists = true;
- for (int i = 0; i < jj_expentry.length; i++) {
- if (oldentry[i] != jj_expentry[i]) {
- exists = false;
- break;
- }
- }
- if (exists) break;
- }
- }
- if (!exists) jj_expentries.addElement(jj_expentry);
- if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;
- }
- }
-
- public ParseException generateParseException() {
- jj_expentries.removeAllElements();
- boolean[] la1tokens = new boolean[34];
- for (int i = 0; i < 34; i++) {
- la1tokens[i] = false;
- }
- if (jj_kind >= 0) {
- la1tokens[jj_kind] = true;
- jj_kind = -1;
- }
- for (int i = 0; i < 22; i++) {
- if (jj_la1[i] == jj_gen) {
- for (int j = 0; j < 32; j++) {
- if ((jj_la1_0[i] & (1< jj_gen) {
- jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
- switch (i) {
- case 0: jj_3_1(); break;
- case 1: jj_3_2(); break;
- }
- }
- p = p.next;
- } while (p != null);
- } catch(LookaheadSuccess ls) { }
- }
- jj_rescan = false;
- }
-
- final private void jj_save(int index, int xla) {
- JJCalls p = jj_2_rtns[index];
- while (p.gen > jj_gen) {
- if (p.next == null) { p = p.next = new JJCalls(); break; }
- p = p.next;
- }
- p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla;
- }
-
- static final class JJCalls {
- int gen;
- Token first;
- int arg;
- JJCalls next;
- }
-
-}
diff --git a/apache/org/apache/james/mime4j/field/address/parser/AddressListParser.jj b/apache/org/apache/james/mime4j/field/address/parser/AddressListParser.jj
deleted file mode 100644
index c14277bc6..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/AddressListParser.jj
+++ /dev/null
@@ -1,595 +0,0 @@
-/*@bgen(jjtree) Generated By:JJTree: Do not edit this line. /Users/jason/Projects/apache-mime4j-0.3/target/generated-sources/jjtree/org/apache/james/mime4j/field/address/parser/AddressListParser.jj */
-/*@egen*//****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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. *
- ****************************************************************/
-
-
-/**
- * RFC2822 address list parser.
- *
- * Created 9/17/2004
- * by Joe Cheng
- */
-
-options {
- STATIC=false;
- LOOKAHEAD=1;
- //DEBUG_PARSER=true;
- //DEBUG_TOKEN_MANAGER=true;
-}
-
-PARSER_BEGIN(AddressListParser)
-/*
- * Copyright 2004 the mime4j 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 org.apache.james.mime4j.field.address.parser;
-
-public class AddressListParser/*@bgen(jjtree)*/implements AddressListParserTreeConstants/*@egen*/ {/*@bgen(jjtree)*/
- protected JJTAddressListParserState jjtree = new JJTAddressListParserState();
-
-/*@egen*/
- public static void main(String args[]) throws ParseException {
- while (true) {
- try {
- AddressListParser parser = new AddressListParser(System.in);
- parser.parseLine();
- ((SimpleNode)parser.jjtree.rootNode()).dump("> ");
- } catch (Exception x) {
- x.printStackTrace();
- return;
- }
- }
- }
-
- private static void log(String msg) {
- System.out.print(msg);
- }
-
- public ASTaddress_list parse() throws ParseException {
- try {
- parseAll();
- return (ASTaddress_list)jjtree.rootNode();
- } catch (TokenMgrError tme) {
- throw new ParseException(tme.getMessage());
- }
- }
-
-
- void jjtreeOpenNodeScope(Node n) {
- ((SimpleNode)n).firstToken = getToken(1);
- }
-
- void jjtreeCloseNodeScope(Node n) {
- ((SimpleNode)n).lastToken = getToken(0);
- }
-}
-
-PARSER_END(AddressListParser)
-
-void parseLine() :
-{}
-{
- address_list() ["\r"] "\n"
-}
-
-void parseAll() :
-{}
-{
- address_list()
-}
-
-void address_list() :
-{/*@bgen(jjtree) address_list */
- ASTaddress_list jjtn000 = new ASTaddress_list(JJTADDRESS_LIST);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) address_list */
- try {
-/*@egen*/
- [ address() ]
- (
- ","
- [ address() ]
- )*/*@bgen(jjtree)*/
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- throw (RuntimeException)jjte000;
- }
- if (jjte000 instanceof ParseException) {
- throw (ParseException)jjte000;
- }
- throw (Error)jjte000;
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
-/*@egen*/
-}
-
-void address() :
-{/*@bgen(jjtree) address */
- ASTaddress jjtn000 = new ASTaddress(JJTADDRESS);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) address */
- try {
-/*@egen*/
- LOOKAHEAD(2147483647)
- addr_spec()
-| angle_addr()
-| ( phrase() (group_body() | angle_addr()) )/*@bgen(jjtree)*/
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- throw (RuntimeException)jjte000;
- }
- if (jjte000 instanceof ParseException) {
- throw (ParseException)jjte000;
- }
- throw (Error)jjte000;
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
-/*@egen*/
-}
-
-void mailbox() :
-{/*@bgen(jjtree) mailbox */
- ASTmailbox jjtn000 = new ASTmailbox(JJTMAILBOX);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) mailbox */
- try {
-/*@egen*/
- LOOKAHEAD(2147483647)
- addr_spec()
-| angle_addr()
-| name_addr()/*@bgen(jjtree)*/
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- throw (RuntimeException)jjte000;
- }
- if (jjte000 instanceof ParseException) {
- throw (ParseException)jjte000;
- }
- throw (Error)jjte000;
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
-/*@egen*/
-}
-
-void name_addr() :
-{/*@bgen(jjtree) name_addr */
- ASTname_addr jjtn000 = new ASTname_addr(JJTNAME_ADDR);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) name_addr */
- try {
-/*@egen*/
- phrase() angle_addr()/*@bgen(jjtree)*/
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- throw (RuntimeException)jjte000;
- }
- if (jjte000 instanceof ParseException) {
- throw (ParseException)jjte000;
- }
- throw (Error)jjte000;
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
-/*@egen*/
-}
-
-void group_body() :
-{/*@bgen(jjtree) group_body */
- ASTgroup_body jjtn000 = new ASTgroup_body(JJTGROUP_BODY);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) group_body */
- try {
-/*@egen*/
- ":"
- [ mailbox() ]
- (
- ","
- [ mailbox() ]
- )*
- ";"/*@bgen(jjtree)*/
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- throw (RuntimeException)jjte000;
- }
- if (jjte000 instanceof ParseException) {
- throw (ParseException)jjte000;
- }
- throw (Error)jjte000;
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
-/*@egen*/
-}
-
-void angle_addr() :
-{/*@bgen(jjtree) angle_addr */
- ASTangle_addr jjtn000 = new ASTangle_addr(JJTANGLE_ADDR);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) angle_addr */
- try {
-/*@egen*/
- "<" [ route() ] addr_spec() ">"/*@bgen(jjtree)*/
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- throw (RuntimeException)jjte000;
- }
- if (jjte000 instanceof ParseException) {
- throw (ParseException)jjte000;
- }
- throw (Error)jjte000;
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
-/*@egen*/
-}
-
-void route() :
-{/*@bgen(jjtree) route */
- ASTroute jjtn000 = new ASTroute(JJTROUTE);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) route */
- try {
-/*@egen*/
- "@" domain() ( (",")* "@" domain() )* ":"/*@bgen(jjtree)*/
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- throw (RuntimeException)jjte000;
- }
- if (jjte000 instanceof ParseException) {
- throw (ParseException)jjte000;
- }
- throw (Error)jjte000;
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
-/*@egen*/
-}
-
-void phrase() :
-{/*@bgen(jjtree) phrase */
- ASTphrase jjtn000 = new ASTphrase(JJTPHRASE);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) phrase */
-try {
-/*@egen*/
-(
-|
-)+/*@bgen(jjtree)*/
-} finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
-}
-/*@egen*/
-}
-
-void addr_spec() :
-{/*@bgen(jjtree) addr_spec */
- ASTaddr_spec jjtn000 = new ASTaddr_spec(JJTADDR_SPEC);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) addr_spec */
- try {
-/*@egen*/
- ( local_part() "@" domain() )/*@bgen(jjtree)*/
- } catch (Throwable jjte000) {
- if (jjtc000) {
- jjtree.clearNodeScope(jjtn000);
- jjtc000 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte000 instanceof RuntimeException) {
- throw (RuntimeException)jjte000;
- }
- if (jjte000 instanceof ParseException) {
- throw (ParseException)jjte000;
- }
- throw (Error)jjte000;
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
-/*@egen*/
-}
-
-void local_part() :
-{/*@bgen(jjtree) local_part */
- ASTlocal_part jjtn000 = new ASTlocal_part(JJTLOCAL_PART);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
-/*@egen*/ Token t; }
-{/*@bgen(jjtree) local_part */
- try {
-/*@egen*/
- ( t= | t= )
- ( [t="."]
- {
- if (t.image.charAt(t.image.length() - 1) != '.' || t.kind == AddressListParserConstants.QUOTEDSTRING)
- throw new ParseException("Words in local part must be separated by '.'");
- }
- ( t= | t= )
- )*/*@bgen(jjtree)*/
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
-/*@egen*/
-}
-
-void domain() :
-{/*@bgen(jjtree) domain */
- ASTdomain jjtn000 = new ASTdomain(JJTDOMAIN);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- jjtreeOpenNodeScope(jjtn000);
-/*@egen*/ Token t; }
-{/*@bgen(jjtree) domain */
- try {
-/*@egen*/
- ( t=
- ( [t="."]
- {
- if (t.image.charAt(t.image.length() - 1) != '.')
- throw new ParseException("Atoms in domain names must be separated by '.'");
- }
- t=
- )*
- )
-| /*@bgen(jjtree)*/
- } finally {
- if (jjtc000) {
- jjtree.closeNodeScope(jjtn000, true);
- jjtreeCloseNodeScope(jjtn000);
- }
- }
-/*@egen*/
-}
-
-SPECIAL_TOKEN :
-{
- < WS: ( [" ", "\t"] )+ >
-}
-
-TOKEN :
-{
- < #ALPHA: ["a" - "z", "A" - "Z"] >
-| < #DIGIT: ["0" - "9"] >
-| < #ATEXT: ( |
- | "!" | "#" | "$" | "%"
- | "&" | "'" | "*" | "+"
- | "-" | "/" | "=" | "?"
- | "^" | "_" | "`" | "{"
- | "|" | "}" | "~"
- )>
-| < DOTATOM: ( | "." )* >
-}
-
-TOKEN_MGR_DECLS :
-{
- // Keeps track of how many levels of comment nesting
- // we've encountered. This is only used when the 2nd
- // level is reached, for example ((this)), not (this).
- // This is because the outermost level must be treated
- // specially anyway, because the outermost ")" has a
- // different token type than inner ")" instances.
- static int commentNest;
-}
-
-MORE :
-{
- // domain literal
- "[" : INDOMAINLITERAL
-}
-
-
-MORE :
-{
- < > { image.deleteCharAt(image.length() - 2); }
-| < ~["[", "]", "\\"] >
-}
-
-
-TOKEN :
-{
- < DOMAINLITERAL: "]" > { matchedToken.image = image.toString(); }: DEFAULT
-}
-
-MORE :
-{
- // starts a comment
- "(" : INCOMMENT
-}
-
-
-SKIP :
-{
- // ends a comment
- < COMMENT: ")" > : DEFAULT
- // if this is ever changed to not be a SKIP, need
- // to make sure matchedToken.token = token.toString()
- // is called.
-}
-
-
-MORE :
-{
- < > { image.deleteCharAt(image.length() - 2); }
-| "(" { commentNest = 1; } : NESTED_COMMENT
-| < >
-}
-
-
-MORE :
-{
- < > { image.deleteCharAt(image.length() - 2); }
-| "(" { ++commentNest; }
-| ")" { --commentNest; if (commentNest == 0) SwitchTo(INCOMMENT); }
-| < >
-}
-
-
-// QUOTED STRINGS
-
-MORE :
-{
- "\"" { image.deleteCharAt(image.length() - 1); } : INQUOTEDSTRING
-}
-
-
-MORE :
-{
- < > { image.deleteCharAt(image.length() - 2); }
-| < (~["\"", "\\"])+ >
-}
-
-
-TOKEN :
-{
- < QUOTEDSTRING: "\"" > { matchedToken.image = image.substring(0, image.length() - 1); } : DEFAULT
-}
-
-// GLOBALS
-
-<*>
-TOKEN :
-{
- < #QUOTEDPAIR: "\\" >
-| < #ANY: ~[] >
-}
-
-// ERROR!
-/*
-
-<*>
-TOKEN :
-{
- < UNEXPECTED_CHAR: >
-}
-
-*/
\ No newline at end of file
diff --git a/apache/org/apache/james/mime4j/field/address/parser/AddressListParserConstants.java b/apache/org/apache/james/mime4j/field/address/parser/AddressListParserConstants.java
deleted file mode 100644
index 006a082c1..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/AddressListParserConstants.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/* Generated By:JJTree&JavaCC: Do not edit this line. AddressListParserConstants.java */
-/*
- * Copyright 2004 the mime4j 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 org.apache.james.mime4j.field.address.parser;
-
-public interface AddressListParserConstants {
-
- int EOF = 0;
- int WS = 10;
- int ALPHA = 11;
- int DIGIT = 12;
- int ATEXT = 13;
- int DOTATOM = 14;
- int DOMAINLITERAL = 18;
- int COMMENT = 20;
- int QUOTEDSTRING = 31;
- int QUOTEDPAIR = 32;
- int ANY = 33;
-
- int DEFAULT = 0;
- int INDOMAINLITERAL = 1;
- int INCOMMENT = 2;
- int NESTED_COMMENT = 3;
- int INQUOTEDSTRING = 4;
-
- String[] tokenImage = {
- "",
- "\"\\r\"",
- "\"\\n\"",
- "\",\"",
- "\":\"",
- "\";\"",
- "\"<\"",
- "\">\"",
- "\"@\"",
- "\".\"",
- "",
- "",
- "",
- "",
- "",
- "\"[\"",
- "",
- "",
- "\"]\"",
- "\"(\"",
- "\")\"",
- "",
- "\"(\"",
- "",
- "",
- "\"(\"",
- "\")\"",
- "",
- "\"\\\"\"",
- "",
- "",
- "\"\\\"\"",
- "",
- "",
- };
-
-}
diff --git a/apache/org/apache/james/mime4j/field/address/parser/AddressListParserTokenManager.java b/apache/org/apache/james/mime4j/field/address/parser/AddressListParserTokenManager.java
deleted file mode 100644
index d2dd88dd3..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/AddressListParserTokenManager.java
+++ /dev/null
@@ -1,1009 +0,0 @@
-/* Generated By:JJTree&JavaCC: Do not edit this line. AddressListParserTokenManager.java */
-/*
- * Copyright 2004 the mime4j 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 org.apache.james.mime4j.field.address.parser;
-
-public class AddressListParserTokenManager implements AddressListParserConstants
-{
- // Keeps track of how many levels of comment nesting
- // we've encountered. This is only used when the 2nd
- // level is reached, for example ((this)), not (this).
- // This is because the outermost level must be treated
- // specially anyway, because the outermost ")" has a
- // different token type than inner ")" instances.
- static int commentNest;
- public java.io.PrintStream debugStream = System.out;
- public void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
-private final int jjStopStringLiteralDfa_0(int pos, long active0)
-{
- switch (pos)
- {
- default :
- return -1;
- }
-}
-private final int jjStartNfa_0(int pos, long active0)
-{
- return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1);
-}
-private final int jjStopAtPos(int pos, int kind)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- return pos + 1;
-}
-private final int jjStartNfaWithStates_0(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_0(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_0()
-{
- switch(curChar)
- {
- case 10:
- return jjStopAtPos(0, 2);
- case 13:
- return jjStopAtPos(0, 1);
- case 34:
- return jjStopAtPos(0, 28);
- case 40:
- return jjStopAtPos(0, 19);
- case 44:
- return jjStopAtPos(0, 3);
- case 46:
- return jjStopAtPos(0, 9);
- case 58:
- return jjStopAtPos(0, 4);
- case 59:
- return jjStopAtPos(0, 5);
- case 60:
- return jjStopAtPos(0, 6);
- case 62:
- return jjStopAtPos(0, 7);
- case 64:
- return jjStopAtPos(0, 8);
- case 91:
- return jjStopAtPos(0, 15);
- default :
- return jjMoveNfa_0(1, 0);
- }
-}
-private final void jjCheckNAdd(int state)
-{
- if (jjrounds[state] != jjround)
- {
- jjstateSet[jjnewStateCnt++] = state;
- jjrounds[state] = jjround;
- }
-}
-private final void jjAddStates(int start, int end)
-{
- do {
- jjstateSet[jjnewStateCnt++] = jjnextStates[start];
- } while (start++ != end);
-}
-private final void jjCheckNAddTwoStates(int state1, int state2)
-{
- jjCheckNAdd(state1);
- jjCheckNAdd(state2);
-}
-private final void jjCheckNAddStates(int start, int end)
-{
- do {
- jjCheckNAdd(jjnextStates[start]);
- } while (start++ != end);
-}
-private final void jjCheckNAddStates(int start)
-{
- jjCheckNAdd(jjnextStates[start]);
- jjCheckNAdd(jjnextStates[start + 1]);
-}
-private final int jjMoveNfa_0(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 3;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 1:
- if ((0xa3ffacfa00000000L & l) != 0L)
- {
- if (kind > 14)
- kind = 14;
- jjCheckNAdd(2);
- }
- else if ((0x100000200L & l) != 0L)
- {
- if (kind > 10)
- kind = 10;
- jjCheckNAdd(0);
- }
- break;
- case 0:
- if ((0x100000200L & l) == 0L)
- break;
- kind = 10;
- jjCheckNAdd(0);
- break;
- case 2:
- if ((0xa3ffecfa00000000L & l) == 0L)
- break;
- if (kind > 14)
- kind = 14;
- jjCheckNAdd(2);
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 1:
- case 2:
- if ((0x7fffffffc7fffffeL & l) == 0L)
- break;
- if (kind > 14)
- kind = 14;
- jjCheckNAdd(2);
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-private final int jjStopStringLiteralDfa_2(int pos, long active0)
-{
- switch (pos)
- {
- default :
- return -1;
- }
-}
-private final int jjStartNfa_2(int pos, long active0)
-{
- return jjMoveNfa_2(jjStopStringLiteralDfa_2(pos, active0), pos + 1);
-}
-private final int jjStartNfaWithStates_2(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_2(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_2()
-{
- switch(curChar)
- {
- case 40:
- return jjStopAtPos(0, 22);
- case 41:
- return jjStopAtPos(0, 20);
- default :
- return jjMoveNfa_2(0, 0);
- }
-}
-static final long[] jjbitVec0 = {
- 0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
-private final int jjMoveNfa_2(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 3;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 23)
- kind = 23;
- break;
- case 1:
- if (kind > 21)
- kind = 21;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 23)
- kind = 23;
- if (curChar == 92)
- jjstateSet[jjnewStateCnt++] = 1;
- break;
- case 1:
- if (kind > 21)
- kind = 21;
- break;
- case 2:
- if (kind > 23)
- kind = 23;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 23)
- kind = 23;
- break;
- case 1:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 21)
- kind = 21;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-private final int jjStopStringLiteralDfa_4(int pos, long active0)
-{
- switch (pos)
- {
- default :
- return -1;
- }
-}
-private final int jjStartNfa_4(int pos, long active0)
-{
- return jjMoveNfa_4(jjStopStringLiteralDfa_4(pos, active0), pos + 1);
-}
-private final int jjStartNfaWithStates_4(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_4(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_4()
-{
- switch(curChar)
- {
- case 34:
- return jjStopAtPos(0, 31);
- default :
- return jjMoveNfa_4(0, 0);
- }
-}
-private final int jjMoveNfa_4(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 3;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- case 2:
- if ((0xfffffffbffffffffL & l) == 0L)
- break;
- if (kind > 30)
- kind = 30;
- jjCheckNAdd(2);
- break;
- case 1:
- if (kind > 29)
- kind = 29;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((0xffffffffefffffffL & l) != 0L)
- {
- if (kind > 30)
- kind = 30;
- jjCheckNAdd(2);
- }
- else if (curChar == 92)
- jjstateSet[jjnewStateCnt++] = 1;
- break;
- case 1:
- if (kind > 29)
- kind = 29;
- break;
- case 2:
- if ((0xffffffffefffffffL & l) == 0L)
- break;
- if (kind > 30)
- kind = 30;
- jjCheckNAdd(2);
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- case 2:
- if ((jjbitVec0[i2] & l2) == 0L)
- break;
- if (kind > 30)
- kind = 30;
- jjCheckNAdd(2);
- break;
- case 1:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 29)
- kind = 29;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-private final int jjStopStringLiteralDfa_3(int pos, long active0)
-{
- switch (pos)
- {
- default :
- return -1;
- }
-}
-private final int jjStartNfa_3(int pos, long active0)
-{
- return jjMoveNfa_3(jjStopStringLiteralDfa_3(pos, active0), pos + 1);
-}
-private final int jjStartNfaWithStates_3(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_3(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_3()
-{
- switch(curChar)
- {
- case 40:
- return jjStopAtPos(0, 25);
- case 41:
- return jjStopAtPos(0, 26);
- default :
- return jjMoveNfa_3(0, 0);
- }
-}
-private final int jjMoveNfa_3(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 3;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 27)
- kind = 27;
- break;
- case 1:
- if (kind > 24)
- kind = 24;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 27)
- kind = 27;
- if (curChar == 92)
- jjstateSet[jjnewStateCnt++] = 1;
- break;
- case 1:
- if (kind > 24)
- kind = 24;
- break;
- case 2:
- if (kind > 27)
- kind = 27;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 27)
- kind = 27;
- break;
- case 1:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 24)
- kind = 24;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-private final int jjStopStringLiteralDfa_1(int pos, long active0)
-{
- switch (pos)
- {
- default :
- return -1;
- }
-}
-private final int jjStartNfa_1(int pos, long active0)
-{
- return jjMoveNfa_1(jjStopStringLiteralDfa_1(pos, active0), pos + 1);
-}
-private final int jjStartNfaWithStates_1(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_1(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_1()
-{
- switch(curChar)
- {
- case 93:
- return jjStopAtPos(0, 18);
- default :
- return jjMoveNfa_1(0, 0);
- }
-}
-private final int jjMoveNfa_1(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 3;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 17)
- kind = 17;
- break;
- case 1:
- if (kind > 16)
- kind = 16;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((0xffffffffc7ffffffL & l) != 0L)
- {
- if (kind > 17)
- kind = 17;
- }
- else if (curChar == 92)
- jjstateSet[jjnewStateCnt++] = 1;
- break;
- case 1:
- if (kind > 16)
- kind = 16;
- break;
- case 2:
- if ((0xffffffffc7ffffffL & l) != 0L && kind > 17)
- kind = 17;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 17)
- kind = 17;
- break;
- case 1:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 16)
- kind = 16;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-static final int[] jjnextStates = {
-};
-public static final String[] jjstrLiteralImages = {
-"", "\15", "\12", "\54", "\72", "\73", "\74", "\76", "\100", "\56", null, null,
-null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-null, null, null, null, null, null, null, null, };
-public static final String[] lexStateNames = {
- "DEFAULT",
- "INDOMAINLITERAL",
- "INCOMMENT",
- "NESTED_COMMENT",
- "INQUOTEDSTRING",
-};
-public static final int[] jjnewLexState = {
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 0, 2, 0, -1, 3, -1, -1,
- -1, -1, -1, 4, -1, -1, 0, -1, -1,
-};
-static final long[] jjtoToken = {
- 0x800443ffL,
-};
-static final long[] jjtoSkip = {
- 0x100400L,
-};
-static final long[] jjtoSpecial = {
- 0x400L,
-};
-static final long[] jjtoMore = {
- 0x7feb8000L,
-};
-protected SimpleCharStream input_stream;
-private final int[] jjrounds = new int[3];
-private final int[] jjstateSet = new int[6];
-StringBuffer image;
-int jjimageLen;
-int lengthOfMatch;
-protected char curChar;
-public AddressListParserTokenManager(SimpleCharStream stream){
- if (SimpleCharStream.staticFlag)
- throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
- input_stream = stream;
-}
-public AddressListParserTokenManager(SimpleCharStream stream, int lexState){
- this(stream);
- SwitchTo(lexState);
-}
-public void ReInit(SimpleCharStream stream)
-{
- jjmatchedPos = jjnewStateCnt = 0;
- curLexState = defaultLexState;
- input_stream = stream;
- ReInitRounds();
-}
-private final void ReInitRounds()
-{
- int i;
- jjround = 0x80000001;
- for (i = 3; i-- > 0;)
- jjrounds[i] = 0x80000000;
-}
-public void ReInit(SimpleCharStream stream, int lexState)
-{
- ReInit(stream);
- SwitchTo(lexState);
-}
-public void SwitchTo(int lexState)
-{
- if (lexState >= 5 || lexState < 0)
- throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
- else
- curLexState = lexState;
-}
-
-protected Token jjFillToken()
-{
- Token t = Token.newToken(jjmatchedKind);
- t.kind = jjmatchedKind;
- String im = jjstrLiteralImages[jjmatchedKind];
- t.image = (im == null) ? input_stream.GetImage() : im;
- t.beginLine = input_stream.getBeginLine();
- t.beginColumn = input_stream.getBeginColumn();
- t.endLine = input_stream.getEndLine();
- t.endColumn = input_stream.getEndColumn();
- return t;
-}
-
-int curLexState = 0;
-int defaultLexState = 0;
-int jjnewStateCnt;
-int jjround;
-int jjmatchedPos;
-int jjmatchedKind;
-
-public Token getNextToken()
-{
- int kind;
- Token specialToken = null;
- Token matchedToken;
- int curPos = 0;
-
- EOFLoop :
- for (;;)
- {
- try
- {
- curChar = input_stream.BeginToken();
- }
- catch(java.io.IOException e)
- {
- jjmatchedKind = 0;
- matchedToken = jjFillToken();
- matchedToken.specialToken = specialToken;
- return matchedToken;
- }
- image = null;
- jjimageLen = 0;
-
- for (;;)
- {
- switch(curLexState)
- {
- case 0:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_0();
- break;
- case 1:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_1();
- break;
- case 2:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_2();
- break;
- case 3:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_3();
- break;
- case 4:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_4();
- break;
- }
- if (jjmatchedKind != 0x7fffffff)
- {
- if (jjmatchedPos + 1 < curPos)
- input_stream.backup(curPos - jjmatchedPos - 1);
- if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
- {
- matchedToken = jjFillToken();
- matchedToken.specialToken = specialToken;
- TokenLexicalActions(matchedToken);
- if (jjnewLexState[jjmatchedKind] != -1)
- curLexState = jjnewLexState[jjmatchedKind];
- return matchedToken;
- }
- else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
- {
- if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
- {
- matchedToken = jjFillToken();
- if (specialToken == null)
- specialToken = matchedToken;
- else
- {
- matchedToken.specialToken = specialToken;
- specialToken = (specialToken.next = matchedToken);
- }
- }
- if (jjnewLexState[jjmatchedKind] != -1)
- curLexState = jjnewLexState[jjmatchedKind];
- continue EOFLoop;
- }
- MoreLexicalActions();
- if (jjnewLexState[jjmatchedKind] != -1)
- curLexState = jjnewLexState[jjmatchedKind];
- curPos = 0;
- jjmatchedKind = 0x7fffffff;
- try {
- curChar = input_stream.readChar();
- continue;
- }
- catch (java.io.IOException e1) { }
- }
- int error_line = input_stream.getEndLine();
- int error_column = input_stream.getEndColumn();
- String error_after = null;
- boolean EOFSeen = false;
- try { input_stream.readChar(); input_stream.backup(1); }
- catch (java.io.IOException e1) {
- EOFSeen = true;
- error_after = curPos <= 1 ? "" : input_stream.GetImage();
- if (curChar == '\n' || curChar == '\r') {
- error_line++;
- error_column = 0;
- }
- else
- error_column++;
- }
- if (!EOFSeen) {
- input_stream.backup(1);
- error_after = curPos <= 1 ? "" : input_stream.GetImage();
- }
- throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
- }
- }
-}
-
-void MoreLexicalActions()
-{
- jjimageLen += (lengthOfMatch = jjmatchedPos + 1);
- switch(jjmatchedKind)
- {
- case 16 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- image.deleteCharAt(image.length() - 2);
- break;
- case 21 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- image.deleteCharAt(image.length() - 2);
- break;
- case 22 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- commentNest = 1;
- break;
- case 24 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- image.deleteCharAt(image.length() - 2);
- break;
- case 25 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- ++commentNest;
- break;
- case 26 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- --commentNest; if (commentNest == 0) SwitchTo(INCOMMENT);
- break;
- case 28 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- image.deleteCharAt(image.length() - 1);
- break;
- case 29 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- image.deleteCharAt(image.length() - 2);
- break;
- default :
- break;
- }
-}
-void TokenLexicalActions(Token matchedToken)
-{
- switch(jjmatchedKind)
- {
- case 18 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
- matchedToken.image = image.toString();
- break;
- case 31 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
- matchedToken.image = image.substring(0, image.length() - 1);
- break;
- default :
- break;
- }
-}
-}
diff --git a/apache/org/apache/james/mime4j/field/address/parser/AddressListParserTreeConstants.java b/apache/org/apache/james/mime4j/field/address/parser/AddressListParserTreeConstants.java
deleted file mode 100644
index 5987f19d8..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/AddressListParserTreeConstants.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. /Users/jason/Projects/apache-mime4j-0.3/target/generated-sources/jjtree/org/apache/james/mime4j/field/address/parser/AddressListParserTreeConstants.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public interface AddressListParserTreeConstants
-{
- public int JJTVOID = 0;
- public int JJTADDRESS_LIST = 1;
- public int JJTADDRESS = 2;
- public int JJTMAILBOX = 3;
- public int JJTNAME_ADDR = 4;
- public int JJTGROUP_BODY = 5;
- public int JJTANGLE_ADDR = 6;
- public int JJTROUTE = 7;
- public int JJTPHRASE = 8;
- public int JJTADDR_SPEC = 9;
- public int JJTLOCAL_PART = 10;
- public int JJTDOMAIN = 11;
-
-
- public String[] jjtNodeName = {
- "void",
- "address_list",
- "address",
- "mailbox",
- "name_addr",
- "group_body",
- "angle_addr",
- "route",
- "phrase",
- "addr_spec",
- "local_part",
- "domain",
- };
-}
diff --git a/apache/org/apache/james/mime4j/field/address/parser/AddressListParserVisitor.java b/apache/org/apache/james/mime4j/field/address/parser/AddressListParserVisitor.java
deleted file mode 100644
index 8ec2fe7d2..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/AddressListParserVisitor.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. /Users/jason/Projects/apache-mime4j-0.3/target/generated-sources/jjtree/org/apache/james/mime4j/field/address/parser/AddressListParserVisitor.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public interface AddressListParserVisitor
-{
- public Object visit(SimpleNode node, Object data);
- public Object visit(ASTaddress_list node, Object data);
- public Object visit(ASTaddress node, Object data);
- public Object visit(ASTmailbox node, Object data);
- public Object visit(ASTname_addr node, Object data);
- public Object visit(ASTgroup_body node, Object data);
- public Object visit(ASTangle_addr node, Object data);
- public Object visit(ASTroute node, Object data);
- public Object visit(ASTphrase node, Object data);
- public Object visit(ASTaddr_spec node, Object data);
- public Object visit(ASTlocal_part node, Object data);
- public Object visit(ASTdomain node, Object data);
-}
diff --git a/apache/org/apache/james/mime4j/field/address/parser/BaseNode.java b/apache/org/apache/james/mime4j/field/address/parser/BaseNode.java
deleted file mode 100644
index 780974616..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/BaseNode.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.field.address.parser;
-
-import org.apache.james.mime4j.field.address.parser.Node;
-import org.apache.james.mime4j.field.address.parser.Token;
-
-public abstract class BaseNode implements Node {
-
- public Token firstToken;
- public Token lastToken;
-
-}
\ No newline at end of file
diff --git a/apache/org/apache/james/mime4j/field/address/parser/JJTAddressListParserState.java b/apache/org/apache/james/mime4j/field/address/parser/JJTAddressListParserState.java
deleted file mode 100644
index 08b5c5bef..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/JJTAddressListParserState.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. /Users/jason/Projects/apache-mime4j-0.3/target/generated-sources/jjtree/org/apache/james/mime4j/field/address/parser/JJTAddressListParserState.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-class JJTAddressListParserState {
- private java.util.Stack nodes;
- private java.util.Stack marks;
-
- private int sp; // number of nodes on stack
- private int mk; // current mark
- private boolean node_created;
-
- JJTAddressListParserState() {
- nodes = new java.util.Stack();
- marks = new java.util.Stack();
- sp = 0;
- mk = 0;
- }
-
- /* Determines whether the current node was actually closed and
- pushed. This should only be called in the final user action of a
- node scope. */
- boolean nodeCreated() {
- return node_created;
- }
-
- /* Call this to reinitialize the node stack. It is called
- automatically by the parser's ReInit() method. */
- void reset() {
- nodes.removeAllElements();
- marks.removeAllElements();
- sp = 0;
- mk = 0;
- }
-
- /* Returns the root node of the AST. It only makes sense to call
- this after a successful parse. */
- Node rootNode() {
- return nodes.elementAt(0);
- }
-
- /* Pushes a node on to the stack. */
- void pushNode(Node n) {
- nodes.push(n);
- ++sp;
- }
-
- /* Returns the node on the top of the stack, and remove it from the
- stack. */
- Node popNode() {
- if (--sp < mk) {
- mk = marks.pop().intValue();
- }
- return nodes.pop();
- }
-
- /* Returns the node currently on the top of the stack. */
- Node peekNode() {
- return nodes.peek();
- }
-
- /* Returns the number of children on the stack in the current node
- scope. */
- int nodeArity() {
- return sp - mk;
- }
-
-
- void clearNodeScope(Node n) {
- while (sp > mk) {
- popNode();
- }
- mk = marks.pop().intValue();
- }
-
-
- void openNodeScope(Node n) {
- marks.push(new Integer(mk));
- mk = sp;
- n.jjtOpen();
- }
-
-
- /* A definite node is constructed from a specified number of
- children. That number of nodes are popped from the stack and
- made the children of the definite node. Then the definite node
- is pushed on to the stack. */
- void closeNodeScope(Node n, int num) {
- mk = marks.pop().intValue();
- while (num-- > 0) {
- Node c = popNode();
- c.jjtSetParent(n);
- n.jjtAddChild(c, num);
- }
- n.jjtClose();
- pushNode(n);
- node_created = true;
- }
-
-
- /* A conditional node is constructed if its condition is true. All
- the nodes that have been pushed since the node was opened are
- made children of the the conditional node, which is then pushed
- on to the stack. If the condition is false the node is not
- constructed and they are left on the stack. */
- void closeNodeScope(Node n, boolean condition) {
- if (condition) {
- int a = nodeArity();
- mk = marks.pop().intValue();
- while (a-- > 0) {
- Node c = popNode();
- c.jjtSetParent(n);
- n.jjtAddChild(c, a);
- }
- n.jjtClose();
- pushNode(n);
- node_created = true;
- } else {
- mk = marks.pop().intValue();
- node_created = false;
- }
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/address/parser/Node.java b/apache/org/apache/james/mime4j/field/address/parser/Node.java
deleted file mode 100644
index 158892016..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/Node.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. Node.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-/* All AST nodes must implement this interface. It provides basic
- machinery for constructing the parent and child relationships
- between nodes. */
-
-public interface Node {
-
- /** This method is called after the node has been made the current
- node. It indicates that child nodes can now be added to it. */
- public void jjtOpen();
-
- /** This method is called after all the child nodes have been
- added. */
- public void jjtClose();
-
- /** This pair of methods are used to inform the node of its
- parent. */
- public void jjtSetParent(Node n);
- public Node jjtGetParent();
-
- /** This method tells the node to add its argument to the node's
- list of children. */
- public void jjtAddChild(Node n, int i);
-
- /** This method returns a child node. The children are numbered
- from zero, left to right. */
- public Node jjtGetChild(int i);
-
- /** Return the number of children the node has. */
- public int jjtGetNumChildren();
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data);
-}
diff --git a/apache/org/apache/james/mime4j/field/address/parser/ParseException.java b/apache/org/apache/james/mime4j/field/address/parser/ParseException.java
deleted file mode 100644
index e20146fb6..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/ParseException.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */
-/*
- * Copyright 2004 the mime4j 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 org.apache.james.mime4j.field.address.parser;
-
-/**
- * This exception is thrown when parse errors are encountered.
- * You can explicitly create objects of this exception type by
- * calling the method generateParseException in the generated
- * parser.
- *
- * You can modify this class to customize your error reporting
- * mechanisms so long as you retain the public fields.
- */
-public class ParseException extends Exception {
-
- /**
- * This constructor is used by the method "generateParseException"
- * in the generated parser. Calling this constructor generates
- * a new object of this type with the fields "currentToken",
- * "expectedTokenSequences", and "tokenImage" set. The boolean
- * flag "specialConstructor" is also set to true to indicate that
- * this constructor was used to create this object.
- * This constructor calls its super class with the empty string
- * to force the "toString" method of parent class "Throwable" to
- * print the error message in the form:
- * ParseException:
- */
- public ParseException(Token currentTokenVal,
- int[][] expectedTokenSequencesVal,
- String[] tokenImageVal
- )
- {
- super("");
- specialConstructor = true;
- currentToken = currentTokenVal;
- expectedTokenSequences = expectedTokenSequencesVal;
- tokenImage = tokenImageVal;
- }
-
- /**
- * The following constructors are for use by you for whatever
- * purpose you can think of. Constructing the exception in this
- * manner makes the exception behave in the normal way - i.e., as
- * documented in the class "Throwable". The fields "errorToken",
- * "expectedTokenSequences", and "tokenImage" do not contain
- * relevant information. The JavaCC generated code does not use
- * these constructors.
- */
-
- public ParseException() {
- super();
- specialConstructor = false;
- }
-
- public ParseException(String message) {
- super(message);
- specialConstructor = false;
- }
-
- /**
- * This variable determines which constructor was used to create
- * this object and thereby affects the semantics of the
- * "getMessage" method (see below).
- */
- protected boolean specialConstructor;
-
- /**
- * This is the last token that has been consumed successfully. If
- * this object has been created due to a parse error, the token
- * followng this token will (therefore) be the first error token.
- */
- public Token currentToken;
-
- /**
- * Each entry in this array is an array of integers. Each array
- * of integers represents a sequence of tokens (by their ordinal
- * values) that is expected at this point of the parse.
- */
- public int[][] expectedTokenSequences;
-
- /**
- * This is a reference to the "tokenImage" array of the generated
- * parser within which the parse error occurred. This array is
- * defined in the generated ...Constants interface.
- */
- public String[] tokenImage;
-
- /**
- * This method has the standard behavior when this object has been
- * created using the standard constructors. Otherwise, it uses
- * "currentToken" and "expectedTokenSequences" to generate a parse
- * error message and returns it. If this object has been created
- * due to a parse error, and you do not catch it (it gets thrown
- * from the parser), then this method is called during the printing
- * of the final stack trace, and hence the correct error message
- * gets displayed.
- */
- public String getMessage() {
- if (!specialConstructor) {
- return super.getMessage();
- }
- StringBuffer expected = new StringBuffer();
- int maxSize = 0;
- for (int i = 0; i < expectedTokenSequences.length; i++) {
- if (maxSize < expectedTokenSequences[i].length) {
- maxSize = expectedTokenSequences[i].length;
- }
- for (int j = 0; j < expectedTokenSequences[i].length; j++) {
- expected.append(tokenImage[expectedTokenSequences[i][j]]).append(" ");
- }
- if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
- expected.append("...");
- }
- expected.append(eol).append(" ");
- }
- String retval = "Encountered \"";
- Token tok = currentToken.next;
- for (int i = 0; i < maxSize; i++) {
- if (i != 0) retval += " ";
- if (tok.kind == 0) {
- retval += tokenImage[0];
- break;
- }
- retval += add_escapes(tok.image);
- tok = tok.next;
- }
- retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
- retval += "." + eol;
- if (expectedTokenSequences.length == 1) {
- retval += "Was expecting:" + eol + " ";
- } else {
- retval += "Was expecting one of:" + eol + " ";
- }
- retval += expected.toString();
- return retval;
- }
-
- /**
- * The end of line string for this machine.
- */
- protected String eol = System.getProperty("line.separator", "\n");
-
- /**
- * Used to convert raw characters to their escaped version
- * when these raw version cannot be used as part of an ASCII
- * string literal.
- */
- protected String add_escapes(String str) {
- StringBuffer retval = new StringBuffer();
- char ch;
- for (int i = 0; i < str.length(); i++) {
- switch (str.charAt(i))
- {
- case 0 :
- continue;
- case '\b':
- retval.append("\\b");
- continue;
- case '\t':
- retval.append("\\t");
- continue;
- case '\n':
- retval.append("\\n");
- continue;
- case '\f':
- retval.append("\\f");
- continue;
- case '\r':
- retval.append("\\r");
- continue;
- case '\"':
- retval.append("\\\"");
- continue;
- case '\'':
- retval.append("\\\'");
- continue;
- case '\\':
- retval.append("\\\\");
- continue;
- default:
- if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
- String s = "0000" + Integer.toString(ch, 16);
- retval.append("\\u" + s.substring(s.length() - 4, s.length()));
- } else {
- retval.append(ch);
- }
- continue;
- }
- }
- return retval.toString();
- }
-
-}
diff --git a/apache/org/apache/james/mime4j/field/address/parser/SimpleCharStream.java b/apache/org/apache/james/mime4j/field/address/parser/SimpleCharStream.java
deleted file mode 100644
index c9ba0b444..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/SimpleCharStream.java
+++ /dev/null
@@ -1,454 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 4.0 */
-/*
- * Copyright 2004 the mime4j 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 org.apache.james.mime4j.field.address.parser;
-
-/**
- * An implementation of interface CharStream, where the stream is assumed to
- * contain only ASCII characters (without unicode processing).
- */
-
-public class SimpleCharStream
-{
- public static final boolean staticFlag = false;
- int bufsize;
- int available;
- int tokenBegin;
- public int bufpos = -1;
- protected int bufline[];
- protected int bufcolumn[];
-
- protected int column = 0;
- protected int line = 1;
-
- protected boolean prevCharIsCR = false;
- protected boolean prevCharIsLF = false;
-
- protected java.io.Reader inputStream;
-
- protected char[] buffer;
- protected int maxNextCharInd = 0;
- protected int inBuf = 0;
- protected int tabSize = 8;
-
- protected void setTabSize(int i) { tabSize = i; }
- protected int getTabSize(int i) { return tabSize; }
-
-
- protected void ExpandBuff(boolean wrapAround)
- {
- char[] newbuffer = new char[bufsize + 2048];
- int newbufline[] = new int[bufsize + 2048];
- int newbufcolumn[] = new int[bufsize + 2048];
-
- try
- {
- if (wrapAround)
- {
- System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
- System.arraycopy(buffer, 0, newbuffer,
- bufsize - tokenBegin, bufpos);
- buffer = newbuffer;
-
- System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
- System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
- bufline = newbufline;
-
- System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
- System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
- bufcolumn = newbufcolumn;
-
- maxNextCharInd = (bufpos += (bufsize - tokenBegin));
- }
- else
- {
- System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
- buffer = newbuffer;
-
- System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
- bufline = newbufline;
-
- System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
- bufcolumn = newbufcolumn;
-
- maxNextCharInd = (bufpos -= tokenBegin);
- }
- }
- catch (Throwable t)
- {
- throw new Error(t.getMessage());
- }
-
-
- bufsize += 2048;
- available = bufsize;
- tokenBegin = 0;
- }
-
- protected void FillBuff() throws java.io.IOException
- {
- if (maxNextCharInd == available)
- {
- if (available == bufsize)
- {
- if (tokenBegin > 2048)
- {
- bufpos = maxNextCharInd = 0;
- available = tokenBegin;
- }
- else if (tokenBegin < 0)
- bufpos = maxNextCharInd = 0;
- else
- ExpandBuff(false);
- }
- else if (available > tokenBegin)
- available = bufsize;
- else if ((tokenBegin - available) < 2048)
- ExpandBuff(true);
- else
- available = tokenBegin;
- }
-
- int i;
- try {
- if ((i = inputStream.read(buffer, maxNextCharInd,
- available - maxNextCharInd)) == -1)
- {
- inputStream.close();
- throw new java.io.IOException();
- }
- else
- maxNextCharInd += i;
- return;
- }
- catch(java.io.IOException e) {
- --bufpos;
- backup(0);
- if (tokenBegin == -1)
- tokenBegin = bufpos;
- throw e;
- }
- }
-
- public char BeginToken() throws java.io.IOException
- {
- tokenBegin = -1;
- char c = readChar();
- tokenBegin = bufpos;
-
- return c;
- }
-
- protected void UpdateLineColumn(char c)
- {
- column++;
-
- if (prevCharIsLF)
- {
- prevCharIsLF = false;
- line += (column = 1);
- }
- else if (prevCharIsCR)
- {
- prevCharIsCR = false;
- if (c == '\n')
- {
- prevCharIsLF = true;
- }
- else
- line += (column = 1);
- }
-
- switch (c)
- {
- case '\r' :
- prevCharIsCR = true;
- break;
- case '\n' :
- prevCharIsLF = true;
- break;
- case '\t' :
- column--;
- column += (tabSize - (column % tabSize));
- break;
- default :
- break;
- }
-
- bufline[bufpos] = line;
- bufcolumn[bufpos] = column;
- }
-
- public char readChar() throws java.io.IOException
- {
- if (inBuf > 0)
- {
- --inBuf;
-
- if (++bufpos == bufsize)
- bufpos = 0;
-
- return buffer[bufpos];
- }
-
- if (++bufpos >= maxNextCharInd)
- FillBuff();
-
- char c = buffer[bufpos];
-
- UpdateLineColumn(c);
- return (c);
- }
-
- /**
- * @deprecated
- * @see #getEndColumn
- */
- @Deprecated
- public int getColumn() {
- return bufcolumn[bufpos];
- }
-
- /**
- * @deprecated
- * @see #getEndLine
- */
- @Deprecated
- public int getLine() {
- return bufline[bufpos];
- }
-
- public int getEndColumn() {
- return bufcolumn[bufpos];
- }
-
- public int getEndLine() {
- return bufline[bufpos];
- }
-
- public int getBeginColumn() {
- return bufcolumn[tokenBegin];
- }
-
- public int getBeginLine() {
- return bufline[tokenBegin];
- }
-
- public void backup(int amount) {
-
- inBuf += amount;
- if ((bufpos -= amount) < 0)
- bufpos += bufsize;
- }
-
- public SimpleCharStream(java.io.Reader dstream, int startline,
- int startcolumn, int buffersize)
- {
- inputStream = dstream;
- line = startline;
- column = startcolumn - 1;
-
- available = bufsize = buffersize;
- buffer = new char[buffersize];
- bufline = new int[buffersize];
- bufcolumn = new int[buffersize];
- }
-
- public SimpleCharStream(java.io.Reader dstream, int startline,
- int startcolumn)
- {
- this(dstream, startline, startcolumn, 4096);
- }
-
- public SimpleCharStream(java.io.Reader dstream)
- {
- this(dstream, 1, 1, 4096);
- }
- public void ReInit(java.io.Reader dstream, int startline,
- int startcolumn, int buffersize)
- {
- inputStream = dstream;
- line = startline;
- column = startcolumn - 1;
-
- if (buffer == null || buffersize != buffer.length)
- {
- available = bufsize = buffersize;
- buffer = new char[buffersize];
- bufline = new int[buffersize];
- bufcolumn = new int[buffersize];
- }
- prevCharIsLF = prevCharIsCR = false;
- tokenBegin = inBuf = maxNextCharInd = 0;
- bufpos = -1;
- }
-
- public void ReInit(java.io.Reader dstream, int startline,
- int startcolumn)
- {
- ReInit(dstream, startline, startcolumn, 4096);
- }
-
- public void ReInit(java.io.Reader dstream)
- {
- ReInit(dstream, 1, 1, 4096);
- }
- public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
- {
- this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, int startline,
- int startcolumn, int buffersize)
- {
- this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn) throws java.io.UnsupportedEncodingException
- {
- this(dstream, encoding, startline, startcolumn, 4096);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, int startline,
- int startcolumn)
- {
- this(dstream, startline, startcolumn, 4096);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
- {
- this(dstream, encoding, 1, 1, 4096);
- }
-
- public SimpleCharStream(java.io.InputStream dstream)
- {
- this(dstream, 1, 1, 4096);
- }
-
- public void ReInit(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
- {
- ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
- }
-
- public void ReInit(java.io.InputStream dstream, int startline,
- int startcolumn, int buffersize)
- {
- ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
- }
-
- public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
- {
- ReInit(dstream, encoding, 1, 1, 4096);
- }
-
- public void ReInit(java.io.InputStream dstream)
- {
- ReInit(dstream, 1, 1, 4096);
- }
- public void ReInit(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn) throws java.io.UnsupportedEncodingException
- {
- ReInit(dstream, encoding, startline, startcolumn, 4096);
- }
- public void ReInit(java.io.InputStream dstream, int startline,
- int startcolumn)
- {
- ReInit(dstream, startline, startcolumn, 4096);
- }
- public String GetImage()
- {
- if (bufpos >= tokenBegin)
- return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
- else
- return new String(buffer, tokenBegin, bufsize - tokenBegin) +
- new String(buffer, 0, bufpos + 1);
- }
-
- public char[] GetSuffix(int len)
- {
- char[] ret = new char[len];
-
- if ((bufpos + 1) >= len)
- System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
- else
- {
- System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
- len - bufpos - 1);
- System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
- }
-
- return ret;
- }
-
- public void Done()
- {
- buffer = null;
- bufline = null;
- bufcolumn = null;
- }
-
- /**
- * Method to adjust line and column numbers for the start of a token.
- */
- public void adjustBeginLineColumn(int newLine, int newCol)
- {
- int start = tokenBegin;
- int len;
-
- if (bufpos >= tokenBegin)
- {
- len = bufpos - tokenBegin + inBuf + 1;
- }
- else
- {
- len = bufsize - tokenBegin + bufpos + 1 + inBuf;
- }
-
- int i = 0, j = 0, k = 0;
- int nextColDiff = 0, columnDiff = 0;
-
- while (i < len &&
- bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
- {
- bufline[j] = newLine;
- nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
- bufcolumn[j] = newCol + columnDiff;
- columnDiff = nextColDiff;
- i++;
- }
-
- if (i < len)
- {
- bufline[j] = newLine++;
- bufcolumn[j] = newCol + columnDiff;
-
- while (i++ < len)
- {
- if (bufline[j = start % bufsize] != bufline[++start % bufsize])
- bufline[j] = newLine++;
- else
- bufline[j] = newLine;
- }
- }
-
- line = bufline[j];
- column = bufcolumn[j];
- }
-
-}
diff --git a/apache/org/apache/james/mime4j/field/address/parser/SimpleNode.java b/apache/org/apache/james/mime4j/field/address/parser/SimpleNode.java
deleted file mode 100644
index 9bf537e60..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/SimpleNode.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/* Generated By:JJTree: Do not edit this line. SimpleNode.java */
-
-package org.apache.james.mime4j.field.address.parser;
-
-public class SimpleNode extends org.apache.james.mime4j.field.address.parser.BaseNode implements Node {
- protected Node parent;
- protected Node[] children;
- protected int id;
- protected AddressListParser parser;
-
- public SimpleNode(int i) {
- id = i;
- }
-
- public SimpleNode(AddressListParser p, int i) {
- this(i);
- parser = p;
- }
-
- public void jjtOpen() {
- }
-
- public void jjtClose() {
- }
-
- public void jjtSetParent(Node n) { parent = n; }
- public Node jjtGetParent() { return parent; }
-
- public void jjtAddChild(Node n, int i) {
- if (children == null) {
- children = new Node[i + 1];
- } else if (i >= children.length) {
- Node c[] = new Node[i + 1];
- System.arraycopy(children, 0, c, 0, children.length);
- children = c;
- }
- children[i] = n;
- }
-
- public Node jjtGetChild(int i) {
- return children[i];
- }
-
- public int jjtGetNumChildren() {
- return (children == null) ? 0 : children.length;
- }
-
- /** Accept the visitor. **/
- public Object jjtAccept(AddressListParserVisitor visitor, Object data) {
- return visitor.visit(this, data);
- }
-
- /** Accept the visitor. **/
- public Object childrenAccept(AddressListParserVisitor visitor, Object data) {
- if (children != null) {
- for (int i = 0; i < children.length; ++i) {
- children[i].jjtAccept(visitor, data);
- }
- }
- return data;
- }
-
- /* You can override these two methods in subclasses of SimpleNode to
- customize the way the node appears when the tree is dumped. If
- your output uses more than one line you should override
- toString(String), otherwise overriding toString() is probably all
- you need to do. */
-
- public String toString() { return AddressListParserTreeConstants.jjtNodeName[id]; }
- public String toString(String prefix) { return prefix + toString(); }
-
- /* Override this method if you want to customize how the node dumps
- out its children. */
-
- public void dump(String prefix) {
- System.out.println(toString(prefix));
- if (children != null) {
- for (int i = 0; i < children.length; ++i) {
- SimpleNode n = (SimpleNode)children[i];
- if (n != null) {
- n.dump(prefix + " ");
- }
- }
- }
- }
-}
-
diff --git a/apache/org/apache/james/mime4j/field/address/parser/Token.java b/apache/org/apache/james/mime4j/field/address/parser/Token.java
deleted file mode 100644
index 2382e8e92..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/Token.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. Token.java Version 3.0 */
-/*
- * Copyright 2004 the mime4j 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 org.apache.james.mime4j.field.address.parser;
-
-/**
- * Describes the input token stream.
- */
-
-public class Token {
-
- /**
- * An integer that describes the kind of this token. This numbering
- * system is determined by JavaCCParser, and a table of these numbers is
- * stored in the file ...Constants.java.
- */
- public int kind;
-
- /**
- * beginLine and beginColumn describe the position of the first character
- * of this token; endLine and endColumn describe the position of the
- * last character of this token.
- */
- public int beginLine, beginColumn, endLine, endColumn;
-
- /**
- * The string image of the token.
- */
- public String image;
-
- /**
- * A reference to the next regular (non-special) token from the input
- * stream. If this is the last token from the input stream, or if the
- * token manager has not read tokens beyond this one, this field is
- * set to null. This is true only if this token is also a regular
- * token. Otherwise, see below for a description of the contents of
- * this field.
- */
- public Token next;
-
- /**
- * This field is used to access special tokens that occur prior to this
- * token, but after the immediately preceding regular (non-special) token.
- * If there are no such special tokens, this field is set to null.
- * When there are more than one such special token, this field refers
- * to the last of these special tokens, which in turn refers to the next
- * previous special token through its specialToken field, and so on
- * until the first special token (whose specialToken field is null).
- * The next fields of special tokens refer to other special tokens that
- * immediately follow it (without an intervening regular token). If there
- * is no such token, this field is null.
- */
- public Token specialToken;
-
- /**
- * Returns the image.
- */
- public String toString()
- {
- return image;
- }
-
- /**
- * Returns a new Token object, by default. However, if you want, you
- * can create and return subclass objects based on the value of ofKind.
- * Simply add the cases to the switch for all those special cases.
- * For example, if you have a subclass of Token called IDToken that
- * you want to create if ofKind is ID, simlpy add something like :
- *
- * case MyParserConstants.ID : return new IDToken();
- *
- * to the following switch statement. Then you can cast matchedToken
- * variable to the appropriate type and use it in your lexical actions.
- */
- public static final Token newToken(int ofKind)
- {
- switch(ofKind)
- {
- default : return new Token();
- }
- }
-
-}
diff --git a/apache/org/apache/james/mime4j/field/address/parser/TokenMgrError.java b/apache/org/apache/james/mime4j/field/address/parser/TokenMgrError.java
deleted file mode 100644
index 0299c8523..000000000
--- a/apache/org/apache/james/mime4j/field/address/parser/TokenMgrError.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 3.0 */
-/*
- * Copyright 2004 the mime4j 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 org.apache.james.mime4j.field.address.parser;
-
-public class TokenMgrError extends Error
-{
- /*
- * Ordinals for various reasons why an Error of this type can be thrown.
- */
-
- /**
- * Lexical error occured.
- */
- static final int LEXICAL_ERROR = 0;
-
- /**
- * An attempt wass made to create a second instance of a static token manager.
- */
- static final int STATIC_LEXER_ERROR = 1;
-
- /**
- * Tried to change to an invalid lexical state.
- */
- static final int INVALID_LEXICAL_STATE = 2;
-
- /**
- * Detected (and bailed out of) an infinite loop in the token manager.
- */
- static final int LOOP_DETECTED = 3;
-
- /**
- * Indicates the reason why the exception is thrown. It will have
- * one of the above 4 values.
- */
- int errorCode;
-
- /**
- * Replaces unprintable characters by their espaced (or unicode escaped)
- * equivalents in the given string
- */
- protected static final String addEscapes(String str) {
- StringBuffer retval = new StringBuffer();
- char ch;
- for (int i = 0; i < str.length(); i++) {
- switch (str.charAt(i))
- {
- case 0 :
- continue;
- case '\b':
- retval.append("\\b");
- continue;
- case '\t':
- retval.append("\\t");
- continue;
- case '\n':
- retval.append("\\n");
- continue;
- case '\f':
- retval.append("\\f");
- continue;
- case '\r':
- retval.append("\\r");
- continue;
- case '\"':
- retval.append("\\\"");
- continue;
- case '\'':
- retval.append("\\\'");
- continue;
- case '\\':
- retval.append("\\\\");
- continue;
- default:
- if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
- String s = "0000" + Integer.toString(ch, 16);
- retval.append("\\u" + s.substring(s.length() - 4, s.length()));
- } else {
- retval.append(ch);
- }
- continue;
- }
- }
- return retval.toString();
- }
-
- /**
- * Returns a detailed message for the Error when it is thrown by the
- * token manager to indicate a lexical error.
- * Parameters :
- * EOFSeen : indicates if EOF caused the lexicl error
- * curLexState : lexical state in which this error occured
- * errorLine : line number when the error occured
- * errorColumn : column number when the error occured
- * errorAfter : prefix that was seen before this error occured
- * curchar : the offending character
- * Note: You can customize the lexical error message by modifying this method.
- */
- protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
- return("Lexical error at line " +
- errorLine + ", column " +
- errorColumn + ". Encountered: " +
- (EOFSeen ? " " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
- "after : \"" + addEscapes(errorAfter) + "\"");
- }
-
- /**
- * You can also modify the body of this method to customize your error messages.
- * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
- * of end-users concern, so you can return something like :
- *
- * "Internal Error : Please file a bug report .... "
- *
- * from this method for such cases in the release version of your parser.
- */
- public String getMessage() {
- return super.getMessage();
- }
-
- /*
- * Constructors of various flavors follow.
- */
-
- public TokenMgrError() {
- }
-
- public TokenMgrError(String message, int reason) {
- super(message);
- errorCode = reason;
- }
-
- public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
- this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/contenttype/parser/ContentTypeParser.java b/apache/org/apache/james/mime4j/field/contenttype/parser/ContentTypeParser.java
deleted file mode 100644
index cacf3af21..000000000
--- a/apache/org/apache/james/mime4j/field/contenttype/parser/ContentTypeParser.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. ContentTypeParser.java */
-/*
- * Copyright 2004 the mime4j 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 org.apache.james.mime4j.field.contenttype.parser;
-
-import java.util.ArrayList;
-import java.util.Vector;
-
-public class ContentTypeParser implements ContentTypeParserConstants {
-
- private String type;
- private String subtype;
- private ArrayList paramNames = new ArrayList();
- private ArrayList paramValues = new ArrayList();
-
- public String getType() { return type; }
- public String getSubType() { return subtype; }
- public ArrayList getParamNames() { return paramNames; }
- public ArrayList getParamValues() { return paramValues; }
-
- public static void main(String args[]) throws ParseException {
- while (true) {
- try {
- ContentTypeParser parser = new ContentTypeParser(System.in);
- parser.parseLine();
- } catch (Exception x) {
- x.printStackTrace();
- return;
- }
- }
- }
-
- final public void parseLine() throws ParseException {
- parse();
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 1:
- jj_consume_token(1);
- break;
- default:
- jj_la1[0] = jj_gen;
- ;
- }
- jj_consume_token(2);
- }
-
- final public void parseAll() throws ParseException {
- parse();
- jj_consume_token(0);
- }
-
- final public void parse() throws ParseException {
- Token type;
- Token subtype;
- type = jj_consume_token(ATOKEN);
- jj_consume_token(3);
- subtype = jj_consume_token(ATOKEN);
- this.type = type.image;
- this.subtype = subtype.image;
- label_1:
- while (true) {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 4:
- ;
- break;
- default:
- jj_la1[1] = jj_gen;
- break label_1;
- }
- jj_consume_token(4);
- parameter();
- }
- }
-
- final public void parameter() throws ParseException {
- Token attrib;
- String val;
- attrib = jj_consume_token(ATOKEN);
- jj_consume_token(5);
- val = value();
- paramNames.add(attrib.image);
- paramValues.add(val);
- }
-
- final public String value() throws ParseException {
- Token t;
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case ATOKEN:
- t = jj_consume_token(ATOKEN);
- break;
- case QUOTEDSTRING:
- t = jj_consume_token(QUOTEDSTRING);
- break;
- default:
- jj_la1[2] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- {if (true) return t.image;}
- throw new Error("Missing return statement in function");
- }
-
- public ContentTypeParserTokenManager token_source;
- SimpleCharStream jj_input_stream;
- public Token token, jj_nt;
- private int jj_ntk;
- private int jj_gen;
- final private int[] jj_la1 = new int[3];
- static private int[] jj_la1_0;
- static {
- jj_la1_0();
- }
- private static void jj_la1_0() {
- jj_la1_0 = new int[] {0x2,0x10,0x280000,};
- }
-
- public ContentTypeParser(java.io.InputStream stream) {
- this(stream, null);
- }
- public ContentTypeParser(java.io.InputStream stream, String encoding) {
- try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
- token_source = new ContentTypeParserTokenManager(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 3; i++) jj_la1[i] = -1;
- }
-
- public void ReInit(java.io.InputStream stream) {
- ReInit(stream, null);
- }
- public void ReInit(java.io.InputStream stream, String encoding) {
- try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
- token_source.ReInit(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 3; i++) jj_la1[i] = -1;
- }
-
- public ContentTypeParser(java.io.Reader stream) {
- jj_input_stream = new SimpleCharStream(stream, 1, 1);
- token_source = new ContentTypeParserTokenManager(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 3; i++) jj_la1[i] = -1;
- }
-
- public void ReInit(java.io.Reader stream) {
- jj_input_stream.ReInit(stream, 1, 1);
- token_source.ReInit(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 3; i++) jj_la1[i] = -1;
- }
-
- public ContentTypeParser(ContentTypeParserTokenManager tm) {
- token_source = tm;
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 3; i++) jj_la1[i] = -1;
- }
-
- public void ReInit(ContentTypeParserTokenManager tm) {
- token_source = tm;
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 3; i++) jj_la1[i] = -1;
- }
-
- final private Token jj_consume_token(int kind) throws ParseException {
- Token oldToken;
- if ((oldToken = token).next != null) token = token.next;
- else token = token.next = token_source.getNextToken();
- jj_ntk = -1;
- if (token.kind == kind) {
- jj_gen++;
- return token;
- }
- token = oldToken;
- jj_kind = kind;
- throw generateParseException();
- }
-
- final public Token getNextToken() {
- if (token.next != null) token = token.next;
- else token = token.next = token_source.getNextToken();
- jj_ntk = -1;
- jj_gen++;
- return token;
- }
-
- final public Token getToken(int index) {
- Token t = token;
- for (int i = 0; i < index; i++) {
- if (t.next != null) t = t.next;
- else t = t.next = token_source.getNextToken();
- }
- return t;
- }
-
- final private int jj_ntk() {
- if ((jj_nt=token.next) == null)
- return (jj_ntk = (token.next=token_source.getNextToken()).kind);
- else
- return (jj_ntk = jj_nt.kind);
- }
-
- private Vector jj_expentries = new Vector();
- private int[] jj_expentry;
- private int jj_kind = -1;
-
- public ParseException generateParseException() {
- jj_expentries.removeAllElements();
- boolean[] la1tokens = new boolean[24];
- for (int i = 0; i < 24; i++) {
- la1tokens[i] = false;
- }
- if (jj_kind >= 0) {
- la1tokens[jj_kind] = true;
- jj_kind = -1;
- }
- for (int i = 0; i < 3; i++) {
- if (jj_la1[i] == jj_gen) {
- for (int j = 0; j < 32; j++) {
- if ((jj_la1_0[i] & (1<",
- "\"\\r\"",
- "\"\\n\"",
- "\"/\"",
- "\";\"",
- "\"=\"",
- "",
- "\"(\"",
- "\")\"",
- "",
- "\"(\"",
- "",
- "",
- "\"(\"",
- "\")\"",
- "",
- "\"\\\"\"",
- "",
- "",
- "\"\\\"\"",
- "",
- "",
- "",
- "",
- };
-
-}
diff --git a/apache/org/apache/james/mime4j/field/contenttype/parser/ContentTypeParserTokenManager.java b/apache/org/apache/james/mime4j/field/contenttype/parser/ContentTypeParserTokenManager.java
deleted file mode 100644
index 25b7abafa..000000000
--- a/apache/org/apache/james/mime4j/field/contenttype/parser/ContentTypeParserTokenManager.java
+++ /dev/null
@@ -1,877 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. ContentTypeParserTokenManager.java */
-/*
- * Copyright 2004 the mime4j 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 org.apache.james.mime4j.field.contenttype.parser;
-import java.util.ArrayList;
-
-public class ContentTypeParserTokenManager implements ContentTypeParserConstants
-{
- // Keeps track of how many levels of comment nesting
- // we've encountered. This is only used when the 2nd
- // level is reached, for example ((this)), not (this).
- // This is because the outermost level must be treated
- // specially anyway, because the outermost ")" has a
- // different token type than inner ")" instances.
- static int commentNest;
- public java.io.PrintStream debugStream = System.out;
- public void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
-private final int jjStopStringLiteralDfa_0(int pos, long active0)
-{
- switch (pos)
- {
- default :
- return -1;
- }
-}
-private final int jjStartNfa_0(int pos, long active0)
-{
- return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1);
-}
-private final int jjStopAtPos(int pos, int kind)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- return pos + 1;
-}
-private final int jjStartNfaWithStates_0(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_0(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_0()
-{
- switch(curChar)
- {
- case 10:
- return jjStartNfaWithStates_0(0, 2, 2);
- case 13:
- return jjStartNfaWithStates_0(0, 1, 2);
- case 34:
- return jjStopAtPos(0, 16);
- case 40:
- return jjStopAtPos(0, 7);
- case 47:
- return jjStopAtPos(0, 3);
- case 59:
- return jjStopAtPos(0, 4);
- case 61:
- return jjStopAtPos(0, 5);
- default :
- return jjMoveNfa_0(3, 0);
- }
-}
-private final void jjCheckNAdd(int state)
-{
- if (jjrounds[state] != jjround)
- {
- jjstateSet[jjnewStateCnt++] = state;
- jjrounds[state] = jjround;
- }
-}
-private final void jjAddStates(int start, int end)
-{
- do {
- jjstateSet[jjnewStateCnt++] = jjnextStates[start];
- } while (start++ != end);
-}
-private final void jjCheckNAddTwoStates(int state1, int state2)
-{
- jjCheckNAdd(state1);
- jjCheckNAdd(state2);
-}
-private final void jjCheckNAddStates(int start, int end)
-{
- do {
- jjCheckNAdd(jjnextStates[start]);
- } while (start++ != end);
-}
-private final void jjCheckNAddStates(int start)
-{
- jjCheckNAdd(jjnextStates[start]);
- jjCheckNAdd(jjnextStates[start + 1]);
-}
-static final long[] jjbitVec0 = {
- 0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
-private final int jjMoveNfa_0(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 3;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 3:
- if ((0x3ff6cfafffffdffL & l) != 0L)
- {
- if (kind > 21)
- kind = 21;
- jjCheckNAdd(2);
- }
- else if ((0x100000200L & l) != 0L)
- {
- if (kind > 6)
- kind = 6;
- jjCheckNAdd(0);
- }
- if ((0x3ff000000000000L & l) != 0L)
- {
- if (kind > 20)
- kind = 20;
- jjCheckNAdd(1);
- }
- break;
- case 0:
- if ((0x100000200L & l) == 0L)
- break;
- kind = 6;
- jjCheckNAdd(0);
- break;
- case 1:
- if ((0x3ff000000000000L & l) == 0L)
- break;
- if (kind > 20)
- kind = 20;
- jjCheckNAdd(1);
- break;
- case 2:
- if ((0x3ff6cfafffffdffL & l) == 0L)
- break;
- if (kind > 21)
- kind = 21;
- jjCheckNAdd(2);
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 3:
- case 2:
- if ((0xffffffffc7fffffeL & l) == 0L)
- break;
- kind = 21;
- jjCheckNAdd(2);
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 3:
- case 2:
- if ((jjbitVec0[i2] & l2) == 0L)
- break;
- if (kind > 21)
- kind = 21;
- jjCheckNAdd(2);
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-private final int jjStopStringLiteralDfa_1(int pos, long active0)
-{
- switch (pos)
- {
- default :
- return -1;
- }
-}
-private final int jjStartNfa_1(int pos, long active0)
-{
- return jjMoveNfa_1(jjStopStringLiteralDfa_1(pos, active0), pos + 1);
-}
-private final int jjStartNfaWithStates_1(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_1(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_1()
-{
- switch(curChar)
- {
- case 40:
- return jjStopAtPos(0, 10);
- case 41:
- return jjStopAtPos(0, 8);
- default :
- return jjMoveNfa_1(0, 0);
- }
-}
-private final int jjMoveNfa_1(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 3;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 11)
- kind = 11;
- break;
- case 1:
- if (kind > 9)
- kind = 9;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 11)
- kind = 11;
- if (curChar == 92)
- jjstateSet[jjnewStateCnt++] = 1;
- break;
- case 1:
- if (kind > 9)
- kind = 9;
- break;
- case 2:
- if (kind > 11)
- kind = 11;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 11)
- kind = 11;
- break;
- case 1:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 9)
- kind = 9;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-private final int jjStopStringLiteralDfa_3(int pos, long active0)
-{
- switch (pos)
- {
- default :
- return -1;
- }
-}
-private final int jjStartNfa_3(int pos, long active0)
-{
- return jjMoveNfa_3(jjStopStringLiteralDfa_3(pos, active0), pos + 1);
-}
-private final int jjStartNfaWithStates_3(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_3(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_3()
-{
- switch(curChar)
- {
- case 34:
- return jjStopAtPos(0, 19);
- default :
- return jjMoveNfa_3(0, 0);
- }
-}
-private final int jjMoveNfa_3(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 3;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- case 2:
- if ((0xfffffffbffffffffL & l) == 0L)
- break;
- if (kind > 18)
- kind = 18;
- jjCheckNAdd(2);
- break;
- case 1:
- if (kind > 17)
- kind = 17;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((0xffffffffefffffffL & l) != 0L)
- {
- if (kind > 18)
- kind = 18;
- jjCheckNAdd(2);
- }
- else if (curChar == 92)
- jjstateSet[jjnewStateCnt++] = 1;
- break;
- case 1:
- if (kind > 17)
- kind = 17;
- break;
- case 2:
- if ((0xffffffffefffffffL & l) == 0L)
- break;
- if (kind > 18)
- kind = 18;
- jjCheckNAdd(2);
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- case 2:
- if ((jjbitVec0[i2] & l2) == 0L)
- break;
- if (kind > 18)
- kind = 18;
- jjCheckNAdd(2);
- break;
- case 1:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 17)
- kind = 17;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-private final int jjStopStringLiteralDfa_2(int pos, long active0)
-{
- switch (pos)
- {
- default :
- return -1;
- }
-}
-private final int jjStartNfa_2(int pos, long active0)
-{
- return jjMoveNfa_2(jjStopStringLiteralDfa_2(pos, active0), pos + 1);
-}
-private final int jjStartNfaWithStates_2(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_2(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_2()
-{
- switch(curChar)
- {
- case 40:
- return jjStopAtPos(0, 13);
- case 41:
- return jjStopAtPos(0, 14);
- default :
- return jjMoveNfa_2(0, 0);
- }
-}
-private final int jjMoveNfa_2(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 3;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 15)
- kind = 15;
- break;
- case 1:
- if (kind > 12)
- kind = 12;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 15)
- kind = 15;
- if (curChar == 92)
- jjstateSet[jjnewStateCnt++] = 1;
- break;
- case 1:
- if (kind > 12)
- kind = 12;
- break;
- case 2:
- if (kind > 15)
- kind = 15;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 15)
- kind = 15;
- break;
- case 1:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 12)
- kind = 12;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-static final int[] jjnextStates = {
-};
-public static final String[] jjstrLiteralImages = {
-"", "\15", "\12", "\57", "\73", "\75", null, null, null, null, null, null,
-null, null, null, null, null, null, null, null, null, null, null, null, };
-public static final String[] lexStateNames = {
- "DEFAULT",
- "INCOMMENT",
- "NESTED_COMMENT",
- "INQUOTEDSTRING",
-};
-public static final int[] jjnewLexState = {
- -1, -1, -1, -1, -1, -1, -1, 1, 0, -1, 2, -1, -1, -1, -1, -1, 3, -1, -1, 0, -1, -1, -1, -1,
-};
-static final long[] jjtoToken = {
- 0x38003fL,
-};
-static final long[] jjtoSkip = {
- 0x140L,
-};
-static final long[] jjtoSpecial = {
- 0x40L,
-};
-static final long[] jjtoMore = {
- 0x7fe80L,
-};
-protected SimpleCharStream input_stream;
-private final int[] jjrounds = new int[3];
-private final int[] jjstateSet = new int[6];
-StringBuffer image;
-int jjimageLen;
-int lengthOfMatch;
-protected char curChar;
-public ContentTypeParserTokenManager(SimpleCharStream stream){
- if (SimpleCharStream.staticFlag)
- throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
- input_stream = stream;
-}
-public ContentTypeParserTokenManager(SimpleCharStream stream, int lexState){
- this(stream);
- SwitchTo(lexState);
-}
-public void ReInit(SimpleCharStream stream)
-{
- jjmatchedPos = jjnewStateCnt = 0;
- curLexState = defaultLexState;
- input_stream = stream;
- ReInitRounds();
-}
-private final void ReInitRounds()
-{
- int i;
- jjround = 0x80000001;
- for (i = 3; i-- > 0;)
- jjrounds[i] = 0x80000000;
-}
-public void ReInit(SimpleCharStream stream, int lexState)
-{
- ReInit(stream);
- SwitchTo(lexState);
-}
-public void SwitchTo(int lexState)
-{
- if (lexState >= 4 || lexState < 0)
- throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
- else
- curLexState = lexState;
-}
-
-protected Token jjFillToken()
-{
- Token t = Token.newToken(jjmatchedKind);
- t.kind = jjmatchedKind;
- String im = jjstrLiteralImages[jjmatchedKind];
- t.image = (im == null) ? input_stream.GetImage() : im;
- t.beginLine = input_stream.getBeginLine();
- t.beginColumn = input_stream.getBeginColumn();
- t.endLine = input_stream.getEndLine();
- t.endColumn = input_stream.getEndColumn();
- return t;
-}
-
-int curLexState = 0;
-int defaultLexState = 0;
-int jjnewStateCnt;
-int jjround;
-int jjmatchedPos;
-int jjmatchedKind;
-
-public Token getNextToken()
-{
- int kind;
- Token specialToken = null;
- Token matchedToken;
- int curPos = 0;
-
- EOFLoop :
- for (;;)
- {
- try
- {
- curChar = input_stream.BeginToken();
- }
- catch(java.io.IOException e)
- {
- jjmatchedKind = 0;
- matchedToken = jjFillToken();
- matchedToken.specialToken = specialToken;
- return matchedToken;
- }
- image = null;
- jjimageLen = 0;
-
- for (;;)
- {
- switch(curLexState)
- {
- case 0:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_0();
- break;
- case 1:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_1();
- break;
- case 2:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_2();
- break;
- case 3:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_3();
- break;
- }
- if (jjmatchedKind != 0x7fffffff)
- {
- if (jjmatchedPos + 1 < curPos)
- input_stream.backup(curPos - jjmatchedPos - 1);
- if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
- {
- matchedToken = jjFillToken();
- matchedToken.specialToken = specialToken;
- TokenLexicalActions(matchedToken);
- if (jjnewLexState[jjmatchedKind] != -1)
- curLexState = jjnewLexState[jjmatchedKind];
- return matchedToken;
- }
- else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
- {
- if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
- {
- matchedToken = jjFillToken();
- if (specialToken == null)
- specialToken = matchedToken;
- else
- {
- matchedToken.specialToken = specialToken;
- specialToken = (specialToken.next = matchedToken);
- }
- }
- if (jjnewLexState[jjmatchedKind] != -1)
- curLexState = jjnewLexState[jjmatchedKind];
- continue EOFLoop;
- }
- MoreLexicalActions();
- if (jjnewLexState[jjmatchedKind] != -1)
- curLexState = jjnewLexState[jjmatchedKind];
- curPos = 0;
- jjmatchedKind = 0x7fffffff;
- try {
- curChar = input_stream.readChar();
- continue;
- }
- catch (java.io.IOException e1) { }
- }
- int error_line = input_stream.getEndLine();
- int error_column = input_stream.getEndColumn();
- String error_after = null;
- boolean EOFSeen = false;
- try { input_stream.readChar(); input_stream.backup(1); }
- catch (java.io.IOException e1) {
- EOFSeen = true;
- error_after = curPos <= 1 ? "" : input_stream.GetImage();
- if (curChar == '\n' || curChar == '\r') {
- error_line++;
- error_column = 0;
- }
- else
- error_column++;
- }
- if (!EOFSeen) {
- input_stream.backup(1);
- error_after = curPos <= 1 ? "" : input_stream.GetImage();
- }
- throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
- }
- }
-}
-
-void MoreLexicalActions()
-{
- jjimageLen += (lengthOfMatch = jjmatchedPos + 1);
- switch(jjmatchedKind)
- {
- case 9 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- image.deleteCharAt(image.length() - 2);
- break;
- case 10 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- commentNest = 1;
- break;
- case 12 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- image.deleteCharAt(image.length() - 2);
- break;
- case 13 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- ++commentNest;
- break;
- case 14 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- --commentNest; if (commentNest == 0) SwitchTo(INCOMMENT);
- break;
- case 16 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- image.deleteCharAt(image.length() - 1);
- break;
- case 17 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- image.deleteCharAt(image.length() - 2);
- break;
- default :
- break;
- }
-}
-void TokenLexicalActions(Token matchedToken)
-{
- switch(jjmatchedKind)
- {
- case 19 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
- matchedToken.image = image.substring(0, image.length() - 1);
- break;
- default :
- break;
- }
-}
-}
diff --git a/apache/org/apache/james/mime4j/field/contenttype/parser/ParseException.java b/apache/org/apache/james/mime4j/field/contenttype/parser/ParseException.java
deleted file mode 100644
index d9b69b25c..000000000
--- a/apache/org/apache/james/mime4j/field/contenttype/parser/ParseException.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */
-/*
- * Copyright 2004 the mime4j 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 org.apache.james.mime4j.field.contenttype.parser;
-
-/**
- * This exception is thrown when parse errors are encountered.
- * You can explicitly create objects of this exception type by
- * calling the method generateParseException in the generated
- * parser.
- *
- * You can modify this class to customize your error reporting
- * mechanisms so long as you retain the public fields.
- */
-public class ParseException extends Exception {
-
- /**
- * This constructor is used by the method "generateParseException"
- * in the generated parser. Calling this constructor generates
- * a new object of this type with the fields "currentToken",
- * "expectedTokenSequences", and "tokenImage" set. The boolean
- * flag "specialConstructor" is also set to true to indicate that
- * this constructor was used to create this object.
- * This constructor calls its super class with the empty string
- * to force the "toString" method of parent class "Throwable" to
- * print the error message in the form:
- * ParseException:
- */
- public ParseException(Token currentTokenVal,
- int[][] expectedTokenSequencesVal,
- String[] tokenImageVal
- )
- {
- super("");
- specialConstructor = true;
- currentToken = currentTokenVal;
- expectedTokenSequences = expectedTokenSequencesVal;
- tokenImage = tokenImageVal;
- }
-
- /**
- * The following constructors are for use by you for whatever
- * purpose you can think of. Constructing the exception in this
- * manner makes the exception behave in the normal way - i.e., as
- * documented in the class "Throwable". The fields "errorToken",
- * "expectedTokenSequences", and "tokenImage" do not contain
- * relevant information. The JavaCC generated code does not use
- * these constructors.
- */
-
- public ParseException() {
- super();
- specialConstructor = false;
- }
-
- public ParseException(String message) {
- super(message);
- specialConstructor = false;
- }
-
- /**
- * This variable determines which constructor was used to create
- * this object and thereby affects the semantics of the
- * "getMessage" method (see below).
- */
- protected boolean specialConstructor;
-
- /**
- * This is the last token that has been consumed successfully. If
- * this object has been created due to a parse error, the token
- * followng this token will (therefore) be the first error token.
- */
- public Token currentToken;
-
- /**
- * Each entry in this array is an array of integers. Each array
- * of integers represents a sequence of tokens (by their ordinal
- * values) that is expected at this point of the parse.
- */
- public int[][] expectedTokenSequences;
-
- /**
- * This is a reference to the "tokenImage" array of the generated
- * parser within which the parse error occurred. This array is
- * defined in the generated ...Constants interface.
- */
- public String[] tokenImage;
-
- /**
- * This method has the standard behavior when this object has been
- * created using the standard constructors. Otherwise, it uses
- * "currentToken" and "expectedTokenSequences" to generate a parse
- * error message and returns it. If this object has been created
- * due to a parse error, and you do not catch it (it gets thrown
- * from the parser), then this method is called during the printing
- * of the final stack trace, and hence the correct error message
- * gets displayed.
- */
- public String getMessage() {
- if (!specialConstructor) {
- return super.getMessage();
- }
- StringBuffer expected = new StringBuffer();
- int maxSize = 0;
- for (int i = 0; i < expectedTokenSequences.length; i++) {
- if (maxSize < expectedTokenSequences[i].length) {
- maxSize = expectedTokenSequences[i].length;
- }
- for (int j = 0; j < expectedTokenSequences[i].length; j++) {
- expected.append(tokenImage[expectedTokenSequences[i][j]]).append(" ");
- }
- if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
- expected.append("...");
- }
- expected.append(eol).append(" ");
- }
- String retval = "Encountered \"";
- Token tok = currentToken.next;
- for (int i = 0; i < maxSize; i++) {
- if (i != 0) retval += " ";
- if (tok.kind == 0) {
- retval += tokenImage[0];
- break;
- }
- retval += add_escapes(tok.image);
- tok = tok.next;
- }
- retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
- retval += "." + eol;
- if (expectedTokenSequences.length == 1) {
- retval += "Was expecting:" + eol + " ";
- } else {
- retval += "Was expecting one of:" + eol + " ";
- }
- retval += expected.toString();
- return retval;
- }
-
- /**
- * The end of line string for this machine.
- */
- protected String eol = System.getProperty("line.separator", "\n");
-
- /**
- * Used to convert raw characters to their escaped version
- * when these raw version cannot be used as part of an ASCII
- * string literal.
- */
- protected String add_escapes(String str) {
- StringBuffer retval = new StringBuffer();
- char ch;
- for (int i = 0; i < str.length(); i++) {
- switch (str.charAt(i))
- {
- case 0 :
- continue;
- case '\b':
- retval.append("\\b");
- continue;
- case '\t':
- retval.append("\\t");
- continue;
- case '\n':
- retval.append("\\n");
- continue;
- case '\f':
- retval.append("\\f");
- continue;
- case '\r':
- retval.append("\\r");
- continue;
- case '\"':
- retval.append("\\\"");
- continue;
- case '\'':
- retval.append("\\\'");
- continue;
- case '\\':
- retval.append("\\\\");
- continue;
- default:
- if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
- String s = "0000" + Integer.toString(ch, 16);
- retval.append("\\u" + s.substring(s.length() - 4, s.length()));
- } else {
- retval.append(ch);
- }
- continue;
- }
- }
- return retval.toString();
- }
-
-}
diff --git a/apache/org/apache/james/mime4j/field/contenttype/parser/SimpleCharStream.java b/apache/org/apache/james/mime4j/field/contenttype/parser/SimpleCharStream.java
deleted file mode 100644
index ae035b717..000000000
--- a/apache/org/apache/james/mime4j/field/contenttype/parser/SimpleCharStream.java
+++ /dev/null
@@ -1,454 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 4.0 */
-/*
- * Copyright 2004 the mime4j 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 org.apache.james.mime4j.field.contenttype.parser;
-
-/**
- * An implementation of interface CharStream, where the stream is assumed to
- * contain only ASCII characters (without unicode processing).
- */
-
-public class SimpleCharStream
-{
- public static final boolean staticFlag = false;
- int bufsize;
- int available;
- int tokenBegin;
- public int bufpos = -1;
- protected int bufline[];
- protected int bufcolumn[];
-
- protected int column = 0;
- protected int line = 1;
-
- protected boolean prevCharIsCR = false;
- protected boolean prevCharIsLF = false;
-
- protected java.io.Reader inputStream;
-
- protected char[] buffer;
- protected int maxNextCharInd = 0;
- protected int inBuf = 0;
- protected int tabSize = 8;
-
- protected void setTabSize(int i) { tabSize = i; }
- protected int getTabSize(int i) { return tabSize; }
-
-
- protected void ExpandBuff(boolean wrapAround)
- {
- char[] newbuffer = new char[bufsize + 2048];
- int newbufline[] = new int[bufsize + 2048];
- int newbufcolumn[] = new int[bufsize + 2048];
-
- try
- {
- if (wrapAround)
- {
- System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
- System.arraycopy(buffer, 0, newbuffer,
- bufsize - tokenBegin, bufpos);
- buffer = newbuffer;
-
- System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
- System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
- bufline = newbufline;
-
- System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
- System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
- bufcolumn = newbufcolumn;
-
- maxNextCharInd = (bufpos += (bufsize - tokenBegin));
- }
- else
- {
- System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
- buffer = newbuffer;
-
- System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
- bufline = newbufline;
-
- System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
- bufcolumn = newbufcolumn;
-
- maxNextCharInd = (bufpos -= tokenBegin);
- }
- }
- catch (Throwable t)
- {
- throw new Error(t.getMessage());
- }
-
-
- bufsize += 2048;
- available = bufsize;
- tokenBegin = 0;
- }
-
- protected void FillBuff() throws java.io.IOException
- {
- if (maxNextCharInd == available)
- {
- if (available == bufsize)
- {
- if (tokenBegin > 2048)
- {
- bufpos = maxNextCharInd = 0;
- available = tokenBegin;
- }
- else if (tokenBegin < 0)
- bufpos = maxNextCharInd = 0;
- else
- ExpandBuff(false);
- }
- else if (available > tokenBegin)
- available = bufsize;
- else if ((tokenBegin - available) < 2048)
- ExpandBuff(true);
- else
- available = tokenBegin;
- }
-
- int i;
- try {
- if ((i = inputStream.read(buffer, maxNextCharInd,
- available - maxNextCharInd)) == -1)
- {
- inputStream.close();
- throw new java.io.IOException();
- }
- else
- maxNextCharInd += i;
- return;
- }
- catch(java.io.IOException e) {
- --bufpos;
- backup(0);
- if (tokenBegin == -1)
- tokenBegin = bufpos;
- throw e;
- }
- }
-
- public char BeginToken() throws java.io.IOException
- {
- tokenBegin = -1;
- char c = readChar();
- tokenBegin = bufpos;
-
- return c;
- }
-
- protected void UpdateLineColumn(char c)
- {
- column++;
-
- if (prevCharIsLF)
- {
- prevCharIsLF = false;
- line += (column = 1);
- }
- else if (prevCharIsCR)
- {
- prevCharIsCR = false;
- if (c == '\n')
- {
- prevCharIsLF = true;
- }
- else
- line += (column = 1);
- }
-
- switch (c)
- {
- case '\r' :
- prevCharIsCR = true;
- break;
- case '\n' :
- prevCharIsLF = true;
- break;
- case '\t' :
- column--;
- column += (tabSize - (column % tabSize));
- break;
- default :
- break;
- }
-
- bufline[bufpos] = line;
- bufcolumn[bufpos] = column;
- }
-
- public char readChar() throws java.io.IOException
- {
- if (inBuf > 0)
- {
- --inBuf;
-
- if (++bufpos == bufsize)
- bufpos = 0;
-
- return buffer[bufpos];
- }
-
- if (++bufpos >= maxNextCharInd)
- FillBuff();
-
- char c = buffer[bufpos];
-
- UpdateLineColumn(c);
- return (c);
- }
-
- /**
- * @deprecated
- * @see #getEndColumn
- */
- @Deprecated
- public int getColumn() {
- return bufcolumn[bufpos];
- }
-
- /**
- * @deprecated
- * @see #getEndLine
- */
- @Deprecated
- public int getLine() {
- return bufline[bufpos];
- }
-
- public int getEndColumn() {
- return bufcolumn[bufpos];
- }
-
- public int getEndLine() {
- return bufline[bufpos];
- }
-
- public int getBeginColumn() {
- return bufcolumn[tokenBegin];
- }
-
- public int getBeginLine() {
- return bufline[tokenBegin];
- }
-
- public void backup(int amount) {
-
- inBuf += amount;
- if ((bufpos -= amount) < 0)
- bufpos += bufsize;
- }
-
- public SimpleCharStream(java.io.Reader dstream, int startline,
- int startcolumn, int buffersize)
- {
- inputStream = dstream;
- line = startline;
- column = startcolumn - 1;
-
- available = bufsize = buffersize;
- buffer = new char[buffersize];
- bufline = new int[buffersize];
- bufcolumn = new int[buffersize];
- }
-
- public SimpleCharStream(java.io.Reader dstream, int startline,
- int startcolumn)
- {
- this(dstream, startline, startcolumn, 4096);
- }
-
- public SimpleCharStream(java.io.Reader dstream)
- {
- this(dstream, 1, 1, 4096);
- }
- public void ReInit(java.io.Reader dstream, int startline,
- int startcolumn, int buffersize)
- {
- inputStream = dstream;
- line = startline;
- column = startcolumn - 1;
-
- if (buffer == null || buffersize != buffer.length)
- {
- available = bufsize = buffersize;
- buffer = new char[buffersize];
- bufline = new int[buffersize];
- bufcolumn = new int[buffersize];
- }
- prevCharIsLF = prevCharIsCR = false;
- tokenBegin = inBuf = maxNextCharInd = 0;
- bufpos = -1;
- }
-
- public void ReInit(java.io.Reader dstream, int startline,
- int startcolumn)
- {
- ReInit(dstream, startline, startcolumn, 4096);
- }
-
- public void ReInit(java.io.Reader dstream)
- {
- ReInit(dstream, 1, 1, 4096);
- }
- public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
- {
- this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, int startline,
- int startcolumn, int buffersize)
- {
- this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn) throws java.io.UnsupportedEncodingException
- {
- this(dstream, encoding, startline, startcolumn, 4096);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, int startline,
- int startcolumn)
- {
- this(dstream, startline, startcolumn, 4096);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
- {
- this(dstream, encoding, 1, 1, 4096);
- }
-
- public SimpleCharStream(java.io.InputStream dstream)
- {
- this(dstream, 1, 1, 4096);
- }
-
- public void ReInit(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
- {
- ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
- }
-
- public void ReInit(java.io.InputStream dstream, int startline,
- int startcolumn, int buffersize)
- {
- ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
- }
-
- public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
- {
- ReInit(dstream, encoding, 1, 1, 4096);
- }
-
- public void ReInit(java.io.InputStream dstream)
- {
- ReInit(dstream, 1, 1, 4096);
- }
- public void ReInit(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn) throws java.io.UnsupportedEncodingException
- {
- ReInit(dstream, encoding, startline, startcolumn, 4096);
- }
- public void ReInit(java.io.InputStream dstream, int startline,
- int startcolumn)
- {
- ReInit(dstream, startline, startcolumn, 4096);
- }
- public String GetImage()
- {
- if (bufpos >= tokenBegin)
- return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
- else
- return new String(buffer, tokenBegin, bufsize - tokenBegin) +
- new String(buffer, 0, bufpos + 1);
- }
-
- public char[] GetSuffix(int len)
- {
- char[] ret = new char[len];
-
- if ((bufpos + 1) >= len)
- System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
- else
- {
- System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
- len - bufpos - 1);
- System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
- }
-
- return ret;
- }
-
- public void Done()
- {
- buffer = null;
- bufline = null;
- bufcolumn = null;
- }
-
- /**
- * Method to adjust line and column numbers for the start of a token.
- */
- public void adjustBeginLineColumn(int newLine, int newCol)
- {
- int start = tokenBegin;
- int len;
-
- if (bufpos >= tokenBegin)
- {
- len = bufpos - tokenBegin + inBuf + 1;
- }
- else
- {
- len = bufsize - tokenBegin + bufpos + 1 + inBuf;
- }
-
- int i = 0, j = 0, k = 0;
- int nextColDiff = 0, columnDiff = 0;
-
- while (i < len &&
- bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
- {
- bufline[j] = newLine;
- nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
- bufcolumn[j] = newCol + columnDiff;
- columnDiff = nextColDiff;
- i++;
- }
-
- if (i < len)
- {
- bufline[j] = newLine++;
- bufcolumn[j] = newCol + columnDiff;
-
- while (i++ < len)
- {
- if (bufline[j = start % bufsize] != bufline[++start % bufsize])
- bufline[j] = newLine++;
- else
- bufline[j] = newLine;
- }
- }
-
- line = bufline[j];
- column = bufcolumn[j];
- }
-
-}
diff --git a/apache/org/apache/james/mime4j/field/contenttype/parser/Token.java b/apache/org/apache/james/mime4j/field/contenttype/parser/Token.java
deleted file mode 100644
index 34e65eec0..000000000
--- a/apache/org/apache/james/mime4j/field/contenttype/parser/Token.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. Token.java Version 3.0 */
-/*
- * Copyright 2004 the mime4j 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 org.apache.james.mime4j.field.contenttype.parser;
-
-/**
- * Describes the input token stream.
- */
-
-public class Token {
-
- /**
- * An integer that describes the kind of this token. This numbering
- * system is determined by JavaCCParser, and a table of these numbers is
- * stored in the file ...Constants.java.
- */
- public int kind;
-
- /**
- * beginLine and beginColumn describe the position of the first character
- * of this token; endLine and endColumn describe the position of the
- * last character of this token.
- */
- public int beginLine, beginColumn, endLine, endColumn;
-
- /**
- * The string image of the token.
- */
- public String image;
-
- /**
- * A reference to the next regular (non-special) token from the input
- * stream. If this is the last token from the input stream, or if the
- * token manager has not read tokens beyond this one, this field is
- * set to null. This is true only if this token is also a regular
- * token. Otherwise, see below for a description of the contents of
- * this field.
- */
- public Token next;
-
- /**
- * This field is used to access special tokens that occur prior to this
- * token, but after the immediately preceding regular (non-special) token.
- * If there are no such special tokens, this field is set to null.
- * When there are more than one such special token, this field refers
- * to the last of these special tokens, which in turn refers to the next
- * previous special token through its specialToken field, and so on
- * until the first special token (whose specialToken field is null).
- * The next fields of special tokens refer to other special tokens that
- * immediately follow it (without an intervening regular token). If there
- * is no such token, this field is null.
- */
- public Token specialToken;
-
- /**
- * Returns the image.
- */
- public String toString()
- {
- return image;
- }
-
- /**
- * Returns a new Token object, by default. However, if you want, you
- * can create and return subclass objects based on the value of ofKind.
- * Simply add the cases to the switch for all those special cases.
- * For example, if you have a subclass of Token called IDToken that
- * you want to create if ofKind is ID, simlpy add something like :
- *
- * case MyParserConstants.ID : return new IDToken();
- *
- * to the following switch statement. Then you can cast matchedToken
- * variable to the appropriate type and use it in your lexical actions.
- */
- public static final Token newToken(int ofKind)
- {
- switch(ofKind)
- {
- default : return new Token();
- }
- }
-
-}
diff --git a/apache/org/apache/james/mime4j/field/contenttype/parser/TokenMgrError.java b/apache/org/apache/james/mime4j/field/contenttype/parser/TokenMgrError.java
deleted file mode 100644
index ea5a7826e..000000000
--- a/apache/org/apache/james/mime4j/field/contenttype/parser/TokenMgrError.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 3.0 */
-/*
- * Copyright 2004 the mime4j 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 org.apache.james.mime4j.field.contenttype.parser;
-
-public class TokenMgrError extends Error
-{
- /*
- * Ordinals for various reasons why an Error of this type can be thrown.
- */
-
- /**
- * Lexical error occured.
- */
- static final int LEXICAL_ERROR = 0;
-
- /**
- * An attempt wass made to create a second instance of a static token manager.
- */
- static final int STATIC_LEXER_ERROR = 1;
-
- /**
- * Tried to change to an invalid lexical state.
- */
- static final int INVALID_LEXICAL_STATE = 2;
-
- /**
- * Detected (and bailed out of) an infinite loop in the token manager.
- */
- static final int LOOP_DETECTED = 3;
-
- /**
- * Indicates the reason why the exception is thrown. It will have
- * one of the above 4 values.
- */
- int errorCode;
-
- /**
- * Replaces unprintable characters by their espaced (or unicode escaped)
- * equivalents in the given string
- */
- protected static final String addEscapes(String str) {
- StringBuffer retval = new StringBuffer();
- char ch;
- for (int i = 0; i < str.length(); i++) {
- switch (str.charAt(i))
- {
- case 0 :
- continue;
- case '\b':
- retval.append("\\b");
- continue;
- case '\t':
- retval.append("\\t");
- continue;
- case '\n':
- retval.append("\\n");
- continue;
- case '\f':
- retval.append("\\f");
- continue;
- case '\r':
- retval.append("\\r");
- continue;
- case '\"':
- retval.append("\\\"");
- continue;
- case '\'':
- retval.append("\\\'");
- continue;
- case '\\':
- retval.append("\\\\");
- continue;
- default:
- if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
- String s = "0000" + Integer.toString(ch, 16);
- retval.append("\\u" + s.substring(s.length() - 4, s.length()));
- } else {
- retval.append(ch);
- }
- continue;
- }
- }
- return retval.toString();
- }
-
- /**
- * Returns a detailed message for the Error when it is thrown by the
- * token manager to indicate a lexical error.
- * Parameters :
- * EOFSeen : indicates if EOF caused the lexicl error
- * curLexState : lexical state in which this error occured
- * errorLine : line number when the error occured
- * errorColumn : column number when the error occured
- * errorAfter : prefix that was seen before this error occured
- * curchar : the offending character
- * Note: You can customize the lexical error message by modifying this method.
- */
- protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
- return("Lexical error at line " +
- errorLine + ", column " +
- errorColumn + ". Encountered: " +
- (EOFSeen ? " " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
- "after : \"" + addEscapes(errorAfter) + "\"");
- }
-
- /**
- * You can also modify the body of this method to customize your error messages.
- * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
- * of end-users concern, so you can return something like :
- *
- * "Internal Error : Please file a bug report .... "
- *
- * from this method for such cases in the release version of your parser.
- */
- public String getMessage() {
- return super.getMessage();
- }
-
- /*
- * Constructors of various flavors follow.
- */
-
- public TokenMgrError() {
- }
-
- public TokenMgrError(String message, int reason) {
- super(message);
- errorCode = reason;
- }
-
- public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
- this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/datetime/DateTime.java b/apache/org/apache/james/mime4j/field/datetime/DateTime.java
deleted file mode 100644
index 506ff54e5..000000000
--- a/apache/org/apache/james/mime4j/field/datetime/DateTime.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.field.datetime;
-
-import org.apache.james.mime4j.field.datetime.parser.DateTimeParser;
-import org.apache.james.mime4j.field.datetime.parser.ParseException;
-import org.apache.james.mime4j.field.datetime.parser.TokenMgrError;
-
-import java.util.Date;
-import java.util.Calendar;
-import java.util.TimeZone;
-import java.util.GregorianCalendar;
-import java.io.StringReader;
-
-public class DateTime {
- private final Date date;
- private final int year;
- private final int month;
- private final int day;
- private final int hour;
- private final int minute;
- private final int second;
- private final int timeZone;
-
- public DateTime(String yearString, int month, int day, int hour, int minute, int second, int timeZone) {
- this.year = convertToYear(yearString);
- this.date = convertToDate(year, month, day, hour, minute, second, timeZone);
- this.month = month;
- this.day = day;
- this.hour = hour;
- this.minute = minute;
- this.second = second;
- this.timeZone = timeZone;
- }
-
- private int convertToYear(String yearString) {
- int year = Integer.parseInt(yearString);
- switch (yearString.length()) {
- case 1:
- case 2:
- if (year >= 0 && year < 50)
- return 2000 + year;
- else
- return 1900 + year;
- case 3:
- return 1900 + year;
- default:
- return year;
- }
- }
-
- public static Date convertToDate(int year, int month, int day, int hour, int minute, int second, int timeZone) {
- Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT+0"));
- c.set(year, month - 1, day, hour, minute, second);
- c.set(Calendar.MILLISECOND, 0);
-
- if (timeZone != Integer.MIN_VALUE) {
- int minutes = ((timeZone / 100) * 60) + timeZone % 100;
- c.add(Calendar.MINUTE, -1 * minutes);
- }
-
- return c.getTime();
- }
-
- public Date getDate() {
- return date;
- }
-
- public int getYear() {
- return year;
- }
-
- public int getMonth() {
- return month;
- }
-
- public int getDay() {
- return day;
- }
-
- public int getHour() {
- return hour;
- }
-
- public int getMinute() {
- return minute;
- }
-
- public int getSecond() {
- return second;
- }
-
- public int getTimeZone() {
- return timeZone;
- }
-
- public void print() {
- System.out.println(getYear() + " " + getMonth() + " " + getDay() + "; " + getHour() + " " + getMinute() + " " + getSecond() + " " + getTimeZone());
- }
-
-
- public static DateTime parse(String dateString) throws ParseException {
- try {
- return new DateTimeParser(new StringReader(dateString)).parseAll();
- }
- catch (TokenMgrError err) {
- throw new ParseException(err.getMessage());
- }
- }
-}
diff --git a/apache/org/apache/james/mime4j/field/datetime/parser/DateTimeParser.java b/apache/org/apache/james/mime4j/field/datetime/parser/DateTimeParser.java
deleted file mode 100644
index 43edebb5c..000000000
--- a/apache/org/apache/james/mime4j/field/datetime/parser/DateTimeParser.java
+++ /dev/null
@@ -1,570 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. DateTimeParser.java */
-/*
- * Copyright 2004 the mime4j 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 org.apache.james.mime4j.field.datetime.parser;
-
-import org.apache.james.mime4j.field.datetime.DateTime;
-
-import java.util.Vector;
-
-public class DateTimeParser implements DateTimeParserConstants {
- private static final boolean ignoreMilitaryZoneOffset = true;
-
- public static void main(String args[]) throws ParseException {
- while (true) {
- try {
- DateTimeParser parser = new DateTimeParser(System.in);
- parser.parseLine();
- } catch (Exception x) {
- x.printStackTrace();
- return;
- }
- }
- }
-
- private static int parseDigits(Token token) {
- return Integer.parseInt(token.image, 10);
- }
-
- private static int getMilitaryZoneOffset(char c) {
- if (ignoreMilitaryZoneOffset)
- return 0;
-
- c = Character.toUpperCase(c);
-
- switch (c) {
- case 'A': return 1;
- case 'B': return 2;
- case 'C': return 3;
- case 'D': return 4;
- case 'E': return 5;
- case 'F': return 6;
- case 'G': return 7;
- case 'H': return 8;
- case 'I': return 9;
- case 'K': return 10;
- case 'L': return 11;
- case 'M': return 12;
-
- case 'N': return -1;
- case 'O': return -2;
- case 'P': return -3;
- case 'Q': return -4;
- case 'R': return -5;
- case 'S': return -6;
- case 'T': return -7;
- case 'U': return -8;
- case 'V': return -9;
- case 'W': return -10;
- case 'X': return -11;
- case 'Y': return -12;
-
- case 'Z': return 0;
- default: return 0;
- }
- }
-
- private static class Time {
- private int hour;
- private int minute;
- private int second;
- private int zone;
-
- public Time(int hour, int minute, int second, int zone) {
- this.hour = hour;
- this.minute = minute;
- this.second = second;
- this.zone = zone;
- }
-
- public int getHour() { return hour; }
- public int getMinute() { return minute; }
- public int getSecond() { return second; }
- public int getZone() { return zone; }
- }
-
- private static class Date {
- private String year;
- private int month;
- private int day;
-
- public Date(String year, int month, int day) {
- this.year = year;
- this.month = month;
- this.day = day;
- }
-
- public String getYear() { return year; }
- public int getMonth() { return month; }
- public int getDay() { return day; }
- }
-
- final public DateTime parseLine() throws ParseException {
- DateTime dt;
- dt = date_time();
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 1:
- jj_consume_token(1);
- break;
- default:
- jj_la1[0] = jj_gen;
- ;
- }
- jj_consume_token(2);
- {if (true) return dt;}
- throw new Error("Missing return statement in function");
- }
-
- final public DateTime parseAll() throws ParseException {
- DateTime dt;
- dt = date_time();
- jj_consume_token(0);
- {if (true) return dt;}
- throw new Error("Missing return statement in function");
- }
-
- final public DateTime date_time() throws ParseException {
- Date d; Time t;
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- case 9:
- case 10:
- day_of_week();
- jj_consume_token(3);
- break;
- default:
- jj_la1[1] = jj_gen;
- ;
- }
- d = date();
- t = time();
- {if (true) return new DateTime(
- d.getYear(),
- d.getMonth(),
- d.getDay(),
- t.getHour(),
- t.getMinute(),
- t.getSecond(),
- t.getZone());} // time zone offset
-
- throw new Error("Missing return statement in function");
- }
-
- final public String day_of_week() throws ParseException {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 4:
- jj_consume_token(4);
- break;
- case 5:
- jj_consume_token(5);
- break;
- case 6:
- jj_consume_token(6);
- break;
- case 7:
- jj_consume_token(7);
- break;
- case 8:
- jj_consume_token(8);
- break;
- case 9:
- jj_consume_token(9);
- break;
- case 10:
- jj_consume_token(10);
- break;
- default:
- jj_la1[2] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- {if (true) return token.image;}
- throw new Error("Missing return statement in function");
- }
-
- final public Date date() throws ParseException {
- int d, m; String y;
- d = day();
- m = month();
- y = year();
- {if (true) return new Date(y, m, d);}
- throw new Error("Missing return statement in function");
- }
-
- final public int day() throws ParseException {
- Token t;
- t = jj_consume_token(DIGITS);
- {if (true) return parseDigits(t);}
- throw new Error("Missing return statement in function");
- }
-
- final public int month() throws ParseException {
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 11:
- jj_consume_token(11);
- {if (true) return 1;}
- break;
- case 12:
- jj_consume_token(12);
- {if (true) return 2;}
- break;
- case 13:
- jj_consume_token(13);
- {if (true) return 3;}
- break;
- case 14:
- jj_consume_token(14);
- {if (true) return 4;}
- break;
- case 15:
- jj_consume_token(15);
- {if (true) return 5;}
- break;
- case 16:
- jj_consume_token(16);
- {if (true) return 6;}
- break;
- case 17:
- jj_consume_token(17);
- {if (true) return 7;}
- break;
- case 18:
- jj_consume_token(18);
- {if (true) return 8;}
- break;
- case 19:
- jj_consume_token(19);
- {if (true) return 9;}
- break;
- case 20:
- jj_consume_token(20);
- {if (true) return 10;}
- break;
- case 21:
- jj_consume_token(21);
- {if (true) return 11;}
- break;
- case 22:
- jj_consume_token(22);
- {if (true) return 12;}
- break;
- default:
- jj_la1[3] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- throw new Error("Missing return statement in function");
- }
-
- final public String year() throws ParseException {
- Token t;
- t = jj_consume_token(DIGITS);
- {if (true) return t.image;}
- throw new Error("Missing return statement in function");
- }
-
- final public Time time() throws ParseException {
- int h, m, s=0, z;
- h = hour();
- jj_consume_token(23);
- m = minute();
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 23:
- jj_consume_token(23);
- s = second();
- break;
- default:
- jj_la1[4] = jj_gen;
- ;
- }
- z = zone();
- {if (true) return new Time(h, m, s, z);}
- throw new Error("Missing return statement in function");
- }
-
- final public int hour() throws ParseException {
- Token t;
- t = jj_consume_token(DIGITS);
- {if (true) return parseDigits(t);}
- throw new Error("Missing return statement in function");
- }
-
- final public int minute() throws ParseException {
- Token t;
- t = jj_consume_token(DIGITS);
- {if (true) return parseDigits(t);}
- throw new Error("Missing return statement in function");
- }
-
- final public int second() throws ParseException {
- Token t;
- t = jj_consume_token(DIGITS);
- {if (true) return parseDigits(t);}
- throw new Error("Missing return statement in function");
- }
-
- final public int zone() throws ParseException {
- Token t, u; int z;
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case OFFSETDIR:
- t = jj_consume_token(OFFSETDIR);
- u = jj_consume_token(DIGITS);
- z=parseDigits(u)*(t.image.equals("-") ? -1 : 1);
- break;
- case 25:
- case 26:
- case 27:
- case 28:
- case 29:
- case 30:
- case 31:
- case 32:
- case 33:
- case 34:
- case MILITARY_ZONE:
- z = obs_zone();
- break;
- default:
- jj_la1[5] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- {if (true) return z;}
- throw new Error("Missing return statement in function");
- }
-
- final public int obs_zone() throws ParseException {
- Token t; int z;
- switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case 25:
- jj_consume_token(25);
- z=0;
- break;
- case 26:
- jj_consume_token(26);
- z=0;
- break;
- case 27:
- jj_consume_token(27);
- z=-5;
- break;
- case 28:
- jj_consume_token(28);
- z=-4;
- break;
- case 29:
- jj_consume_token(29);
- z=-6;
- break;
- case 30:
- jj_consume_token(30);
- z=-5;
- break;
- case 31:
- jj_consume_token(31);
- z=-7;
- break;
- case 32:
- jj_consume_token(32);
- z=-6;
- break;
- case 33:
- jj_consume_token(33);
- z=-8;
- break;
- case 34:
- jj_consume_token(34);
- z=-7;
- break;
- case MILITARY_ZONE:
- t = jj_consume_token(MILITARY_ZONE);
- z=getMilitaryZoneOffset(t.image.charAt(0));
- break;
- default:
- jj_la1[6] = jj_gen;
- jj_consume_token(-1);
- throw new ParseException();
- }
- {if (true) return z * 100;}
- throw new Error("Missing return statement in function");
- }
-
- public DateTimeParserTokenManager token_source;
- SimpleCharStream jj_input_stream;
- public Token token, jj_nt;
- private int jj_ntk;
- private int jj_gen;
- final private int[] jj_la1 = new int[7];
- static private int[] jj_la1_0;
- static private int[] jj_la1_1;
- static {
- jj_la1_0();
- jj_la1_1();
- }
- private static void jj_la1_0() {
- jj_la1_0 = new int[] {0x2,0x7f0,0x7f0,0x7ff800,0x800000,0xff000000,0xfe000000,};
- }
- private static void jj_la1_1() {
- jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x0,0xf,0xf,};
- }
-
- public DateTimeParser(java.io.InputStream stream) {
- this(stream, null);
- }
- public DateTimeParser(java.io.InputStream stream, String encoding) {
- try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
- token_source = new DateTimeParserTokenManager(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 7; i++) jj_la1[i] = -1;
- }
-
- public void ReInit(java.io.InputStream stream) {
- ReInit(stream, null);
- }
- public void ReInit(java.io.InputStream stream, String encoding) {
- try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
- token_source.ReInit(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 7; i++) jj_la1[i] = -1;
- }
-
- public DateTimeParser(java.io.Reader stream) {
- jj_input_stream = new SimpleCharStream(stream, 1, 1);
- token_source = new DateTimeParserTokenManager(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 7; i++) jj_la1[i] = -1;
- }
-
- public void ReInit(java.io.Reader stream) {
- jj_input_stream.ReInit(stream, 1, 1);
- token_source.ReInit(jj_input_stream);
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 7; i++) jj_la1[i] = -1;
- }
-
- public DateTimeParser(DateTimeParserTokenManager tm) {
- token_source = tm;
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 7; i++) jj_la1[i] = -1;
- }
-
- public void ReInit(DateTimeParserTokenManager tm) {
- token_source = tm;
- token = new Token();
- jj_ntk = -1;
- jj_gen = 0;
- for (int i = 0; i < 7; i++) jj_la1[i] = -1;
- }
-
- final private Token jj_consume_token(int kind) throws ParseException {
- Token oldToken;
- if ((oldToken = token).next != null) token = token.next;
- else token = token.next = token_source.getNextToken();
- jj_ntk = -1;
- if (token.kind == kind) {
- jj_gen++;
- return token;
- }
- token = oldToken;
- jj_kind = kind;
- throw generateParseException();
- }
-
- final public Token getNextToken() {
- if (token.next != null) token = token.next;
- else token = token.next = token_source.getNextToken();
- jj_ntk = -1;
- jj_gen++;
- return token;
- }
-
- final public Token getToken(int index) {
- Token t = token;
- for (int i = 0; i < index; i++) {
- if (t.next != null) t = t.next;
- else t = t.next = token_source.getNextToken();
- }
- return t;
- }
-
- final private int jj_ntk() {
- if ((jj_nt=token.next) == null)
- return (jj_ntk = (token.next=token_source.getNextToken()).kind);
- else
- return (jj_ntk = jj_nt.kind);
- }
-
- private Vector jj_expentries = new Vector();
- private int[] jj_expentry;
- private int jj_kind = -1;
-
- public ParseException generateParseException() {
- jj_expentries.removeAllElements();
- boolean[] la1tokens = new boolean[49];
- for (int i = 0; i < 49; i++) {
- la1tokens[i] = false;
- }
- if (jj_kind >= 0) {
- la1tokens[jj_kind] = true;
- jj_kind = -1;
- }
- for (int i = 0; i < 7; i++) {
- if (jj_la1[i] == jj_gen) {
- for (int j = 0; j < 32; j++) {
- if ((jj_la1_0[i] & (1<",
- "\"\\r\"",
- "\"\\n\"",
- "\",\"",
- "\"Mon\"",
- "\"Tue\"",
- "\"Wed\"",
- "\"Thu\"",
- "\"Fri\"",
- "\"Sat\"",
- "\"Sun\"",
- "\"Jan\"",
- "\"Feb\"",
- "\"Mar\"",
- "\"Apr\"",
- "\"May\"",
- "\"Jun\"",
- "\"Jul\"",
- "\"Aug\"",
- "\"Sep\"",
- "\"Oct\"",
- "\"Nov\"",
- "\"Dec\"",
- "\":\"",
- "",
- "\"UT\"",
- "\"GMT\"",
- "\"EST\"",
- "\"EDT\"",
- "\"CST\"",
- "\"CDT\"",
- "\"MST\"",
- "\"MDT\"",
- "\"PST\"",
- "\"PDT\"",
- "",
- "",
- "\"(\"",
- "\")\"",
- "",
- "\"(\"",
- "",
- "",
- "\"(\"",
- "\")\"",
- "",
- "",
- "",
- "",
- };
-
-}
diff --git a/apache/org/apache/james/mime4j/field/datetime/parser/DateTimeParserTokenManager.java b/apache/org/apache/james/mime4j/field/datetime/parser/DateTimeParserTokenManager.java
deleted file mode 100644
index 4b2d2fd95..000000000
--- a/apache/org/apache/james/mime4j/field/datetime/parser/DateTimeParserTokenManager.java
+++ /dev/null
@@ -1,882 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. DateTimeParserTokenManager.java */
-/*
- * Copyright 2004 the mime4j 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 org.apache.james.mime4j.field.datetime.parser;
-import org.apache.james.mime4j.field.datetime.DateTime;
-import java.util.Calendar;
-
-public class DateTimeParserTokenManager implements DateTimeParserConstants
-{
- // Keeps track of how many levels of comment nesting
- // we've encountered. This is only used when the 2nd
- // level is reached, for example ((this)), not (this).
- // This is because the outermost level must be treated
- // specially anyway, because the outermost ")" has a
- // different token type than inner ")" instances.
- static int commentNest;
- public java.io.PrintStream debugStream = System.out;
- public void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
-private final int jjStopStringLiteralDfa_0(int pos, long active0)
-{
- switch (pos)
- {
- case 0:
- if ((active0 & 0x7fe7cf7f0L) != 0L)
- {
- jjmatchedKind = 35;
- return -1;
- }
- return -1;
- case 1:
- if ((active0 & 0x7fe7cf7f0L) != 0L)
- {
- if (jjmatchedPos == 0)
- {
- jjmatchedKind = 35;
- jjmatchedPos = 0;
- }
- return -1;
- }
- return -1;
- default :
- return -1;
- }
-}
-private final int jjStartNfa_0(int pos, long active0)
-{
- return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1);
-}
-private final int jjStopAtPos(int pos, int kind)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- return pos + 1;
-}
-private final int jjStartNfaWithStates_0(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_0(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_0()
-{
- switch(curChar)
- {
- case 10:
- return jjStopAtPos(0, 2);
- case 13:
- return jjStopAtPos(0, 1);
- case 40:
- return jjStopAtPos(0, 37);
- case 44:
- return jjStopAtPos(0, 3);
- case 58:
- return jjStopAtPos(0, 23);
- case 65:
- return jjMoveStringLiteralDfa1_0(0x44000L);
- case 67:
- return jjMoveStringLiteralDfa1_0(0x60000000L);
- case 68:
- return jjMoveStringLiteralDfa1_0(0x400000L);
- case 69:
- return jjMoveStringLiteralDfa1_0(0x18000000L);
- case 70:
- return jjMoveStringLiteralDfa1_0(0x1100L);
- case 71:
- return jjMoveStringLiteralDfa1_0(0x4000000L);
- case 74:
- return jjMoveStringLiteralDfa1_0(0x30800L);
- case 77:
- return jjMoveStringLiteralDfa1_0(0x18000a010L);
- case 78:
- return jjMoveStringLiteralDfa1_0(0x200000L);
- case 79:
- return jjMoveStringLiteralDfa1_0(0x100000L);
- case 80:
- return jjMoveStringLiteralDfa1_0(0x600000000L);
- case 83:
- return jjMoveStringLiteralDfa1_0(0x80600L);
- case 84:
- return jjMoveStringLiteralDfa1_0(0xa0L);
- case 85:
- return jjMoveStringLiteralDfa1_0(0x2000000L);
- case 87:
- return jjMoveStringLiteralDfa1_0(0x40L);
- default :
- return jjMoveNfa_0(0, 0);
- }
-}
-private final int jjMoveStringLiteralDfa1_0(long active0)
-{
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) {
- jjStopStringLiteralDfa_0(0, active0);
- return 1;
- }
- switch(curChar)
- {
- case 68:
- return jjMoveStringLiteralDfa2_0(active0, 0x550000000L);
- case 77:
- return jjMoveStringLiteralDfa2_0(active0, 0x4000000L);
- case 83:
- return jjMoveStringLiteralDfa2_0(active0, 0x2a8000000L);
- case 84:
- if ((active0 & 0x2000000L) != 0L)
- return jjStopAtPos(1, 25);
- break;
- case 97:
- return jjMoveStringLiteralDfa2_0(active0, 0xaa00L);
- case 99:
- return jjMoveStringLiteralDfa2_0(active0, 0x100000L);
- case 101:
- return jjMoveStringLiteralDfa2_0(active0, 0x481040L);
- case 104:
- return jjMoveStringLiteralDfa2_0(active0, 0x80L);
- case 111:
- return jjMoveStringLiteralDfa2_0(active0, 0x200010L);
- case 112:
- return jjMoveStringLiteralDfa2_0(active0, 0x4000L);
- case 114:
- return jjMoveStringLiteralDfa2_0(active0, 0x100L);
- case 117:
- return jjMoveStringLiteralDfa2_0(active0, 0x70420L);
- default :
- break;
- }
- return jjStartNfa_0(0, active0);
-}
-private final int jjMoveStringLiteralDfa2_0(long old0, long active0)
-{
- if (((active0 &= old0)) == 0L)
- return jjStartNfa_0(0, old0);
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) {
- jjStopStringLiteralDfa_0(1, active0);
- return 2;
- }
- switch(curChar)
- {
- case 84:
- if ((active0 & 0x4000000L) != 0L)
- return jjStopAtPos(2, 26);
- else if ((active0 & 0x8000000L) != 0L)
- return jjStopAtPos(2, 27);
- else if ((active0 & 0x10000000L) != 0L)
- return jjStopAtPos(2, 28);
- else if ((active0 & 0x20000000L) != 0L)
- return jjStopAtPos(2, 29);
- else if ((active0 & 0x40000000L) != 0L)
- return jjStopAtPos(2, 30);
- else if ((active0 & 0x80000000L) != 0L)
- return jjStopAtPos(2, 31);
- else if ((active0 & 0x100000000L) != 0L)
- return jjStopAtPos(2, 32);
- else if ((active0 & 0x200000000L) != 0L)
- return jjStopAtPos(2, 33);
- else if ((active0 & 0x400000000L) != 0L)
- return jjStopAtPos(2, 34);
- break;
- case 98:
- if ((active0 & 0x1000L) != 0L)
- return jjStopAtPos(2, 12);
- break;
- case 99:
- if ((active0 & 0x400000L) != 0L)
- return jjStopAtPos(2, 22);
- break;
- case 100:
- if ((active0 & 0x40L) != 0L)
- return jjStopAtPos(2, 6);
- break;
- case 101:
- if ((active0 & 0x20L) != 0L)
- return jjStopAtPos(2, 5);
- break;
- case 103:
- if ((active0 & 0x40000L) != 0L)
- return jjStopAtPos(2, 18);
- break;
- case 105:
- if ((active0 & 0x100L) != 0L)
- return jjStopAtPos(2, 8);
- break;
- case 108:
- if ((active0 & 0x20000L) != 0L)
- return jjStopAtPos(2, 17);
- break;
- case 110:
- if ((active0 & 0x10L) != 0L)
- return jjStopAtPos(2, 4);
- else if ((active0 & 0x400L) != 0L)
- return jjStopAtPos(2, 10);
- else if ((active0 & 0x800L) != 0L)
- return jjStopAtPos(2, 11);
- else if ((active0 & 0x10000L) != 0L)
- return jjStopAtPos(2, 16);
- break;
- case 112:
- if ((active0 & 0x80000L) != 0L)
- return jjStopAtPos(2, 19);
- break;
- case 114:
- if ((active0 & 0x2000L) != 0L)
- return jjStopAtPos(2, 13);
- else if ((active0 & 0x4000L) != 0L)
- return jjStopAtPos(2, 14);
- break;
- case 116:
- if ((active0 & 0x200L) != 0L)
- return jjStopAtPos(2, 9);
- else if ((active0 & 0x100000L) != 0L)
- return jjStopAtPos(2, 20);
- break;
- case 117:
- if ((active0 & 0x80L) != 0L)
- return jjStopAtPos(2, 7);
- break;
- case 118:
- if ((active0 & 0x200000L) != 0L)
- return jjStopAtPos(2, 21);
- break;
- case 121:
- if ((active0 & 0x8000L) != 0L)
- return jjStopAtPos(2, 15);
- break;
- default :
- break;
- }
- return jjStartNfa_0(1, active0);
-}
-private final void jjCheckNAdd(int state)
-{
- if (jjrounds[state] != jjround)
- {
- jjstateSet[jjnewStateCnt++] = state;
- jjrounds[state] = jjround;
- }
-}
-private final void jjAddStates(int start, int end)
-{
- do {
- jjstateSet[jjnewStateCnt++] = jjnextStates[start];
- } while (start++ != end);
-}
-private final void jjCheckNAddTwoStates(int state1, int state2)
-{
- jjCheckNAdd(state1);
- jjCheckNAdd(state2);
-}
-private final void jjCheckNAddStates(int start, int end)
-{
- do {
- jjCheckNAdd(jjnextStates[start]);
- } while (start++ != end);
-}
-private final void jjCheckNAddStates(int start)
-{
- jjCheckNAdd(jjnextStates[start]);
- jjCheckNAdd(jjnextStates[start + 1]);
-}
-private final int jjMoveNfa_0(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 4;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((0x3ff000000000000L & l) != 0L)
- {
- if (kind > 46)
- kind = 46;
- jjCheckNAdd(3);
- }
- else if ((0x100000200L & l) != 0L)
- {
- if (kind > 36)
- kind = 36;
- jjCheckNAdd(2);
- }
- else if ((0x280000000000L & l) != 0L)
- {
- if (kind > 24)
- kind = 24;
- }
- break;
- case 2:
- if ((0x100000200L & l) == 0L)
- break;
- kind = 36;
- jjCheckNAdd(2);
- break;
- case 3:
- if ((0x3ff000000000000L & l) == 0L)
- break;
- kind = 46;
- jjCheckNAdd(3);
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((0x7fffbfe07fffbfeL & l) != 0L)
- kind = 35;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 4 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-private final int jjStopStringLiteralDfa_1(int pos, long active0)
-{
- switch (pos)
- {
- default :
- return -1;
- }
-}
-private final int jjStartNfa_1(int pos, long active0)
-{
- return jjMoveNfa_1(jjStopStringLiteralDfa_1(pos, active0), pos + 1);
-}
-private final int jjStartNfaWithStates_1(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_1(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_1()
-{
- switch(curChar)
- {
- case 40:
- return jjStopAtPos(0, 40);
- case 41:
- return jjStopAtPos(0, 38);
- default :
- return jjMoveNfa_1(0, 0);
- }
-}
-static final long[] jjbitVec0 = {
- 0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
-private final int jjMoveNfa_1(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 3;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 41)
- kind = 41;
- break;
- case 1:
- if (kind > 39)
- kind = 39;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 41)
- kind = 41;
- if (curChar == 92)
- jjstateSet[jjnewStateCnt++] = 1;
- break;
- case 1:
- if (kind > 39)
- kind = 39;
- break;
- case 2:
- if (kind > 41)
- kind = 41;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 41)
- kind = 41;
- break;
- case 1:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 39)
- kind = 39;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-private final int jjStopStringLiteralDfa_2(int pos, long active0)
-{
- switch (pos)
- {
- default :
- return -1;
- }
-}
-private final int jjStartNfa_2(int pos, long active0)
-{
- return jjMoveNfa_2(jjStopStringLiteralDfa_2(pos, active0), pos + 1);
-}
-private final int jjStartNfaWithStates_2(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_2(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_2()
-{
- switch(curChar)
- {
- case 40:
- return jjStopAtPos(0, 43);
- case 41:
- return jjStopAtPos(0, 44);
- default :
- return jjMoveNfa_2(0, 0);
- }
-}
-private final int jjMoveNfa_2(int startState, int curPos)
-{
- int[] nextStates;
- int startsAt = 0;
- jjnewStateCnt = 3;
- int i = 1;
- jjstateSet[0] = startState;
- int j, kind = 0x7fffffff;
- for (;;)
- {
- if (++jjround == 0x7fffffff)
- ReInitRounds();
- if (curChar < 64)
- {
- long l = 1L << curChar;
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 45)
- kind = 45;
- break;
- case 1:
- if (kind > 42)
- kind = 42;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else if (curChar < 128)
- {
- long l = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if (kind > 45)
- kind = 45;
- if (curChar == 92)
- jjstateSet[jjnewStateCnt++] = 1;
- break;
- case 1:
- if (kind > 42)
- kind = 42;
- break;
- case 2:
- if (kind > 45)
- kind = 45;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- else
- {
- int i2 = (curChar & 0xff) >> 6;
- long l2 = 1L << (curChar & 077);
- MatchLoop: do
- {
- switch(jjstateSet[--i])
- {
- case 0:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 45)
- kind = 45;
- break;
- case 1:
- if ((jjbitVec0[i2] & l2) != 0L && kind > 42)
- kind = 42;
- break;
- default : break;
- }
- } while(i != startsAt);
- }
- if (kind != 0x7fffffff)
- {
- jjmatchedKind = kind;
- jjmatchedPos = curPos;
- kind = 0x7fffffff;
- }
- ++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
- return curPos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return curPos; }
- }
-}
-static final int[] jjnextStates = {
-};
-public static final String[] jjstrLiteralImages = {
-"", "\15", "\12", "\54", "\115\157\156", "\124\165\145", "\127\145\144",
-"\124\150\165", "\106\162\151", "\123\141\164", "\123\165\156", "\112\141\156",
-"\106\145\142", "\115\141\162", "\101\160\162", "\115\141\171", "\112\165\156",
-"\112\165\154", "\101\165\147", "\123\145\160", "\117\143\164", "\116\157\166",
-"\104\145\143", "\72", null, "\125\124", "\107\115\124", "\105\123\124", "\105\104\124",
-"\103\123\124", "\103\104\124", "\115\123\124", "\115\104\124", "\120\123\124",
-"\120\104\124", null, null, null, null, null, null, null, null, null, null, null, null, null,
-null, };
-public static final String[] lexStateNames = {
- "DEFAULT",
- "INCOMMENT",
- "NESTED_COMMENT",
-};
-public static final int[] jjnewLexState = {
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 0, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1,
-};
-static final long[] jjtoToken = {
- 0x400fffffffffL,
-};
-static final long[] jjtoSkip = {
- 0x5000000000L,
-};
-static final long[] jjtoSpecial = {
- 0x1000000000L,
-};
-static final long[] jjtoMore = {
- 0x3fa000000000L,
-};
-protected SimpleCharStream input_stream;
-private final int[] jjrounds = new int[4];
-private final int[] jjstateSet = new int[8];
-StringBuffer image;
-int jjimageLen;
-int lengthOfMatch;
-protected char curChar;
-public DateTimeParserTokenManager(SimpleCharStream stream){
- if (SimpleCharStream.staticFlag)
- throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
- input_stream = stream;
-}
-public DateTimeParserTokenManager(SimpleCharStream stream, int lexState){
- this(stream);
- SwitchTo(lexState);
-}
-public void ReInit(SimpleCharStream stream)
-{
- jjmatchedPos = jjnewStateCnt = 0;
- curLexState = defaultLexState;
- input_stream = stream;
- ReInitRounds();
-}
-private final void ReInitRounds()
-{
- int i;
- jjround = 0x80000001;
- for (i = 4; i-- > 0;)
- jjrounds[i] = 0x80000000;
-}
-public void ReInit(SimpleCharStream stream, int lexState)
-{
- ReInit(stream);
- SwitchTo(lexState);
-}
-public void SwitchTo(int lexState)
-{
- if (lexState >= 3 || lexState < 0)
- throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
- else
- curLexState = lexState;
-}
-
-protected Token jjFillToken()
-{
- Token t = Token.newToken(jjmatchedKind);
- t.kind = jjmatchedKind;
- String im = jjstrLiteralImages[jjmatchedKind];
- t.image = (im == null) ? input_stream.GetImage() : im;
- t.beginLine = input_stream.getBeginLine();
- t.beginColumn = input_stream.getBeginColumn();
- t.endLine = input_stream.getEndLine();
- t.endColumn = input_stream.getEndColumn();
- return t;
-}
-
-int curLexState = 0;
-int defaultLexState = 0;
-int jjnewStateCnt;
-int jjround;
-int jjmatchedPos;
-int jjmatchedKind;
-
-public Token getNextToken()
-{
- int kind;
- Token specialToken = null;
- Token matchedToken;
- int curPos = 0;
-
- EOFLoop :
- for (;;)
- {
- try
- {
- curChar = input_stream.BeginToken();
- }
- catch(java.io.IOException e)
- {
- jjmatchedKind = 0;
- matchedToken = jjFillToken();
- matchedToken.specialToken = specialToken;
- return matchedToken;
- }
- image = null;
- jjimageLen = 0;
-
- for (;;)
- {
- switch(curLexState)
- {
- case 0:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_0();
- break;
- case 1:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_1();
- break;
- case 2:
- jjmatchedKind = 0x7fffffff;
- jjmatchedPos = 0;
- curPos = jjMoveStringLiteralDfa0_2();
- break;
- }
- if (jjmatchedKind != 0x7fffffff)
- {
- if (jjmatchedPos + 1 < curPos)
- input_stream.backup(curPos - jjmatchedPos - 1);
- if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
- {
- matchedToken = jjFillToken();
- matchedToken.specialToken = specialToken;
- if (jjnewLexState[jjmatchedKind] != -1)
- curLexState = jjnewLexState[jjmatchedKind];
- return matchedToken;
- }
- else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
- {
- if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
- {
- matchedToken = jjFillToken();
- if (specialToken == null)
- specialToken = matchedToken;
- else
- {
- matchedToken.specialToken = specialToken;
- specialToken = (specialToken.next = matchedToken);
- }
- }
- if (jjnewLexState[jjmatchedKind] != -1)
- curLexState = jjnewLexState[jjmatchedKind];
- continue EOFLoop;
- }
- MoreLexicalActions();
- if (jjnewLexState[jjmatchedKind] != -1)
- curLexState = jjnewLexState[jjmatchedKind];
- curPos = 0;
- jjmatchedKind = 0x7fffffff;
- try {
- curChar = input_stream.readChar();
- continue;
- }
- catch (java.io.IOException e1) { }
- }
- int error_line = input_stream.getEndLine();
- int error_column = input_stream.getEndColumn();
- String error_after = null;
- boolean EOFSeen = false;
- try { input_stream.readChar(); input_stream.backup(1); }
- catch (java.io.IOException e1) {
- EOFSeen = true;
- error_after = curPos <= 1 ? "" : input_stream.GetImage();
- if (curChar == '\n' || curChar == '\r') {
- error_line++;
- error_column = 0;
- }
- else
- error_column++;
- }
- if (!EOFSeen) {
- input_stream.backup(1);
- error_after = curPos <= 1 ? "" : input_stream.GetImage();
- }
- throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
- }
- }
-}
-
-void MoreLexicalActions()
-{
- jjimageLen += (lengthOfMatch = jjmatchedPos + 1);
- switch(jjmatchedKind)
- {
- case 39 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- image.deleteCharAt(image.length() - 2);
- break;
- case 40 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- commentNest = 1;
- break;
- case 42 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- image.deleteCharAt(image.length() - 2);
- break;
- case 43 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- ++commentNest;
- break;
- case 44 :
- if (image == null)
- image = new StringBuffer();
- image.append(input_stream.GetSuffix(jjimageLen));
- jjimageLen = 0;
- --commentNest; if (commentNest == 0) SwitchTo(INCOMMENT);
- break;
- default :
- break;
- }
-}
-}
diff --git a/apache/org/apache/james/mime4j/field/datetime/parser/ParseException.java b/apache/org/apache/james/mime4j/field/datetime/parser/ParseException.java
deleted file mode 100644
index 13b3ff097..000000000
--- a/apache/org/apache/james/mime4j/field/datetime/parser/ParseException.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */
-/*
- * Copyright 2004 the mime4j 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 org.apache.james.mime4j.field.datetime.parser;
-
-/**
- * This exception is thrown when parse errors are encountered.
- * You can explicitly create objects of this exception type by
- * calling the method generateParseException in the generated
- * parser.
- *
- * You can modify this class to customize your error reporting
- * mechanisms so long as you retain the public fields.
- */
-public class ParseException extends Exception {
-
- /**
- * This constructor is used by the method "generateParseException"
- * in the generated parser. Calling this constructor generates
- * a new object of this type with the fields "currentToken",
- * "expectedTokenSequences", and "tokenImage" set. The boolean
- * flag "specialConstructor" is also set to true to indicate that
- * this constructor was used to create this object.
- * This constructor calls its super class with the empty string
- * to force the "toString" method of parent class "Throwable" to
- * print the error message in the form:
- * ParseException:
- */
- public ParseException(Token currentTokenVal,
- int[][] expectedTokenSequencesVal,
- String[] tokenImageVal
- )
- {
- super("");
- specialConstructor = true;
- currentToken = currentTokenVal;
- expectedTokenSequences = expectedTokenSequencesVal;
- tokenImage = tokenImageVal;
- }
-
- /**
- * The following constructors are for use by you for whatever
- * purpose you can think of. Constructing the exception in this
- * manner makes the exception behave in the normal way - i.e., as
- * documented in the class "Throwable". The fields "errorToken",
- * "expectedTokenSequences", and "tokenImage" do not contain
- * relevant information. The JavaCC generated code does not use
- * these constructors.
- */
-
- public ParseException() {
- super();
- specialConstructor = false;
- }
-
- public ParseException(String message) {
- super(message);
- specialConstructor = false;
- }
-
- /**
- * This variable determines which constructor was used to create
- * this object and thereby affects the semantics of the
- * "getMessage" method (see below).
- */
- protected boolean specialConstructor;
-
- /**
- * This is the last token that has been consumed successfully. If
- * this object has been created due to a parse error, the token
- * followng this token will (therefore) be the first error token.
- */
- public Token currentToken;
-
- /**
- * Each entry in this array is an array of integers. Each array
- * of integers represents a sequence of tokens (by their ordinal
- * values) that is expected at this point of the parse.
- */
- public int[][] expectedTokenSequences;
-
- /**
- * This is a reference to the "tokenImage" array of the generated
- * parser within which the parse error occurred. This array is
- * defined in the generated ...Constants interface.
- */
- public String[] tokenImage;
-
- /**
- * This method has the standard behavior when this object has been
- * created using the standard constructors. Otherwise, it uses
- * "currentToken" and "expectedTokenSequences" to generate a parse
- * error message and returns it. If this object has been created
- * due to a parse error, and you do not catch it (it gets thrown
- * from the parser), then this method is called during the printing
- * of the final stack trace, and hence the correct error message
- * gets displayed.
- */
- public String getMessage() {
- if (!specialConstructor) {
- return super.getMessage();
- }
- StringBuffer expected = new StringBuffer();
- int maxSize = 0;
- for (int i = 0; i < expectedTokenSequences.length; i++) {
- if (maxSize < expectedTokenSequences[i].length) {
- maxSize = expectedTokenSequences[i].length;
- }
- for (int j = 0; j < expectedTokenSequences[i].length; j++) {
- expected.append(tokenImage[expectedTokenSequences[i][j]]).append(" ");
- }
- if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
- expected.append("...");
- }
- expected.append(eol).append(" ");
- }
- String retval = "Encountered \"";
- Token tok = currentToken.next;
- for (int i = 0; i < maxSize; i++) {
- if (i != 0) retval += " ";
- if (tok.kind == 0) {
- retval += tokenImage[0];
- break;
- }
- retval += add_escapes(tok.image);
- tok = tok.next;
- }
- retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
- retval += "." + eol;
- if (expectedTokenSequences.length == 1) {
- retval += "Was expecting:" + eol + " ";
- } else {
- retval += "Was expecting one of:" + eol + " ";
- }
- retval += expected.toString();
- return retval;
- }
-
- /**
- * The end of line string for this machine.
- */
- protected String eol = System.getProperty("line.separator", "\n");
-
- /**
- * Used to convert raw characters to their escaped version
- * when these raw version cannot be used as part of an ASCII
- * string literal.
- */
- protected String add_escapes(String str) {
- StringBuffer retval = new StringBuffer();
- char ch;
- for (int i = 0; i < str.length(); i++) {
- switch (str.charAt(i))
- {
- case 0 :
- continue;
- case '\b':
- retval.append("\\b");
- continue;
- case '\t':
- retval.append("\\t");
- continue;
- case '\n':
- retval.append("\\n");
- continue;
- case '\f':
- retval.append("\\f");
- continue;
- case '\r':
- retval.append("\\r");
- continue;
- case '\"':
- retval.append("\\\"");
- continue;
- case '\'':
- retval.append("\\\'");
- continue;
- case '\\':
- retval.append("\\\\");
- continue;
- default:
- if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
- String s = "0000" + Integer.toString(ch, 16);
- retval.append("\\u" + s.substring(s.length() - 4, s.length()));
- } else {
- retval.append(ch);
- }
- continue;
- }
- }
- return retval.toString();
- }
-
-}
diff --git a/apache/org/apache/james/mime4j/field/datetime/parser/SimpleCharStream.java b/apache/org/apache/james/mime4j/field/datetime/parser/SimpleCharStream.java
deleted file mode 100644
index 2724529f7..000000000
--- a/apache/org/apache/james/mime4j/field/datetime/parser/SimpleCharStream.java
+++ /dev/null
@@ -1,454 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 4.0 */
-/*
- * Copyright 2004 the mime4j 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 org.apache.james.mime4j.field.datetime.parser;
-
-/**
- * An implementation of interface CharStream, where the stream is assumed to
- * contain only ASCII characters (without unicode processing).
- */
-
-public class SimpleCharStream
-{
- public static final boolean staticFlag = false;
- int bufsize;
- int available;
- int tokenBegin;
- public int bufpos = -1;
- protected int bufline[];
- protected int bufcolumn[];
-
- protected int column = 0;
- protected int line = 1;
-
- protected boolean prevCharIsCR = false;
- protected boolean prevCharIsLF = false;
-
- protected java.io.Reader inputStream;
-
- protected char[] buffer;
- protected int maxNextCharInd = 0;
- protected int inBuf = 0;
- protected int tabSize = 8;
-
- protected void setTabSize(int i) { tabSize = i; }
- protected int getTabSize(int i) { return tabSize; }
-
-
- protected void ExpandBuff(boolean wrapAround)
- {
- char[] newbuffer = new char[bufsize + 2048];
- int newbufline[] = new int[bufsize + 2048];
- int newbufcolumn[] = new int[bufsize + 2048];
-
- try
- {
- if (wrapAround)
- {
- System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
- System.arraycopy(buffer, 0, newbuffer,
- bufsize - tokenBegin, bufpos);
- buffer = newbuffer;
-
- System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
- System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
- bufline = newbufline;
-
- System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
- System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
- bufcolumn = newbufcolumn;
-
- maxNextCharInd = (bufpos += (bufsize - tokenBegin));
- }
- else
- {
- System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
- buffer = newbuffer;
-
- System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
- bufline = newbufline;
-
- System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
- bufcolumn = newbufcolumn;
-
- maxNextCharInd = (bufpos -= tokenBegin);
- }
- }
- catch (Throwable t)
- {
- throw new Error(t.getMessage());
- }
-
-
- bufsize += 2048;
- available = bufsize;
- tokenBegin = 0;
- }
-
- protected void FillBuff() throws java.io.IOException
- {
- if (maxNextCharInd == available)
- {
- if (available == bufsize)
- {
- if (tokenBegin > 2048)
- {
- bufpos = maxNextCharInd = 0;
- available = tokenBegin;
- }
- else if (tokenBegin < 0)
- bufpos = maxNextCharInd = 0;
- else
- ExpandBuff(false);
- }
- else if (available > tokenBegin)
- available = bufsize;
- else if ((tokenBegin - available) < 2048)
- ExpandBuff(true);
- else
- available = tokenBegin;
- }
-
- int i;
- try {
- if ((i = inputStream.read(buffer, maxNextCharInd,
- available - maxNextCharInd)) == -1)
- {
- inputStream.close();
- throw new java.io.IOException();
- }
- else
- maxNextCharInd += i;
- return;
- }
- catch(java.io.IOException e) {
- --bufpos;
- backup(0);
- if (tokenBegin == -1)
- tokenBegin = bufpos;
- throw e;
- }
- }
-
- public char BeginToken() throws java.io.IOException
- {
- tokenBegin = -1;
- char c = readChar();
- tokenBegin = bufpos;
-
- return c;
- }
-
- protected void UpdateLineColumn(char c)
- {
- column++;
-
- if (prevCharIsLF)
- {
- prevCharIsLF = false;
- line += (column = 1);
- }
- else if (prevCharIsCR)
- {
- prevCharIsCR = false;
- if (c == '\n')
- {
- prevCharIsLF = true;
- }
- else
- line += (column = 1);
- }
-
- switch (c)
- {
- case '\r' :
- prevCharIsCR = true;
- break;
- case '\n' :
- prevCharIsLF = true;
- break;
- case '\t' :
- column--;
- column += (tabSize - (column % tabSize));
- break;
- default :
- break;
- }
-
- bufline[bufpos] = line;
- bufcolumn[bufpos] = column;
- }
-
- public char readChar() throws java.io.IOException
- {
- if (inBuf > 0)
- {
- --inBuf;
-
- if (++bufpos == bufsize)
- bufpos = 0;
-
- return buffer[bufpos];
- }
-
- if (++bufpos >= maxNextCharInd)
- FillBuff();
-
- char c = buffer[bufpos];
-
- UpdateLineColumn(c);
- return (c);
- }
-
- /**
- * @deprecated
- * @see #getEndColumn
- */
- @Deprecated
- public int getColumn() {
- return bufcolumn[bufpos];
- }
-
- /**
- * @deprecated
- * @see #getEndLine
- */
- @Deprecated
- public int getLine() {
- return bufline[bufpos];
- }
-
- public int getEndColumn() {
- return bufcolumn[bufpos];
- }
-
- public int getEndLine() {
- return bufline[bufpos];
- }
-
- public int getBeginColumn() {
- return bufcolumn[tokenBegin];
- }
-
- public int getBeginLine() {
- return bufline[tokenBegin];
- }
-
- public void backup(int amount) {
-
- inBuf += amount;
- if ((bufpos -= amount) < 0)
- bufpos += bufsize;
- }
-
- public SimpleCharStream(java.io.Reader dstream, int startline,
- int startcolumn, int buffersize)
- {
- inputStream = dstream;
- line = startline;
- column = startcolumn - 1;
-
- available = bufsize = buffersize;
- buffer = new char[buffersize];
- bufline = new int[buffersize];
- bufcolumn = new int[buffersize];
- }
-
- public SimpleCharStream(java.io.Reader dstream, int startline,
- int startcolumn)
- {
- this(dstream, startline, startcolumn, 4096);
- }
-
- public SimpleCharStream(java.io.Reader dstream)
- {
- this(dstream, 1, 1, 4096);
- }
- public void ReInit(java.io.Reader dstream, int startline,
- int startcolumn, int buffersize)
- {
- inputStream = dstream;
- line = startline;
- column = startcolumn - 1;
-
- if (buffer == null || buffersize != buffer.length)
- {
- available = bufsize = buffersize;
- buffer = new char[buffersize];
- bufline = new int[buffersize];
- bufcolumn = new int[buffersize];
- }
- prevCharIsLF = prevCharIsCR = false;
- tokenBegin = inBuf = maxNextCharInd = 0;
- bufpos = -1;
- }
-
- public void ReInit(java.io.Reader dstream, int startline,
- int startcolumn)
- {
- ReInit(dstream, startline, startcolumn, 4096);
- }
-
- public void ReInit(java.io.Reader dstream)
- {
- ReInit(dstream, 1, 1, 4096);
- }
- public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
- {
- this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, int startline,
- int startcolumn, int buffersize)
- {
- this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn) throws java.io.UnsupportedEncodingException
- {
- this(dstream, encoding, startline, startcolumn, 4096);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, int startline,
- int startcolumn)
- {
- this(dstream, startline, startcolumn, 4096);
- }
-
- public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
- {
- this(dstream, encoding, 1, 1, 4096);
- }
-
- public SimpleCharStream(java.io.InputStream dstream)
- {
- this(dstream, 1, 1, 4096);
- }
-
- public void ReInit(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
- {
- ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
- }
-
- public void ReInit(java.io.InputStream dstream, int startline,
- int startcolumn, int buffersize)
- {
- ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
- }
-
- public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
- {
- ReInit(dstream, encoding, 1, 1, 4096);
- }
-
- public void ReInit(java.io.InputStream dstream)
- {
- ReInit(dstream, 1, 1, 4096);
- }
- public void ReInit(java.io.InputStream dstream, String encoding, int startline,
- int startcolumn) throws java.io.UnsupportedEncodingException
- {
- ReInit(dstream, encoding, startline, startcolumn, 4096);
- }
- public void ReInit(java.io.InputStream dstream, int startline,
- int startcolumn)
- {
- ReInit(dstream, startline, startcolumn, 4096);
- }
- public String GetImage()
- {
- if (bufpos >= tokenBegin)
- return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
- else
- return new String(buffer, tokenBegin, bufsize - tokenBegin) +
- new String(buffer, 0, bufpos + 1);
- }
-
- public char[] GetSuffix(int len)
- {
- char[] ret = new char[len];
-
- if ((bufpos + 1) >= len)
- System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
- else
- {
- System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
- len - bufpos - 1);
- System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
- }
-
- return ret;
- }
-
- public void Done()
- {
- buffer = null;
- bufline = null;
- bufcolumn = null;
- }
-
- /**
- * Method to adjust line and column numbers for the start of a token.
- */
- public void adjustBeginLineColumn(int newLine, int newCol)
- {
- int start = tokenBegin;
- int len;
-
- if (bufpos >= tokenBegin)
- {
- len = bufpos - tokenBegin + inBuf + 1;
- }
- else
- {
- len = bufsize - tokenBegin + bufpos + 1 + inBuf;
- }
-
- int i = 0, j = 0, k = 0;
- int nextColDiff = 0, columnDiff = 0;
-
- while (i < len &&
- bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
- {
- bufline[j] = newLine;
- nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
- bufcolumn[j] = newCol + columnDiff;
- columnDiff = nextColDiff;
- i++;
- }
-
- if (i < len)
- {
- bufline[j] = newLine++;
- bufcolumn[j] = newCol + columnDiff;
-
- while (i++ < len)
- {
- if (bufline[j = start % bufsize] != bufline[++start % bufsize])
- bufline[j] = newLine++;
- else
- bufline[j] = newLine;
- }
- }
-
- line = bufline[j];
- column = bufcolumn[j];
- }
-
-}
diff --git a/apache/org/apache/james/mime4j/field/datetime/parser/Token.java b/apache/org/apache/james/mime4j/field/datetime/parser/Token.java
deleted file mode 100644
index 0927a0921..000000000
--- a/apache/org/apache/james/mime4j/field/datetime/parser/Token.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. Token.java Version 3.0 */
-/*
- * Copyright 2004 the mime4j 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 org.apache.james.mime4j.field.datetime.parser;
-
-/**
- * Describes the input token stream.
- */
-
-public class Token {
-
- /**
- * An integer that describes the kind of this token. This numbering
- * system is determined by JavaCCParser, and a table of these numbers is
- * stored in the file ...Constants.java.
- */
- public int kind;
-
- /**
- * beginLine and beginColumn describe the position of the first character
- * of this token; endLine and endColumn describe the position of the
- * last character of this token.
- */
- public int beginLine, beginColumn, endLine, endColumn;
-
- /**
- * The string image of the token.
- */
- public String image;
-
- /**
- * A reference to the next regular (non-special) token from the input
- * stream. If this is the last token from the input stream, or if the
- * token manager has not read tokens beyond this one, this field is
- * set to null. This is true only if this token is also a regular
- * token. Otherwise, see below for a description of the contents of
- * this field.
- */
- public Token next;
-
- /**
- * This field is used to access special tokens that occur prior to this
- * token, but after the immediately preceding regular (non-special) token.
- * If there are no such special tokens, this field is set to null.
- * When there are more than one such special token, this field refers
- * to the last of these special tokens, which in turn refers to the next
- * previous special token through its specialToken field, and so on
- * until the first special token (whose specialToken field is null).
- * The next fields of special tokens refer to other special tokens that
- * immediately follow it (without an intervening regular token). If there
- * is no such token, this field is null.
- */
- public Token specialToken;
-
- /**
- * Returns the image.
- */
- public String toString()
- {
- return image;
- }
-
- /**
- * Returns a new Token object, by default. However, if you want, you
- * can create and return subclass objects based on the value of ofKind.
- * Simply add the cases to the switch for all those special cases.
- * For example, if you have a subclass of Token called IDToken that
- * you want to create if ofKind is ID, simlpy add something like :
- *
- * case MyParserConstants.ID : return new IDToken();
- *
- * to the following switch statement. Then you can cast matchedToken
- * variable to the appropriate type and use it in your lexical actions.
- */
- public static final Token newToken(int ofKind)
- {
- switch(ofKind)
- {
- default : return new Token();
- }
- }
-
-}
diff --git a/apache/org/apache/james/mime4j/field/datetime/parser/TokenMgrError.java b/apache/org/apache/james/mime4j/field/datetime/parser/TokenMgrError.java
deleted file mode 100644
index e7043c1b7..000000000
--- a/apache/org/apache/james/mime4j/field/datetime/parser/TokenMgrError.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 3.0 */
-/*
- * Copyright 2004 the mime4j 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 org.apache.james.mime4j.field.datetime.parser;
-
-public class TokenMgrError extends Error
-{
- /*
- * Ordinals for various reasons why an Error of this type can be thrown.
- */
-
- /**
- * Lexical error occured.
- */
- static final int LEXICAL_ERROR = 0;
-
- /**
- * An attempt wass made to create a second instance of a static token manager.
- */
- static final int STATIC_LEXER_ERROR = 1;
-
- /**
- * Tried to change to an invalid lexical state.
- */
- static final int INVALID_LEXICAL_STATE = 2;
-
- /**
- * Detected (and bailed out of) an infinite loop in the token manager.
- */
- static final int LOOP_DETECTED = 3;
-
- /**
- * Indicates the reason why the exception is thrown. It will have
- * one of the above 4 values.
- */
- int errorCode;
-
- /**
- * Replaces unprintable characters by their espaced (or unicode escaped)
- * equivalents in the given string
- */
- protected static final String addEscapes(String str) {
- StringBuffer retval = new StringBuffer();
- char ch;
- for (int i = 0; i < str.length(); i++) {
- switch (str.charAt(i))
- {
- case 0 :
- continue;
- case '\b':
- retval.append("\\b");
- continue;
- case '\t':
- retval.append("\\t");
- continue;
- case '\n':
- retval.append("\\n");
- continue;
- case '\f':
- retval.append("\\f");
- continue;
- case '\r':
- retval.append("\\r");
- continue;
- case '\"':
- retval.append("\\\"");
- continue;
- case '\'':
- retval.append("\\\'");
- continue;
- case '\\':
- retval.append("\\\\");
- continue;
- default:
- if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
- String s = "0000" + Integer.toString(ch, 16);
- retval.append("\\u" + s.substring(s.length() - 4, s.length()));
- } else {
- retval.append(ch);
- }
- continue;
- }
- }
- return retval.toString();
- }
-
- /**
- * Returns a detailed message for the Error when it is thrown by the
- * token manager to indicate a lexical error.
- * Parameters :
- * EOFSeen : indicates if EOF caused the lexicl error
- * curLexState : lexical state in which this error occured
- * errorLine : line number when the error occured
- * errorColumn : column number when the error occured
- * errorAfter : prefix that was seen before this error occured
- * curchar : the offending character
- * Note: You can customize the lexical error message by modifying this method.
- */
- protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
- return("Lexical error at line " +
- errorLine + ", column " +
- errorColumn + ". Encountered: " +
- (EOFSeen ? " " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
- "after : \"" + addEscapes(errorAfter) + "\"");
- }
-
- /**
- * You can also modify the body of this method to customize your error messages.
- * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
- * of end-users concern, so you can return something like :
- *
- * "Internal Error : Please file a bug report .... "
- *
- * from this method for such cases in the release version of your parser.
- */
- public String getMessage() {
- return super.getMessage();
- }
-
- /*
- * Constructors of various flavors follow.
- */
-
- public TokenMgrError() {
- }
-
- public TokenMgrError(String message, int reason) {
- super(message);
- errorCode = reason;
- }
-
- public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
- this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
- }
-}
diff --git a/apache/org/apache/james/mime4j/util/CharsetUtil.java b/apache/org/apache/james/mime4j/util/CharsetUtil.java
deleted file mode 100644
index 4e712fcdd..000000000
--- a/apache/org/apache/james/mime4j/util/CharsetUtil.java
+++ /dev/null
@@ -1,1249 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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 org.apache.james.mime4j.util;
-
-import java.io.UnsupportedEncodingException;
-import java.nio.charset.IllegalCharsetNameException;
-import java.nio.charset.UnsupportedCharsetException;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.TreeSet;
-
-//BEGIN android-changed: Stubbing out logging
-import org.apache.james.mime4j.Log;
-import org.apache.james.mime4j.LogFactory;
-//END android-changed
-
-/**
- * Utility class for working with character sets. It is somewhat similar to
- * the Java 1.4 java.nio.charset.Charset
class but knows many
- * more aliases and is compatible with Java 1.3. It will use a simple detection
- * mechanism to detect what character sets the current VM supports. This will
- * be a sub-set of the character sets listed in the
- *
- * Java 1.5 (J2SE5.0) Supported Encodings document.
- *
- * The
- * IANA Character Sets document has been used to determine the preferred
- * MIME character set names and to get a list of known aliases.
- *
- * This is a complete list of the character sets known to this class:
- *
- *
- * Canonical (Java) name |
- * MIME preferred |
- * Aliases |
- *
- *
- * ASCII |
- * US-ASCII |
- * ANSI_X3.4-1968 iso-ir-6 ANSI_X3.4-1986 ISO_646.irv:1991 ISO646-US us IBM367 cp367 csASCII ascii7 646 iso_646.irv:1983 |
- *
- *
- * Big5 |
- * Big5 |
- * csBig5 CN-Big5 BIG-FIVE BIGFIVE |
- *
- *
- * Big5_HKSCS |
- * Big5-HKSCS |
- * big5hkscs |
- *
- *
- * Big5_Solaris |
- * ? |
- * |
- *
- *
- * Cp037 |
- * IBM037 |
- * ebcdic-cp-us ebcdic-cp-ca ebcdic-cp-wt ebcdic-cp-nl csIBM037 |
- *
- *
- * Cp1006 |
- * ? |
- * |
- *
- *
- * Cp1025 |
- * ? |
- * |
- *
- *
- * Cp1026 |
- * IBM1026 |
- * csIBM1026 |
- *
- *
- * Cp1046 |
- * ? |
- * |
- *
- *
- * Cp1047 |
- * IBM1047 |
- * IBM-1047 |
- *
- *
- * Cp1097 |
- * ? |
- * |
- *
- *
- * Cp1098 |
- * ? |
- * |
- *
- *
- * Cp1112 |
- * ? |
- * |
- *
- *
- * Cp1122 |
- * ? |
- * |
- *
- *
- * Cp1123 |
- * ? |
- * |
- *
- *
- * Cp1124 |
- * ? |
- * |
- *
- *
- * Cp1140 |
- * IBM01140 |
- * CCSID01140 CP01140 ebcdic-us-37+euro |
- *
- *
- * Cp1141 |
- * IBM01141 |
- * CCSID01141 CP01141 ebcdic-de-273+euro |
- *
- *
- * Cp1142 |
- * IBM01142 |
- * CCSID01142 CP01142 ebcdic-dk-277+euro ebcdic-no-277+euro |
- *
- *
- * Cp1143 |
- * IBM01143 |
- * CCSID01143 CP01143 ebcdic-fi-278+euro ebcdic-se-278+euro |
- *
- *
- * Cp1144 |
- * IBM01144 |
- * CCSID01144 CP01144 ebcdic-it-280+euro |
- *
- *
- * Cp1145 |
- * IBM01145 |
- * CCSID01145 CP01145 ebcdic-es-284+euro |
- *
- *
- * Cp1146 |
- * IBM01146 |
- * CCSID01146 CP01146 ebcdic-gb-285+euro |
- *
- *
- * Cp1147 |
- * IBM01147 |
- * CCSID01147 CP01147 ebcdic-fr-297+euro |
- *
- *
- * Cp1148 |
- * IBM01148 |
- * CCSID01148 CP01148 ebcdic-international-500+euro |
- *
- *
- * Cp1149 |
- * IBM01149 |
- * CCSID01149 CP01149 ebcdic-is-871+euro |
- *
- *
- * Cp1250 |
- * windows-1250 |
- * |
- *
- *
- * Cp1251 |
- * windows-1251 |
- * |
- *
- *
- * Cp1252 |
- * windows-1252 |
- * |
- *
- *
- * Cp1253 |
- * windows-1253 |
- * |
- *
- *
- * Cp1254 |
- * windows-1254 |
- * |
- *
- *
- * Cp1255 |
- * windows-1255 |
- * |
- *
- *
- * Cp1256 |
- * windows-1256 |
- * |
- *
- *
- * Cp1257 |
- * windows-1257 |
- * |
- *
- *
- * Cp1258 |
- * windows-1258 |
- * |
- *
- *
- * Cp1381 |
- * ? |
- * |
- *
- *
- * Cp1383 |
- * ? |
- * |
- *
- *
- * Cp273 |
- * IBM273 |
- * csIBM273 |
- *
- *
- * Cp277 |
- * IBM277 |
- * EBCDIC-CP-DK EBCDIC-CP-NO csIBM277 |
- *
- *
- * Cp278 |
- * IBM278 |
- * CP278 ebcdic-cp-fi ebcdic-cp-se csIBM278 |
- *
- *
- * Cp280 |
- * IBM280 |
- * ebcdic-cp-it csIBM280 |
- *
- *
- * Cp284 |
- * IBM284 |
- * ebcdic-cp-es csIBM284 |
- *
- *
- * Cp285 |
- * IBM285 |
- * ebcdic-cp-gb csIBM285 |
- *
- *
- * Cp297 |
- * IBM297 |
- * ebcdic-cp-fr csIBM297 |
- *
- *
- * Cp33722 |
- * ? |
- * |
- *
- *
- * Cp420 |
- * IBM420 |
- * ebcdic-cp-ar1 csIBM420 |
- *
- *
- * Cp424 |
- * IBM424 |
- * ebcdic-cp-he csIBM424 |
- *
- *
- * Cp437 |
- * IBM437 |
- * 437 csPC8CodePage437 |
- *
- *
- * Cp500 |
- * IBM500 |
- * ebcdic-cp-be ebcdic-cp-ch csIBM500 |
- *
- *
- * Cp737 |
- * ? |
- * |
- *
- *
- * Cp775 |
- * IBM775 |
- * csPC775Baltic |
- *
- *
- * Cp838 |
- * IBM-Thai |
- * |
- *
- *
- * Cp850 |
- * IBM850 |
- * 850 csPC850Multilingual |
- *
- *
- * Cp852 |
- * IBM852 |
- * 852 csPCp852 |
- *
- *
- * Cp855 |
- * IBM855 |
- * 855 csIBM855 |
- *
- *
- * Cp856 |
- * ? |
- * |
- *
- *
- * Cp857 |
- * IBM857 |
- * 857 csIBM857 |
- *
- *
- * Cp858 |
- * IBM00858 |
- * CCSID00858 CP00858 PC-Multilingual-850+euro |
- *
- *
- * Cp860 |
- * IBM860 |
- * 860 csIBM860 |
- *
- *
- * Cp861 |
- * IBM861 |
- * 861 cp-is csIBM861 |
- *
- *
- * Cp862 |
- * IBM862 |
- * 862 csPC862LatinHebrew |
- *
- *
- * Cp863 |
- * IBM863 |
- * 863 csIBM863 |
- *
- *
- * Cp864 |
- * IBM864 |
- * cp864 csIBM864 |
- *
- *
- * Cp865 |
- * IBM865 |
- * 865 csIBM865 |
- *
- *
- * Cp866 |
- * IBM866 |
- * 866 csIBM866 |
- *
- *
- * Cp868 |
- * IBM868 |
- * cp-ar csIBM868 |
- *
- *
- * Cp869 |
- * IBM869 |
- * cp-gr csIBM869 |
- *
- *
- * Cp870 |
- * IBM870 |
- * ebcdic-cp-roece ebcdic-cp-yu csIBM870 |
- *
- *
- * Cp871 |
- * IBM871 |
- * ebcdic-cp-is csIBM871 |
- *
- *
- * Cp875 |
- * ? |
- * |
- *
- *
- * Cp918 |
- * IBM918 |
- * ebcdic-cp-ar2 csIBM918 |
- *
- *
- * Cp921 |
- * ? |
- * |
- *
- *
- * Cp922 |
- * ? |
- * |
- *
- *
- * Cp930 |
- * ? |
- * |
- *
- *
- * Cp933 |
- * ? |
- * |
- *
- *
- * Cp935 |
- * ? |
- * |
- *
- *
- * Cp937 |
- * ? |
- * |
- *
- *
- * Cp939 |
- * ? |
- * |
- *
- *
- * Cp942 |
- * ? |
- * |
- *
- *
- * Cp942C |
- * ? |
- * |
- *
- *
- * Cp943 |
- * ? |
- * |
- *
- *
- * Cp943C |
- * ? |
- * |
- *
- *
- * Cp948 |
- * ? |
- * |
- *
- *
- * Cp949 |
- * ? |
- * |
- *
- *
- * Cp949C |
- * ? |
- * |
- *
- *
- * Cp950 |
- * ? |
- * |
- *
- *
- * Cp964 |
- * ? |
- * |
- *
- *
- * Cp970 |
- * ? |
- * |
- *
- *
- * EUC_CN |
- * GB2312 |
- * x-EUC-CN csGB2312 euccn euc-cn gb2312-80 gb2312-1980 CN-GB CN-GB-ISOIR165 |
- *
- *
- * EUC_JP |
- * EUC-JP |
- * csEUCPkdFmtJapanese Extended_UNIX_Code_Packed_Format_for_Japanese eucjis x-eucjp eucjp x-euc-jp |
- *
- *
- * EUC_JP_LINUX |
- * ? |
- * |
- *
- *
- * EUC_JP_Solaris |
- * ? |
- * |
- *
- *
- * EUC_KR |
- * EUC-KR |
- * csEUCKR ksc5601 5601 ksc5601_1987 ksc_5601 ksc5601-1987 ks_c_5601-1987 euckr |
- *
- *
- * EUC_TW |
- * EUC-TW |
- * x-EUC-TW cns11643 euctw |
- *
- *
- * GB18030 |
- * GB18030 |
- * gb18030-2000 |
- *
- *
- * GBK |
- * windows-936 |
- * CP936 MS936 ms_936 x-mswin-936 |
- *
- *
- * ISCII91 |
- * ? |
- * x-ISCII91 iscii |
- *
- *
- * ISO2022CN |
- * ISO-2022-CN |
- * |
- *
- *
- * ISO2022JP |
- * ISO-2022-JP |
- * csISO2022JP JIS jis_encoding csjisencoding |
- *
- *
- * ISO2022KR |
- * ISO-2022-KR |
- * csISO2022KR |
- *
- *
- * ISO2022_CN_CNS |
- * ? |
- * |
- *
- *
- * ISO2022_CN_GB |
- * ? |
- * |
- *
- *
- * ISO8859_1 |
- * ISO-8859-1 |
- * ISO_8859-1:1987 iso-ir-100 ISO_8859-1 latin1 l1 IBM819 CP819 csISOLatin1 8859_1 819 IBM-819 ISO8859-1 ISO_8859_1 |
- *
- *
- * ISO8859_13 |
- * ISO-8859-13 |
- * |
- *
- *
- * ISO8859_15 |
- * ISO-8859-15 |
- * ISO_8859-15 Latin-9 8859_15 csISOlatin9 IBM923 cp923 923 L9 IBM-923 ISO8859-15 LATIN9 LATIN0 csISOlatin0 ISO8859_15_FDIS |
- *
- *
- * ISO8859_2 |
- * ISO-8859-2 |
- * ISO_8859-2:1987 iso-ir-101 ISO_8859-2 latin2 l2 csISOLatin2 8859_2 iso8859_2 |
- *
- *
- * ISO8859_3 |
- * ISO-8859-3 |
- * ISO_8859-3:1988 iso-ir-109 ISO_8859-3 latin3 l3 csISOLatin3 8859_3 |
- *
- *
- * ISO8859_4 |
- * ISO-8859-4 |
- * ISO_8859-4:1988 iso-ir-110 ISO_8859-4 latin4 l4 csISOLatin4 8859_4 |
- *
- *
- * ISO8859_5 |
- * ISO-8859-5 |
- * ISO_8859-5:1988 iso-ir-144 ISO_8859-5 cyrillic csISOLatinCyrillic 8859_5 |
- *
- *
- * ISO8859_6 |
- * ISO-8859-6 |
- * ISO_8859-6:1987 iso-ir-127 ISO_8859-6 ECMA-114 ASMO-708 arabic csISOLatinArabic 8859_6 |
- *
- *
- * ISO8859_7 |
- * ISO-8859-7 |
- * ISO_8859-7:1987 iso-ir-126 ISO_8859-7 ELOT_928 ECMA-118 greek greek8 csISOLatinGreek 8859_7 sun_eu_greek |
- *
- *
- * ISO8859_8 |
- * ISO-8859-8 |
- * ISO_8859-8:1988 iso-ir-138 ISO_8859-8 hebrew csISOLatinHebrew 8859_8 |
- *
- *
- * ISO8859_9 |
- * ISO-8859-9 |
- * ISO_8859-9:1989 iso-ir-148 ISO_8859-9 latin5 l5 csISOLatin5 8859_9 |
- *
- *
- * JISAutoDetect |
- * ? |
- * |
- *
- *
- * JIS_C6626-1983 |
- * JIS_C6626-1983 |
- * x-JIS0208 JIS0208 csISO87JISX0208 x0208 JIS_X0208-1983 iso-ir-87 |
- *
- *
- * JIS_X0201 |
- * JIS_X0201 |
- * X0201 JIS0201 csHalfWidthKatakana |
- *
- *
- * JIS_X0212-1990 |
- * JIS_X0212-1990 |
- * iso-ir-159 x0212 JIS0212 csISO159JISX02121990 |
- *
- *
- * KOI8_R |
- * KOI8-R |
- * csKOI8R koi8 |
- *
- *
- * MS874 |
- * windows-874 |
- * cp874 |
- *
- *
- * MS932 |
- * Windows-31J |
- * windows-932 csWindows31J x-ms-cp932 |
- *
- *
- * MS949 |
- * windows-949 |
- * windows949 ms_949 x-windows-949 |
- *
- *
- * MS950 |
- * windows-950 |
- * x-windows-950 |
- *
- *
- * MS950_HKSCS |
- * |
- * |
- *
- *
- * MacArabic |
- * ? |
- * |
- *
- *
- * MacCentralEurope |
- * ? |
- * |
- *
- *
- * MacCroatian |
- * ? |
- * |
- *
- *
- * MacCyrillic |
- * ? |
- * |
- *
- *
- * MacDingbat |
- * ? |
- * |
- *
- *
- * MacGreek |
- * MacGreek |
- * |
- *
- *
- * MacHebrew |
- * ? |
- * |
- *
- *
- * MacIceland |
- * ? |
- * |
- *
- *
- * MacRoman |
- * MacRoman |
- * Macintosh MAC csMacintosh |
- *
- *
- * MacRomania |
- * ? |
- * |
- *
- *
- * MacSymbol |
- * ? |
- * |
- *
- *
- * MacThai |
- * ? |
- * |
- *
- *
- * MacTurkish |
- * ? |
- * |
- *
- *
- * MacUkraine |
- * ? |
- * |
- *
- *
- * SJIS |
- * Shift_JIS |
- * MS_Kanji csShiftJIS shift-jis x-sjis pck |
- *
- *
- * TIS620 |
- * TIS-620 |
- * |
- *
- *
- * UTF-16 |
- * UTF-16 |
- * UTF_16 |
- *
- *
- * UTF8 |
- * UTF-8 |
- * |
- *
- *
- * UnicodeBig |
- * ? |
- * |
- *
- *
- * UnicodeBigUnmarked |
- * UTF-16BE |
- * X-UTF-16BE UTF_16BE ISO-10646-UCS-2 |
- *
- *
- * UnicodeLittle |
- * ? |
- * |
- *
- *
- * UnicodeLittleUnmarked |
- * UTF-16LE |
- * UTF_16LE X-UTF-16LE |
- *
- *
- * x-Johab |
- * johab |
- * johab cp1361 ms1361 ksc5601-1992 ksc5601_1992 |
- *
- *
- * x-iso-8859-11 |
- * ? |
- * |
- *
- *
- *
- *
- * @version $Id: CharsetUtil.java,v 1.1 2004/10/25 07:26:46 ntherning Exp $
- */
-public class CharsetUtil {
- private static Log log = LogFactory.getLog(CharsetUtil.class);
-
- private static class Charset implements Comparable {
- private String canonical = null;
- private String mime = null;
- private String[] aliases = null;
-
- private Charset(String canonical, String mime, String[] aliases) {
- this.canonical = canonical;
- this.mime = mime;
- this.aliases = aliases;
- }
-
- public int compareTo(Charset c) {
- return this.canonical.compareTo(c.canonical);
- }
- }
-
- private static Charset[] JAVA_CHARSETS = {
- new Charset("ISO8859_1", "ISO-8859-1",
- new String[] {"ISO_8859-1:1987", "iso-ir-100", "ISO_8859-1",
- "latin1", "l1", "IBM819", "CP819",
- "csISOLatin1", "8859_1", "819", "IBM-819",
- "ISO8859-1", "ISO_8859_1"}),
- new Charset("ISO8859_2", "ISO-8859-2",
- new String[] {"ISO_8859-2:1987", "iso-ir-101", "ISO_8859-2",
- "latin2", "l2", "csISOLatin2", "8859_2",
- "iso8859_2"}),
- new Charset("ISO8859_3", "ISO-8859-3", new String[] {"ISO_8859-3:1988", "iso-ir-109", "ISO_8859-3", "latin3", "l3", "csISOLatin3", "8859_3"}),
- new Charset("ISO8859_4", "ISO-8859-4",
- new String[] {"ISO_8859-4:1988", "iso-ir-110", "ISO_8859-4",
- "latin4", "l4", "csISOLatin4", "8859_4"}),
- new Charset("ISO8859_5", "ISO-8859-5",
- new String[] {"ISO_8859-5:1988", "iso-ir-144", "ISO_8859-5",
- "cyrillic", "csISOLatinCyrillic", "8859_5"}),
- new Charset("ISO8859_6", "ISO-8859-6", new String[] {"ISO_8859-6:1987", "iso-ir-127", "ISO_8859-6", "ECMA-114", "ASMO-708", "arabic", "csISOLatinArabic", "8859_6"}),
- new Charset("ISO8859_7", "ISO-8859-7",
- new String[] {"ISO_8859-7:1987", "iso-ir-126", "ISO_8859-7",
- "ELOT_928", "ECMA-118", "greek", "greek8",
- "csISOLatinGreek", "8859_7", "sun_eu_greek"}),
- new Charset("ISO8859_8", "ISO-8859-8", new String[] {"ISO_8859-8:1988", "iso-ir-138", "ISO_8859-8", "hebrew", "csISOLatinHebrew", "8859_8"}),
- new Charset("ISO8859_9", "ISO-8859-9",
- new String[] {"ISO_8859-9:1989", "iso-ir-148", "ISO_8859-9",
- "latin5", "l5", "csISOLatin5", "8859_9"}),
-
- new Charset("ISO8859_13", "ISO-8859-13", new String[] {}),
- new Charset("ISO8859_15", "ISO-8859-15",
- new String[] {"ISO_8859-15", "Latin-9", "8859_15",
- "csISOlatin9", "IBM923", "cp923", "923", "L9",
- "IBM-923", "ISO8859-15", "LATIN9", "LATIN0",
- "csISOlatin0", "ISO8859_15_FDIS"}),
- new Charset("KOI8_R", "KOI8-R", new String[] {"csKOI8R", "koi8"}),
- new Charset("ASCII", "US-ASCII",
- new String[] {"ANSI_X3.4-1968", "iso-ir-6",
- "ANSI_X3.4-1986", "ISO_646.irv:1991",
- "ISO646-US", "us", "IBM367", "cp367",
- "csASCII", "ascii7", "646", "iso_646.irv:1983"}),
- new Charset("UTF8", "UTF-8", new String[] {}),
- new Charset("UTF-16", "UTF-16", new String[] {"UTF_16"}),
- new Charset("UnicodeBigUnmarked", "UTF-16BE", new String[] {"X-UTF-16BE", "UTF_16BE", "ISO-10646-UCS-2"}),
- new Charset("UnicodeLittleUnmarked", "UTF-16LE", new String[] {"UTF_16LE", "X-UTF-16LE"}),
- new Charset("Big5", "Big5", new String[] {"csBig5", "CN-Big5", "BIG-FIVE", "BIGFIVE"}),
- new Charset("Big5_HKSCS", "Big5-HKSCS", new String[] {"big5hkscs"}),
- new Charset("EUC_JP", "EUC-JP",
- new String[] {"csEUCPkdFmtJapanese",
- "Extended_UNIX_Code_Packed_Format_for_Japanese",
- "eucjis", "x-eucjp", "eucjp", "x-euc-jp"}),
- new Charset("EUC_KR", "EUC-KR",
- new String[] {"csEUCKR", "ksc5601", "5601", "ksc5601_1987",
- "ksc_5601", "ksc5601-1987", "ks_c_5601-1987",
- "euckr"}),
- new Charset("GB18030", "GB18030", new String[] {"gb18030-2000"}),
- new Charset("EUC_CN", "GB2312", new String[] {"x-EUC-CN", "csGB2312", "euccn", "euc-cn", "gb2312-80", "gb2312-1980", "CN-GB", "CN-GB-ISOIR165"}),
- new Charset("GBK", "windows-936", new String[] {"CP936", "MS936", "ms_936", "x-mswin-936"}),
-
- new Charset("Cp037", "IBM037", new String[] {"ebcdic-cp-us", "ebcdic-cp-ca", "ebcdic-cp-wt", "ebcdic-cp-nl", "csIBM037"}),
- new Charset("Cp273", "IBM273", new String[] {"csIBM273"}),
- new Charset("Cp277", "IBM277", new String[] {"EBCDIC-CP-DK", "EBCDIC-CP-NO", "csIBM277"}),
- new Charset("Cp278", "IBM278", new String[] {"CP278", "ebcdic-cp-fi", "ebcdic-cp-se", "csIBM278"}),
- new Charset("Cp280", "IBM280", new String[] {"ebcdic-cp-it", "csIBM280"}),
- new Charset("Cp284", "IBM284", new String[] {"ebcdic-cp-es", "csIBM284"}),
- new Charset("Cp285", "IBM285", new String[] {"ebcdic-cp-gb", "csIBM285"}),
- new Charset("Cp297", "IBM297", new String[] {"ebcdic-cp-fr", "csIBM297"}),
- new Charset("Cp420", "IBM420", new String[] {"ebcdic-cp-ar1", "csIBM420"}),
- new Charset("Cp424", "IBM424", new String[] {"ebcdic-cp-he", "csIBM424"}),
- new Charset("Cp437", "IBM437", new String[] {"437", "csPC8CodePage437"}),
- new Charset("Cp500", "IBM500", new String[] {"ebcdic-cp-be", "ebcdic-cp-ch", "csIBM500"}),
- new Charset("Cp775", "IBM775", new String[] {"csPC775Baltic"}),
- new Charset("Cp838", "IBM-Thai", new String[] {}),
- new Charset("Cp850", "IBM850", new String[] {"850", "csPC850Multilingual"}),
- new Charset("Cp852", "IBM852", new String[] {"852", "csPCp852"}),
- new Charset("Cp855", "IBM855", new String[] {"855", "csIBM855"}),
- new Charset("Cp857", "IBM857", new String[] {"857", "csIBM857"}),
- new Charset("Cp858", "IBM00858",
- new String[] {"CCSID00858", "CP00858",
- "PC-Multilingual-850+euro"}),
- new Charset("Cp860", "IBM860", new String[] {"860", "csIBM860"}),
- new Charset("Cp861", "IBM861", new String[] {"861", "cp-is", "csIBM861"}),
- new Charset("Cp862", "IBM862", new String[] {"862", "csPC862LatinHebrew"}),
- new Charset("Cp863", "IBM863", new String[] {"863", "csIBM863"}),
- new Charset("Cp864", "IBM864", new String[] {"cp864", "csIBM864"}),
- new Charset("Cp865", "IBM865", new String[] {"865", "csIBM865"}),
- new Charset("Cp866", "IBM866", new String[] {"866", "csIBM866"}),
- new Charset("Cp868", "IBM868", new String[] {"cp-ar", "csIBM868"}),
- new Charset("Cp869", "IBM869", new String[] {"cp-gr", "csIBM869"}),
- new Charset("Cp870", "IBM870", new String[] {"ebcdic-cp-roece", "ebcdic-cp-yu", "csIBM870"}),
- new Charset("Cp871", "IBM871", new String[] {"ebcdic-cp-is", "csIBM871"}),
- new Charset("Cp918", "IBM918", new String[] {"ebcdic-cp-ar2", "csIBM918"}),
- new Charset("Cp1026", "IBM1026", new String[] {"csIBM1026"}),
- new Charset("Cp1047", "IBM1047", new String[] {"IBM-1047"}),
- new Charset("Cp1140", "IBM01140",
- new String[] {"CCSID01140", "CP01140",
- "ebcdic-us-37+euro"}),
- new Charset("Cp1141", "IBM01141",
- new String[] {"CCSID01141", "CP01141",
- "ebcdic-de-273+euro"}),
- new Charset("Cp1142", "IBM01142", new String[] {"CCSID01142", "CP01142", "ebcdic-dk-277+euro", "ebcdic-no-277+euro"}),
- new Charset("Cp1143", "IBM01143", new String[] {"CCSID01143", "CP01143", "ebcdic-fi-278+euro", "ebcdic-se-278+euro"}),
- new Charset("Cp1144", "IBM01144", new String[] {"CCSID01144", "CP01144", "ebcdic-it-280+euro"}),
- new Charset("Cp1145", "IBM01145", new String[] {"CCSID01145", "CP01145", "ebcdic-es-284+euro"}),
- new Charset("Cp1146", "IBM01146", new String[] {"CCSID01146", "CP01146", "ebcdic-gb-285+euro"}),
- new Charset("Cp1147", "IBM01147", new String[] {"CCSID01147", "CP01147", "ebcdic-fr-297+euro"}),
- new Charset("Cp1148", "IBM01148", new String[] {"CCSID01148", "CP01148", "ebcdic-international-500+euro"}),
- new Charset("Cp1149", "IBM01149", new String[] {"CCSID01149", "CP01149", "ebcdic-is-871+euro"}),
- new Charset("Cp1250", "windows-1250", new String[] {}),
- new Charset("Cp1251", "windows-1251", new String[] {}),
- new Charset("Cp1252", "windows-1252", new String[] {}),
- new Charset("Cp1253", "windows-1253", new String[] {}),
- new Charset("Cp1254", "windows-1254", new String[] {}),
- new Charset("Cp1255", "windows-1255", new String[] {}),
- new Charset("Cp1256", "windows-1256", new String[] {}),
- new Charset("Cp1257", "windows-1257", new String[] {}),
- new Charset("Cp1258", "windows-1258", new String[] {}),
- new Charset("ISO2022CN", "ISO-2022-CN", new String[] {}),
- new Charset("ISO2022JP", "ISO-2022-JP", new String[] {"csISO2022JP", "JIS", "jis_encoding", "csjisencoding"}),
- new Charset("ISO2022KR", "ISO-2022-KR", new String[] {"csISO2022KR"}),
- new Charset("JIS_X0201", "JIS_X0201", new String[] {"X0201", "JIS0201", "csHalfWidthKatakana"}),
- new Charset("JIS_X0212-1990", "JIS_X0212-1990", new String[] {"iso-ir-159", "x0212", "JIS0212", "csISO159JISX02121990"}),
- new Charset("JIS_C6626-1983", "JIS_C6626-1983", new String[] {"x-JIS0208", "JIS0208", "csISO87JISX0208", "x0208", "JIS_X0208-1983", "iso-ir-87"}),
- new Charset("SJIS", "Shift_JIS", new String[] {"MS_Kanji", "csShiftJIS", "shift-jis", "x-sjis", "pck"}),
- new Charset("TIS620", "TIS-620", new String[] {}),
- new Charset("MS932", "Windows-31J", new String[] {"windows-932", "csWindows31J", "x-ms-cp932"}),
- new Charset("EUC_TW", "EUC-TW", new String[] {"x-EUC-TW", "cns11643", "euctw"}),
- new Charset("x-Johab", "johab", new String[] {"johab", "cp1361", "ms1361", "ksc5601-1992", "ksc5601_1992"}),
- new Charset("MS950_HKSCS", "", new String[] {}),
- new Charset("MS874", "windows-874", new String[] {"cp874"}),
- new Charset("MS949", "windows-949", new String[] {"windows949", "ms_949", "x-windows-949"}),
- new Charset("MS950", "windows-950", new String[] {"x-windows-950"}),
-
- new Charset("Cp737", null, new String[] {}),
- new Charset("Cp856", null, new String[] {}),
- new Charset("Cp875", null, new String[] {}),
- new Charset("Cp921", null, new String[] {}),
- new Charset("Cp922", null, new String[] {}),
- new Charset("Cp930", null, new String[] {}),
- new Charset("Cp933", null, new String[] {}),
- new Charset("Cp935", null, new String[] {}),
- new Charset("Cp937", null, new String[] {}),
- new Charset("Cp939", null, new String[] {}),
- new Charset("Cp942", null, new String[] {}),
- new Charset("Cp942C", null, new String[] {}),
- new Charset("Cp943", null, new String[] {}),
- new Charset("Cp943C", null, new String[] {}),
- new Charset("Cp948", null, new String[] {}),
- new Charset("Cp949", null, new String[] {}),
- new Charset("Cp949C", null, new String[] {}),
- new Charset("Cp950", null, new String[] {}),
- new Charset("Cp964", null, new String[] {}),
- new Charset("Cp970", null, new String[] {}),
- new Charset("Cp1006", null, new String[] {}),
- new Charset("Cp1025", null, new String[] {}),
- new Charset("Cp1046", null, new String[] {}),
- new Charset("Cp1097", null, new String[] {}),
- new Charset("Cp1098", null, new String[] {}),
- new Charset("Cp1112", null, new String[] {}),
- new Charset("Cp1122", null, new String[] {}),
- new Charset("Cp1123", null, new String[] {}),
- new Charset("Cp1124", null, new String[] {}),
- new Charset("Cp1381", null, new String[] {}),
- new Charset("Cp1383", null, new String[] {}),
- new Charset("Cp33722", null, new String[] {}),
- new Charset("Big5_Solaris", null, new String[] {}),
- new Charset("EUC_JP_LINUX", null, new String[] {}),
- new Charset("EUC_JP_Solaris", null, new String[] {}),
- new Charset("ISCII91", null, new String[] {"x-ISCII91", "iscii"}),
- new Charset("ISO2022_CN_CNS", null, new String[] {}),
- new Charset("ISO2022_CN_GB", null, new String[] {}),
- new Charset("x-iso-8859-11", null, new String[] {}),
- new Charset("JISAutoDetect", null, new String[] {}),
- new Charset("MacArabic", null, new String[] {}),
- new Charset("MacCentralEurope", null, new String[] {}),
- new Charset("MacCroatian", null, new String[] {}),
- new Charset("MacCyrillic", null, new String[] {}),
- new Charset("MacDingbat", null, new String[] {}),
- new Charset("MacGreek", "MacGreek", new String[] {}),
- new Charset("MacHebrew", null, new String[] {}),
- new Charset("MacIceland", null, new String[] {}),
- new Charset("MacRoman", "MacRoman", new String[] {"Macintosh", "MAC", "csMacintosh"}),
- new Charset("MacRomania", null, new String[] {}),
- new Charset("MacSymbol", null, new String[] {}),
- new Charset("MacThai", null, new String[] {}),
- new Charset("MacTurkish", null, new String[] {}),
- new Charset("MacUkraine", null, new String[] {}),
- new Charset("UnicodeBig", null, new String[] {}),
- new Charset("UnicodeLittle", null, new String[] {})
- };
-
- /**
- * Contains the canonical names of character sets which can be used to
- * decode bytes into Java chars.
- */
- private static TreeSet decodingSupported = null;
-
- /**
- * Contains the canonical names of character sets which can be used to
- * encode Java chars into bytes.
- */
- private static TreeSet encodingSupported = null;
-
- /**
- * Maps character set names to Charset objects. All possible names of
- * a charset will be mapped to the Charset.
- */
- private static HashMap charsetMap = null;
-
- static {
- decodingSupported = new TreeSet();
- encodingSupported = new TreeSet();
- byte[] dummy = new byte[] {'d', 'u', 'm', 'm', 'y'};
- for (int i = 0; i < JAVA_CHARSETS.length; i++) {
- try {
- String s = new String(dummy, JAVA_CHARSETS[i].canonical);
- decodingSupported.add(JAVA_CHARSETS[i].canonical.toLowerCase(Locale.US));
- } catch (UnsupportedOperationException e) {
- } catch (UnsupportedEncodingException e) {
- }
- try {
- "dummy".getBytes(JAVA_CHARSETS[i].canonical);
- encodingSupported.add(JAVA_CHARSETS[i].canonical.toLowerCase(Locale.US));
- } catch (UnsupportedOperationException e) {
- } catch (UnsupportedEncodingException e) {
- }
- }
-
- charsetMap = new HashMap();
- for (int i = 0; i < JAVA_CHARSETS.length; i++) {
- Charset c = JAVA_CHARSETS[i];
- charsetMap.put(c.canonical.toLowerCase(Locale.US), c);
- if (c.mime != null) {
- charsetMap.put(c.mime.toLowerCase(Locale.US), c);
- }
- if (c.aliases != null) {
- for (int j = 0; j < c.aliases.length; j++) {
- charsetMap.put(c.aliases[j].toLowerCase(Locale.US), c);
- }
- }
- }
-
- if (log.isDebugEnabled()) {
- log.debug("Character sets which support decoding: "
- + decodingSupported);
- log.debug("Character sets which support encoding: "
- + encodingSupported);
- }
- }
-
- /**
- * ANDROID: THE FOLLOWING SET OF STATIC STRINGS ARE COPIED FROM A NEWER VERSION OF MIME4J
- */
-
- /** carriage return - line feed sequence */
- public static final String CRLF = "\r\n";
-
- /** US-ASCII CR, carriage return (13) */
- public static final int CR = '\r';
-
- /** US-ASCII LF, line feed (10) */
- public static final int LF = '\n';
-
- /** US-ASCII SP, space (32) */
- public static final int SP = ' ';
-
- /** US-ASCII HT, horizontal-tab (9)*/
- public static final int HT = '\t';
-
- public static final java.nio.charset.Charset US_ASCII = java.nio.charset.Charset
- .forName("US-ASCII");
-
- public static final java.nio.charset.Charset ISO_8859_1 = java.nio.charset.Charset
- .forName("ISO-8859-1");
-
- public static final java.nio.charset.Charset UTF_8 = java.nio.charset.Charset
- .forName("UTF-8");
-
- /**
- * Returns true
if the specified character is a whitespace
- * character (CR, LF, SP or HT).
- *
- * ANDROID: COPIED FROM A NEWER VERSION OF MIME4J
- *
- * @param ch
- * character to test.
- * @return true
if the specified character is a whitespace
- * character, false
otherwise.
- */
- public static boolean isWhitespace(char ch) {
- return ch == SP || ch == HT || ch == CR || ch == LF;
- }
-
- /**
- * Returns true
if the specified string consists entirely of
- * whitespace characters.
- *
- * ANDROID: COPIED FROM A NEWER VERSION OF MIME4J
- *
- * @param s
- * string to test.
- * @return true
if the specified string consists entirely of
- * whitespace characters, false
otherwise.
- */
- public static boolean isWhitespace(final String s) {
- if (s == null) {
- throw new IllegalArgumentException("String may not be null");
- }
- final int len = s.length();
- for (int i = 0; i < len; i++) {
- if (!isWhitespace(s.charAt(i))) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Determines if the VM supports encoding (chars to bytes) the
- * specified character set. NOTE: the given character set name may
- * not be known to the VM even if this method returns true
.
- * Use {@link #toJavaCharset(String)} to get the canonical Java character
- * set name.
- *
- * @param charsetName the characters set name.
- * @return true
if encoding is supported, false
- * otherwise.
- */
- public static boolean isEncodingSupported(String charsetName) {
- return encodingSupported.contains(charsetName.toLowerCase(Locale.US));
- }
-
- /**
- * Determines if the VM supports decoding (bytes to chars) the
- * specified character set. NOTE: the given character set name may
- * not be known to the VM even if this method returns true
.
- * Use {@link #toJavaCharset(String)} to get the canonical Java character
- * set name.
- *
- * @param charsetName the characters set name.
- * @return true
if decoding is supported, false
- * otherwise.
- */
- public static boolean isDecodingSupported(String charsetName) {
- return decodingSupported.contains(charsetName.toLowerCase(Locale.US));
- }
-
- /**
- * Gets the preferred MIME character set name for the specified
- * character set or null
if not known.
- *
- * @param charsetName the character set name to look for.
- * @return the MIME preferred name or null
if not known.
- */
- public static String toMimeCharset(String charsetName) {
- Charset c = charsetMap.get(charsetName.toLowerCase(Locale.US));
- if (c != null) {
- return c.mime;
- }
- return null;
- }
-
- /**
- * Gets the canonical Java character set name for the specified
- * character set or null
if not known. This should be
- * called before doing any conversions using the Java API. NOTE:
- * you must use {@link #isEncodingSupported(String)} or
- * {@link #isDecodingSupported(String)} to make sure the returned
- * Java character set is supported by the current VM.
- *
- * @param charsetName the character set name to look for.
- * @return the canonical Java name or null
if not known.
- */
- public static String toJavaCharset(String charsetName) {
- Charset c = charsetMap.get(charsetName.toLowerCase(Locale.US));
- if (c != null) {
- return c.canonical;
- }
- return null;
- }
-
- public static java.nio.charset.Charset getCharset(String charsetName) {
- String defaultCharset = "ISO-8859-1";
-
- // Use the default chareset if given charset is null
- if(charsetName == null) charsetName = defaultCharset;
-
- try {
- return java.nio.charset.Charset.forName(charsetName);
- } catch (IllegalCharsetNameException e) {
- log.info("Illegal charset " + charsetName + ", fallback to " +
- defaultCharset + ": " + e);
- // Use default charset on exception
- return java.nio.charset.Charset.forName(defaultCharset);
- } catch (UnsupportedCharsetException ex) {
- log.info("Unsupported charset " + charsetName + ", fallback to " +
- defaultCharset + ": " + ex);
- // Use default charset on exception
- return java.nio.charset.Charset.forName(defaultCharset);
- }
-
- }
- /*
- * Uncomment the code below and run the main method to regenerate the
- * Javadoc table above when the known charsets change.
- */
-
- /*
- private static String dumpHtmlTable() {
- LinkedList l = new LinkedList(Arrays.asList(JAVA_CHARSETS));
- Collections.sort(l);
- StringBuffer sb = new StringBuffer();
- sb.append(" * \n");
- sb.append(" * \n");
- sb.append(" * Canonical (Java) name | \n");
- sb.append(" * MIME preferred | \n");
- sb.append(" * Aliases | \n");
- sb.append(" *
\n");
-
- for (Iterator it = l.iterator(); it.hasNext();) {
- Charset c = (Charset) it.next();
- sb.append(" * \n");
- sb.append(" * " + c.canonical + " | \n");
- sb.append(" * " + (c.mime == null ? "?" : c.mime)+ " | \n");
- sb.append(" * ");
- for (int i = 0; c.aliases != null && i < c.aliases.length; i++) {
- sb.append(c.aliases[i] + " ");
- }
- sb.append(" | \n");
- sb.append(" *
\n");
- }
- sb.append(" *
\n");
- return sb.toString();
- }
-
- public static void main(String[] args) {
- System.out.println(dumpHtmlTable());
- }*/
-}
\ No newline at end of file
diff --git a/assets/quantum/res/drawable/quantum_ic_business_vd_theme_24.xml b/assets/quantum/res/drawable/quantum_ic_business_vd_theme_24.xml
new file mode 100644
index 000000000..5fc1cef03
--- /dev/null
+++ b/assets/quantum/res/drawable/quantum_ic_business_vd_theme_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/assets/quantum/res/drawable/quantum_ic_report_vd_theme_24.xml b/assets/quantum/res/drawable/quantum_ic_report_vd_theme_24.xml
new file mode 100644
index 000000000..d8544cb9b
--- /dev/null
+++ b/assets/quantum/res/drawable/quantum_ic_report_vd_theme_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/assets/quantum/res/drawable/quantum_ic_voicemail_vd_theme_24.xml b/assets/quantum/res/drawable/quantum_ic_voicemail_vd_theme_24.xml
new file mode 100644
index 000000000..d7e79d799
--- /dev/null
+++ b/assets/quantum/res/drawable/quantum_ic_voicemail_vd_theme_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/java/com/android/contacts/common/ContactPhotoManager.java b/java/com/android/contacts/common/ContactPhotoManager.java
index 9e627ae1f..652e93637 100644
--- a/java/com/android/contacts/common/ContactPhotoManager.java
+++ b/java/com/android/contacts/common/ContactPhotoManager.java
@@ -39,6 +39,7 @@ public abstract class ContactPhotoManager implements ComponentCallbacks2 {
/** Contact type constants used for default letter images */
public static final int TYPE_PERSON = LetterTileDrawable.TYPE_PERSON;
+ public static final int TYPE_SPAM = LetterTileDrawable.TYPE_SPAM;
public static final int TYPE_BUSINESS = LetterTileDrawable.TYPE_BUSINESS;
public static final int TYPE_VOICEMAIL = LetterTileDrawable.TYPE_VOICEMAIL;
public static final int TYPE_DEFAULT = LetterTileDrawable.TYPE_DEFAULT;
@@ -235,8 +236,13 @@ public abstract class ContactPhotoManager implements ComponentCallbacks2 {
loadThumbnail(view, photoId, darkTheme, isCircular, defaultImageRequest, DEFAULT_AVATAR);
}
- public final void loadDialerThumbnail(
- QuickContactBadge badge, Uri contactUri, long photoId, String displayName, int contactType) {
+ public final void loadDialerThumbnailOrPhoto(
+ QuickContactBadge badge,
+ Uri contactUri,
+ long photoId,
+ Uri photoUri,
+ String displayName,
+ int contactType) {
badge.assignContactUri(contactUri);
badge.setOverlay(null);
@@ -244,8 +250,11 @@ public abstract class ContactPhotoManager implements ComponentCallbacks2 {
ContactPhotoManager.DefaultImageRequest request =
new ContactPhotoManager.DefaultImageRequest(
displayName, lookupKey, contactType, true /* isCircular */);
- loadThumbnail(
- badge, photoId, false /* darkTheme */, true /* isCircular */, request, DEFAULT_AVATAR);
+ if (photoId == 0 && photoUri != null) {
+ loadDirectoryPhoto(badge, photoUri, false /* darkTheme */, true /* isCircular */, request);
+ } else {
+ loadThumbnail(badge, photoId, false /* darkTheme */, true /* isCircular */, request);
+ }
}
/**
@@ -500,4 +509,3 @@ public abstract class ContactPhotoManager implements ComponentCallbacks2 {
}
}
}
-
diff --git a/java/com/android/contacts/common/dialog/CallSubjectDialog.java b/java/com/android/contacts/common/dialog/CallSubjectDialog.java
index 5e0d6b58a..117ac5e4e 100644
--- a/java/com/android/contacts/common/dialog/CallSubjectDialog.java
+++ b/java/com/android/contacts/common/dialog/CallSubjectDialog.java
@@ -47,8 +47,8 @@ import com.android.contacts.common.ContactPhotoManager;
import com.android.contacts.common.R;
import com.android.contacts.common.compat.telecom.TelecomManagerCompat;
import com.android.dialer.animation.AnimUtils;
+import com.android.dialer.callintent.CallInitiationType;
import com.android.dialer.callintent.CallIntentBuilder;
-import com.android.dialer.callintent.nano.CallInitiationType;
import com.android.dialer.common.LogUtil;
import com.android.dialer.util.ViewUtil;
import java.nio.charset.Charset;
@@ -65,7 +65,7 @@ public class CallSubjectDialog extends Activity {
public static final String PREF_KEY_SUBJECT_HISTORY_ITEM = "subject_history_item";
/** Activity intent argument bundle keys: */
public static final String ARG_PHOTO_ID = "PHOTO_ID";
-
+ public static final String ARG_PHOTO_URI = "PHOTO_URI";
public static final String ARG_CONTACT_URI = "CONTACT_URI";
public static final String ARG_NAME_OR_NUMBER = "NAME_OR_NUMBER";
public static final String ARG_NUMBER = "NUMBER";
@@ -134,6 +134,7 @@ public class CallSubjectDialog extends Activity {
};
private long mPhotoID;
+ private Uri mPhotoUri;
private Uri mContactUri;
private String mNameOrNumber;
private String mNumber;
@@ -195,6 +196,7 @@ public class CallSubjectDialog extends Activity {
start(
activity,
-1 /* photoId */,
+ null /* photoUri */,
null /* contactUri */,
number /* nameOrNumber */,
number /* number */,
@@ -220,6 +222,7 @@ public class CallSubjectDialog extends Activity {
public static void start(
Activity activity,
long photoId,
+ Uri photoUri,
Uri contactUri,
String nameOrNumber,
String number,
@@ -229,6 +232,7 @@ public class CallSubjectDialog extends Activity {
PhoneAccountHandle phoneAccountHandle) {
Bundle arguments = new Bundle();
arguments.putLong(ARG_PHOTO_ID, photoId);
+ arguments.putParcelable(ARG_PHOTO_URI, photoUri);
arguments.putParcelable(ARG_CONTACT_URI, contactUri);
arguments.putString(ARG_NAME_OR_NUMBER, nameOrNumber);
arguments.putString(ARG_NUMBER, number);
@@ -320,7 +324,8 @@ public class CallSubjectDialog extends Activity {
private void updateContactInfo() {
if (mContactUri != null) {
ContactPhotoManager.getInstance(this)
- .loadDialerThumbnail(mContactPhoto, mContactUri, mPhotoID, mNameOrNumber, mContactType);
+ .loadDialerThumbnailOrPhoto(
+ mContactPhoto, mContactUri, mPhotoID, mPhotoUri, mNameOrNumber, mContactType);
} else {
mContactPhoto.setVisibility(View.GONE);
}
@@ -343,6 +348,7 @@ public class CallSubjectDialog extends Activity {
return;
}
mPhotoID = arguments.getLong(ARG_PHOTO_ID);
+ mPhotoUri = arguments.getParcelable(ARG_PHOTO_URI);
mContactUri = arguments.getParcelable(ARG_CONTACT_URI);
mNameOrNumber = arguments.getString(ARG_NAME_OR_NUMBER);
mNumber = arguments.getString(ARG_NUMBER);
diff --git a/java/com/android/contacts/common/lettertiles/LetterTileDrawable.java b/java/com/android/contacts/common/lettertiles/LetterTileDrawable.java
index ca12f1812..f8ea140b3 100644
--- a/java/com/android/contacts/common/lettertiles/LetterTileDrawable.java
+++ b/java/com/android/contacts/common/lettertiles/LetterTileDrawable.java
@@ -20,7 +20,6 @@ import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
-import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Outline;
@@ -49,7 +48,7 @@ public class LetterTileDrawable extends Drawable {
* #TYPE_BUSINESS}, and voicemail contacts should use {@link #TYPE_VOICEMAIL}.
*/
@Retention(RetentionPolicy.SOURCE)
- @IntDef({TYPE_PERSON, TYPE_BUSINESS, TYPE_VOICEMAIL, TYPE_GENERIC_AVATAR})
+ @IntDef({TYPE_PERSON, TYPE_BUSINESS, TYPE_VOICEMAIL, TYPE_GENERIC_AVATAR, TYPE_SPAM})
public @interface ContactType {}
/** Contact type constants */
@@ -61,6 +60,7 @@ public class LetterTileDrawable extends Drawable {
* situations where a contact is anonymous.
*/
public static final int TYPE_GENERIC_AVATAR = 4;
+ public static final int TYPE_SPAM = 5;
@ContactType public static final int TYPE_DEFAULT = TYPE_PERSON;
/**
@@ -78,6 +78,10 @@ public class LetterTileDrawable extends Drawable {
/** 54% opacity */
private static final int ALPHA = 138;
+ /** 100% opacity */
+ private static final int SPAM_ALPHA = 255;
+ /** Default icon scale for vector drawable. */
+ private static final float VECTOR_ICON_SCALE = 0.7f;
/** Reusable components to avoid new allocations */
private static final Paint sPaint = new Paint();
@@ -87,14 +91,16 @@ public class LetterTileDrawable extends Drawable {
/** Letter tile */
private static TypedArray sColors;
+ private static int sSpamColor;
private static int sDefaultColor;
private static int sTileFontColor;
private static float sLetterToTileRatio;
- private static Bitmap sDefaultPersonAvatar;
- private static Bitmap sDefaultBusinessAvatar;
- private static Bitmap sDefaultVoicemailAvatar;
+ private static Drawable sDefaultPersonAvatar;
+ private static Drawable sDefaultBusinessAvatar;
+ private static Drawable sDefaultVoicemailAvatar;
+ private static Drawable sDefaultSpamAvatar;
private final Paint mPaint;
- private int mContactType = TYPE_DEFAULT;
+ @ContactType private int mContactType = TYPE_DEFAULT;
private float mScale = 1.0f;
private float mOffset = 0.0f;
private boolean mIsCircle = false;
@@ -102,21 +108,20 @@ public class LetterTileDrawable extends Drawable {
private int mColor;
private Character mLetter = null;
- @ContactType private int mAvatarType = TYPE_DEFAULT;
private String mDisplayName;
public LetterTileDrawable(final Resources res) {
if (sColors == null) {
sColors = res.obtainTypedArray(R.array.letter_tile_colors);
+ sSpamColor = res.getColor(R.color.spam_contact_background);
sDefaultColor = res.getColor(R.color.letter_tile_default_color);
sTileFontColor = res.getColor(R.color.letter_tile_font_color);
sLetterToTileRatio = res.getFraction(R.dimen.letter_to_tile_ratio, 1, 1);
sDefaultPersonAvatar =
- BitmapFactory.decodeResource(
- res, R.drawable.product_logo_avatar_anonymous_white_color_120);
- sDefaultBusinessAvatar =
- BitmapFactory.decodeResource(res, R.drawable.ic_business_white_120dp);
- sDefaultVoicemailAvatar = BitmapFactory.decodeResource(res, R.drawable.ic_voicemail_avatar);
+ res.getDrawable(R.drawable.product_logo_avatar_anonymous_white_color_120, null);
+ sDefaultBusinessAvatar = res.getDrawable(R.drawable.quantum_ic_business_vd_theme_24, null);
+ sDefaultVoicemailAvatar = res.getDrawable(R.drawable.quantum_ic_voicemail_vd_theme_24, null);
+ sDefaultSpamAvatar = res.getDrawable(R.drawable.quantum_ic_report_vd_theme_24, null);
sPaint.setTypeface(
Typeface.create(res.getString(R.string.letter_tile_letter_font_family), Typeface.NORMAL));
sPaint.setTextAlign(Align.CENTER);
@@ -128,12 +133,32 @@ public class LetterTileDrawable extends Drawable {
mColor = sDefaultColor;
}
- private static Bitmap getBitmapForContactType(int contactType) {
+ private Rect getScaledBounds(float scale, float offset) {
+ // The drawable should be drawn in the middle of the canvas without changing its width to
+ // height ratio.
+ final Rect destRect = copyBounds();
+ // Crop the destination bounds into a square, scaled and offset as appropriate
+ final int halfLength = (int) (scale * Math.min(destRect.width(), destRect.height()) / 2);
+
+ destRect.set(
+ destRect.centerX() - halfLength,
+ (int) (destRect.centerY() - halfLength + offset * destRect.height()),
+ destRect.centerX() + halfLength,
+ (int) (destRect.centerY() + halfLength + offset * destRect.height()));
+ return destRect;
+ }
+
+ private Drawable getDrawableForContactType(int contactType) {
switch (contactType) {
case TYPE_BUSINESS:
+ mScale = VECTOR_ICON_SCALE;
return sDefaultBusinessAvatar;
case TYPE_VOICEMAIL:
+ mScale = VECTOR_ICON_SCALE;
return sDefaultVoicemailAvatar;
+ case TYPE_SPAM:
+ mScale = VECTOR_ICON_SCALE;
+ return sDefaultSpamAvatar;
case TYPE_PERSON:
case TYPE_GENERIC_AVATAR:
default:
@@ -163,39 +188,11 @@ public class LetterTileDrawable extends Drawable {
return bitmap;
}
- /**
- * Draw the bitmap onto the canvas at the current bounds taking into account the current scale.
- */
- private void drawBitmap(
- final Bitmap bitmap, final int width, final int height, final Canvas canvas) {
- // The bitmap should be drawn in the middle of the canvas without changing its width to
- // height ratio.
- final Rect destRect = copyBounds();
-
- // Crop the destination bounds into a square, scaled and offset as appropriate
- final int halfLength = (int) (mScale * Math.min(destRect.width(), destRect.height()) / 2);
-
- destRect.set(
- destRect.centerX() - halfLength,
- (int) (destRect.centerY() - halfLength + mOffset * destRect.height()),
- destRect.centerX() + halfLength,
- (int) (destRect.centerY() + halfLength + mOffset * destRect.height()));
-
- // Source rectangle remains the entire bounds of the source bitmap.
- sRect.set(0, 0, width, height);
-
- sPaint.setTextAlign(Align.CENTER);
- sPaint.setAntiAlias(true);
- sPaint.setAlpha(ALPHA);
-
- canvas.drawBitmap(bitmap, sRect, destRect, sPaint);
- }
-
private void drawLetterTile(final Canvas canvas) {
// Draw background color.
sPaint.setColor(mColor);
-
sPaint.setAlpha(mPaint.getAlpha());
+
final Rect bounds = getBounds();
final int minDimension = Math.min(bounds.width(), bounds.height());
@@ -206,7 +203,6 @@ public class LetterTileDrawable extends Drawable {
}
// Draw letter/digit only if the first character is an english letter or there's a override
-
if (mLetter != null) {
// Draw letter or digit.
sFirstChar[0] = mLetter;
@@ -229,8 +225,10 @@ public class LetterTileDrawable extends Drawable {
sPaint);
} else {
// Draw the default image if there is no letter/digit to be drawn
- final Bitmap bitmap = getBitmapForContactType(mContactType);
- drawBitmap(bitmap, bitmap.getWidth(), bitmap.getHeight(), canvas);
+ Drawable drawable = getDrawableForContactType(mContactType);
+ drawable.setBounds(getScaledBounds(mScale, mOffset));
+ drawable.setAlpha(drawable == sDefaultSpamAvatar ? SPAM_ALPHA : ALPHA);
+ drawable.draw(canvas);
}
}
@@ -245,11 +243,16 @@ public class LetterTileDrawable extends Drawable {
/** Returns a deterministic color based on the provided contact identifier string. */
private int pickColor(final String identifier) {
+ if (mContactType == TYPE_SPAM) {
+ return sSpamColor;
+ }
+
if (mContactType == TYPE_VOICEMAIL
|| mContactType == TYPE_BUSINESS
|| TextUtils.isEmpty(identifier)) {
return sDefaultColor;
}
+
// String.hashCode() implementation is not supposed to change across java versions, so
// this should guarantee the same email address always maps to the same color.
// The email should already have been normalized by the ContactRequest.
@@ -321,7 +324,7 @@ public class LetterTileDrawable extends Drawable {
private LetterTileDrawable setLetterAndColorFromContactDetails(
final String displayName, final String identifier) {
- if (displayName != null && displayName.length() > 0 && isEnglishLetter(displayName.charAt(0))) {
+ if (!TextUtils.isEmpty(displayName) && isEnglishLetter(displayName.charAt(0))) {
mLetter = Character.toUpperCase(displayName.charAt(0));
} else {
mLetter = null;
@@ -382,11 +385,10 @@ public class LetterTileDrawable extends Drawable {
}
this.mDisplayName = displayName;
- this.mAvatarType = contactType;
- setContactType(this.mAvatarType);
+ setContactType(contactType);
// Special contact types receive default color and no letter tile, but special iconography.
- if (this.mAvatarType != TYPE_PERSON) {
+ if (contactType != TYPE_PERSON) {
this.setLetterAndColorFromContactDetails(null, null);
} else {
if (identifierForTileColor != null) {
diff --git a/java/com/android/contacts/common/list/OnPhoneNumberPickerActionListener.java b/java/com/android/contacts/common/list/OnPhoneNumberPickerActionListener.java
index 89bd889e6..c75e0a730 100644
--- a/java/com/android/contacts/common/list/OnPhoneNumberPickerActionListener.java
+++ b/java/com/android/contacts/common/list/OnPhoneNumberPickerActionListener.java
@@ -17,13 +17,11 @@ package com.android.contacts.common.list;
import android.app.ActionBar;
import android.net.Uri;
-import com.android.dialer.callintent.nano.CallSpecificAppData;
+import com.android.dialer.callintent.CallSpecificAppData;
/** Action callbacks that can be sent by a phone number picker. */
public interface OnPhoneNumberPickerActionListener {
- int CALL_INITIATION_UNKNOWN = 0;
-
/** Returns the selected phone number uri to the requester. */
void onPickDataUri(Uri dataUri, boolean isVideoCall, CallSpecificAppData callSpecificAppData);
diff --git a/java/com/android/contacts/common/list/PhoneNumberPickerFragment.java b/java/com/android/contacts/common/list/PhoneNumberPickerFragment.java
index 4ae81529b..99c41f92d 100644
--- a/java/com/android/contacts/common/list/PhoneNumberPickerFragment.java
+++ b/java/com/android/contacts/common/list/PhoneNumberPickerFragment.java
@@ -28,7 +28,9 @@ import android.view.View;
import android.view.ViewGroup;
import com.android.contacts.common.R;
import com.android.contacts.common.util.AccountFilterUtil;
-import com.android.dialer.callintent.nano.CallSpecificAppData;
+import com.android.dialer.callintent.CallInitiationType;
+import com.android.dialer.callintent.CallInitiationType.Type;
+import com.android.dialer.callintent.CallSpecificAppData;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.logging.Logger;
@@ -181,11 +183,12 @@ public class PhoneNumberPickerFragment extends ContactEntryListFragment
+
+
+
+ "Tekst je kopiran"
+ "Kopiraj u priv. memoriju"
+ "Pozovi %s"
+ "Pozovi kućni telefon"
+ "Pozovi mobilni telefon"
+ "Pozovi poslovni telefon"
+ "Pozovi poslovni faks"
+ "Pozovi kućni faks"
+ "Pozovi pejdžer"
+ "Pozovi"
+ "Pozovi za povratni poziv"
+ "Pozovi telefon u automobilu"
+ "Pozovi glavni telefon preduzeća"
+ "Pozovi ISDN"
+ "Pozovi glavni telefon"
+ "Pozovi faks"
+ "Pozovi radio"
+ "Pozovi teleks"
+ "Pozovi TTY/TDD"
+ "Pozovi poslovni mobilni telefon"
+ "Pozovi poslovni pejdžer"
+ "Pozovi %s"
+ "Pozovi broj za MMS"
+ "%s (pozovi)"
+ "Pošalji SMS na %s"
+ "Pošalji SMS na kućni telefon"
+ "Pošalji SMS na mobilni telefon"
+ "Pošalji SMS na poslovni telefon"
+ "Pošalji SMS na poslovni faks"
+ "Pošalji SMS na kućni faks"
+ "Pošalji SMS na pejdžer"
+ "Pošalji SMS"
+ "Pošalji SMS za povratni poziv"
+ "Pošalji SMS na telefon u automobilu"
+ "Pošalji SMS na glavni broj telefona preduzeća"
+ "Pošalji SMS na ISDN"
+ "Pošalji SMS na glavni telefon"
+ "Pošalji SMS na faks"
+ "Pošalji SMS na radio"
+ "Pošalji SMS na teleks"
+ "Pošalji SMS na TTY/TDD"
+ "Pošalji SMS na poslovni mobilni telefon"
+ "Pošalji SMS na poslovni pejdžer"
+ "Pošalji SMS na %s"
+ "Pošalji SMS na broj za MMS"
+ "%s (pošalji SMS)"
+ "Brišete često kontaktirane?"
+ "Obrisaćete listu često kontaktiranih u aplikacijama Kontakti i Telefon, pa će imejl aplikacije morati ponovo da prikupe informacije o adresiranju."
+ "Brisanje često kontaktiranih..."
+ "Dostupan/na"
+ "Odsutan/na"
+ "Zauzet/a"
+ "Kontakti"
+ "Drugo"
+ "Direktorijum"
+ "Direktorijum za Work"
+ "Svi kontakti"
+ "Ja"
+ "Pretražuje se…"
+ "Pronađeno je više od %d."
+ "Nema kontakata"
+
+ - Pronađen je %d
+ - Pronađena su %d
+ - Pronađeno je %d
+
+ "Brzi kontakt za korisnika %1$s"
+ "(Nema imena)"
+ "Često pozivani"
+ "Često kontaktirani"
+ "Prikaži kontakt"
+ "Svi kontakti sa brojevima telefona"
+ "Kontakti sa profila za Work"
+ "Prikaži ažuriranja"
+ "Samo na uređaju, ne sinhronizuje se"
+ "Ime"
+ "Nadimak"
+ "Ime"
+ "Imenu"
+ "Prezimenu"
+ "Prefiks za ime"
+ "Srednje ime"
+ "Sufiks imena"
+ "Ime – fonetski"
+ "Ime – fonetski"
+ "Srednje ime – fonetski"
+ "Prezime – fonetski"
+ "Telefon"
+ "Pošalji imejl"
+ "Adresa"
+ "Razmena trenutnih poruka"
+ "Organizacija"
+ "Odnos"
+ "Poseban dan"
+ "SMS"
+ "Adresa"
+ "Preduzeće"
+ "Naziv"
+ "Beleške"
+ "SIP"
+ "Veb-sajt"
+ "Grupe"
+ "Pošalji imejl na kućnu imejl adresu"
+ "Pošalji imejl na mobilni telefon"
+ "Pošalji imejl na poslovnu imejl adresu"
+ "Pošalji imejl"
+ "Pošalji imejl na %s"
+ "Pošalji imejl"
+ "Ulica"
+ "Poštanski fah"
+ "Kraj"
+ "Grad"
+ "Država"
+ "Poštanski broj"
+ "Zemlja"
+ "Prikaži kućnu adresu"
+ "Prikaži poslovnu adresu"
+ "Prikaži adresu"
+ "Prikaži adresu %s"
+ "Započni ćaskanje preko AIM-a"
+ "Započni ćaskanje preko Windows Live-a"
+ "Započni ćaskanje preko Yahoo-a"
+ "Započni ćaskanje preko Skype-a"
+ "Započni ćaskanje preko QQ-a"
+ "Započni ćaskanje preko Google Talk-a"
+ "Započni ćaskanje preko ICQ-a"
+ "Započni ćaskanje preko Jabber-a"
+ "Ćaskanje"
+ "izbriši"
+ "Proširivanje ili skupljanje polja za nazive"
+ "Proširi ili skupi polja za fonetsko ime"
+ "Svi kontakti"
+ "Gotovo"
+ "Otkaži"
+ "Kontakti u grupi %s"
+ "Kontakti u prilagođenom prikazu"
+ "Pojedinačni kontakt"
+ "Sačuvajte uvezene kontakte na:"
+ "Uvezi sa SIM kartice"
+ "Uvoz sa SIM kartice ^1 – ^2"
+ "Uvoz sa SIM kartice %1$s"
+ "Uvezi iz .vcf datoteke"
+ "Želite li da otkažete uvoz datoteke %s?"
+ "Želite li da otkažete izvoz datoteke %s?"
+ "Nije moguće otkazati vCard uvoz/izvoz"
+ "Nepoznata greška."
+ "Nismo uspeli da otvorimo datoteku „%s“: %s."
+ "Nije moguće pokrenuti program za izvoz: „%s“"
+ "Nema kontakata za izvoz."
+ "Onemogućili ste obaveznu dozvolu."
+ "Došlo je do greške pri izvozu: „%s“"
+ "Zahtevani naziv datoteke je predugačak („%s“)."
+ "U/I greška"
+ "Nema dovoljno memorije. Datoteka je možda prevelika."
+ "Iz neočekivanog razloga nije moguće raščlaniti vCard datoteku."
+ "Format nije podržan."
+ "Nije moguće prikupiti metapodatke navedenih vCard datoteka."
+ "Nije moguć uvoz jedne ili više datoteka (%s)."
+ "Izvoz datoteke %s je završen."
+ "Izvoz kontakata je završen."
+ "Izvoz kontakata je završen. Kliknite na obaveštenje da biste ih delili."
+ "Dodirnite da biste delili kontakte."
+ "Izvoz datoteke %s je otkazan."
+ "Izvoz podataka o kontaktima je u toku"
+ "Podaci o kontaktima se izvoze."
+ "Preuzimanje informacija iz baze podataka nije moguće."
+ "Nema kontakata za izvoz. Ako imate kontakte na uređaju, neki dobavljači podataka možda ne dozvoljavaju izvoz kontakata sa uređaja."
+ "Program za izradu vCard datoteka se nije ispravno pokrenuo."
+ "Izvoz nije moguć"
+ "Podaci o kontaktima nizu izvezeni.\nRazlog: „%s“"
+ "Uvoz kontakta %s"
+ "Čitanje vCard podataka nije moguće"
+ "Čitanje vCard podataka je otkazano"
+ "Uvoz vCard datoteke %s je završen"
+ "Uvoz datoteke %s je otkazan"
+ "Datoteka %s će uskoro biti uvezena."
+ "Datoteka će uskoro biti uvezena."
+ "Zahtev za uvoz vCard datoteke je odbijen. Probajte ponovo kasnije."
+ "Datoteka %s će uskoro biti izvezena."
+ "Datoteka će uskoro biti izvezena."
+ "Kontakti će uskoro biti izvezeni."
+ "Zahtev za izvoz vCard datoteke je odbijen. Probajte ponovo kasnije."
+ "kontakt"
+ "Keširanje vCard datoteka u lokalnu privremenu memoriju. Uvoz će uskoro započeti."
+ "Uvoz vCard datoteke nije moguć."
+ "Kontakt preko NFC-a"
+ "Želite li da izvezete kontakte?"
+ "Keširanje"
+ "Uvozimo %s/%s: %s"
+ "Izvezi u .vcf datoteku"
+ "Sortiraj prema"
+ "Imenu"
+ "Prezimenu"
+ "Format imena i prezimena"
+ "Prvo ime"
+ "Prvo prezime"
+ "Podrazumevani nalog za nove kontakte"
+ "Sinhronizujte metapodatke kontakata"
+ "O Kontaktima"
+ "Podešavanja"
+ "Deli vidljive kontakte"
+ "Nije uspelo deljenje vidljivih kontakata."
+ "Deli omiljene kontakte"
+ "Deli sve kontakte"
+ "Deljenje kontakata nije uspelo."
+ "Uvoz/izvoz kontakata"
+ "Uvezi kontakte"
+ "Ovaj kontakt ne može da se deli."
+ "Nema kontakata za deljenje."
+ "Pretraži"
+ "Pronađite kontakte"
+ "Omiljeno"
+ "Nema kontakata."
+ "Nema vidljivih kontakata."
+ "Nema omiljenih"
+ "Nema kontakata u grupi %s"
+ "Obriši često kontaktirane"
+ "Izaberite SIM karticu"
+ "Upravljaj nalozima"
+ "Uvezi/izvezi"
+ "preko %1$s"
+ "%1$s preko %2$s"
+ "zaustavljanje pretraživanja"
+ "Brisanje pretrage"
+ "Opcije prikazivanja kontakata"
+ "Nalog"
+ "Uvek koristi ovo za pozive"
+ "Pozovi pomoću"
+ "Poziv sa beleškom"
+ "Unesite belešku koju ćete poslati uz poziv..."
+ "POŠALJI I POZOVI"
+ "%1$s/%2$s"
+ "%1$s • %2$s"
+ "Kartica %1$s."
+
+ - Kartica %1$s. %2$d nepročitana stavka.
+ - Kartica %1$s. %2$d nepročitane stavke.
+ - Kartica %1$s. %2$d nepročitanih stavki.
+
+ "Verzija"
+ "Licence otvorenog koda"
+ "Detalji licence za softver otvorenog koda"
+ "Politika privatnosti"
+ "Uslovi korišćenja usluge"
+ "Licence otvorenog koda"
+ "Otvaranje URL-a nije uspelo."
+ "Uputi video poziv"
+
diff --git a/java/com/android/contacts/common/res/values/colors.xml b/java/com/android/contacts/common/res/values/colors.xml
index 7524eff58..434d193c7 100644
--- a/java/com/android/contacts/common/res/values/colors.xml
+++ b/java/com/android/contacts/common/res/values/colors.xml
@@ -20,6 +20,8 @@
#44ff0000
+ #A52714
+
#a0ffffff
diff --git a/java/com/android/dialer/app/AndroidManifest.xml b/java/com/android/dialer/app/AndroidManifest.xml
index 67290b591..5b7e75751 100644
--- a/java/com/android/dialer/app/AndroidManifest.xml
+++ b/java/com/android/dialer/app/AndroidManifest.xml
@@ -109,6 +109,16 @@
+
+
+
+
+
+
+
+
+
selectedItems = new SparseArray<>();
private final ActionMode.Callback mActionModeCallback =
new ActionMode.Callback() {
@@ -155,7 +157,15 @@ public class CallLogAdapter extends GroupingListAdapter
// Called when the user selects a contextual menu item
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
- return false;
+ if (item.getItemId() == R.id.action_bar_delete_menu_item) {
+ if (selectedItems.size() > 0) {
+ showDeleteSelectedItemsDialog();
+ }
+ mode.finish();
+ return true;
+ } else {
+ return false;
+ }
}
// Called when the user exits the action mode
@@ -167,14 +177,66 @@ public class CallLogAdapter extends GroupingListAdapter
}
};
+ private void showDeleteSelectedItemsDialog() {
+ AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
+ Assert.checkArgument(selectedItems.size() > 0);
+ String voicemailString =
+ selectedItems.size() == 1
+ ? mActivity.getResources().getString(R.string.voicemailMultiSelectVoicemail)
+ : mActivity.getResources().getString(R.string.voicemailMultiSelectVoicemail);
+ String deleteVoicemailTitle =
+ mActivity
+ .getResources()
+ .getString(R.string.voicemailMultiSelectDialogTitle, voicemailString);
+ SparseArray voicemailsToDeleteOnConfirmation = selectedItems.clone();
+ builder.setTitle(deleteVoicemailTitle);
+
+ builder.setPositiveButton(
+ mActivity.getResources().getString(R.string.voicemailMultiSelectDeleteConfirm),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int id) {
+ deleteSelectedItems(voicemailsToDeleteOnConfirmation);
+ dialog.cancel();
+ }
+ });
+
+ builder.setNegativeButton(
+ mActivity.getResources().getString(R.string.voicemailMultiSelectDeleteCancel),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int id) {
+ dialog.cancel();
+ }
+ });
+
+ AlertDialog dialog = builder.create();
+ dialog.show();
+ }
+
+ private void deleteSelectedItems(SparseArray voicemailsToDelete) {
+ for (int i = 0; i < voicemailsToDelete.size(); i++) {
+ String voicemailUri = voicemailsToDelete.get(voicemailsToDelete.keyAt(i));
+ CallLogAsyncTaskUtil.deleteVoicemail(mActivity, Uri.parse(voicemailUri), null);
+ }
+ }
+
private final View.OnLongClickListener mLongPressListener =
new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (ConfigProviderBindings.get(v.getContext())
- .getBoolean("enable_call_log_multiselect", false)) {
- v.startActionMode(mActionModeCallback);
- return false;
+ .getBoolean("enable_call_log_multiselect", true)
+ && mVoicemailPlaybackPresenter != null) {
+ if (v.getId() == R.id.primary_action_view) {
+ if (mActionMode == null) {
+ mActionMode = v.startActionMode(mActionModeCallback);
+ }
+ CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder) v.getTag();
+ viewHolder.quickContactView.setVisibility(View.GONE);
+ viewHolder.checkBoxView.setVisibility(View.VISIBLE);
+ return false;
+ }
}
return true;
}
@@ -190,15 +252,20 @@ public class CallLogAdapter extends GroupingListAdapter
return;
}
if (mActionMode != null && viewHolder.voicemailUri != null) {
- if (selectedItems.get((int) ContentUris.parseId(Uri.parse(viewHolder.voicemailUri)))) {
- selectedItems.delete((int) ContentUris.parseId(Uri.parse(viewHolder.voicemailUri)));
+ int id = getVoicemailId(viewHolder.voicemailUri);
+ if (selectedItems.get(id) != null) {
+ selectedItems.delete(id);
viewHolder.checkBoxView.setVisibility(View.GONE);
viewHolder.quickContactView.setVisibility(View.VISIBLE);
} else {
viewHolder.quickContactView.setVisibility(View.GONE);
viewHolder.checkBoxView.setVisibility(View.VISIBLE);
- selectedItems.put(
- (int) ContentUris.parseId(Uri.parse(viewHolder.voicemailUri)), true);
+ selectedItems.put(getVoicemailId(viewHolder.voicemailUri), viewHolder.voicemailUri);
+ }
+
+ if (selectedItems.size() == 0) {
+ mActionMode.finish();
+ return;
}
mActionMode.setTitle(Integer.toString(selectedItems.size()));
return;
@@ -216,12 +283,10 @@ public class CallLogAdapter extends GroupingListAdapter
getEnrichedCallManager().getCapabilities(viewHolder.number);
viewHolder.isCallComposerCapable =
capabilities != null && capabilities.supportsCallComposer();
-
- CallDetailsEntries callDetailsEntries = viewHolder.getDetailedPhoneDetails();
- setCallDetailsEntriesHistoryResults(
+ generateAndMapNewCallDetailsEntriesHistoryResults(
viewHolder.number,
- callDetailsEntries,
- getAllHistoricalData(viewHolder.number, callDetailsEntries));
+ viewHolder.getDetailedPhoneDetails(),
+ getAllHistoricalData(viewHolder.number, viewHolder.getDetailedPhoneDetails()));
if (viewHolder.rowId == mCurrentlyExpandedRowId) {
// Hide actions, if the clicked item is the expanded item.
@@ -241,6 +306,12 @@ public class CallLogAdapter extends GroupingListAdapter
}
};
+ private static int getVoicemailId(String voicemailUri) {
+ Assert.checkArgument(voicemailUri != null);
+ Assert.checkArgument(voicemailUri.length() > 0);
+ return (int) ContentUris.parseId(Uri.parse(voicemailUri));
+ }
+
/**
* A list of {@link CallLogQuery#ID} that will be hidden. The hide might be temporary so instead
* if removing an item, it will be shown as an invisible view. This simplifies the calculation of
@@ -547,9 +618,12 @@ public class CallLogAdapter extends GroupingListAdapter
// the value will be false while capabilities are requested. mExpandCollapseListener will
// attempt to set the field properly in that case
views.isCallComposerCapable = isCallComposerCapable(views.number);
- setCallDetailsEntriesHistoryResults(
- views.number, callDetailsEntries, getAllHistoricalData(views.number, callDetailsEntries));
- views.setDetailedPhoneDetails(callDetailsEntries);
+ CallDetailsEntries updatedCallDetailsEntries =
+ generateAndMapNewCallDetailsEntriesHistoryResults(
+ views.number,
+ callDetailsEntries,
+ getAllHistoricalData(views.number, callDetailsEntries));
+ views.setDetailedPhoneDetails(updatedCallDetailsEntries);
views.lightbringerReady = getLightbringer().isReachable(mActivity, views.number);
final AsyncTask loadDataTask =
new AsyncTask() {
@@ -625,23 +699,27 @@ public class CallLogAdapter extends GroupingListAdapter
return historicalData;
}
- private void setCallDetailsEntriesHistoryResults(
+ private static CallDetailsEntries generateAndMapNewCallDetailsEntriesHistoryResults(
@Nullable String number,
@NonNull CallDetailsEntries callDetailsEntries,
@NonNull Map> mappedResults) {
if (number == null) {
- return;
+ return callDetailsEntries;
}
- for (CallDetailsEntry entry : callDetailsEntries.entries) {
+ CallDetailsEntries.Builder mutableCallDetailsEntries = CallDetailsEntries.newBuilder();
+ for (CallDetailsEntry entry : callDetailsEntries.getEntriesList()) {
+ CallDetailsEntry.Builder newEntry = CallDetailsEntry.newBuilder().mergeFrom(entry);
List results = mappedResults.get(entry);
if (results != null) {
- entry.historyResults = mappedResults.get(entry).toArray(new HistoryResult[0]);
+ newEntry.addAllHistoryResults(mappedResults.get(entry));
LogUtil.v(
- "CallLogAdapter.setCallDetailsEntriesHistoryResults",
+ "CallLogAdapter.generateAndMapNewCallDetailsEntriesHistoryResults",
"mapped %d results",
- entry.historyResults.length);
+ newEntry.getHistoryResultsList().size());
}
+ mutableCallDetailsEntries.addEntries(newEntry.build());
}
+ return mutableCallDetailsEntries.build();
}
/**
@@ -703,21 +781,21 @@ public class CallLogAdapter extends GroupingListAdapter
private static CallDetailsEntries createCallDetailsEntries(Cursor cursor, int count) {
Assert.isMainThread();
int position = cursor.getPosition();
- CallDetailsEntries entries = new CallDetailsEntries();
- entries.entries = new CallDetailsEntry[count];
+ CallDetailsEntries.Builder entries = CallDetailsEntries.newBuilder();
for (int i = 0; i < count; i++) {
- CallDetailsEntry entry = new CallDetailsEntry();
- entry.callId = cursor.getLong(CallLogQuery.ID);
- entry.callType = cursor.getInt(CallLogQuery.CALL_TYPE);
- entry.dataUsage = cursor.getLong(CallLogQuery.DATA_USAGE);
- entry.date = cursor.getLong(CallLogQuery.DATE);
- entry.duration = cursor.getLong(CallLogQuery.DURATION);
- entry.features |= cursor.getInt(CallLogQuery.FEATURES);
- entries.entries[i] = entry;
+ CallDetailsEntry.Builder entry =
+ CallDetailsEntry.newBuilder()
+ .setCallId(cursor.getLong(CallLogQuery.ID))
+ .setCallType(cursor.getInt(CallLogQuery.CALL_TYPE))
+ .setDataUsage(cursor.getLong(CallLogQuery.DATA_USAGE))
+ .setDate(cursor.getLong(CallLogQuery.DATE))
+ .setDuration(cursor.getLong(CallLogQuery.DURATION))
+ .setFeatures(cursor.getInt(CallLogQuery.FEATURES));
+ entries.addEntries(entry.build());
cursor.moveToNext();
}
cursor.moveToPosition(position);
- return entries;
+ return entries.build();
}
/**
@@ -822,7 +900,7 @@ public class CallLogAdapter extends GroupingListAdapter
details.contactUserType == ContactsUtils.USER_TYPE_WORK ? View.VISIBLE : View.GONE);
if (views.voicemailUri != null
- && selectedItems.get((int) ContentUris.parseId(Uri.parse(views.voicemailUri)))) {
+ && selectedItems.get(getVoicemailId(views.voicemailUri)) != null) {
views.checkBoxView.setVisibility(View.VISIBLE);
views.quickContactView.setVisibility(View.GONE);
} else if (views.voicemailUri != null) {
diff --git a/java/com/android/dialer/app/calllog/CallLogListItemHelper.java b/java/com/android/dialer/app/calllog/CallLogListItemHelper.java
index a5df8cca1..ac43b9ea7 100644
--- a/java/com/android/dialer/app/calllog/CallLogListItemHelper.java
+++ b/java/com/android/dialer/app/calllog/CallLogListItemHelper.java
@@ -269,7 +269,7 @@ import com.android.dialer.compat.AppCompatConstants;
if (!TextUtils.isEmpty(details.getPreferredName())) {
recipient = details.getPreferredName();
} else {
- recipient = details.displayNumber + details.postDialDigits;
+ recipient = details.displayNumber;
}
return recipient;
}
diff --git a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
index 9adcddb3c..b57f9b04a 100644
--- a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
+++ b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
@@ -22,6 +22,7 @@ import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.os.AsyncTask;
+import android.provider.CallLog;
import android.provider.CallLog.Calls;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.support.annotation.NonNull;
@@ -31,7 +32,10 @@ import android.support.v7.widget.RecyclerView;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
import android.telephony.PhoneNumberUtils;
+import android.text.BidiFormatter;
+import android.text.TextDirectionHeuristics;
import android.text.TextUtils;
+import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewStub;
@@ -41,7 +45,7 @@ import android.widget.QuickContactBadge;
import android.widget.TextView;
import com.android.contacts.common.ClipboardUtils;
import com.android.contacts.common.ContactPhotoManager;
-import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
+import com.android.contacts.common.compat.PhoneNumberUtilsCompat;
import com.android.contacts.common.dialog.CallSubjectDialog;
import com.android.contacts.common.util.UriUtils;
import com.android.dialer.app.DialtactsActivity;
@@ -53,14 +57,16 @@ import com.android.dialer.blocking.BlockedNumbersMigrator;
import com.android.dialer.blocking.FilteredNumberCompat;
import com.android.dialer.blocking.FilteredNumbersUtil;
import com.android.dialer.callcomposer.CallComposerActivity;
-import com.android.dialer.callcomposer.nano.CallComposerContact;
-import com.android.dialer.calldetails.nano.CallDetailsEntries;
+import com.android.dialer.callcomposer.CallComposerContact;
+import com.android.dialer.calldetails.CallDetailsEntries;
import com.android.dialer.common.LogUtil;
import com.android.dialer.compat.CompatUtils;
import com.android.dialer.lightbringer.Lightbringer;
import com.android.dialer.lightbringer.LightbringerComponent;
+import com.android.dialer.logging.ContactSource;
+import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
+import com.android.dialer.logging.ScreenEvent;
import com.android.dialer.phonenumbercache.CachedNumberLookupService;
import com.android.dialer.phonenumbercache.ContactInfo;
import com.android.dialer.phonenumbercache.PhoneNumberCache;
@@ -76,7 +82,9 @@ import com.android.dialer.util.DialerUtils;
* CallLogAdapter.
*/
public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
- implements View.OnClickListener, MenuItem.OnMenuItemClickListener {
+ implements View.OnClickListener,
+ MenuItem.OnMenuItemClickListener,
+ View.OnCreateContextMenuListener {
/** The root view of the call log list item */
public final View rootView;
/** The quick contact badge for the contact. */
@@ -98,7 +106,6 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
private final CachedNumberLookupService mCachedNumberLookupService;
private final VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
private final OnClickListener mBlockReportListener;
- private final int mPhotoSize;
/** Whether the data fields are populated by the worker thread, ready to be shown. */
public boolean isLoaded;
/** The view containing call log item actions. Null until the ViewStub is inflated. */
@@ -237,7 +244,6 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
this.primaryActionButtonView = primaryActionButtonView;
this.workIconView = (ImageView) rootView.findViewById(R.id.work_profile_icon);
this.checkBoxView = (ImageView) rootView.findViewById(R.id.quick_contact_checkbox);
- mPhotoSize = mContext.getResources().getDimensionPixelSize(R.dimen.contact_photo_size);
// Set text height to false on the TextViews so they don't have extra padding.
phoneCallDetailsViews.nameView.setElegantTextHeight(false);
@@ -249,7 +255,11 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
}
primaryActionButtonView.setOnClickListener(this);
primaryActionView.setOnClickListener(mExpandCollapseListener);
- primaryActionView.setOnLongClickListener(longPressListener);
+ if (mVoicemailPlaybackPresenter != null) {
+ primaryActionView.setOnLongClickListener(longPressListener);
+ } else {
+ primaryActionView.setOnCreateContextMenuListener(this);
+ }
}
public static CallLogListItemViewHolder create(
@@ -689,36 +699,23 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
return;
}
- final String lookupKey =
- info.lookupUri != null ? UriUtils.getLookupKeyFromUri(info.lookupUri) : null;
final String displayName = TextUtils.isEmpty(info.name) ? displayNumber : info.name;
- final DefaultImageRequest request =
- new DefaultImageRequest(displayName, lookupKey, getContactType(), true /* isCircular */);
-
- if (info.photoId == 0 && info.photoUri != null) {
- ContactPhotoManager.getInstance(mContext)
- .loadPhoto(
- quickContactView,
- info.photoUri,
- mPhotoSize,
- false /* darkTheme */,
- true /* isCircular */,
- request);
- } else {
- ContactPhotoManager.getInstance(mContext)
- .loadThumbnail(
- quickContactView,
- info.photoId,
- false /* darkTheme */,
- true /* isCircular */,
- request);
- }
+ ContactPhotoManager.getInstance(mContext)
+ .loadDialerThumbnailOrPhoto(
+ quickContactView,
+ info.lookupUri,
+ info.photoId,
+ info.photoUri,
+ displayName,
+ getContactType());
}
private int getContactType() {
int contactType = ContactPhotoManager.TYPE_DEFAULT;
if (mCallLogCache.isVoicemailNumber(accountHandle, number)) {
contactType = ContactPhotoManager.TYPE_VOICEMAIL;
+ } else if (isSpam) {
+ contactType = ContactPhotoManager.TYPE_SPAM;
} else if (mCachedNumberLookupService != null
&& mCachedNumberLookupService.isBusiness(info.sourceType)) {
contactType = ContactPhotoManager.TYPE_BUSINESS;
@@ -742,6 +739,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
CallSubjectDialog.start(
(Activity) mContext,
info.photoId,
+ info.photoUri,
info.lookupUri,
(String) nameOrNumber /* top line of contact view in call subject dialog */,
number,
@@ -802,18 +800,24 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
}
private CallComposerContact buildContact() {
- CallComposerContact contact = new CallComposerContact();
- contact.photoId = info.photoId;
- contact.photoUri = info.photoUri == null ? null : info.photoUri.toString();
- contact.contactUri = info.lookupUri == null ? null : info.lookupUri.toString();
- contact.nameOrNumber = (String) nameOrNumber;
- contact.contactType = getContactType();
- contact.number = number;
+ CallComposerContact.Builder contact = CallComposerContact.newBuilder();
+ contact.setPhotoId(info.photoId);
+ if (info.photoUri != null) {
+ contact.setPhotoUri(info.photoUri.toString());
+ }
+ if (info.lookupUri != null) {
+ contact.setContactUri(info.lookupUri.toString());
+ }
+ contact.setNameOrNumber((String) nameOrNumber);
+ contact.setContactType(getContactType());
+ contact.setNumber(number);
/* second line of contact view. */
- contact.displayNumber = TextUtils.isEmpty(info.name) ? null : displayNumber;
+ if (!TextUtils.isEmpty(info.name)) {
+ contact.setDisplayNumber(displayNumber);
+ }
/* phone number type (e.g. mobile) in second line of contact view */
- contact.numberLabel = numberType;
- return contact;
+ contact.setNumberLabel(numberType);
+ return contact.build();
}
private void logCallLogAction(int id) {
@@ -876,6 +880,104 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
return LightbringerComponent.get(mContext).getLightbringer();
}
+ @Override
+ public void onCreateContextMenu(
+ final ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
+ if (TextUtils.isEmpty(number)) {
+ return;
+ }
+
+ if (callType == CallLog.Calls.VOICEMAIL_TYPE) {
+ menu.setHeaderTitle(mContext.getResources().getText(R.string.voicemail));
+ } else {
+ menu.setHeaderTitle(
+ PhoneNumberUtilsCompat.createTtsSpannable(
+ BidiFormatter.getInstance().unicodeWrap(number, TextDirectionHeuristics.LTR)));
+ }
+
+ menu.add(
+ ContextMenu.NONE,
+ R.id.context_menu_copy_to_clipboard,
+ ContextMenu.NONE,
+ R.string.action_copy_number_text)
+ .setOnMenuItemClickListener(this);
+
+ // The edit number before call does not show up if any of the conditions apply:
+ // 1) Number cannot be called
+ // 2) Number is the voicemail number
+ // 3) Number is a SIP address
+
+ if (PhoneNumberHelper.canPlaceCallsTo(number, numberPresentation)
+ && !mCallLogCache.isVoicemailNumber(accountHandle, number)
+ && !PhoneNumberHelper.isSipNumber(number)) {
+ menu.add(
+ ContextMenu.NONE,
+ R.id.context_menu_edit_before_call,
+ ContextMenu.NONE,
+ R.string.action_edit_number_before_call)
+ .setOnMenuItemClickListener(this);
+ }
+
+ if (callType == CallLog.Calls.VOICEMAIL_TYPE
+ && phoneCallDetailsViews.voicemailTranscriptionView.length() > 0) {
+ menu.add(
+ ContextMenu.NONE,
+ R.id.context_menu_copy_transcript_to_clipboard,
+ ContextMenu.NONE,
+ R.string.copy_transcript_text)
+ .setOnMenuItemClickListener(this);
+ }
+
+ String e164Number = PhoneNumberUtils.formatNumberToE164(number, countryIso);
+ boolean isVoicemailNumber = mCallLogCache.isVoicemailNumber(accountHandle, number);
+ if (!isVoicemailNumber
+ && FilteredNumbersUtil.canBlockNumber(mContext, e164Number, number)
+ && FilteredNumberCompat.canAttemptBlockOperations(mContext)) {
+ boolean isBlocked = blockId != null;
+ if (isBlocked) {
+ menu.add(
+ ContextMenu.NONE,
+ R.id.context_menu_unblock,
+ ContextMenu.NONE,
+ R.string.call_log_action_unblock_number)
+ .setOnMenuItemClickListener(this);
+ } else {
+ if (isSpamFeatureEnabled) {
+ if (isSpam) {
+ menu.add(
+ ContextMenu.NONE,
+ R.id.context_menu_report_not_spam,
+ ContextMenu.NONE,
+ R.string.call_log_action_remove_spam)
+ .setOnMenuItemClickListener(this);
+ menu.add(
+ ContextMenu.NONE,
+ R.id.context_menu_block,
+ ContextMenu.NONE,
+ R.string.call_log_action_block_number)
+ .setOnMenuItemClickListener(this);
+ } else {
+ menu.add(
+ ContextMenu.NONE,
+ R.id.context_menu_block_report_spam,
+ ContextMenu.NONE,
+ R.string.call_log_action_block_report_number)
+ .setOnMenuItemClickListener(this);
+ }
+ } else {
+ menu.add(
+ ContextMenu.NONE,
+ R.id.context_menu_block,
+ ContextMenu.NONE,
+ R.string.call_log_action_block_number)
+ .setOnMenuItemClickListener(this);
+ }
+ }
+ }
+
+ Logger.get(mContext).logScreenView(ScreenEvent.Type.CALL_LOG_CONTEXT_MENU, (Activity) mContext);
+ }
+
public interface OnClickListener {
void onBlockReportSpam(
@@ -883,21 +985,21 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
String number,
String countryIso,
int callType,
- int contactSourceType);
+ ContactSource.Type contactSourceType);
void onBlock(
String displayNumber,
String number,
String countryIso,
int callType,
- int contactSourceType);
+ ContactSource.Type contactSourceType);
void onUnblock(
String displayNumber,
String number,
String countryIso,
int callType,
- int contactSourceType,
+ ContactSource.Type contactSourceType,
boolean isSpam,
Integer blockId);
@@ -906,6 +1008,6 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
String number,
String countryIso,
int callType,
- int contactSourceType);
+ ContactSource.Type contactSourceType);
}
}
diff --git a/java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java b/java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java
index dfe5776d8..0007d1863 100644
--- a/java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java
+++ b/java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java
@@ -16,6 +16,7 @@
package com.android.dialer.app.calllog;
+import android.annotation.TargetApi;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
@@ -26,11 +27,17 @@ import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
+import android.os.PersistableBundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
+import android.support.v4.os.BuildCompat;
import android.support.v4.util.Pair;
+import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
+import android.telecom.TelecomManager;
+import android.telephony.CarrierConfigManager;
+import android.telephony.PhoneNumberUtils;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.ArrayMap;
@@ -42,9 +49,11 @@ import com.android.dialer.app.calllog.CallLogNotificationsQueryHelper.NewCall;
import com.android.dialer.app.contactinfo.ContactPhotoLoader;
import com.android.dialer.app.list.DialtactsPagerAdapter;
import com.android.dialer.blocking.FilteredNumbersUtil;
+import com.android.dialer.calllogutils.PhoneAccountUtils;
+import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
import com.android.dialer.notification.NotificationChannelManager;
import com.android.dialer.notification.NotificationChannelManager.Channel;
import com.android.dialer.phonenumbercache.ContactInfo;
@@ -58,9 +67,12 @@ public class DefaultVoicemailNotifier {
public static final String TAG = "VoicemailNotifier";
/** The tag used to identify notifications from this class. */
- static final String NOTIFICATION_TAG = "DefaultVoicemailNotifier";
+ static final String VISUAL_VOICEMAIL_NOTIFICATION_TAG = "DefaultVoicemailNotifier";
/** The identifier of the notification of new voicemails. */
- private static final int NOTIFICATION_ID = R.id.notification_voicemail;
+ private static final int VISUAL_VOICEMAIL_NOTIFICATION_ID = R.id.notification_visual_voicemail;
+
+ private static final int LEGACY_VOICEMAIL_NOTIFICATION_ID = R.id.notification_legacy_voicemail;
+ private static final String LEGACY_VOICEMAIL_NOTIFICATION_TAG = "legacy_voicemail";
private final Context context;
private final CallLogNotificationsQueryHelper queryHelper;
@@ -159,18 +171,102 @@ public class DefaultVoicemailNotifier {
Channel.VOICEMAIL,
PhoneAccountHandles.getAccount(context, newCalls.get(0)));
- LogUtil.i(TAG, "Creating voicemail notification");
- getNotificationManager().notify(NOTIFICATION_TAG, NOTIFICATION_ID, groupSummary.build());
+ LogUtil.i(TAG, "Creating visual voicemail notification");
+ getNotificationManager()
+ .notify(
+ VISUAL_VOICEMAIL_NOTIFICATION_TAG,
+ VISUAL_VOICEMAIL_NOTIFICATION_ID,
+ groupSummary.build());
for (NewCall voicemail : newCalls) {
getNotificationManager()
.notify(
voicemail.callsUri.toString(),
- NOTIFICATION_ID,
+ VISUAL_VOICEMAIL_NOTIFICATION_ID,
createNotificationForVoicemail(voicemail, contactInfos));
}
}
+ /**
+ * Replicates how packages/services/Telephony/NotificationMgr.java handles legacy voicemail
+ * notification. The notification will not be stackable because no information is available for
+ * individual voicemails.
+ */
+ @TargetApi(VERSION_CODES.O)
+ public void notifyLegacyVoicemail(
+ @NonNull PhoneAccountHandle phoneAccountHandle,
+ int count,
+ String voicemailNumber,
+ PendingIntent callVoicemailIntent,
+ PendingIntent voicemailSettingIntent) {
+ Assert.isNotNull(phoneAccountHandle);
+ Assert.checkArgument(BuildCompat.isAtLeastO());
+ TelephonyManager telephonyManager =
+ context
+ .getSystemService(TelephonyManager.class)
+ .createForPhoneAccountHandle(phoneAccountHandle);
+ Assert.isNotNull(telephonyManager);
+ LogUtil.i(TAG, "Creating legacy voicemail notification");
+
+ PersistableBundle carrierConfig = telephonyManager.getCarrierConfig();
+
+ String notificationTitle =
+ context
+ .getResources()
+ .getQuantityString(R.plurals.notification_voicemail_title, count, count);
+
+ TelecomManager telecomManager = context.getSystemService(TelecomManager.class);
+ PhoneAccount phoneAccount = telecomManager.getPhoneAccount(phoneAccountHandle);
+
+ String notificationText;
+ PendingIntent pendingIntent;
+
+ if (voicemailSettingIntent != null) {
+ // If the voicemail number if unknown, instead of calling voicemail, take the user
+ // to the voicemail settings.
+ notificationText = context.getString(R.string.notification_voicemail_no_vm_number);
+ pendingIntent = voicemailSettingIntent;
+ } else {
+ if (PhoneAccountUtils.getSubscriptionPhoneAccounts(context).size() > 1) {
+ notificationText = phoneAccount.getShortDescription().toString();
+ } else {
+ notificationText =
+ String.format(
+ context.getString(R.string.notification_voicemail_text_format),
+ PhoneNumberUtils.formatNumber(voicemailNumber));
+ }
+ pendingIntent = callVoicemailIntent;
+ }
+ Notification.Builder builder = new Notification.Builder(context);
+ builder
+ .setSmallIcon(android.R.drawable.stat_notify_voicemail)
+ .setColor(context.getColor(R.color.dialer_theme_color))
+ .setWhen(System.currentTimeMillis())
+ .setContentTitle(notificationTitle)
+ .setContentText(notificationText)
+ .setContentIntent(pendingIntent)
+ .setSound(telephonyManager.getVoicemailRingtoneUri(phoneAccountHandle))
+ .setOngoing(
+ carrierConfig.getBoolean(
+ CarrierConfigManager.KEY_VOICEMAIL_NOTIFICATION_PERSISTENT_BOOL));
+
+ if (telephonyManager.isVoicemailVibrationEnabled(phoneAccountHandle)) {
+ builder.setDefaults(Notification.DEFAULT_VIBRATE);
+ }
+
+ NotificationChannelManager.applyChannel(
+ builder, context, Channel.VOICEMAIL, phoneAccountHandle);
+ Notification notification = builder.build();
+ getNotificationManager()
+ .notify(LEGACY_VOICEMAIL_NOTIFICATION_TAG, LEGACY_VOICEMAIL_NOTIFICATION_ID, notification);
+ }
+
+ public void cancelLegacyNotification() {
+ LogUtil.i(TAG, "Clearing legacy voicemail notification");
+ getNotificationManager()
+ .cancel(LEGACY_VOICEMAIL_NOTIFICATION_TAG, LEGACY_VOICEMAIL_NOTIFICATION_ID);
+ }
+
/**
* Determines which ringtone Uri and Notification defaults to use when updating the notification
* for the given call.
@@ -268,7 +364,7 @@ public class DefaultVoicemailNotifier {
return new Notification.Builder(context)
.setSmallIcon(android.R.drawable.stat_notify_voicemail)
.setColor(context.getColor(R.color.dialer_theme_color))
- .setGroup(NOTIFICATION_TAG)
+ .setGroup(VISUAL_VOICEMAIL_NOTIFICATION_TAG)
.setOnlyAlertOnce(true)
.setAutoCancel(true);
}
diff --git a/java/com/android/dialer/app/calllog/IntentProvider.java b/java/com/android/dialer/app/calllog/IntentProvider.java
index 8b77c3f51..a94c6781e 100644
--- a/java/com/android/dialer/app/calllog/IntentProvider.java
+++ b/java/com/android/dialer/app/calllog/IntentProvider.java
@@ -24,11 +24,11 @@ import android.provider.ContactsContract;
import android.telecom.PhoneAccountHandle;
import com.android.contacts.common.model.Contact;
import com.android.contacts.common.model.ContactLoader;
-import com.android.dialer.callcomposer.nano.CallComposerContact;
+import com.android.dialer.callcomposer.CallComposerContact;
import com.android.dialer.calldetails.CallDetailsActivity;
-import com.android.dialer.calldetails.nano.CallDetailsEntries;
+import com.android.dialer.calldetails.CallDetailsEntries;
+import com.android.dialer.callintent.CallInitiationType;
import com.android.dialer.callintent.CallIntentBuilder;
-import com.android.dialer.callintent.nano.CallInitiationType;
import com.android.dialer.lightbringer.LightbringerComponent;
import com.android.dialer.util.CallUtil;
import com.android.dialer.util.IntentUtil;
diff --git a/java/com/android/dialer/app/calllog/MissedCallNotifier.java b/java/com/android/dialer/app/calllog/MissedCallNotifier.java
index aa04d81eb..de07bb437 100644
--- a/java/com/android/dialer/app/calllog/MissedCallNotifier.java
+++ b/java/com/android/dialer/app/calllog/MissedCallNotifier.java
@@ -41,8 +41,8 @@ import com.android.dialer.app.R;
import com.android.dialer.app.calllog.CallLogNotificationsQueryHelper.NewCall;
import com.android.dialer.app.contactinfo.ContactPhotoLoader;
import com.android.dialer.app.list.DialtactsPagerAdapter;
+import com.android.dialer.callintent.CallInitiationType;
import com.android.dialer.callintent.CallIntentBuilder;
-import com.android.dialer.callintent.nano.CallInitiationType;
import com.android.dialer.common.LogUtil;
import com.android.dialer.notification.NotificationChannelManager;
import com.android.dialer.notification.NotificationChannelManager.Channel;
diff --git a/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java b/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java
index bc78eda02..0c720775a 100644
--- a/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java
+++ b/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java
@@ -25,13 +25,14 @@ import android.support.v4.content.ContextCompat;
import android.telecom.PhoneAccount;
import android.text.TextUtils;
import android.text.format.DateUtils;
+import android.text.util.Linkify;
import android.view.View;
import android.widget.TextView;
import com.android.dialer.app.R;
import com.android.dialer.app.calllog.calllogcache.CallLogCache;
import com.android.dialer.calllogutils.PhoneCallDetails;
+import com.android.dialer.logging.ContactSource;
import com.android.dialer.oem.MotorolaUtils;
-import com.android.dialer.phonenumbercache.CachedNumberLookupService.CachedContactInfo;
import com.android.dialer.phonenumberutil.PhoneNumberHelper;
import com.android.dialer.util.DialerUtils;
import java.util.ArrayList;
@@ -142,6 +143,8 @@ public class PhoneCallDetailsHelper {
views.nameView.setText(nameText);
if (isVoicemail) {
+ int relevantLinkTypes = Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS | Linkify.WEB_URLS;
+ views.voicemailTranscriptionView.setAutoLinkMask(relevantLinkTypes);
views.voicemailTranscriptionView.setText(
TextUtils.isEmpty(details.transcription) ? null : details.transcription);
}
@@ -230,7 +233,7 @@ public class PhoneCallDetailsHelper {
return false;
}
// For caller ID provided by Cequint we want to show the geo location.
- if (details.sourceType == CachedContactInfo.SOURCE_TYPE_CEQUINT_CALLER_ID) {
+ if (details.sourceType == ContactSource.Type.SOURCE_TYPE_CEQUINT_CALLER_ID) {
return true;
}
// Don't bother showing geo location for contacts.
diff --git a/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java b/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java
index 5e820a750..7c25e7d39 100644
--- a/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java
+++ b/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java
@@ -31,15 +31,15 @@ import com.android.dialer.app.voicemail.VoicemailAudioManager;
import com.android.dialer.app.voicemail.VoicemailErrorManager;
import com.android.dialer.app.voicemail.VoicemailPlaybackPresenter;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
public class VisualVoicemailCallLogFragment extends CallLogFragment {
private final ContentObserver mVoicemailStatusObserver = new CustomContentObserver();
private VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
- private VoicemailErrorManager mVoicemailAlertManager;
+ private VoicemailErrorManager mVoicemailErrorManager;
public VisualVoicemailCallLogFragment() {
super(CallLog.Calls.VOICEMAIL_TYPE);
@@ -63,14 +63,14 @@ public class VisualVoicemailCallLogFragment extends CallLogFragment {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
- mVoicemailAlertManager =
+ mVoicemailErrorManager =
new VoicemailErrorManager(getContext(), getAdapter().getAlertManager(), mModalAlertManager);
getActivity()
.getContentResolver()
.registerContentObserver(
VoicemailContract.Status.CONTENT_URI,
true,
- mVoicemailAlertManager.getContentObserver());
+ mVoicemailErrorManager.getContentObserver());
}
@Override
@@ -84,13 +84,13 @@ public class VisualVoicemailCallLogFragment extends CallLogFragment {
public void onResume() {
super.onResume();
mVoicemailPlaybackPresenter.onResume();
- mVoicemailAlertManager.onResume();
+ mVoicemailErrorManager.onResume();
}
@Override
public void onPause() {
mVoicemailPlaybackPresenter.onPause();
- mVoicemailAlertManager.onPause();
+ mVoicemailErrorManager.onPause();
super.onPause();
}
@@ -98,8 +98,9 @@ public class VisualVoicemailCallLogFragment extends CallLogFragment {
public void onDestroy() {
getActivity()
.getContentResolver()
- .unregisterContentObserver(mVoicemailAlertManager.getContentObserver());
+ .unregisterContentObserver(mVoicemailErrorManager.getContentObserver());
mVoicemailPlaybackPresenter.onDestroy();
+ mVoicemailErrorManager.onDestroy();
getActivity().getContentResolver().unregisterContentObserver(mVoicemailStatusObserver);
super.onDestroy();
}
@@ -131,6 +132,9 @@ public class VisualVoicemailCallLogFragment extends CallLogFragment {
public void onNotVisible() {
LogUtil.enterBlock("VisualVoicemailCallLogFragment.onPageUnselected");
super.onNotVisible();
+ if (getAdapter() != null && getAdapter().mActionMode != null) {
+ getAdapter().mActionMode.finish();
+ }
if (getActivity() != null) {
getActivity().setVolumeControlStream(AudioManager.USE_DEFAULT_STREAM_TYPE);
}
diff --git a/java/com/android/dialer/app/calllog/VoicemailQueryHandler.java b/java/com/android/dialer/app/calllog/VoicemailQueryHandler.java
index 2aa3fb282..024394728 100644
--- a/java/com/android/dialer/app/calllog/VoicemailQueryHandler.java
+++ b/java/com/android/dialer/app/calllog/VoicemailQueryHandler.java
@@ -76,8 +76,8 @@ public class VoicemailQueryHandler extends AsyncQueryHandler {
GroupedNotificationUtil.removeNotification(
mContext.getSystemService(NotificationManager.class),
voicemailUri != null ? voicemailUri.toString() : null,
- R.id.notification_voicemail,
- DefaultVoicemailNotifier.NOTIFICATION_TAG);
+ R.id.notification_visual_voicemail,
+ DefaultVoicemailNotifier.VISUAL_VOICEMAIL_NOTIFICATION_TAG);
}
@Override
diff --git a/java/com/android/dialer/app/contactinfo/ContactInfoCache.java b/java/com/android/dialer/app/contactinfo/ContactInfoCache.java
index 85a9c3ef1..7a5db19f2 100644
--- a/java/com/android/dialer/app/contactinfo/ContactInfoCache.java
+++ b/java/com/android/dialer/app/contactinfo/ContactInfoCache.java
@@ -23,6 +23,7 @@ import android.support.annotation.NonNull;
import android.support.annotation.VisibleForTesting;
import android.text.TextUtils;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.logging.ContactSource.Type;
import com.android.dialer.phonenumbercache.ContactInfo;
import com.android.dialer.phonenumbercache.ContactInfoHelper;
import com.android.dialer.util.ExpirableCache;
@@ -183,7 +184,7 @@ public class ContactInfoCache {
new NumberWithCountryIso(request.number, request.countryIso);
ContactInfo existingInfo = mCache.getPossiblyExpired(numberCountryIso);
- final boolean isRemoteSource = info.sourceType != 0;
+ final boolean isRemoteSource = info.sourceType != Type.UNKNOWN_SOURCE_TYPE;
// Don't force redraw if existing info in the cache is equal to {@link ContactInfo#EMPTY}
// to avoid updating the data set for every new row that is scrolled into view.
@@ -346,7 +347,7 @@ public class ContactInfoCache {
shouldRedraw |= queryContactInfo(request);
if (shouldRedraw
&& (mUpdateRequests.isEmpty()
- || request.isLocalRequest() && !mUpdateRequests.peek().isLocalRequest())) {
+ || (request.isLocalRequest() && !mUpdateRequests.peek().isLocalRequest()))) {
shouldRedraw = false;
mHandler.sendEmptyMessage(REDRAW);
}
diff --git a/java/com/android/dialer/app/dialpad/DialpadFragment.java b/java/com/android/dialer/app/dialpad/DialpadFragment.java
index 80be8fe05..271f62199 100644
--- a/java/com/android/dialer/app/dialpad/DialpadFragment.java
+++ b/java/com/android/dialer/app/dialpad/DialpadFragment.java
@@ -78,8 +78,8 @@ import com.android.dialer.app.DialtactsActivity;
import com.android.dialer.app.R;
import com.android.dialer.app.SpecialCharSequenceMgr;
import com.android.dialer.app.calllog.CallLogAsync;
+import com.android.dialer.callintent.CallInitiationType;
import com.android.dialer.callintent.CallIntentBuilder;
-import com.android.dialer.callintent.nano.CallInitiationType;
import com.android.dialer.calllogutils.PhoneAccountUtils;
import com.android.dialer.common.LogUtil;
import com.android.dialer.dialpadview.DialpadKeyButton;
diff --git a/java/com/android/dialer/app/filterednumber/BlockedNumbersAdapter.java b/java/com/android/dialer/app/filterednumber/BlockedNumbersAdapter.java
index b9381331c..ac4903c31 100644
--- a/java/com/android/dialer/app/filterednumber/BlockedNumbersAdapter.java
+++ b/java/com/android/dialer/app/filterednumber/BlockedNumbersAdapter.java
@@ -25,8 +25,8 @@ import com.android.contacts.common.GeoUtil;
import com.android.dialer.app.R;
import com.android.dialer.blocking.BlockNumberDialogFragment;
import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
+import com.android.dialer.logging.InteractionEvent;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.InteractionEvent;
import com.android.dialer.phonenumbercache.ContactInfoHelper;
public class BlockedNumbersAdapter extends NumbersAdapter {
@@ -55,8 +55,6 @@ public class BlockedNumbersAdapter extends NumbersAdapter {
final String countryIso =
cursor.getString(cursor.getColumnIndex(FilteredNumberColumns.COUNTRY_ISO));
final String number = cursor.getString(cursor.getColumnIndex(FilteredNumberColumns.NUMBER));
- final String normalizedNumber =
- cursor.getString(cursor.getColumnIndex(FilteredNumberColumns.NORMALIZED_NUMBER));
final View deleteButton = view.findViewById(R.id.delete_button);
deleteButton.setOnClickListener(
diff --git a/java/com/android/dialer/app/filterednumber/BlockedNumbersSettingsActivity.java b/java/com/android/dialer/app/filterednumber/BlockedNumbersSettingsActivity.java
index 9ec6042c0..9310fcb22 100644
--- a/java/com/android/dialer/app/filterednumber/BlockedNumbersSettingsActivity.java
+++ b/java/com/android/dialer/app/filterednumber/BlockedNumbersSettingsActivity.java
@@ -22,7 +22,7 @@ import com.android.dialer.app.R;
import com.android.dialer.app.list.BlockedListSearchFragment;
import com.android.dialer.app.list.SearchFragment;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.ScreenEvent;
+import com.android.dialer.logging.ScreenEvent;
public class BlockedNumbersSettingsActivity extends AppCompatActivity
implements SearchFragment.HostInterface {
diff --git a/java/com/android/dialer/app/list/BlockedListSearchFragment.java b/java/com/android/dialer/app/list/BlockedListSearchFragment.java
index 2129981c0..0f96e2d6e 100644
--- a/java/com/android/dialer/app/list/BlockedListSearchFragment.java
+++ b/java/com/android/dialer/app/list/BlockedListSearchFragment.java
@@ -23,7 +23,6 @@ import android.telephony.PhoneNumberUtils;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
-import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.widget.AdapterView;
@@ -37,14 +36,13 @@ import com.android.dialer.app.widget.SearchEditTextLayout;
import com.android.dialer.blocking.BlockNumberDialogFragment;
import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler;
import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener;
+import com.android.dialer.common.LogUtil;
+import com.android.dialer.logging.InteractionEvent;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.InteractionEvent;
public class BlockedListSearchFragment extends RegularSearchFragment
implements BlockNumberDialogFragment.Callback {
- private static final String TAG = BlockedListSearchFragment.class.getSimpleName();
-
private final TextWatcher mPhoneSearchQueryTextListener =
new TextWatcher() {
@Override
@@ -152,7 +150,9 @@ public class BlockedListSearchFragment extends RegularSearchFragment
blockNumber(number);
break;
default:
- Log.w(TAG, "Ignoring unsupported shortcut type: " + shortcutType);
+ LogUtil.w(
+ "BlockedListSearchFragment.onItemClick",
+ "ignoring unsupported shortcut type: " + shortcutType);
break;
}
}
@@ -205,7 +205,9 @@ public class BlockedListSearchFragment extends RegularSearchFragment
@Override
public void onUnfilterNumberSuccess() {
- Log.wtf(TAG, "Unblocked a number from the BlockedListSearchFragment");
+ LogUtil.e(
+ "BlockedListSearchFragment.onUnfilterNumberSuccess",
+ "unblocked a number from the BlockedListSearchFragment");
goBack();
}
diff --git a/java/com/android/dialer/app/list/DialtactsPagerAdapter.java b/java/com/android/dialer/app/list/DialtactsPagerAdapter.java
index 3b700d81b..dba3d3a93 100644
--- a/java/com/android/dialer/app/list/DialtactsPagerAdapter.java
+++ b/java/com/android/dialer/app/list/DialtactsPagerAdapter.java
@@ -24,9 +24,13 @@ import android.support.v13.app.FragmentPagerAdapter;
import android.view.ViewGroup;
import com.android.dialer.app.calllog.CallLogFragment;
import com.android.dialer.app.calllog.VisualVoicemailCallLogFragment;
+import com.android.dialer.calllog.CallLogComponent;
+import com.android.dialer.calllog.CallLogFramework;
+import com.android.dialer.calllog.ui.NewCallLogFragment;
import com.android.dialer.common.Assert;
import com.android.dialer.common.ConfigProviderBindings;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.contactsfragment.ContactsFragment;
import com.android.dialer.database.CallLogQueryHandler;
import com.android.dialer.speeddial.SpeedDialFragment;
import com.android.dialer.util.ViewUtil;
@@ -54,11 +58,14 @@ public class DialtactsPagerAdapter extends FragmentPagerAdapter {
private final List fragments = new ArrayList<>();
private final String[] tabTitles;
private final boolean useNewSpeedDialTab;
-
+ private final boolean useNewCallLogTab;
+ private final boolean useNewContactsTab;
private OldSpeedDialFragment oldSpeedDialFragment;
private SpeedDialFragment speedDialFragment;
private CallLogFragment callLogFragment;
- private AllContactsFragment contactsFragment;
+ private NewCallLogFragment newCallLogFragment;
+ private AllContactsFragment oldContactsFragment;
+ private ContactsFragment contactsFragment;
private CallLogFragment voicemailFragment;
public boolean hasActiveVoicemailProvider;
@@ -68,6 +75,10 @@ public class DialtactsPagerAdapter extends FragmentPagerAdapter {
super(fm);
useNewSpeedDialTab =
ConfigProviderBindings.get(context).getBoolean("enable_new_favorites_tab", false);
+ CallLogFramework callLogFramework = CallLogComponent.get(context).callLogFramework();
+ useNewCallLogTab = callLogFramework.isNewCallLogEnabled(context);
+ useNewContactsTab =
+ ConfigProviderBindings.get(context).getBoolean("enable_new_contacts_tab", false);
this.tabTitles = tabTitles;
hasActiveVoicemailProvider = hasVoicemailProvider;
fragments.addAll(Collections.nCopies(TAB_COUNT_WITH_VOICEMAIL, null));
@@ -95,15 +106,29 @@ public class DialtactsPagerAdapter extends FragmentPagerAdapter {
return oldSpeedDialFragment;
}
case TAB_INDEX_HISTORY:
- if (callLogFragment == null) {
- callLogFragment = new CallLogFragment(CallLogQueryHandler.CALL_TYPE_ALL);
+ if (useNewCallLogTab) {
+ if (newCallLogFragment == null) {
+ newCallLogFragment = new NewCallLogFragment();
+ }
+ return newCallLogFragment;
+ } else {
+ if (callLogFragment == null) {
+ callLogFragment = new CallLogFragment(CallLogQueryHandler.CALL_TYPE_ALL);
+ }
+ return callLogFragment;
}
- return callLogFragment;
case TAB_INDEX_ALL_CONTACTS:
- if (contactsFragment == null) {
- contactsFragment = new AllContactsFragment();
+ if (useNewContactsTab) {
+ if (contactsFragment == null) {
+ contactsFragment = new ContactsFragment();
+ }
+ return contactsFragment;
+ } else {
+ if (oldContactsFragment == null) {
+ oldContactsFragment = new AllContactsFragment();
+ }
+ return oldContactsFragment;
}
- return contactsFragment;
case TAB_INDEX_VOICEMAIL:
if (voicemailFragment == null) {
voicemailFragment = new VisualVoicemailCallLogFragment();
@@ -131,8 +156,12 @@ public class DialtactsPagerAdapter extends FragmentPagerAdapter {
speedDialFragment = (SpeedDialFragment) fragment;
} else if (fragment instanceof CallLogFragment && position == TAB_INDEX_HISTORY) {
callLogFragment = (CallLogFragment) fragment;
+ } else if (fragment instanceof NewCallLogFragment) {
+ newCallLogFragment = (NewCallLogFragment) fragment;
+ } else if (fragment instanceof ContactsFragment) {
+ contactsFragment = (ContactsFragment) fragment;
} else if (fragment instanceof AllContactsFragment) {
- contactsFragment = (AllContactsFragment) fragment;
+ oldContactsFragment = (AllContactsFragment) fragment;
} else if (fragment instanceof CallLogFragment && position == TAB_INDEX_VOICEMAIL) {
voicemailFragment = (CallLogFragment) fragment;
LogUtil.v("ViewPagerAdapter.instantiateItem", voicemailFragment.toString());
diff --git a/java/com/android/dialer/app/list/ListsFragment.java b/java/com/android/dialer/app/list/ListsFragment.java
index bf29ef310..02498939c 100644
--- a/java/com/android/dialer/app/list/ListsFragment.java
+++ b/java/com/android/dialer/app/list/ListsFragment.java
@@ -44,9 +44,9 @@ import com.android.dialer.app.voicemail.error.VoicemailStatusCorruptionHandler;
import com.android.dialer.app.voicemail.error.VoicemailStatusCorruptionHandler.Source;
import com.android.dialer.common.LogUtil;
import com.android.dialer.database.CallLogQueryHandler;
+import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
-import com.android.dialer.logging.nano.ScreenEvent;
+import com.android.dialer.logging.ScreenEvent;
import com.android.dialer.speeddial.SpeedDialFragment;
import com.android.dialer.voicemailstatus.VisualVoicemailEnabledChecker;
import com.android.dialer.voicemailstatus.VoicemailStatusHelper;
@@ -76,6 +76,7 @@ public class ListsFragment extends Fragment
private final ArrayList mOnPageChangeListeners = new ArrayList<>();
/** The position of the currently selected tab. */
private int mTabIndex = TAB_INDEX_SPEED_DIAL;
+ private boolean mPaused;
private CallLogQueryHandler mCallLogQueryHandler;
@@ -104,6 +105,8 @@ public class ListsFragment extends Fragment
Trace.beginSection(TAG + " onResume");
super.onResume();
+ mPaused = false;
+
if (getUserVisibleHint()) {
sendScreenViewForCurrentPosition();
}
@@ -127,6 +130,8 @@ public class ListsFragment extends Fragment
((CallLogFragment) mCurrentPage).onNotVisible();
}
super.onPause();
+
+ mPaused = true;
}
@Override
@@ -263,7 +268,7 @@ public class ListsFragment extends Fragment
public void onVoicemailStatusFetched(Cursor statusCursor) {
mHasFetchedVoicemailStatus = true;
- if (getActivity() == null || getActivity().isFinishing()) {
+ if (getActivity() == null || mPaused) {
return;
}
@@ -394,7 +399,7 @@ public class ListsFragment extends Fragment
return;
}
- int screenType;
+ ScreenEvent.Type screenType;
switch (getCurrentTabIndex()) {
case TAB_INDEX_SPEED_DIAL:
screenType = ScreenEvent.Type.SPEED_DIAL;
diff --git a/java/com/android/dialer/app/list/OldSpeedDialFragment.java b/java/com/android/dialer/app/list/OldSpeedDialFragment.java
index 4aafd9625..4ae84b6d9 100644
--- a/java/com/android/dialer/app/list/OldSpeedDialFragment.java
+++ b/java/com/android/dialer/app/list/OldSpeedDialFragment.java
@@ -51,8 +51,8 @@ import com.android.contacts.common.list.ContactTileView;
import com.android.contacts.common.list.OnPhoneNumberPickerActionListener;
import com.android.dialer.app.R;
import com.android.dialer.app.widget.EmptyContentView;
-import com.android.dialer.callintent.nano.CallInitiationType;
-import com.android.dialer.callintent.nano.CallSpecificAppData;
+import com.android.dialer.callintent.CallInitiationType;
+import com.android.dialer.callintent.CallSpecificAppData;
import com.android.dialer.common.LogUtil;
import com.android.dialer.util.PermissionsUtil;
import com.android.dialer.util.ViewUtil;
@@ -462,8 +462,10 @@ public class OldSpeedDialFragment extends Fragment
@Override
public void onContactSelected(Uri contactUri, Rect targetRect) {
if (mPhoneNumberPickerActionListener != null) {
- CallSpecificAppData callSpecificAppData = new CallSpecificAppData();
- callSpecificAppData.callInitiationType = CallInitiationType.Type.SPEED_DIAL;
+ CallSpecificAppData callSpecificAppData =
+ CallSpecificAppData.newBuilder()
+ .setCallInitiationType(CallInitiationType.Type.SPEED_DIAL)
+ .build();
mPhoneNumberPickerActionListener.onPickDataUri(
contactUri, false /* isVideoCall */, callSpecificAppData);
}
@@ -472,8 +474,10 @@ public class OldSpeedDialFragment extends Fragment
@Override
public void onCallNumberDirectly(String phoneNumber) {
if (mPhoneNumberPickerActionListener != null) {
- CallSpecificAppData callSpecificAppData = new CallSpecificAppData();
- callSpecificAppData.callInitiationType = CallInitiationType.Type.SPEED_DIAL;
+ CallSpecificAppData callSpecificAppData =
+ CallSpecificAppData.newBuilder()
+ .setCallInitiationType(CallInitiationType.Type.SPEED_DIAL)
+ .build();
mPhoneNumberPickerActionListener.onPickPhoneNumber(
phoneNumber, false /* isVideoCall */, callSpecificAppData);
}
diff --git a/java/com/android/dialer/app/list/RegularSearchFragment.java b/java/com/android/dialer/app/list/RegularSearchFragment.java
index 26959539b..02896793b 100644
--- a/java/com/android/dialer/app/list/RegularSearchFragment.java
+++ b/java/com/android/dialer/app/list/RegularSearchFragment.java
@@ -27,7 +27,7 @@ import com.android.contacts.common.list.PinnedHeaderListView;
import com.android.dialer.app.R;
import com.android.dialer.app.widget.EmptyContentView;
import com.android.dialer.app.widget.EmptyContentView.OnEmptyViewActionButtonClickedListener;
-import com.android.dialer.callintent.nano.CallInitiationType;
+import com.android.dialer.callintent.CallInitiationType;
import com.android.dialer.phonenumbercache.CachedNumberLookupService;
import com.android.dialer.phonenumbercache.PhoneNumberCache;
import com.android.dialer.util.PermissionsUtil;
@@ -133,7 +133,7 @@ public class RegularSearchFragment extends SearchFragment
}
@Override
- protected int getCallInitiationType(boolean isRemoteDirectory) {
+ protected CallInitiationType.Type getCallInitiationType(boolean isRemoteDirectory) {
return isRemoteDirectory
? CallInitiationType.Type.REMOTE_DIRECTORY
: CallInitiationType.Type.REGULAR_SEARCH;
diff --git a/java/com/android/dialer/app/list/SearchFragment.java b/java/com/android/dialer/app/list/SearchFragment.java
index 4128300df..264bdf81b 100644
--- a/java/com/android/dialer/app/list/SearchFragment.java
+++ b/java/com/android/dialer/app/list/SearchFragment.java
@@ -42,7 +42,7 @@ import com.android.dialer.app.R;
import com.android.dialer.app.dialpad.DialpadFragment.ErrorDialogFragment;
import com.android.dialer.app.widget.DialpadSearchEmptyContentView;
import com.android.dialer.app.widget.EmptyContentView;
-import com.android.dialer.callintent.nano.CallSpecificAppData;
+import com.android.dialer.callintent.CallSpecificAppData;
import com.android.dialer.common.LogUtil;
import com.android.dialer.util.DialerUtils;
import com.android.dialer.util.IntentUtil;
@@ -238,12 +238,13 @@ public class SearchFragment extends PhoneNumberPickerFragment {
number = adapter.getQueryString();
listener = getOnPhoneNumberPickerListener();
if (listener != null && !checkForProhibitedPhoneNumber(number)) {
- CallSpecificAppData callSpecificAppData = new CallSpecificAppData();
- callSpecificAppData.callInitiationType =
- getCallInitiationType(false /* isRemoteDirectory */);
- callSpecificAppData.positionOfSelectedSearchResult = position;
- callSpecificAppData.charactersInSearchString =
- getQueryString() == null ? 0 : getQueryString().length();
+ CallSpecificAppData callSpecificAppData =
+ CallSpecificAppData.newBuilder()
+ .setCallInitiationType(getCallInitiationType(false /* isRemoteDirectory */))
+ .setPositionOfSelectedSearchResult(position)
+ .setCharactersInSearchString(
+ getQueryString() == null ? 0 : getQueryString().length())
+ .build();
listener.onPickPhoneNumber(number, false /* isVideoCall */, callSpecificAppData);
}
break;
@@ -274,12 +275,13 @@ public class SearchFragment extends PhoneNumberPickerFragment {
TextUtils.isEmpty(mAddToContactNumber) ? adapter.getQueryString() : mAddToContactNumber;
listener = getOnPhoneNumberPickerListener();
if (listener != null && !checkForProhibitedPhoneNumber(number)) {
- CallSpecificAppData callSpecificAppData = new CallSpecificAppData();
- callSpecificAppData.callInitiationType =
- getCallInitiationType(false /* isRemoteDirectory */);
- callSpecificAppData.positionOfSelectedSearchResult = position;
- callSpecificAppData.charactersInSearchString =
- getQueryString() == null ? 0 : getQueryString().length();
+ CallSpecificAppData callSpecificAppData =
+ CallSpecificAppData.newBuilder()
+ .setCallInitiationType(getCallInitiationType(false /* isRemoteDirectory */))
+ .setPositionOfSelectedSearchResult(position)
+ .setCharactersInSearchString(
+ getQueryString() == null ? 0 : getQueryString().length())
+ .build();
listener.onPickPhoneNumber(number, true /* isVideoCall */, callSpecificAppData);
}
break;
diff --git a/java/com/android/dialer/app/list/SmartDialSearchFragment.java b/java/com/android/dialer/app/list/SmartDialSearchFragment.java
index c783d3ac3..5d72ee615 100644
--- a/java/com/android/dialer/app/list/SmartDialSearchFragment.java
+++ b/java/com/android/dialer/app/list/SmartDialSearchFragment.java
@@ -26,7 +26,7 @@ import com.android.contacts.common.list.ContactEntryListAdapter;
import com.android.dialer.app.R;
import com.android.dialer.app.dialpad.SmartDialCursorLoader;
import com.android.dialer.app.widget.EmptyContentView;
-import com.android.dialer.callintent.nano.CallInitiationType;
+import com.android.dialer.callintent.CallInitiationType;
import com.android.dialer.util.PermissionsUtil;
/** Implements a fragment to load and display SmartDial search results. */
@@ -102,7 +102,7 @@ public class SmartDialSearchFragment extends SearchFragment
}
@Override
- protected int getCallInitiationType(boolean isRemoteDirectory) {
+ protected CallInitiationType.Type getCallInitiationType(boolean isRemoteDirectory) {
return CallInitiationType.Type.SMART_DIAL;
}
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/empty_call_log.png b/java/com/android/dialer/app/res/drawable-hdpi/empty_call_log.png
new file mode 100644
index 000000000..d6f6daaab
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/empty_call_log.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/empty_contacts.png b/java/com/android/dialer/app/res/drawable-hdpi/empty_contacts.png
new file mode 100644
index 000000000..d3c0378f5
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/empty_contacts.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/empty_speed_dial.png b/java/com/android/dialer/app/res/drawable-hdpi/empty_speed_dial.png
new file mode 100644
index 000000000..3e9232fc9
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/empty_speed_dial.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_archive_white_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_archive_white_24dp.png
new file mode 100644
index 000000000..bb72e890f
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_archive_white_24dp.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_content_copy_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_content_copy_24dp.png
new file mode 100644
index 000000000..70eb07378
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_content_copy_24dp.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_delete_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_delete_24dp.png
new file mode 100644
index 000000000..9fb43b066
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_delete_24dp.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_add_call.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_add_call.png
new file mode 100644
index 000000000..4e0d5649e
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_add_call.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_current_call.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_current_call.png
new file mode 100644
index 000000000..2cf41d598
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_current_call.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_tt_keypad.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_tt_keypad.png
new file mode 100644
index 000000000..043685fd9
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_tt_keypad.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_grade_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_grade_24dp.png
new file mode 100644
index 000000000..86eecdd4a
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_grade_24dp.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_handle.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_handle.png
new file mode 100644
index 000000000..34310aa49
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_handle.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_menu_history_lt.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_menu_history_lt.png
new file mode 100644
index 000000000..a36323ca9
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_menu_history_lt.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_mic_grey600.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_mic_grey600.png
new file mode 100644
index 000000000..4b67cf71a
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_mic_grey600.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_more_vert_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_more_vert_24dp.png
new file mode 100644
index 000000000..67f07e473
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_more_vert_24dp.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_not_interested_googblue_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_not_interested_googblue_24dp.png
new file mode 100644
index 000000000..26a26f911
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_not_interested_googblue_24dp.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_not_spam.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_not_spam.png
new file mode 100644
index 000000000..bf413f912
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_not_spam.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_pause_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_pause_24dp.png
new file mode 100644
index 000000000..4d2ea05c4
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_pause_24dp.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_people_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_people_24dp.png
new file mode 100644
index 000000000..ff698afc0
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_people_24dp.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_phone_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_phone_24dp.png
new file mode 100644
index 000000000..b27dfba06
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_phone_24dp.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_play_arrow_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_play_arrow_24dp.png
new file mode 100644
index 000000000..57c9fa546
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_play_arrow_24dp.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_remove.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_remove.png
new file mode 100644
index 000000000..1ee6adf8d
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_remove.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_results_phone.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_results_phone.png
new file mode 100644
index 000000000..3a1a7a790
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_results_phone.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_schedule_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_schedule_24dp.png
new file mode 100644
index 000000000..f3581d104
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_schedule_24dp.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_share_white_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_share_white_24dp.png
new file mode 100644
index 000000000..b09a6926d
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_share_white_24dp.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_star.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_star.png
new file mode 100644
index 000000000..62e1f8a6d
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_star.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_unblock.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_unblock.png
new file mode 100644
index 000000000..03643b20d
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_unblock.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_off_dis.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_off_dis.png
new file mode 100644
index 000000000..47e32492c
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_off_dis.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_off_dk.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_off_dk.png
new file mode 100644
index 000000000..2bfe0c0cf
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_off_dk.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_on_dis.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_on_dis.png
new file mode 100644
index 000000000..90b5238f3
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_on_dis.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_on_dk.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_on_dk.png
new file mode 100644
index 000000000..7556637fc
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_on_dk.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_voicemail_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_voicemail_24dp.png
new file mode 100644
index 000000000..03a62e15f
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_voicemail_24dp.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_volume_down_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_volume_down_24dp.png
new file mode 100644
index 000000000..e22e92c85
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_volume_down_24dp.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_volume_up_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_volume_up_24dp.png
new file mode 100644
index 000000000..57d787163
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/ic_volume_up_24dp.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/search_shadow.9.png b/java/com/android/dialer/app/res/drawable-hdpi/search_shadow.9.png
new file mode 100644
index 000000000..3dc1c17f6
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/search_shadow.9.png differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/shadow_contact_photo.png b/java/com/android/dialer/app/res/drawable-hdpi/shadow_contact_photo.png
new file mode 100644
index 000000000..44b06f261
Binary files /dev/null and b/java/com/android/dialer/app/res/drawable-hdpi/shadow_contact_photo.png differ
diff --git a/java/com/android/dialer/app/res/layout/all_contacts_fragment.xml b/java/com/android/dialer/app/res/layout/all_contacts_fragment.xml
index f59847825..17a45208d 100644
--- a/java/com/android/dialer/app/res/layout/all_contacts_fragment.xml
+++ b/java/com/android/dialer/app/res/layout/all_contacts_fragment.xml
@@ -41,7 +41,9 @@
android:paddingTop="18dp"
android:fadingEdge="none"
android:fastScrollEnabled="true"
- android:nestedScrollingEnabled="true"/>
+ android:nestedScrollingEnabled="true"
+ android:cropToPadding="false"
+ android:clipToPadding="false"/>
diff --git a/java/com/android/dialer/app/res/mipmap-hdpi/ic_launcher_phone.png b/java/com/android/dialer/app/res/mipmap-hdpi/ic_launcher_phone.png
new file mode 100644
index 000000000..15c41423b
Binary files /dev/null and b/java/com/android/dialer/app/res/mipmap-hdpi/ic_launcher_phone.png differ
diff --git a/java/com/android/dialer/app/res/values-af/strings.xml b/java/com/android/dialer/app/res/values-af/strings.xml
index 6188a5983..0245a2d1d 100644
--- a/java/com/android/dialer/app/res/values-af/strings.xml
+++ b/java/com/android/dialer/app/res/values-af/strings.xml
@@ -42,6 +42,8 @@
"Bel terug"
"Boodskap"
"%1$s: %2$s"
+ "Bel %s"
+ "Stemboodskapnommer onbekend"
- %1$d Stemboodskappe
- Stemboodskap
@@ -97,6 +99,11 @@
"Stemboodskap"
"%s sek."
"%s min. %s sek."
+ "stemboodskap"
+ "stemboodskappe"
+ "Ja"
+ "Nee"
+ "Vee geselekteerde %1$s uit?"
@string/call_log_header_today
"%1$s om %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-am/strings.xml b/java/com/android/dialer/app/res/values-am/strings.xml
index 228fe94c6..befa4c45c 100644
--- a/java/com/android/dialer/app/res/values-am/strings.xml
+++ b/java/com/android/dialer/app/res/values-am/strings.xml
@@ -42,6 +42,8 @@
"መልሰህ ደውል"
"መልእክት"
"%1$s:%2$s"
+ "%s ይደውሉ"
+ "የማይታወቅ የድምፅ መልዕክት ቁጥር"
- %1$d የድምፅ መልዕክቶች
- %1$d የድምፅ መልዕክቶች
@@ -97,6 +99,12 @@
"የድምፅ መልዕክት"
"%s ሰከንድ"
"%s ደቂቃ %s ሴከ"
+ "የድምፅ መልዕክት"
+ "የድምፅ መልዕክቶች"
+ "አዎ"
+ "አይ"
+
+
@string/call_log_header_today
"%1$s %2$s ላይ"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-ar/strings.xml b/java/com/android/dialer/app/res/values-ar/strings.xml
index 2d9c7e8e0..961e4833e 100644
--- a/java/com/android/dialer/app/res/values-ar/strings.xml
+++ b/java/com/android/dialer/app/res/values-ar/strings.xml
@@ -42,6 +42,8 @@
"معاودة الاتصال"
"رسالة"
"%1$s: %2$s"
+ "طلب %s"
+ "رقم البريد الصوتي غير معروف"
- لا تتوفر رسائل بريد صوتي (%1$d)
- رسالتا بريد صوتي (%1$d)
@@ -101,6 +103,11 @@
"البريد الصوتي"
"%s ثانية"
"%s دقيقة %s ثانية"
+ "البريد الصوتي"
+ "رسائل البريد الصوتي"
+ "نعم"
+ "لا"
+ "حذف رسائل %1$s المحددة؟"
@string/call_log_header_today
"%1$s في %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-az/strings.xml b/java/com/android/dialer/app/res/values-az/strings.xml
index e2e9bea50..78440fd24 100644
--- a/java/com/android/dialer/app/res/values-az/strings.xml
+++ b/java/com/android/dialer/app/res/values-az/strings.xml
@@ -42,6 +42,8 @@
"Geriyə zəng"
"Mesaj"
"%1$s: %2$s"
+ "%s nömrəsini yığın"
+ "Səsli e-poçt nömrəsi naməlumdur"
- %1$d Səsli poçt
- Səsli poçt
@@ -97,6 +99,12 @@
"Səsli poçt"
"%s san"
"%s dəq %s san"
+ "səsli e-məktub"
+ "səsli e-məktublar"
+ "Bəli"
+ "Xeyr"
+
+
@string/call_log_header_today
"%1$s tarixində %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-b+sr+Latn/strings.xml b/java/com/android/dialer/app/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 000000000..ddb311266
--- /dev/null
+++ b/java/com/android/dialer/app/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,234 @@
+
+
+
+
+ "Telefon"
+ "Telefonska tastatura"
+ "Telefon"
+ "Istorija poziva"
+ "Prijavi netačan broj"
+ "Kopiraj broj"
+ "Kopiraj transkripciju"
+ "Blokiraj broj"
+ "Deblokiraj broj"
+ "Izmeni broj pre poziva"
+ "Obriši istoriju poziva"
+ "Izbriši govornu poruku"
+ "Gov. pošta je izbrisana"
+ "OPOZOVI"
+ "Želite da obrišete istoriju poziva?"
+ "Ovo će izbrisati sve pozive iz istorije"
+ "Briše se istorija poziva…"
+ "Telefon"
+ "Propušten poziv"
+ "Propušten poziv za Work"
+ "Propušteni pozivi"
+ "Broj propuštenih poziva: %d"
+ "Uzvrati poziv"
+ "Pošalji SMS"
+ "%1$s: %2$s"
+ "Pozovi %s"
+ "Nepoznat broj govorne pošte"
+
+ - %1$d govorna poruka
+ - %1$d govorne poruke
+ - %1$d govornih poruka
+
+ "Pusti"
+ "%1$s, %2$s"
+ "Nova govorna poruka od %1$s"
+ "Puštanje govorne pošte nije uspelo"
+ "Govorna pošta se učitava…"
+ "Govorna pošta se arhivira…"
+ "Učitavanje govorne pošte nije uspelo"
+ "Samo pozivi sa govornom poštom"
+ "Samo dolazni pozivi"
+ "Samo odlazni pozivi"
+ "Samo propušteni pozivi"
+ "(%1$d) %2$s"
+ "pretraži"
+ "biranje"
+ "broj za biranje"
+ "Pokretanje ili zaustavljanje reprodukcije"
+ "Uključivanje ili isključivanje spikerfona"
+ "Traženje pozicije u reprodukciji"
+ "Smanjivanje brzine reprodukcije"
+ "Povećavanje brzine reprodukcije"
+ "Istorija poziva"
+ "Još opcija"
+ "tastatura"
+ "Prikaži samo odlazne"
+ "Prikaži samo dolazne"
+ "Prikaži samo propuštene"
+ "Prikaži samo govorne poruke"
+ "Prikaži sve pozive"
+ "Dodaj pauzu od 2 sekunde"
+ "Dodaj čekanje"
+ "Podešavanja"
+ "Simulator"
+ "Svi kontakti"
+ "Upotrebite brojčanik za tonsko biranje"
+ "Vrati se na poziv koji je u toku"
+ "Dodaj poziv"
+ "Dolazni pozivi"
+ "Puštanje govorne pošte"
+ "Prikaži kontakt %1$s"
+ "Pozovi %1$s"
+ "Detalji o kontaktu za %1$s"
+ "Kontakt informacije potencijalnog nepoželjnog pozivaoca %1$s"
+ "%1$s poziva."
+ "Video poziv."
+ "Slanje SMS-a za %1$s"
+ "Nepreslušana govorna pošta"
+ "Pokretanje glasovne pretrage"
+ "Pozovi %s"
+ "Govorna pošta"
+ "%s sek"
+ "%s min %s sek"
+ "govornu poruku"
+ "govorne poruke"
+ "Da"
+ "Ne"
+
+
+ @string/call_log_header_today
+ "%1$s u %2$s"
+ "%1$02d:%2$02d"
+ "%1$s • %2$s"
+ "Nije moguće pozvati ovaj broj"
+ "Da biste podesili govornu poštu, idite u Meni > Podešavanja."
+ "Da biste pozvali govornu poštu, prvo isključite režim rada u avionu."
+ "Učitava se…"
+ "IMEI"
+ "MEID"
+ "Učitava se sa SIM kartice…"
+ "Kontakti na SIM kartici"
+ "Nema dostupne aplikacije za kontakte"
+ "Glasovna pretraga nije dostupna"
+ "Nije moguće uputiti telefonski poziv jer je aplikacija Telefon onemogućena."
+ "Pretraži kontakte"
+ "Dodajte broj ili pretražite kontakte"
+ "Istorija poziva je prazna"
+ "Pozovi"
+ "Nemate nijedan propušten poziv."
+ "Prijemno sanduče govorne pošte je prazno."
+ "Prikaži samo omiljene"
+ "Istorija poziva"
+ "Svi"
+ "Propušteni"
+ "Govorna pošta"
+ "Brzo biranje"
+ "Istorija poziva"
+ "Kontakti"
+ "Govorna pošta"
+ "Uklonjeno je iz omiljenih"
+ "Opozovi"
+ "Pozovi %s"
+ "Napravi novi kontakt"
+ "Dodaj u kontakt"
+ "Pošalji SMS"
+ "Uputi video poziv"
+ "Blokiraj broj"
+ "Novih propuštenih poziva: %s"
+ "Nemate nijedan kontakt na brzom biranju"
+ "Dodaj omiljen kontakt"
+ "Još uvek nemate nijedan kontakt"
+ "Dodaj kontakt"
+ "Dodirnite sliku da biste videli sve brojeve ili dodirnite i zadržite da biste im promenili raspored"
+ "Ukloni"
+ "Video poziv"
+ "Pošalji poruku"
+ "Detalji poziva"
+ "Pošalji u…"
+ "Pozovi ^1"
+ "Propušteni poziv: ^1, ^2, ^3, ^4."
+ "Primljeni poziv: ^1, ^2, ^3, ^4."
+ "Nepročitana govorna poruka od ^1, ^2, ^3, ^4."
+ "Govorna poruka od ^1, ^2, ^3, ^4."
+ "Pozvali ste: ^1, ^2, ^3, ^4."
+ "preko %1$s"
+ "%1$s preko %2$s"
+ "Pozovi ^1"
+ "Uputite video poziv kontaktu ^1."
+ "Pusti govornu poštu od ^1"
+ "Reprodukuj govornu poštu kontakta ^1"
+ "Pauziraj govornu poštu kontakta ^1"
+ "Izbriši govornu poštu kontakta ^1"
+
+ - %d nova poruka govorne pošte
+ - %d nove poruke govorne pošte
+ - %d novih poruka govorne pošte
+
+ "Napravite kontakt za ^1"
+ "Dodajte ^1 postojećem kontaktu"
+ "Detalji poziva za ^1"
+ "Izbrisano iz istorije poziva"
+ "Danas"
+ "Juče"
+ "Stariji"
+ "Lista poziva"
+ "Uključite zvučnik."
+ "Isključite zvučnik."
+ "Brža reprodukcija."
+ "Sporija reprodukcija."
+ "Započnite ili pauzirajte reprodukciju."
+ "Opcije prikaza"
+ "Zvuci i vibracija"
+ "Pristupačnost"
+ "Zvuk zvona telefona"
+ "Vibriraj i za pozive"
+ "Tonovi tastature"
+ "Dužina trajanja tona tastature"
+
+ - "Normalno"
+ - "Dugačak"
+
+ "Brzi odgovori"
+ "Pozivi"
+ "Blokiranje poziva"
+ "Govorna pošta"
+ "Blokiranje poziva je privremeno isključeno"
+ "Blokiranje poziva je onemogućeno zato što ste kontaktirali službe za pomoć u hitnim slučajevima sa ovog telefona u poslednjih 48 sati. Automatski će biti ponovo omogućeno kada istekne period od 48 sati."
+ "Uvezi brojeve"
+ "Ranije ste označili neke pozivaoce koje automatski treba preusmeriti na govornu poštu preko drugih aplikacija."
+ "Prikaži brojeve"
+ "Uvezi"
+ "Deblokiraj broj"
+ "Dodaj broj"
+ "Pozivi sa ovih brojeva će biti blokirani i poruke govorne pošte će se automatski brisati."
+ "Pozivi sa ovih brojeva će biti blokirani, ali pozivaoci sa ovih brojeva će i dalje moći da vam ostavljaju poruke govorne pošte."
+ "Blokirani brojevi"
+ "%1$s je već blokiran."
+ "Nalozi za pozivanje"
+ "Uključi"
+ "Podesi dozvole"
+ "Da biste omogućili brzo biranje, uključite dozvolu za Kontakte."
+ "Da biste videli evidenciju poziva, uključite dozvolu za Telefon."
+ "Da biste videli kontakte, uključite dozvolu za Kontakte."
+ "Da biste pristupili govornoj pošti, uključite dozvolu za Telefon."
+ "Da biste pretražili kontakte, uključite dozvole za Kontakte."
+ "Da biste uputili poziv, uključite dozvolu za Telefon."
+ "Aplikacija Telefon nema dozvolu za upisivanje u sistemska podešavanja."
+ "Blokirano"
+ "Blokiraj/prijavi kao nepoželjan"
+ "Blokiraj broj"
+ "Nije nepoželjan"
+ "Deblokiraj broj"
+ "Nepoželjan"
+ "%1$s je oflajn i ne možete da ga/je kontaktirate"
+
diff --git a/java/com/android/dialer/app/res/values-be/strings.xml b/java/com/android/dialer/app/res/values-be/strings.xml
index 337a62617..54d7d8384 100644
--- a/java/com/android/dialer/app/res/values-be/strings.xml
+++ b/java/com/android/dialer/app/res/values-be/strings.xml
@@ -42,6 +42,8 @@
"Адказаць"
"Паведамленне"
"%1$s: %2$s"
+ "Набраць %s"
+ "Невядомы нумар галасавой пошты"
- %1$d Паведамленне галасавой пошты
- %1$d Паведамленні галасавой пошты
@@ -99,6 +101,12 @@
"Галасавая пошта"
"%s с"
"%s хв %s с"
+ "галасавая пошта"
+ "галасавая пошта"
+ "Так"
+ "Не"
+
+
@string/call_log_header_today
"%1$s у %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-bg/strings.xml b/java/com/android/dialer/app/res/values-bg/strings.xml
index 510b4a2d0..0fb06c165 100644
--- a/java/com/android/dialer/app/res/values-bg/strings.xml
+++ b/java/com/android/dialer/app/res/values-bg/strings.xml
@@ -42,6 +42,8 @@
"Обратно обаждане"
"Съобщение"
"%1$s: %2$s"
+ "Набиране на %s"
+ "Неизвестен номер за гласова поща"
- %1$d гласови съобщения
- Гласово съобщение
@@ -97,6 +99,11 @@
"Гласова поща"
"%s сек"
"%s мин %s сек"
+ "гласово съобщение"
+ "гласови съобщения"
+ "Да"
+ "Не"
+ "Избрахте %1$s – да се изтрие ли избраното?"
@string/call_log_header_today
"%1$s в %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-bn/strings.xml b/java/com/android/dialer/app/res/values-bn/strings.xml
index ece833ce7..45787cc0f 100644
--- a/java/com/android/dialer/app/res/values-bn/strings.xml
+++ b/java/com/android/dialer/app/res/values-bn/strings.xml
@@ -42,6 +42,8 @@
"কল ব্যাক করুন"
"বার্তা"
"%1$s: %2$s"
+ "%s এ ডায়াল করুন"
+ "ভয়েসমেল নম্বর অজানা"
- %1$dটি ভয়েসমেল
- %1$dটি ভয়েসমেল
@@ -97,6 +99,12 @@
"ভয়েসমেল"
"%s সেকেন্ড"
"%s মিনিট %s সেকেন্ড"
+ "ভয়েসমেল"
+ "ভয়েসমেলগুলি"
+ "হ্যাঁ"
+ "না"
+
+
@string/call_log_header_today
"%1$s তারিখে %2$s\'টায়"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-bs/strings.xml b/java/com/android/dialer/app/res/values-bs/strings.xml
index 98506dc45..8c19cb719 100644
--- a/java/com/android/dialer/app/res/values-bs/strings.xml
+++ b/java/com/android/dialer/app/res/values-bs/strings.xml
@@ -42,6 +42,8 @@
"Povr. poziv"
"Poruka"
"%1$s: %2$s"
+ "Pozovi %s"
+ "Nepoznat broj govorne pošte"
- %1$d Poruka govorne pošte
- %1$d Poruke govorne pošte
@@ -98,6 +100,12 @@
"Govorna pošta"
"%s sek."
"%s min. %s sek."
+ "poruka govorne pošte"
+ "poruke govorne pošte"
+ "Da"
+ "Ne"
+
+
@string/call_log_header_today
"%1$s u %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-ca/strings.xml b/java/com/android/dialer/app/res/values-ca/strings.xml
index 781c6064e..a333e5389 100644
--- a/java/com/android/dialer/app/res/values-ca/strings.xml
+++ b/java/com/android/dialer/app/res/values-ca/strings.xml
@@ -42,6 +42,8 @@
"Torna la trucada"
"Missatge"
"%1$s: %2$s"
+ "Marca el número %s"
+ "Número de la bústia de veu desconegut"
- %1$d bústies de veu
- Bústia de veu
@@ -97,6 +99,12 @@
"Bústia de veu"
"%s s"
"%s min %s s"
+ "missatge de veu"
+ "missatges de veu"
+ "Sí"
+ "No"
+
+
@string/call_log_header_today
"%1$s a les %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-cs/strings.xml b/java/com/android/dialer/app/res/values-cs/strings.xml
index 4f35d9cff..cc71441da 100644
--- a/java/com/android/dialer/app/res/values-cs/strings.xml
+++ b/java/com/android/dialer/app/res/values-cs/strings.xml
@@ -42,6 +42,8 @@
"Zavolat zpět"
"Zpráva"
"%1$s: %2$s"
+ "Volat hlasovou schránku %s"
+ "Číslo hlasové schránky není známé"
- %1$d hlasové zprávy
- %1$d hlasové zprávy
@@ -99,6 +101,12 @@
"Hlasová schránka"
"%s s"
"%s min %s s"
+ "vybranou hlasovou zprávu"
+ "vybrané hlasové zprávy"
+ "Ano"
+ "Ne"
+
+
@string/call_log_header_today
"%1$s v %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-da/strings.xml b/java/com/android/dialer/app/res/values-da/strings.xml
index c3d44c01f..5315bee5e 100644
--- a/java/com/android/dialer/app/res/values-da/strings.xml
+++ b/java/com/android/dialer/app/res/values-da/strings.xml
@@ -42,6 +42,8 @@
"Ring tilbage"
"Besked"
"%1$s: %2$s"
+ "Ring til %s"
+ "Nummeret for talebeskeden er ukendt"
- %1$d talebeskeder
- %1$d talebeskeder
@@ -97,6 +99,12 @@
"Telefonsvarer"
"%s sek."
"%s min. %s sek."
+ "talebesked"
+ "talebeskeder"
+ "Ja"
+ "Nej"
+
+
@string/call_log_header_today
"%1$s kl. %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-de/strings.xml b/java/com/android/dialer/app/res/values-de/strings.xml
index 25bc8a6df..a50a8cd93 100644
--- a/java/com/android/dialer/app/res/values-de/strings.xml
+++ b/java/com/android/dialer/app/res/values-de/strings.xml
@@ -42,6 +42,10 @@
"Zurückrufen"
"Nachricht"
"%1$s: %2$s"
+
+
+
+
- %1$d Mailboxnachrichten
- Mailboxnachricht
@@ -97,6 +101,12 @@
"Mailbox"
"%s s"
"%s min %s s"
+ "Mailboxnachricht"
+ "Mailboxnachrichten"
+ "Ja"
+ "Nein"
+
+
@string/call_log_header_today
"%1$s um %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-el/strings.xml b/java/com/android/dialer/app/res/values-el/strings.xml
index 620ae1130..9978eac96 100644
--- a/java/com/android/dialer/app/res/values-el/strings.xml
+++ b/java/com/android/dialer/app/res/values-el/strings.xml
@@ -42,6 +42,8 @@
"Επανάκληση"
"Μήνυμα"
"%1$s: %2$s"
+ "Κλήση %s"
+ "Ο αριθμός αυτόματου τηλεφωνητή είναι άγνωστος"
- %1$d Μηνύματα αυτόμ. τηλεφωνητή
- Μήνυμα αυτόματου τηλεφωνητή
@@ -97,6 +99,12 @@
"Αυτόματος τηλεφωνητής"
"%s δευτερόλεπτα"
"%s λεπτά %s δευτερόλεπτα"
+ "φωνητικού μηνύματος αυτόματου τηλεφωνητή"
+ "φωνητικών μηνυμάτων αυτόματου τηλεφωνητή"
+ "Ναι"
+ "Όχι"
+
+
@string/call_log_header_today
"%1$s στις %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-en-rAU/strings.xml b/java/com/android/dialer/app/res/values-en-rAU/strings.xml
index 36d25346d..6525bb672 100644
--- a/java/com/android/dialer/app/res/values-en-rAU/strings.xml
+++ b/java/com/android/dialer/app/res/values-en-rAU/strings.xml
@@ -42,6 +42,8 @@
"Call back"
"Message"
"%1$s: %2$s"
+ "Dial %s"
+ "Voicemail number unknown"
- %1$d Voicemails
- Voicemail
@@ -97,6 +99,12 @@
"Voicemail"
"%s sec"
"%s min %s sec"
+ "voicemail"
+ "voicemails"
+ "Yes"
+ "No"
+
+
@string/call_log_header_today
"%1$s at %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-en-rGB/strings.xml b/java/com/android/dialer/app/res/values-en-rGB/strings.xml
index 36d25346d..6525bb672 100644
--- a/java/com/android/dialer/app/res/values-en-rGB/strings.xml
+++ b/java/com/android/dialer/app/res/values-en-rGB/strings.xml
@@ -42,6 +42,8 @@
"Call back"
"Message"
"%1$s: %2$s"
+ "Dial %s"
+ "Voicemail number unknown"
- %1$d Voicemails
- Voicemail
@@ -97,6 +99,12 @@
"Voicemail"
"%s sec"
"%s min %s sec"
+ "voicemail"
+ "voicemails"
+ "Yes"
+ "No"
+
+
@string/call_log_header_today
"%1$s at %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-en-rIN/strings.xml b/java/com/android/dialer/app/res/values-en-rIN/strings.xml
index 36d25346d..6525bb672 100644
--- a/java/com/android/dialer/app/res/values-en-rIN/strings.xml
+++ b/java/com/android/dialer/app/res/values-en-rIN/strings.xml
@@ -42,6 +42,8 @@
"Call back"
"Message"
"%1$s: %2$s"
+ "Dial %s"
+ "Voicemail number unknown"
- %1$d Voicemails
- Voicemail
@@ -97,6 +99,12 @@
"Voicemail"
"%s sec"
"%s min %s sec"
+ "voicemail"
+ "voicemails"
+ "Yes"
+ "No"
+
+
@string/call_log_header_today
"%1$s at %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-es-rUS/strings.xml b/java/com/android/dialer/app/res/values-es-rUS/strings.xml
index 798742fb1..d86c50b46 100644
--- a/java/com/android/dialer/app/res/values-es-rUS/strings.xml
+++ b/java/com/android/dialer/app/res/values-es-rUS/strings.xml
@@ -42,6 +42,8 @@
"Llamar"
"Mensaje"
"%1$s: %2$s"
+ "Marcar %s"
+ "Número de correo de voz desconocido"
- %1$d mensajes de voz
- mensaje de voz
@@ -97,6 +99,12 @@
"Correo de voz"
"%s s"
"%s min %s s"
+ "el mensaje de voz"
+ "los mensajes de voz"
+ "Sí"
+ "No"
+
+
@string/call_log_header_today
"El %1$s a la hora %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-es/strings.xml b/java/com/android/dialer/app/res/values-es/strings.xml
index 26ea210c7..3c68a3b99 100644
--- a/java/com/android/dialer/app/res/values-es/strings.xml
+++ b/java/com/android/dialer/app/res/values-es/strings.xml
@@ -42,6 +42,8 @@
"Llamar"
"Mensaje"
"%1$s: %2$s"
+ "Marcar %s"
+ "Número de buzón de voz desconocido"
- %1$d mensajes de voz
- mensaje de voz
@@ -97,6 +99,11 @@
"Buzón de voz"
"%s s"
"%s min y %s s"
+ "mensaje de voz"
+ "mensajes de voz"
+ "Sí"
+ "No"
+ "¿Eliminar la selección de %1$s?"
@string/call_log_header_today
"%1$s a las %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-et/strings.xml b/java/com/android/dialer/app/res/values-et/strings.xml
index de64ecbb2..071f4eab4 100644
--- a/java/com/android/dialer/app/res/values-et/strings.xml
+++ b/java/com/android/dialer/app/res/values-et/strings.xml
@@ -42,6 +42,8 @@
"Helista tagasi"
"Saada sõnum"
"%1$s: %2$s"
+ "Valige %s"
+ "Kõneposti number on teadmata"
- %1$d kõneposti teadet
- Kõneposti teade
@@ -97,6 +99,12 @@
"Kõnepost"
"%s s"
"%s min %s s"
+ "kõnepostisõnum"
+ "kõnepostisõnumid"
+ "Jah"
+ "Ei"
+
+
@string/call_log_header_today
"%1$s kell %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-eu/strings.xml b/java/com/android/dialer/app/res/values-eu/strings.xml
index 688de91dc..236850ab3 100644
--- a/java/com/android/dialer/app/res/values-eu/strings.xml
+++ b/java/com/android/dialer/app/res/values-eu/strings.xml
@@ -42,6 +42,8 @@
"Erantzun deiari"
"Mezua"
"%1$s: %2$s"
+ "Markatu %s"
+ "Erantzungailuaren zenbakia ezezaguna da"
- Erantzungailuko %1$d mezu
- Erantzungailuko mezua
@@ -97,6 +99,12 @@
"Erantzungailua"
"%s s"
"%s min %s s"
+ "ahots-mezua"
+ "ahots-mezuak"
+ "Bai"
+ "Ez"
+
+
@string/call_log_header_today
"%1$s (%2$s)"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-fa/strings.xml b/java/com/android/dialer/app/res/values-fa/strings.xml
index 63461664f..d76253f79 100644
--- a/java/com/android/dialer/app/res/values-fa/strings.xml
+++ b/java/com/android/dialer/app/res/values-fa/strings.xml
@@ -42,6 +42,10 @@
"پاسخ تماس"
"پیام"
"%1$s: %2$s"
+
+
+
+
- %1$d پست صوتی
- %1$d پست صوتی
@@ -97,6 +101,12 @@
"پست صوتی"
"%s ثانیه"
"%s دقیقه %s ثانیه"
+ "پست صوتی"
+ "پستهای صوتی"
+ "بله"
+ "نه"
+
+
@string/call_log_header_today
"%1$s ساعت %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-fi/strings.xml b/java/com/android/dialer/app/res/values-fi/strings.xml
index da70c087c..e247e4845 100644
--- a/java/com/android/dialer/app/res/values-fi/strings.xml
+++ b/java/com/android/dialer/app/res/values-fi/strings.xml
@@ -42,6 +42,8 @@
"Soita"
"Viesti"
"%1$s: %2$s"
+ "Soita numeroon %s"
+ "Puhelinvastaajan numero tuntematon"
- %1$d vastaajaviestiä
- Vastaajaviesti
@@ -97,6 +99,11 @@
"Vastaaja"
"%s s"
"%s min %s s"
+ "vastaajaviesti"
+ "vastaajaviestit"
+ "Kyllä"
+ "Ei"
+ "Poistetaanko %1$s?"
@string/call_log_header_today
"%1$s klo %2$s"
"%1$02d.%2$02d"
diff --git a/java/com/android/dialer/app/res/values-fr-rCA/strings.xml b/java/com/android/dialer/app/res/values-fr-rCA/strings.xml
index 84dcbc89d..33eae2b43 100644
--- a/java/com/android/dialer/app/res/values-fr-rCA/strings.xml
+++ b/java/com/android/dialer/app/res/values-fr-rCA/strings.xml
@@ -42,6 +42,8 @@
"Rappeler"
"Message"
"%1$s : %2$s"
+ "Composer le %s"
+ "Numéro de messagerie vocale inconnu"
- %1$d message vocal
- %1$d messages vocaux
@@ -97,6 +99,11 @@
"Messagerie vocale"
"%s s"
"%s min et %s sec"
+ "message vocal"
+ "messages vocaux"
+ "Oui"
+ "Non"
+ "Supprimer la sélection (%1$s)?"
@string/call_log_header_today
"%1$s à %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-fr/strings.xml b/java/com/android/dialer/app/res/values-fr/strings.xml
index 6f03106c4..e9bb8dd78 100644
--- a/java/com/android/dialer/app/res/values-fr/strings.xml
+++ b/java/com/android/dialer/app/res/values-fr/strings.xml
@@ -42,6 +42,8 @@
"Rappeler"
"Envoyer un SMS"
"%1$s : %2$s"
+ "Composer le %s"
+ "Numéro de messagerie vocale inconnu"
- %1$d message vocal
- %1$d messages vocaux
@@ -97,6 +99,11 @@
"Messagerie vocale"
"%s secondes"
"%s min et %s s"
+ "message vocal"
+ "messages vocaux"
+ "Oui"
+ "Non"
+ "Supprimer les messages vocaux sélectionnés (%1$s) ?"
@string/call_log_header_today
"%1$s à %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-gl/strings.xml b/java/com/android/dialer/app/res/values-gl/strings.xml
index 4d4e69377..41eacac16 100644
--- a/java/com/android/dialer/app/res/values-gl/strings.xml
+++ b/java/com/android/dialer/app/res/values-gl/strings.xml
@@ -42,6 +42,8 @@
"Devolver chamada"
"Mensaxe"
"%1$s: %2$s"
+ "Marca o %s"
+ "Número de correo de voz descoñecido"
- %1$d correos de voz
- Correo de voz
@@ -97,6 +99,12 @@
"Correo de voz"
"%s s"
"%s min %s s"
+ "correo de voz"
+ "correos de voz"
+ "Si"
+ "Non"
+
+
@string/call_log_header_today
"%1$s ás %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-gu/strings.xml b/java/com/android/dialer/app/res/values-gu/strings.xml
index 726d473a1..1b7b28a11 100644
--- a/java/com/android/dialer/app/res/values-gu/strings.xml
+++ b/java/com/android/dialer/app/res/values-gu/strings.xml
@@ -42,6 +42,8 @@
"કૉલ બેક"
"સંદેશ"
"%1$s: %2$s"
+ "%s ડાયલ કરો"
+ "વૉઇસમેઇલ નંબર અજાણ"
- %1$d વૉઇસમેઇલ્સ
- %1$d વૉઇસમેઇલ્સ
@@ -97,6 +99,12 @@
"વૉઇસમેઇલ"
"%s સેકંડ"
"%s મિ %s સે"
+ "વૉઇસમેઇલ"
+ "વૉઇસમેઇલ"
+ "હા"
+ "નહીં"
+
+
@string/call_log_header_today
"%1$s નાં રોજ %2$s વાગ્યે"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-hi/strings.xml b/java/com/android/dialer/app/res/values-hi/strings.xml
index f44d45bcb..cc8b287dc 100644
--- a/java/com/android/dialer/app/res/values-hi/strings.xml
+++ b/java/com/android/dialer/app/res/values-hi/strings.xml
@@ -42,6 +42,8 @@
"वापस कॉल करें"
"संदेश"
"%1$s: %2$s"
+ "%s डायल करें"
+ "वॉइसमेल नंबर अज्ञात"
- %1$d वॉइसमेल
- %1$d वॉइसमेल
@@ -97,6 +99,12 @@
"वॉयस मेल"
"%s सेकंड"
"%s मि. %s से."
+ "वॉयसमेल"
+ "वॉयसमेल"
+ "हां"
+ "नहीं"
+
+
@string/call_log_header_today
"%1$s को %2$s बजे"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-hr/strings.xml b/java/com/android/dialer/app/res/values-hr/strings.xml
index 0e5d0d0ec..4b12e83d7 100644
--- a/java/com/android/dialer/app/res/values-hr/strings.xml
+++ b/java/com/android/dialer/app/res/values-hr/strings.xml
@@ -42,6 +42,10 @@
"Povratni poziv"
"Poruka"
"%1$s: %2$s"
+
+
+
+
- %1$d poruka govorne pošte
- %1$d poruke govorne pošte
@@ -98,6 +102,12 @@
"Govorna pošta"
"%s s"
"%s min %s s"
+ "poruka govorne pošte"
+ "poruke govorne pošte"
+ "Da"
+ "Ne"
+
+
@string/call_log_header_today
"%1$s u %2$s"
"%1$02d.%2$02d"
diff --git a/java/com/android/dialer/app/res/values-hu/strings.xml b/java/com/android/dialer/app/res/values-hu/strings.xml
index fcc4454e2..7b529c205 100644
--- a/java/com/android/dialer/app/res/values-hu/strings.xml
+++ b/java/com/android/dialer/app/res/values-hu/strings.xml
@@ -42,6 +42,10 @@
"Visszahívás"
"Üzenet"
"%1$s: %2$s"
+
+
+
+
- %1$d hangpostaüzenet
- Hangpostaüzenet
@@ -97,6 +101,12 @@
"Hangposta"
"%s másodperc"
"%s perc %s másodperc"
+ "hangpostaüzenetet"
+ "hangpostaüzeneteket"
+ "Igen"
+ "Nem"
+
+
@string/call_log_header_today
"%1$s, %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-hy/strings.xml b/java/com/android/dialer/app/res/values-hy/strings.xml
index 008d34f17..b7b9cd34f 100644
--- a/java/com/android/dialer/app/res/values-hy/strings.xml
+++ b/java/com/android/dialer/app/res/values-hy/strings.xml
@@ -42,6 +42,8 @@
"Հետ զանգել"
"Հաղորդագրություն"
"%1$s՝ %2$s"
+ "Զանգել %s համարին"
+ "Ձայնային փոստի համարն անհայտ է"
- %1$d ձայնային փոստ
- %1$d ձայնային փոստ
@@ -97,6 +99,11 @@
"Ձայնային փոստ"
"%s վրկ"
"%s րոպե %s վայրկյան"
+ "ձայնային հաղորդագրություն"
+ "ձայնային հաղորդագրություններ"
+ "Այո"
+ "Ոչ"
+ "Ջնջե՞լ նշված %1$sը"
@string/call_log_header_today
"%1$s-ին, ժամը %2$s-ին"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-in/strings.xml b/java/com/android/dialer/app/res/values-in/strings.xml
index a133a6542..75b1edbe2 100644
--- a/java/com/android/dialer/app/res/values-in/strings.xml
+++ b/java/com/android/dialer/app/res/values-in/strings.xml
@@ -42,6 +42,10 @@
"Telepon"
"Pesan"
"%1$s: %2$s"
+
+
+
+
- %1$d Pesan suara
- Pesan suara
@@ -97,6 +101,12 @@
"Kotak Pesan"
"%s dtk"
"%s mnt %s dtk"
+ "pesan suara"
+ "pesan suara"
+ "Ya"
+ "Tidak"
+
+
@string/call_log_header_today
"%1$s pukul %2$s"
"%1$02d.%2$02d"
@@ -131,7 +141,7 @@
"Batalkan"
"Telepon %s"
"Buat kontak baru"
- "Tambah ke kontak"
+ "Tambahkan ke kontak"
"Kirim SMS"
"Lakukan video call"
"Blokir nomor"
diff --git a/java/com/android/dialer/app/res/values-is/strings.xml b/java/com/android/dialer/app/res/values-is/strings.xml
index c9dc4f371..b905ba886 100644
--- a/java/com/android/dialer/app/res/values-is/strings.xml
+++ b/java/com/android/dialer/app/res/values-is/strings.xml
@@ -42,6 +42,8 @@
"Hringja til baka"
"Skilaboð"
"%1$s: %2$s"
+ "Hringja í %s"
+ "Talhólfsnúmer ekki þekkt"
- %1$d talhólfsskilaboð
- %1$d talhólfsskilaboð
@@ -97,6 +99,12 @@
"Talhólf"
"%s sek."
"%s mín. og %s sek."
+ "talhólfsskilaboð"
+ "talhólfsskilaboð"
+ "Já"
+ "Nei"
+
+
@string/call_log_header_today
"%1$s kl. %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-it/strings.xml b/java/com/android/dialer/app/res/values-it/strings.xml
index 1465c91e1..322386fb9 100644
--- a/java/com/android/dialer/app/res/values-it/strings.xml
+++ b/java/com/android/dialer/app/res/values-it/strings.xml
@@ -42,6 +42,8 @@
"Richiama"
"Messaggio"
"%1$s: %2$s"
+ "Componi %s"
+ "Numero segreteria sconosciuto"
- %1$d messaggi in segreteria
- Messaggio in segreteria
@@ -97,6 +99,12 @@
"Segreteria"
"%s secondi"
"%s min %s s"
+ "messaggio vocale"
+ "messaggi vocali"
+ "Sì"
+ "No"
+
+
@string/call_log_header_today
"%1$s alle ore %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-iw/strings.xml b/java/com/android/dialer/app/res/values-iw/strings.xml
index efb655322..d3966b446 100644
--- a/java/com/android/dialer/app/res/values-iw/strings.xml
+++ b/java/com/android/dialer/app/res/values-iw/strings.xml
@@ -42,6 +42,8 @@
"התקשר חזרה"
"הודעה"
"%1$s: %2$s"
+ "חיוג אל %s"
+ "המספר של תא הדואר הקולי אינו ידוע"
- %1$d הודעות דואר קולי
- %1$d הודעות דואר קולי
@@ -99,6 +101,11 @@
"דואר קולי"
"%s שניות"
"%s דק\' %s שנ\'"
+ "ההודעה הקולית"
+ "ההודעות הקוליות"
+ "כן"
+ "לא"
+ "האם למחוק את %1$s שבחרת?"
@string/call_log_header_today
"%1$s ב-%2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-ja/strings.xml b/java/com/android/dialer/app/res/values-ja/strings.xml
index ccdf01759..147f572f7 100644
--- a/java/com/android/dialer/app/res/values-ja/strings.xml
+++ b/java/com/android/dialer/app/res/values-ja/strings.xml
@@ -42,6 +42,8 @@
"コールバック"
"メッセージ"
"%1$s さん: %2$s"
+ "%s 宛に発信"
+ "ボイスメールの番号が不明です"
- %1$d件のボイスメール
- 1件のボイスメール
@@ -97,6 +99,11 @@
"ボイスメール"
"%s秒"
"%s分%s秒"
+ "ボイスメール"
+ "ボイスメール"
+ "はい"
+ "いいえ"
+ "選択した%1$sを削除しますか?"
@string/call_log_header_today
"%1$s、%2$s"
"%1$02d 分 %2$02d 秒"
diff --git a/java/com/android/dialer/app/res/values-ka/strings.xml b/java/com/android/dialer/app/res/values-ka/strings.xml
index bebf1c542..4d573831e 100644
--- a/java/com/android/dialer/app/res/values-ka/strings.xml
+++ b/java/com/android/dialer/app/res/values-ka/strings.xml
@@ -42,6 +42,10 @@
"გადარეკვა"
"შეტყობინება"
"%1$s: %2$s"
+
+
+
+
- %1$d ხმოვანი ფოსტა
- ხმოვანი ფოსტა
@@ -97,6 +101,12 @@
"ხმოვანი ფოსტა"
"%s წმ"
"%s მინ %s წამ"
+ "ხმოვანი ფოსტა"
+ "ხმოვანი ფოსტა"
+ "დიახ"
+ "არა"
+
+
@string/call_log_header_today
"%1$s, %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-kk/strings.xml b/java/com/android/dialer/app/res/values-kk/strings.xml
index 7fa5d33ec..62397bbb9 100644
--- a/java/com/android/dialer/app/res/values-kk/strings.xml
+++ b/java/com/android/dialer/app/res/values-kk/strings.xml
@@ -42,6 +42,8 @@
"Қоңырау шалу"
"Хабар"
"%1$s: %2$s"
+ "%s нөмірін теру"
+ "Дауыстық пошта нөмірі белгісіз"
- %1$d дауыстық хабар
- Дауыстық хабар
@@ -97,6 +99,12 @@
"Дауыстық пошта"
"%s сек."
"%s мин %s сек"
+ "дауыстық хабар"
+ "дауыстық хабарлар"
+ "Иә"
+ "Жоқ"
+
+
@string/call_log_header_today
"%1$s, %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-km/strings.xml b/java/com/android/dialer/app/res/values-km/strings.xml
index 3b6fe9e71..27dbf97c9 100644
--- a/java/com/android/dialer/app/res/values-km/strings.xml
+++ b/java/com/android/dialer/app/res/values-km/strings.xml
@@ -42,6 +42,8 @@
"ហៅទៅវិញ"
"សារ"
"%1$s: %2$s"
+ "ហៅទូរសព្ទទៅកាន់ %s"
+ "មិនស្គាល់លេខសារជាសំឡេងទេ"
- សារជាសម្លេង %1$d
- សារជាសម្លេង
@@ -97,6 +99,11 @@
"សារជាសំឡេង"
"%s វិនាទី"
"%s នាទី %s វិនាទី"
+ "សារជាសំឡេង"
+ "សារជាសំឡេង"
+ "បាទ/ចាស"
+ "ទេ"
+ "លុប %1$s ដែលបានជ្រើសរើស?"
@string/call_log_header_today
"%1$s នៅម៉ោង %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-kn/strings.xml b/java/com/android/dialer/app/res/values-kn/strings.xml
index 68280f1f3..19e11e90f 100644
--- a/java/com/android/dialer/app/res/values-kn/strings.xml
+++ b/java/com/android/dialer/app/res/values-kn/strings.xml
@@ -42,6 +42,8 @@
"ಮರಳಿ ಕರೆ ಮಾಡಿ"
"ಸಂದೇಶ"
"%1$s: %2$s"
+ "%s ಗೆ ಡಯಲ್ ಮಾಡಿ"
+ "ಅಪರಿಚಿತ ಧ್ವನಿಮೇಲ್ ಸಂಖ್ಯೆ"
- %1$d ಧ್ವನಿಮೇಲ್ಗಳು
- %1$d ಧ್ವನಿಮೇಲ್ಗಳು
@@ -97,6 +99,12 @@
"ಧ್ವನಿಮೇಲ್"
"%s ಸೆಕೆಂ"
"%s ನಿಮಿ %s ಸೆಕೆಂ"
+ "ಧ್ವನಿಮೇಲ್"
+ "ಧ್ವನಿಮೇಲ್ಗಳು"
+ "ಹೌದು"
+ "ಇಲ್ಲ"
+
+
@string/call_log_header_today
"%1$s ರಂದು %2$s ಗಂಟೆಗೆ"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-ko/strings.xml b/java/com/android/dialer/app/res/values-ko/strings.xml
index f72a69139..d28760c6f 100644
--- a/java/com/android/dialer/app/res/values-ko/strings.xml
+++ b/java/com/android/dialer/app/res/values-ko/strings.xml
@@ -42,6 +42,8 @@
"통화하기"
"메시지"
"%1$s: %2$s"
+ "%s(으)로 전화걸기"
+ "알 수 없는 음성사서함 번호"
- 음성메일 %1$d개
- 음성메일
@@ -97,6 +99,12 @@
"음성사서함"
"%s초"
"%s분 %s초"
+ "음성사서함"
+ "음성사서함"
+ "예"
+ "아니요"
+
+
@string/call_log_header_today
"%1$s %2$s"
"%1$02d분 %2$02d초"
diff --git a/java/com/android/dialer/app/res/values-ky/strings.xml b/java/com/android/dialer/app/res/values-ky/strings.xml
index 34d87da09..85789978d 100644
--- a/java/com/android/dialer/app/res/values-ky/strings.xml
+++ b/java/com/android/dialer/app/res/values-ky/strings.xml
@@ -42,6 +42,10 @@
"Кайра чалуу"
"Билдирүү"
"%1$s: %2$s"
+
+
+
+
- %1$d Үн каты
- Үн каты
@@ -97,6 +101,12 @@
"Үн почтасы"
"%s сек."
"%s мүн. %s сек."
+ "үн почтасы"
+ "үн почталары"
+ "Ооба"
+ "Жок"
+
+
@string/call_log_header_today
"%1$s саат %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-lo/strings.xml b/java/com/android/dialer/app/res/values-lo/strings.xml
index 4bdb11338..a433847f9 100644
--- a/java/com/android/dialer/app/res/values-lo/strings.xml
+++ b/java/com/android/dialer/app/res/values-lo/strings.xml
@@ -42,6 +42,8 @@
"ໂທກັບ"
"ຂໍ້ຄວາມ"
"%1$s: %2$s"
+ "ໂທຫາ %s"
+ "ບໍ່ຮູ້ຈັກເບີຂໍ້ຄວາມສຽງ"
- %1$d ຂໍ້ຄວາມສຽງ
- ຂໍ້ຄວາມສຽງ
@@ -97,6 +99,12 @@
"ຂໍ້ຄວາມສຽງ"
"%s ວິນາທີ"
"%s ນທ %s ວິ"
+ "ຂໍ້ຄວາມສຽງ"
+ "ຂໍ້ຄວາມສຽງ"
+ "ແມ່ນແລ້ວ"
+ "ບໍ່"
+
+
@string/call_log_header_today
"%1$s ເວລາ %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-lt/strings.xml b/java/com/android/dialer/app/res/values-lt/strings.xml
index 5266dd1b8..c4feacf32 100644
--- a/java/com/android/dialer/app/res/values-lt/strings.xml
+++ b/java/com/android/dialer/app/res/values-lt/strings.xml
@@ -42,6 +42,8 @@
"Perskambinti"
"Siųsti pranešimą"
"%1$s: „%2$s“"
+ "Rinkti %s"
+ "Nežinomas balso pašto numeris"
- %1$d balso pašto pranešimas
- %1$d balso pašto pranešimai
@@ -99,6 +101,12 @@
"Balso paštas"
"%s sek."
"%s min. %s sek."
+ "balso pašto praneš."
+ "balso pašto praneš."
+ "Taip"
+ "Ne"
+
+
@string/call_log_header_today
"%1$s, %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-lv/strings.xml b/java/com/android/dialer/app/res/values-lv/strings.xml
index e36a47eae..440e2d4d1 100644
--- a/java/com/android/dialer/app/res/values-lv/strings.xml
+++ b/java/com/android/dialer/app/res/values-lv/strings.xml
@@ -42,6 +42,8 @@
"Atzvanīt"
"Sūtīt ziņojumu"
"%1$s: %2$s"
+ "Sastādiet šādu numuru: %s"
+ "Balss pasta numurs nav zināms."
- %1$d balss pasta ziņojumi
- %1$d balss pasta ziņojums
@@ -98,6 +100,12 @@
"Balss pasts"
"%s s"
"%s min %s s"
+ "balss pasta ziņojums"
+ "balss pasta ziņojumi"
+ "Jā"
+ "Nē"
+
+
@string/call_log_header_today
"%1$s plkst. %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-mk/strings.xml b/java/com/android/dialer/app/res/values-mk/strings.xml
index 742250d03..c179bb631 100644
--- a/java/com/android/dialer/app/res/values-mk/strings.xml
+++ b/java/com/android/dialer/app/res/values-mk/strings.xml
@@ -42,6 +42,8 @@
"Повикува назад"
"Порака"
"%1$s: %2$s"
+ "Бирајте %s"
+ "Бројот на говорната пошта е непознат"
- %1$d говорна порака
- %1$d говорни пораки
@@ -97,6 +99,12 @@
"Говорна пошта"
"%s сек."
"%s мин. %s сек."
+ "говорна пошта"
+ "говорни пораки"
+ "Да"
+ "Не"
+
+
@string/call_log_header_today
"%1$s во %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-ml/strings.xml b/java/com/android/dialer/app/res/values-ml/strings.xml
index 857973aaa..a642334b5 100644
--- a/java/com/android/dialer/app/res/values-ml/strings.xml
+++ b/java/com/android/dialer/app/res/values-ml/strings.xml
@@ -42,6 +42,8 @@
"കോൾബാക്ക്"
"സന്ദേശം"
"%1$s: %2$s"
+ "%s ഡയൽ ചെയ്യുക"
+ "വോയ്സ്മെയിൽ നമ്പർ അജ്ഞാതമാണ്"
- %1$d വോയ്സ്മെയിലുകൾ
- വോയ്സ്മെയിൽ
@@ -97,6 +99,12 @@
"വോയ്സ്മെയിൽ"
"%s സെക്കൻഡ്"
"%s മി. %s സെ."
+ "വോയ്സ്മെയിൽ"
+ "വോയ്സ്മെയിലുകൾ"
+ "അതെ"
+ "ഇല്ല"
+
+
@string/call_log_header_today
"%1$s, %2$s-ന്"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-mn/strings.xml b/java/com/android/dialer/app/res/values-mn/strings.xml
index decd08116..12f0d41cc 100644
--- a/java/com/android/dialer/app/res/values-mn/strings.xml
+++ b/java/com/android/dialer/app/res/values-mn/strings.xml
@@ -42,6 +42,8 @@
"Буцааж залгах"
"Зурвас"
"%1$s: %2$s"
+ "%s руу залгах"
+ "Дуут шуудангийн дугаар тодорхойгүй"
- %1$d Дуут шуудан
- Дуут шуудан
@@ -97,6 +99,11 @@
"Дуут шуудан"
"%s сек"
"%s минут %s секунд"
+ "дуут шуудан"
+ "дуут шуудан"
+ "Тийм"
+ "Үгүй"
+ "Сонгосон %1$s-г устгах уу?"
@string/call_log_header_today
"%1$s %2$s-д"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-mr/strings.xml b/java/com/android/dialer/app/res/values-mr/strings.xml
index 71233ac0e..feda81603 100644
--- a/java/com/android/dialer/app/res/values-mr/strings.xml
+++ b/java/com/android/dialer/app/res/values-mr/strings.xml
@@ -42,6 +42,8 @@
"पुन्हा कॉल करा"
"संदेश"
"%1$s: %2$s"
+ "%s डायल करा"
+ "व्हॉइसमेल नंबर अज्ञात"
- %1$d व्हॉइसमेल
- %1$d व्हॉइसमेल
@@ -97,6 +99,12 @@
"व्हॉइसमेल"
"%s सेकंद"
"%s मिनिट %s सेकंद"
+ "व्हॉइसमेल"
+ "व्हॉइसमेल"
+ "होय"
+ "नाही"
+
+
@string/call_log_header_today
"%1$s रोजी %2$s वाजता"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-ms/strings.xml b/java/com/android/dialer/app/res/values-ms/strings.xml
index 4373c7ca6..f4c9ac29f 100644
--- a/java/com/android/dialer/app/res/values-ms/strings.xml
+++ b/java/com/android/dialer/app/res/values-ms/strings.xml
@@ -42,6 +42,10 @@
"Panggil balik"
"Mesej"
"%1$s: %2$s"
+
+
+
+
- %1$d Mel suara
- Mel suara
@@ -97,6 +101,12 @@
"Mel suara"
"%s saat"
"%s min %s saat"
+ "mel suara"
+ "mel suara"
+ "Ya"
+ "Tidak"
+
+
@string/call_log_header_today
"%1$s pada %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-my/strings.xml b/java/com/android/dialer/app/res/values-my/strings.xml
index fa317bce4..16b286fd4 100644
--- a/java/com/android/dialer/app/res/values-my/strings.xml
+++ b/java/com/android/dialer/app/res/values-my/strings.xml
@@ -42,6 +42,8 @@
"ပြန်ခေါ်ပါ"
"မက်ဆေ့ဂျ်"
"%1$s - %2$s"
+ "%s ကို ခေါ်ပါ"
+ "အသံမေးလ်နံပါတ် မသိပါ"
- %1$d အသံမေးလ်များ
- အသံမေးလ်
@@ -97,6 +99,12 @@
"အသံစာပို့စနစ်"
"%s စက္ကန့်"
"%s မိနစ် %s စက္ကန့်"
+ "အသံမေးလ်"
+ "အသံမေးလ်များ"
+ "Yes"
+ "No"
+
+
@string/call_log_header_today
"%1$s %2$s ၌"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-nb/strings.xml b/java/com/android/dialer/app/res/values-nb/strings.xml
index 488864f3e..4d97dc23a 100644
--- a/java/com/android/dialer/app/res/values-nb/strings.xml
+++ b/java/com/android/dialer/app/res/values-nb/strings.xml
@@ -42,6 +42,8 @@
"Ring tilbake"
"Melding"
"%1$s: %2$s"
+ "Ring %s"
+ "Mangler nummer til talepostkasse"
- %1$d talemeldinger
- talemelding
@@ -97,6 +99,11 @@
"Telefonsvarer"
"%s sek"
"%s min %s sek"
+ "talepost"
+ "talepost"
+ "Ja"
+ "Nei"
+ "Slett markert %1$s?"
@string/call_log_header_today
"%1$s kl. %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-ne/strings.xml b/java/com/android/dialer/app/res/values-ne/strings.xml
index 33989648e..169c0111a 100644
--- a/java/com/android/dialer/app/res/values-ne/strings.xml
+++ b/java/com/android/dialer/app/res/values-ne/strings.xml
@@ -42,6 +42,8 @@
"फेरि कल गर्नुहोस्"
"सन्देश"
"%1$s: %2$s"
+ "%sमा डायल गर्नुहोस्"
+ "भ्वाइस मेल नम्बर अज्ञात"
- %1$d भ्वाइसमेलहरू
- भ्वाइसमेल
@@ -97,6 +99,11 @@
"भ्वाइसमेल"
"%s सेकेन्ड"
"%s मिनेट %s सकेन्ड"
+ "भ्वाइस मेल"
+ "भ्वाइस मेलहरू"
+ "हो"
+ "होइन"
+ "चयन गरिएका %1$s लाई मेटाउने हो?"
@string/call_log_header_today
"%1$s मा %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-nl/strings.xml b/java/com/android/dialer/app/res/values-nl/strings.xml
index 986236e4f..3eddbb7e2 100644
--- a/java/com/android/dialer/app/res/values-nl/strings.xml
+++ b/java/com/android/dialer/app/res/values-nl/strings.xml
@@ -42,6 +42,8 @@
"Terugbellen"
"Bericht"
"%1$s: %2$s"
+ "%s bellen"
+ "Voicemailnummer onbekend"
- %1$d voicemails
- Voicemail
@@ -97,6 +99,12 @@
"Voicemail"
"%s sec."
"%s min. %s sec."
+ "voicemail"
+ "voicemails"
+ "Ja"
+ "Nee"
+
+
@string/call_log_header_today
"%1$s om %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-no/strings.xml b/java/com/android/dialer/app/res/values-no/strings.xml
index 488864f3e..4d97dc23a 100644
--- a/java/com/android/dialer/app/res/values-no/strings.xml
+++ b/java/com/android/dialer/app/res/values-no/strings.xml
@@ -42,6 +42,8 @@
"Ring tilbake"
"Melding"
"%1$s: %2$s"
+ "Ring %s"
+ "Mangler nummer til talepostkasse"
- %1$d talemeldinger
- talemelding
@@ -97,6 +99,11 @@
"Telefonsvarer"
"%s sek"
"%s min %s sek"
+ "talepost"
+ "talepost"
+ "Ja"
+ "Nei"
+ "Slett markert %1$s?"
@string/call_log_header_today
"%1$s kl. %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-pa/strings.xml b/java/com/android/dialer/app/res/values-pa/strings.xml
index 6e9cc03a9..c8a39f6ae 100644
--- a/java/com/android/dialer/app/res/values-pa/strings.xml
+++ b/java/com/android/dialer/app/res/values-pa/strings.xml
@@ -42,6 +42,8 @@
"ਕਾਲ ਬੈਕ ਕਰੋ"
"ਸੁਨੇਹਾ"
"%1$s: %2$s"
+ "%s ਡਾਇਲ ਕਰੋ"
+ "ਵੌਇਸਮੇਲ ਨੰਬਰ ਅਗਿਆਤ"
- %1$d ਵੌਇਸਮੇਲਾਂ
- %1$d ਵੌਇਸਮੇਲਾਂ
@@ -97,6 +99,12 @@
"ਵੌਇਸਮੇਲ"
"%s ਸਕਿੰਟ"
"%s ਮਿੰਟ %s ਸਕਿੰਟ"
+ "ਵੌਇਸਮੇਲ"
+ "ਵੌਇਸਮੇਲਾਂ"
+ "ਹਾਂ"
+ "ਨਹੀਂ"
+
+
@string/call_log_header_today
"%1$s ਨੂੰ %2$s ਵਜੇ"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-pl/strings.xml b/java/com/android/dialer/app/res/values-pl/strings.xml
index 0c8f43ff6..452854064 100644
--- a/java/com/android/dialer/app/res/values-pl/strings.xml
+++ b/java/com/android/dialer/app/res/values-pl/strings.xml
@@ -42,6 +42,8 @@
"Oddzwoń"
"Wyślij SMS-a"
"%1$s: %2$s"
+ "Zadzwoń pod numer %s"
+ "Numer poczty głosowej jest nieznany"
- %1$d wiadomości głosowe
- %1$d wiadomości głosowych
@@ -99,6 +101,12 @@
"Poczta głosowa"
"%s s"
"%s min %s s"
+ "wiadomości głosowe"
+ "wiadomości głosowe"
+ "Tak"
+ "Nie"
+
+
@string/call_log_header_today
"%1$s o %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-pt-rBR/strings.xml b/java/com/android/dialer/app/res/values-pt-rBR/strings.xml
index 4f090df6e..845442a71 100644
--- a/java/com/android/dialer/app/res/values-pt-rBR/strings.xml
+++ b/java/com/android/dialer/app/res/values-pt-rBR/strings.xml
@@ -42,6 +42,8 @@
"Retornar chamada"
"Mensagem"
"%1$s: %2$s"
+ "Discar %s"
+ "Número do correio de voz desconhecido"
- %1$d Correios de voz
- %1$d Correios de voz
@@ -97,6 +99,12 @@
"Correio de voz"
"%s seg"
"%s m %s s"
+ "correio de voz"
+ "correios de voz"
+ "Sim"
+ "Não"
+
+
@string/call_log_header_today
"%1$s às %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-pt-rPT/strings.xml b/java/com/android/dialer/app/res/values-pt-rPT/strings.xml
index 9cabdc4a5..95451bc9d 100644
--- a/java/com/android/dialer/app/res/values-pt-rPT/strings.xml
+++ b/java/com/android/dialer/app/res/values-pt-rPT/strings.xml
@@ -42,6 +42,8 @@
"Ligar de volta"
"Mensagem"
"%1$s: %2$s"
+ "Marcar %s"
+ "Número do correio de voz desconhecido"
- %1$d mensagens de correio de voz
- Mensagem de correio de voz
@@ -97,6 +99,12 @@
"Correio de voz"
"%s seg"
"%s min. %s seg."
+ "mensagem de correio de voz"
+ "mensagens de correio de voz"
+ "Sim"
+ "Não"
+
+
@string/call_log_header_today
"%1$s às %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-pt/strings.xml b/java/com/android/dialer/app/res/values-pt/strings.xml
index 4f090df6e..845442a71 100644
--- a/java/com/android/dialer/app/res/values-pt/strings.xml
+++ b/java/com/android/dialer/app/res/values-pt/strings.xml
@@ -42,6 +42,8 @@
"Retornar chamada"
"Mensagem"
"%1$s: %2$s"
+ "Discar %s"
+ "Número do correio de voz desconhecido"
- %1$d Correios de voz
- %1$d Correios de voz
@@ -97,6 +99,12 @@
"Correio de voz"
"%s seg"
"%s m %s s"
+ "correio de voz"
+ "correios de voz"
+ "Sim"
+ "Não"
+
+
@string/call_log_header_today
"%1$s às %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-ro/strings.xml b/java/com/android/dialer/app/res/values-ro/strings.xml
index 3a083ae74..36987fe3e 100644
--- a/java/com/android/dialer/app/res/values-ro/strings.xml
+++ b/java/com/android/dialer/app/res/values-ro/strings.xml
@@ -42,6 +42,8 @@
"Sunați"
"Trimiteți mesaj"
"%1$s: %2$s"
+ "Apelați %s"
+ "Numărul mesageriei vocale necunoscut"
- %1$d mesaje vocale
- %1$d de mesaje vocale
@@ -98,6 +100,12 @@
"Mesagerie vocală"
"%s secunde"
"%s min. %s sec."
+ "mesagerie vocală"
+ "mesaje vocale"
+ "Da"
+ "Nu"
+
+
@string/call_log_header_today
"%1$s la %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-ru/strings.xml b/java/com/android/dialer/app/res/values-ru/strings.xml
index 925d684a5..69031b14f 100644
--- a/java/com/android/dialer/app/res/values-ru/strings.xml
+++ b/java/com/android/dialer/app/res/values-ru/strings.xml
@@ -42,6 +42,8 @@
"Позвонить"
"Написать SMS"
"%1$s: %2$s"
+ "Позвонить: %s"
+ "Номер голосовой почты неизвестен"
- %1$d голосовое сообщение
- %1$d голосовых сообщения
@@ -99,6 +101,12 @@
"Голосовая почта"
"%s сек."
"%s мин. %s сек."
+ "голосовое сообщение"
+ "голосовые сообщения"
+ "Да"
+ "Нет"
+
+
@string/call_log_header_today
"%1$s в %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-si/strings.xml b/java/com/android/dialer/app/res/values-si/strings.xml
index 55ce37b81..45ee7d961 100644
--- a/java/com/android/dialer/app/res/values-si/strings.xml
+++ b/java/com/android/dialer/app/res/values-si/strings.xml
@@ -42,6 +42,8 @@
"නැවත අමතන්න"
"පණිවිඩය"
"%1$s: %2$s"
+ "%s ඩයල් කරන්න"
+ "හඬ තැපැල් අංකය නොදනී"
- හඬ තැපැල් %1$d
- හඬ තැපැල් %1$d
@@ -97,6 +99,12 @@
"හඬ තැපෑල"
"තත් %s"
"මිනි %s තත් %s"
+ "හඬ තැපෑල"
+ "හඬ තැපැල්"
+ "ඔව්"
+ "නැත"
+
+
@string/call_log_header_today
"%1$s දින %2$sට"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-sk/strings.xml b/java/com/android/dialer/app/res/values-sk/strings.xml
index 59f3d10f1..9774a4180 100644
--- a/java/com/android/dialer/app/res/values-sk/strings.xml
+++ b/java/com/android/dialer/app/res/values-sk/strings.xml
@@ -42,6 +42,8 @@
"Zavolať"
"Správa"
"%1$s: %2$s"
+ "Vytočiť číslo %s"
+ "Číslo hlasovej schránky je neznáme"
- %1$d odkazy v hlasovej schránke
- %1$d odkazu v hlasovej schránke
@@ -99,6 +101,12 @@
"Hlasová schránka"
"%s s"
"%s min. %s s"
+ "hlasová správa"
+ "hlasové správy"
+ "Áno"
+ "Nie"
+
+
@string/call_log_header_today
"%1$s o %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-sl/strings.xml b/java/com/android/dialer/app/res/values-sl/strings.xml
index 28f4ce021..80898e58d 100644
--- a/java/com/android/dialer/app/res/values-sl/strings.xml
+++ b/java/com/android/dialer/app/res/values-sl/strings.xml
@@ -42,6 +42,8 @@
"Povratni klic"
"SMS"
"%1$s: %2$s"
+ "Kliči %s"
+ "Neznana številka odzivnika"
- %1$d sporočilo v odzivniku
- %1$d sporočili v odzivniku
@@ -99,6 +101,12 @@
"Glasovna pošta"
"%s s"
"%s min %s s"
+ "sporočilo v odzivniku"
+ "sporočila v odzivniku"
+ "Da"
+ "Ne"
+
+
@string/call_log_header_today
"%1$s ob %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-sq/strings.xml b/java/com/android/dialer/app/res/values-sq/strings.xml
index 48ec8fee8..ea757a873 100644
--- a/java/com/android/dialer/app/res/values-sq/strings.xml
+++ b/java/com/android/dialer/app/res/values-sq/strings.xml
@@ -42,6 +42,10 @@
"Telefono"
"Mesazh"
"%1$s: %2$s"
+
+
+
+
- %1$d posta zanore
- postë zanore
@@ -97,6 +101,12 @@
"Posta zanore"
"%s sekonda"
"%s min. e %s sek."
+ "posta zanore"
+ "postat zanore"
+ "Po"
+ "Jo"
+
+
@string/call_log_header_today
"%1$s në %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-sr/strings.xml b/java/com/android/dialer/app/res/values-sr/strings.xml
index fd4e2b9ba..610f230f7 100644
--- a/java/com/android/dialer/app/res/values-sr/strings.xml
+++ b/java/com/android/dialer/app/res/values-sr/strings.xml
@@ -42,6 +42,8 @@
"Узврати позив"
"Пошаљи SMS"
"%1$s: %2$s"
+ "Позови %s"
+ "Непознат број говорне поште"
- %1$d говорна порука
- %1$d говорне поруке
@@ -98,6 +100,12 @@
"Говорна пошта"
"%s сек"
"%s мин %s сек"
+ "говорну поруку"
+ "говорне поруке"
+ "Да"
+ "Не"
+
+
@string/call_log_header_today
"%1$s у %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-sv/strings.xml b/java/com/android/dialer/app/res/values-sv/strings.xml
index fc8920a38..c29568ba3 100644
--- a/java/com/android/dialer/app/res/values-sv/strings.xml
+++ b/java/com/android/dialer/app/res/values-sv/strings.xml
@@ -42,6 +42,8 @@
"Ring upp"
"Meddelande"
"%1$s: %2$s"
+ "Ring %s"
+ "Numret till röstbrevlådan är okänt"
- %1$d röstmeddelanden
- röstmeddelande
@@ -97,6 +99,12 @@
"Röstbrevlåda"
"%s sekund"
"%s min %s sek"
+ "röstbrevlåda"
+ "röstmeddelanden"
+ "Ja"
+ "Nej"
+
+
@string/call_log_header_today
"%1$s kl. %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-sw/strings.xml b/java/com/android/dialer/app/res/values-sw/strings.xml
index 4c469979a..11f5664d0 100644
--- a/java/com/android/dialer/app/res/values-sw/strings.xml
+++ b/java/com/android/dialer/app/res/values-sw/strings.xml
@@ -42,6 +42,10 @@
"Mpigie"
"Ujumbe"
"%1$s: %2$s"
+
+
+
+
- Ujumbe %1$d wa sauti
- Ujumbe wa sauti
@@ -97,6 +101,12 @@
"Ujumbe wa sauti"
"Sekunde %s"
"Dak %s sek %s"
+ "ujumbe wa sauti"
+ "ujumbe wa sauti"
+ "Ndiyo"
+ "Hapana"
+
+
@string/call_log_header_today
"%1$s saa %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-ta/strings.xml b/java/com/android/dialer/app/res/values-ta/strings.xml
index 0b5a51d9f..795a4e7cb 100644
--- a/java/com/android/dialer/app/res/values-ta/strings.xml
+++ b/java/com/android/dialer/app/res/values-ta/strings.xml
@@ -42,6 +42,8 @@
"அழை"
"செய்தி அனுப்பு"
"%1$s: %2$s"
+ "%s என்ற எண்ணை அழைக்கவும்"
+ "குரலஞ்சல் எண் அறியப்படவில்லை"
- %1$d குரலஞ்சல்கள்
- குரலஞ்சல்
@@ -97,6 +99,12 @@
"குரலஞ்சல்"
"%s வி"
"%s நிமிடம் %s வினாடி"
+ "குரலஞ்சல்"
+ "குரலஞ்சல்கள்"
+ "ஆம்"
+ "வேண்டாம்"
+
+
@string/call_log_header_today
"%1$s அன்று %2$s மணிக்கு"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-te/strings.xml b/java/com/android/dialer/app/res/values-te/strings.xml
index 512f7e276..531e20618 100644
--- a/java/com/android/dialer/app/res/values-te/strings.xml
+++ b/java/com/android/dialer/app/res/values-te/strings.xml
@@ -42,6 +42,8 @@
"కాల్ చేయి"
"సందేశం పంపు"
"%1$s: %2$s"
+ "%sకు డయల్ చేయండి"
+ "వాయిస్ మెయిల్ నంబర్ తెలియదు"
- %1$d వాయిస్ మెయిల్లు
- వాయిస్ మెయిల్
@@ -97,6 +99,12 @@
"వాయిస్ మెయిల్"
"%s సెక"
"%s నిమి %s సెక"
+ "వాయిస్ మెయిల్"
+ "వాయిస్ మెయిల్లు"
+ "అవును"
+ "వద్దు"
+
+
@string/call_log_header_today
"%1$s %2$sకి"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-th/strings.xml b/java/com/android/dialer/app/res/values-th/strings.xml
index 6817d51b8..0433a6eb4 100644
--- a/java/com/android/dialer/app/res/values-th/strings.xml
+++ b/java/com/android/dialer/app/res/values-th/strings.xml
@@ -42,6 +42,8 @@
"โทรกลับ"
"ข้อความ"
"%1$s: %2$s"
+ "หมุนหมายเลข %s"
+ "ไม่ทราบหมายเลขข้อความเสียง"
- %1$d ข้อความเสียง
- ข้อความเสียง
@@ -97,6 +99,12 @@
"ข้อความเสียง"
"%s วินาที"
"%s นาที %s วินาที"
+ "ข้อความเสียง"
+ "ข้อความเสียง"
+ "ใช่"
+ "ไม่"
+
+
@string/call_log_header_today
"วันที่ %1$s เวลา %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-tl/strings.xml b/java/com/android/dialer/app/res/values-tl/strings.xml
index c98a04633..6eb1723ff 100644
--- a/java/com/android/dialer/app/res/values-tl/strings.xml
+++ b/java/com/android/dialer/app/res/values-tl/strings.xml
@@ -42,6 +42,8 @@
"Tawagan"
"Mensahe"
"%1$s: %2$s"
+ "I-dial ang %s"
+ "Hindi kilala ang numero ng voicemail"
- %1$d Voicemail
- %1$d na Voicemail
@@ -97,6 +99,12 @@
"Voicemail"
"%s sec"
"%s min %s sec"
+ "voicemail"
+ "mga voicemail"
+ "Oo"
+ "Hindi"
+
+
@string/call_log_header_today
"%1$s ng %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-tr/strings.xml b/java/com/android/dialer/app/res/values-tr/strings.xml
index 73b3cd729..751286b30 100644
--- a/java/com/android/dialer/app/res/values-tr/strings.xml
+++ b/java/com/android/dialer/app/res/values-tr/strings.xml
@@ -42,6 +42,10 @@
"Geri ara"
"İleti"
"%1$s: %2$s"
+
+
+
+
- %1$d Sesli Mesaj
- Sesli Mesaj
@@ -97,6 +101,12 @@
"Sesli Mesaj"
"%s sn."
"%s dk. %s sn."
+ "sesli mesaj"
+ "sesli mesajlar"
+ "Evet"
+ "Hayır"
+
+
@string/call_log_header_today
"%1$s, %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-uk/strings.xml b/java/com/android/dialer/app/res/values-uk/strings.xml
index dd7689093..0da2ea9f2 100644
--- a/java/com/android/dialer/app/res/values-uk/strings.xml
+++ b/java/com/android/dialer/app/res/values-uk/strings.xml
@@ -42,6 +42,8 @@
"Передзвонити"
"Повідомлення"
"%1$s: %2$s"
+ "Набрати %s"
+ "Невідомий номер голосової пошти"
- %1$d голосове повідомлення
- %1$d голосові повідомлення
@@ -99,6 +101,12 @@
"Голосова пошта"
"%s с"
"%s хв %s с"
+ "голосова пошта"
+ "голосова пошта"
+ "Так"
+ "Ні"
+
+
@string/call_log_header_today
"%1$s о %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-ur/strings.xml b/java/com/android/dialer/app/res/values-ur/strings.xml
index 534b915cc..748e2f210 100644
--- a/java/com/android/dialer/app/res/values-ur/strings.xml
+++ b/java/com/android/dialer/app/res/values-ur/strings.xml
@@ -42,6 +42,10 @@
"واپس کال کریں"
"پیغام"
"%1$s: %2$s"
+
+
+
+
- %1$d صوتی میلز
- صوتی میل
@@ -97,6 +101,12 @@
"صوتی میل"
"%s سیکنڈ"
"%s منٹ %s سیکنڈ"
+ "صوتی میل"
+ "صوتی میلز"
+ "ہاں"
+ "نہیں"
+
+
@string/call_log_header_today
"%1$s بوقت %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-uz/strings.xml b/java/com/android/dialer/app/res/values-uz/strings.xml
index 11befbc51..a13da4389 100644
--- a/java/com/android/dialer/app/res/values-uz/strings.xml
+++ b/java/com/android/dialer/app/res/values-uz/strings.xml
@@ -42,6 +42,10 @@
"Telefon"
"SMS yozish"
"%1$s: %2$s"
+
+
+
+
- %1$d ta ovozli xabar
- Ovozli xabar
@@ -97,6 +101,12 @@
"Ovozli pochta"
"%s soniya"
"%s daq %s son"
+ "ovozli xabar"
+ "ovozli xabarlar"
+ "Ha"
+ "Yo‘q"
+
+
@string/call_log_header_today
"%1$s, %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-vi/strings.xml b/java/com/android/dialer/app/res/values-vi/strings.xml
index 942f06768..a95e0683c 100644
--- a/java/com/android/dialer/app/res/values-vi/strings.xml
+++ b/java/com/android/dialer/app/res/values-vi/strings.xml
@@ -42,6 +42,8 @@
"Gọi lại"
"Tin nhắn"
"%1$s: %2$s"
+ "Quay số %s"
+ "Số thư thoại không xác định"
- %1$d Thư thoại
- Thư thoại
@@ -97,6 +99,12 @@
"Thư thoại"
"%s giây"
"%s phút %s giây"
+ "thư thoại"
+ "thư thoại"
+ "Có"
+ "Không"
+
+
@string/call_log_header_today
"%1$s lúc %2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-zh-rCN/strings.xml b/java/com/android/dialer/app/res/values-zh-rCN/strings.xml
index 4b6f55a69..6a12a0711 100644
--- a/java/com/android/dialer/app/res/values-zh-rCN/strings.xml
+++ b/java/com/android/dialer/app/res/values-zh-rCN/strings.xml
@@ -42,6 +42,8 @@
"回拨"
"发短信"
"%1$s:%2$s"
+ "拨打 %s"
+ "语音信箱号码未知"
- %1$d 封语音邮件
- 1 封语音邮件
@@ -97,6 +99,12 @@
"语音信箱"
"%s 秒"
"%s 分钟 %s 秒"
+ "语音邮件"
+ "语音邮件"
+ "是"
+ "否"
+
+
@string/call_log_header_today
"%1$s%2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-zh-rHK/strings.xml b/java/com/android/dialer/app/res/values-zh-rHK/strings.xml
index 95dd23871..12e50fb09 100644
--- a/java/com/android/dialer/app/res/values-zh-rHK/strings.xml
+++ b/java/com/android/dialer/app/res/values-zh-rHK/strings.xml
@@ -42,6 +42,8 @@
"回撥"
"短訊"
"%1$s:%2$s"
+ "撥號 %s"
+ "沒有可用的留言信箱號碼"
- %1$d 個留言
- 留言
@@ -97,6 +99,11 @@
"留言"
"%s 秒"
"%s 分 %s 秒"
+ "留言"
+ "留言"
+ "是"
+ "否"
+ "要刪除所選的%1$s嗎?"
@string/call_log_header_today
"%1$s%2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-zh-rTW/strings.xml b/java/com/android/dialer/app/res/values-zh-rTW/strings.xml
index 66d986d8c..83d093e55 100644
--- a/java/com/android/dialer/app/res/values-zh-rTW/strings.xml
+++ b/java/com/android/dialer/app/res/values-zh-rTW/strings.xml
@@ -42,6 +42,10 @@
"回撥"
"傳送簡訊"
"%1$s:%2$s"
+
+
+
+
- %1$d 則語音留言
- 語音留言
@@ -97,6 +101,12 @@
"語音留言"
"%s 秒"
"%s 分 %s 秒"
+ "語音留言"
+ "語音留言"
+ "是"
+ "否"
+
+
@string/call_log_header_today
"%1$s%2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values-zu/strings.xml b/java/com/android/dialer/app/res/values-zu/strings.xml
index 4cee09247..840d16877 100644
--- a/java/com/android/dialer/app/res/values-zu/strings.xml
+++ b/java/com/android/dialer/app/res/values-zu/strings.xml
@@ -42,6 +42,8 @@
"Phinda ushaye"
"Umlayezo"
"%1$s: %2$s"
+ "Dayela %s"
+ "Inombolo yevoyisimeyili ayaziwa"
- %1$d Amavoyisimeyili
- %1$d Amavoyisimeyili
@@ -97,6 +99,12 @@
"Ivoyisimeyili"
"%s isekhondi"
"%s amaminithi %s amasekhondi"
+ "ivoyisimeyili"
+ "ama-meyli ezwi"
+ "Yebo"
+ "Cha"
+
+
@string/call_log_header_today
"%1$s ngo-%2$s"
"%1$02d:%2$02d"
diff --git a/java/com/android/dialer/app/res/values/strings.xml b/java/com/android/dialer/app/res/values/strings.xml
index 9944f9ff2..a4e443dca 100644
--- a/java/com/android/dialer/app/res/values/strings.xml
+++ b/java/com/android/dialer/app/res/values/strings.xml
@@ -105,6 +105,12 @@
%1$s: %2$s
+
+ Dial %s
+
+ Voicemail number unknown
- Voicemail
@@ -356,6 +362,12 @@
%s min %s sec
+ voicemail
+ voicemails
+ Yes
+ No
+ Delete selected %1$s?
+
diff --git a/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java b/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java
new file mode 100644
index 000000000..078a40a82
--- /dev/null
+++ b/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2017 The Android Open Source 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.app.voicemail;
+
+import android.annotation.TargetApi;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build.VERSION_CODES;
+import android.support.v4.os.BuildCompat;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.TelecomManager;
+import android.telephony.TelephonyManager;
+import com.android.dialer.app.calllog.DefaultVoicemailNotifier;
+import com.android.dialer.common.Assert;
+import com.android.dialer.common.LogUtil;
+import com.android.voicemail.VoicemailComponent;
+
+/**
+ * Receives {@link TelephonyManager#ACTION_SHOW_VOICEMAIL_NOTIFICATION}, and forwards to {@link
+ * DefaultVoicemailNotifier}. Will ignore the notification if the account has visual voicemail.
+ * Legacy voicemail is the traditional, non-visual, dial-in voicemail.
+ */
+@TargetApi(VERSION_CODES.O)
+public class LegacyVoicemailNotificationReceiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ LogUtil.i(
+ "LegacyVoicemailNotificationReceiver.onReceive", "received legacy voicemail notification");
+ Assert.checkArgument(BuildCompat.isAtLeastO());
+
+ PhoneAccountHandle phoneAccountHandle =
+ intent.getParcelableExtra(TelephonyManager.EXTRA_PHONE_ACCOUNT_HANDLE);
+ if (phoneAccountHandle == null) {
+ // TODO: assert instead after API has landed.
+ phoneAccountHandle =
+ context
+ .getSystemService(TelecomManager.class)
+ .getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_VOICEMAIL);
+ }
+ if (VoicemailComponent.get(context)
+ .getVoicemailClient()
+ .isActivated(context, phoneAccountHandle)) {
+ LogUtil.i(
+ "LegacyVoicemailNotificationReceiver.onReceive",
+ "visual voicemail is activated, ignoring notification");
+ return;
+ }
+
+ // Missing extra means there are unknown numbers of voicemails.
+ int count = intent.getIntExtra(TelephonyManager.EXTRA_NOTIFICATION_COUNT, 1);
+ if (count == 0) {
+ LogUtil.i("LegacyVoicemailNotificationReceiver.onReceive", "clearing notification");
+ DefaultVoicemailNotifier.getInstance(context).cancelLegacyNotification();
+ return;
+ }
+
+ String voicemailNumber = intent.getStringExtra(TelephonyManager.EXTRA_VOICEMAIL_NUMBER);
+ PendingIntent callVoicemailIntent =
+ intent.getParcelableExtra(TelephonyManager.EXTRA_CALL_VOICEMAIL_INTENT);
+ PendingIntent voicemailSettingIntent =
+ intent.getParcelableExtra(TelephonyManager.EXTRA_LAUNCH_VOICEMAIL_SETTINGS_INTENT);
+
+ LogUtil.i("LegacyVoicemailNotificationReceiver.onReceive", "sending notification");
+ DefaultVoicemailNotifier.getInstance(context)
+ .notifyLegacyVoicemail(
+ phoneAccountHandle,
+ count,
+ voicemailNumber,
+ callVoicemailIntent,
+ voicemailSettingIntent);
+ }
+}
diff --git a/java/com/android/dialer/app/voicemail/VoicemailErrorManager.java b/java/com/android/dialer/app/voicemail/VoicemailErrorManager.java
index 939007adf..a0bae36cc 100644
--- a/java/com/android/dialer/app/voicemail/VoicemailErrorManager.java
+++ b/java/com/android/dialer/app/voicemail/VoicemailErrorManager.java
@@ -20,15 +20,25 @@ import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.os.Handler;
+import android.support.annotation.MainThread;
+import android.telecom.PhoneAccountHandle;
+import android.telephony.PhoneStateListener;
+import android.telephony.ServiceState;
+import android.telephony.TelephonyManager;
+import android.util.ArrayMap;
import com.android.dialer.app.calllog.CallLogAlertManager;
import com.android.dialer.app.calllog.CallLogModalAlertManager;
import com.android.dialer.app.voicemail.error.VoicemailErrorAlert;
import com.android.dialer.app.voicemail.error.VoicemailErrorMessageCreator;
import com.android.dialer.app.voicemail.error.VoicemailStatus;
import com.android.dialer.app.voicemail.error.VoicemailStatusReader;
+import com.android.dialer.common.Assert;
+import com.android.dialer.common.LogUtil;
import com.android.dialer.database.CallLogQueryHandler;
+import com.android.voicemail.VoicemailComponent;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
/**
* Fetches voicemail status and generate {@link VoicemailStatus} for {@link VoicemailErrorAlert} to
@@ -40,12 +50,14 @@ public class VoicemailErrorManager implements CallLogQueryHandler.Listener, Voic
private final CallLogQueryHandler callLogQueryHandler;
private final VoicemailErrorAlert alertItem;
+ private final Map listeners = new ArrayMap<>();
+
private final ContentObserver statusObserver =
new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
- maybeFetchStatus();
+ fetchStatus();
}
};
@@ -61,13 +73,14 @@ public class VoicemailErrorManager implements CallLogQueryHandler.Listener, Voic
new VoicemailErrorAlert(
context, alertManager, modalAlertManager, new VoicemailErrorMessageCreator());
callLogQueryHandler = new CallLogQueryHandler(context, context.getContentResolver(), this);
- maybeFetchStatus();
+ fetchStatus();
}
public ContentObserver getContentObserver() {
return statusObserver;
}
+ @MainThread
@Override
public void onVoicemailStatusFetched(Cursor statusCursor) {
List statuses = new ArrayList<>();
@@ -75,6 +88,7 @@ public class VoicemailErrorManager implements CallLogQueryHandler.Listener, Voic
VoicemailStatus status = new VoicemailStatus(context, statusCursor);
if (status.isActive()) {
statuses.add(status);
+ addServiceStateListener(status);
}
}
alertItem.updateStatus(statuses, this);
@@ -82,6 +96,37 @@ public class VoicemailErrorManager implements CallLogQueryHandler.Listener, Voic
return;
}
+ @MainThread
+ private void addServiceStateListener(VoicemailStatus status) {
+ Assert.isMainThread();
+ if (!VoicemailComponent.get(context).getVoicemailClient().isVoicemailModuleEnabled()) {
+ LogUtil.i("VoicemailErrorManager.addServiceStateListener", "VVM module not enabled");
+ return;
+ }
+ if (!status.sourcePackage.equals(context.getPackageName())) {
+ LogUtil.i("VoicemailErrorManager.addServiceStateListener", "non-dialer source");
+ return;
+ }
+ TelephonyManager telephonyManager =
+ context
+ .getSystemService(TelephonyManager.class)
+ .createForPhoneAccountHandle(status.getPhoneAccountHandle());
+ if (telephonyManager == null) {
+ LogUtil.e("VoicemailErrorManager.addServiceStateListener", "invalid PhoneAccountHandle");
+ return;
+ }
+ PhoneAccountHandle phoneAccountHandle = status.getPhoneAccountHandle();
+ if (listeners.containsKey(phoneAccountHandle)) {
+ return;
+ }
+ LogUtil.i(
+ "VoicemailErrorManager.addServiceStateListener",
+ "adding listener for " + phoneAccountHandle);
+ ServiceStateListener serviceStateListener = new ServiceStateListener();
+ telephonyManager.listen(serviceStateListener, PhoneStateListener.LISTEN_SERVICE_STATE);
+ listeners.put(phoneAccountHandle, serviceStateListener);
+ }
+
@Override
public void onVoicemailUnreadCountFetched(Cursor cursor) {
// Do nothing
@@ -101,7 +146,7 @@ public class VoicemailErrorManager implements CallLogQueryHandler.Listener, Voic
public void onResume() {
isForeground = true;
if (statusInvalidated) {
- maybeFetchStatus();
+ fetchStatus();
}
}
@@ -110,15 +155,22 @@ public class VoicemailErrorManager implements CallLogQueryHandler.Listener, Voic
statusInvalidated = false;
}
+ public void onDestroy() {
+ TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class);
+ for (ServiceStateListener listener : listeners.values()) {
+ telephonyManager.listen(listener, PhoneStateListener.LISTEN_NONE);
+ }
+ }
+
@Override
public void refresh() {
- maybeFetchStatus();
+ fetchStatus();
}
/**
* Fetch the status when the dialer is in foreground, or queue a fetch when the dialer resumes.
*/
- private void maybeFetchStatus() {
+ private void fetchStatus() {
if (!isForeground) {
// Dialer is in the background, UI should not be updated. Reload the status when it resumes.
statusInvalidated = true;
@@ -126,4 +178,12 @@ public class VoicemailErrorManager implements CallLogQueryHandler.Listener, Voic
}
callLogQueryHandler.fetchVoicemailStatus();
}
+
+ private class ServiceStateListener extends PhoneStateListener {
+
+ @Override
+ public void onServiceStateChanged(ServiceState serviceState) {
+ fetchStatus();
+ }
+ }
}
diff --git a/java/com/android/dialer/app/voicemail/VoicemailPlaybackLayout.java b/java/com/android/dialer/app/voicemail/VoicemailPlaybackLayout.java
index 04fe7f66a..f160e024e 100644
--- a/java/com/android/dialer/app/voicemail/VoicemailPlaybackLayout.java
+++ b/java/com/android/dialer/app/voicemail/VoicemailPlaybackLayout.java
@@ -33,8 +33,8 @@ import android.widget.TextView;
import com.android.dialer.app.R;
import com.android.dialer.app.calllog.CallLogAsyncTaskUtil;
import com.android.dialer.app.calllog.CallLogListItemViewHolder;
+import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
import java.util.Objects;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
diff --git a/java/com/android/dialer/app/voicemail/VoicemailPlaybackPresenter.java b/java/com/android/dialer/app/voicemail/VoicemailPlaybackPresenter.java
index 5bfa03e90..5ac487b2d 100644
--- a/java/com/android/dialer/app/voicemail/VoicemailPlaybackPresenter.java
+++ b/java/com/android/dialer/app/voicemail/VoicemailPlaybackPresenter.java
@@ -54,8 +54,8 @@ import com.android.dialer.common.concurrent.AsyncTaskExecutors;
import com.android.dialer.common.concurrent.DialerExecutor;
import com.android.dialer.common.concurrent.DialerExecutors;
import com.android.dialer.constants.Constants;
+import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
import com.android.dialer.phonenumbercache.CallLogQuery;
import com.google.common.io.ByteStreams;
import java.io.File;
diff --git a/java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java b/java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java
index 2b19bd7bb..48602ea33 100644
--- a/java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java
+++ b/java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java
@@ -24,8 +24,8 @@ import android.telecom.PhoneAccountHandle;
import com.android.dialer.app.voicemail.error.VoicemailErrorMessage.Action;
import com.android.dialer.common.LogUtil;
import com.android.dialer.common.PerAccountSharedPreferences;
+import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
import com.android.voicemail.VoicemailClient;
import com.android.voicemail.VoicemailComponent;
import java.util.ArrayList;
@@ -184,8 +184,8 @@ public class OmtpVoicemailMessageCreator {
String title;
CharSequence message;
- int enabledImpression;
- int dismissedImpression;
+ DialerImpression.Type enabledImpression;
+ DialerImpression.Type dismissedImpression;
String dismissedKey;
if (isFull) {
@@ -237,20 +237,25 @@ public class OmtpVoicemailMessageCreator {
PerAccountSharedPreferences sharedPreferenceForAccount,
String title,
CharSequence message,
- int impressionToLogOnEnable,
- int impressionToLogOnDismiss,
+ DialerImpression.Type impressionToLogOnEnable,
+ DialerImpression.Type impressionToLogOnDismiss,
String preferenceKeyToUpdate) {
return new VoicemailErrorMessage(
title,
message,
+ VoicemailErrorMessage.createTurnArchiveOnAction(
+ context,
+ impressionToLogOnEnable,
+ status,
+ statusReader,
+ voicemailClient,
+ phoneAccountHandle),
VoicemailErrorMessage.createDismissTurnArchiveOnAction(
context,
impressionToLogOnDismiss,
statusReader,
sharedPreferenceForAccount,
- preferenceKeyToUpdate),
- VoicemailErrorMessage.createTurnArchiveOnAction(
- context, impressionToLogOnEnable, status, voicemailClient, phoneAccountHandle));
+ preferenceKeyToUpdate));
}
@Nullable
diff --git a/java/com/android/dialer/app/voicemail/error/VoicemailErrorAlert.java b/java/com/android/dialer/app/voicemail/error/VoicemailErrorAlert.java
index 628ef87eb..d045b1bd3 100644
--- a/java/com/android/dialer/app/voicemail/error/VoicemailErrorAlert.java
+++ b/java/com/android/dialer/app/voicemail/error/VoicemailErrorAlert.java
@@ -18,6 +18,7 @@ package com.android.dialer.app.voicemail.error;
import android.content.Context;
import android.support.annotation.VisibleForTesting;
+import android.text.util.Linkify;
import android.view.View;
import android.widget.TextView;
import com.android.dialer.app.alert.AlertManager;
@@ -119,6 +120,7 @@ public class VoicemailErrorAlert {
TextView tosTitle = (TextView) view.findViewById(R.id.tos_message_title);
tosTitle.setText(message.getTitle());
TextView tosDetails = (TextView) view.findViewById(R.id.tos_message_details);
+ tosDetails.setAutoLinkMask(Linkify.WEB_URLS);
tosDetails.setText(message.getDescription());
Assert.checkArgument(message.getActions().size() == 2);
diff --git a/java/com/android/dialer/app/voicemail/error/VoicemailErrorMessage.java b/java/com/android/dialer/app/voicemail/error/VoicemailErrorMessage.java
index 1ef80288b..a0dd30f0b 100644
--- a/java/com/android/dialer/app/voicemail/error/VoicemailErrorMessage.java
+++ b/java/com/android/dialer/app/voicemail/error/VoicemailErrorMessage.java
@@ -27,8 +27,8 @@ import android.view.View;
import android.view.View.OnClickListener;
import com.android.dialer.common.Assert;
import com.android.dialer.common.PerAccountSharedPreferences;
+import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
import com.android.dialer.util.CallUtil;
import com.android.voicemail.VoicemailClient;
import com.android.voicemail.VoicemailComponent;
@@ -191,8 +191,9 @@ public class VoicemailErrorMessage {
@NonNull
public static Action createTurnArchiveOnAction(
final Context context,
- int impressionToLog,
+ DialerImpression.Type impressionToLog,
final VoicemailStatus status,
+ VoicemailStatusReader statusReader,
VoicemailClient voicemailClient,
PhoneAccountHandle phoneAccountHandle) {
return new Action(
@@ -209,6 +210,7 @@ public class VoicemailErrorMessage {
Intent intent = new Intent(VoicemailContract.ACTION_SYNC_VOICEMAIL);
intent.setPackage(status.sourcePackage);
context.sendBroadcast(intent);
+ statusReader.refresh();
}
});
}
@@ -216,7 +218,7 @@ public class VoicemailErrorMessage {
@NonNull
public static Action createDismissTurnArchiveOnAction(
final Context context,
- int impressionToLog,
+ DialerImpression.Type impressionToLog,
VoicemailStatusReader statusReader,
PerAccountSharedPreferences sharedPreferenceForAccount,
String preferenceKeyToUpdate) {
diff --git a/java/com/android/dialer/app/voicemail/error/VoicemailStatus.java b/java/com/android/dialer/app/voicemail/error/VoicemailStatus.java
index c429d6dcc..1cfbe86d0 100644
--- a/java/com/android/dialer/app/voicemail/error/VoicemailStatus.java
+++ b/java/com/android/dialer/app/voicemail/error/VoicemailStatus.java
@@ -26,8 +26,11 @@ import android.provider.Settings;
import android.provider.Settings.Global;
import android.provider.VoicemailContract.Status;
import android.support.annotation.Nullable;
+import android.support.v4.os.BuildCompat;
import android.telecom.PhoneAccountHandle;
+import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
+import com.android.dialer.common.LogUtil;
import com.android.dialer.database.VoicemailStatusQuery;
/** Structured data from {@link android.provider.VoicemailContract.Status} */
@@ -60,6 +63,19 @@ public class VoicemailStatus {
settingsUri = getUri(statusCursor, VoicemailStatusQuery.SETTINGS_URI_INDEX);
voicemailAccessUri = getUri(statusCursor, VoicemailStatusQuery.VOICEMAIL_ACCESS_URI_INDEX);
+ if (VERSION.SDK_INT >= VERSION_CODES.N_MR1) {
+ type =
+ getString(
+ statusCursor, VoicemailStatusQuery.SOURCE_TYPE_INDEX, TelephonyManager.VVM_TYPE_OMTP);
+ phoneAccountComponentName =
+ getString(statusCursor, VoicemailStatusQuery.PHONE_ACCOUNT_COMPONENT_NAME, "");
+ phoneAccountId = getString(statusCursor, VoicemailStatusQuery.PHONE_ACCOUNT_ID, "");
+ } else {
+ type = TelephonyManager.VVM_TYPE_OMTP;
+ phoneAccountComponentName = "";
+ phoneAccountId = "";
+ }
+
configurationState =
getInt(
statusCursor,
@@ -70,12 +86,23 @@ public class VoicemailStatus {
statusCursor,
VoicemailStatusQuery.DATA_CHANNEL_STATE_INDEX,
Status.DATA_CHANNEL_STATE_NO_CONNECTION);
- notificationChannelState =
- getInt(
- statusCursor,
- VoicemailStatusQuery.NOTIFICATION_CHANNEL_STATE_INDEX,
- Status.NOTIFICATION_CHANNEL_STATE_NO_CONNECTION);
+ /* Before O, the NOTIFICATION_CHANNEL_STATE in the voicemail status table for the system
+ * visual voicemail client always correspond to the service state (cellular signal availability)
+ * Tracking the state in the background is redundant because it will not be visible to the
+ * user. It is much simpler to poll the status on the UI side. The result is injected back to
+ * the status query result so the handling will be consistent with other voicemail clients.
+ */
+ if (BuildCompat.isAtLeastO() && sourcePackage.equals(context.getPackageName())) {
+ notificationChannelState =
+ getNotificationChannelStateFormTelephony(context, getPhoneAccountHandle());
+ } else {
+ notificationChannelState =
+ getInt(
+ statusCursor,
+ VoicemailStatusQuery.NOTIFICATION_CHANNEL_STATE_INDEX,
+ Status.NOTIFICATION_CHANNEL_STATE_NO_CONNECTION);
+ }
isAirplaneMode =
Settings.System.getInt(context.getContentResolver(), Global.AIRPLANE_MODE_ON, 0) != 0;
@@ -88,18 +115,24 @@ public class VoicemailStatus {
quotaOccupied = Status.QUOTA_UNAVAILABLE;
quotaTotal = Status.QUOTA_UNAVAILABLE;
}
+ }
- if (VERSION.SDK_INT >= VERSION_CODES.N_MR1) {
- type =
- getString(
- statusCursor, VoicemailStatusQuery.SOURCE_TYPE_INDEX, TelephonyManager.VVM_TYPE_OMTP);
- phoneAccountComponentName =
- getString(statusCursor, VoicemailStatusQuery.PHONE_ACCOUNT_COMPONENT_NAME, "");
- phoneAccountId = getString(statusCursor, VoicemailStatusQuery.PHONE_ACCOUNT_ID, "");
+ private static int getNotificationChannelStateFormTelephony(
+ Context context, PhoneAccountHandle phoneAccountHandle) {
+ TelephonyManager telephonyManager =
+ context
+ .getSystemService(TelephonyManager.class)
+ .createForPhoneAccountHandle(phoneAccountHandle);
+ if (telephonyManager == null) {
+ LogUtil.e("VoicemailStatus.constructor", "invalid PhoneAccountHandle");
+ return Status.NOTIFICATION_CHANNEL_STATE_NO_CONNECTION;
} else {
- type = TelephonyManager.VVM_TYPE_OMTP;
- phoneAccountComponentName = "";
- phoneAccountId = "";
+ int state = telephonyManager.getServiceState().getState();
+ if (state == ServiceState.STATE_IN_SERVICE) {
+ return Status.NOTIFICATION_CHANNEL_STATE_OK;
+ } else {
+ return Status.NOTIFICATION_CHANNEL_STATE_NO_CONNECTION;
+ }
}
}
diff --git a/java/com/android/dialer/app/voicemail/error/VoicemailStatusCorruptionHandler.java b/java/com/android/dialer/app/voicemail/error/VoicemailStatusCorruptionHandler.java
index 6f411217c..2ff182b63 100644
--- a/java/com/android/dialer/app/voicemail/error/VoicemailStatusCorruptionHandler.java
+++ b/java/com/android/dialer/app/voicemail/error/VoicemailStatusCorruptionHandler.java
@@ -28,8 +28,8 @@ import com.android.contacts.common.compat.TelephonyManagerCompat;
import com.android.dialer.common.Assert;
import com.android.dialer.common.ConfigProviderBindings;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
/**
* This class will detect the corruption in the voicemail status and log it so we can track how many
diff --git a/java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java b/java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java
index d98ac2cd5..132e8a328 100644
--- a/java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java
+++ b/java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java
@@ -37,8 +37,10 @@ import com.android.contacts.common.compat.TelephonyManagerCompat;
import com.android.contacts.common.util.ContactDisplayUtils;
import com.android.dialer.app.voicemail.error.VoicemailErrorMessage.Action;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
+import com.android.voicemail.VoicemailClient;
+import com.android.voicemail.VoicemailComponent;
import java.util.Locale;
/**
@@ -379,7 +381,12 @@ public class Vvm3VoicemailMessageCreator {
@Override
public void onClick(DialogInterface dialog, int which) {
Logger.get(context).logImpression(DialerImpression.Type.VOICEMAIL_VVM3_TOS_DECLINED);
- TelephonyManagerCompat.setVisualVoicemailEnabled(telephonyManager, handle, false);
+ VoicemailClient voicemailClient = VoicemailComponent.get(context).getVoicemailClient();
+ if (voicemailClient.isVoicemailModuleEnabled()) {
+ voicemailClient.setVoicemailEnabled(context, status.getPhoneAccountHandle(), false);
+ } else {
+ TelephonyManagerCompat.setVisualVoicemailEnabled(telephonyManager, handle, false);
+ }
}
});
diff --git a/java/com/android/dialer/app/voicemail/error/res/drawable-hdpi/ic_voicemail_error_24px.png b/java/com/android/dialer/app/voicemail/error/res/drawable-hdpi/ic_voicemail_error_24px.png
new file mode 100644
index 000000000..1a5744bce
Binary files /dev/null and b/java/com/android/dialer/app/voicemail/error/res/drawable-hdpi/ic_voicemail_error_24px.png differ
diff --git a/java/com/android/dialer/app/voicemail/error/res/drawable-mdpi/ic_voicemail_error_24px.png b/java/com/android/dialer/app/voicemail/error/res/drawable-mdpi/ic_voicemail_error_24px.png
new file mode 100644
index 000000000..9936f0be6
Binary files /dev/null and b/java/com/android/dialer/app/voicemail/error/res/drawable-mdpi/ic_voicemail_error_24px.png differ
diff --git a/java/com/android/dialer/app/voicemail/error/res/drawable-xhdpi/ic_voicemail_error_24px.png b/java/com/android/dialer/app/voicemail/error/res/drawable-xhdpi/ic_voicemail_error_24px.png
new file mode 100644
index 000000000..9eff40989
Binary files /dev/null and b/java/com/android/dialer/app/voicemail/error/res/drawable-xhdpi/ic_voicemail_error_24px.png differ
diff --git a/java/com/android/dialer/app/voicemail/error/res/drawable-xxhdpi/ic_voicemail_error_24px.png b/java/com/android/dialer/app/voicemail/error/res/drawable-xxhdpi/ic_voicemail_error_24px.png
new file mode 100644
index 000000000..5b25f7300
Binary files /dev/null and b/java/com/android/dialer/app/voicemail/error/res/drawable-xxhdpi/ic_voicemail_error_24px.png differ
diff --git a/java/com/android/dialer/app/voicemail/error/res/drawable-xxxhdpi/ic_voicemail_error_24px.png b/java/com/android/dialer/app/voicemail/error/res/drawable-xxxhdpi/ic_voicemail_error_24px.png
new file mode 100644
index 000000000..d47ee4cdc
Binary files /dev/null and b/java/com/android/dialer/app/voicemail/error/res/drawable-xxxhdpi/ic_voicemail_error_24px.png differ
diff --git a/java/com/android/dialer/app/voicemail/error/res/layout/voicemail_error_message_fragment.xml b/java/com/android/dialer/app/voicemail/error/res/layout/voicemail_error_message_fragment.xml
index 4a40857a0..4bea8b152 100644
--- a/java/com/android/dialer/app/voicemail/error/res/layout/voicemail_error_message_fragment.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/layout/voicemail_error_message_fragment.xml
@@ -1,5 +1,5 @@
-
-
-
-
-
+ android:paddingTop="@dimen/alert_main_padding"
+ android:paddingBottom="@dimen/alert_main_padding"
+ android:paddingStart="@dimen/alert_main_padding"
+ android:paddingEnd="@dimen/alert_main_padding"
+ android:gravity="top"
+ android:orientation="horizontal">
-
+
+
+
+
+
+
+
+
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="@dimen/voicemail_promo_card_action_vertical_padding"
+ android:paddingBottom="@dimen/voicemail_promo_card_action_vertical_padding"
+ android:paddingEnd="@dimen/voicemail_promo_card_action_end_padding"
+ android:gravity="end"
+ android:orientation="horizontal">
+ android:id="@+id/secondary_action_raised"
+ style="@style/RaisedErrorActionStyle"
+ android:paddingEnd="@dimen/alert_action_between_padding"
+ android:layout_marginEnd="8dp"
+ android:nextFocusForward="@+id/secondary_action"
+ android:clickable="true"/>
+ android:id="@+id/secondary_action"
+ style="@style/ErrorActionStyle"
+ android:paddingEnd="@dimen/voicemail_promo_card_action_between_padding"
+ android:background="?android:attr/selectableItemBackground"
+ android:nextFocusForward="@+id/primary_action"/>
-
-
+ android:id="@+id/primary_action"
+ style="@style/ErrorActionStyle"
+ android:background="?android:attr/selectableItemBackground"
+ android:nextFocusForward="@+id/primary_action_raised"/>
+ android:id="@+id/primary_action_raised"
+ style="@style/RaisedErrorActionStyle"
+ android:nextFocusForward="@+id/promo_card"
+ android:clickable="true"
+ />
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-af/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-af/strings.xml
index 77f132136..9c64735af 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-af/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-af/strings.xml
@@ -44,10 +44,10 @@
"Jy sal nie nuwe stemboodskappe kan ontvang as jou inkassie vol is nie."
"Kan nie nuwe stemboodskappe ontvang nie"
"Jou inkassie is vol. Probeer \'n paar boodskappe uitvee om nuwe stemboodskappe te ontvang."
- "[Eksperimenteel] Skakel ekstra berging en rugsteun aan"
- "Jou posbus is vol. Maak spasie beskikbaar deur ekstra berging aan te skakel sodat Google jou stemboodskappe kan bestuur en rugsteun. ""Hierdie kenmerk word tans getoets ""en kan potensieel stemboodskappe van jou stemboodskapbediener af uitvee. Ons belowe ook nie om hierdie kenmerk in die toekoms te steun nie. Ons sal egter graag jou terugvoer wil kry."
- "[Eksperimenteel] Skakel ekstra berging en rugsteun aan"
- "Jou posbus is amper vol. Maak spasie beskikbaar deur ekstra berging aan te skakel sodat Google jou stemboodskappe kan bestuur en rugsteun. ""Hierdie kenmerk word tans getoets ""en kan potensieel stemboodskappe van jou stemboodskapbediener af uitvee. Ons belowe ook nie om hierdie kenmerk in die toekoms te steun nie. Ons sal egter graag jou terugvoer wil kry."
+ "Skakel ekstra berging en rugsteun aan"
+ "Jou posbus is vol. Om spasie beskikbaar te maak, skakel ekstra berging aan sodat Google jou stemboodskappe kan bestuur en rugsteun."
+ "Skakel ekstra berging en rugsteun aan"
+ "Jou posbus is amper vol. Om spasie beskikbaar te maak, skakel ekstra berging aan sodat Google jou stemboodskappe kan bestuur en rugsteun."
"Stel jou stemboodskap-PIN"
"Jy sal \'n stemboodskap-PIN nodig hê wanneer jy ook al na jou stemboodskapdiens toe bel."
"Onbekende fout"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-am/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-am/strings.xml
index 60851a655..502b87304 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-am/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-am/strings.xml
@@ -44,10 +44,10 @@
"የገቢ መልዕክት ሳጥንዎ ሙሉ ከሆነ አዲስ የድምጽ መልዕክት መቀበል አይችሉም።"
"አዲስ የድምጽ መልዕክት መቀበል አይቻልም"
"የመልዕክት ሳጥንዎ ሙሉ ነው። አዲስ የድምጽ መልዕክት ለመቀበል የተወሰኑ መልዕክቶችን ለመሰረዝ ይሞክሩ።"
- "[የሙከራ] ተጨማሪ ማከማቻ እና ምትኬን ያብሩ"
- "የመልዕክት ሳጥንዎ ሙሉ ነው። ቦታ ነጻ ለማድረግ፣ ተጨማሪ ማከማቻ ያብሩ እና Google የእርስዎን የድምፅ መልዕክት ማስተዳደር እና ምትኬ ማድረግ ይችላል። ""ይህ ባህሪይ በአሁኑ ጊዜ እየተሞከሩ ነው ""እናም ምናልባት ከድምፅ መልዕክት አገልጋይዎ የድምፅ መልዕክቶችን ሊሰርዝ ይችላል፣ እንዲሁም ለወደፊቱ ይህን ባህሪ ለመደገፍ ቃል አንገባም። ነገር ግን ግብረመልስዎን ብናገኝ እንወዳለን።"
- "[የሙከራ] ተጨማሪ ማከማቻ እና ምትኬን ያብሩ"
- "የመልዕክት ሳጥንዎ ከሞላ ጎደል ሙሉ ነው። ቦታ ነጻ ለማድረግ፣ ተጨማሪ ማከማቻ ያብሩ እና Google የእርስዎን የድምፅ መልዕክት ማስተዳደር እና ምትኬ ማድረግ ይችላል። ""ይህ ባህሪይ በአሁኑ ጊዜ እየተሞከሩ ነው ""እናም ምናልባት ከድምፅ መልዕክት አገልጋይዎ የድምፅ መልዕክቶችን ሊሰርዝ ይችላል፣ እንዲሁም ለወደፊቱ ይህን ባህሪ ለመደገፍ ቃል አንገባም። ነገር ግን ግብረመልስዎን ብናገኝ እንወዳለን።"
+ "ትርፍ ማከማቻ እና ምትኬን ያብሩ"
+ "የእርስዎ የመልእክት ሳጥን ሙሉ ነው። ባዶ ቦታ ነጻ ለማድረግ፣ Google የእርስዎን የድምፅ መልእክቶች ማስተዳደር እና በምትኬ ማስቀመጥ እንዲችል ትርፍ ማከማቻን ያብሩ።"
+ "ትርፍ ማከማቻ እና ምትኬን ያብሩ"
+ "የእርስዎ የመልእክት ሳጥን ሙሉ ነው። ባዶ ቦታ ነጻ ለማድረግ፣ Google የእርስዎን የድምፅ መልእክቶች ማስተዳደር እና በምትኬ ማስቀመጥ እንዲችል ትርፍ ማከማቻን ያብሩ።"
"የድምፅ መልዕክት ፒንዎን ያስገቡ"
"በማንኛውም ጊዜ የድምፅ መልዕክትዎ ላይ ለመድረስ ሲደውሉ የድምፅ መልዕክት ፒን ያስፈልግዎታል።"
"ያልታወቀ ስህተት"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-ar/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-ar/strings.xml
index d2c0fe697..6d462ef41 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-ar/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-ar/strings.xml
@@ -44,10 +44,10 @@
"لن تتمكن من تلقي بريد صوتي جديد إذا امتلأ بريدك الوارد."
"يتعذر تلقي رسائل بريد صوتي جديدة"
"بريدك الوارد ممتلئ. حاول حذف بعض الرسائل لتلقي رسائل بريد صوتي جديدة."
- "[ميزة تجريبية] تشغيل سعة التخزين الإضافية والنسخ الاحتياطي"
- "صندوق بريدك ممتلئ. للحصول على بعض المساحة، يمكنك تشغيل سعة التخزين الإضافية حتى يمكن لحساب Google إدارة رسائل البريد الصوتي ونسخها احتياطيًا. ""هذه الميزة قيد الاختبار حاليًا "" وقد تؤدي إلى حذف رسائل البريد الصوتي من خادم البريد الصوتي، ونحن لا نعد بدعم هذه الميزة في المستقبل. إلا أننا نود الحصول على تعليقات منك."
- "[ميزة تجريبية] تشغيل سعة التخزين الإضافية والنسخ الاحتياطي"
- "صندوق بريدك ممتلئ تقريبًا. للحصول على بعض المساحة، يمكنك تشغيل سعة التخزين الإضافية حتى يمكن لحساب Google إدارة رسائل البريد الصوتي ونسخها احتياطيًا. ""هذه الميزة قيد الاختبار حاليًا ""وقد تؤدي إلى حذف رسائل البريد الصوتي من خادم البريد الصوتي، ونحن لا نعد بدعم هذه الميزة في المستقبل. إلا أننا نود الحصول على تعليقات منك."
+ "تشغيل سعة التخزين الإضافية والنسخ الاحتياطي"
+ "صندوق بريدك ممتلئ. للحصول على بعض المساحة، ينبغي تشغيل سعة التخزين الإضافية حتى يتمكن Google من إدارة رسائل البريد الصوتي ونسخها احتياطيًا."
+ "تشغيل سعة التخزين الإضافية والنسخ الاحتياطي"
+ "صندوق بريدك ممتلئ. للحصول على بعض المساحة، ينبغي تشغيل سعة التخزين الإضافية حتى يتمكن Google من إدارة رسائل البريد الصوتي ونسخها احتياطيًا."
"إعداد رقم التعريف الشخصي للبريد الصوتي"
"ستحتاج رقم تعريف شخصي للبريد الصوتي في كل مرة تتصل فيها للوصول إلى بريدك الصوتي."
"حدث خطأ غير معروف"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-az/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-az/strings.xml
index aea92bf97..33ddafa0a 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-az/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-az/strings.xml
@@ -44,10 +44,10 @@
"Gələnlər qutusu dolu olduqda, yeni səsli mesaj almaq olmayacaq."
"Yeni səsli mesaj almaq olmur"
"Gələnlər qutusu doludur. Yeni səsli mesaj əldə etmək üçün bəzi mesajları silin."
- "[Eksperimental] Əlavə yaddaş və yedəkləməni aktiv edin"
- "E-poçt qutusu doludur. Boş yer yaratmaq üçün əlavə yaddaşı aktiv edin, beləliklə Google səsli e-məktub mesajlarını idarə edə və yedəkləyə bilər. ""Bu funksiya hazırda yoxlanılır ""və səsli e-poçt serverindən səsli e-məktubları potensial olaraq siləcək, gələcəkdə bu funksiyanı dəstəkləməyə söz vermirik. Lakin əks əlaqənizi istərdik."
- "[Eksperimental] Əlavə yaddaş və yedəkləməni aktiv edin"
- "E-poçt qutusu demək olar ki, doludur. Boş yer yaratmaq üçün əlavə yaddaşı aktiv edin, beləliklə Google səsli e-məktub mesajlarını idarə edə və yedəkləyə bilər. ""Bu funksiya hazırda yoxlanılır ""və səsli e-poçt serverindən səsli e-məktubları potensial olaraq siləcək, gələcəkdə bu funksiyanı dəstəkləməyə söz vermirik. Lakin əks əlaqənizi istərdik."
+ "Əlavə yaddaş və yedəkləməni aktiv edin"
+ "E-poçt qutusu doludur. Boş yer yaratmaq üçün əlavə yaddaşı aktiv edin, beləliklə Google səsli e-məktub mesajlarını idarə edə və yedəkləyə bilər."
+ "Əlavə yaddaş və yedəkləməni aktiv edin"
+ "E-poçt qutusu artıq doludur. Boş yer yaratmaq üçün əlavə yaddaşı aktiv edin, beləliklə Google səsli e-məktub mesajlarını idarə edə və yedəkləyə bilər."
"Səsli mesaj PIN kodunu ayarlayın"
"Zəng etdiyiniz zaman səsli mesaja daxil olmaq üçün PIN koda ehtiyacınız olacaq."
"Naməlum xəta"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-b+sr+Latn/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 000000000..98dc0619d
--- /dev/null
+++ b/java/com/android/dialer/app/voicemail/error/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,110 @@
+
+
+
+
+ "Isključite režim rada u avionu"
+ "Aktivira se vizuelna govorna pošta"
+ "Možda nećete dobijati obaveštenja o govornoj pošti dok potpuno ne aktivirate vizuelnu govornu poštu. Pozovite govornu poštu da biste preuzeli nove poruke dok govorna pošta ne bude potpuno aktivirana."
+ "Aktiviranje vizuelne govorne pošte nije uspelo"
+ "Proverite da li telefon ima mobilnu vezu i pokušajte ponovo."
+ "Isključite režim rada u avionu i pokušajte ponovo."
+ "Veza nije uspostavljena"
+ "Nećete dobijati obaveštenja o novim govornim porukama. Ako ste na Wi-Fi mreži, sinhronizujte da biste proverili govornu poštu."
+ "Nećete dobijati obaveštenja o novim govornim porukama. Isključite režim rada u avionu da biste sinhronizovali govornu poštu."
+ "Telefonu treba mobilna veza za prenos podataka da biste proverili govornu poštu."
+ "Aktiviranje vizuelne govorne pošte nije uspelo"
+ "I dalje možete da pozovete govornu poštu da biste je proverili."
+ "Ažuriranje vizuelne govorne pošte nije uspelo"
+ "Probajte ponovo kad budete imali bolju Wi-Fi ili mobilnu vezu. I dalje možete da pozovete govornu poštu da biste je proverili."
+ "Probajte ponovo kad budete imali bolju mobilnu vezu za prenos podataka. I dalje možete da pozovete govornu poštu da biste je proverili."
+ "Ažuriranje vizuelne govorne pošte nije uspelo"
+ "I dalje možete da pozovete govornu poštu da biste je proverili."
+ "Ažuriranje vizuelne govorne pošte nije uspelo"
+ "I dalje možete da pozovete govornu poštu da biste je proverili."
+ "Ažuriranje vizuelne govorne pošte nije uspelo"
+ "I dalje možete da pozovete govornu poštu da biste je proverili."
+ "Ažuriranje vizuelne govorne pošte nije uspelo"
+ "I dalje možete da pozovete govornu poštu da biste je proverili."
+ "Prijemno sanduče je skoro puno"
+ "Nećete moći da primate novu govornu poštu ako je prijemno sanduče puno."
+ "Ne možete da primate nove govorne poruke"
+ "Prijemno sanduče je puno. Izbrišite neke poruke da biste primili novu govornu poštu."
+ "Uključite dodatni memorijski prostor i rezervne kopije"
+ "Poštansko sanduče je puno. Da biste oslobodili prostor, uključite dodatni memorijski prostor, pa će Google moći da upravlja vašim govornim porukama i pravi njihove rezervne kopije."
+ "Uključite dodatni memorijski prostor i rezervne kopije"
+ "Poštansko sanduče je skoro puno. Da biste oslobodili prostor, uključite dodatni memorijski prostor, pa će Google moći da upravlja vašim govornim porukama i pravi njihove rezervne kopije."
+ "Podesite PIN govorne pošte"
+ "PIN govorne pošte vam treba svaki put kad upućujete poziv da biste pristupili govornoj pošti."
+ "Nepoznata greška"
+ "Podešavanja režima rada u avionu"
+ "Podesi PIN"
+ "Probaj ponovo"
+ "Uključi"
+ "Ne, hvala"
+ "Sinhronizuj"
+ "Pozovi govornu poštu"
+ "Pozovi korisničku podršku"
+ "Nešto nije u redu"
+ "Žao nam je, naišli smo na problem. Probajte ponovo kasnije. Ako i dalje bude problema, kontaktirajte korisničku podršku na %1$s i recite im da je kôd greške 9001."
+ "Nešto nije u redu"
+ "Žao nam je, naišli smo na problem. Probajte ponovo kasnije. Ako i dalje bude problema, kontaktirajte korisničku podršku na %1$s i recite im da je kôd greške 9002."
+ "Nešto nije u redu"
+ "Žao nam je, naišli smo na problem. Probajte ponovo kasnije. Ako i dalje bude problema, kontaktirajte korisničku podršku na %1$s i recite im da je kôd greške 9003."
+ "Povezivanje sa sandučetom govorne pošte nije uspelo"
+ "Žao nam je, imamo probleme pri povezivanju sa sandučetom govorne pošte. Ako ste u oblasti sa slabim signalom, sačekajte dok ne budete imali jak signal i pokušajte ponovo. Ako i dalje bude problema, kontaktirajte korisničku podršku na %1$s i recite im da je kôd greške 9004."
+ "Povezivanje sa sandučetom govorne pošte nije uspelo"
+ "Žao nam je, imamo probleme pri povezivanju sa sandučetom govorne pošte. Ako ste u oblasti sa slabim signalom, sačekajte dok ne budete imali jak signal i pokušajte ponovo. Ako i dalje bude problema, kontaktirajte korisničku podršku na %1$s i recite im da je kôd greške 9005."
+ "Povezivanje sa sandučetom govorne pošte nije uspelo"
+ "Žao nam je, imamo probleme pri povezivanju sa sandučetom govorne pošte. Ako ste u oblasti sa slabim signalom, sačekajte dok ne budete imali jak signal i pokušajte ponovo. Ako i dalje bude problema, kontaktirajte korisničku podršku na %1$s i recite im da je kôd greške 9006."
+ "Nešto nije u redu"
+ "Žao nam je, naišli smo na problem. Probajte ponovo kasnije. Ako i dalje bude problema, kontaktirajte korisničku podršku na %1$s i recite im da je kôd greške 9007."
+ "Nešto nije u redu"
+ "Žao nam je, naišli smo na problem. Probajte ponovo kasnije. Ako i dalje bude problema, kontaktirajte korisničku podršku na %1$s i recite im da je kôd greške 9008."
+ "Nešto nije u redu"
+ "Žao nam je, imamo probleme pri podešavanju usluge. Probajte ponovo kasnije. Ako i dalje bude problema, kontaktirajte korisničku podršku na %1$s i recite im da je kôd greške 9009."
+ "Povezivanje sa sandučetom govorne pošte nije uspelo"
+ "Žao nam je, trenutno ne možemo da se povežemo sa sandučetom govorne pošte. Probajte ponovo kasnije. Ako i dalje bude problema, kontaktirajte korisničku podršku na %1$s i recite im da je kôd greške 9990."
+ "Podesite govornu poštu"
+ "Govorna pošta nije podešena na nalogu. Kontaktirajte korisničku podršku na %1$s i recite im da je kôd greške 9991."
+ "Govorna pošta"
+ "Ne možete da koristite Vizuelnu govornu poštu na ovom uređaju. Kontaktirajte korisničku podršku na %1$s i recite im da je kôd greške 9992."
+ "Nešto nije u redu"
+ "Kontaktirajte korisničku podršku na %1$s i recite im da je kôd greške 9993."
+ "Vizuelna govorna pošta"
+ "Da biste završili podešavanje Vizuelne govorne pošte, kontaktirajte korisničku podršku na %1$s i recite im da je kôd greške 9994."
+ "Vizuelna govorna pošta"
+ "Da biste završili podešavanje Vizuelne govorne pošte, kontaktirajte korisničku podršku na %1$s i recite im da je kôd greške 9995."
+ "Vizuelna govorna pošta"
+ "Da biste aktivirali Vizuelnu govornu poštu, kontaktirajte korisničku podršku na %1$s i recite im da je kôd greške 9996."
+ "Nešto nije u redu"
+ "Da biste završili podešavanje Vizuelne govorne pošte, kontaktirajte korisničku podršku na %1$s i recite im da je kôd greške 9998."
+ "Vizuelna govorna pošta je onemogućena"
+ "Kontaktirajte korisničku podršku na %1$s da biste aktivirali vizuelnu govornu poštu."
+ "Nešto nije u redu"
+ "Kontaktirajte korisničku podršku na %1$s i recite im da je kôd greške 9997."
+ "Nešto nije u redu"
+ "Kontaktirajte korisničku podršku na %1$s i recite im da je kôd greške 9989."
+ "Nešto nije u redu"
+ "Kontaktirajte korisničku podršku na %1$s i recite im da je kôd greške 9999."
+ "Uslovi i odredbe za vizuelnu govornu poštu"
+ "Morate da prihvatite Verizon Wireless uslove i odredbe da biste koristili vizuelnu govornu poštu:\n\n%s"
+ "Ako odbijete uslove i odredbe, onemogućićete vizuelnu govornu poštu."
+ "Onemogućite vizuelnu govornu poštu"
+ "Govornoj pošti ćete moći da pristupite samo ako pozovete *86. Podesite novi PIN kôd govorne pošte da biste nastavili."
+ "Podesite PIN"
+
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-be/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-be/strings.xml
index 2ab2a5c9a..50f32af4f 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-be/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-be/strings.xml
@@ -44,10 +44,10 @@
"Вы не зможаце атрымліваць новыя галасавыя паведамленні, калі ваша папка ўваходных поўная."
"Немагчыма атрымліваць новыя галасавыя паведамленні"
"Ваша папка ўваходных запоўнена. Паспрабуйце выдаліць некалькі паведамленняў, каб атрымаць новую галасавую пошту."
- "[Эксперыментальна] Уключыць дадатковае сховішча і рэзервовае капіраванне"
- "Ваша паштовая скрыня запоўнена. Каб вызваліць месца, уключыце дадатковае сховішча, каб Google мог кіраваць вашымі паведамленнямі галасавой пошты і рабіць іх рэзервовую копію. ""Гэта характарыстыка тэсціруецца ""і патэнцыяльна будзе выдаляць паведамленні галасавой пошты з вашага сервера галасавой пошты, але мы не абяцаем, што будзем падтрымліваць яе ў будучым. Але мы будзем вельмі ўдзячны за водгукі на гэту характарыстыку."
- "[Эксперыментальна] Уключыць дадатковае сховішча і рэзервовае капіраванне"
- "Ваша паштовая скрыня запоўнена. Каб вызваліць месца, уключыце дадатковае сховішча, каб Google мог кіраваць вашымі паведамленнямі галасавой пошты і рабіць іх рэзервовую копію. ""Гэта характарыстыка тэсціруецца ""і патэнцыяльна будзе выдаляць паведамленні галасавой пошты з вашага сервера галасавой пошты, але мы не абяцаем, што будзем падтрымліваць яе ў будучым. Але мы будзем вельмі ўдзячны за водгукі на гэту характарыстыку."
+ "Уключыць дадатковае сховішча і рэзервовае капіраванне"
+ "Ваша паштовая скрыня запоўнена. Каб вызваліць месца, уключыце дадатковае сховішча, каб Google мог кіраваць вашымі паведамленнямі галасавой пошты і рабіць іх рэзервовую копію."
+ "Уключыць дадатковае сховішча і рэзервовае капіраванне"
+ "Ваша паштовая скрыня амаль запоўнена. Каб вызваліць месца, уключыце дадатковае сховішча, каб Google мог кіраваць вашымі паведамленнямі галасавой пошты і рабіць іх рэзервовую копію."
"Наладзьце PIN-код галасавой пошты"
"Вам спатрэбіцца PIN-код галасавой пошты заўжды, калі вы тэлефануеце на сваю галасавую пошту."
"Невядомая памылка"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-bg/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-bg/strings.xml
index e9200d17c..dbca19ea2 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-bg/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-bg/strings.xml
@@ -44,10 +44,10 @@
"Няма да можете да получавате нова гласова поща, ако входящата ви поща е пълна."
"Не могат да се получават нови гласови съобщения"
"Входящата ви поща е пълна. Опитайте да изтриете съобщения, за да получавате нова гласова поща."
- "[Експериментално] Включване на допълнително хранилище и резервни копия"
- "Пощенската ви кутия е пълна. За да освободите място, включете допълнителното хранилище, за да може Google да управлява и създава резервни копия на съобщенията в гласовата ви поща. ""Тази функция понастоящем се тества"". Тя потенциално може да изтрие гласови съобщения от сървъра ви за гласова поща и не обещаваме, че ще я поддържаме в бъдеще. Но ще се радваме на отзиви за нея."
- "[Експериментално] Включване на допълнително хранилище и резервни копия"
- "Пощенската ви кутия е почти пълна. За да освободите място, включете допълнителното хранилище, за да може Google да управлява и създава резервни копия на съобщенията в гласовата ви поща. ""Тази функция понастоящем се тества"". Тя потенциално може да изтрие гласови съобщения от сървъра ви за гласова поща и не обещаваме, че ще я поддържаме в бъдеще. Но ще се радваме на отзиви за нея."
+ "Включване на допълнително хранилище и създаване на резервно копие"
+ "Пощенската ви кутия е пълна. За да освободите място, включете допълнително хранилище, така че Google да може да управлява и създаде резервно копие на съобщенията в гласовата ви поща."
+ "Включване на допълнително хранилище и създаване на резервно копие"
+ "Пощенската ви кутия е почти пълна. За да освободите място, включете допълнително хранилище, така че Google да може да управлява и създаде резервно копие на съобщенията в гласовата ви поща."
"Задайте ПИН за гласовата си поща"
"Ще ви е необходим ПИН за гласовата поща при всяко обаждане за достъп до съобщенията ви в нея."
"Неизвестна грешка"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-bn/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-bn/strings.xml
index b088f512a..5954448ee 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-bn/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-bn/strings.xml
@@ -44,10 +44,10 @@
"যদি আপনার ইনবক্সে পূর্ণ থাকে তাহলে আপনি নতুন ভয়েসমেল পেতে সক্ষম হবেন না।"
"নতুন ভয়েসমেলগুলি গ্রহণ করতে পারবেন না"
"আপনার ইনবক্স পূর্ণ। নতুন ভয়েসমেল পেতে কিছু বার্তা মুছে ফেলার চেষ্টা করুন।"
- "[পরীক্ষামূলক] অতিরিক্ত সঞ্চয়স্থান এবং ব্যাক আপ চালু করুন"
- "আপনার মেলবক্স পূর্ণ। স্থান খালি করতে, অতিরিক্ত সঞ্চয়স্থান চালু করুন যাতে Google আপনার ভয়েসমেল বার্তাগুলি পরিচালনা করতে এবং ব্যাক আপ নিতে পারে। ""এই বৈশিষ্ট্যটি বর্তমানে পরীক্ষা করা হচ্ছে ""এবং সম্ভবত আপনার ভয়েসমেল সার্ভার থেকে ভয়েসমেলগুলি মুছবে এবং আমরা ভবিষ্যতে এই বৈশিষ্ট্যের উপর সমর্থন দেওয়ার কোন কথা দিচ্ছি না। যদিও আমরা এই বৈশিষ্ট্যটির উপর মতামত পেলে খুব খুশি হব।"
- "[পরীক্ষামূলক] অতিরিক্ত সঞ্চয়স্থান এবং ব্যাক আপ চালু করুন"
- "আপনার মেলবক্স প্রায় পূর্ণ। স্থান খালি করতে, অতিরিক্ত সঞ্চয়স্থান চালু করুন যাতে Google আপনার ভয়েসমেল বার্তাগুলি পরিচালনা করতে এবং ব্যাক আপ নিতে পারে। ""এই বৈশিষ্ট্যটি বর্তমানে পরীক্ষা করা হচ্ছে ""এবং সম্ভবত আপনার ভয়েসমেল সার্ভার থেকে ভয়েসমেলগুলি মুছবে এবং আমরা ভবিষ্যতে এই বৈশিষ্ট্যেটি সমর্থন করব কিনা সেই নিয়ে কোন কথা দিচ্ছি না। যদিও আমরা এই বৈশিষ্ট্যটির উপর মতামত পেলে খুব খুশি হব।"
+ "অতিরিক্ত সঞ্চয়স্থান এবং ব্যাক আপ চালু করুন"
+ "আপনার মেলবক্স পূর্ণ। স্থান খালি করতে, অতিরিক্ত সঞ্চয়স্থান চালু করুন যাতে Google আপনার ভয়েসমেল বার্তাগুলি পরিচালনা করতে এবং ব্যাক আপ নিতে পারে।"
+ "অতিরিক্ত সঞ্চয়স্থান এবং ব্যাক আপ চালু করুন"
+ "আপনার মেলবক্স প্রায় পূর্ণ। স্থান খালি করতে, অতিরিক্ত সঞ্চয়স্থান চালু করুন যাতে Google আপনার ভয়েসমেল বার্তাগুলি পরিচালনা করতে এবং ব্যাক আপ নিতে পারে।"
"আপনার ভয়েসমেল পিন সেট করুন"
"যে কোনো সময়ে আপনার ভয়েসমেল অ্যাক্সেস করার জন্য আপনার একটি ভয়েসমেল পিন প্রয়োজন৷"
"অজানা ত্রুটি"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-bs/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-bs/strings.xml
index 32b4ea345..0352436c4 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-bs/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-bs/strings.xml
@@ -44,10 +44,10 @@
"Nećete moći primati novu govornu poštu ako je vam je pristigla pošta puna."
"Ne možete primati novu govornu poštu"
"Vaša pristigla pošta je puna. Pokušajte izbrisati neke poruke da primite novu govornu poštu."
- "[Eksperimentalno] Uključite dodatnu pohranu i sigurnosnu kopiju"
- "Vaše poštansko sanduče je puno. Za oslobađanje prostora uključite dodatnu pohranu da Google može upravljati i kreirati sigurnosnu kopiju poruka vaše govorne pošte. ""Ova funkcija se trenutno testira "" i može izbrisati poruke govorne pošte sa servera govorne pošte. Iako ne obećavamo da ćemo podržavati ovu funkciju u budućnosti, ipak bismo željeli primiti vaše povratne informacije."
- "[Eksperimentalno] Uključite dodatnu pohranu i sigurnosnu kopiju"
- "Vaše poštansko sanduče je puno. Za oslobađanje prostora uključite dodatnu pohranu da Google može upravljati i kreirati sigurnosnu kopiju poruka vaše govorne pošte. ""Ova funkcija se trenutno testira ""i može izbrisati poruke govorne pošte sa servera govorne pošte. Iako ne obećavamo da ćemo podržavati ovu funkciju u budućnosti, ipak bismo željeli primiti vaše povratne informacije."
+ "Uključite dodatnu pohranu i sigurnosnu kopiju"
+ "Poštanski pretinac je pun. Da oslobodite prostor, uključite dodatnu pohranu tako da Google može upravljati vašim porukama govorne pošte i praviti njihovu sigurnosnu kopiju."
+ "Uključite dodatnu pohranu i sigurnosnu kopiju"
+ "Poštanski pretinac je gotovo sasvim pun. Da oslobodite prostor, uključite dodatnu pohranu tako da Google može upravljati vašim porukama govorne pošte i praviti njihovu sigurnosnu kopiju."
"Postavite PIN za govornu poštu"
"PIN za govornu poštu trebat će vam svaki put kada zatražite pristup govornoj pošti."
"Nepoznata greška"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-ca/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-ca/strings.xml
index cea2ed3cb..b6d844df8 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-ca/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-ca/strings.xml
@@ -44,10 +44,10 @@
"No podràs rebre missatges de veu nous si la safata d\'entrada està plena."
"No es poden rebre missatges de veu nous"
"La safata d\'entrada està plena. Per rebre missatges de veu nous, prova de suprimir alguns missatges."
- "[Experimental] Activa l\'emmagatzematge addicional i la còpia de seguretat"
- "La bústia de veu està plena. Per alliberar espai, activa l\'emmagatzematge addicional perquè Google pugui gestionar els teus missatges de veu i crear-ne una còpia de seguretat. ""Aquesta funció està en mode de prova ""i és possible que suprimeixi els missatges de veu del servidor de la bústia. No podem garantir-ne la continuïtat en el futur. De tota manera, ens agradaria saber què en penses."
- "[Experimental] Activa l\'emmagatzematge addicional i la còpia de seguretat"
- "La bústia de veu gairebé està plena. Per alliberar espai, activa l\'emmagatzematge addicional perquè Google pugui gestionar els teus missatges de veu i crear-ne una còpia de seguretat. ""Aquesta funció està en mode de prova ""i és possible que suprimeixi els missatges de veu del servidor de la bústia. No podem garantir-ne la continuïtat en el futur. De tota manera, ens agradaria saber què en penses."
+ "Activa l\'emmagatzematge addicional i la còpia de seguretat"
+ "Tens la bústia plena. Per alliberar espai, activa l\'emmagatzematge addicional perquè Google pugui gestionar els missatges de veu i crear-ne una còpia de seguretat."
+ "Activa l\'emmagatzematge addicional i la còpia de seguretat"
+ "Tens la bústia gairebé plena. Per alliberar espai, activa l\'emmagatzematge addicional perquè Google pugui gestionar els missatges de veu i crear-ne una còpia de seguretat."
"Defineix el PIN per als missatges de veu"
"Necessitaràs el PIN per als missatges de veu cada vegada que truquis per accedir-hi."
"Error desconegut"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-cs/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-cs/strings.xml
index 9db772737..c52f7b007 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-cs/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-cs/strings.xml
@@ -44,10 +44,10 @@
"Pokud máte plnou schránku, nemůžete přijímat nové hlasové zprávy."
"Nemůžete přijímat nové hlasové zprávy"
"Vaše schránka je plná. Abyste mohli přijímat nové hlasové zprávy, zkuste nějaké zprávy smazat."
- "[Experimentální funkce] Zapněte si další úložiště a zálohování"
- "Vaše e-mailová schránka je plná. Pokud chcete uvolnit místo, zapněte si další úložiště, aby Google mohl spravovat a zálohovat vaše hlasové zprávy. ""Tuto funkci právě testujeme."" Funkce vám může smazat hlasové zprávy ze serveru hlasové schránky. Nemůžeme zaručit, že bude podporována i v budoucnu, budeme vám ale vděční za zpětnou vazbu."
- "[Experimentální funkce] Zapněte si další úložiště a zálohování"
- "Vaše e-mailová schránka je téměř plná. Pokud chcete uvolnit místo, zapněte si další úložiště, aby Google mohl spravovat a zálohovat vaše hlasové zprávy. ""Tuto funkci právě testujeme."" Funkce vám může smazat hlasové zprávy ze serveru hlasové schránky. Nemůžeme zaručit, že bude podporována i v budoucnu, budeme vám ale vděční za zpětnou vazbu."
+ "Zapněte si další úložiště a zálohování"
+ "Vaše e-mailová schránka je plná. Pokud chcete uvolnit místo, zapněte si další úložiště, aby Google mohl spravovat a zálohovat vaše hlasové zprávy."
+ "Zapněte si další úložiště a zálohování"
+ "Vaše e-mailová schránka je téměř plná. Pokud chcete uvolnit místo, zapněte si další úložiště, aby Google mohl spravovat a zálohovat vaše hlasové zprávy."
"Nastavit kód PIN hlasové schránky"
"PIN hlasové schránky budete potřebovat, kdykoli do své hlasové schránky zavoláte."
"Neznámá chyba"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-da/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-da/strings.xml
index f04049a0f..26e5ede7c 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-da/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-da/strings.xml
@@ -44,10 +44,10 @@
"Du vil ikke kunne modtage nye telefonsvarerbeskeder, hvis din indbakke er fuld."
"Du kan ikke modtage nye telefonsvarerbeskeder"
"Din indbakke er fuld. Prøv at slette nogle beskeder for at modtage nye telefonsvarerbeskeder."
- "[Eksperimental] Slå ekstra lagerplads og sikkerhedskopiering til"
- "Din telefonsvarer er fuld. Frigør plads ved at slå ekstra lagerplads til, så Google kan administrere og sikkerhedskopiere dine talebeskeder. ""Denne funktion bliver testet i øjeblikket ""og vil muligvis slette talebeskeder fra din telefonsvarerserver. Vi lover desuden ikke, at denne funktion understøttes fremover. Vi vil dog stadig gerne have feedback fra dig."
- "[Eksperimental] Slå ekstra lagerplads og sikkerhedskopiering til"
- "Din telefonsvarer er næsten fuld. Frigør plads ved at slå ekstra lagerplads til, så Google kan administrere og sikkerhedskopiere dine talebeskeder. ""Denne funktion bliver testet i øjeblikket ""og vil muligvis slette talebeskeder fra din telefonsvarerserver. Vi lover desuden ikke, at denne funktion understøttes fremover. Vi vil dog stadig gerne have feedback fra dig."
+ "Slå ekstra lagerplads og sikkerhedskopiering til"
+ "Din telefonsvarer er fuld. Du kan frigøre plads ved at slå ekstra lagerplads til, så Google kan administrere og sikkerhedskopiere dine talebeskeder."
+ "Slå ekstra lagerplads og sikkerhedskopiering til"
+ "Din telefonsvarer er næsten fuld. Du kan frigøre plads ved at slå ekstra lagerplads til, så Google kan administrere og sikkerhedskopiere dine talebeskeder."
"Bestem pinkoden til din telefonsvarer"
"Du skal bruge en pinkode til din telefonsvarer, når du ringer for at få adgang til den."
"Ukendt fejl"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-de/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-de/strings.xml
index 8939e687e..865ddd95a 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-de/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-de/strings.xml
@@ -44,10 +44,10 @@
"Wenn deine Mailbox voll ist, kannst du keine neuen Sprachnachrichten empfangen."
"Es können keine neuen Mailboxnachrichten empfangen werden"
"Deine Mailbox ist voll. Lösche einige Nachrichten, um neue empfangen zu können."
- "[Testfunktion] Zusätzlichen Speicher und Sicherung aktivieren"
- "Dein Postfach ist voll. Aktivere zusätzlichen Speicher, um Speicherplatz freizugeben. So kann Google deine Mailboxnachrichten verwalten und sichern. ""Diese Funktion wird gerade getestet."" Hiermit werden möglicherweise Mailboxnachrichten von deinem Mailbox-Server gelöscht und es wird nicht garantiert, dass diese Funktion auch in Zukunft unterstützt wird. Wir würden uns aber sehr über Feedback dazu freuen."
- "[Testfunktion] Zusätzlichen Speicher und Sicherung aktivieren"
- "Dein Postfach ist voll. Aktivere zusätzlichen Speicher, um Speicherplatz freizugeben. So kann Google deine Mailboxnachrichten verwalten und sichern. ""Diese Funktion wird gerade getestet."" Hiermit werden möglicherweise Mailboxnachrichten von deinem Mailbox-Server gelöscht und es wird nicht garantiert, dass diese Funktion auch in Zukunft unterstützt wird. Wir würden uns aber sehr über Feedback dazu freuen."
+ "Zusätzlichen Speicher und Sicherung aktivieren"
+ "Dein Postfach ist voll. Aktivere zusätzlichen Speicher, um Speicherplatz freizugeben. So kann Google deine Mailboxnachrichten verwalten und sichern."
+ "Zusätzlichen Speicher und Sicherung aktivieren"
+ "Dein Postfach fast ist voll. Aktivere zusätzlichen Speicher, um Speicherplatz freizugeben. So kann Google deine Mailboxnachrichten verwalten und sichern."
"Mailbox-PIN festlegen"
"Bei jedem Anruf auf deiner Mailbox benötigst du eine Mailbox-PIN."
"Unbekannter Fehler"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-el/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-el/strings.xml
index 9c7c7da66..acd1ca0e7 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-el/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-el/strings.xml
@@ -44,10 +44,10 @@
"Δεν θα είστε σε θέση να λάβετε νέα φωνητικά μηνύματα από τον αυτόματο τηλεφωνητή εάν τα εισερχόμενά σας είναι πλήρη."
"Δεν μπορείτε να λάβετε νέα μηνύματα από τον αυτόματο τηλεφωνητή"
"Τα εισερχόμενά σας είναι πλήρη. Δοκιμάστε να διαγράψετε μερικά μηνύματα, για να λάβετε νέα μηνύματα από τον αυτόματο τηλεφωνητή."
- "[Πειραματική λειτουργία] Ενεργοποίηση επιπλέον αποθηκευτικού χώρου και αντιγράφων ασφαλείας"
- "Το γραμματοκιβώτιό σας είναι πλήρες. Για να ελευθερώσετε χώρο, ενεργοποιήστε επιπλέον αποθηκευτικό χώρο, ώστε η Google μπορεί να διαχειριστεί και να δημιουργήσει αντίγραφα ασφαλείας των μηνυμάτων του αυτόματου τηλεφωνητή σας. ""Αυτή η λειτουργία βρίσκεται σε δοκιμαστική φάση "", ενδέχεται να έχει ως αποτέλεσμα τη διαγραφή φωνητικών μηνυμάτων από τον διακομιστή αυτόματου τηλεφωνητή σας και δεν παρέχουμε εγγυήσεις για την υποστήριξη αυτής της λειτουργίας μελλοντικά. Ωστόσο, θα εκτιμούσαμε τα σχόλιά σας."
- "[Πειραματική λειτουργία] Ενεργοποίηση επιπλέον αποθηκευτικού χώρου και αντιγράφων ασφαλείας"
- "Το γραμματοκιβώτιό σας είναι σχεδόν πλήρες. Για να ελευθερώσετε χώρο, ενεργοποιήστε επιπλέον αποθηκευτικό χώρο, ώστε η Google μπορεί να διαχειριστεί και να δημιουργήσει αντίγραφα ασφαλείας των μηνυμάτων του αυτόματου τηλεφωνητή σας. ""Αυτή η λειτουργία βρίσκεται σε δοκιμαστική φάση "", ενδέχεται να έχει ως αποτέλεσμα τη διαγραφή φωνητικών μηνυμάτων από τον διακομιστή αυτόματου τηλεφωνητή σας και δεν παρέχουμε εγγυήσεις για την υποστήριξη αυτής της λειτουργίας μελλοντικά. Ωστόσο, θα εκτιμούσαμε τα σχόλιά σας."
+ "Ενεργοποίηση επιπλέον αποθηκευτικού χώρου και αντιγράφων ασφαλείας"
+ "Το γραμματοκιβώτιό σας είναι πλήρες. Για να ελευθερώσετε χώρο, ενεργοποιήστε επιπλέον αποθηκευτικό χώρο, ώστε η Google μπορεί να διαχειριστεί και να δημιουργήσει αντίγραφα ασφαλείας των μηνυμάτων του αυτόματου τηλεφωνητή σας."
+ "Ενεργοποίηση επιπλέον αποθηκευτικού χώρου και αντιγράφων ασφαλείας"
+ "Το γραμματοκιβώτιό σας είναι σχεδόν πλήρες. Για να ελευθερώσετε χώρο, ενεργοποιήστε επιπλέον αποθηκευτικό χώρο, ώστε η Google μπορεί να διαχειριστεί και να δημιουργήσει αντίγραφα ασφαλείας των μηνυμάτων του αυτόματου τηλεφωνητή σας."
"Ορίστε PIN για τον αυτόματο τηλεφωνητή σας"
"Θα χρειάζεστε ένα PIN φωνητικού τηλεφωνητή κάθε φορά που καλείτε, για να έχετε πρόσβαση στον τηλεφωνητή σας."
"Άγνωστο σφάλμα"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-en-rAU/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-en-rAU/strings.xml
index c1455cafc..a036950a6 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-en-rAU/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-en-rAU/strings.xml
@@ -44,10 +44,10 @@
"You won\'t be able to receive new voicemail if your inbox is full."
"Can\'t receive new voicemail"
"Your inbox is full. Try deleting some messages to receive new voicemail."
- "[Experimental] Turn on extra storage and backup"
- "Your mailbox is full. To free up space, turn on extra storage so that Google can manage and back up your voicemail messages. ""This feature is currently being tested ""and will potentially delete voicemail from your voicemail server. We do not promise to support this feature in the future. We would love your feedback though."
- "[Experimental] Turn on extra storage and backup"
- "Your mailbox is almost full. To free up space, turn on extra storage so that Google can manage and back up your voicemail messages. ""This feature is currently being tested ""and will potentially delete voicemail from your voicemail server. We do not promise to support this feature in the future. We would love your feedback though."
+ "Turn on extra storage and backup"
+ "Your mailbox is full. To free up space, turn on extra storage so that Google can manage and back up your voicemail messages."
+ "Turn on extra storage and backup"
+ "Your mailbox is almost full. To free up space, turn on extra storage so that Google can manage and back up your voicemail messages."
"Set your voicemail PIN"
"You\'ll need a voicemail PIN whenever you call to access your voicemail."
"Unknown error"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-en-rGB/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-en-rGB/strings.xml
index c1455cafc..a036950a6 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-en-rGB/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-en-rGB/strings.xml
@@ -44,10 +44,10 @@
"You won\'t be able to receive new voicemail if your inbox is full."
"Can\'t receive new voicemail"
"Your inbox is full. Try deleting some messages to receive new voicemail."
- "[Experimental] Turn on extra storage and backup"
- "Your mailbox is full. To free up space, turn on extra storage so that Google can manage and back up your voicemail messages. ""This feature is currently being tested ""and will potentially delete voicemail from your voicemail server. We do not promise to support this feature in the future. We would love your feedback though."
- "[Experimental] Turn on extra storage and backup"
- "Your mailbox is almost full. To free up space, turn on extra storage so that Google can manage and back up your voicemail messages. ""This feature is currently being tested ""and will potentially delete voicemail from your voicemail server. We do not promise to support this feature in the future. We would love your feedback though."
+ "Turn on extra storage and backup"
+ "Your mailbox is full. To free up space, turn on extra storage so that Google can manage and back up your voicemail messages."
+ "Turn on extra storage and backup"
+ "Your mailbox is almost full. To free up space, turn on extra storage so that Google can manage and back up your voicemail messages."
"Set your voicemail PIN"
"You\'ll need a voicemail PIN whenever you call to access your voicemail."
"Unknown error"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-en-rIN/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-en-rIN/strings.xml
index c1455cafc..a036950a6 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-en-rIN/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-en-rIN/strings.xml
@@ -44,10 +44,10 @@
"You won\'t be able to receive new voicemail if your inbox is full."
"Can\'t receive new voicemail"
"Your inbox is full. Try deleting some messages to receive new voicemail."
- "[Experimental] Turn on extra storage and backup"
- "Your mailbox is full. To free up space, turn on extra storage so that Google can manage and back up your voicemail messages. ""This feature is currently being tested ""and will potentially delete voicemail from your voicemail server. We do not promise to support this feature in the future. We would love your feedback though."
- "[Experimental] Turn on extra storage and backup"
- "Your mailbox is almost full. To free up space, turn on extra storage so that Google can manage and back up your voicemail messages. ""This feature is currently being tested ""and will potentially delete voicemail from your voicemail server. We do not promise to support this feature in the future. We would love your feedback though."
+ "Turn on extra storage and backup"
+ "Your mailbox is full. To free up space, turn on extra storage so that Google can manage and back up your voicemail messages."
+ "Turn on extra storage and backup"
+ "Your mailbox is almost full. To free up space, turn on extra storage so that Google can manage and back up your voicemail messages."
"Set your voicemail PIN"
"You\'ll need a voicemail PIN whenever you call to access your voicemail."
"Unknown error"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-es-rUS/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-es-rUS/strings.xml
index be7eef136..485a78b10 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-es-rUS/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-es-rUS/strings.xml
@@ -44,10 +44,10 @@
"Si la carpeta Recibidos está llena, no podrás recibir mensajes de voz nuevos."
"No se pueden recibir mensajes de voz nuevos"
"La carpeta Recibidos está llena. Intenta borrar algunos mensajes para recibir mensajes de voz nuevos."
- "[Experimental] Activar la copia de seguridad y el almacenamiento adicional"
- "Tu buzón está lleno. Para liberar espacio, obtén almacenamiento adicional para que Google pueda administrar tus mensajes de voz y hacer copias de seguridad de ellos. ""Esta función se está probando"", y es posible que borre los mensajes de voz del servidor correspondiente. No podemos garantizar la compatibilidad de la función en el futuro. Sin embargo, nos encantaría que nos hicieras comentarios acerca de ella."
- "[Experimental] Activar la copia de seguridad y el almacenamiento adicional"
- "Tu buzón está casi lleno. Para liberar espacio, obtén almacenamiento adicional para que Google pueda administrar tus mensajes de voz y hacer copias de seguridad de ellos. ""Esta función se está probando"", y es posible que borre los mensajes de voz del servidor correspondiente. No podemos garantizar la compatibilidad de la función en el futuro. Sin embargo, nos encantaría que nos hicieras comentarios acerca de ella."
+ "Activar la copia de seguridad y obtener almacenamiento adicional"
+ "Tu buzón está lleno. Para liberar espacio, obtén almacenamiento adicional para que Google pueda administrar tus mensajes de voz y hacer copias de seguridad de ellos."
+ "Activar la copia de seguridad y obtener almacenamiento adicional"
+ "Tu buzón está casi lleno. Para liberar espacio, obtén almacenamiento adicional para que Google pueda administrar tus mensajes de voz y hacer copias de seguridad de ellos."
"Configura el PIN del buzón de voz"
"Necesitas un PIN cada vez que llames para acceder al buzón de voz."
"Error desconocido"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-es/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-es/strings.xml
index 01cccf3d0..d351f375c 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-es/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-es/strings.xml
@@ -44,10 +44,10 @@
"Si la bandeja de entrada está llena, no podrás recibir los mensajes de voz nuevos."
"No puedes recibir los mensajes de voz nuevos"
"Tienes la bandeja de entrada llena. Para recibir nuevos mensajes de voz, prueba a eliminar algunos antiguos."
- "(Experimental) Habilita más espacio de almacenamiento y copias de seguridad"
- "Tu buzón de voz está lleno. Para liberar espacio, habilita más espacio de almacenamiento de forma que Google pueda gestionar tus mensajes de voz y hacer copias de seguridad de estos. ""Esta función, que se encuentra actualmente en fase de prueba, ""podría servir para eliminar los mensajes de tu servidor de buzón de voz. Aunque no garantizamos que se siga admitiendo en el futuro, nos encantaría conocer tu opinión."
- "(Experimental) Habilita más espacio de almacenamiento y copias de seguridad"
- "Tu buzón de voz está casi lleno. Para liberar espacio, habilita más espacio de almacenamiento de forma que Google pueda gestionar tus mensajes de voz y hacer copias de seguridad de estos. ""Esta función, que se encuentra actualmente en fase de prueba, ""podría servir para eliminar los mensajes de tu servidor de buzón de voz. Aunque no garantizamos que se siga admitiendo en el futuro, nos encantaría conocer tu opinión."
+ "Habilitar más espacio de almacenamiento y de copia de seguridad"
+ "Tu buzón de voz está lleno. Para desocupar espacio, habilita más almacenamiento para que Google pueda hacer una copia de seguridad de tus mensajes del buzón de buzón y gestionarlos."
+ "Habilitar más espacio de almacenamiento y de copia de seguridad"
+ "Tu buzón de voz está prácticamente lleno. Para desocupar espacio, habilita más almacenamiento para que Google pueda hacer una copia de seguridad de tus mensajes del buzón de buzón y gestionarlos."
"Configura el PIN del buzón de voz"
"Deberás introducir un PIN del buzón de voz siempre que llames para escuchar los mensajes de voz."
"Error desconocido"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-et/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-et/strings.xml
index bfbd977c2..e392f9067 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-et/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-et/strings.xml
@@ -44,10 +44,10 @@
"Kui teie postkast on täis, ei saa te uusi kõnepostisõnumeid vastu võtta."
"Uusi kõnepostisõnumeid ei saa vastu võtta"
"Teie postkast on täis. Uute kõnepostisõnumite vastuvõtmiseks kustutage mõned sõnumid."
- "[Katseline.] Lisasalvestusruumi ja -varunduse sisselülitamine"
- "Teie postkast on täis. Ruumi vabastamiseks lülitage sisse lisasalvestusruum, et Google saaks teie kõnepostisõnumeid hallata ja varundada. ""Seda funktsiooni testitakse ""ja see võib teie kõnepostisõnumid kõnepostiserverist kustutada. Me ei garanteeri, et seda funktsiooni tulevikus toetatakse. Soovime selle kohta siiski tagasisidet saada."
- "[Katseline.] Lisasalvestusruumi ja -varunduse sisselülitamine"
- "Teie postkast on peaaegu täis. Ruumi vabastamiseks lülitage sisse lisasalvestusruum, et Google saaks teie kõnepostisõnumeid hallata ja varundada. ""Seda funktsiooni testitakse ""ja see võib teie kõnepostisõnumid kõnepostiserverist kustutada. Me ei garanteeri, et seda funktsiooni tulevikus toetatakse. Soovime selle kohta siiski tagasisidet saada."
+ "Lisasalvestusruumi ja varundamise sisselülitamine"
+ "Teie postkast on täis. Ruumi vabastamiseks lülitage sisse lisasalvestusruum, et Google saaks teie kõnepostisõnumeid hallata ja varundada."
+ "Lisasalvestusruumi ja varundamise sisselülitamine"
+ "Teie postkast on peaaegu täis. Ruumi vabastamiseks lülitage sisse lisasalvestusruum, et Google saaks teie kõnepostisõnumeid hallata ja varundada."
"Määrake kõneposti PIN-kood"
"Vajate PIN-koodi juhul, kui helistate kõnepostile juurdepääsemiseks."
"Tundmatu viga"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-eu/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-eu/strings.xml
index a23d03e14..af40192d2 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-eu/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-eu/strings.xml
@@ -44,10 +44,10 @@
"Ezin izango duzu jaso ahots-mezu berririk sarrera-ontzia beteta badago."
"Ezin da jaso ahots-mezu berririk"
"Beteta dago sarrera-ontzia. Ezabatu mezu batzuk ahots-mezu berriak jasotzeko."
- "[Esperimentala] Lortu biltegiratze-toki gehiago eta egin babeskopiak"
- "Beteta dago postontzia. Tokia egiteko, lortu biltegiratze-toki gehiago, Google-k erantzungailuko mezuak kudeatu eta haien babeskopiak egin ahal izan ditzan. ""Eginbide hau probatzen ari gara oraindik, ""eta agian erantzungailuaren zerbitzarian gordetako mezuak ezabatuko ditu. Ez dugu bermatzen eginbide hau etorkizunean erabiltzeko aukera emango dugunik. Halere, bihotzez eskertuko genizuke iritzia emango bazenigu."
- "[Esperimentala] Lortu biltegiratze-toki gehiago eta egin babeskopiak"
- "Ia beteta dago postontzia. Tokia egiteko, lortu biltegiratze-toki gehiago, Google-k erantzungailuko mezuak kudeatu eta haien babeskopiak egin ahal izan ditzan. ""Eginbide hau probatzen ari gara oraindik, ""eta agian erantzungailuaren zerbitzarian gordetako mezuak ezabatuko ditu. Ez dugu bermatzen eginbide hau etorkizunean erabiltzeko aukera emango dugunik. Halere, bihotzez eskertuko genizuke iritzia emango bazenigu."
+ "Lortu biltegiratze-toki gehiago eta egin babeskopiak"
+ "Beteta dago postontzia. Tokia egiteko, lortu biltegiratze-toki gehiago, Google-k erantzungailuko mezuak kudeatu eta haien babeskopiak egin ahal izan ditzan."
+ "Lortu biltegiratze-toki gehiago eta egin babeskopiak"
+ "Ia beteta dago postontzia. Tokia egiteko, lortu biltegiratze-toki gehiago, Google-k erantzungailuko mezuak kudeatu eta haien babeskopiak egin ahal izan ditzan."
"Ezarri erantzungailuko PIN kodea"
"Erantzungailua atzitzeko deitzen duzunerako behar duzu PIN kodea."
"Errore ezezagun bat gertatu da"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-fa/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-fa/strings.xml
index 331ee9c0c..af79322bb 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-fa/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-fa/strings.xml
@@ -44,10 +44,10 @@
"اگر صندوق ورودیتان پر باشد نمیتوانید پست صوتی جدیدی دریافت کنید."
"پستهای صوتی جدید دریافت نمیشود"
"صندوق ورودیتان پر است. بعضی از پیامها را حذف کنید تا پست صوتی جدید دریافت کنید."
- "[آزمایشی] روشن کردن فضای ذخیرهسازی اضافی و پشتیبانگیری"
- "صندوق پستیتان پر است. برای آزاد کردن فضا، فضای ذخیرهسازی اضافی را روشن کنید تا Google بتواند پیامهای پست صوتی شما را مدیریت و پشتیبانگیری کند""این یک قابلیت درحال آزمایش شدن است""و بهطور بالقوه پستهای صوتی را از سرور پست صوتی شما حذف خواهد کرد و قول نمیدهیم در آینده از این قابلیت پشتیبانی کنیم. با این حال مشتاقیم درباره آن بازخورد دریافت کنیم."
- "[آزمایشی] روشن کردن فضای ذخیرهسازی اضافی و پشتیبانگیری"
- "صندوق پستیتان تقریباً پر است. برای آزاد کردن فضا، فضای ذخیرهسازی اضافی را روشن کنید تا Google بتواند پیامهای پست صوتی شما را مدیریت و پشتیبانگیری کند""این یک قابلیت درحال آزمایش شدن است""و بهطور بالقوه پستهای صوتی را از سرور پست صوتی شما حذف خواهد کرد و قول نمیدهیم در آینده از این قابلیت پشتیبانی کنیم. با این حال مشتاقیم درباره آن بازخورد دریافت کنیم."
+ "فعالسازی فضای ذخیرهسازی اضافی و پشتیبانگیری"
+ "صندوق ورودیتان پر است. برای آزاد کردن فضا، فضای ذخیرهسازی اضافی را فعالسازی کنید تا Google بتواند پیامهای صندوق پستیتان را مدیریت و پشتیبانگیری کند."
+ "فعالسازی فضای ذخیرهسازی اضافی و پشتیبانگیری"
+ "صندوق ورودیتان تقریباً پر است. برای آزاد کردن فضا، فضای ذخیرهسازی اضافی را فعالسازی کنید تا Google بتواند پیامهای صندوق پستیتان را مدیریت و پشتیبانگیری کند."
"تنظیم پین پست صوتی"
"هر بار که تماس میگیرید برای دسترسی به پست صوتیتان به پین پست صوتی نیاز دارید."
"خطای ناشناس"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-fi/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-fi/strings.xml
index 2807a22dc..54167659b 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-fi/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-fi/strings.xml
@@ -44,10 +44,10 @@
"Uusia vastaajaviestejä ei voi vastaanottaa, jos postilaatikko on täynnä."
"Uusien vastaajaviestien vastaanottaminen ei onnistu."
"Postilaatikkosi on täynnä. Poista viestejä, jotta voit vastaanottaa uusia vastaajaviestejä."
- "[Kokeellinen] Ota käyttöön lisätallennustila ja ‑varmuuskopiointi"
- "Postilaatikkosi on täynnä. Vapauta tilaa ottamalla käyttöön lisätallennustila, jotta Google voi hallinnoida ja varmuuskopioida vastaajaviestejäsi. ""Ominaisuus on testivaiheessa"", ja se saattaa poistaa vastaajaviestejä vastaajapalvelimelta. Emme takaa ominaisuuden tukea tulevaisuudessa. Otamme kuitenkin mielellämme vastaan palautetta."
- "[Kokeellinen] Ota käyttöön lisätallennustila ja ‑varmuuskopiointi"
- "Postilaatikkosi on lähes täynnä. Vapauta tilaa ottamalla käyttöön lisätallennustila, jotta Google voi hallinnoida ja varmuuskopioida vastaajaviestejäsi. ""Ominaisuus on testivaiheessa"", ja se saattaa poistaa vastaajaviestejä vastaajapalvelimelta. Emme takaa ominaisuuden tukea tulevaisuudessa. Otamme kuitenkin mielellämme vastaan palautetta."
+ "Ota käyttöön lisätallennustila ja ‑varmuuskopiointi"
+ "Postilaatikkosi on täynnä. Jos haluat vapauttaa tilaa, ota käyttöön lisätallennustila, niin Google voi hallinnoida ja varmuuskopioida vastaajaviestisi."
+ "Ota käyttöön lisätallennustila ja ‑varmuuskopiointi"
+ "Postilaatikkosi on lähes täynnä. Jos haluat vapauttaa tilaa, ota käyttöön lisätallennustila, niin Google voi hallinnoida ja varmuuskopioida vastaajaviestisi."
"Aseta vastaajan PIN-koodi"
"Vastaajan PIN-koodi on annettava aina, kun käytät vastaajaa."
"Tuntematon virhe"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-fr-rCA/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-fr-rCA/strings.xml
index b26f65b21..ef88ecfa2 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-fr-rCA/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-fr-rCA/strings.xml
@@ -44,10 +44,10 @@
"Vous ne pourrez pas recevoir de nouveaux messages vocaux si votre boîte de réception est pleine."
"Impossible de recevoir de nouveaux messages vocaux"
"Votre boîte de réception est pleine. Essayez de supprimer des messages pour pouvoir recevoir de nouveaux messages vocaux."
- "[Fonction expérimentale] Activer l\'espace supplémentaire de stockage et de sauvegarde"
- "Votre boîte aux lettres est pleine. Pour libérer de l\'espace, activez l\'espace supplémentaire de stockage pour que Google puisse gérer et sauvegarder vos messages vocaux. ""Cette fonction est en cours de test ""et pourrait supprimer des messages de votre serveur de messagerie vocale. Nous ne pouvons pas garantir le maintien de cette fonction à l\'avenir. Nous voudrions toutefois savoir ce que vous en pensez."
- "[Fonction expérimentale] Activer l\'espace supplémentaire de stockage et de sauvegarde"
- "Votre boîte aux lettres est presque pleine. Pour libérer de l\'espace, activez l\'espace supplémentaire de stockage pour que Google puisse gérer et sauvegarder vos messages vocaux. ""Cette fonction est en cours de test ""et pourrait supprimer des messages de votre serveur de messagerie vocale. Nous ne pouvons pas garantir le maintien de cette fonction à l\'avenir. Nous voudrions toutefois savoir ce que vous en pensez."
+ "Activer l\'espace supplémentaire de stockage et de sauvegarde"
+ "Votre boîte aux lettres est pleine. Pour libérer de l\'espace, activez l\'espace de stockage supplémentaire pour que Google puisse gérer et sauvegarder vos messages vocaux."
+ "Activer l\'espace supplémentaire de stockage et de sauvegarde"
+ "Votre boîte aux lettres est presque pleine. Pour libérer de l\'espace, activez l\'espace de stockage supplémentaire pour que Google puisse gérer et sauvegarder vos messages vocaux."
"Définir votre NIP de messagerie vocale"
"Vous devez saisir un NIP de messagerie vocale chaque fois que vous appelez pour accéder à vos messages vocaux."
"Erreur inconnue"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-fr/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-fr/strings.xml
index f10c0383b..eefd5ad24 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-fr/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-fr/strings.xml
@@ -44,10 +44,10 @@
"Vous ne pouvez pas recevoir de nouveaux messages vocaux si votre boîte de réception est pleine."
"Impossible de recevoir de nouveaux messages vocaux"
"Votre boîte de réception est pleine. Supprimez des messages vocaux pour pouvoir en recevoir de nouveaux."
- "[Fonctionnalité expérimentale] Activer l\'espace de stockage et de sauvegarde supplémentaire"
- "Votre messagerie est pleine. Pour libérer de l\'espace, activez l\'espace de stockage supplémentaire pour permettre à Google de gérer et de sauvegarder vos messages vocaux. ""Cette fonctionnalité est en cours de test. ""Des messages risquent d\'être supprimés de votre serveur de messagerie vocale. Nous ne pouvons pas garantir le maintien de cette fonction. Toutefois, n\'hésitez pas à nous faire part de vos commentaires."
- "[Fonctionnalité expérimentale] Activer l\'espace de stockage et de sauvegarde supplémentaire"
- "Votre messagerie est presque pleine. Pour libérer de l\'espace, activez l\'espace de stockage supplémentaire pour permettre à Google de gérer et de sauvegarder vos messages vocaux. ""Cette fonctionnalité est en cours de test. ""Des messages risquent d\'être supprimés de votre serveur de messagerie vocale. Nous ne pouvons pas garantir le maintien de cette fonction. Toutefois, n\'hésitez pas à nous faire part de vos commentaires."
+ "Activer l\'espace de stockage et de sauvegarde supplémentaire"
+ "Votre boîte aux lettres est pleine. Pour libérer de l\'espace, activez l\'espace de stockage supplémentaire. Google pourra ainsi gérer vos messages vocaux et les sauvegarder."
+ "Activer l\'espace de stockage et de sauvegarde supplémentaire"
+ "Votre boîte aux lettres est presque pleine. Pour libérer de l\'espace, activez l\'espace de stockage supplémentaire. Google pourra ainsi gérer vos messages vocaux et les sauvegarder."
"Définir le code de votre messagerie vocale"
"Vous devrez saisir ce code chaque fois que vous consulterez votre messagerie vocale."
"Erreur inconnue"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-gl/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-gl/strings.xml
index a4f8f565c..efd174ffb 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-gl/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-gl/strings.xml
@@ -44,10 +44,10 @@
"Non poderás recibir correo de voz novo se a caixa de entrada está chea."
"Non se poden recibir correos de voz novos"
"A caixa de entrada está chea. Proba a eliminar algunhas mensaxes para recibir correo de voz novo."
- "[Experimental] Activa a copia de seguranza e o almacenamento adicional"
- "A túa caixa de correo está chea. Para liberar espazo, activa o almacenamento adicional de modo que Google poida xestionar e facer unha copia de seguranza das túas mensaxes do correo de voz. ""Actualmente esta función está en modo de proba, ""e é posible que elimine correos de voz do teu servidor de correo de voz. Non prometemos a súa continuidade no futuro. De todos modos, encantaríanos que nos deses a túa opinión."
- "[Experimental] Activa a copia de seguranza e o almacenamento adicional"
- "O túa caixa de correo está case chea. Para liberar espazo, activa o almacenamento adicional de modo que Google poida xestionar e facer unha copia de seguranza das túas mensaxes do correo de voz. ""Actualmente esta función está en modo de proba, ""e é posible que elimine os correos de voz do teu servidor de correo de voz. Non prometemos a súa continuidade no futuro. De todos modos, encantaríanos que nos deses a túa opinión."
+ "Activa o almacenamento adicional e a copia de seguranza"
+ "A túa caixa de correo está chea. Para liberar espazo, activa o almacenamento adicional, de modo que Google poida xestionar as túas mensaxes do correo de voz e facer unha copia de seguranza."
+ "Activa o almacenamento adicional e a copia de seguranza"
+ "A túa caixa de correo está case chea. Para liberar espazo, activa o almacenamento adicional, de modo que Google poida xestionar as túas mensaxes do correo de voz e facer unha copia de seguranza."
"Establece o PIN para o teu correo de voz"
"Necesitarás o PIN cada vez que chames para acceder ao teu correo de voz."
"Produciuse un erro descoñecido"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-gu/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-gu/strings.xml
index 149c52764..44634437a 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-gu/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-gu/strings.xml
@@ -44,10 +44,10 @@
"જો તમારું ઇનબોક્સ ભરાઈ ગયું હોય તો તમે નવી વૉઇસમેઇલ પ્રાપ્ત કરી શકશો નહીં."
"નવી વૉઇસમેઇલ્સ પ્રાપ્ત કરી શકતાંં નથી"
"તમારું ઇનબોક્સ ભરાઈ ગયું છે. નવી વૉઇસમેઇલ પ્રાપ્ત કરવા માટે કેટલા સંદેશા કાઢી નાખવાનો પ્રયાસ કરો."
- "[પ્રાયોગિક] અતિરિક્ત સ્ટોરેજ ચાલુ કરો અને બેકઅપ લો"
- "તમારું મેઇલબૉક્સ ભરાઇ ગયું છે. સ્થાન ખાલી કરવા માટે, અતિરિક્ત સ્ટોરેજ ચાલુ કરો જેથી Google તમારા વૉઇસમેઇલ સંદેશા સંચાલિત કરી અને તેનું બેકઅપ લઈ શકે. ""આ સુવિધાનું હાલમાં પરીક્ષણ થઈ રહ્યું છે ""અને તમારા વૉઇસમેઇલ સર્વરમાંથી સંભવિત રૂપે વૉઇસમેઇલ કાઢી નાખશે અને આ સુવિધાનું ભવિષ્યમાં સમર્થન કરવાનું અમે વચન આપતા નથી. જોકે અમને આ સુવિધા પર પ્રતિસાદ ગમશે."
- "[પ્રાયોગિક] અતિરિક્ત સ્ટોરેજ ચાલુ કરો અને બેકઅપ લો"
- "તમારું મેઇલબૉક્સ મોટે ભાગે ભરાઇ ગયું છે. સ્થાન ખાલી કરવા માટે, અતિરિક્ત સ્ટોરેજ ચાલુ કરો જેથી Google તમારા વૉઇસમેઇલ સંદેશા સંચાલિત કરી અને તેનું બેકઅપ લઈ શકે. ""આ સુવિધાનું હાલમાં પરીક્ષણ થઈ રહ્યું છે ""અને તમારા વૉઇસમેઇલ સર્વરમાંથી સંભવિત રૂપે વૉઇસમેઇલ કાઢી નાખશે અને આ સુવિધાનું ભવિષ્યમાં સમર્થન કરવાનું અમે વચન આપતા નથી. જોકે અમને આ સુવિધા પર પ્રતિસાદ ગમશે."
+ "અતિરિક્ત સ્ટોરેજ ચાલુ કરો અને બેકઅપ લો"
+ "તમારું મેઇલબોક્સ ભરાઇ ગયું છે. સ્થાન ખાલી કરવા માટે, અતિરિક્ત સ્ટોરેજ ખાલી કરો જેથી Google તમારા વૉઇસમેઇલ સંદેશા સંચાલિત કરી અને તેનું બેકઅપ લઈ શકે."
+ "અતિરિક્ત સ્ટોરેજ ચાલુ કરો અને બેકઅપ લો"
+ "તમારું મેઇલબોક્સ મોટાંભાગે ભરાઇ ગયું છે. સ્થાન ખાલી કરવા માટે, અતિરિક્ત સ્ટોરેજ ખાલી કરો જેથી Google તમારા વૉઇસમેઇલ સંદેશા સંચાલિત કરી અને તેનું બેકઅપ લઈ શકે."
"તમારો વૉઇસમેઇલ PIN સેટ કરો"
"તમારી વૉઇસમેઇલને ઍક્સેસ કરવા માટે તમે કોઈપણ સમયે કૉલ કરો છો, ત્યારે તમને વૉઇસમેઇલ PIN ની જરૂર પડશે."
"અજાણી ભૂલ"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-hi/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-hi/strings.xml
index 07cc9b70b..bc9c46331 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-hi/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-hi/strings.xml
@@ -44,10 +44,10 @@
"यदि आपका इनबॉक्स भरा हुआ है, तो आप नया वॉइसमेल नहीं प्राप्त कर सकेंगे."
"नए वॉइसमेल प्राप्त नहीं किए जा सकते"
"आपका इनबॉक्स पूरा भर गया है. नया वॉइसमेल प्राप्त करने के लिए कुछ संदेश हटाने का प्रयास करें."
- "[प्रयोगात्मक] अतिरिक्त जगह और बैकअप चालू करें"
- "आपका मेलबॉक्स भर चुका है. जगह खाली करने के लिए, अतिरिक्त मेमोरी चालू करें ताकि Google आपके वॉइसमेल संदेशों को प्रबंधित कर सके और उनका बैक अप ले सके. ""इस सुविधा का अभी परीक्षण किया जा रहा है ""और हो सकता है कि यह आपके वॉइसमेल सर्वर से वॉइसमेल हटा दे और हम भविष्य में इस सुविधा को देने का वादा नहीं करते. फिर भी आपका फ़ीडबैक हमें अच्छा लगेगा."
- "[प्रयोगात्मक] अतिरिक्त जगह और बैकअप चालू करें"
- "आपका मेलबॉक्स लगभग भर चुका है. जगह खाली करने के लिए, अतिरिक्त मेमोरी चालू करें ताकि Google आपके वॉइसमेल संदेशों को प्रबंधित कर सके और उनका बैक अप ले सके. ""इस सुविधा का अभी परीक्षण किया जा रहा है ""और हो सकता है कि यह आपके वॉइसमेल सर्वर से वॉइसमेल हटा दे और हम भविष्य में इस सुविधा को देने का वादा नहीं करते. फिर भी आपका फ़ीडबैक हमें अच्छा लगेगा."
+ "अतिरिक्त जगह और बैकअप चालू करें"
+ "आपका मेलबॉक्स भर गया है. जगह खाली करने के लिए, अतिरिक्त जगह चालू करें ताकि Google आपके वॉइसमेल संदेशों को प्रबंधित कर सके और उनका बैकअप ले सके."
+ "अतिरिक्त जगह और बैकअप चालू करें"
+ "आपका मेलबॉक्स लगभग भर गया है. जगह खाली करने के लिए, अतिरिक्त जगह चालू करें ताकि Google आपके वॉइसमेल संदेशों को प्रबंधित कर सके और उनका बैकअप ले सके."
"अपना वॉइसमेल पिन सेट करें"
"आप जब भी अपना वॉइसमेल एक्सेस करने के लिए कॉल करते हैं, आपको वॉइसमेल पिन की आवश्यकता होगी."
"अज्ञात गड़बड़ी"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-hr/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-hr/strings.xml
index b41443b84..a310d597c 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-hr/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-hr/strings.xml
@@ -44,10 +44,10 @@
"Ako je vaša pristigla pošta puna, nećete moći primiti novu govornu poruku."
"Primanje nove govorne pošte nije moguće"
"Pristigla pošta je puna. Izbrišite neke poruke da biste primili novu govornu poštu."
- "[Eksperimentalno] Uključivanje dodatne pohrane i sigurnosnog kopiranja"
- "Vaš je poštanski pretinac pun. Da biste oslobodili prostor, uključite dodatnu pohranu tako da Google može upravljati porukama u govornoj pošti i sigurnosno ih kopirati. ""Ova se značajka trenutačno testira ""i možda će izbrisati poruke govorne pošte s vašeg poslužitelja govorne pošte. Ne možemo obećati da ćemo ovu značajku podržati u budućnosti. Međutim, voljeli bismo dobiti povratne informacije o njoj."
- "[Eksperimentalno] Uključivanje dodatne pohrane i sigurnosnog kopiranja"
- "Vaš je poštanski pretinac pun. Da biste oslobodili prostor, uključite dodatnu pohranu tako da Google može upravljati porukama u govornoj pošti i sigurnosno ih kopirati. ""Ova se značajka trenutačno testira ""i možda će izbrisati poruke govorne pošte s vašeg poslužitelja govorne pošte. Ne možemo obećati da ćemo ovu značajku podržati u budućnosti. Međutim, voljeli bismo dobiti povratne informacije o njoj."
+ "Uključivanje dodatne pohrane i sigurnosnog kopiranja"
+ "Vaš je poštanski pretinac pun. Da biste oslobodili prostor, uključite dodatnu pohranu tako da Google može upravljati porukama u govornoj pošti i sigurnosno ih kopirati."
+ "Uključivanje dodatne pohrane i sigurnosnog kopiranja"
+ "Vaš je poštanski pretinac gotovo pun. Da biste oslobodili prostor, uključite dodatnu pohranu tako da Google može upravljati porukama u govornoj pošti i sigurnosno ih kopirati."
"Postavljanje PIN-a za govornu poštu"
"PIN za govornu poštu trebat će vam svaki put kad zatražite pristup govornoj pošti."
"Nepoznata pogreška"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-hu/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-hu/strings.xml
index 2fc191ae1..cc3eb7ecf 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-hu/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-hu/strings.xml
@@ -44,10 +44,10 @@
"Ha a postaláda megtelt, nem fogadhat új hangpostaüzeneteket."
"Nem tud új hangpostaüzeneteket fogadni"
"A postaláda megtelt. Ha meg szeretné kapni az új hangpostaüzeneteket, töröljön néhány üzenetet."
- "[Kísérleti] Az extra tárhely és biztonsági mentés bekapcsolása"
- "A postafiókja megtelt. Ha szeretne helyet felszabadítani, kapcsolja be az extra tárhely funkciót, így a Google kezelheti az Ön hangposta-üzeneteit, és biztonsági másolatot készíthet róluk. ""Ezt a funkciót jelenleg teszteljük"", és előfordulhat, hogy letörli az Ön hangüzeneteit a hangpostaszerverről. Nem garantáljuk, hogy a funkció a jövőben is megmarad, de nagy örömmel vennénk, ha megírná róla a véleményét."
- "[Kísérleti] Az extra tárhely és biztonsági mentés bekapcsolása"
- "A postafiókja majdnem megtelt. Ha szeretne helyet felszabadítani, kapcsolja be az extra tárhely funkciót, így a Google kezelheti az Ön hangposta-üzeneteit, és biztonsági másolatot készíthet róluk. ""Ezt a funkciót jelenleg teszteljük"", és előfordulhat, hogy letörli az Ön hangüzeneteit a hangpostaszerverről. Nem garantáljuk, hogy a funkció a jövőben is megmarad, de nagy örömmel vennénk, ha megírná róla a véleményét."
+ "Az extra tárhely és biztonsági mentés bekapcsolása"
+ "A postaláda betelt. Ha szeretne helyet felszabadítani, kapcsolja be az extra tárhely funkciót, hogy a Google kezelhesse a hangpostaüzeneteket, és biztonsági mentést készíthessen róluk."
+ "Az extra tárhely és biztonsági mentés bekapcsolása"
+ "A postaláda majdnem betelt. Ha szeretne helyet felszabadítani, kapcsolja be az extra tárhely funkciót, hogy a Google kezelhesse a hangpostaüzeneteket, és biztonsági mentést készíthessen róluk."
"A hangposta PIN-kódjának beállítása"
"A hangpostafiók eléréséhez PIN-kódra van szüksége."
"Ismeretlen hiba"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-hy/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-hy/strings.xml
index 435f1242b..4a9c2ed21 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-hy/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-hy/strings.xml
@@ -44,10 +44,10 @@
"Եթե մուտքի արկղը լցվի, նոր ձայնային հաղորդագրություններ չեք կարողանա ստանալ:"
"Հնարավոր չէ ստանալ նոր ձայնային հաղորդագրություններ"
"Մուտքի արկղը լիքն է: Նոր հաղոդագրություններ ստանալու համար ջնջեք հները:"
- "[Փորձնական գործառույթ] Ակտիվացրեք լրացուցիչ տարածքն ու պահուստավորումը"
- "Ձեր փոստարկղը լիքն է: Ակտիվացրեք լրացուցիչ տարածք, որպեսզի Google-ը կարողանա կառավարել և պահուստավորել ձեր ձայնային փոստի հաղորդագրությունները: ""Այս գործառույթը ներկայումս փորձարկման փուլում է, ""և այս ընթացքում ձայնային հաղորդագրությունները ձեր ձայնային փոստի սերվերից կարող են ջնջվել: Մենք չենք կարող խոստանալ, որ այն հետագայում կաջակցվի: Այդուհանդերձ, կցանկանայինք ձեր կարծիքն իմանալ այս գործառույթի մասին:"
- "[Փորձնական գործառույթ] Ակտիվացրեք լրացուցիչ տարածքն ու պահուստավորումը"
- "Ձեր փոստարկղը գրեթե լիքն է: Ակտիվացրեք լրացուցիչ տարածք, որպեսզի Google-ը կարողանա կառավարել և պահուստավորել ձեր ձայնային փոստի հաղորդագրությունները: ""Այս գործառույթը ներկայումս փորձարկման փուլում է, ""և այս ընթացքում ձայնային հաղորդագրությունները ձեր ձայնային փոստի սերվերից կարող են ջնջվել: Մենք չենք կարող խոստանալ, որ այն հետագայում կաջակցվի: Այդուհանդերձ, կցանկանայինք ձեր կարծիքն իմանալ այս գործառույթի մասին:"
+ "Պահանջվում է լրացուցիչ տարածք"
+ "Ձեր փոստարկղը լիքն է: Ակտիվացրեք լրացուցիչ տարածք, որպեսզի Google-ը կարողանա կառավարել և պահուստավորել ձեր ձայնային փոստի հաղորդագրությունները:"
+ "Պահանջվում է լրացուցիչ տարածք"
+ "Ձեր փոստարկղը գրեթե լիքն է: Ակտիվացրեք լրացուցիչ տարածք, որպեսզի Google-ը կարողանա կառավարել և պահուստավորել ձեր ձայնային փոստի հաղորդագրությունները:"
"Ընտրել ձեր ձայնային փոստի PIN-ը"
"Ամեն անգամ ձայնային փոստին զանգելիս ձեզանից կպահանջվի ձայնային փոստի PIN-ը:"
"Անհայտ սխալ"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-in/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-in/strings.xml
index 5687aa9e2..948afaed4 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-in/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-in/strings.xml
@@ -44,10 +44,10 @@
"Pesan suara tidak dapat diterima jika kotak masuk Anda penuh."
"Tidak dapat menerima pesan suara baru"
"Kotak masuk Anda penuh. Coba hapus beberapa pesan untuk menerima pesan suara baru."
- "[Eksperimental] Aktifkan penyimpanan dan backup ekstra"
- "Kotak surat Anda penuh. Untuk mengosongkan ruang penyimpanan, aktifkan penyimpanan ekstra sehingga Google dapat mengelola dan mem-backup pesan suara Anda. ""Fitur ini sedang diuji ""dan berpotensi menghapus pesan suara dari server pesan suara Anda, dan kami tidak berjanji akan mendukung fitur ini di masa mendatang. Namun, kami akan menerima masukan Anda dengan senang hati."
- "[Eksperimental] Aktifkan penyimpanan dan backup ekstra"
- "Kotak surat Anda hampir penuh. Untuk mengosongkan ruang penyimpanan, aktifkan penyimpanan ekstra agar Google dapat mengelola dan mem-backup pesan suara Anda. ""Fitur ini sedang diuji ""dan berpotensi menghapus pesan suara dari server pesan suara Anda, dan kami tidak berjanji akan mendukung fitur ini di masa mendatang. Namun, kami akan menerima masukan Anda dengan senang hati."
+ "Aktifkan penyimpanan dan backup ekstra"
+ "Kotak surat Anda sudah penuh. Untuk mengosongkan ruang, aktifkan penyimpanan ekstra sehingga Google dapat mengelola dan melakukan backup pada pesan suara Anda."
+ "Aktifkan penyimpanan dan backup ekstra"
+ "Kotak surat Anda hampir penuh. Untuk mengosongkan ruang, aktifkan penyimpanan ekstra sehingga Google dapat mengelola dan melakukan backup pada pesan suara Anda."
"Setel PIN pesan suara Anda"
"Anda akan memerlukan PIN pesan suara setiap kali menelepon untuk mengakses pesan suara."
"Kesalahan tidak dikenal"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-is/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-is/strings.xml
index 6aeb70fec..ae0497ee3 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-is/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-is/strings.xml
@@ -44,10 +44,10 @@
"Þú getur ekki tekið á móti nýjum talhólfsskilaboðum ef pósthólfið er fullt."
"Ekki hægt að taka á móti nýjum talhólfsskilaboðum"
"Pósthólfið er fullt. Prófaðu að eyða skilaboðum til að taka á móti nýjum talhólfsskilaboðum."
- "[Tilraunaútgáfa] Kveikja á viðbótargeymslu og öryggisafritun"
- "Pósthólfið er fullt. Kveiktu á viðbótargeymslu svo Google geti haft umsjón með og tekið afrit af talhólfsskilaboðunum þínum. ""Verið er að prófa þennan eiginleika ""og mögulega gæti talhólfsskilaboðum verið eytt af vefþjóni talhólfsins og við ábyrgjumst ekki að eiginleikinn verði studdur í framtíðinni. Við kunnum virkilega að meta allar ábendingar varðandi þennan eiginleika."
- "[Tilraunaútgáfa] Kveikja á viðbótargeymslu og öryggisafritun"
- "Pósthólfið er næstum fullt. Kveiktu á viðbótargeymslu svo Google geti haft umsjón með og tekið afrit af talhólfsskilaboðunum þínum. ""Verið er að prófa þennan eiginleika ""og mögulega gæti talhólfsskilaboðum verið eytt af vefþjóni talhólfsins og við ábyrgjumst ekki að eiginleikinn verði studdur í framtíðinni. Við kunnum virkilega að meta allar ábendingar varðandi þennan eiginleika."
+ "Kveikja á viðbótargeymslu og öryggisafritun"
+ "Pósthólfið þitt er fullt. Þú getur losað pláss með því að kveikja á viðbótargeymslu til að Google geti unnið með og tekið öryggisafrit af talhólfsskilaboðunum þínum."
+ "Kveikja á viðbótargeymslu og öryggisafritun"
+ "Pósthólfið þitt er næstum fullt. Þú getur losað pláss með því að kveikja á viðbótargeymslu til að Google geti unnið með og tekið öryggisafrit af talhólfsskilaboðunum þínum."
"Stilla PIN-númer talhólfs"
"Þú þarft að nota PIN-númer talhólfsins í hvert skipti sem þú hringir til að athuga það."
"Óþekkt villa"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-it/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-it/strings.xml
index e0a4fe946..1df608aed 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-it/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-it/strings.xml
@@ -44,10 +44,10 @@
"Se la casella della segreteria è piena non potrai ricevere nuovi messaggi vocali."
"Impossibile ricevere nuovi messaggi vocali"
"La casella della segreteria è piena. Prova a eliminare alcuni messaggi per riceverne di nuovi."
- "[Sperimentale] Attiva archiviazione supplementare e backup"
- "La tua casella postale è piena. Per liberare spazio, attiva l\'archiviazione supplementare in modo che Google possa gestire i messaggi vocali ed effettuarne il backup. ""Questa funzionalità al momento è in fase di test "" possibile che i messaggi vocali vengano eliminati dal server della segreteria. Non ci sono garanzie che la funzionalità continui a essere supportata in futuro, ma ci piacerebbe ricevere il tuo feedback."
- "[Sperimentale] Attiva archiviazione supplementare e backup"
- "La tua casella postale è quasi piena. Per liberare spazio, attiva l\'archiviazione supplementare in modo che Google possa gestire i messaggi vocali ed effettuarne il backup. ""Questa funzionalità al momento è in fase di test ""È possibile che i messaggi vocali vengano eliminati dal server della segreteria. Non ci sono garanzie che la funzionalità continui a essere supportata in futuro, ma ci piacerebbe ricevere il tuo feedback."
+ "Attiva spazio di archiviazione supplementare e backup"
+ "La tua casella di posta e piena. Per liberare spazio, attiva lo spazio di archiviazione supplementare in modo che Google possa gestire i messaggi vocali ed eseguirne il backup."
+ "Attiva spazio di archiviazione supplementare e backup"
+ "La tua casella di posta e quasi piena. Per liberare spazio, attiva lo spazio di archiviazione supplementare in modo che Google possa gestire i messaggi vocali ed eseguirne il backup."
"Imposta il PIN della segreteria"
"Dovrai inserire il PIN della segreteria ogni volta che chiami per accedervi."
"Errore sconosciuto"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-iw/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-iw/strings.xml
index 17c8e075a..c05a02feb 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-iw/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-iw/strings.xml
@@ -44,10 +44,10 @@
"אם תיבת הדואר הנכנס מלאה, לא תוכל לקבל דואר קולי חדש."
"לא ניתן לקבל הודעות חדשות בדואר הקולי"
"תיבת הדואר הנכנס מלאה. נסה למחוק חלק מההודעות כדי שתוכל לקבל דואר קולי חדש."
- "[תכונה ניסיונית] הפעל את הגיבוי ופינוי המקום"
- "תיבת הדואר שלך מלאה. הפעל את התכונה \'גיבוי ופינוי מקום\' כדי ש-Google תוכל לנהל ולגבות את ההודעות הקוליות שלך. ""זוהי תכונה ניסיונית"" שאנחנו בודקים כרגע. היא עלולה למחוק הודעות קוליות מתא הדואר הקולי שלך בשרת. אנחנו לא מתחייבים שהתכונה תהיה זמינה בעתיד, אך נשמח לקבל עליה משוב."
- "[תכונה ניסיונית] הפעל את הגיבוי ופינוי המקום"
- "תיבת הדואר שלך כמעט מלאה. הפעל את התכונה \'גיבוי ופינוי מקום\' כדי ש-Google תוכל לנהל ולגבות את ההודעות הקוליות שלך. ""זוהי תכונה ניסיונית"" שאנחנו בודקים כרגע. היא עלולה למחוק הודעות קוליות מתא הדואר הקולי שלך בשרת. אנחנו לא מתחייבים שהתכונה תהיה זמינה בעתיד, אך נשמח לקבל עליה משוב."
+ "הפעל את הגיבוי ופינוי המקום"
+ "תיבת הדואר שלך מלאה. הפעל את הגיבוי ופינוי המקום כדי ש-Google תוכל לנהל ולגבות את ההודעות הקוליות שלך."
+ "הפעל את הגיבוי ופינוי המקום"
+ "תיבת הדואר שלך כמעט מלאה. הפעל את הגיבוי ופינוי המקום כדי ש-Google תוכל לנהל ולגבות את ההודעות הקוליות שלך."
"הגדר קוד גישה לדואר הקולי"
"בכל פעם שתשתמש בדואר הקולי תצטרך את קוד הגישה."
"שגיאה לא ידועה"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-ja/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-ja/strings.xml
index 41d32b0cc..5d47a9cea 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-ja/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-ja/strings.xml
@@ -44,10 +44,10 @@
"新しいボイスメールを受信できません。受信トレイがいっぱいです。"
"新しいボイスメールを受信できません"
"受信トレイがいっぱいです。新しいボイスメールを受信するには、古いメッセージをいくつか削除してみてください。"
- "[試験運用機能] 追加の保存容量とバックアップを ON にしてください"
- "メールボックスの容量が上限に達しました。空き容量を増やすには、追加の保存容量を ON にして、Google がボイスメールのメッセージの管理とバックアップを行えるようにしてください。""これは現在テスト中の機能""で、ボイスメール サーバーからボイスメールを削除することができます。今後この機能が正式にサポートされる保証はありませんが、フィードバックをお寄せいただければ幸いです。"
- "[試験運用機能] 追加の保存容量とバックアップを ON にしてください"
- "メールボックスの保存容量がもう少しで上限に達します。空き容量を増やすには、追加の保存容量を ON にして、Google がボイスメールのメッセージの管理とバックアップを行えるようにしてください。""これは現在テスト中の機能""で、ボイスメール サーバーからボイスメールを削除することができます。今後この機能が正式にサポートされる保証はありませんが、フィードバックをお寄せいただければ幸いです。"
+ "追加の保存容量とバックアップを ON にしてください"
+ "メールボックスの保存容量が上限に達しました。空き容量を増やすには、追加の保存容量を ON にして、Google がボイスメールのメッセージの管理とバックアップを行えるようにしてください。"
+ "追加の保存容量とバックアップを ON にしてください"
+ "メールボックスの保存容量がもう少しで上限に達します。空き容量を増やすには、追加の保存容量を ON にして、Google がボイスメールのメッセージの管理とバックアップを行えるようにしてください。"
"ボイスメール PIN を設定"
"ボイスメールを呼び出すには、ボイスメール PIN が必要です。"
"不明なエラー"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-ka/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-ka/strings.xml
index 4990066ea..c5f6a12ca 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-ka/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-ka/strings.xml
@@ -44,10 +44,10 @@
"თუ თქვენი შემოსულები სავსეა, ახალ ხმოვან ფოსტას ვერ მიიღებთ."
"ახალი ხმოვანი ფოსტის მიღება შეუძლებელია"
"თქვენი შემოსულები სავსეა. ახალი ხმოვანი ფოსტის მისაღებად სცადეთ რამდენიმე შეტყობინების წაშლა."
- "[ექსპერიმენტული] დამატებითი მეხსიერების ჩართვა და სარეზერვო ასლების შექმნა"
- "თქვენი საფოსტო ყუთი სავსეა. სივრცის გასათავისუფლებლად ჩართეთ დამატებითი მეხსიერება, რომ Google-მა შეძლოს თქვენი ხმოვანი ფოსტის შეტყობინებების მართვა და სარეზერვო ასლების შექმნა. ""ეს ფუნქცია ამჟამად ტესტირების პროცესშია ""და, სავარაუდოდ, წაშლის ხმოვან შეტყობინებებს თქვენი ხმოვანი ფოსტის სერვერიდან. ჩვენ ვერ დაგპირდებით, რომ მომავალში ეს ფუნქცია მხარდაჭერილი იქნება. თუმცა ამ ფუნქციის შესახებ გამოხმაურებას ინტერესით გავეცნობოდით."
- "[ექსპერიმენტული] დამატებითი მეხსიერების ჩართვა და სარეზერვო ასლების შექმნა"
- "თქვენი საფოსტო ყუთი თითქმის სავსეა. სივრცის გასათავისუფლებლად ჩართეთ დამატებითი მეხსიერება, რომ Google-მა შეძლოს თქვენი ხმოვანი ფოსტის შეტყობინებების მართვა და სარეზერვო ასლების შექმნა. ""ეს ფუნქცია ამჟამად ტესტირების პროცესშია ""და, სავარაუდოდ, წაშლის ხმოვან შეტყობინებებს თქვენი ხმოვანი ფოსტის სერვერიდან. ჩვენ ვერ დაგპირდებით, რომ მომავალში ეს ფუნქცია მხარდაჭერილი იქნება. თუმცა ამ ფუნქციის შესახებ გამოხმაურებას ინტერესით გავეცნობოდით."
+ "დამატებითი მეხსიერების ჩართვა და სარეზერვო ასლების შექმნა"
+ "თქვენი საფოსტო ყუთი სავსეა. ადგილის გასათავისუფლებლად ჩართეთ დამატებითი მეხსიერება, რათა Google-მა შეძლოს თქვენი ხმოვანი ფოსტის შეტყობინებების მართვა და სარეზერვო ასლების შექმნა."
+ "დამატებითი მეხსიერების ჩართვა და სარეზერვო ასლების შექმნა"
+ "თქვენი საფოსტო ყუთი თითქმის სავსეა. ადგილის გასათავისუფლებლად ჩართეთ დამატებითი მეხსიერება, რათა Google-მა შეძლოს თქვენი ხმოვანი ფოსტის შეტყობინებების მართვა და სარეზერვო ასლების შექმნა."
"დააყენეთ თქვენი ხმოვანი ფოსტის PIN-კოდი"
"ნებისმიერ დროს, როდესაც დარეკავთ, რათა ხმოვან ფოსტაზე წვდომა იქონიოთ, ხმოვანი ფოსტის PIN-კოდი დაგჭირდებათ."
"უცნობი შეცდომა"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-kk/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-kk/strings.xml
index f2ea20536..ad164c8fa 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-kk/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-kk/strings.xml
@@ -44,10 +44,10 @@
"Кіріс қалтасы толы болса, жаңа дауыстық хабар ала алмайсыз."
"Жаңа дауыстық хабарды алу мүмкін емес"
"Кіріс қалтасы толы. Жаңа дауыстық хабарды алу үшін кейбір хабарларды жойып көріңіз."
- "[Эксперименттік] Қосымша жадты қосып, сақтық көшірме жасау"
- "Пошта жәшігі толы. Орын босату үшін, қосымша жад функциясын қосып, Google-ға дауыстық хабарларыңызды басқарып, сақтық көшірмесін жасауға рұқсат беріңіз. ""Бұл мүмкіндік қазір тексеріліп жатыр ""және ол дауыстық хабарларды дауыстық хабар серверінен өшіруі мүмкін. Сондықтан осы мүмкіндікке алдағы уақытта қолдау көрсетілетініне уәде бермейміз. Сонда да осы мүмкіндікке қатысты пікір алғымыз келеді."
- "[Эксперименттік] Қосымша жадты қосып, сақтық көшірме жасау"
- "Пошта жәшігі толы. Орын босату үшін, қосымша жад функциясын қосып, Google-ға дауыстық хабарларыңызды басқарып, сақтық көшірмесін жасауға рұқсат беріңіз. ""Бұл мүмкіндік қазір тексеріліп жатыр ""және ол дауыстық хабарларды дауыстық хабар серверінен өшіруі мүмкін. Сондықтан осы мүмкіндікке алдағы уақытта қолдау көрсетілетініне уәде бермейміз. Сонда да осы мүмкіндікке қатысты пікір алғымыз келеді."
+ "Қосымша жадты қосып, сақтық көшірме жасау"
+ "Кіріс жәшігі толы. Орын босату үшін, қосымша жад функциясын қосып, Google-ға дауыстық хабарларыңызды басқарып, сақтық көшірмесін жасауға рұқсат беріңіз."
+ "Қосымша жадты қосып, сақтық көшірме жасау"
+ "Кіріс жәшігі толы. Орын босату үшін, қосымша жад функциясын қосып, Google-ға дауыстық хабарларыңызды басқарып, сақтық көшірмесін жасауға рұқсат беріңіз."
"Дауыстық пошта PIN кодын орнатыңыз"
"Дауыстық поштаны тыңдау үшін кез келген уақытта қоңырау шалғанда, дауыстық пошта PIN коды сұралады."
"Белгісіз қате"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-km/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-km/strings.xml
index ff2a28378..f0ebf043d 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-km/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-km/strings.xml
@@ -44,10 +44,10 @@
"អ្នកនឹងមិនអាចទទួលសារជាសំឡេងថ្មីបានទេ បើប្រអប់សំបុត្ររបស់អ្នកពេញ។"
"មិនអាចទទួលសារជាសំឡេងថ្មីបានទេ"
"ប្រអប់សំបុត្ររបស់អ្នកពេញ។ សូមព្យាយាមលុបសារមួយចំនួនដើម្បីអាចទទួលសារជាសំឡេងថ្មីបាន។"
- "[ការសាកល្បង] បើកទំហំផ្ទុកបន្ថែម រួចបម្រុងទុក"
- "ប្រអប់សាររបស់អ្នកពេញហើយ។ ដើម្បីបង្កើនទំហំផ្ទុកទំនេរ សូមបើកទំហំផ្ទុកបន្ថែម ដើម្បីឲ្យ Google អាចគ្រប់គ្រង និងបម្រុងទុកសារសារជាសំឡេងរបស់អ្នកបាន។ ""មុខងារនេះកំពុងត្រូវបានសាកល្បងនៅពេលនេះ ""ហើយអាចនឹងលុបសារជាសំឡេងពីម៉ាស៊ីនមេសារជាសំឡេងរបស់អ្នក ហើយយើងមិនសន្យាធ្វើឲ្យមុខងារនេះដំណើរការនៅថ្ងៃក្រោយទេ។ យើងចង់ដឹងមតិស្ថាបនាអំពីមុខងារនេះផងដែរ។"
- "[ការសាកល្បង] បើកទំហំផ្ទុកបន្ថែម រួចបម្រុងទុក"
- "ប្រអប់សាររបស់អ្នកពេញហើយ។ ដើម្បីបង្កើនទំហំផ្ទុកទំនេរ សូមបើកទំហំផ្ទុកបន្ថែម ដើម្បីឲ្យ Google អាចគ្រប់គ្រង និងបម្រុងទុកសារសារជាសំឡេងរបស់អ្នកបាន។ ""មុខងារនេះកំពុងត្រូវបានសាកល្បងនៅពេលនេះ ""ហើយអាចនឹងលុបសារជាសំឡេងពីម៉ាស៊ីនមេសារជាសំឡេងរបស់អ្នក ហើយយើងមិនសន្យាធ្វើឲ្យមុខងារនេះដំណើរការនៅថ្ងៃក្រោយទេ។ យើងចង់ដឹងមតិស្ថាបនាអំពីមុខងារនេះផងដែរ។"
+ "បើកទំហំផ្ទុកបន្ថែម រួចបម្រុងទុក"
+ "ប្រអប់សាររបស់អ្នកពេញហើយ។ ដើម្បីបង្កើនទំហំផ្ទុកទំនេរ សូមបើកទំហំផ្ទុកបន្ថែម ដើម្បីឲ្យ Google អាចគ្រប់គ្រង និងបម្រុងទុកសារសារជាសំឡេងរបស់អ្នកបាន។"
+ "បើកទំហំផ្ទុកបន្ថែម រួចបម្រុងទុក"
+ "ប្រអប់សាររបស់អ្នកពេញហើយ។ ដើម្បីបង្កើនទំហំផ្ទុកទំនេរ សូមបើកទំហំផ្ទុកបន្ថែម ដើម្បីឲ្យ Google អាចគ្រប់គ្រង និងបម្រុងទុកសារសារជាសំឡេងរបស់អ្នកបាន។"
"កំណត់កូដ PIN សារជាសំឡេងរបស់អ្នក"
"អ្នកនឹងត្រូវការកូដ PIN សារជាសំឡេងមួយ គ្រប់ពេលដែលអ្នកហៅ ដើម្បីចូលដំណើរការសារជាសំឡេងរបស់អ្នក។"
"បញ្ហាមិនស្គាល់"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-kn/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-kn/strings.xml
index bf6390349..7840fca9a 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-kn/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-kn/strings.xml
@@ -44,10 +44,10 @@
"ನಿಮ್ಮ ಇನ್ಬಾಕ್ಸ್ ಪೂರ್ಣವಾಗಿದ್ದಾಗ ಹೊಸ ಧ್ವನಿಮೇಲ್ ಅನ್ನು ಸ್ವೀಕರಿಸಲು ನಿಮಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ."
"ಹೊಸ ಧ್ವನಿಮೇಲ್ಗಳನ್ನು ಸ್ವೀಕರಿಸಲಾಗುವುದಿಲ್ಲ"
"ನಿಮ್ಮ ಇನ್ಬಾಕ್ಸ್ ಪೂರ್ಣವಾಗಿದೆ. ಹೊಸ ಧ್ವನಿಮೇಲ್ ಸ್ವೀಕರಿಸಲು ಕೆಲವು ಸಂದೇಶಗಳನ್ನು ಅಳಿಸಲು ಪ್ರಯತ್ನಿಸಿ."
- "[ಪ್ರಾಯೋಗಿಕ] ಹೆಚ್ಚುವರಿ ಸಂಗ್ರಹಣೆ ಮತ್ತು ಬ್ಯಾಕಪ್ ಅನ್ನು ಆನ್ ಮಾಡಿ"
- "ನಿಮ್ಮ ಮೇಲ್ಬಾಕ್ಸ್ ತುಂಬಿದೆ. ಸ್ಥಳಾವಕಾಶವನ್ನು ತೆರವುಗೊಳಿಸಲು, ಹೆಚ್ಚುವರಿ ಸಂಗ್ರಹಣೆಯನ್ನು ಆನ್ ಮಾಡಿ ಇದರಿಂದ Google ನಿಮ್ಮ ಧ್ವನಿಮೇಲ್ ಸಂದೇಶಗಳನ್ನು ನಿರ್ವಹಿಸಬಹುದು ಮತ್ತು ಬ್ಯಾಕಪ್ ಮಾಡಬಹುದು. ""ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಪ್ರಸ್ತುತ ಪರೀಕ್ಷೆ ಮಾಡಲಾಗುತ್ತಿದೆ ""ಮತ್ತು ನಿಮ್ಮ ಧ್ವನಿಮೇಲ್ ಸರ್ವರ್ನಿಂದ ಧ್ವನಿಮೇಲ್ಗಳನ್ನು ಸಂಭಾವ್ಯವಾಗಿ ಅಳಿಸುತ್ತದೆ ಮತ್ತು ನಾವು ಭವಿಷ್ಯದಲ್ಲಿ ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬೆಂಬಲಿಸುವ ಭರವಸೆಯನ್ನು ನೀಡುವುದಿಲ್ಲ. ಆದರೂ ನಿಮ್ಮ ಪ್ರತಿಕ್ರಿಯೆಗೆ ಸ್ವಾಗತ."
- "[ಪ್ರಾಯೋಗಿಕ] ಹೆಚ್ಚುವರಿ ಸಂಗ್ರಹಣೆ ಮತ್ತು ಬ್ಯಾಕಪ್ ಅನ್ನು ಆನ್ ಮಾಡಿ"
- "ನಿಮ್ಮ ಮೇಲ್ಬಾಕ್ಸ್ ಬಹುತೇಕ ತುಂಬಿದೆ. ಸ್ಥಳಾವಕಾಶವನ್ನು ತೆರವುಗೊಳಿಸಲು, ಹೆಚ್ಚುವರಿ ಸಂಗ್ರಹಣೆಯನ್ನು ಆನ್ ಮಾಡಿ ಇದರಿಂದ Google ನಿಮ್ಮ ಧ್ವನಿಮೇಲ್ ಸಂದೇಶಗಳನ್ನು ನಿರ್ವಹಿಸಬಹುದು ಮತ್ತು ಬ್ಯಾಕಪ್ ಮಾಡಬಹುದು. ""ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಪ್ರಸ್ತುತವಾಗಿ ಪರೀಕ್ಷೆ ಮಾಡಲಾಗುತ್ತಿದೆ ""ಮತ್ತು ನಿಮ್ಮ ಧ್ವನಿಮೇಲ್ ಸರ್ವರ್ನಿಂದ ಧ್ವನಿಮೇಲ್ಗಳನ್ನು ಸಂಭಾವ್ಯವಾಗಿ ಅಳಿಸುತ್ತದೆ ಮತ್ತು ನಾವು ಭವಿಷ್ಯದಲ್ಲಿ ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬೆಂಬಲಿಸುವ ಭರವಸೆಯನ್ನು ನೀಡುವುದಿಲ್ಲ. ಆದರೂ ನಿಮ್ಮ ಪ್ರತಿಕ್ರಿಯೆಗೆ ಸ್ವಾಗತ."
+ "ಹೆಚ್ಚುವರಿ ಸಂಗ್ರಹಣೆ ಮತ್ತು ಬ್ಯಾಕಪ್ ಅನ್ನು ಆನ್ ಮಾಡಿ"
+ "ನಿಮ್ಮ ಮೇಲ್ಬಾಕ್ಸ್ ತುಂಬಿದೆ. ಸ್ಥಳಾವಕಾಶವನ್ನು ತೆರವುಗೊಳಿಸಲು, ಹೆಚ್ಚುವರಿ ಸಂಗ್ರಹವನ್ನು ಆನ್ ಮಾಡಿಕೊಳ್ಳುವ ಮೂಲಕ Google ನಿಮ್ಮ ಧ್ವನಿಮೇಲ್ ಸಂದೇಶಗಳನ್ನು ನಿರ್ವಹಿಸಬಹುದು ಮತ್ತು ಬ್ಯಾಕಪ್ ಮಾಡಬಹುದು."
+ "ಹೆಚ್ಚುವರಿ ಸಂಗ್ರಹಣೆ ಮತ್ತು ಬ್ಯಾಕಪ್ ಅನ್ನು ಆನ್ ಮಾಡಿ"
+ "ನಿಮ್ಮ ಮೇಲ್ಬಾಕ್ಸ್ ಬಹುತೇಕ ತುಂಬಿದೆ. ಸ್ಥಳಾವಕಾಶವನ್ನು ತೆರವುಗೊಳಿಸಲು, ಹೆಚ್ಚುವರಿ ಸಂಗ್ರಹವನ್ನು ಆನ್ ಮಾಡಿಕೊಳ್ಳುವ ಮೂಲಕ Google ನಿಮ್ಮ ಧ್ವನಿಮೇಲ್ ಸಂದೇಶಗಳನ್ನು ನಿರ್ವಹಿಸಬಹುದು ಮತ್ತು ಬ್ಯಾಕಪ್ ಮಾಡಬಹುದು."
"ನಿಮ್ಮ ಧ್ವನಿಮೇಲ್ ಪಿನ್ ಹೊಂದಿಸಿ"
"ನೀವು ಕರೆ ಮಾಡಿದಾಗ ನಿಮ್ಮ ಧ್ವನಿಮೇಲ್ ಪ್ರವೇಶಿಸಲು ನಿಮಗೆ ಯಾವಾಗಲೂ ಧ್ವನಿಮೇಲ್ ಪಿನ್ ಅಗತ್ಯವಿರುತ್ತದೆ."
"ಅಪರಿಚಿತ ದೋಷ"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-ko/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-ko/strings.xml
index fc4385b99..092214db1 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-ko/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-ko/strings.xml
@@ -44,10 +44,10 @@
"받은편지함이 가득 차면 새로운 음성메시지를 받을 수 없습니다."
"새로운 음성메시지를 받을 수 없음"
"받은편지함이 가득 찼습니다. 새로운 음성메시지를 받으려면 일부 메시지를 삭제해 보세요."
- "[실험] 추가 저장용량 및 백업 사용 설정"
- "편지함이 가득 찼습니다. 여유 공간을 확보하려면 Google에서 음성사서함 메시지를 관리하고 백업할 수 있도록 추가 저장용량을 사용 설정해 주세요. ""이 기능은 현재 테스트 단계이며 ""이 기능으로 인해 음성사서함 서버에서 메시지가 삭제될 수도 있습니다. 또한 Google에서는 추후 이 기능이 지원된다고 보장할 수 없습니다. 하지만 이 기능에 관해 의견을 주시면 감사하겠습니다."
- "[실험] 추가 저장용량 및 백업 사용 설정"
- "사서함이 거의 가득 찼습니다. 여유 공간을 확보하려면 Google에서 음성사서함 메시지를 관리하고 백업할 수 있도록 추가 저장용량을 사용 설정해 주세요. ""이 기능은 현재 테스트 단계이며 ""이 기능으로 인해 음성사서함 서버에서 메시지가 삭제될 수도 있습니다. 또한 Google에서는 추후 이 기능이 지원된다고 보장할 수 없습니다. 하지만 이 기능에 관해 의견을 주시면 감사하겠습니다."
+ "추가 저장용량 및 백업 사용"
+ "음성사서함이 가득 찼습니다. Google에서 음성사서함 메시지를 관리하고 백업할 수 있도록 추가 저장용량을 사용 설정하여 여유 공간을 확보하세요."
+ "추가 저장용량 및 백업 사용"
+ "음성사서함이 거의 가득 찼습니다. Google에서 음성사서함 메시지를 관리하고 백업할 수 있도록 추가 저장용량을 사용 설정하여 여유 공간을 확보하세요."
"음성사서함 PIN 설정"
"음성사서함에 액세스하도록 호출할 때마다 음성사서함 PIN이 필요합니다."
"알 수 없는 오류"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-ky/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-ky/strings.xml
index 096b29288..0fffb06d0 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-ky/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-ky/strings.xml
@@ -44,10 +44,10 @@
"Почтаңыз толуп калса, жаңы үн каттарын ала албай каласыз."
"Жаңы үн каттары алынбай жатат"
"\"Келген каттар\" кутуңуз толуп калды. Үн каттарын алуу үчүн айрым билдирүүлөрдү өчүрүңүз."
- "[Эксперименталдык] Кошумча мейкиндик жана камдык көчүрмөнү сактоону кошуңуз"
- "Үн почтаңызда бош орун жок. Үн каттарыңызды башкаруу жана алардын камдык көчүрмөлөрүн сактоо үчүн кошумча мейкиндикти күйгүзүп коюңуз. ""Бул функция учурда сыноодон өтүп жатат ""жана үн почтаңыздын сервериндеги үн каттарды өчүрүп салышы мүмкүн. Кийин бул функцияны колдоого алаарыбызга кепилдик бере албайбыз. Ошентсе да, функция тууралуу пикириңизди билгибиз келет."
- "[Эксперименталдык] Кошумча мейкиндик жана камдык көчүрмөнү сактоону кошуңуз"
- "Үн почтаңыз толуп калды. Үн каттарыңызды башкаруу жана алардын камдык көчүрмөлөрүн сактоо үчүн кошумча мейкиндикти күйгүзүп коюңуз. ""Бул функция учурда сыноодон өтүп жатат ""жана үн почтаңыздын сервериндеги үн каттарды өчүрүп салышы мүмкүн. Кийин бул функцияны колдоого алаарыбызга кепилдик бере албайбыз. Ошентсе да, функция тууралуу пикириңизди билгибиз келет."
+ "Кошумча мейкиндик талап кылынат"
+ "Үн почтаңызда бош орун жок. Үн каттарыңызды башкаруу жана алардын камдык көчүрмөлөрүн сактоо үчүн кошумча мейкиндикти күйгүзүп коюңуз."
+ "Кошумча мейкиндик талап кылынат"
+ "Үн почтаңыз толуп калды. Үн каттарыңызды башкаруу жана алардын камдык көчүрмөлөрүн сактоо үчүн кошумча мейкиндикти күйгүзүп коюңуз."
"Үн почтаңыздын PIN-кодун орнотуңуз"
"PIN-код ар чалган сайын үн почтаңызды угуу үчүн керек."
"Белгисиз ката"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-lo/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-lo/strings.xml
index bea11800c..d6293d2e7 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-lo/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-lo/strings.xml
@@ -44,10 +44,10 @@
"ທ່ານຈະບໍ່ສາມາດຮັບຂໍ້ຄວາມສຽງໃໝ່ໄດ້ຫາກອິນບັອກຂອງທ່ານເຕັມ."
"ບໍ່ສາມາດຮັບຂໍ້ຄວາມສຽງໃໝ່"
"ອິນບັອກຂອງທ່ານເຕັມແລ້ວ. ໃຫ້ລອງລຶບບາງຂໍ້ຄວາມອອກເພື່ອຮັບຂໍ້ຄວາມສຽງໃໝ່."
- "[ການທົດລອງ] ການສຳຮອງ ແລະ ບ່ອນຈັດເກັບຂໍ້ມູນພິເສດ"
- "Your mailbox is full. To free up space, turn on extra storage so Google can manage and backup your voicemail messages. ""This feature is currently being tested ""and will potentially delete voicemails from your voicemail server, and we do not promise to support this feature in the future. We would love your feedback though."
- "[ການທົດລອງ] ການສຳຮອງ ແລະ ບ່ອນຈັດເກັບຂໍ້ມູນພິເສດ"
- "ກ່ອງອີເມວຂອງທ່ານເຕັມແລ້ວ. ເພື່ອສ້າງພື້ນທີ່ຫວ່າງ, ໃຫ້ເປີດໃຊ້ບ່ອນຈັດເກັບຂໍ້ມູນພິເສດເພື່ອໃຫ້ Google ສາມາດຈັດການ ແລະ ສຳຮອງຂໍ້ຄວາມສຽງຂອງທ່ານໄດ້. ""ຄຸນສົມບັດນີ້ກຳລັງຢູ່ໃນລະຫວ່າງການທົດສອບ ""ແລະ ມັນອາດລຶບຂໍ້ຄວາມສຽງອອກຈາກເຊີບເວີຂໍ້ຄວາມສຽງຂອງທ່ານໄດ້. ຈະບໍ່ມີການຮັບປະກັນການຊ່ວຍເຫຼືອຄຸນສົມບັດນີ້ໃນອະນາຄົດ. ຢ່າງໃດກໍຕາມພວກເຮົາຢາກຟັງຄຳຄິດເຫັນທີ່ມີຕໍ່ຄຸນສົມບັດດັ່ງກ່າວຈາກທ່ານ."
+ "ເປີດໃຊ້ບ່ອນຈັດເກັບຂໍ້ມູນເພີ່ມເຕີມ ແລະ ການສຳຮອງຂໍ້ມູນ"
+ "ກ່ອງອີເມວຂອງທ່ານເຕັມແລ້ວ. ເພື່ອເພີ່ມບ່ອນຈັດເກັບຂໍ້ມູນ, ໃຫ້ເປີດໃຊ້ບ່ອນຈັດເກັບຂໍ້ມູນເພີ່າມເຕີມເພື່ອໃຫ້ Google ສາມາດຈັດການ ແລະ ສຳຮອງຂໍ້ມູນຂໍ້ຄວາມສຽງຂອງທ່ານໄດ້."
+ "ເປີດໃຊ້ບ່ອນຈັດເກັບຂໍ້ມູນເພີ່ມເຕີມ ແລະ ການສຳຮອງຂໍ້ມູນ"
+ "ກ່ອງອີເມວຂອງທ່ານໃກ້ເຕັມແລ້ວ. ເພື່ອເພີ່ມບ່ອນຈັດເກັບຂໍ້ມູນ, ໃຫ້ເປີດໃຊ້ບ່ອນຈັດເກັບຂໍ້ມູນເພີ່າມເຕີມເພື່ອໃຫ້ Google ສາມາດຈັດການ ແລະ ສຳຮອງຂໍ້ມູນຂໍ້ຄວາມສຽງຂອງທ່ານໄດ້."
"ຕັ້ງລະຫັດ PIN ຂໍ້ຄວາມສຽງຂອງທ່ານ"
"ທ່ານຈະຕ້ອງໃຊ້ລະຫັດ PIN ໃນຕອນໃດກໍຕາມທີ່ທ່ານໂທເພື່ອເຂົ້າຟັງຂໍ້ຄວາມສຽງຂອງທ່ານ."
"ຄວາມຜິດພາດທີ່ບໍ່ຮູ້ຈັກ"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-lt/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-lt/strings.xml
index 8b4c63989..92f3316d4 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-lt/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-lt/strings.xml
@@ -44,10 +44,10 @@
"Negalėsite gauti naujų balso pašto pranešimų, jei gautuosiuose nebeliks laisvos vietos."
"Nepavyksta gauti naujų balso pašto pranešimų"
"Gautuosiuose nebėra laisvos vietos. Kad galėtumėte gauti naujus balso pašto pranešimus, pabandykite ištrinti keletą pranešimų."
- "[Eksperimentinė] Įjunkite papildomos saugyklos vietos ir atsarginių kopijų kūrimo funkciją"
- "Pašto dėžutė pilna. Jei norite atlaisvinti vietos, įjunkite papildomos saugyklos vietos parinktį, kad „Google“ galėtų tvarkyti balso pašto pranešimus ir kurti atsargines jų kopijas. ""Ši funkcija šiuo metu išbandoma ""ir ją naudojant iš balso pašto serverio bus ištrinami balso pašto pranešimai. Nepažadame, kad ateityje ši funkcija bus palaikoma, tačiau norėtume gauti atsiliepimų apie ją."
- "[Eksperimentinė] Įjunkite papildomos saugyklos vietos ir atsarginių kopijų kūrimo funkciją"
- "Pašto dėžutė beveik pilna. Jei norite atlaisvinti vietos, įjunkite papildomos saugyklos vietos parinktį, kad „Google“ galėtų tvarkyti balso pašto pranešimus ir kurti atsargines jų kopijas. ""Ši funkcija šiuo metu išbandoma ""ir ją naudojant iš balso pašto serverio bus ištrinami balso pašto pranešimai. Nepažadame, kad ateityje ši funkcija bus palaikoma, tačiau norėtume gauti atsiliepimų apie ją."
+ "Įjunkite papildomos saugyklos vietos ir atsarginės kopijos kūrimo parinktį"
+ "Jūsų pašto dėžutė pilna. Jei norite atlaisvinti vietos, įjunkite papildomos saugyklos vietos parinktį, kad „Google“ galėtų tvarkyti balso pašto pranešimus ir kurti atsargines jų kopijas."
+ "Įjunkite papildomos saugyklos vietos ir atsarginės kopijos kūrimo parinktį"
+ "Jūsų pašto dėžutė beveik pilna. Jei norite atlaisvinti vietos, įjunkite papildomos saugyklos vietos parinktį, kad „Google“ galėtų tvarkyti balso pašto pranešimus ir kurti atsargines jų kopijas."
"Nustatyti balso pašto PIN kodą"
"Jums reikės balso pašto PIN kodo visada, kai skambinsite norėdami pasiekti balso paštą."
"Nežinoma klaida"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-lv/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-lv/strings.xml
index cd8ed7a6d..e27de6f21 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-lv/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-lv/strings.xml
@@ -44,10 +44,10 @@
"Jūs nevarēsiet saņemt jaunus balss pasta ziņojumus, ja iesūtne ir pilna."
"Nevar saņemt balss pasta ziņojumus."
"Iesūtne ir pilna. Izdzēsiet dažus ziņojumus, lai saņemtu jaunus balss pasta ziņojumus."
- "[Eksperimentāli] Papildu krātuves un dublēšanas aktivizēšana"
- "Jūsu pastkaste ir pilna. Lai atbrīvotu vietu un Google varētu pārvaldīt un dublēt jūsu balss pasta ziņojumus, aktivizējiet papildu krātuvi. ""Šī funkcija pašlaik tiek testēta, ""un pastāv iespēja, ka no jūsu balss pasta servera tiks izdzēsti balss pasta ziņojumi. Mēs negarantējam šīs funkcijas turpmāku atbalstu, tomēr priecāsimies saņemt atsauksmes par to."
- "[Eksperimentāli] Papildu krātuves un dublēšanas aktivizēšana"
- "Jūsu pastkaste ir gandrīz pilna. Lai atbrīvotu vietu un Google varētu pārvaldīt un dublēt jūsu balss pasta ziņojumus, aktivizējiet papildu krātuvi. ""Šī funkcija pašlaik tiek testēta, ""un pastāv iespēja, ka no jūsu balss pasta servera tiks izdzēsti balss pasta ziņojumi. Mēs negarantējam šīs funkcijas turpmāku atbalstu, tomēr priecāsimies saņemt atsauksmes par to."
+ "Papildu krātuves un dublēšanas aktivizēšana"
+ "Jūsu pastkaste ir pilna. Lai atbrīvotu vietu un Google varētu pārvaldīt un dublēt jūsu balss pasta ziņojumus, aktivizējiet papildu krātuvi."
+ "Papildu krātuves un dublēšanas aktivizēšana"
+ "Jūsu pastkaste ir gandrīz pilna. Lai atbrīvotu vietu un Google varētu pārvaldīt un dublēt jūsu balss pasta ziņojumus, aktivizējiet papildu krātuvi."
"Balss pasta PIN iestatīšana"
"Lai piekļūtu balss pastam zvanot, būs vajadzīgs balss pasta PIN."
"Nezināma kļūda"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-mk/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-mk/strings.xml
index 19aaa42aa..3ff8b8739 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-mk/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-mk/strings.xml
@@ -44,10 +44,10 @@
"Нема да може да добивате нова говорна пошта ако вашето приемно сандаче е полно."
"Не може да добивате нова говорна пошта"
"Вашето приемно сандаче е полно. Обидете се да избришете неколку пораки за да добиете нова говорна пошта."
- "[Експериментално] Вклучете дополнителен простор и бекап"
- "Вашето поштенско сандаче е полно. За да ослободите простор, вклучете дополнителен простор за да може Google да управува и да прави бекап на пораките од вашата говорна пошта. ""Функцијава е во фаза на тестирање во моментов ""и постои можност да брише говорни пораки од вашиот сервер за говорна пошта. Не ветуваме поддршка за функцијава во иднина. Сепак, многу би ни значеле вашите повратни информации."
- "[Експериментално] Вклучете дополнителен простор и бекап"
- "Вашето поштенско сандаче е речиси полно. За да ослободите простор, вклучете дополнителен простор за да може Google да управува и да прави бекап на пораките од вашата говорна пошта. ""Функцијава е во фаза на тестирање во моментов ""и постои можност да брише говорни пораки од вашиот сервер за говорна пошта. Не ветуваме поддршка за функцијава во иднина. Сепак, многу би ни значеле вашите повратни информации."
+ "Вклучете дополнителен простор и бекап"
+ "Вашето поштенско сандаче е полно. За да ослободите простор, вклучете дополнителен простор за да може Google да управува и да прави бекап на пораките од вашата говорна пошта."
+ "Вклучете дополнителен простор и бекап"
+ "Вашето поштенско сандаче е речиси полно. За да ослободите простор, вклучете дополнителен простор за да може Google да управува и да прави бекап на пораките од вашата говорна пошта."
"Поставете PIN за говорната пошта"
"Секогаш кога ќе повикате за да пристапите до говорната пошта, ќе треба да внесете PIN за говорна пошта."
"Непозната грешка"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-ml/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-ml/strings.xml
index 896b77036..84d221e3d 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-ml/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-ml/strings.xml
@@ -44,10 +44,10 @@
"ഇൻബോക്സ് നിറഞ്ഞിരിക്കുകയാണെങ്കിൽ നിങ്ങൾക്ക് പുതിയ വോയ്സ്മെയിൽ സ്വീകരിക്കാനാവില്ല."
"പുതിയ വോയ്സ്മെയിലുകൾ സ്വീകരിക്കാനാകുന്നില്ല"
"നിങ്ങളുടെ ഇൻബോക്സ് നിറഞ്ഞിരിക്കുകയാണ്. പുതിയ വോയ്സ്മെയിൽ സ്വീകരിക്കാൻ ചില സന്ദേശങ്ങൾ ഇല്ലാതാക്കുന്നത് പരീക്ഷിച്ചുനോക്കൂ."
- "[പരീക്ഷണാത്മകം] അധിക സ്റ്റോറേജും ബായ്ക്കപ്പും ഓണാക്കുക"
- "നിങ്ങളുടെ മെയിൽബോക്സ് നിറഞ്ഞിരിക്കുന്നു. ഇടം സൃഷ്ടിക്കാൻ അധിക സ്റ്റോറേജ് ഓണാക്കുക, തുടർന്ന് Google-ന് നിങ്ങളുടെ വോയ്സ്മെയിൽ സന്ദേശങ്ങൾ മാനേജുചെയ്യാനും ബായ്ക്കപ്പെടുക്കാനുമാകും. ""നിലവിൽ ഈ ഫീച്ചർ പരീക്ഷണ ഘട്ടത്തിലായതിനാൽ ""നിങ്ങളുടെ വോയ്സ്മെയിൽ സെർവറിലെ വോയ്സ്മെയിലുകൾ ഇല്ലാതാക്കാൻ സാധ്യതയുണ്ട്, ഒപ്പം ഭാവിയിൽ ഈ ഫീച്ചർ ഉപയോഗിക്കാനാവുമെന്നും ഞങ്ങൾ ഉറപ്പുനൽകുന്നില്ല. എങ്കിലും ഇതിനെക്കുറിച്ചുള്ള ഫീഡ്ബാക്ക് അറിയാൻ ഞങ്ങൾ താൽപ്പര്യപ്പെടുന്നു."
- "[പരീക്ഷണാത്മകം] അധിക സ്റ്റോറേജും ബായ്ക്കപ്പും ഓണാക്കുക"
- "നിങ്ങളുടെ മെയിൽബോക്സ് ഏകദേശം നിറഞ്ഞിരിക്കുന്നു. ഇടം സൃഷ്ടിക്കാൻ അധിക സ്റ്റോറേജ് ഓണാക്കുക, തുടർന്ന് Google-ന് നിങ്ങളുടെ വോയ്സ്മെയിൽ സന്ദേശങ്ങൾ മാനേജുചെയ്യാനും ബായ്ക്കപ്പെടുക്കാനുമാകും. ""നിലവിൽ ഈ ഫീച്ചർ പരീക്ഷണ ഘട്ടത്തിലായതിനാൽ ""നിങ്ങളുടെ വോയ്സ്മെയിൽ സെർവറിലെ വോയ്സ്മെയിലുകൾ ഇല്ലാതാക്കാൻ സാധ്യതയുണ്ട്, ഒപ്പം ഭാവിയിൽ ഈ ഫീച്ചർ ഉപയോഗിക്കാനാവുമെന്നും ഞങ്ങൾ ഉറപ്പുനൽകുന്നില്ല. എങ്കിലും ഇതിനെക്കുറിച്ചുള്ള ഫീഡ്ബാക്ക് അറിയാൻ ഞങ്ങൾ താൽപ്പര്യപ്പെടുന്നു."
+ "അധിക സ്റ്റോറേജും ബായ്ക്കപ്പും ഓണാക്കുക"
+ "നിങ്ങളുടെ മെയിൽബോക്സ് നിറഞ്ഞിരിക്കുന്നു. ഇടം സൃഷ്ടിക്കാൻ, അധിക സ്റ്റോറേജ് ഓണാക്കുക, തുടർന്ന് Google-ന് നിങ്ങളുടെ വോയ്സ്മെയിൽ സന്ദേശങ്ങൾ മാനേജുചെയ്യാനും ബായ്ക്കപ്പെടുക്കാനുമാകും."
+ "അധിക സ്റ്റോറേജും ബായ്ക്കപ്പും ഓണാക്കുക"
+ "നിങ്ങളുടെ മെയിൽബോക്സ് ഏകദേശം നിറഞ്ഞിരിക്കുന്നു. ഇടം സൃഷ്ടിക്കാൻ അധിക സ്റ്റോറേജ് ഓണാക്കുക, തുടർന്ന് Google-ന് നിങ്ങളുടെ വോയ്സ്മെയിൽ സന്ദേശങ്ങൾ മാനേജുചെയ്യാനും ബായ്ക്കപ്പെടുക്കാനുമാകും."
"നിങ്ങളുടെ വോയ്സ്മെയിൽ പിൻ സജ്ജമാക്കുക"
"വോയ്സ്മെയിൽ ആക്സസ് ചെയ്യാൻ ശ്രമിക്കുമ്പോഴെല്ലാം നിങ്ങൾക്കൊരു വോയ്സ്മെയിൽ പിൻ ആവശ്യമാണ്."
"തിരിച്ചറിയാനാകാത്ത പിശക്"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-mn/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-mn/strings.xml
index b4b01f7dc..99fc29dc3 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-mn/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-mn/strings.xml
@@ -44,10 +44,10 @@
"Ирсэн имэйл хайрцаг дүүрсэн бол та шинэ дуут шуудан хүлээж авах боломжгүй."
"Шинэ дуут шуудан хүлээж авах боломжгүй"
"Таны ирсэн имэйл хайрцаг дүүрэн байна. Шинэ дуут шуудан авахын тулд зарим зурвасыг устгаж үзнэ үү."
- "[Туршилтын] Гадаад хадгалах сан болон нөөцлөлтийг асаана уу"
- "Таны имэйл хайрцаг дүүрсэн байна. Сул зай гаргахын тулд гадаад хадгалах санг асааж өөрийн дуут шуудангийн зурвасуудыг удирдах, нөөцлөх боломжийг Google-д олгоно уу.""Энэ функцийг одоо шалгаж байгаа"" бөгөөд таны дуут шуудангийн серверээс дуут шуудангуудыг устгах магадлалтай, бид цаашид энэ функцийг дэмжинэ гэсэн баталгаа өгөхгүй. Гэхдээ энэ функцийн талаар санал хүсэлт илгээвэл талархах болно."
- "[Туршилтын] Гадаад хадгалах сан болон нөөцлөлтийг асаана уу"
- "Таны имэйл хайрцаг дүүрсэн байна. Сул зай гаргахын тулд гадаад хадгалах санг асааж өөрийн дуут шуудангийн зурвасуудыг удирдах, нөөцлөх боломжийг Google-д олгоно уу.""Энэ функцийг одоо шалгаж байгаа"" бөгөөд таны дуут шуудангийн серверээс дуут шуудангуудыг устгах магадлалтай, бид цаашид энэ функцийг дэмжинэ гэсэн баталгаа өгөхгүй. Гэхдээ энэ функцийн талаар санал хүсэлт илгээвэл талархах болно."
+ "Гадаад хадгалах сан болон нөөцлөлтийг асаана уу"
+ "Таны имэйл хайрцаг дүүрсэн байна. Сул зай гаргахын тулд гадаад хадгалах санг асааж өөрийн дуут шуудангийн зурвасуудыг удирдах, нөөцлөх боломжийг Google-д олгоно уу."
+ "Гадаад хадгалах сан болон нөөцлөлтийг асаана уу"
+ "Таны имэйл хайрцаг бараг дүүрсэн байна. Сул зай гаргахын тулд гадаад хадгалах санг асааж өөрийн дуут шуудангийн зурвасуудыг удирдах, нөөцлөх боломжийг Google-д олгоно уу."
"Өөрийн дуут шуудангийн PIN-г тохируулна уу"
"Та дуут шуудандаа хандахаар дуудлага хийх бүрт дуут шуудангийн PIN шаардлагатай болно."
"Тодорхойгүй алдаа"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-mr/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-mr/strings.xml
index 04f48b843..43c8bddbf 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-mr/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-mr/strings.xml
@@ -44,10 +44,10 @@
"आपला इनबॉक्स भरलेला असल्यास आपण नवीन व्हॉइसमेल प्राप्त करण्यात सक्षम असणार नाही."
"नवीन व्हॉइसमेल प्राप्त करू शकत नाही"
"आपला इनबॉक्स भरलेला आहे. नवीन व्हॉइसमेल प्राप्त करण्यासाठी काही संदेश हटविण्याचा प्रयत्न करा."
- "[प्रायोगिक] अतिरिक्त संचय आणि बॅक अप चालू करा"
- "आपला मेलबॉक्स पूर्ण भरला आहे. स्थान मोकळे करण्यासाठी, अतिरिक्त संचय चालू करा त्यामुळे Google आपले व्हॉइसमेल संदेश व्यवस्थापित करू शकते आणि त्यांचा बॅक अप घेऊ शकते. ""या वैशिष्ट्याची सध्या चाचणी घेतली जात आहे ""आणि आपल्या व्हॉइसमेल सर्व्हर मधून संभाव्यपणे व्हॉइसमेल हटवेल आणि आम्ही भविष्यात या वैशिष्ट्यास समर्थन देण्याचे वचन देत नाही. तरीही आम्ही आपला अभिप्राय घेऊ इच्छितो."
- "[प्रायोगिक] अतिरिक्त संचय आणि बॅक अप चालू करा"
- "आपला मेलबॉक्स जवळजवळ पूर्ण भरला आहे. स्थान मोकळे करण्यासाठी, अतिरिक्त संचय चालू करा त्यामुळे Google आपले व्हॉइसमेल संदेश व्यवस्थापित करू शकते आणि त्यांचा बॅक अप घेऊ शकते. ""या वैशिष्ट्याची सध्या चाचणी घेतली जात आहे ""आणि आपल्या व्हॉइसमेल सर्व्हर मधून संभाव्यपणे व्हॉइसमेल हटवेल आणि आम्ही भविष्यात या वैशिष्ट्यास समर्थन देण्याचे वचन देत नाही. तरीही आम्ही आपला अभिप्राय घेऊ इच्छितो."
+ "अतिरिक्त संचय आणि बॅक अप चालू करा"
+ "आपला मेलबॉक्स पूर्ण भरला आहे. स्थान मोकळे करण्यासाठी, अतिरिक्त संचय चालू करा त्यामुळे Google आपले व्हॉइसमेल संदेश व्यवस्थापित करू शकते आणि त्यांचा बॅक अप घेऊ शकते."
+ "अतिरिक्त संचय आणि बॅक अप चालू करा"
+ "आपला मेलबॉक्स जवळजवळ पूर्ण भरला आहे. स्थान मोकळे करण्यासाठी, अतिरिक्त संचय चालू करा त्यामुळे Google आपले व्हॉइसमेल संदेश व्यवस्थापित करू शकते आणि त्यांचा बॅक अप घेऊ शकते."
"आपला व्हॉइसमेल पिन सेट करा"
"आपल्या व्हॉइसमेलमध्ये प्रवेश करण्यासाठी आपण कधीही कॉल करता तेव्हा आपल्याला व्हॉइसमेल पिन आवश्यक असेल."
"अज्ञात त्रुटी"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-ms/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-ms/strings.xml
index e011de1a7..c8b70d55c 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-ms/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-ms/strings.xml
@@ -44,10 +44,10 @@
"Anda tidak akan dapat menerima mel suara baharu jika peti masuk anda penuh."
"Tidak dapat menerima mel suara baharu"
"Peti masuk anda penuh. Cuba padamkan beberapa mesej untuk menerima mel suara baharu."
- "[Percubaan] Hidupkan storan tambahan dan sandaran"
- "Peti mel anda penuh. Untuk mengosongkan ruang, hidupkan storan tambahan supaya Google boleh mengurus dan menyandarkan mesej mel suara anda. ""Ciri ini sedang diuji"" dan berupaya memadamkan mel suara daripada pelayan mel suara anda. Kami tidak menjamin bahawa ciri ini akan disokong pada masa hadapan. Namun begitu, kami berharap untuk menerima maklum balas anda tentang ciri ini."
- "[Percubaan] Hidupkan storan tambahan dan sandaran"
- "Peti mel anda hampir penuh. Untuk mengosongkan ruang, hidupkan storan tambahan supaya Google boleh mengurus dan menyandarkan mesej mel suara anda. ""Ciri ini sedang diuji"" dan berupaya memadamkan mel suara daripada pelayan mel suara anda. Kami tidak menjamin bahawa ciri ini akan disokong pada masa hadapan. Namun begitu, kami berharap untuk menerima maklum balas anda tentang ciri ini."
+ "Hidupkan storan tambahan dan sandaran"
+ "Peti mel anda penuh. Untuk mengosongkan ruang, hidupkan storan tambahan supaya Google boleh mengurus dan menyandarkan mesej mel suara anda."
+ "Hidupkan storan tambahan dan sandaran"
+ "Peti mel anda hampir penuh. Untuk mengosongkan ruang, hidupkan storan tambahan supaya Google boleh mengurus dan menyandarkan mesej mel suara anda."
"Tetapkan PIN mel suara anda"
"Anda memerlukan PIN mel suara setiap kali anda memanggil untuk mengakses mel suara anda."
"Ralat tidak diketahui"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-my/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-my/strings.xml
index d755850d2..686d37d10 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-my/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-my/strings.xml
@@ -44,10 +44,10 @@
"သင့်ဝင်စာပြည့်နေပါက အသံမေးလ်အသစ်များ လက်ခံရယူနိုင်မည်မဟုတ်ပါ။"
"အသံမေးလ်အသစ် လက်ခံ၍မရပါ"
"သင့်ဝင်စာပြည့်နေပါသည်။ အသံမေးလ်အသစ်များ လက်ခံရယူနိုင်ရန် မက်ဆေ့ဂျ်အချို့ဖျက်ကြည့်ပါ။"
- "[စမ်းသပ်ဆဲ] အပိုဆောင်း သိုလှောင်မှုနှင့် မိတ္တူတို့ကို ဖွင့်ပါ"
- "သင့်ဝင်စာ ပြည့်နေပါပြီ။ နေရာလွတ်ရရှိရန်အတွက် အပိုသိုလှောင်မှုကို ဖွင့်လျှင် Google က သင်၏အသံမေးလ်မက်ဆေ့ဂျ်များကို စီမံခန့်ခွဲပြီး မိတ္တူကူးနိုင်ပါမည်။ ""ဤဝန်ဆောင်မှုကို လတ်တလောတွင် စမ်းသပ်နေ ""ပါသည်၊ ဤဝန်ဆောင်မှုသည် သင်၏အသံမေးလ်ဆာဗာမှ အသံမေးလ်များကို ဖျက်ပစ်နိုင်ပြီး အနာဂတ်တွင် ၎င်းကို ဆက်လက်ရရှိနိုင်မည်ဟု အာမခံပေးမထားပါ။ သို့သော် သင့်အကြံပြုချက်များကို ရရှိလိုပါသည်။"
- "[စမ်းသပ်ဆဲ] အပိုဆောင်း သိုလှောင်မှုနှင့် မိတ္တူတို့ကို ဖွင့်ပါ"
- "သင့်ဝင်စာ ပြည့်နေပါပြီ။ နေရာလွတ်ရရှိရန်အတွက် အပိုသိုလှောင်မှုကို ဖွင့်လျှင် Google က သင်၏အသံမေးလ်မက်ဆေ့ဂျ်များကို စီမံခန့်ခွဲပြီး မိတ္တူကူးနိုင်ပါမည်။ ""ဤဝန်ဆောင်မှုကို လတ်တလောတွင် စမ်းသပ်နေ ""ပါသည်၊ ဤဝန်ဆောင်မှုသည် သင်၏အသံမေးလ်ဆာဗာမှ အသံမေးလ်များကို ဖျက်ပစ်နိုင်ပြီး အနာဂတ်တွင် ၎င်းကို ဆက်လက်ရရှိနိုင်မည်ဟု အာမခံပေးမထားပါ။ သို့သော် သင့်အကြံပြုချက်များကို ရရှိလိုပါသည်။"
+ "အပိုသိုလှောင်မှုနှင့် မိတ္တူ ဖွင့်ရန်"
+ "သင့်ဝင်စာ ပြည့်နေပါပြီ။ နေရာလွတ်ရရှိရန်အတွက် Google က သင်၏အသံမေးလ်မက်ဆေ့ဂျ်များကို စီမံခန့်ခွဲပြီး မိတ္တူကူးနိုင်ရန် အပိုသိုလှောင်မှုကို ဖွင့်ပါ။"
+ "အပိုသိုလှောင်မှုနှင့် မိတ္တူ ဖွင့်ရန်"
+ "သင့်ဝင်စာ ပြည့်လုပါပြီ။ နေရာလွတ်ရရှိရန်အတွက် Google က သင်၏အသံမေးလ်မက်ဆေ့ဂျ်များကို စီမံခန့်ခွဲပြီး မိတ္တူကူးနိုင်ရန် အပိုသိုလှောင်မှုကို ဖွင့်ပါ။"
"သင်၏အသံမေးလ်ပင်နံပါတ် သတ်မှတ်ပါ"
"သင်၏အသံမေးလ်ကို သုံးစွဲရန်အတွက် သင်ခေါ်ဆိုသည့်အခါတိုင်း အသံမေးလ်ပင်နံပါတ်တစ်ခု လိုအပ်ပါမည်။"
"အမျိုးအမည်မသိမှားယွင်းမှု"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-nb/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-nb/strings.xml
index 9dff46dce..6fc75614a 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-nb/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-nb/strings.xml
@@ -44,10 +44,10 @@
"Du kan ikke motta ny talepost hvis innboksen din er full."
"Kan ikke motta ny talepost"
"Innboksen din er full. Prøv å slette noen meldinger for å motta ny talepost."
- "Slå på ekstra lagring og sikkerhetskopi"
- "Postkassen din er full. For å frigjøre plass, kan du slå på ekstra lagring sånn at Google kan administrere og sikkerhetskopiere talepostmeldingene dine. ""Denne funksjonen er fortsatt under utforskning "", og det kan føre til at noen av talepostmelingene dine slettes. Vi kan dessverre ikke love at denne funksjonen støttes i fremtiden, men vi vil gjerne høre om hva du mener om den."
- "Slå på ekstra lagring og sikkerhetskopi"
- "Postkassen din er nesten full. For å frigjøre plass, kan du slå på ekstra lagring sånn at Google kan administrere og sikkerhetskopiere talepostmeldingene dine. ""Denne funksjonen er fortsatt under utforskning "", og det kan føre til at noen av talepostmelingene dine slettes. Vi kan dessverre ikke love at denne funksjonen støttes i fremtiden, men vi vil gjerne høre om hva du mener om den."
+ "Slå på ekstra lagringsplass og sikkerhetskopiering"
+ "Talepostkassen din er full. Frigjør plass ved å slå på ekstra lagringsplass og la Google administrere og ta sikkerhetskopi av taleposten din."
+ "Slå på ekstra lagringsplass og sikkerhetskopiering"
+ "Talepostkassen din er nesten full. Frigjør plass ved å slå på ekstra lagringsplass og la Google administrere og ta sikkerhetskopi av taleposten din."
"Angi PIN-koden din for talepost"
"Du trenger PIN-koden hver gang du ringer for å sjekke taleposten din."
"Ukjent feil"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-ne/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-ne/strings.xml
index 1f7f77102..ff06fa06c 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-ne/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-ne/strings.xml
@@ -44,10 +44,10 @@
"तपाईंको इनबक्स भरिएको छ भने तपाईंले नयाँ भ्वाइस मेल प्राप्त गर्न सक्नुहुने छैन।"
"नयाँ भ्वाइस मेलहरू प्राप्त गर्न सकिँदैन"
"तपाईँको इनबक्स भरिएको छ। नयाँ भ्वाइस मेलहरू प्राप्त गर्न कृपया केही सन्देशहरू मेटी हेर्नुहोस्।"
- "[प्रयोगात्मक] अतिरिक्त भण्डारण र ब्याकअप सेवा सक्रिय पार्नुहोस्"
- "तपाईंको मेल बक्स झन्डै झन्डै भरिएको छ। Google ले तपाईंका भ्वाइस मेल सम्बन्धी सन्देशहरूको व्यवस्थापन गर्न र ब्याकअप गर्नका लागि स्थान खाली गर्न अतिरिक्त भण्डारणलाई सक्रिय पार्नुहोस् । ""हाल यो विशेषताको परीक्षण गरिँदै छ "" र सम्भवत: तपाईंको भ्वाइस मेल सर्भरबाट भ्वाइस मेलहरू मेट्ने छ, र हामी यो विशेषतालाई भविष्यमा पनि समर्थन गरिने कुराको वाचा गर्दैनौं। तथापि तपाईंको प्रतिक्रियाको अपेक्षा गर्दछौं।"
- "[प्रयोगात्मक] अतिरिक्त भण्डारण र ब्याकअप सेवा सक्रिय पार्नुहोस्"
- "तपाईंको मेल बक्स झन्डै झन्डै भरिएको छ। Google ले तपाईंका भ्वाइस मेल सन्देशहरूखो व्यवस्थापन गर्न र ब्याकअप गर्न सकोस् भन्नका खातिर स्थान खाली गर्न अतिरिक्त भण्डारणलाई सक्रिय पार्नुहोस् । ""हाल यो विशेषताको परीक्षण गरिँदै छ "" र यसले सम्भवत: तपाईंको भ्वाइस मेल सर्भरका भ्वाइस मेलहरू मेट्ने छ, र हामी यो विशेषतालाई भविष्यमा पनि समर्थन गरिने कुराको वाचा गर्दैनौं। तथापि तपाईंको प्रतिक्रियाको अपेक्षा गर्दछौं।"
+ "अतिरिक्त भण्डारण र ब्याकअप सेवा सक्रिय पार्नुहोस्"
+ "तपाईंको मेल बक्स भरिएको छ। ठाउँ खाली गर्न, Google ले तपाईंका भ्वाइस मेल सन्देशहरूको व्यवस्थापन र ब्याकअप गर्न सकोस् भन्नाका खातिर अतिरिक्त भण्डारणलाई सक्रिय पार्नुहोस्।"
+ "अतिरिक्त भण्डारण र ब्याकअप सेवा सक्रिय पार्नुहोस्"
+ "तपाईंको मेल बक्स लगभग भरिएको छ। ठाउँ खाली गर्न Google ले तपाईंका भ्वाइस मेल सन्देशहरूको व्यवस्थापन र ब्याकअप गर्न सकोस् भन्नाका खातिर अतिरिक्त भण्डारणलाई सक्रिय पार्नुहोस्।"
"आफ्नो भ्वाइस मेलको PIN सेट गर्नुहोस्"
"तपाईँलाई जुनसुकै समयमा आफ्नो भ्वाइस मेलमा पहुँच गर्न कल गर्दा भ्वाइस मेल PIN को आवश्यकता पर्दछ।"
"अज्ञात त्रुटि"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-nl/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-nl/strings.xml
index 4a31fd3a3..f74a37d8d 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-nl/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-nl/strings.xml
@@ -44,10 +44,10 @@
"Je kunt geen nieuwe voicemails ontvangen als je inbox vol is."
"Kan geen nieuwe voicemails ontvangen"
"Je inbox is vol. Verwijder enkele berichten om nieuwe voicemails te ontvangen."
- "[Experimenteel] Extra opslag en back-up inschakelen"
- "Je mailbox is vol. Schakel extra opslag in om ruimte vrij te maken, zodat Google je voicemailberichten kan beheren en back-ups kan maken. ""Deze functie wordt momenteel getest ""en het is mogelijk dat hierdoor voicemails van de voicemailserver worden verwijderd. We kunnen niet beloven dat we deze functie in de toekomst blijven ondersteunen. We zijn wel heel benieuwd naar jullie feedback over de functie."
- "[Experimenteel] Extra opslag en back-up inschakelen"
- "Je mailbox is bijna vol. Schakel extra opslag in om ruimte vrij te maken, zodat Google je voicemailberichten kan beheren en back-ups kan maken. ""Deze functie wordt momenteel getest ""en het is mogelijk dat hierdoor voicemails van de voicemailserver worden verwijderd. We kunnen niet beloven dat we deze functie in de toekomst blijven ondersteunen. We zijn wel heel benieuwd naar jullie feedback over de functie."
+ "Extra opslag en back-up inschakelen"
+ "Je mailbox is vol. Als je ruimte wilt vrijmaken, schakel je extra opslagruimte in zodat Google je voicemailberichten kan beheren en er back-ups van kan maken."
+ "Extra opslag en back-up inschakelen"
+ "Je mailbox is bijna vol. Als je ruimte wilt vrijmaken, schakel je extra opslagruimte in zodat Google je voicemailberichten kan beheren en er back-ups van kan maken."
"Een pincode voor je voicemail instellen"
"Je hebt een pincode voor de voicemail nodig wanneer je belt om toegang tot je voicemail te krijgen."
"Onbekende fout"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-no/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-no/strings.xml
index 9dff46dce..6fc75614a 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-no/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-no/strings.xml
@@ -44,10 +44,10 @@
"Du kan ikke motta ny talepost hvis innboksen din er full."
"Kan ikke motta ny talepost"
"Innboksen din er full. Prøv å slette noen meldinger for å motta ny talepost."
- "Slå på ekstra lagring og sikkerhetskopi"
- "Postkassen din er full. For å frigjøre plass, kan du slå på ekstra lagring sånn at Google kan administrere og sikkerhetskopiere talepostmeldingene dine. ""Denne funksjonen er fortsatt under utforskning "", og det kan føre til at noen av talepostmelingene dine slettes. Vi kan dessverre ikke love at denne funksjonen støttes i fremtiden, men vi vil gjerne høre om hva du mener om den."
- "Slå på ekstra lagring og sikkerhetskopi"
- "Postkassen din er nesten full. For å frigjøre plass, kan du slå på ekstra lagring sånn at Google kan administrere og sikkerhetskopiere talepostmeldingene dine. ""Denne funksjonen er fortsatt under utforskning "", og det kan føre til at noen av talepostmelingene dine slettes. Vi kan dessverre ikke love at denne funksjonen støttes i fremtiden, men vi vil gjerne høre om hva du mener om den."
+ "Slå på ekstra lagringsplass og sikkerhetskopiering"
+ "Talepostkassen din er full. Frigjør plass ved å slå på ekstra lagringsplass og la Google administrere og ta sikkerhetskopi av taleposten din."
+ "Slå på ekstra lagringsplass og sikkerhetskopiering"
+ "Talepostkassen din er nesten full. Frigjør plass ved å slå på ekstra lagringsplass og la Google administrere og ta sikkerhetskopi av taleposten din."
"Angi PIN-koden din for talepost"
"Du trenger PIN-koden hver gang du ringer for å sjekke taleposten din."
"Ukjent feil"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-pa/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-pa/strings.xml
index 3437271cb..2a07b459d 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-pa/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-pa/strings.xml
@@ -44,10 +44,10 @@
"ਜੇਕਰ ਤੁਹਾਡਾ ਇਨਬਾਕਸ ਭਰਿਆ ਹੋਇਆ ਹੈ ਤਾਂ ਤੁਸੀਂ ਨਵੀਂ ਵੌਇਸਮੇਲ ਪ੍ਰਾਪਤ ਨਹੀਂ ਕਰ ਸਕੋਂਗੇ।"
"ਨਵੀਆਂ ਵੌਇਸਮੇਲਾਂ ਨੂੰ ਪ੍ਰਾਪਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"
"ਤੁਹਾਡਾ ਇਨਬਾਕਸ ਭਰਿਆ ਹੋਇਆ ਹੈ। ਨਵੀਂ ਵੌਇਸਮੇਲ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਕੁਝ ਸੁਨੇਹਿਆਂ ਨੂੰ ਮਿਟਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"
- "[ਪ੍ਰਯੋਗਿਕ] ਵਾਧੂ ਸਟੋਰੇਜ ਨੂੰ ਚਾਲੂ ਕਰੋ ਅਤੇ ਬੈਕਅੱਪ ਲਓ"
- "ਤੁਹਾਡਾ ਮੇਲਬਾਕਸ ਭਰਿਆ ਹੋਇਆ ਹੈ। ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਨ ਲਈ, ਵਾਧੂ ਸਟੋਰੇਜ ਨੂੰ ਚਾਲੂ ਕਰੋ ਤਾਂ ਕਿ Google ਤੁਹਾਡੇ ਵੌਇਸਮੇਲ ਸੁਨੇਹਿਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕੇ ਅਤੇ ਬੈਕਅੱਪ ਲੈ ਸਕੇ। ""ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਇਸ ਵੇਲੇ ਜਾਂਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ ""ਅਤੇ ਇਹ ਸੰਭਾਵੀ ਤੌਰ \'ਤੇ ਤੁਹਾਡੇ ਵੌਇਸਮੇਲ ਸਰਵਰ ਤੋਂ ਵੌਇਸਮੇਲਾਂ ਨੂੰ ਮਿਟਾ ਦੇਵੇਗੀ, ਅਤੇ ਅਸੀਂ ਭਵਿੱਖ ਵਿੱਚ ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦਾ ਸਮਰਥਨ ਕਰਨ ਦਾ ਵਾਅਦਾ ਨਹੀਂ ਕਰਦੇ ਹਾਂ। ਅਸੀਂ ਹਾਲਾਂਕਿ ਤੁਹਾਡੇ ਪ੍ਰਤੀਕਰਮ ਨੂੰ ਪਸੰਦ ਕਰਾਂਗੇ।"
- "[ਪ੍ਰਯੋਗਿਕ] ਵਾਧੂ ਸਟੋਰੇਜ ਨੂੰ ਚਾਲੂ ਕਰੋ ਅਤੇ ਬੈਕਅੱਪ ਲਓ"
- "ਤੁਹਾਡਾ ਮੇਲਬਾਕਸ ਲਗਭਗ ਭਰਿਆ ਹੋਇਆ ਹੈ। ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਨ ਲਈ, ਵਾਧੂ ਸਟੋਰੇਜ ਨੂੰ ਚਾਲੂ ਕਰੋ ਤਾਂ ਕਿ Google ਤੁਹਾਡੇ ਵੌਇਸਮੇਲ ਸੁਨੇਹਿਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕੇ ਅਤੇ ਬੈਕਅੱਪ ਲੈ ਸਕੇ। ""ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਇਸ ਵੇਲੇ ਜਾਂਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ ""ਅਤੇ ਇਹ ਸੰਭਾਵੀ ਤੌਰ \'ਤੇ ਤੁਹਾਡੇ ਵੌਇਸਮੇਲ ਸਰਵਰ ਤੋਂ ਵੌਇਸਮੇਲਾਂ ਨੂੰ ਮਿਟਾ ਦੇਵੇਗੀ, ਅਤੇ ਅਸੀਂ ਭਵਿੱਖ ਵਿੱਚ ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦਾ ਸਮਰਥਨ ਕਰਨ ਦਾ ਵਾਅਦਾ ਨਹੀਂ ਕਰਦੇ ਹਾਂ। ਅਸੀਂ ਹਾਲਾਂਕਿ ਤੁਹਾਡੇ ਪ੍ਰਤੀਕਰਮ ਨੂੰ ਪਸੰਦ ਕਰਾਂਗੇ।"
+ "ਵਾਧੂ ਸਟੋਰੇਜ ਨੂੰ ਚਾਲੂ ਕਰੋ ਅਤੇ ਬੈਕਅੱਪ ਲਓ"
+ "ਤੁਹਾਡਾ ਮੇਲਬਾਕਸ ਭਰਿਆ ਹੋਇਆ ਹੈ। ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਨ ਲਈ, ਵਾਧੂ ਸਟੋਰੇਜ ਨੂੰ ਚਾਲੂ ਕਰੋ ਤਾਂ ਕਿ Google ਤੁਹਾਡੇ ਵੌਇਸਮੇਲ ਸੁਨੇਹਿਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕੇ ਅਤੇ ਬੈਕਅੱਪ ਲੈ ਸਕੇ।"
+ "ਵਾਧੂ ਸਟੋਰੇਜ ਨੂੰ ਚਾਲੂ ਕਰੋ ਅਤੇ ਬੈਕਅੱਪ ਲਓ"
+ "ਤੁਹਾਡਾ ਮੇਲਬਾਕਸ ਲਗਭਗ ਭਰਿਆ ਹੋਇਆ ਹੈ। ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਨ ਲਈ, ਵਾਧੂ ਸਟੋਰੇਜ ਨੂੰ ਚਾਲੂ ਕਰੋ ਤਾਂ ਕਿ Google ਤੁਹਾਡੇ ਵੌਇਸਮੇਲ ਸੁਨੇਹਿਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕੇ ਅਤੇ ਬੈਕਅੱਪ ਲੈ ਸਕੇ।"
"ਆਪਣਾ ਵੌਇਸਮੇਲ PIN ਸੈੱਟ ਕਰੋ"
"ਜਦੋਂ ਵੀ ਤੁਸੀਂ ਆਪਣੀ ਵੌਇਸਮੇਲ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਲਈ ਕਾਲ ਕਰੋਂਗੇ ਤਾਂ ਤੁਹਾਨੂੰ ਇੱਕ ਵੌਇਸਮੇਲ PIN ਦੀ ਲੋੜ ਪਵੇਗੀ।"
"ਅਗਿਆਤ ਗੜਬੜ"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-pl/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-pl/strings.xml
index 1b88481ba..b12290821 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-pl/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-pl/strings.xml
@@ -44,10 +44,10 @@
"Nie otrzymasz nowych wiadomości głosowych, gdy Twoja skrzynka odbiorcza jest pełna."
"Nie udało się odebrać nowych wiadomości głosowych"
"Twoja skrzynka odbiorcza jest pełna. Spróbuj usunąć kilka wiadomości głosowych, aby odebrać nowe."
- "(Funkcja eksperymentalna) Włącz dodatkowe miejsce i kopię zapasową"
- "Twoja skrzynka pocztowa jest pełna. Jeśli chcesz zwolnić miejsce, włącz dodatkowe miejsce, aby umożliwić Google zarządzanie Twoimi wiadomościami głosowymi i tworzenie ich kopii zapasowej. ""Ta funkcja jest obecnie w fazie testów"" i może usunąć wiadomości głosowe z Twojego serwera poczty głosowej. Nie gwarantujemy, że ta funkcja będzie w przyszłości obsługiwana. Chętnie jednak dowiemy się, co o niej sądzisz."
- "(Funkcja eksperymentalna) Włącz dodatkowe miejsce i kopię zapasową"
- "Twoja skrzynka pocztowa jest prawie pełna. Jeśli chcesz zwolnić miejsce, włącz dodatkowe miejsce, aby umożliwić Google zarządzanie Twoimi wiadomościami głosowymi i tworzenie ich kopii zapasowej. ""Ta funkcja jest obecnie w fazie testów"" i może usunąć wiadomości głosowe z Twojego serwera poczty głosowej. Nie gwarantujemy, że ta funkcja będzie w przyszłości obsługiwana. Chętnie jednak dowiemy się, co o niej sądzisz."
+ "Włącz dodatkowe miejsce i kopię zapasową"
+ "Twoja skrzynka pocztowa jest pełna. Jeśli chcesz zwolnić miejsce, włącz dodatkowe miejsce, aby umożliwić Google zarządzanie Twoimi wiadomościami głosowymi i tworzenie ich kopii zapasowej."
+ "Włącz dodatkowe miejsce i kopię zapasową"
+ "Twoja skrzynka pocztowa jest prawie pełna. Jeśli chcesz zwolnić miejsce, włącz dodatkowe miejsce, aby umożliwić Google zarządzanie Twoimi wiadomościami głosowymi i tworzenie ich kopii zapasowej."
"Ustaw kod PIN do poczty głosowej"
"Za każdym razem, gdy zadzwonisz pod numer poczty głosowej, będzie konieczne wpisanie kodu PIN."
"Nieznany błąd"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-pt-rBR/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-pt-rBR/strings.xml
index e286a4d44..bbe9340a6 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-pt-rBR/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-pt-rBR/strings.xml
@@ -44,10 +44,10 @@
"Não será possível receber novos correios de voz se sua Caixa de entrada estiver cheia."
"Não é possível receber novos correios de voz"
"Sua Caixa de entrada está cheia. Exclua algumas mensagens para receber novos correios de voz."
- "[Experimental] Ativar armazenamento extra e fazer backup"
- "Sua caixa de correio está cheia. Para liberar espaço, ative o armazenamento extra para que o Google possa gerenciar e fazer o backup das suas mensagens do correio de voz. ""Este recurso está sendo testado no momento ""e talvez exclua os correios de voz do seu servidor de correio de voz. Não há garantias de suporte no futuro, mas gostaríamos de receber seu feedback."
- "[Experimental] Ativar armazenamento extra e fazer backup"
- "Sua caixa de correio está cheia. Para liberar espaço, ative o armazenamento extra para que o Google possa gerenciar e fazer o backup das suas mensagens do correio de voz. ""Este recurso está sendo testado no momento ""e talvez exclua os correios de voz do seu servidor de correio de voz. Não há garantias de suporte no futuro, mas gostaríamos de receber seu feedback."
+ "Ativar armazenamento extra e fazer backup"
+ "Sua caixa de correio está cheia. Para liberar espaço, ative o armazenamento extra para que o Google possa gerenciar e fazer o backup das suas mensagens do correio de voz."
+ "Ativar armazenamento extra e fazer backup"
+ "Sua caixa de correio está quase cheia. Para liberar espaço, ative o armazenamento extra para que o Google possa gerenciar e fazer o backup das suas mensagens do correio de voz."
"Definir seu PIN do correio de voz"
"Você precisará de um PIN do correio de voz sempre que ligar para acessar seu correio de voz."
"Erro desconhecido"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-pt-rPT/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-pt-rPT/strings.xml
index ad7ee7599..364b2783d 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-pt-rPT/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-pt-rPT/strings.xml
@@ -44,10 +44,10 @@
"Se a sua caixa de entrada estiver cheia, não irá receber novas mensagens de correio de voz."
"Não é possível receber novas mensagens de correio de voz"
"A sua caixa de entrada está cheia. Tente eliminar algumas mensagens para receber novas mensagens de correio de voz."
- "[Experimental] Ativar a cópia de segurança e o armazenamento adicional"
- "A sua caixa de correio está cheia. Para libertar espaço, ative o armazenamento adicional para que a Google possa gerir e criar uma cópia de segurança das suas mensagens de correio de voz. ""Esta funcionalidade está a ser testada ""e poderá eliminar mensagens de correio de voz do seu servidor de correio de voz. Não podemos garantir compatibilidade com esta funcionalidade no futuro. No entanto, gostaríamos de receber os seus comentários."
- "[Experimental] Ativar a cópia de segurança e o armazenamento adicional"
- "A sua caixa de correio está quase cheia. Para libertar espaço, ative o armazenamento adicional para que a Google possa gerir e criar uma cópia de segurança das suas mensagens de correio de voz. ""Esta funcionalidade está a ser testada ""e poderá eliminar mensagens de correio de voz do seu servidor de correio de voz. Não podemos garantir compatibilidade com esta funcionalidade no futuro. No entanto, gostaríamos de receber os seus comentários."
+ "Ativar o armazenamento adicional e a cópia de segurança"
+ "A sua caixa de correio está cheia. Para libertar espaço, ative o armazenamento adicional para que a Google possa gerir e criar uma cópia de segurança das suas mensagens de correio de voz."
+ "Ativar o armazenamento adicional e a cópia de segurança"
+ "A sua caixa de correio está quase cheia. Para libertar espaço, ative o armazenamento adicional para que a Google possa gerir e criar uma cópia de segurança das suas mensagens de correio de voz."
"Definir o seu PIN do correio de voz"
"Irá precisar de um PIN do correio de voz sempre que efetuar uma chamada para aceder ao seu correio de voz."
"Erro desconhecido"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-pt/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-pt/strings.xml
index e286a4d44..bbe9340a6 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-pt/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-pt/strings.xml
@@ -44,10 +44,10 @@
"Não será possível receber novos correios de voz se sua Caixa de entrada estiver cheia."
"Não é possível receber novos correios de voz"
"Sua Caixa de entrada está cheia. Exclua algumas mensagens para receber novos correios de voz."
- "[Experimental] Ativar armazenamento extra e fazer backup"
- "Sua caixa de correio está cheia. Para liberar espaço, ative o armazenamento extra para que o Google possa gerenciar e fazer o backup das suas mensagens do correio de voz. ""Este recurso está sendo testado no momento ""e talvez exclua os correios de voz do seu servidor de correio de voz. Não há garantias de suporte no futuro, mas gostaríamos de receber seu feedback."
- "[Experimental] Ativar armazenamento extra e fazer backup"
- "Sua caixa de correio está cheia. Para liberar espaço, ative o armazenamento extra para que o Google possa gerenciar e fazer o backup das suas mensagens do correio de voz. ""Este recurso está sendo testado no momento ""e talvez exclua os correios de voz do seu servidor de correio de voz. Não há garantias de suporte no futuro, mas gostaríamos de receber seu feedback."
+ "Ativar armazenamento extra e fazer backup"
+ "Sua caixa de correio está cheia. Para liberar espaço, ative o armazenamento extra para que o Google possa gerenciar e fazer o backup das suas mensagens do correio de voz."
+ "Ativar armazenamento extra e fazer backup"
+ "Sua caixa de correio está quase cheia. Para liberar espaço, ative o armazenamento extra para que o Google possa gerenciar e fazer o backup das suas mensagens do correio de voz."
"Definir seu PIN do correio de voz"
"Você precisará de um PIN do correio de voz sempre que ligar para acessar seu correio de voz."
"Erro desconhecido"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-ro/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-ro/strings.xml
index f576cf6c6..263ab003d 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-ro/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-ro/strings.xml
@@ -44,10 +44,10 @@
"Nu veți putea primi mesaje vocale noi dacă aveți căsuța de mesaje plină."
"Nu puteți primi mesaje vocale noi"
"Căsuța de mesaje este plină. Încercați să ștergeți câteva mesaje pentru a putea primi unele noi."
- "[Experimental] Activați spațiul de stocare suplimentar și backupul."
- "Căsuța dvs. de mesaje este plină. Pentru a elibera spațiu, activați spațiul de stocare suplimentar pentru ca Google să poată gestiona și face backup pentru mesajele dvs. vocale. ""Această funcție este în curs de testare ""și e posibil să șteargă mesajele vocale de pe serverul de mesagerie vocală. Nu se poate garanta acceptarea acestei funcții pe viitor, însă feedbackul dvs. e bine-venit."
- "[Experimental] Activați spațiul de stocare suplimentar și backupul."
- "Căsuța dvs. de mesaje este aproape plină. Pentru a elibera spațiu, activați spațiul de stocare suplimentar pentru ca Google să poată gestiona și face backup pentru mesajele dvs. vocale. ""Această funcție este în curs de testare ""și e posibil să șteargă mesajele vocale de pe serverul de mesagerie vocală. Nu se poate garanta acceptarea acestei funcții pe viitor, însă feedbackul dvs. e bine-venit."
+ "Activați spațiul de stocare suplimentar și backupul"
+ "Căsuța dvs. de e-mail este plină. Pentru a elibera spațiu, activați spațiul de stocare suplimentar și astfel Google poate să vă gestioneze mesajele vocale și să facă backup pentru acestea."
+ "Activați spațiul de stocare suplimentar și backupul"
+ "Căsuța dvs. de e-mail este aproape plină. Pentru a elibera spațiu, activați spațiul de stocare suplimentar și astfel Google poate să vă gestioneze mesajele vocale și să facă backup pentru acestea."
"Setați un cod PIN pentru mesageria vocală"
"Aveți nevoie de un cod PIN pentru mesageria vocală când sunați pentru a o accesa."
"Eroare necunoscută"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-ru/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-ru/strings.xml
index f0a1048e6..1989f269c 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-ru/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-ru/strings.xml
@@ -44,10 +44,10 @@
"Когда почтовый ящик будет заполнен, вы не сможете получать новые голосовые сообщения."
"Нет свободного места"
"Почтовый ящик заполнен. Чтобы получать новые голосовые сообщения, удалите старые."
- "[Экспериментальная функция] Активируйте дополнительное пространство для хранения и резервного копирования"
- "Почтовый ящик заполнен. Чтобы освободить место, активируйте дополнительное пространство. После этого Google сможет управлять вашими голосовыми сообщениями и сохранять их резервные копии. ""Эта функция сейчас проходит тестирование."" Возможно, ваши голосовые сообщения будут удалены с вашего сервера. Поддержка этой функции в дальнейшем не гарантируется. Мы бы хотели узнать ваше мнение о ней."
- "[Экспериментальная функция] Активируйте дополнительное пространство для хранения и резервного копирования"
- "Почтовый ящик почти заполнен. Чтобы освободить место, активируйте дополнительное пространство. После этого Google сможет управлять вашими голосовыми сообщениями и сохранять их резервные копии. ""Эта функция сейчас проходит тестирование."" Возможно, ваши голосовые сообщения будут удалены с вашего сервера. Поддержка этой функции в дальнейшем не гарантируется. Мы бы хотели узнать ваше мнение о ней."
+ "Требуется дополнительное пространство"
+ "Почтовый ящик заполнен. Чтобы освободить место, активируйте дополнительное пространство. После этого Google сможет управлять вашими голосовыми сообщениями и сохранять их резервные копии."
+ "Требуется дополнительное пространство"
+ "Почтовый ящик почти заполнен. Чтобы освободить место, активируйте дополнительное пространство. После этого Google сможет управлять вашими голосовыми сообщениями и сохранять их резервные копии."
"Установите PIN-код голосовой почты"
"Он будет нужен вам каждый раз, когда вы звоните, чтобы прослушать голосовую почту."
"Неизвестная ошибка"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-si/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-si/strings.xml
index f0c58b129..2a057facd 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-si/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-si/strings.xml
@@ -44,10 +44,10 @@
"ඔබේ එන ලිපි පිරී ඇති නම් ඔබට නව හඩ තැපැල් ලැබීමට නොහැකි වනු ඇත."
"නව හඬ තැපැල් ලැබීමට නොහැකිය"
"ඔබේ එන ලිපි පිරී ඇත. නව හඬ තැපැල් ලබා ගැනීමට පණිවිඩ සමහරක් මැකීම උත්සාහ කරන්න."
- "[Experimental] අතිරේක ගබඩාව සහ උපස්ථය ක්රියාත්මක කරන්න"
- "ඔබේ තැපැල් පෙට්ටිය පිරී ඇත. ඉඩ නිදහස් කර ගැනීමට, අතිරේක ගබඩාව ක්රියාත්මක කරන්න. එවිට Google හට ඔබේ හඬ තැපැල් පණිවිඩ කළමනාකරණය කිරීමට සහ උපස්ථ කිරීමට හැකිය. ""මෙම විශේෂාංගය දැන් පරීක්ෂා කරමින් සිටින අතර ""විභව්යව හඬ තැපැල් ඔබේ හඬ තැපැල් සේවාදායකයෙන් මකනු ඇති අතර, අපි අනාගතයේදී මෙම විශේෂාංගයට සහාය දැක්වීමට පොරොන්දු නොවෙමු. එසේ වුවත් අපි ඔබේ විශේෂාංගය ගැන ප්රතිපෝෂණවලට ආදරය කරන්නෙමු."
- "[Experimental] අතිරේක ගබඩාව සහ උපස්ථය ක්රියාත්මක කරන්න"
- "ඔබේ තැපැල් පෙට්ටිය මුළුමනින්ම පාහේ පිරී ඇත. ඉඩ නිදහස් කර ගැනීමට, අතිරේක ගබඩාව ක්රියාත්මක කරන්න. එවිට Google හට ඔබේ හඬ තැපැල් පණිවිඩ කළමනාකරණය කිරීමට සහ උපස්ථ කිරීමට හැකිය. ""මෙම විශේෂාංගය දැන් පරීක්ෂා කරමින් සිටින අතර""විභව්යව හඬ තැපැල් ඔබේ හඬ තැපැල් සේවාදායකයෙන් මකනු ඇති අතර, අපි අනාගතයේදී මෙම විශේෂාංගයට සහාය දැක්වීමට පොරොන්දු නොවෙමු. එසේ වුවත් අපි ඔබේ විශේෂාංගය ගැන ප්රතිපෝෂණවලට ආදරය කරන්නෙමු."
+ "අතිරේක ගබඩාව සහ උපස්ථය ක්රියාත්මක කරන්න"
+ "ඔබේ තැපැල් පෙට්ටිය පිරී ඇත. ඉඩ නිදහස් කර ගැනීමට, අතිරේක ගබඩාව ක්රියාත්මක කරන්න. එවිට Google හට ඔබේ හඬ තැපැල් පණිවිඩ කළමනාකරණය කිරීමට සහ උපස්ථ කිරීමට හැකිය."
+ "අතිරේක ගබඩාව සහ උපස්ථය ක්රියාත්මක කරන්න"
+ "ඔබේ තැපැල් පෙට්ටිය මුළුමනින්ම පාහේ පිරී ඇත. ඉඩ නිදහස් කර ගැනීමට, අතිරේක ගබඩාව ක්රියාත්මක කරන්න. එවිට Google හට ඔබේ හඬ තැපැල් පණිවිඩ කළමනාකරණය කිරීමට සහ උපස්ථ කිරීමට හැකිය."
"ඔබේ හඬ තැපැල් PIN අංකය සකසන්න"
"ඔබ ඔබේ හඬ තැපෑලට ප්රවේශ වීමට අමතන ඕනෑම අවස්ථාවක ඔබට හඬ තැපැල් PIN අංකයක් අවශ්ය වනු ඇත."
"නොදන්නා දෝෂයකි"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-sk/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-sk/strings.xml
index ecf0a21bf..165a9f58c 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-sk/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-sk/strings.xml
@@ -44,10 +44,10 @@
"S plnou doručenou poštou nebudete môcť prijímať nové hlasové správy."
"Nemôžete prijímať nové hlasové správy"
"Máte plnú doručenú poštu. Skúste odstrániť niekoľko správ, aby ste mohli prijať novú hlasovú správu."
- "[Experimentálna funkcia] Zapnite si ďalšie úložisko a zálohovanie"
- "Poštovú schránku máte plnú. Ak chcete uvoľniť miesto, zapnite ďalšie úložisko, aby mohol Google spravovať a zálohovať vaše hlasové správy. ""Túto funkciu práve testujeme ""a môže vám odstrániť hlasové správy zo servera hlasovej schránky. Nemôžeme zaručiť, že bude podporovaná aj v budúcnosti, no budeme vám vďační za poskytnutie spätnej väzby."
- "[Experimentálna funkcia] Zapnite si ďalšie úložisko a zálohovanie"
- "Poštovú schránku máte takmer plnú. Ak chcete uvoľniť miesto, zapnite ďalšie úložisko, aby mohol Google spravovať a zálohovať vaše hlasové správy. ""Túto funkciu práve testujeme ""a môže vám odstrániť hlasové správy zo servera hlasovej schránky. Nemôžeme zaručiť, že bude podporovaná aj v budúcnosti, no budeme vám vďační za poskytnutie spätnej väzby."
+ "Zapnite si ďalšie úložisko a zálohovanie"
+ "Poštovú schránku máte plnú. Ak chcete uvoľniť miesto, zapnite si ďalšie úložisko, aby mohol Google spravovať a zálohovať vaše hlasové správy."
+ "Zapnite si ďalšie úložisko a zálohovanie"
+ "Poštovú schránku máte takmer plnú. Ak chcete uvoľniť miesto, zapnite si ďalšie úložisko, aby mohol Google spravovať a zálohovať vaše hlasové správy."
"Nastaviť kód PIN hlasovej schránky"
"Kód PIN hlasovej schránky budete potrebovať vždy, keď zavoláte do svojej hlasovej schránky."
"Neznáma chyba"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-sl/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-sl/strings.xml
index c2ef327d8..d4f63c1e4 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-sl/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-sl/strings.xml
@@ -44,10 +44,10 @@
"Če je nabiralnik poln, ne boste mogli prejemati novih sporočil v odzivniku."
"Vizualnih sporočil v odzivniku ni mogoče prejemati"
"Nabiralnik je poln. Poskusite izbrisati nekaj sporočil, da bo mogoče prejeti nova sporočila v odzivniku."
- "[Poskusno] Vklop dodatne shrambe in varnostnega kopiranja"
- "Odzivnik je poln. Če želite sprostiti prostor, vklopite dodatno shrambo, da bo lahko Google upravljal vaša sporočila v odzivniku in jih varnostno kopiral. ""Za to funkcijo se trenutno izvajajo preskusi"", zato bodo sporočila v odzivniku morda izbrisana iz strežnika za sporočila v odzivniku, pri čemer ne obljubljamo, da bomo to funkcijo podpirali tudi v prihodnje. Kljub temu bomo veseli vaših povratnih informacij o funkciji."
- "[Poskusno] Vklop dodatne shrambe in varnostnega kopiranja"
- "Odzivnik je skoraj poln. Če želite sprostiti prostor, vklopite dodatno shrambo, da bo lahko Google upravljal vaša sporočila v odzivniku in jih varnostno kopiral. ""Za to funkcijo se trenutno izvajajo preskusi"", zato bodo sporočila v odzivniku morda izbrisana iz strežnika za sporočila v odzivniku, pri čemer ne obljubljamo, da bomo to funkcijo podpirali tudi v prihodnje. Kljub temu bomo veseli vaših povratnih informacij o funkciji."
+ "Vklop dodatnega prostora za shranjevanje in varnostno kopiranje"
+ "Odzivnik je poln. Če želite sprostiti prostor, vklopite dodaten prostor za shranjevanje, da bo Google lahko upravljal vaša sporočila v odzivniku in jih varnostno kopiral."
+ "Vklop dodatnega prostora za shranjevanje in varnostno kopiranje"
+ "Odzivnik je skoraj poln. Če želite sprostiti prostor, vklopite dodaten prostor za shranjevanje, da bo Google lahko upravljal vaša sporočila v odzivniku in jih varnostno kopiral."
"Nastavite kodo PIN za glasovno pošto"
"Kodo PIN za glasovno pošto boste potrebovali ob vsakem klicu za dostop do glasovne pošte."
"Neznana napaka"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-sq/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-sq/strings.xml
index 7beb4585b..d400cd8ef 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-sq/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-sq/strings.xml
@@ -44,10 +44,10 @@
"Nuk mund të marrësh postë zanore të re nëse kutia hyrëse është plot."
"Posta zanore nuk mund të merret"
"Kutia hyrëse është plot. Provo të fshish disa mesazhe për të marrë postë zanore të re."
- "[Eksperimentale] Aktivizo rezervimin dhe hapësirën ruajtëse shtesë"
- "Kutia jote postare është plot. Për të liruar hapësirën, aktivizo hapësirën ruajtëse shtesë që Google të mund të menaxhojë dhe të rezervojë mesazhet e tua të postës zanore. ""Ky funksion po testohet aktualisht ""dhe mund të fshijë posta zanore nga serveri i postës zanore, si dhe nuk premtojmë mbështetjen për këtë funksion në të ardhmen. Megjithatë do të na pëlqente të merrnim komentet e tua."
- "[Eksperimentale] Aktivizo rezervimin dhe hapësirën ruajtëse shtesë"
- "Kutia jote postare është plot. Për të liruar hapësirën, aktivizo hapësirën ruajtëse shtesë që Google të mund të menaxhojë dhe të rezervojë mesazhet e tua të postës zanore. ""Ky funksion po testohet aktualisht ""dhe mund të fshijë posta zanore nga serveri i postës zanore, si dhe nuk premtojmë mbështetjen për këtë funksion në të ardhmen. Megjithatë do të na pëlqente të merrnim komentet e tua."
+ "Aktivizo hapësirën ruajtëse shtesë dhe rezervimin"
+ "Kutia jote postare është plot. Për të liruar hapësirën, aktivizo hapësirën ruajtëse shtesë që Google të mund të menaxhojë dhe të rezervojë mesazhet e tua të postës zanore."
+ "Aktivizo hapësirën ruajtëse shtesë dhe rezervimin"
+ "Kutia jote postare është thuajse plot. Për të liruar hapësirën, aktivizo hapësirën ruajtëse shtesë që Google të mund të menaxhojë dhe të rezervojë mesazhet e tua të postës zanore."
"Vendos kodin PIN të postës zanore"
"Të duhet një kod PIN për postën zanore në çdo kohë që telefonon për të hyrë te posta zanore."
"Gabim i panjohur"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-sr/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-sr/strings.xml
index ebbee778c..da1853a14 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-sr/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-sr/strings.xml
@@ -44,10 +44,10 @@
"Нећете моћи да примате нову говорну пошту ако је пријемно сандуче пуно."
"Не можете да примате нове говорне поруке"
"Пријемно сандуче је пуно. Избришите неке поруке да бисте примили нову говорну пошту."
- "[Експериментално] Укључите додатни меморијски простор и резервне копије"
- "Ваше поштанско сандуче је пуно. Да бисте ослободили простор, укључите додатни меморијски простор како би Google могао да управља вашим порукама говорне поште и прави њихове резервне копије. ""Ова функција се тренутно тестира "", може да избрише говорне поруке са сервера говорне поште и не гарантујемо да ћемо је подржавати у будућности. Ипак, желели бисмо да добијамо повратне информације од вас."
- "[Експериментално] Укључите додатни меморијски простор и резервне копије"
- "Ваше поштанско сандуче је скоро пуно. Да бисте ослободили простор, укључите додатни меморијски простор како би Google могао да управља вашим порукама говорне поште и прави њихове резервне копије. ""Ова функција се тренутно тестира "", може да избрише говорне поруке са сервера говорне поште и не гарантујемо да ћемо је подржавати у будућности. Ипак, желели бисмо да добијамо повратне информације од вас."
+ "Укључите додатни меморијски простор и резервне копије"
+ "Поштанско сандуче је пуно. Да бисте ослободили простор, укључите додатни меморијски простор, па ће Google моћи да управља вашим говорним порукама и прави њихове резервне копије."
+ "Укључите додатни меморијски простор и резервне копије"
+ "Поштанско сандуче је скоро пуно. Да бисте ослободили простор, укључите додатни меморијски простор, па ће Google моћи да управља вашим говорним порукама и прави њихове резервне копије."
"Подесите PIN говорне поште"
"PIN говорне поште вам треба сваки пут кад упућујете позив да бисте приступили говорној пошти."
"Непозната грешка"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-sv/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-sv/strings.xml
index b74be6132..cfab8305a 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-sv/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-sv/strings.xml
@@ -44,10 +44,10 @@
"Du kan inte ta emot nya röstmeddelanden om inkorgen är full."
"Du kan inte ta emot nya röstmeddelanden."
"Inkorgen är full. Testa att radera några meddelanden om du vill kunna ta emot nya röstmeddelanden."
- "[Experimentell] Aktivera extra lagring och säkerhetskopiering"
- "Din brevlåda är full. Frigör utrymme genom att aktivera extra lagring så att Google hanterar och säkerhetskopierar dina röstmeddelanden. ""Det här är en experimentfunktion"" som vi för närvarande testar. Den kan potentiellt radera röstmeddelanden på röstbrevlådans server och vi garanterar inte support för den här funktionen i framtiden. Vi är dock tacksamma för synpunkter om den."
- "[Experimentell] Aktivera extra lagring och säkerhetskopiering"
- "Din brevlåda är nästan full. Frigör utrymme genom att aktivera extra lagring så att Google hanterar och säkerhetskopierar dina röstmeddelanden. ""Det här är en experimentfunktion"" som vi för närvarande testar. Den kan potentiellt radera röstmeddelanden på röstbrevlådans server och vi garanterar inte support för den här funktionen i framtiden. Vi är dock tacksamma för synpunkter om den."
+ "Aktivera extra lagring och säkerhetskopiering"
+ "Din postlåda är full. Frigör utrymme genom att aktivera extra lagringsutrymme så att Google kan hantera och säkerhetskopiera dina röstmeddelanden."
+ "Aktivera extra lagring och säkerhetskopiering"
+ "Din postlåda är nästan full. Frigör utrymme genom att aktivera extra lagringsutrymme så att Google kan hantera och säkerhetskopiera dina röstmeddelanden."
"Ange PIN-kod till röstbrevlåda"
"Du måste ha en PIN-kod till röstbrevlådan varje gång du ringer till den."
"Okänt fel"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-sw/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-sw/strings.xml
index 098fbe0b7..56aad211c 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-sw/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-sw/strings.xml
@@ -44,10 +44,10 @@
"Hutaweza kupokea ujumbe mpya wa sauti kama kikasha chako kimejaa."
"Huwezi kupokea ujumbe mpya wa sauti"
"Kikasha chako kimejaa. Jaribu kufuta baadhi ili uweze kupokea ujumbe mpya wa sauti."
- "[Majaribio] Washa nafasi ya ziada halafu uhifadhi nakala rudufu"
- "Sanduku lako la ujumbe wa sauti limejaa. Ili upate nafasi, washa hifadhi ya ziada ili Google idhibiti na kuweka nakala rudufu ya ujumbe wako wa sauti. ""Kipengele hiki kinajaribiwa kwa sasa ""na huenda kitafuta ujumbe wa sauti kutoka kwenye seva yako ya ujumbe wa sauti, na hatuwezi kutoa ahadi kwamba kipengele hiki kitatumika katika siku zijazo. Hata hivyo, tungependa kupata maoni yako kuhusu kipengele hiki."
- "[Majaribio] Washa nafasi ya ziada halafu uhifadhi nakala rudufu"
- "Sanduku lako la ujumbe wa sauti limejaa. Ili upate nafasi, washa hifadhi ya ziada ili Google idhibiti na kuweka nakala rudufu ya ujumbe wako wa sauti. ""Kipengele hiki kinajaribiwa kwa sasa ""na huenda kitafuta ujumbe wa sauti kutoka kwenye seva yako ya ujumbe wa sauti, na hatuwezi kutoa ahadi kwamba kipengele hiki kitatumika katika siku zijazo. Hata hivyo, tungependa kupata maoni yako kuhusu kipengele hiki."
+ "Washa nafasi ya ziada halafu uhifadhi nakala rudufu"
+ "Sanduku lako la ujumbe wa sauti limejaa. Ili upate nafasi, washa hifadhi ya ziada ili Google idhibiti na kuweka nakala rudufu ya ujumbe wako wa sauti."
+ "Washa nafasi ya ziada halafu uhifadhi nakala rudufu"
+ "Sanduku lako la ujumbe wa sauti linakaribia kujaa. Ili upate nafasi, washa hifadhi ya ziada ili Google idhibiti na kuweka nakala rudufu ya ujumbe wako wa sauti."
"Weka PIN yako ya ujumbe wa sauti"
"Utahitaji PIN ya ujumbe wa sauti wakati wowote unapopiga simu ili ufikie ujumbe wako wa sauti."
"Hitilafu isiyojulikana"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-ta/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-ta/strings.xml
index f8ab381f7..f2613f082 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-ta/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-ta/strings.xml
@@ -44,10 +44,10 @@
"இன்பாக்ஸ் நிரம்பியிருந்தால், புதிய குரலஞ்சலைப் பெற முடியாது."
"புதிய குரலஞ்சல்களைப் பெற முடியவில்லை"
"இன்பாக்ஸ் நிரம்பிவிட்டது. புதிய குரலஞ்சல்களைப் பெற, சில செய்திகளை நீக்கவும்."
- "[சோதனை முயற்சி] கூடுதல் சேமிப்பகத்தையும் காப்புப் பிரதியையும் இயக்கு"
- "உங்கள் அஞ்சல்பெட்டி நிரம்பிவிட்டது. இடத்தைக் காலியாக்க, கூடுதல் சேமிப்பகத்தை இயக்கவும். இதன் மூலம் Google உங்கள் குரலஞ்சல் செய்திகளை நிர்வகித்து, காப்புப் பிரதி எடுக்கலாம். "" இந்த அம்சம் தற்போது சோதனை செய்யப்படுகிறது "", இது உங்கள் குரலஞ்சல் சேவையகத்திலிருந்து குரலஞ்சல்களை நீக்கச் சாத்தியமுள்ளது. இந்த அம்சம் எதிர்காலத்தில் ஆதரிப்படும் என்பதற்குஉத்திரவாதம் இல்லை. இருப்பினும் உங்கள் கருத்தை வரவேற்கிறோம்."
- "[சோதனை முயற்சி] கூடுதல் சேமிப்பகத்தையும் காப்புப் பிரதியையும் இயக்கு"
- "உங்கள் அஞ்சல்பெட்டி கிட்டத்தட்ட நிரம்பிவிட்டது. இடத்தைக் காலியாக்க, கூடுதல் சேமிப்பகத்தை இயக்கவும். இதன் மூலம் Google உங்கள் குரலஞ்சல் செய்திகளை நிர்வகித்து, காப்புப் பிரதி எடுக்கலாம். "" இந்த அம்சம் தற்போது சோதனை செய்யப்படுகிறது "", இது உங்கள் குரலஞ்சல் சேவையகத்திலிருந்து குரலஞ்சல்களை நீக்கச் சாத்தியமுள்ளது. இந்த அம்சம் எதிர்காலத்தில் ஆதரிப்படும் என்பதற்குஉத்திரவாதம் இல்லை. இருப்பினும் உங்கள் கருத்தை வரவேற்கிறோம்."
+ "கூடுதல் சேமிப்பகத்தையும் காப்புப் பிரதியையும் இயக்கு"
+ "உங்கள் அஞ்சல்பெட்டி நிரம்பிவிட்டது. இடத்தைக் காலியாக்க, கூடுதல் சேமிப்பகத்தை இயக்கவும். இதன் மூலம் Google உங்கள் குரலஞ்சல் செய்திகளை நிர்வகித்து, காப்புப் பிரதி எடுக்கலாம்."
+ "கூடுதல் சேமிப்பகத்தையும் காப்புப் பிரதியையும் இயக்கு"
+ "உங்கள் அஞ்சல்பெட்டி கிட்டத்தட்ட நிரம்பிவிட்டது. இடத்தைக் காலியாக்க, கூடுதல் சேமிப்பகத்தை இயக்கவும். இதன் மூலம் Google உங்கள் குரலஞ்சல் செய்திகளை நிர்வகித்து, காப்புப் பிரதி எடுக்கலாம்."
"உங்கள் குரலஞ்சல் பின்னை அமைக்கவும்"
"உங்கள் குரலஞ்சலை அணுகுவதற்கு நீங்கள் எப்போது அழைத்தாலும் குரலஞ்சல் பின் அவசியம்."
"அறியப்படாத பிழை"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-te/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-te/strings.xml
index c2a818f47..a881550e8 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-te/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-te/strings.xml
@@ -44,10 +44,10 @@
"మీ ఇన్బాక్స్ నిండిపోయి ఉంటే, కొత్త వాయిస్ మెయిల్ను స్వీకరించలేరు."
"కొత్త వాయిస్ మెయిల్లను స్వీకరించలేరు"
"మీ ఇన్బాక్స్ నిండింది. కొత్త వాయిస్ మెయిల్ను స్వీకరించడానికి కొన్ని సందేశాలను తొలగించడానికి ప్రయత్నించండి."
- "[ప్రయోగాత్మకం] అదనపు నిల్వ మరియు బ్యాకప్ను ఆన్ చేయండి"
- "మీ మెయిల్బాక్స్ నిండింది. స్థలాన్ని ఖాళీ చేసేందుకు అదనపు నిల్వను ఆన్ చేయండి, అప్పుడు Google మీ వాయిస్ మెయిల్ సందేశాలను నిర్వహించగలదు మరియు బ్యాకప్ చేయగలదు. ""ప్రస్తుతం ఈ లక్షణం పరీక్షించబడుతున్నందున ""మీ వాయిస్ మెయిల్ సర్వర్ నుండి సంభావ్యంగా వాయిస్ మెయిల్లు తొలగించబడతాయి, అలాగే మేము భవిష్యత్తులో ఈ లక్షణానికి మద్దతు ఇస్తామని ఎలాంటి వాగ్దానం చేయము. అయితే, మీ అభిప్రాయాన్ని అందిస్తే మేము సంతోషిస్తాము."
- "[ప్రయోగాత్మకం] అదనపు నిల్వ మరియు బ్యాకప్ను ఆన్ చేయండి"
- "మీ మెయిల్బాక్స్ దాదాపు నిండింది. స్థలాన్ని ఖాళీ చేసేందుకు అదనపు నిల్వను ఆన్ చేయండి, అప్పుడు Google మీ వాయిస్ మెయిల్ సందేశాలను నిర్వహించగలదు మరియు బ్యాకప్ చేయగలదు. ""ప్రస్తుతం ఈ లక్షణం పరీక్షించబడుతున్నందున ""మీ వాయిస్ మెయిల్ సర్వర్ నుండి సంభావ్యంగా వాయిస్ మెయిల్లు తొలగించబడతాయి మరియు మేము భవిష్యత్తులో ఈ లక్షణానికి మద్దతు ఇస్తామని ఎలాంటి వాగ్దానం చేయము. అయితే, మీ అభిప్రాయాన్ని అందిస్తే మేము సంతోషిస్తాము."
+ "అదనపు నిల్వ మరియు బ్యాకప్ను ఆన్ చేయండి"
+ "మీ మెయిల్బాక్స్ నిండింది. స్థలాన్ని ఖాళీ చేసేందుకు అదనపు నిల్వను ఆన్ చేయండి, దీని వలన Google మీ వాయిస్ మెయిల్ సందేశాలను నిర్వహించగలదు మరియు బ్యాకప్ చేయగలదు."
+ "అదనపు నిల్వ మరియు బ్యాకప్ను ఆన్ చేయండి"
+ "మీ మెయిల్బాక్స్ దాదాపు నిండిపోయింది. స్థలాన్ని ఖాళీ చేసేందుకు అదనపు నిల్వను ఆన్ చేయండి, దీని వలన Google మీ వాయిస్ మెయిల్ సందేశాలను నిర్వహించగలదు మరియు బ్యాకప్ చేయగలదు."
"మీ వాయిస్ మెయిల్ PIN సెట్ చేయండి"
"మీరు మీ వాయిస్ మెయిల్ను ప్రాప్యత చేయడానికి కాల్ చేసే ప్రతిసారి మీకు వాయిస్ మెయిల్ PIN అవసరమవుతుంది."
"తెలియని లోపం"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-th/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-th/strings.xml
index 97ceee724..31302cc65 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-th/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-th/strings.xml
@@ -44,10 +44,10 @@
"คุณจะไม่สามารถรับข้อความเสียงใหม่ได้ ถ้ากล่องจดหมายเต็ม"
"ไม่สามารถรับข้อความเสียงใหม่ได้"
"กล่องจดหมายเต็ม ลองลบข้อความบางส่วนออกเพื่อรับข้อความเสียงใหม่"
- "[ทดสอบ] เปิดพื้นที่เก็บข้อมูลและการสำรองข้อมูลเพิ่มเติม"
- "กล่องจดหมายเต็มแล้ว หากต้องการทำให้พื้นที่ว่างมากขึ้น โปรดเปิดพื้นที่เก็บข้อมูลเพิ่มเติมเพื่อให้ Google จัดการและสำรองข้อมูลข้อความเสียงได้ ""คุณลักษณะนี้อยู่ในระหว่างการทดสอบ""และอาจลบข้อความเสียงออกจากเซิร์ฟเวอร์ข้อความเสียงได้ เราไม่สัญญาว่าจะรองรับคุณลักษณะนี้ในอนาคต แต่ยินดีรับฟังความคิดเห็น"
- "[ทดสอบ] เปิดพื้นที่เก็บข้อมูลและการสำรองข้อมูลเพิ่มเติม"
- "กล่องจดหมายใกล้จะเต็มแล้ว หากต้องการทำให้พื้นที่ว่างมากขึ้น โปรดเปิดพื้นที่เก็บข้อมูลเพิ่มเติมเพื่อให้ Google จัดการและสำรองข้อมูลข้อความเสียงได้ ""คุณลักษณะนี้อยู่ในระหว่างการทดสอบ""และอาจลบข้อความเสียงออกจากเซิร์ฟเวอร์ข้อความเสียงได้ เราไม่สัญญาว่าจะรองรับคุณลักษณะนี้ในอนาคต แต่ยินดีรับฟังความคิดเห็น"
+ "เปิดพื้นที่เก็บข้อมูลเพิ่มเติมและการสำรองข้อมูล"
+ "กล่องจดหมายของคุณเต็มแล้ว หากต้องการเพิ่มพื้นที่ว่าง โปรดเปิดพื้นที่เก็บข้อมูลเพิ่มเติมเพื่อให้ Google สามารถจัดการและเก็บสำรองข้อความเสียงได้"
+ "เปิดพื้นที่เก็บข้อมูลเพิ่มเติมและการสำรองข้อมูล"
+ "กล่องจดหมายของคุณใกล้เต็มแล้ว หากต้องการเพิ่มพื้นที่ว่าง โปรดเปิดพื้นที่เก็บข้อมูลเพิ่มเติมเพื่อให้ Google สามารถจัดการและเก็บสำรองข้อความเสียงได้"
"ตั้งค่า PIN ข้อความเสียง"
"คุณต้องใช้ PIN ข้อความเสียงทุกครั้งที่โทรหาบริการข้อความเสียง"
"ข้อผิดพลาดที่ไม่ทราบสาเหตุ"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-tl/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-tl/strings.xml
index f8bcc952a..b99d0c377 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-tl/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-tl/strings.xml
@@ -44,10 +44,10 @@
"Hindi ka makakatanggap ng bagong voicemail kung puno na ang inbox mo."
"Hindi makatanggap ng mga bagong voicemail"
"Puno na ang inbox mo. Subukang i-delete ang ilang mensahe upang makatanggap ng bagong voicemail."
- "[Eksperimental] I-on ang karagdagang storage at backup"
- "Puno na ang iyong mailbox. Upang magbakante ng space, i-on ang karagdagang storage para mapamahalaan at ma-back up ng Google ang iyong mga mensahe sa voicemail. ""Kasalukuyang sinusubukan ang feature na ito ""at posibleng i-delete ang mga voicemail mula sa iyong server ng voicemail, at hindi namin ipinapangakong susuportahan ang feature na ito sa hinaharap. Gayunpaman, gusto naming makuha ang iyong feedback."
- "[Eksperimental] I-on ang karagdagang storage at backup"
- "Malapit nang mapuno ang iyong mailbox. Upang magbakante ng space, i-on ang karagdagang storage para mapamahalaan at ma-back up ng Google ang iyong mga mensahe sa voicemail. ""Kasalukuyang sinusubukan ang feature na ito ""at posibleng i-delete ang mga voicemail mula sa iyong server ng voicemail, at hindi namin ipinapangakong susuportahan ang feature na ito sa hinaharap. Gayunpaman, gusto naming makuha ang iyong feedback."
+ "I-on ang karagdagang storage at backup"
+ "Puno na ang iyong mailbox. Upang magbakante ng space, i-on ang karagdagang storage para pamahalaan at i-back up ng Google ang iyong mga mensahe sa voicemail."
+ "I-on ang karagdagang storage at backup"
+ "Malapit nang mapuno ang iyong mailbox. Upang magbakante ng space, i-on ang karagdagang storage para pamahalaan at i-back up ng Google ang iyong mga mensahe sa voicemail."
"Itakda ang iyong PIN sa voicemail"
"Kakailanganin mo ng isang PIN sa voicemail sa tuwing tatawag ka upang ma-access ang iyong voicemail."
"Hindi alam na error"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-tr/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-tr/strings.xml
index 428543d3b..be5cbb027 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-tr/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-tr/strings.xml
@@ -44,10 +44,10 @@
"Gelen kutunuz dolarsa yeni sesli mesajları alamayacaksınız."
"Yeni sesli mesajlar alınamıyor"
"Gelen kutunuz doldu. Yeni sesli mesajları almak için bazı mesajları silmeyi deneyin."
- "[Deneysel] Ekstra depolama alanını ve yedeklemeyi etkinleştirin"
- "Posta kutunuz dolu. Google\'ın sesli mesajlarınızı yönetebileceği ve yedekleyebileceği şekilde yer açmak için ekstra depolama alanını etkinleştirin. ""Bu özellik henüz test edilmektedir ""ve sesli mesaj sunucunuzdaki sesli mesajların silinmesine neden olabilir. Ayrıca, bu özelliğin gelecekte destekleneceğine dair bir garanti vermiyoruz. Yine de geri bildirimlerinizi öğrenmek isteriz."
- "[Deneysel] Ekstra depolama alanını ve yedeklemeyi etkinleştirin"
- "Posta kutunuz dolmak üzere. Google\'ın sesli mesajlarınızı yönetebileceği ve yedekleyebileceği şekilde yer açmak için ekstra depolama alanını etkinleştirin. ""Bu özellik henüz test edilmektedir ""ve sesli mesaj sunucunuzdaki sesli mesajların silinmesine neden olabilir. Ayrıca, bu özelliğin gelecekte destekleneceğine dair bir garanti vermiyoruz. Yine de geri bildirimlerinizi öğrenmek isteriz."
+ "Ekstra depolama alanını ve yedeklemeyi etkinleştirin"
+ "Posta kutunuz dolu. Google\'ın sesli mesajlarınızı yönetebileceği ve yedekleyebileceği şekilde yer açmak için ekstra depolama alanını etkinleştirin."
+ "Ekstra depolama alanını ve yedeklemeyi etkinleştirin"
+ "Posta kutunuz dolmak üzere. Google\'ın sesli mesajlarınızı yönetebileceği ve yedekleyebileceği şekilde yer açmak için ekstra depolama alanını etkinleştirin."
"Sesli mesaj PIN\'inizi ayarlayın"
"Sesli mesajlarınıza erişmek için her aradığınızda bir sesli mesaj PIN\'i girmeniz gerekecek."
"Bilinmeyen hata"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-uk/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-uk/strings.xml
index 30e83f2d7..6adf49ab9 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-uk/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-uk/strings.xml
@@ -44,10 +44,10 @@
"Якщо папка вхідної голосової пошти заповнена, ви не зможете отримувати нові повідомлення."
"Неможливо отримати нові голосові повідомлення"
"Папка вхідної голосової пошти заповнена. Видаліть деякі повідомлення, щоб отримати нові."
- "[Експериментальна функція] Увімкніть додаткову пам’ять і резервне копіювання"
- "У поштовій скриньці не залишилося місця. Щоб звільнити його, увімкніть додаткову пам’ять, і тоді Google робитиме резервні копії вашої голосової пошти та керуватиме нею. ""Ця функція зараз тестується, ""і в результаті її використання голосові повідомлення може бути видалено із сервера голосової пошти. Ми не гарантуємо, що вона підтримуватиметься в майбутньому, однак хочемо отримати ваш відгук."
- "[Експериментальна функція] Увімкніть додаткову пам’ять і резервне копіювання"
- "У поштовій скриньці майже не залишилося місця. Щоб звільнити його, увімкніть додаткову пам’ять, і тоді Google робитиме резервні копії вашої голосової пошти та керуватиме нею. ""Ця функція зараз тестується, ""і в результаті її використання голосові повідомлення може бути видалено із сервера голосової пошти. Ми не гарантуємо, що вона підтримуватиметься в майбутньому, однак хочемо отримати ваш відгук."
+ "Увімкніть додаткову пам’ять і резервне копіювання"
+ "У поштовій скриньці не залишилося місця. Щоб звільнити його, увімкніть додаткову пам’ять, і тоді Google почне робити резервні копії вашої голосової пошти й керувати нею."
+ "Увімкніть додаткову пам’ять і резервне копіювання"
+ "У поштовій скриньці майже не залишилося місця. Щоб звільнити його, увімкніть додаткову пам’ять, і тоді Google почне робити резервні копії вашої голосової пошти й керувати нею."
"Установіть PIN-код голосової пошти"
"PIN-код буде потрібен під час кожного дзвінка на голосову пошту."
"Невідома помилка"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-ur/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-ur/strings.xml
index ab640ffd1..e6fd9f7a0 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-ur/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-ur/strings.xml
@@ -44,10 +44,10 @@
"اگر آپ کا ان باکس بھرا ہوا ہوگا تو آپ نئی صوتی میل موصول نہیں کر پائیں گے۔"
"نئی صوتی میلز موصول نہیں ہو سکتی"
"آپ کا ان باکس بھرا ہوا ہے۔ نئی صوتی میل موصول کرنے کیلئے کچھ پیغامات حذف کرنے کی کوشش کریں۔"
- "[تجرباتی] اضافی اسٹوریج اور بیک اپ آن کریں"
- "آپ کا میل باکس تقریبا بھرا ہوا ہے۔ جگہ خالی کرنے کیلئے، اضافی اسٹوریج آن کریں تاکہ Google آپ کے صوتی میل پیغامات کا بیک اپ اور نظم کر سکے۔ ""یہ خصوصیت ابھی ٹیسٹ کی جا رہی ہے ""اور ممکنہ طور پر آپ کے صوتی میل سرور پر سے آپ کی صوتی میلز کو حذف کر دے گی اور مستقبل میں اس خصوصیت کی معاونت کا ہم وعدہ نہیں کرتے۔ لیکن ہم آپ کے تاثرات کو پسند کریں گے۔"
- "[تجرباتی] اضافی اسٹوریج اور بیک اپ آن کریں"
- "آپ کا میل باکس تقریبا بھرا ہوا ہے۔ جگہ خالی کرنے کیلئے، اضافی اسٹوریج آن کریں تاکہ Google آپ کے صوتی میل پیغامات کا بیک اپ اور نظم کر سکے۔ ""یہ خصوصیت ابھی ٹیسٹ کی جا رہی ہے ""اور ممکنہ طور پر آپ کے صوتی میل سرور پر سے آپ کی صوتی میلز کو حذف کر دے گی اور مستقبل میں اس خصوصیت کی معاونت کا ہم وعدہ نہیں کرتے۔ لیکن ہم آپ کے تاثرات کو پسند کریں گے۔"
+ "اضافی اسٹوریج اور بیک اپ آن کریں"
+ "آپ کا میل باکس بھر گیا ہے۔ جگہ خالی کرنے کیلئے، اضافی اسٹوریج کو آن کریں تا کہ Google آپ کے صوتی میل پیغامات کا بیک اپ اور ان کا نظم کر سکے۔"
+ "اضافی اسٹوریج اور بیک اپ آن کریں"
+ "آپ کا میل باکس تقریباً بھر گیا ہے۔ جگہ خالی کرنے کیلئے، اضافی اسٹوریج کو آن کریں تا کہ Google آپ کے صوتی میل پیغامات کا بیک اپ اور ان کا نظم کر سکے۔"
"اپنی صوتی میل PIN سیٹ کریں"
"آپ جب بھی صوتی میل تک رسائی کیلئے کال کریں گے تو آپ کو صوتی میل PIN چاہئیے ہوگی۔"
"نامعلوم خرابی"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-uz/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-uz/strings.xml
index 0cfd29c24..5583e2778 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-uz/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-uz/strings.xml
@@ -44,10 +44,10 @@
"Agar ovozli pochta qutisi to‘lib qolsa, yangi xabarlar qabul qilishning imkoni bo‘lmay qoladi."
"Yangi ovozli pochta xabarlarini qabul qilib bo‘lmadi"
"Ovozli pochta qutisi to‘lgan. Yangi xabarlar qabul qilish uchun eskilaridan bir nechtasini o‘chirib tashlang."
- "[Tajribaviy xususiyat] Zaxiralash va saqlash uchun qo‘shimcha xotirani faollashtiring"
- "Pochta qutisi to‘lgan. Unda joy bo‘shatish uchun qo‘shimcha xotirani faollashtiring. Bu – Google’ga ovozli xabarlaringizni boshqarish va ularning nusxasini zaxiralashga imkon beradi. ""Bu xususiyat ayni vaqtda sinovdan o‘tkazilmoqda."" Sizning ovozli xabarlaringiz, ehtimol, ovozli pochta serveridan o‘chirib tashlanadi. Bu xususiyatning keyinchalik qo‘llab-quvvatlanishi kafolatlanmaydi. Shunday bo‘lsa-da, u haqda fikr-mulohaza bildirishingizni xohlaymiz."
- "[Tajribaviy xususiyat] Zaxiralash va saqlash uchun qo‘shimcha xotirani faollashtiring"
- "Pochta qutisi deyarli to‘lgan. Unda joy bo‘shatish uchun qo‘shimcha xotirani faollashtiring. Bu – Google’ga ovozli xabarlaringizni boshqarish va ularning nusxasini zaxiralashga imkon beradi. ""Bu xususiyat ayni vaqtda sinovdan o‘tkazilmoqda."" Sizning ovozli xabarlaringiz, ehtimol, ovozli pochta serveridan o‘chirib tashlanadi. Bu xususiyatning keyinchalik qo‘llab-quvvatlanishi kafolatlanmaydi. Shunday bo‘lsa-da, u haqda fikr-mulohaza bildirishingizni xohlaymiz."
+ "Qo‘shimcha xotira va zaxiralash xususiyatini yoqish"
+ "Pochtangiz qutisi deyarli to‘lgan. Unda joy bo‘shatish uchun qo‘shimcha xotirani yoqing. Google esa, ovozli xabarlaringiz nusxasini zaxiralashni hamda ularni boshqarishni boshlaydi."
+ "Qo‘shimcha xotira va zaxiralash xususiyatini yoqish"
+ "Pochtangiz qutisi deyarli to‘lgan. Unda joy bo‘shatish uchun qo‘shimcha xotirani yoqing. Google esa, ovozli xabarlaringiz nusxasini zaxiralashni hamda ularni boshqarishni boshlaydi."
"Ovozli pochta uchun PIN kod o‘rnatish"
"Ovozli pochtaga har safar qo‘ng‘iroq qilinganda PIN kod so‘raladi."
"Noma’lum xatolik"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-vi/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-vi/strings.xml
index 819b35161..029396e31 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-vi/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-vi/strings.xml
@@ -44,10 +44,10 @@
"Bạn sẽ không thể nhận được thư thoại mới nếu hộp thư đến của bạn đã đầy."
"Không nhận được thư thoại mới"
"Hộp thư đến của bạn đã đầy. Hãy thử xóa một vài thư để nhận thư thoại mới."
- "[Thử nghiệm] Bật bộ nhớ và bản sao lưu bổ sung"
- "Hộp thư của bạn đã đầy. Để tạo thêm dung lượng, hãy bật bộ nhớ bổ sung để Google có thể quản lý và sao lưu tin nhắn thoại của bạn. ""Tính năng này hiện đang được thử nghiệm ""và có khả năng sẽ xóa thư thoại của bạn khỏi máy chủ thư thoại. Ngoài ra, chúng tôi không cam kết hỗ trợ tính năng này trong tương lai. Mặc dù vậy, chúng tôi vẫn mong muốn nhận được phản hồi của bạn."
- "[Thử nghiệm] Bật bộ nhớ và bản sao lưu bổ sung"
- "Hộp thư của bạn sắp đầy. Để tạo thêm dung lượng, hãy bật bộ nhớ bổ sung để Google có thể quản lý và sao lưu tin nhắn thoại của bạn. ""Tính năng này hiện đang được thử nghiệm ""và có khả năng sẽ xóa thư thoại của bạn khỏi máy chủ thư thoại. Ngoài ra, chúng tôi không cam kết hỗ trợ tính năng này trong tương lai. Mặc dù vậy, chúng tôi vẫn mong muốn nhận được phản hồi của bạn."
+ "Bật sao lưu và bộ nhớ bổ sung"
+ "Hộp thư của bạn đã đầy. Để giải phóng dung lượng, hãy bật bộ nhớ bổ sung để Google có thể quản lý và sao lưu thư thoại của bạn."
+ "Bật sao lưu và bộ nhớ bổ sung"
+ "Hộp thư của bạn đã gần đầy. Để giải phóng dung lượng, hãy bật bộ nhớ bổ sung để Google có thể quản lý và sao lưu thư thoại của bạn."
"Đặt mã PIN thư thoại của bạn"
"Bạn cần có mã PIN thư thoại mỗi khi gọi để truy cập thư thoại của mình."
"Lỗi không xác định"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-zh-rCN/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-zh-rCN/strings.xml
index 4efebc588..faa36dead 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-zh-rCN/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-zh-rCN/strings.xml
@@ -44,10 +44,10 @@
"如果收件箱已满,您将无法接收新的语音邮件。"
"无法接收新的语音邮件"
"您的收件箱已满。请尝试删除部分邮件,以便接收新的语音邮件。"
- "[试验性功能] 启用额外存储空间和备份功能"
- "您的邮箱已满。要释放空间,请启用额外存储空间,以便 Google 管理和备份您的语音邮件。""此功能目前正处于测试阶段""并且可能会将语音邮件从您的语音邮件服务器上删除。我们不保证将来会支持此功能,但希望能收到您的反馈。"
- "[试验性功能] 启用额外存储空间和备份功能"
- "您的邮箱已满。要释放空间,请启用额外存储空间,以便 Google 管理和备份您的语音邮件。""此功能目前正处于测试阶段""并且可能会将语音邮件从您的语音邮件服务器上删除。我们不保证将来会支持此功能,但希望能收到您的反馈。"
+ "启用额外存储空间和备份功能"
+ "您的邮箱已满。要释放空间,请启用额外存储空间,以便 Google 管理和备份您的语音邮件。"
+ "启用额外存储空间和备份功能"
+ "您的邮箱快满了。要释放空间,请启用额外存储空间,以便 Google 管理和备份您的语音邮件。"
"设置语音信箱 PIN 码"
"您必须使用语音信箱 PIN 码,才能访问您的语音信箱。"
"未知错误"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-zh-rHK/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-zh-rHK/strings.xml
index 0ef798e6a..e51a0a902 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-zh-rHK/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-zh-rHK/strings.xml
@@ -44,10 +44,10 @@
"如果您的收件箱已滿,就無法接收新留言。"
"無法接收新留言"
"您的收件箱已滿。建議您刪除部分訊息以接收新留言。"
- "[實驗性] 啟用額外儲存裝置和備份功能"
- "您的信箱已滿。若要騰出空間,請啟用額外儲存空間,以便 Google 管理及備份您的留言訊息。""此功能目前處於測試階段,""有可能會將您的留言從留言伺服器刪除。我們不保證日後會支援此功能,但還是歡迎您提供相關意見。"
- "[實驗性] 啟用額外儲存裝置和備份功能"
- "您的信箱將滿。若要騰出空間,請啟用額外儲存空間,以便 Google 管理及備份您的留言訊息。""此功能目前處於測試階段,""有可能會將您的留言從留言伺服器刪除。我們不保證日後會支援此功能,但還是歡迎您提供相關意見。"
+ "啟用額外儲存裝置和備份功能"
+ "您的信箱已滿。若要騰出空間,請啟用額外儲存裝置,以便 Google 管理並備份您的留言訊息。"
+ "啟用額外儲存裝置和備份功能"
+ "您的信箱快要滿了。若要騰出空間,請啟用額外儲存裝置,以便 Google 管理並備份您的留言訊息。"
"設定留言信箱 PIN"
"您必須輸入留言信箱 PIN 才可收聽留言。"
"不明錯誤"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-zh-rTW/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-zh-rTW/strings.xml
index 9b22c403e..7f2e1d61c 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-zh-rTW/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-zh-rTW/strings.xml
@@ -44,10 +44,10 @@
"收件匣已滿時無法接收新的語音留言。"
"無法接收新的語音留言"
"您的收件匣已滿。請刪除部分訊息,以便接收新的語音留言。"
- "[實驗性] 啟用額外的儲存空間和備份功能"
- "你的信箱容量已滿。如要釋出空間,請啟用額外的儲存空間,方便 Google 管理及備份你的語音留言。""這項功能目前正在測試階段"",可能會從你的語音信箱伺服器中刪除語音留言。我們不保證日後會支援此功能,但還是希望聽聽你的寶貴意見。"
- "[實驗性] 啟用額外的儲存空間和備份功能"
- "你的信箱容量幾乎已滿。如要釋出空間,請啟用額外的儲存空間,方便 Google 管理及備份你的語音留言。""這項功能目前正在測試階段"",可能會從你的語音信箱伺服器中刪除語音留言。我們不保證日後會支援此功能,但還是希望聽聽你的寶貴意見。"
+ "啟用額外的儲存空間和備份功能"
+ "你的信箱容量已滿。如要釋出空間,請啟用額外的儲存空間,方便 Google 管理及備份你的語音留言。"
+ "啟用額外的儲存空間和備份功能"
+ "你的信箱容量幾乎已滿。如要釋出空間,請啟用額外的儲存空間,方便 Google 管理及備份你的語音留言。"
"設定您的語音信箱 PIN 碼"
"您必須輸入語音信箱 PIN 碼才能存取您的語音信箱。"
"不明錯誤"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-zu/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-zu/strings.xml
index fa2613216..8d3cd79ea 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-zu/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-zu/strings.xml
@@ -44,10 +44,10 @@
"Ngeke uze ukwazi ukuthola ivoyisimeyili entsha uma ibhokisi lakho lokungenayo ligcwele."
"Ayikwazi ukwamukela amavoyisimeyili amasha"
"Ibhokisi lakho lokungenayo ligcwele. Zama ukususa eminye imilayezo ukuze uthole ivoyisimeyili entsha."
- "[Ukuhlolwa] Vula isitoreji esingeziwe nesipele"
- "Ibhokisi lakho lemeyili ligcwele. Ukuze ukhulule isikhala, vula isitoreji esingeziwe ukuze i-Google ikwazi ukuphatha iphinde yenze isipele imilayezo yakho yevoyisimeyili. ""Lesi sici manje siyahlolwa ""futhi sinamandla okususa amavoyisimeyili kusukela kuseva yakho yevoyisimeyili, futhi asithembisi ukusekela lesi sici ngokuzayo. Singayijabulela impendulo yakho yize kunjalo."
- "[Ukuhlolwa] Vula isitoreji esingeziwe nesipele"
- "Ibhokisi lakho lemeyili selicishe ligcwele. Ukuze ukhulule isikhala, vula isitoreji esingeziwe ukuze i-Google ikwazi ukuphatha iphinde yenze isipele imilayezo yakho yevoyisimeyili. ""Lesi sici manje siyahlolwa ""futhi sinamandla okususa amavoyisimeyili kusukela kuseva yakho yevoyisimeyili, futhi asithembisi ukusekela lesi sici ngokuzayo. Singayijabulela impendulo yakho yize kunjalo."
+ "Vula isitoreji esingeziwe nesipele"
+ "Ibhokisi lakho lemeyili ligcwele. Ukuze ukhulule isikhala, vula isitoreji esingeziwe ukuze i-Google ikwazi ukuphatha futhi yenze isipele imilTo free up space, turn on extra storage so Google can manage and backup your voicemail messages."
+ "Vula isitoreji esingeziwe nesipele"
+ "Ibhokisi lakho lemeyili cishe ligcwele. Ukuze ukhulule isikhala, vula isitoreji esingeziwe ukuze i-Google ikwazi ukuphatha nokwenza isipele imilayezo yakho yevoyisimeyili."
"Setha iphini yakho yevoyisimeyili"
"Udinga iphini yevoyisimeyili noma kunini uma wenza ikholi ukufinyelela ivoyisimeyili yakho."
"Iphutha elingaziwa"
diff --git a/java/com/android/dialer/app/voicemail/error/res/values/dimens.xml b/java/com/android/dialer/app/voicemail/error/res/values/dimens.xml
index 20dd40a8f..090311f15 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values/dimens.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values/dimens.xml
@@ -9,4 +9,17 @@
4dp
11dp
4dp
+
+
+ 24dp
+ 16dp
+ 21dp
+ 24dp
+ 12dp
+ 4dp
+ 4dp
+ 11dp
+ 4dp
+ 16sp
+ 14sp
\ No newline at end of file
diff --git a/java/com/android/dialer/app/voicemail/error/res/values/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values/strings.xml
index d14652553..94d3dba11 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values/strings.xml
@@ -54,11 +54,11 @@
Can\'t receive new voicemails
Your inbox is full. Try deleting some messages to receive new voicemail.
- [Experimental] Turn on extra storage and backup
- Your mailbox is full. To free up space, turn on extra storage so Google can manage and backup your voicemail messages. This feature is currently being tested and will potentially delete voicemails from your voicemail server, and we do not promise to support this feature in the future. We would love your feedback though.
+ Turn on extra storage and backup
+ Your mailbox is full. To free up space, turn on extra storage so Google can manage and backup your voicemail messages.
- [Experimental] Turn on extra storage and backup
- Your mailbox is almost full. To free up space, turn on extra storage so Google can manage and backup your voicemail messages. This feature is currently being tested and will potentially delete voicemails from your voicemail server, and we do not promise to support this feature in the future. We would love your feedback though.
+ Turn on extra storage and backup
+ Your mailbox is almost full. To free up space, turn on extra storage so Google can manage and backup your voicemail messages.
Set your voicemail PIN
You\'ll need a voicemail PIN anytime you call to access your voicemail.
diff --git a/java/com/android/dialer/backup/DialerBackupAgent.java b/java/com/android/dialer/backup/DialerBackupAgent.java
index 0841e82e7..27dfc29f4 100644
--- a/java/com/android/dialer/backup/DialerBackupAgent.java
+++ b/java/com/android/dialer/backup/DialerBackupAgent.java
@@ -33,12 +33,11 @@ import android.provider.VoicemailContract;
import android.provider.VoicemailContract.Voicemails;
import android.telecom.PhoneAccountHandle;
import android.util.Pair;
-import com.android.dialer.backup.nano.VoicemailInfo;
import com.android.dialer.common.Assert;
import com.android.dialer.common.ConfigProviderBindings;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
import com.android.dialer.telecom.TelecomUtil;
import java.io.File;
import java.io.IOException;
@@ -59,7 +58,7 @@ public class DialerBackupAgent extends BackupAgent {
// Voicemail Uri Column
public static final String VOICEMAIL_URI = "voicemail_uri";
// Voicemail packages to backup
- public static final String VOICEMAIL_SOURCE_PACKAGE = "com.android.phone";
+ public static final String VOICEMAIL_SOURCE_PACKAGE = "com.google.android.dialer";
private long voicemailsBackedupSoFar = 0;
private long sizeOfVoicemailsBackedupSoFar = 0;
diff --git a/java/com/android/dialer/backup/DialerBackupUtils.java b/java/com/android/dialer/backup/DialerBackupUtils.java
index 410772ff0..17e82e45d 100644
--- a/java/com/android/dialer/backup/DialerBackupUtils.java
+++ b/java/com/android/dialer/backup/DialerBackupUtils.java
@@ -30,16 +30,14 @@ import android.support.annotation.Nullable;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
import android.util.Pair;
-import com.android.dialer.backup.nano.VoicemailInfo;
import com.android.dialer.common.Assert;
import com.android.dialer.common.ConfigProviderBindings;
import com.android.dialer.common.LogUtil;
import com.android.voicemail.VoicemailComponent;
import com.google.common.io.ByteStreams;
import com.google.common.io.Files;
-import com.google.protobuf.nano.MessageNano;
+import com.google.protobuf.ByteString;
import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@@ -66,15 +64,14 @@ public class DialerBackupUtils {
ByteStreams.copy(decodedStream, restoreStream);
}
- public static @Nullable byte[] audioStreamToByteArray(@NonNull InputStream stream)
+ public static @Nullable ByteString audioStreamToByteString(@NonNull InputStream stream)
throws IOException {
- ByteArrayOutputStream buffer = new ByteArrayOutputStream();
if (stream.available() > 0) {
- ByteStreams.copy(stream, buffer);
+ return ByteString.readFrom(stream);
} else {
LogUtil.i("DialerBackupUtils.audioStreamToByteArray", "no audio stream to backup");
}
- return buffer.toByteArray();
+ return ByteString.EMPTY;
}
public static void writeProtoToFile(@NonNull File file, @NonNull VoicemailInfo voicemailInfo)
@@ -83,7 +80,7 @@ public class DialerBackupUtils {
"DialerBackupUtils.writeProtoToFile",
"backup " + voicemailInfo + " to " + file.getAbsolutePath());
- byte[] bytes = MessageNano.toByteArray(voicemailInfo);
+ byte[] bytes = voicemailInfo.toByteArray();
Files.write(bytes, file);
}
@@ -111,7 +108,7 @@ public class DialerBackupUtils {
public static VoicemailInfo convertVoicemailCursorRowToProto(
@NonNull Cursor cursor, @NonNull ContentResolver contentResolver) throws IOException {
- VoicemailInfo voicemailInfo = new VoicemailInfo();
+ VoicemailInfo.Builder voicemailInfo = VoicemailInfo.newBuilder();
for (int i = 0; i < cursor.getColumnCount(); ++i) {
String name = cursor.getColumnName(i);
@@ -126,56 +123,56 @@ public class DialerBackupUtils {
switch (name) {
case Voicemails.DATE:
- voicemailInfo.date = value;
+ voicemailInfo.setDate(value);
break;
case Voicemails.DELETED:
- voicemailInfo.deleted = value;
+ voicemailInfo.setDeleted(value);
break;
case Voicemails.DIRTY:
- voicemailInfo.dirty = value;
+ voicemailInfo.setDirty(value);
break;
case Voicemails.DIR_TYPE:
- voicemailInfo.dirType = value;
+ voicemailInfo.setDirType(value);
break;
case Voicemails.DURATION:
- voicemailInfo.duration = value;
+ voicemailInfo.setDuration(value);
break;
case Voicemails.HAS_CONTENT:
- voicemailInfo.hasContent = value;
+ voicemailInfo.setHasContent(value);
break;
case Voicemails.IS_READ:
- voicemailInfo.isRead = value;
+ voicemailInfo.setIsRead(value);
break;
case Voicemails.ITEM_TYPE:
- voicemailInfo.itemType = value;
+ voicemailInfo.setItemType(value);
break;
case Voicemails.LAST_MODIFIED:
- voicemailInfo.lastModified = value;
+ voicemailInfo.setLastModified(value);
break;
case Voicemails.MIME_TYPE:
- voicemailInfo.mimeType = value;
+ voicemailInfo.setMimeType(value);
break;
case Voicemails.NUMBER:
- voicemailInfo.number = value;
+ voicemailInfo.setNumber(value);
break;
case Voicemails.PHONE_ACCOUNT_COMPONENT_NAME:
- voicemailInfo.phoneAccountComponentName = value;
+ voicemailInfo.setPhoneAccountComponentName(value);
break;
case Voicemails.PHONE_ACCOUNT_ID:
- voicemailInfo.phoneAccountId = value;
+ voicemailInfo.setPhoneAccountId(value);
break;
case Voicemails.SOURCE_DATA:
- voicemailInfo.sourceData = value;
+ voicemailInfo.setSourceData(value);
break;
case Voicemails.SOURCE_PACKAGE:
- voicemailInfo.sourcePackage = value;
+ voicemailInfo.setSourcePackage(value);
break;
case Voicemails.TRANSCRIPTION:
- voicemailInfo.transcription = value;
+ voicemailInfo.setTranscription(value);
break;
case DialerBackupAgent.VOICEMAIL_URI:
try (InputStream audioStream = contentResolver.openInputStream(Uri.parse(value))) {
- voicemailInfo.encodedVoicemailKey = audioStreamToByteArray(audioStream);
+ voicemailInfo.setEncodedVoicemailKey(audioStreamToByteString(audioStream));
}
break;
default:
@@ -187,7 +184,7 @@ public class DialerBackupUtils {
break;
}
}
- return voicemailInfo;
+ return voicemailInfo.build();
}
public static Pair convertVoicemailProtoFileToContentValueAndAudioBytes(
@@ -209,45 +206,45 @@ public class DialerBackupUtils {
} else {
ContentValues contentValues = new ContentValues();
- if (!voicemailInfo.date.isEmpty()) {
- contentValues.put(Voicemails.DATE, voicemailInfo.date);
+ if (voicemailInfo.hasDate()) {
+ contentValues.put(Voicemails.DATE, voicemailInfo.getDate());
}
- if (!voicemailInfo.deleted.isEmpty()) {
- contentValues.put(Voicemails.DELETED, voicemailInfo.deleted);
+ if (voicemailInfo.hasDeleted()) {
+ contentValues.put(Voicemails.DELETED, voicemailInfo.getDeleted());
}
- if (!voicemailInfo.dirty.isEmpty()) {
- contentValues.put(Voicemails.DIRTY, voicemailInfo.dirty);
+ if (!voicemailInfo.hasDirty()) {
+ contentValues.put(Voicemails.DIRTY, voicemailInfo.getDirty());
}
- if (!voicemailInfo.duration.isEmpty()) {
- contentValues.put(Voicemails.DURATION, voicemailInfo.duration);
+ if (!voicemailInfo.hasDuration()) {
+ contentValues.put(Voicemails.DURATION, voicemailInfo.getDuration());
}
- if (!voicemailInfo.isRead.isEmpty()) {
- contentValues.put(Voicemails.IS_READ, voicemailInfo.isRead);
+ if (!voicemailInfo.hasIsRead()) {
+ contentValues.put(Voicemails.IS_READ, voicemailInfo.getIsRead());
}
- if (!voicemailInfo.lastModified.isEmpty()) {
- contentValues.put(Voicemails.LAST_MODIFIED, voicemailInfo.lastModified);
+ if (!voicemailInfo.hasLastModified()) {
+ contentValues.put(Voicemails.LAST_MODIFIED, voicemailInfo.getLastModified());
}
- if (!voicemailInfo.mimeType.isEmpty()) {
- contentValues.put(Voicemails.MIME_TYPE, voicemailInfo.mimeType);
+ if (!voicemailInfo.hasMimeType()) {
+ contentValues.put(Voicemails.MIME_TYPE, voicemailInfo.getMimeType());
}
- if (!voicemailInfo.number.isEmpty()) {
- contentValues.put(Voicemails.NUMBER, voicemailInfo.number);
+ if (!voicemailInfo.hasNumber()) {
+ contentValues.put(Voicemails.NUMBER, voicemailInfo.getNumber());
}
- if (!voicemailInfo.phoneAccountComponentName.isEmpty()) {
+ if (!voicemailInfo.hasPhoneAccountComponentName()) {
contentValues.put(
- Voicemails.PHONE_ACCOUNT_COMPONENT_NAME, voicemailInfo.phoneAccountComponentName);
+ Voicemails.PHONE_ACCOUNT_COMPONENT_NAME, voicemailInfo.getPhoneAccountComponentName());
}
- if (!voicemailInfo.phoneAccountId.isEmpty()) {
- contentValues.put(Voicemails.PHONE_ACCOUNT_ID, voicemailInfo.phoneAccountId);
+ if (!voicemailInfo.hasPhoneAccountId()) {
+ contentValues.put(Voicemails.PHONE_ACCOUNT_ID, voicemailInfo.getPhoneAccountId());
}
- if (!voicemailInfo.sourceData.isEmpty()) {
- contentValues.put(Voicemails.SOURCE_DATA, voicemailInfo.sourceData);
+ if (!voicemailInfo.hasSourceData()) {
+ contentValues.put(Voicemails.SOURCE_DATA, voicemailInfo.getSourceData());
}
- if (!voicemailInfo.sourcePackage.isEmpty()) {
- contentValues.put(Voicemails.SOURCE_PACKAGE, voicemailInfo.sourcePackage);
+ if (!voicemailInfo.hasSourcePackage()) {
+ contentValues.put(Voicemails.SOURCE_PACKAGE, voicemailInfo.getSourcePackage());
}
- if (!voicemailInfo.transcription.isEmpty()) {
- contentValues.put(Voicemails.TRANSCRIPTION, voicemailInfo.transcription);
+ if (!voicemailInfo.hasTranscription()) {
+ contentValues.put(Voicemails.TRANSCRIPTION, voicemailInfo.getTranscription());
}
contentValues.put(VoicemailContract.Voicemails.HAS_CONTENT, 1);
contentValues.put(RESTORED_COLUMN, "1");
@@ -257,7 +254,7 @@ public class DialerBackupUtils {
"DialerBackupUtils.convertVoicemailProtoFileToContentValueAndEncodedAudio",
"cv: " + contentValues);
- return Pair.create(contentValues, voicemailInfo.encodedVoicemailKey);
+ return Pair.create(contentValues, voicemailInfo.getEncodedVoicemailKey().toByteArray());
}
}
@@ -276,7 +273,7 @@ public class DialerBackupUtils {
}
if (ConfigProviderBindings.get(context)
.getBoolean("voicemail_restore_check_archive_for_source_package", true)) {
- if ("1".equals(voicemailInfo.archived)) {
+ if ("1".equals(voicemailInfo.getArchived())) {
LogUtil.i(
"DialerBackupUtils.getSourcePackage",
"voicemail was archived, using app source package");
@@ -312,7 +309,9 @@ public class DialerBackupUtils {
String.format(
"(%s = ? AND %s = ? AND %s = ?)",
Voicemails.NUMBER, Voicemails.DATE, Voicemails.DURATION),
- new String[] {voicemailInfo.number, voicemailInfo.date, voicemailInfo.duration},
+ new String[] {
+ voicemailInfo.getNumber(), voicemailInfo.getDate(), voicemailInfo.getDuration()
+ },
null,
null)) {
if (cursor.moveToFirst()
diff --git a/java/com/android/dialer/backup/nano/VoicemailInfo.java b/java/com/android/dialer/backup/nano/VoicemailInfo.java
deleted file mode 100644
index f11595ec2..000000000
--- a/java/com/android/dialer/backup/nano/VoicemailInfo.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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.
- */
-
-// Generated by the protocol buffer compiler. DO NOT EDIT!
-
-package com.android.dialer.backup.nano;
-
-/** This file is autogenerated, but javadoc required. */
-@SuppressWarnings("hiding")
-public final class VoicemailInfo
- extends com.google.protobuf.nano.ExtendableMessageNano {
-
- private static volatile VoicemailInfo[] _emptyArray;
-
- public static VoicemailInfo[] emptyArray() {
- // Lazily initializes the empty array
- if (_emptyArray == null) {
- synchronized (com.google.protobuf.nano.InternalNano.LAZY_INIT_LOCK) {
- if (_emptyArray == null) {
- _emptyArray = new VoicemailInfo[0];
- }
- }
- }
- return _emptyArray;
- }
-
- // optional string date = 1;
- public java.lang.String date;
-
- // optional string deleted = 2;
- public java.lang.String deleted;
-
- // optional string dirty = 3;
- public java.lang.String dirty;
-
- // optional string dir_type = 4;
- public java.lang.String dirType;
-
- // optional string duration = 5;
- public java.lang.String duration;
-
- // optional string has_content = 6;
- public java.lang.String hasContent;
-
- // optional string is_read = 7;
- public java.lang.String isRead;
-
- // optional string item_type = 8;
- public java.lang.String itemType;
-
- // optional string last_modified = 9;
- public java.lang.String lastModified;
-
- // optional string mime_type = 10;
- public java.lang.String mimeType;
-
- // optional string number = 11;
- public java.lang.String number;
-
- // optional string phone_account_component_name = 12;
- public java.lang.String phoneAccountComponentName;
-
- // optional string phone_account_id = 13;
- public java.lang.String phoneAccountId;
-
- // optional string source_data = 14;
- public java.lang.String sourceData;
-
- // optional string source_package = 15;
- public java.lang.String sourcePackage;
-
- // optional string transcription = 16;
- public java.lang.String transcription;
-
- // optional string voicemail_uri = 17;
- public java.lang.String voicemailUri;
-
- // optional bytes encoded_voicemail_key = 18;
- public byte[] encodedVoicemailKey;
-
- // optional string archived = 19;
- public java.lang.String archived;
-
- // @@protoc_insertion_point(class_scope:com.android.dialer.backup.VoicemailInfo)
-
- public VoicemailInfo() {
- clear();
- }
-
- public VoicemailInfo clear() {
- date = "";
- deleted = "";
- dirty = "";
- dirType = "";
- duration = "";
- hasContent = "";
- isRead = "";
- itemType = "";
- lastModified = "";
- mimeType = "";
- number = "";
- phoneAccountComponentName = "";
- phoneAccountId = "";
- sourceData = "";
- sourcePackage = "";
- transcription = "";
- voicemailUri = "";
- encodedVoicemailKey = com.google.protobuf.nano.WireFormatNano.EMPTY_BYTES;
- archived = "";
- unknownFieldData = null;
- cachedSize = -1;
- return this;
- }
-
- @Override
- public void writeTo(com.google.protobuf.nano.CodedOutputByteBufferNano output)
- throws java.io.IOException {
- if (this.date != null && !this.date.equals("")) {
- output.writeString(1, this.date);
- }
- if (this.deleted != null && !this.deleted.equals("")) {
- output.writeString(2, this.deleted);
- }
- if (this.dirty != null && !this.dirty.equals("")) {
- output.writeString(3, this.dirty);
- }
- if (this.dirType != null && !this.dirType.equals("")) {
- output.writeString(4, this.dirType);
- }
- if (this.duration != null && !this.duration.equals("")) {
- output.writeString(5, this.duration);
- }
- if (this.hasContent != null && !this.hasContent.equals("")) {
- output.writeString(6, this.hasContent);
- }
- if (this.isRead != null && !this.isRead.equals("")) {
- output.writeString(7, this.isRead);
- }
- if (this.itemType != null && !this.itemType.equals("")) {
- output.writeString(8, this.itemType);
- }
- if (this.lastModified != null && !this.lastModified.equals("")) {
- output.writeString(9, this.lastModified);
- }
- if (this.mimeType != null && !this.mimeType.equals("")) {
- output.writeString(10, this.mimeType);
- }
- if (this.number != null && !this.number.equals("")) {
- output.writeString(11, this.number);
- }
- if (this.phoneAccountComponentName != null && !this.phoneAccountComponentName.equals("")) {
- output.writeString(12, this.phoneAccountComponentName);
- }
- if (this.phoneAccountId != null && !this.phoneAccountId.equals("")) {
- output.writeString(13, this.phoneAccountId);
- }
- if (this.sourceData != null && !this.sourceData.equals("")) {
- output.writeString(14, this.sourceData);
- }
- if (this.sourcePackage != null && !this.sourcePackage.equals("")) {
- output.writeString(15, this.sourcePackage);
- }
- if (this.transcription != null && !this.transcription.equals("")) {
- output.writeString(16, this.transcription);
- }
- if (this.voicemailUri != null && !this.voicemailUri.equals("")) {
- output.writeString(17, this.voicemailUri);
- }
- if (!java.util.Arrays.equals(
- this.encodedVoicemailKey, com.google.protobuf.nano.WireFormatNano.EMPTY_BYTES)) {
- output.writeBytes(18, this.encodedVoicemailKey);
- }
- if (this.archived != null && !this.archived.equals("")) {
- output.writeString(19, this.archived);
- }
- super.writeTo(output);
- }
-
- @Override
- protected int computeSerializedSize() {
- int size = super.computeSerializedSize();
- if (this.date != null && !this.date.equals("")) {
- size += com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(1, this.date);
- }
- if (this.deleted != null && !this.deleted.equals("")) {
- size += com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(2, this.deleted);
- }
- if (this.dirty != null && !this.dirty.equals("")) {
- size += com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(3, this.dirty);
- }
- if (this.dirType != null && !this.dirType.equals("")) {
- size += com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(4, this.dirType);
- }
- if (this.duration != null && !this.duration.equals("")) {
- size +=
- com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(5, this.duration);
- }
- if (this.hasContent != null && !this.hasContent.equals("")) {
- size +=
- com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(6, this.hasContent);
- }
- if (this.isRead != null && !this.isRead.equals("")) {
- size += com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(7, this.isRead);
- }
- if (this.itemType != null && !this.itemType.equals("")) {
- size +=
- com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(8, this.itemType);
- }
- if (this.lastModified != null && !this.lastModified.equals("")) {
- size +=
- com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(
- 9, this.lastModified);
- }
- if (this.mimeType != null && !this.mimeType.equals("")) {
- size +=
- com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(10, this.mimeType);
- }
- if (this.number != null && !this.number.equals("")) {
- size += com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(11, this.number);
- }
- if (this.phoneAccountComponentName != null && !this.phoneAccountComponentName.equals("")) {
- size +=
- com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(
- 12, this.phoneAccountComponentName);
- }
- if (this.phoneAccountId != null && !this.phoneAccountId.equals("")) {
- size +=
- com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(
- 13, this.phoneAccountId);
- }
- if (this.sourceData != null && !this.sourceData.equals("")) {
- size +=
- com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(14, this.sourceData);
- }
- if (this.sourcePackage != null && !this.sourcePackage.equals("")) {
- size +=
- com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(
- 15, this.sourcePackage);
- }
- if (this.transcription != null && !this.transcription.equals("")) {
- size +=
- com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(
- 16, this.transcription);
- }
- if (this.voicemailUri != null && !this.voicemailUri.equals("")) {
- size +=
- com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(
- 17, this.voicemailUri);
- }
- if (!java.util.Arrays.equals(
- this.encodedVoicemailKey, com.google.protobuf.nano.WireFormatNano.EMPTY_BYTES)) {
- size +=
- com.google.protobuf.nano.CodedOutputByteBufferNano.computeBytesSize(
- 18, this.encodedVoicemailKey);
- }
- if (this.archived != null && !this.archived.equals("")) {
- size +=
- com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(19, this.archived);
- }
- return size;
- }
-
- @Override
- public VoicemailInfo mergeFrom(com.google.protobuf.nano.CodedInputByteBufferNano input)
- throws java.io.IOException {
- while (true) {
- int tag = input.readTag();
- switch (tag) {
- case 0:
- return this;
- default:
- {
- if (!super.storeUnknownField(input, tag)) {
- return this;
- }
- break;
- }
- case 10:
- {
- this.date = input.readString();
- break;
- }
- case 18:
- {
- this.deleted = input.readString();
- break;
- }
- case 26:
- {
- this.dirty = input.readString();
- break;
- }
- case 34:
- {
- this.dirType = input.readString();
- break;
- }
- case 42:
- {
- this.duration = input.readString();
- break;
- }
- case 50:
- {
- this.hasContent = input.readString();
- break;
- }
- case 58:
- {
- this.isRead = input.readString();
- break;
- }
- case 66:
- {
- this.itemType = input.readString();
- break;
- }
- case 74:
- {
- this.lastModified = input.readString();
- break;
- }
- case 82:
- {
- this.mimeType = input.readString();
- break;
- }
- case 90:
- {
- this.number = input.readString();
- break;
- }
- case 98:
- {
- this.phoneAccountComponentName = input.readString();
- break;
- }
- case 106:
- {
- this.phoneAccountId = input.readString();
- break;
- }
- case 114:
- {
- this.sourceData = input.readString();
- break;
- }
- case 122:
- {
- this.sourcePackage = input.readString();
- break;
- }
- case 130:
- {
- this.transcription = input.readString();
- break;
- }
- case 138:
- {
- this.voicemailUri = input.readString();
- break;
- }
- case 146:
- {
- this.encodedVoicemailKey = input.readBytes();
- break;
- }
- case 154:
- {
- this.archived = input.readString();
- break;
- }
- }
- }
- }
-
- public static VoicemailInfo parseFrom(byte[] data)
- throws com.google.protobuf.nano.InvalidProtocolBufferNanoException {
- return com.google.protobuf.nano.MessageNano.mergeFrom(new VoicemailInfo(), data);
- }
-
- public static VoicemailInfo parseFrom(com.google.protobuf.nano.CodedInputByteBufferNano input)
- throws java.io.IOException {
- return new VoicemailInfo().mergeFrom(input);
- }
-}
diff --git a/java/com/android/dialer/backup/proto/voicemail_info.proto b/java/com/android/dialer/backup/proto/voicemail_info.proto
new file mode 100644
index 000000000..b74cce954
--- /dev/null
+++ b/java/com/android/dialer/backup/proto/voicemail_info.proto
@@ -0,0 +1,30 @@
+syntax = "proto2";
+
+option java_package = "com.android.dialer.backup";
+option java_multiple_files = true;
+option optimize_for = LITE_RUNTIME;
+
+package com.android.dialer.backup;
+
+// Next id: 20
+message VoicemailInfo {
+ optional string date = 1;
+ optional string deleted = 2;
+ optional string dirty = 3;
+ optional string dir_type = 4;
+ optional string duration = 5;
+ optional string has_content = 6;
+ optional string is_read = 7;
+ optional string item_type = 8;
+ optional string last_modified = 9;
+ optional string mime_type = 10;
+ optional string number = 11;
+ optional string phone_account_component_name = 12;
+ optional string phone_account_id = 13;
+ optional string source_data = 14;
+ optional string source_package = 15;
+ optional string transcription = 16;
+ optional string voicemail_uri = 17;
+ optional bytes encoded_voicemail_key = 18;
+ optional string archived = 19;
+}
diff --git a/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java b/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java
index 3a2f3cf9a..595401c70 100644
--- a/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java
+++ b/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java
@@ -17,6 +17,7 @@
package com.android.dialer.binary.aosp;
import com.android.dialer.binary.basecomponent.BaseDialerRootComponent;
+import com.android.dialer.calllog.CallLogModule;
import com.android.dialer.enrichedcall.stub.StubEnrichedCallModule;
import com.android.dialer.inject.ContextModule;
import com.android.dialer.lightbringer.stub.StubLightbringerModule;
@@ -31,6 +32,7 @@ import javax.inject.Singleton;
@Singleton
@Component(
modules = {
+ CallLogModule.class,
ContextModule.class,
SimulatorModule.class,
StubCallLocationModule.class,
diff --git a/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java b/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java
index e8962c248..2deb7fdc4 100644
--- a/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java
+++ b/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java
@@ -16,6 +16,7 @@
package com.android.dialer.binary.basecomponent;
+import com.android.dialer.calllog.CallLogComponent;
import com.android.dialer.enrichedcall.EnrichedCallComponent;
import com.android.dialer.lightbringer.LightbringerComponent;
import com.android.dialer.simulator.SimulatorComponent;
@@ -24,11 +25,12 @@ import com.android.incallui.maps.MapsComponent;
import com.android.voicemail.VoicemailComponent;
/**
- * Base class for the core application-wide {@link Component}. All variants of the Dialer app should
- * extend from this component.
+ * Base class for the core application-wide component. All variants of the Dialer app should extend
+ * from this component.
*/
public interface BaseDialerRootComponent
extends CallLocationComponent.HasComponent,
+ CallLogComponent.HasComponent,
EnrichedCallComponent.HasComponent,
MapsComponent.HasComponent,
SimulatorComponent.HasComponent,
diff --git a/java/com/android/dialer/binary/common/DialerApplication.java b/java/com/android/dialer/binary/common/DialerApplication.java
index 352c4eba9..b4ee75cd4 100644
--- a/java/com/android/dialer/binary/common/DialerApplication.java
+++ b/java/com/android/dialer/binary/common/DialerApplication.java
@@ -23,6 +23,7 @@ import android.support.annotation.NonNull;
import com.android.dialer.blocking.BlockedNumbersAutoMigrator;
import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler;
import com.android.dialer.buildtype.BuildType;
+import com.android.dialer.calllog.CallLogComponent;
import com.android.dialer.common.concurrent.DefaultDialerExecutorFactory;
import com.android.dialer.inject.HasRootComponent;
import com.android.dialer.persistentlog.PersistentLogger;
@@ -44,6 +45,7 @@ public abstract class DialerApplication extends Application implements HasRootCo
new FilteredNumberAsyncQueryHandler(this),
new DefaultDialerExecutorFactory())
.asyncAutoMigrate();
+ CallLogComponent.get(this).callLogFramework().registerContentObservers(getApplicationContext());
PersistentLogger.initialize(this);
Trace.endSection();
}
diff --git a/java/com/android/dialer/blocking/BlockNumberDialogFragment.java b/java/com/android/dialer/blocking/BlockNumberDialogFragment.java
index c405b2fe7..7ef77c4b6 100644
--- a/java/com/android/dialer/blocking/BlockNumberDialogFragment.java
+++ b/java/com/android/dialer/blocking/BlockNumberDialogFragment.java
@@ -33,8 +33,8 @@ import android.widget.Toast;
import com.android.contacts.common.util.ContactDisplayUtils;
import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler.OnBlockNumberListener;
import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler.OnUnblockNumberListener;
+import com.android.dialer.logging.InteractionEvent;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.InteractionEvent;
import com.android.dialer.voicemailstatus.VisualVoicemailEnabledChecker;
/**
diff --git a/java/com/android/dialer/blocking/FilteredNumbersUtil.java b/java/com/android/dialer/blocking/FilteredNumbersUtil.java
index 8908238ea..cbef73ca5 100644
--- a/java/com/android/dialer/blocking/FilteredNumbersUtil.java
+++ b/java/com/android/dialer/blocking/FilteredNumbersUtil.java
@@ -34,8 +34,8 @@ import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler.OnHasBlockedN
import com.android.dialer.common.LogUtil;
import com.android.dialer.database.FilteredNumberContract.FilteredNumber;
import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
+import com.android.dialer.logging.InteractionEvent;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.InteractionEvent;
import com.android.dialer.notification.NotificationChannelManager;
import com.android.dialer.notification.NotificationChannelManager.Channel;
import com.android.dialer.util.PermissionsUtil;
diff --git a/java/com/android/dialer/blocking/res/drawable-hdpi/ic_block_24dp.png b/java/com/android/dialer/blocking/res/drawable-hdpi/ic_block_24dp.png
new file mode 100644
index 000000000..2ccc89d24
Binary files /dev/null and b/java/com/android/dialer/blocking/res/drawable-hdpi/ic_block_24dp.png differ
diff --git a/java/com/android/dialer/blocking/res/drawable-hdpi/ic_report_24dp.png b/java/com/android/dialer/blocking/res/drawable-hdpi/ic_report_24dp.png
new file mode 100644
index 000000000..dc0c995c1
Binary files /dev/null and b/java/com/android/dialer/blocking/res/drawable-hdpi/ic_report_24dp.png differ
diff --git a/java/com/android/dialer/blocking/res/drawable-hdpi/ic_report_white_36dp.png b/java/com/android/dialer/blocking/res/drawable-hdpi/ic_report_white_36dp.png
new file mode 100644
index 000000000..919a872e0
Binary files /dev/null and b/java/com/android/dialer/blocking/res/drawable-hdpi/ic_report_white_36dp.png differ
diff --git a/java/com/android/dialer/blocking/res/values-b+sr+Latn/strings.xml b/java/com/android/dialer/blocking/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 000000000..238dde0bf
--- /dev/null
+++ b/java/com/android/dialer/blocking/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,46 @@
+
+
+
+
+ "Novo, jednostavnije blokiranje"
+ "Telefon treba da promeni način na koji blokiranje funkcioniše da bi vam pružio bolju zaštitu. Sa blokiranih brojeva više nećete primati ni pozive ni SMS-ove, ali možete da ih delite sa drugim aplikacijama."
+ "Dozvoli"
+ "Želite li da blokirate %1$s?"
+ "Pozivi sa ovog broja će biti blokirani i poruke govorne pošte će se automatski brisati."
+ "Pozivi sa ovog broja će biti blokirani, ali pozivalac i dalje može da vam ostavlja poruke govorne pošte."
+ "Više nećete primati pozive ni SMS-ove sa ovog broja."
+ "BLOKIRAJ"
+ "Želite li da deblokirate %1$s?"
+ "DEBLOKIRAJ"
+ "%1$s je nevažeći."
+ "%1$s je blokiran"
+ "%1$s je deblokiran"
+ "OPOZOVI"
+ "Uvoz nije uspeo"
+ "Blokiranje poziva je onemogućeno na 48 sati"
+ "Onemogućeno je zato što je upućen hitan poziv."
+ "Želite li da blokirate %1$s?"
+ "Više nećete primati pozive sa ovog broja."
+ "%1$s Prijavićemo ovaj poziv kao nepoželjan."
+ "Deblokiraćemo broj i prijaviti da nije nepoželjan. Budući pozivi neće biti označavani kao nepoželjni."
+ "Želite li da deblokirate %1$s?"
+ "Prijavi"
+ "Želite da prijavite grešku?"
+ "Budući pozivi sa %1$s više neće biti označavani kao nepoželjni."
+ "Prijavi poziv kao nepoželjan"
+
diff --git a/java/com/android/dialer/callcomposer/CallComposerActivity.java b/java/com/android/dialer/callcomposer/CallComposerActivity.java
index 3c0beb101..e8ca72e97 100644
--- a/java/com/android/dialer/callcomposer/CallComposerActivity.java
+++ b/java/com/android/dialer/callcomposer/CallComposerActivity.java
@@ -25,7 +25,6 @@ import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.net.Uri;
-import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
@@ -50,28 +49,25 @@ import android.widget.RelativeLayout;
import android.widget.TextView;
import com.android.contacts.common.ContactPhotoManager;
import com.android.dialer.callcomposer.CallComposerFragment.CallComposerListener;
-import com.android.dialer.callcomposer.nano.CallComposerContact;
-import com.android.dialer.callcomposer.util.CopyAndResizeImageTask;
-import com.android.dialer.callcomposer.util.CopyAndResizeImageTask.Callback;
+import com.android.dialer.callintent.CallInitiationType;
import com.android.dialer.callintent.CallIntentBuilder;
-import com.android.dialer.callintent.nano.CallInitiationType;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.common.UiUtil;
+import com.android.dialer.common.concurrent.DialerExecutors;
import com.android.dialer.constants.Constants;
import com.android.dialer.enrichedcall.EnrichedCallComponent;
import com.android.dialer.enrichedcall.EnrichedCallManager;
import com.android.dialer.enrichedcall.EnrichedCallManager.State;
import com.android.dialer.enrichedcall.Session;
import com.android.dialer.enrichedcall.extensions.StateExtension;
+import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
import com.android.dialer.multimedia.MultimediaData;
-import com.android.dialer.protos.ProtoParsers;
import com.android.dialer.telecom.TelecomUtil;
import com.android.dialer.util.ViewUtil;
import com.android.dialer.widget.DialerToolbar;
-import com.google.protobuf.nano.InvalidProtocolBufferNanoException;
+import com.google.protobuf.InvalidProtocolBufferException;
import java.io.File;
/**
@@ -133,7 +129,7 @@ public class CallComposerActivity extends AppCompatActivity
public static Intent newIntent(Context context, CallComposerContact contact) {
Intent intent = new Intent(context, CallComposerActivity.class);
- ProtoParsers.put(intent, ARG_CALL_COMPOSER_CONTACT, contact);
+ intent.putExtra(ARG_CALL_COMPOSER_CONTACT, contact.toByteArray());
return intent;
}
@@ -195,7 +191,7 @@ public class CallComposerActivity extends AppCompatActivity
runEntranceAnimation();
});
- setMediaIconSelected(0);
+ setMediaIconSelected(currentIndex);
}
@Override
@@ -204,11 +200,11 @@ public class CallComposerActivity extends AppCompatActivity
getEnrichedCallManager().registerStateChangedListener(this);
if (sessionId == Session.NO_SESSION_ID) {
LogUtil.i("CallComposerActivity.onResume", "creating new session");
- sessionId = getEnrichedCallManager().startCallComposerSession(contact.number);
+ sessionId = getEnrichedCallManager().startCallComposerSession(contact.getNumber());
} else if (getEnrichedCallManager().getSession(sessionId) == null) {
LogUtil.i(
"CallComposerActivity.onResume", "session closed while activity paused, creating new");
- sessionId = getEnrichedCallManager().startCallComposerSession(contact.number);
+ sessionId = getEnrichedCallManager().startCallComposerSession(contact.getNumber());
} else {
LogUtil.i("CallComposerActivity.onResume", "session still open, using old");
}
@@ -294,29 +290,28 @@ public class CallComposerActivity extends AppCompatActivity
GalleryComposerFragment galleryComposerFragment = (GalleryComposerFragment) fragment;
// If the current data is not a copy, make one.
if (!galleryComposerFragment.selectedDataIsCopy()) {
- new CopyAndResizeImageTask(
- CallComposerActivity.this,
- galleryComposerFragment.getGalleryData().getFileUri(),
- new Callback() {
- @Override
- public void onCopySuccessful(File file, String mimeType) {
- Uri shareableUri =
- FileProvider.getUriForFile(
- CallComposerActivity.this,
- Constants.get().getFileProviderAuthority(),
- file);
-
- builder.setImage(grantUriPermission(shareableUri), mimeType);
- placeRCSCall(builder);
- }
-
- @Override
- public void onCopyFailed(Throwable throwable) {
- // TODO(b/34279096) - gracefully handle message failure
- LogUtil.e("CallComposerActivity.onCopyFailed", "copy Failed", throwable);
- }
+ DialerExecutors.createUiTaskBuilder(
+ getFragmentManager(),
+ "copyAndResizeImageToSend",
+ new CopyAndResizeImageWorker(this.getApplicationContext()))
+ .onSuccess(
+ output -> {
+ Uri shareableUri =
+ FileProvider.getUriForFile(
+ CallComposerActivity.this,
+ Constants.get().getFileProviderAuthority(),
+ output.first);
+
+ builder.setImage(grantUriPermission(shareableUri), output.second);
+ placeRCSCall(builder);
+ })
+ .onFailure(
+ throwable -> {
+ // TODO(b/34279096) - gracefully handle message failure
+ LogUtil.e("CallComposerActivity.onCopyFailed", "copy Failed", throwable);
})
- .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ .build()
+ .executeParallel(galleryComposerFragment.getGalleryData().getFileUri());
} else {
Uri shareableUri =
FileProvider.getUriForFile(
@@ -355,7 +350,8 @@ public class CallComposerActivity extends AppCompatActivity
Logger.get(this).logImpression(DialerImpression.Type.CALL_COMPOSER_ACTIVITY_PLACE_RCS_CALL);
getEnrichedCallManager().sendCallComposerData(sessionId, builder.build());
TelecomUtil.placeCall(
- this, new CallIntentBuilder(contact.number, CallInitiationType.Type.CALL_COMPOSER).build());
+ this,
+ new CallIntentBuilder(contact.getNumber(), CallInitiationType.Type.CALL_COMPOSER).build());
setResult(RESULT_OK);
finish();
}
@@ -461,13 +457,15 @@ public class CallComposerActivity extends AppCompatActivity
byte[] bytes = Base64.decode(arguments.getString(ARG_CALL_COMPOSER_CONTACT), Base64.DEFAULT);
try {
contact = CallComposerContact.parseFrom(bytes);
- } catch (InvalidProtocolBufferNanoException e) {
+ } catch (InvalidProtocolBufferException e) {
Assert.fail(e.toString());
}
} else {
- contact =
- ProtoParsers.getFromInstanceState(
- arguments, ARG_CALL_COMPOSER_CONTACT, new CallComposerContact());
+ try {
+ contact = CallComposerContact.parseFrom(arguments.getByteArray(ARG_CALL_COMPOSER_CONTACT));
+ } catch (InvalidProtocolBufferException e) {
+ throw Assert.createIllegalStateFailException(e.toString());
+ }
}
updateContactInfo();
}
@@ -480,22 +478,24 @@ public class CallComposerActivity extends AppCompatActivity
/** Populates the contact info fields based on the current contact information. */
private void updateContactInfo() {
ContactPhotoManager.getInstance(this)
- .loadDialerThumbnail(
+ .loadDialerThumbnailOrPhoto(
contactPhoto,
- contact.contactUri == null ? null : Uri.parse(contact.contactUri),
- contact.photoId,
- contact.nameOrNumber,
- contact.contactType);
-
- nameView.setText(contact.nameOrNumber);
- toolbar.setTitle(contact.nameOrNumber);
- if (!TextUtils.isEmpty(contact.numberLabel) && !TextUtils.isEmpty(contact.displayNumber)) {
+ contact.hasContactUri() ? Uri.parse(contact.getContactUri()) : null,
+ contact.getPhotoId(),
+ contact.hasPhotoUri() ? Uri.parse(contact.getPhotoUri()) : null,
+ contact.getNameOrNumber(),
+ contact.getContactType());
+
+ nameView.setText(contact.getNameOrNumber());
+ toolbar.setTitle(contact.getNameOrNumber());
+ if (!TextUtils.isEmpty(contact.getNumberLabel())
+ && !TextUtils.isEmpty(contact.getDisplayNumber())) {
numberView.setVisibility(View.VISIBLE);
String secondaryInfo =
getString(
com.android.contacts.common.R.string.call_subject_type_and_number,
- contact.numberLabel,
- contact.displayNumber);
+ contact.getNumberLabel(),
+ contact.getDisplayNumber());
numberView.setText(secondaryInfo);
toolbar.setSubtitle(secondaryInfo);
} else {
@@ -663,7 +663,8 @@ public class CallComposerActivity extends AppCompatActivity
}
private void setFailedResultAndFinish() {
- setResult(RESULT_FIRST_USER, new Intent().putExtra(KEY_CONTACT_NAME, contact.nameOrNumber));
+ setResult(
+ RESULT_FIRST_USER, new Intent().putExtra(KEY_CONTACT_NAME, contact.getNameOrNumber()));
finish();
}
diff --git a/java/com/android/dialer/callcomposer/CameraComposerFragment.java b/java/com/android/dialer/callcomposer/CameraComposerFragment.java
index ceefc068e..f65207fa3 100644
--- a/java/com/android/dialer/callcomposer/CameraComposerFragment.java
+++ b/java/com/android/dialer/callcomposer/CameraComposerFragment.java
@@ -48,8 +48,8 @@ import com.android.dialer.callcomposer.camera.camerafocus.RenderOverlay;
import com.android.dialer.callcomposer.cameraui.CameraMediaChooserView;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
import com.android.dialer.util.PermissionsUtil;
/** Fragment used to compose call with image from the user's camera. */
diff --git a/java/com/android/dialer/callcomposer/CopyAndResizeImageWorker.java b/java/com/android/dialer/callcomposer/CopyAndResizeImageWorker.java
new file mode 100644
index 000000000..aeb8e0388
--- /dev/null
+++ b/java/com/android/dialer/callcomposer/CopyAndResizeImageWorker.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2016 The Android Open Source 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.callcomposer;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.CompressFormat;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.os.Build.VERSION_CODES;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.util.Pair;
+import com.android.dialer.callcomposer.util.BitmapResizer;
+import com.android.dialer.common.Assert;
+import com.android.dialer.common.concurrent.DialerExecutor.Worker;
+import com.android.dialer.util.DialerUtils;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/** Task for copying and resizing images to be shared with RCS process. */
+@TargetApi(VERSION_CODES.M)
+class CopyAndResizeImageWorker implements Worker> {
+ private static final String MIME_TYPE = "image/jpeg";
+
+ private final Context context;
+
+ CopyAndResizeImageWorker(@NonNull Context context) {
+ this.context = Assert.isNotNull(context);
+ }
+
+ /**
+ * @param input The input Uri is expected to be a image openable by {@link
+ * android.content.ContentResolver#openInputStream(Uri)}.
+ * @return a Pair where the File contains the resized image, and the String is the result File's
+ * MIME type.
+ */
+ @Nullable
+ @Override
+ public Pair doInBackground(@Nullable Uri input) throws Throwable {
+ try (InputStream inputStream = context.getContentResolver().openInputStream(input)) {
+ Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
+ bitmap = BitmapResizer.resizeForEnrichedCalling(bitmap);
+
+ File outputFile = DialerUtils.createShareableFile(context);
+ try (OutputStream outputStream = new FileOutputStream(outputFile)) {
+ // Encode images to jpeg as it is better for camera pictures which we expect to be sending
+ bitmap.compress(CompressFormat.JPEG, 80, outputStream);
+ return new Pair<>(outputFile, MIME_TYPE);
+ }
+ }
+ }
+}
diff --git a/java/com/android/dialer/callcomposer/GalleryComposerFragment.java b/java/com/android/dialer/callcomposer/GalleryComposerFragment.java
index 1d684a2d3..01e067440 100644
--- a/java/com/android/dialer/callcomposer/GalleryComposerFragment.java
+++ b/java/com/android/dialer/callcomposer/GalleryComposerFragment.java
@@ -28,6 +28,7 @@ import android.os.Parcelable;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
+import android.support.annotation.VisibleForTesting;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.CursorLoader;
@@ -39,13 +40,14 @@ import android.view.ViewGroup;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
-import com.android.dialer.callcomposer.util.CopyAndResizeImageTask;
-import com.android.dialer.callcomposer.util.CopyAndResizeImageTask.Callback;
+import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.common.concurrent.DefaultDialerExecutorFactory;
+import com.android.dialer.common.concurrent.DialerExecutor;
+import com.android.dialer.common.concurrent.DialerExecutorFactory;
+import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
import com.android.dialer.util.PermissionsUtil;
-import java.io.File;
import java.util.ArrayList;
import java.util.List;
@@ -60,6 +62,8 @@ public class GalleryComposerFragment extends CallComposerFragment
private static final int RESULT_LOAD_IMAGE = 1;
private static final int RESULT_OPEN_SETTINGS = 2;
+ private DialerExecutorFactory executorFactory = new DefaultDialerExecutorFactory();
+
private GalleryGridAdapter adapter;
private GridView galleryGridView;
private View permissionView;
@@ -71,10 +75,17 @@ public class GalleryComposerFragment extends CallComposerFragment
private boolean selectedDataIsCopy;
private List insertedImages = new ArrayList<>();
+ private DialerExecutor copyAndResizeImage;
+
public static GalleryComposerFragment newInstance() {
return new GalleryComposerFragment();
}
+ @VisibleForTesting
+ void setExecutorFactory(@NonNull DialerExecutorFactory executorFactory) {
+ this.executorFactory = Assert.isNotNull(executorFactory);
+ }
+
@Nullable
@Override
public View onCreateView(
@@ -107,6 +118,32 @@ public class GalleryComposerFragment extends CallComposerFragment
return view;
}
+ @Override
+ public void onActivityCreated(@Nullable Bundle bundle) {
+ super.onActivityCreated(bundle);
+
+ copyAndResizeImage =
+ executorFactory
+ .createUiTaskBuilder(
+ getActivity().getFragmentManager(),
+ "copyAndResizeImage",
+ new CopyAndResizeImageWorker(getActivity().getApplicationContext()))
+ .onSuccess(
+ output -> {
+ GalleryGridItemData data1 =
+ adapter.insertEntry(output.first.getAbsolutePath(), output.second);
+ insertedImages.add(0, data1);
+ setSelected(data1, true);
+ })
+ .onFailure(
+ throwable -> {
+ // TODO(b/34279096) - gracefully handle message failure
+ LogUtil.e(
+ "GalleryComposerFragment.onFailure", "data preparation failed", throwable);
+ })
+ .build();
+ }
+
private void setupGallery() {
adapter = new GalleryGridAdapter(getContext(), null, this);
galleryGridView.setAdapter(adapter);
@@ -264,25 +301,7 @@ public class GalleryComposerFragment extends CallComposerFragment
// This should never happen, but just in case..
// Guard against null uri cases for when the activity returns a null/invalid intent.
if (url != null) {
- new CopyAndResizeImageTask(
- getContext(),
- Uri.parse(url),
- new Callback() {
- @Override
- public void onCopySuccessful(File file, String mimeType) {
- GalleryGridItemData data = adapter.insertEntry(file.getAbsolutePath(), mimeType);
- insertedImages.add(0, data);
- setSelected(data, true);
- }
-
- @Override
- public void onCopyFailed(Throwable throwable) {
- // TODO(b/34279096) - gracefully handle message failure
- LogUtil.e(
- "GalleryComposerFragment.onFailure", "Data preparation failed", throwable);
- }
- })
- .execute();
+ copyAndResizeImage.executeParallel(Uri.parse(url));
} else {
// TODO(b/34279096) - gracefully handle message failure
}
diff --git a/java/com/android/dialer/callcomposer/camera/ImagePersistTask.java b/java/com/android/dialer/callcomposer/camera/ImagePersistTask.java
index 80921cdd8..31751e536 100644
--- a/java/com/android/dialer/callcomposer/camera/ImagePersistTask.java
+++ b/java/com/android/dialer/callcomposer/camera/ImagePersistTask.java
@@ -27,7 +27,7 @@ import android.os.Build.VERSION_CODES;
import android.support.v4.content.FileProvider;
import com.android.dialer.callcomposer.camera.exif.ExifInterface;
import com.android.dialer.callcomposer.camera.exif.ExifTag;
-import com.android.dialer.callcomposer.util.CopyAndResizeImageTask;
+import com.android.dialer.callcomposer.util.BitmapResizer;
import com.android.dialer.common.Assert;
import com.android.dialer.common.concurrent.FallibleAsyncTask;
import com.android.dialer.constants.Constants;
@@ -75,7 +75,7 @@ public class ImagePersistTask extends FallibleAsyncTask {
writeClippedBitmap(outputStream);
} else {
Bitmap bitmap = BitmapFactory.decodeByteArray(mBytes, 0, mBytes.length);
- bitmap = CopyAndResizeImageTask.resizeForEnrichedCalling(bitmap);
+ bitmap = BitmapResizer.resizeForEnrichedCalling(bitmap);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream);
}
}
@@ -131,7 +131,7 @@ public class ImagePersistTask extends FallibleAsyncTask {
matrix.postTranslate(-offsetLeft, -offsetTop);
clippedBitmapCanvas.drawBitmap(bitmap, matrix, null /* paint */);
clippedBitmapCanvas.save();
- clippedBitmap = CopyAndResizeImageTask.resizeForEnrichedCalling(clippedBitmap);
+ clippedBitmap = BitmapResizer.resizeForEnrichedCalling(clippedBitmap);
// EXIF data can take a big chunk of the file size and is often cleared by the
// carrier, only store orientation since that's critical
final ExifTag orientationTag = exifInterface.getTag(ExifInterface.TAG_ORIENTATION);
diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-b+sr+Latn/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 000000000..aad8d9dd8
--- /dev/null
+++ b/java/com/android/dialer/callcomposer/cameraui/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,11 @@
+
+
+ "Pređite na prikaz kamere preko celog ekrana"
+ "Dugme sad aktivira prednju kameru"
+ "Dugme sad aktivira zadnju kameru"
+ "Zaustavite snimanje videa"
+ "Koristimo prednju kameru"
+ "Koristimo zadnju kameru"
+ "Snimite sliku"
+
diff --git a/java/com/android/dialer/callcomposer/nano/CallComposerContact.java b/java/com/android/dialer/callcomposer/nano/CallComposerContact.java
deleted file mode 100644
index dcda571e2..000000000
--- a/java/com/android/dialer/callcomposer/nano/CallComposerContact.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source 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.
- */
-
-// Generated by the protocol buffer compiler. DO NOT EDIT!
-
-package com.android.dialer.callcomposer.nano;
-
-/** This file is autogenerated, but javadoc required. */
-@SuppressWarnings("hiding")
-public final class CallComposerContact
- extends com.google.protobuf.nano.ExtendableMessageNano {
-
- private static volatile CallComposerContact[] _emptyArray;
- public static CallComposerContact[] emptyArray() {
- // Lazily initializes the empty array
- if (_emptyArray == null) {
- synchronized (com.google.protobuf.nano.InternalNano.LAZY_INIT_LOCK) {
- if (_emptyArray == null) {
- _emptyArray = new CallComposerContact[0];
- }
- }
- }
- return _emptyArray;
- }
-
- // optional fixed64 photo_id = 1;
- public long photoId;
-
- // optional string photo_uri = 2;
- public java.lang.String photoUri;
-
- // optional string contact_uri = 3;
- public java.lang.String contactUri;
-
- // optional string name_or_number = 4;
- public java.lang.String nameOrNumber;
-
- // optional string number = 6;
- public java.lang.String number;
-
- // optional string display_number = 7;
- public java.lang.String displayNumber;
-
- // optional string number_label = 8;
- public java.lang.String numberLabel;
-
- // optional int32 contact_type = 9;
- public int contactType;
-
- // @@protoc_insertion_point(class_scope:com.android.dialer.callcomposer.CallComposerContact)
-
- public CallComposerContact() {
- clear();
- }
-
- public CallComposerContact clear() {
- photoId = 0L;
- photoUri = "";
- contactUri = "";
- nameOrNumber = "";
- number = "";
- displayNumber = "";
- numberLabel = "";
- contactType = 0;
- unknownFieldData = null;
- cachedSize = -1;
- return this;
- }
-
- @Override
- public void writeTo(com.google.protobuf.nano.CodedOutputByteBufferNano output)
- throws java.io.IOException {
- if (this.photoId != 0L) {
- output.writeFixed64(1, this.photoId);
- }
- if (this.photoUri != null && !this.photoUri.equals("")) {
- output.writeString(2, this.photoUri);
- }
- if (this.contactUri != null && !this.contactUri.equals("")) {
- output.writeString(3, this.contactUri);
- }
- if (this.nameOrNumber != null && !this.nameOrNumber.equals("")) {
- output.writeString(4, this.nameOrNumber);
- }
- if (this.number != null && !this.number.equals("")) {
- output.writeString(6, this.number);
- }
- if (this.displayNumber != null && !this.displayNumber.equals("")) {
- output.writeString(7, this.displayNumber);
- }
- if (this.numberLabel != null && !this.numberLabel.equals("")) {
- output.writeString(8, this.numberLabel);
- }
- if (this.contactType != 0) {
- output.writeInt32(9, this.contactType);
- }
- super.writeTo(output);
- }
-
- @Override
- protected int computeSerializedSize() {
- int size = super.computeSerializedSize();
- if (this.photoId != 0L) {
- size +=
- com.google.protobuf.nano.CodedOutputByteBufferNano.computeFixed64Size(1, this.photoId);
- }
- if (this.photoUri != null && !this.photoUri.equals("")) {
- size +=
- com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(2, this.photoUri);
- }
- if (this.contactUri != null && !this.contactUri.equals("")) {
- size +=
- com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(3, this.contactUri);
- }
- if (this.nameOrNumber != null && !this.nameOrNumber.equals("")) {
- size +=
- com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(
- 4, this.nameOrNumber);
- }
- if (this.number != null && !this.number.equals("")) {
- size += com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(6, this.number);
- }
- if (this.displayNumber != null && !this.displayNumber.equals("")) {
- size +=
- com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(
- 7, this.displayNumber);
- }
- if (this.numberLabel != null && !this.numberLabel.equals("")) {
- size +=
- com.google.protobuf.nano.CodedOutputByteBufferNano.computeStringSize(8, this.numberLabel);
- }
- if (this.contactType != 0) {
- size +=
- com.google.protobuf.nano.CodedOutputByteBufferNano.computeInt32Size(9, this.contactType);
- }
- return size;
- }
-
- @Override
- public CallComposerContact mergeFrom(com.google.protobuf.nano.CodedInputByteBufferNano input)
- throws java.io.IOException {
- while (true) {
- int tag = input.readTag();
- switch (tag) {
- case 0:
- return this;
- default:
- {
- if (!super.storeUnknownField(input, tag)) {
- return this;
- }
- break;
- }
- case 9:
- {
- this.photoId = input.readFixed64();
- break;
- }
- case 18:
- {
- this.photoUri = input.readString();
- break;
- }
- case 26:
- {
- this.contactUri = input.readString();
- break;
- }
- case 34:
- {
- this.nameOrNumber = input.readString();
- break;
- }
- case 50:
- {
- this.number = input.readString();
- break;
- }
- case 58:
- {
- this.displayNumber = input.readString();
- break;
- }
- case 66:
- {
- this.numberLabel = input.readString();
- break;
- }
- case 72:
- {
- this.contactType = input.readInt32();
- break;
- }
- }
- }
- }
-
- public static CallComposerContact parseFrom(byte[] data)
- throws com.google.protobuf.nano.InvalidProtocolBufferNanoException {
- return com.google.protobuf.nano.MessageNano.mergeFrom(new CallComposerContact(), data);
- }
-
- public static CallComposerContact parseFrom(
- com.google.protobuf.nano.CodedInputByteBufferNano input) throws java.io.IOException {
- return new CallComposerContact().mergeFrom(input);
- }
-}
diff --git a/java/com/android/dialer/callcomposer/proto/call_composer_contact.proto b/java/com/android/dialer/callcomposer/proto/call_composer_contact.proto
new file mode 100644
index 000000000..99766aac5
--- /dev/null
+++ b/java/com/android/dialer/callcomposer/proto/call_composer_contact.proto
@@ -0,0 +1,18 @@
+syntax = "proto2";
+
+option java_package = "com.android.dialer.callcomposer";
+option java_multiple_files = true;
+option optimize_for = LITE_RUNTIME;
+
+package com.android.dialer.callcomposer;
+
+message CallComposerContact {
+ optional fixed64 photo_id = 1;
+ optional string photo_uri = 2;
+ optional string contact_uri = 3;
+ optional string name_or_number = 4;
+ optional string number = 6;
+ optional string display_number = 7;
+ optional string number_label = 8;
+ optional int32 contact_type = 9;
+}
diff --git a/java/com/android/dialer/callcomposer/res/values-b+sr+Latn/strings.xml b/java/com/android/dialer/callcomposer/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 000000000..c357d506f
--- /dev/null
+++ b/java/com/android/dialer/callcomposer/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,33 @@
+
+
+
+
+ "Hitno je! Javi se!"
+ "Želiš da ćaskaš?"
+ "Kratko pitanje…"
+ "Napišite prilagođenu poruku"
+ "Pošalji i pozovi"
+ "Deli i pozovi"
+ "slika, %1$tB %1$te %1$tY %1$tl %1$tM %1$tp"
+ "slika"
+ "Slikajte"
+ "Učitavanje slike sa kamere nije uspelo"
+ "Dozvoli"
+ "Odobrite pristup Kameri da biste snimili sliku"
+ "Odobrite pristup Medijima da biste delili sliku"
+
diff --git a/java/com/android/dialer/callcomposer/util/BitmapResizer.java b/java/com/android/dialer/callcomposer/util/BitmapResizer.java
new file mode 100644
index 000000000..658462def
--- /dev/null
+++ b/java/com/android/dialer/callcomposer/util/BitmapResizer.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2017 The Android Open Source 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.callcomposer.util;
+
+import android.graphics.Bitmap;
+import android.support.annotation.VisibleForTesting;
+import com.android.dialer.common.Assert;
+import com.android.dialer.common.LogUtil;
+
+/** Utility class for resizing images before sending them as enriched call attachments. */
+public final class BitmapResizer {
+ @VisibleForTesting static final int MAX_OUTPUT_RESOLUTION = 640;
+
+ /**
+ * Returns a bitmap that is a resized version of the parameter image. The image will only be
+ * resized down and sized to be appropriate for an enriched call.
+ */
+ public static Bitmap resizeForEnrichedCalling(Bitmap image) {
+ Assert.isWorkerThread();
+
+ int width = image.getWidth();
+ int height = image.getHeight();
+
+ LogUtil.i(
+ "BitmapResizer.resizeForEnrichedCalling", "starting height: %d, width: %d", height, width);
+
+ if (width <= MAX_OUTPUT_RESOLUTION && height <= MAX_OUTPUT_RESOLUTION) {
+ LogUtil.i("BitmapResizer.resizeForEnrichedCalling", "no resizing needed");
+ return image;
+ }
+
+ if (width > height) {
+ // landscape
+ float ratio = width / (float) MAX_OUTPUT_RESOLUTION;
+ width = MAX_OUTPUT_RESOLUTION;
+ height = (int) (height / ratio);
+ } else if (height > width) {
+ // portrait
+ float ratio = height / (float) MAX_OUTPUT_RESOLUTION;
+ height = MAX_OUTPUT_RESOLUTION;
+ width = (int) (width / ratio);
+ } else {
+ // square
+ height = MAX_OUTPUT_RESOLUTION;
+ width = MAX_OUTPUT_RESOLUTION;
+ }
+
+ LogUtil.i(
+ "BitmapResizer.resizeForEnrichedCalling", "ending height: %d, width: %d", height, width);
+
+ return Bitmap.createScaledBitmap(image, width, height, true);
+ }
+}
diff --git a/java/com/android/dialer/callcomposer/util/CopyAndResizeImageTask.java b/java/com/android/dialer/callcomposer/util/CopyAndResizeImageTask.java
deleted file mode 100644
index 81511d274..000000000
--- a/java/com/android/dialer/callcomposer/util/CopyAndResizeImageTask.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source 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.callcomposer.util;
-
-import android.annotation.TargetApi;
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Bitmap.CompressFormat;
-import android.graphics.BitmapFactory;
-import android.net.Uri;
-import android.os.Build.VERSION_CODES;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import com.android.dialer.common.Assert;
-import com.android.dialer.common.LogUtil;
-import com.android.dialer.common.concurrent.FallibleAsyncTask;
-import com.android.dialer.util.DialerUtils;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.OutputStream;
-
-/** Task for copying and resizing images to be shared with RCS process. */
-@TargetApi(VERSION_CODES.M)
-public class CopyAndResizeImageTask extends FallibleAsyncTask {
- public static final int MAX_OUTPUT_RESOLUTION = 640;
- private static final String MIME_TYPE = "image/jpeg";
-
- private final Context context;
- private final Uri uri;
- private final Callback callback;
-
- public CopyAndResizeImageTask(
- @NonNull Context context, @NonNull Uri uri, @NonNull Callback callback) {
- this.context = Assert.isNotNull(context);
- this.uri = Assert.isNotNull(uri);
- this.callback = Assert.isNotNull(callback);
- }
-
- @Nullable
- @Override
- protected File doInBackgroundFallible(Void... params) throws Throwable {
- Bitmap bitmap = BitmapFactory.decodeStream(context.getContentResolver().openInputStream(uri));
- bitmap = resizeForEnrichedCalling(bitmap);
-
- File outputFile = DialerUtils.createShareableFile(context);
- try (OutputStream outputStream = new FileOutputStream(outputFile)) {
- // Encode images to jpeg as it is better for camera pictures which we expect to be sending
- bitmap.compress(CompressFormat.JPEG, 80, outputStream);
- return outputFile;
- }
- }
-
- @Override
- protected void onPostExecute(FallibleTaskResult result) {
- if (result.isFailure()) {
- callback.onCopyFailed(result.getThrowable());
- } else {
- callback.onCopySuccessful(result.getResult(), MIME_TYPE);
- }
- }
-
- public static Bitmap resizeForEnrichedCalling(Bitmap image) {
- Assert.isWorkerThread();
-
- int width = image.getWidth();
- int height = image.getHeight();
-
- LogUtil.i(
- "CopyAndResizeImageTask.resizeForEnrichedCalling",
- "starting height: %d, width: %d",
- height,
- width);
-
- if (width <= MAX_OUTPUT_RESOLUTION && height <= MAX_OUTPUT_RESOLUTION) {
- LogUtil.i("CopyAndResizeImageTask.resizeForEnrichedCalling", "no resizing needed");
- return image;
- }
-
- if (width > height) {
- // landscape
- float ratio = width / (float) MAX_OUTPUT_RESOLUTION;
- width = MAX_OUTPUT_RESOLUTION;
- height = (int) (height / ratio);
- } else if (height > width) {
- // portrait
- float ratio = height / (float) MAX_OUTPUT_RESOLUTION;
- height = MAX_OUTPUT_RESOLUTION;
- width = (int) (width / ratio);
- } else {
- // square
- height = MAX_OUTPUT_RESOLUTION;
- width = MAX_OUTPUT_RESOLUTION;
- }
-
- LogUtil.i(
- "CopyAndResizeImageTask.resizeForEnrichedCalling",
- "ending height: %d, width: %d",
- height,
- width);
-
- return Bitmap.createScaledBitmap(image, width, height, true);
- }
-
- /** Callback for callers to know when the task has finished */
- public interface Callback {
- void onCopySuccessful(File file, String mimeType);
-
- void onCopyFailed(Throwable throwable);
- }
-}
diff --git a/java/com/android/dialer/calldetails/CallDetailsActivity.java b/java/com/android/dialer/calldetails/CallDetailsActivity.java
index 757c6eed2..41d176562 100644
--- a/java/com/android/dialer/calldetails/CallDetailsActivity.java
+++ b/java/com/android/dialer/calldetails/CallDetailsActivity.java
@@ -29,14 +29,14 @@ import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.support.v7.widget.Toolbar.OnMenuItemClickListener;
import android.view.MenuItem;
-import com.android.dialer.callcomposer.nano.CallComposerContact;
-import com.android.dialer.calldetails.nano.CallDetailsEntries;
-import com.android.dialer.calldetails.nano.CallDetailsEntries.CallDetailsEntry;
+import com.android.dialer.callcomposer.CallComposerContact;
+import com.android.dialer.calldetails.CallDetailsEntries.CallDetailsEntry;
import com.android.dialer.common.Assert;
import com.android.dialer.common.concurrent.AsyncTaskExecutors;
+import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
-import com.android.dialer.protos.ProtoParsers;
+import com.google.protobuf.InvalidProtocolBufferException;
+import java.util.List;
/** Displays the details of a specific call log entry. */
public class CallDetailsActivity extends AppCompatActivity implements OnMenuItemClickListener {
@@ -45,7 +45,7 @@ public class CallDetailsActivity extends AppCompatActivity implements OnMenuItem
private static final String EXTRA_CONTACT = "contact";
private static final String TASK_DELETE = "task_delete";
- private CallDetailsEntry[] entries;
+ private List entries;
public static Intent newInstance(
Context context, @NonNull CallDetailsEntries details, @NonNull CallComposerContact contact) {
@@ -53,8 +53,8 @@ public class CallDetailsActivity extends AppCompatActivity implements OnMenuItem
Assert.isNotNull(contact);
Intent intent = new Intent(context, CallDetailsActivity.class);
- ProtoParsers.put(intent, EXTRA_CONTACT, contact);
- ProtoParsers.put(intent, EXTRA_CALL_DETAILS_ENTRIES, details);
+ intent.putExtra(EXTRA_CONTACT, contact.toByteArray());
+ intent.putExtra(EXTRA_CALL_DETAILS_ENTRIES, details.toByteArray());
return intent;
}
@@ -77,12 +77,15 @@ public class CallDetailsActivity extends AppCompatActivity implements OnMenuItem
private void onHandleIntent(Intent intent) {
Bundle arguments = intent.getExtras();
- CallComposerContact contact =
- ProtoParsers.getFromInstanceState(arguments, EXTRA_CONTACT, new CallComposerContact());
- entries =
- ProtoParsers.getFromInstanceState(
- arguments, EXTRA_CALL_DETAILS_ENTRIES, new CallDetailsEntries())
- .entries;
+ CallComposerContact contact = CallComposerContact.getDefaultInstance();
+ try {
+ contact = CallComposerContact.parseFrom(arguments.getByteArray(EXTRA_CONTACT));
+ entries =
+ CallDetailsEntries.parseFrom(arguments.getByteArray(EXTRA_CALL_DETAILS_ENTRIES))
+ .getEntriesList();
+ } catch (InvalidProtocolBufferException e) {
+ throw Assert.createIllegalStateFailException(e.toString());
+ }
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(new CallDetailsAdapter(this, contact, entries));
@@ -110,7 +113,7 @@ public class CallDetailsActivity extends AppCompatActivity implements OnMenuItem
if (callIds.length() != 0) {
callIds.append(",");
}
- callIds.append(entry.callId);
+ callIds.append(entry.getCallId());
}
this.callIds = callIds.toString();
}
diff --git a/java/com/android/dialer/calldetails/CallDetailsAdapter.java b/java/com/android/dialer/calldetails/CallDetailsAdapter.java
index 7471c9c1e..725077965 100644
--- a/java/com/android/dialer/calldetails/CallDetailsAdapter.java
+++ b/java/com/android/dialer/calldetails/CallDetailsAdapter.java
@@ -17,14 +17,16 @@
package com.android.dialer.calldetails;
import android.content.Context;
+import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.LayoutInflater;
import android.view.ViewGroup;
-import com.android.dialer.callcomposer.nano.CallComposerContact;
-import com.android.dialer.calldetails.nano.CallDetailsEntries.CallDetailsEntry;
+import com.android.dialer.callcomposer.CallComposerContact;
+import com.android.dialer.calldetails.CallDetailsEntries.CallDetailsEntry;
import com.android.dialer.calllogutils.CallTypeHelper;
import com.android.dialer.common.Assert;
+import java.util.List;
/** Adapter for RecyclerView in {@link CallDetailsActivity}. */
public class CallDetailsAdapter extends RecyclerView.Adapter {
@@ -34,13 +36,15 @@ public class CallDetailsAdapter extends RecyclerView.Adapter callDetailsEntries;
private final CallTypeHelper callTypeHelper;
public CallDetailsAdapter(
- Context context, CallComposerContact contact, CallDetailsEntry[] callDetailsEntries) {
+ Context context,
+ @NonNull CallComposerContact contact,
+ @NonNull List callDetailsEntries) {
this.contact = Assert.isNotNull(contact);
- this.callDetailsEntries = Assert.isNotNull(callDetailsEntries);
+ this.callDetailsEntries = callDetailsEntries;
callTypeHelper = new CallTypeHelper(context.getResources());
}
@@ -68,15 +72,15 @@ public class CallDetailsAdapter extends RecyclerView.Adapter 0 && position != getItemCount() - 2);
+ !entry.getHistoryResultsList().isEmpty() && position != getItemCount() - 2);
}
}
@@ -93,6 +97,6 @@ public class CallDetailsAdapter extends RecyclerView.Adapter {
@@ -128,10 +134,10 @@ public class CallDetailsEntryViewHolder extends ViewHolder {
});
multimediaImageContainer.setClipToOutline(true);
- if (!TextUtils.isEmpty(historyResult.imageUri)) {
+ if (!TextUtils.isEmpty(historyResult.getImageUri())) {
LogUtil.i("CallDetailsEntryViewHolder.setMultimediaDetails", "setting image");
multimediaImageContainer.setVisibility(View.VISIBLE);
- multimediaImage.setImageURI(Uri.parse(historyResult.imageUri));
+ multimediaImage.setImageURI(Uri.parse(historyResult.getImageUri()));
multimediaDetails.setText(
isIncoming(historyResult) ? R.string.received_a_photo : R.string.sent_a_photo);
} else {
@@ -139,19 +145,20 @@ public class CallDetailsEntryViewHolder extends ViewHolder {
}
// Set text after image to overwrite the received/sent a photo text
- if (!TextUtils.isEmpty(historyResult.text)) {
+ if (!TextUtils.isEmpty(historyResult.getText())) {
LogUtil.i("CallDetailsEntryViewHolder.setMultimediaDetails", "showing text");
multimediaDetails.setText(
- context.getString(R.string.message_in_quotes, historyResult.text));
+ context.getString(R.string.message_in_quotes, historyResult.getText()));
} else {
LogUtil.i("CallDetailsEntryViewHolder.setMultimediaDetails", "no text");
}
- if (entry.historyResults.length > 1 && !TextUtils.isEmpty(entry.historyResults[1].text)) {
+ if (entry.getHistoryResultsList().size() > 1
+ && !TextUtils.isEmpty(entry.getHistoryResults(1).getText())) {
LogUtil.i("CallDetailsEntryViewHolder.setMultimediaDetails", "showing post call note");
postCallNote.setVisibility(View.VISIBLE);
postCallNote.setText(
- context.getString(R.string.message_in_quotes, entry.historyResults[1].text));
+ context.getString(R.string.message_in_quotes, entry.getHistoryResults(1).getText()));
} else {
LogUtil.i("CallDetailsEntryViewHolder.setMultimediaDetails", "no post call note");
}
@@ -159,8 +166,8 @@ public class CallDetailsEntryViewHolder extends ViewHolder {
}
private static boolean isIncoming(@NonNull HistoryResult historyResult) {
- return historyResult.type == Type.INCOMING_POST_CALL
- || historyResult.type == Type.INCOMING_CALL_COMPOSER;
+ return historyResult.getType() == Type.INCOMING_POST_CALL
+ || historyResult.getType() == Type.INCOMING_CALL_COMPOSER;
}
private static @ColorInt int getColorForCallType(Context context, int callType) {
diff --git a/java/com/android/dialer/calldetails/CallDetailsFooterViewHolder.java b/java/com/android/dialer/calldetails/CallDetailsFooterViewHolder.java
index 36662bab9..3f894366f 100644
--- a/java/com/android/dialer/calldetails/CallDetailsFooterViewHolder.java
+++ b/java/com/android/dialer/calldetails/CallDetailsFooterViewHolder.java
@@ -19,12 +19,13 @@ package com.android.dialer.calldetails;
import android.content.Context;
import android.content.Intent;
import android.support.v7.widget.RecyclerView;
+import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import com.android.contacts.common.ClipboardUtils;
import com.android.dialer.common.Assert;
+import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
import com.android.dialer.util.CallUtil;
import com.android.dialer.util.DialerUtils;
@@ -32,6 +33,7 @@ import com.android.dialer.util.DialerUtils;
public class CallDetailsFooterViewHolder extends RecyclerView.ViewHolder
implements OnClickListener {
+ private final View container;
private final View copy;
private final View edit;
@@ -39,6 +41,7 @@ public class CallDetailsFooterViewHolder extends RecyclerView.ViewHolder
public CallDetailsFooterViewHolder(View view) {
super(view);
+ container = view.findViewById(R.id.footer_container);
copy = view.findViewById(R.id.call_detail_action_copy);
edit = view.findViewById(R.id.call_detail_action_edit_before_call);
@@ -48,6 +51,9 @@ public class CallDetailsFooterViewHolder extends RecyclerView.ViewHolder
public void setPhoneNumber(String number) {
this.number = number;
+ if (TextUtils.isEmpty(number)) {
+ container.setVisibility(View.GONE);
+ }
}
@Override
diff --git a/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java b/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java
index 416c521a2..437c2602c 100644
--- a/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java
+++ b/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java
@@ -25,12 +25,12 @@ import android.view.View.OnClickListener;
import android.widget.QuickContactBadge;
import android.widget.TextView;
import com.android.contacts.common.ContactPhotoManager;
-import com.android.dialer.callcomposer.nano.CallComposerContact;
+import com.android.dialer.callcomposer.CallComposerContact;
+import com.android.dialer.callintent.CallInitiationType;
import com.android.dialer.callintent.CallIntentBuilder;
-import com.android.dialer.callintent.nano.CallInitiationType;
import com.android.dialer.common.Assert;
+import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.nano.DialerImpression;
import com.android.dialer.util.DialerUtils;
/** ViewHolder for Header/Contact in {@link CallDetailsActivity}. */
@@ -56,29 +56,37 @@ public class CallDetailsHeaderViewHolder extends RecyclerView.ViewHolder
}
/** Populates the contact info fields based on the current contact information. */
- public void updateContactInfo(CallComposerContact contact) {
+ void updateContactInfo(CallComposerContact contact) {
this.contact = contact;
ContactPhotoManager.getInstance(context)
- .loadDialerThumbnail(
+ .loadDialerThumbnailOrPhoto(
contactPhoto,
- contact.contactUri == null ? null : Uri.parse(contact.contactUri),
- contact.photoId,
- contact.nameOrNumber,
- contact.contactType);
+ contact.hasContactUri() ? Uri.parse(contact.getContactUri()) : null,
+ contact.getPhotoId(),
+ contact.hasPhotoUri() ? Uri.parse(contact.getPhotoUri()) : null,
+ contact.getNameOrNumber(),
+ contact.getContactType());
- nameView.setText(contact.nameOrNumber);
- if (!TextUtils.isEmpty(contact.numberLabel) && !TextUtils.isEmpty(contact.displayNumber)) {
+ contactPhoto.setContentDescription(
+ context.getString(R.string.description_contact_photo_details, contact.getNameOrNumber()));
+ nameView.setText(contact.getNameOrNumber());
+ if (!TextUtils.isEmpty(contact.getNumberLabel())
+ && !TextUtils.isEmpty(contact.getDisplayNumber())) {
numberView.setVisibility(View.VISIBLE);
String secondaryInfo =
context.getString(
com.android.contacts.common.R.string.call_subject_type_and_number,
- contact.numberLabel,
- contact.displayNumber);
+ contact.getNumberLabel(),
+ contact.getDisplayNumber());
numberView.setText(secondaryInfo);
} else {
numberView.setVisibility(View.GONE);
numberView.setText(null);
}
+
+ if (TextUtils.isEmpty(contact.getNumber())) {
+ callBackButton.setVisibility(View.GONE);
+ }
}
@Override
@@ -87,7 +95,7 @@ public class CallDetailsHeaderViewHolder extends RecyclerView.ViewHolder
Logger.get(view.getContext()).logImpression(DialerImpression.Type.CALL_DETAILS_CALL_BACK);
DialerUtils.startActivityWithErrorToast(
view.getContext(),
- new CallIntentBuilder(contact.number, CallInitiationType.Type.CALL_DETAILS).build());
+ new CallIntentBuilder(contact.getNumber(), CallInitiationType.Type.CALL_DETAILS).build());
} else {
Assert.fail("View OnClickListener not implemented: " + view);
}
diff --git a/java/com/android/dialer/calldetails/nano/CallDetailsEntries.java b/java/com/android/dialer/calldetails/nano/CallDetailsEntries.java
deleted file mode 100644
index aee8f3652..000000000
--- a/java/com/android/dialer/calldetails/nano/CallDetailsEntries.java
+++ /dev/null
@@ -1,440 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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.
- */
-
-// Generated by the protocol buffer compiler. DO NOT EDIT!
-
-package com.android.dialer.calldetails.nano;
-
-/** This file is autogenerated, but javadoc required. */
-@SuppressWarnings("hiding")
-public final class CallDetailsEntries
- extends com.google.protobuf.nano.ExtendableMessageNano